* möglichen Exploit beseitigt:

GIB xyz EINHEIT
  GIB 0 ALLES SILBER
  --> ALLE Befehle der übergebenen Einheit werden gelöscht.

* neue Funktion (convenience): ucansee(f, u1, u2)
  liefert u1, wenn cansee(f,u1), sonst u2

* neue mistakes eingefügt uns übersetzt

* message bugfix:
  u->htisorder kann gelöscht werden (z.b. NACH). Daher muss ein pointer auf
  einen befehl in einer message immer auf den u->order Eintrag zeigen, damit er
  zeit der auswertung noch existiert.
  findorder(u, u->thisorder) tut das. Ist an mehreren Stellen nicht benutzt
  worden. assert eingebaut, das das prüft.

* RESERVE_DONATIONS
  Gegenstände, die von einer anderen Partei übergeben wurden, werden nicht
  reserviert.

* TWOPASS_GIVE:
  GIB Befehle werden zuerst an fremde Einheiten, danach in einem zweiten
  Durchlauf an eigene Einheiten, ausgeführt.

* msg_message
  An einigen messages ausprobiert, ob man die gleiche Message mehreren
  Parteien einhängen kann - klappt, spart Speicher.
  Allerdings fehlt dazu ein ordentliches memory-management (refcounter)
This commit is contained in:
Enno Rehling 2001-05-10 05:50:52 +00:00
parent 52aa6bccc2
commit cfdbc32470
21 changed files with 486 additions and 227 deletions

View File

@ -184,5 +184,9 @@ SOURCE=.\reduceproduction.c
SOURCE=.\targetregion.c SOURCE=.\targetregion.c
# End Source File # End Source File
# Begin Source File
SOURCE=.\ugroup.c
# End Source File
# End Target # End Target
# End Project # End Project

View File

@ -8,7 +8,6 @@
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. without prior permission by the authors of Eressea.
$Id: ugroup.c,v 1.2 2001/04/29 19:27:41 enno Exp $
*/ */
#include <config.h> #include <config.h>

View File

@ -19,32 +19,36 @@
* permission from the authors. * permission from the authors.
*/ */
#define RESERVE_DONATIONS 0 /* shall we reserve objects given to us by other factions? */
#define RESERVE_GIVE 1 /* reserve anything that's given from one unit to another? */
#define TWOPASS_GIVE 1 /* give items in two passes: first to others, than to self */
#include <config.h> #include <config.h>
#include "eressea.h" #include "eressea.h"
#include "economy.h" #include "economy.h"
#include "ship.h" #include <ship.h>
#include "unit.h" #include <unit.h>
#include "building.h" #include <building.h>
#include "faction.h" #include <faction.h>
#include "plane.h" #include <plane.h>
#include "alchemy.h" #include <alchemy.h>
#include "item.h" #include <item.h>
#include "magic.h" #include <magic.h>
#include "build.h" #include <build.h>
#include "goodies.h" #include <goodies.h>
#include "study.h" #include <study.h>
#include "movement.h" #include <movement.h>
#include "race.h" #include <race.h>
#include "spy.h" #include <spy.h>
#include "build.h" #include <build.h>
#include "pool.h" #include <pool.h>
#include "region.h" #include <region.h>
#include "unit.h" #include <unit.h>
#include "skill.h" #include <skill.h>
#include "message.h" #include <message.h>
#include "reports.h" #include <reports.h>
#include "karma.h" #include <karma.h>
/* gamecode includes */ /* gamecode includes */
#include "laws.h" #include "laws.h"
@ -75,7 +79,6 @@ typedef struct spende {
} spende; } spende;
static spende *spenden; static spende *spenden;
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
#define FAST_WORK
static request workers[1024]; static request workers[1024];
static request *nextworker; static request *nextworker;
@ -315,8 +318,8 @@ expandrecruit(region * r, request * recruitorders)
u->n * level_days(i)); u->n * level_days(i));
} }
if (u->n < u->wants) { if (u->n < u->wants) {
add_message(&u->faction->msgs, new_message(u->faction, add_message(&u->faction->msgs,
"recruit%u:unit%r:region%i:amount%i:want", u, r, u->n, u->wants)); msg_message("recruit", "unit region amount want", u, r, u->n, u->wants));
} }
} }
} }
@ -371,7 +374,7 @@ recruit(region * r, unit * u, strlist * S,
pl = getplane(r); pl = getplane(r);
if (pl && fval(pl, PFL_NORECRUITS)) { if (pl && fval(pl, PFL_NORECRUITS)) {
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
new_message(u->faction, "error_pflnorecruit%s:command%u:unit%r:region", S->s, u, r)); msg_error(u, S->s, "error_pflnorecruit", ""));
return; return;
} }
@ -436,18 +439,17 @@ void
add_give(unit * u, unit * u2, int n, const resource_type * rtype, const char * cmd, int error) add_give(unit * u, unit * u2, int n, const resource_type * rtype, const char * cmd, int error)
{ {
if (error) if (error)
cmistake(u, cmd, error, MSG_EVENT); cmistake(u, cmd, error, MSG_COMMERCE);
else if (!u2 || u2->faction!=u->faction) { else if (!u2 || u2->faction!=u->faction) {
assert(rtype); assert(rtype);
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
new_message(u->faction, "give%u:unit%u:target%X:resource%i:amount", msg_message("give", "unit target resource amount",
u, u, u2?ucansee(u->faction, u2, &u_unknown):&u_peasants, rtype, n));
u2?(cansee(u->faction, u->region, u2, 0)?u2:NULL):&u_peasants, if (u2) {
rtype, n)); add_message(&u2->faction->msgs,
if (u2) add_message(&u2->faction->msgs, msg_message("give", "unit target resource amount",
new_message(u2->faction, "give%u:unit%u:target%X:resource%i:amount", ucansee(u2->faction, u, &u_unknown), u2, rtype, n));
u?(cansee(u2->faction, u2->region, u, 0)?u:NULL):&u_peasants, }
u2, rtype, n));
} }
} }
@ -479,7 +481,13 @@ give_item(int want, const item_type * itype, unit * src, unit * dest, const char
if (use<n) use += new_use_pooled(src, item2resource(itype), GET_RESERVE|GET_POOLED_SLACK, n-use); if (use<n) use += new_use_pooled(src, item2resource(itype), GET_RESERVE|GET_POOLED_SLACK, n-use);
if (dest) { if (dest) {
i_change(&dest->items, itype, n); i_change(&dest->items, itype, n);
#if RESERVE_DONATIONS
new_change_resvalue(dest, item2resource(itype), n); new_change_resvalue(dest, item2resource(itype), n);
#elif RESERVE_GIVE
if (src->faction==dest->faction) {
new_change_resvalue(dest, item2resource(itype), n);
}
#endif
handle_event(&src->attribs, "give", dest); handle_event(&src->attribs, "give", dest);
handle_event(&dest->attribs, "receive", src); handle_event(&dest->attribs, "receive", src);
#if defined(MUSEUM_PLANE) && defined(TODO) #if defined(MUSEUM_PLANE) && defined(TODO)
@ -493,13 +501,6 @@ give_item(int want, const item_type * itype, unit * src, unit * dest, const char
add_give(src, dest, n, item2resource(itype), cmd, error); add_give(src, dest, n, item2resource(itype), cmd, error);
} }
void
giveitem(int n, item_t it, unit * u, region * r, unit * u2, strlist * S)
{
unused(r);
give_item(n, olditemtype[it], u, u2, S->s);
}
void void
givemen(int n, unit * u, unit * u2, strlist * S) givemen(int n, unit * u, unit * u2, strlist * S)
{ {
@ -720,10 +721,7 @@ giveunit(region * r, unit * u, unit * u2, strlist * S)
cmistake(u, S->s, 156, MSG_COMMERCE); cmistake(u, S->s, 156, MSG_COMMERCE);
return; return;
} }
add_message(&u2->faction->msgs, add_give(u, u2, 1, r_unit, S->s, 0);
new_message(u2->faction, "give%u:unit%u:target%X:resource%i:amount",
u?&u_peasants:(cansee(u2->faction, u->region, u, 0)?u:NULL),
u2, r_unit, 1));
u_setfaction(u, u2->faction); u_setfaction(u, u2->faction);
u2->faction->newbies += n; u2->faction->newbies += n;
@ -732,31 +730,31 @@ giveunit(region * r, unit * u, unit * u2, strlist * S)
* Blödsinn, da Silberpool nicht auf geben wirkt. Aber Rekrutierungen, * Blödsinn, da Silberpool nicht auf geben wirkt. Aber Rekrutierungen,
* teure Talente lernen und Gegenstände erschaffen! Kritisch sind: * teure Talente lernen und Gegenstände erschaffen! Kritisch sind:
* BIETE, FORSCHEN, KAUFE, LERNE, REKRUTIERE, ZAUBERE, * BIETE, FORSCHEN, KAUFE, LERNE, REKRUTIERE, ZAUBERE,
* HELFE, PASSWORT, STIRB (Katja) */ * HELFE, PASSWORT, STIRB (Katja)
* Natürlich wirkt der Silberpool bei gib!
* Und damit nicht irgendein zukünftiger Befehl vergessen wird,
* löschen wir der Einfachheit halber alle! (Enno).
*/
for (S = u->orders; S; S = S->next) { /* freelist(u->orders);
switch (igetkeyword(S->s, u->faction->locale)) { * FEHLER! Das darf nicht, weil es auf orders noch pointer geben kann!
case K_BIETE: */
case K_RESEARCH: while (u->orders) {
case K_BUY: /* dieser code _kennt_ die implementaion von strlists... */
case K_STUDY: strlist * o = u->orders;
case K_RECRUIT: u->orders = o->next;
case K_CAST: gc_add(o->s); /* delete it later */
case K_ALLY: free(o);
case K_PASSWORD:
case K_QUIT:
*S->s = 0;
}
} }
add_message(&u->faction->msgs,
new_message(u->faction, "give%u:unit%u:target%X:resource%i:amount",
u, u2?&u_peasants:u2,
r_unit, 1));
} }
static void
void dogive(region * r, unit * u, strlist * S, boolean liefere, int mode)
dogive(region * r, unit * u, strlist * S, boolean liefere) /*
* mode=0: give to any units
* mode=1: give to other units and peasants only
* mode=2: give to own units only
*/
{ {
unit *u2; unit *u2;
char *s; char *s;
@ -768,6 +766,23 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
u2 = getunit(r, u->faction); u2 = getunit(r, u->faction);
switch (mode) {
case 0:
/* any destination is okay */
break;
case 1:
/* not to myself */
if (u2 && u2->faction==u->faction) return;
break;
#if TWOPASS_GIVE
case 2:
/* not to peasants or others */
if (!u2 || u2->faction!=u->faction) return;
break;
#endif
default:
assert(!"invalid mode for dogive");
}
if (!u2 && !getunitpeasants) { if (!u2 && !getunitpeasants) {
cmistake(u, S->s, notfound_error, MSG_COMMERCE); cmistake(u, S->s, notfound_error, MSG_COMMERCE);
return; return;
@ -821,16 +836,13 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
freset(u, FL_OWNER); freset(u, FL_OWNER);
fset(u2, FL_OWNER); fset(u2, FL_OWNER);
add_message(&u2->faction->msgs, new_message( add_message(&u->faction->msgs,
u2->faction, "givecommand%u:unit%u:receipient", msg_message("givecommand", "unit receipient", u, u2));
u, if (u->faction != u2->faction) {
u2?(cansee(u->faction, u->region, u2, 0)?u2:NULL):&u_peasants)); add_message(&u2->faction->msgs,
if (u->faction != u2->faction) msg_message("givecommand", "unit receipient",
add_message(&u->faction->msgs, new_message( ucansee(u2->faction, u, &u_unknown), u2));
u->faction, "givecommand%u:unit%u:receipient", }
u?(cansee(u2->faction, u2->region, u, 0)?u:NULL):&u_peasants,
u2));
return; return;
} }
if (u2 && u2->race == RC_SPELL) { if (u2 && u2->race == RC_SPELL) {
@ -840,21 +852,21 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
/* if ((race[u->race].ec_flags & NOGIVE) || fval(u,FL_LOCKED)) {*/ /* if ((race[u->race].ec_flags & NOGIVE) || fval(u,FL_LOCKED)) {*/
if (race[u->race].ec_flags & NOGIVE) { if (race[u->race].ec_flags & NOGIVE) {
sprintf(buf, "%s geben nichts weg", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_nogive", "race", u->race));
return; return;
} }
if (u2 && !(race[u2->race].ec_flags & GETITEM)) { if (u2 && !(race[u2->race].ec_flags & GETITEM)) {
sprintf(buf, "%s nehmen nichts an", race[u2->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_notake", "race", u->race));
return; return;
} }
/* Übergabe aller Kräuter */ /* Übergabe aller Kräuter */
if (findparam(s, u->faction->locale) == P_HERBS) { if (findparam(s, u->faction->locale) == P_HERBS) {
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_nogive", "race", u->race));
return; return;
} }
if (!u2) { if (!u2) {
@ -910,8 +922,8 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
if (*s == 0) { if (*s == 0) {
const item_type * itype; const item_type * itype;
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_nogive", "race", u->race));
return; return;
} }
/* TODO: go through source unit's items only to speed this up */ /* TODO: go through source unit's items only to speed this up */
@ -928,8 +940,8 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
i = findparam(s, u->faction->locale); i = findparam(s, u->faction->locale);
if (i == P_PERSON) { if (i == P_PERSON) {
if (!(race[u->race].ec_flags & GIVEPERSON)) { if (!(race[u->race].ec_flags & GIVEPERSON)) {
sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u)); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_noregroup", "race", u->race));
return; return;
} }
n = u->number; n = u->number;
@ -938,8 +950,8 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
} }
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_nogive", "race", u->race));
return; return;
} }
itype = finditemtype(s, u->faction->locale); itype = finditemtype(s, u->faction->locale);
@ -972,8 +984,8 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
i = findparam(s, u->faction->locale); i = findparam(s, u->faction->locale);
if (i == P_PERSON) { if (i == P_PERSON) {
if (!(race[u->race].ec_flags & GIVEPERSON)) { if (!(race[u->race].ec_flags & GIVEPERSON)) {
sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u)); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_noregroup", "race", u->race));
return; return;
} }
givemen(n, u, u2, S); givemen(n, u, u2, S);
@ -981,8 +993,8 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
} }
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, S->s, buf, MSG_COMMERCE); msg_error(u, S->s, "race_nogive", "race", u->race));
return; return;
} }
itype = finditemtype(s, u->faction->locale); itype = finditemtype(s, u->faction->locale);
@ -1145,8 +1157,11 @@ gebaeude_stuerzt_ein(region * r, building * b)
int n, i; int n, i;
direction_t d; direction_t d;
int opfer = 0; int opfer = 0;
int road = 0;
sprintf(buf, "%s stürzte ein.", buildingname(b)); struct message * msg;
/*
"$building($crashed) stürzte ein.$if($road," Beim Einsturz wurde die halbe Straße vernichtet.","")$if($victims,"$int($victims) $if($eq($victims,1),"ist","sind"),"") zu beklagen."
*/
/* Falls Karawanserei, Damm oder Tunnel einstürzen, wird die schon /* Falls Karawanserei, Damm oder Tunnel einstürzen, wird die schon
* gebaute Straße zur Hälfte vernichtet */ * gebaute Straße zur Hälfte vernichtet */
@ -1156,7 +1171,7 @@ gebaeude_stuerzt_ein(region * r, building * b)
b->type == &bt_tunnel)) b->type == &bt_tunnel))
{ {
rsetroad(r, d, rroad(r, d) / 2); rsetroad(r, d, rroad(r, d) / 2);
sprintf(buf, " Beim Einsturz wurde die halbe Straße vernichtet."); road = 1;
} }
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
if (u->building == b) { if (u->building == b) {
@ -1176,24 +1191,13 @@ gebaeude_stuerzt_ein(region * r, building * b)
} }
} }
if (opfer > 0) { msg = msg_message("buildingcrash", "region building opfer road", r, b, opfer, road);
buf[0]=' '; add_message(&r->msgs, msg);
strcpy(buf+1, itoa10(opfer));
scat(" Opfer ");
if (opfer == 1) {
scat("ist");
} else {
scat("sind");
}
scat(" zu beklagen.");
} else buf[0] = 0;
addmessage(r, 0, buf, MSG_EVENT, ML_IMPORTANT);
for (u=r->units; u; u=u->next) { for (u=r->units; u; u=u->next) {
faction * f = u->faction; faction * f = u->faction;
if (fval(f, FL_MARK)) { if (fval(f, FL_MARK)) {
freset(u->faction, FL_MARK); freset(u->faction, FL_MARK);
add_message(&f->msgs, add_message(&f->msgs, msg);
new_message(f, "buildingcrash%r:region%b:building%s:opfer", r, b, buf));
} }
} }
destroy_building(b); destroy_building(b);
@ -1213,11 +1217,10 @@ maintain_buildings(boolean crash)
continue; continue;
} else { } else {
unit * u = buildingowner(r, b); unit * u = buildingowner(r, b);
struct message * msg = msg_message("nomaintenance", "building", b);
if (u) { if (u) {
add_message(&u->faction->msgs, add_message(&u->faction->msgs, msg);
new_message(u->faction, "nomaintenance%b:building", b)); add_message(&r->msgs, msg);
add_message(&r->msgs,
new_message(u->faction, "nomaintenance%b:building", b));
} }
} }
} }
@ -1249,11 +1252,11 @@ economics(void)
break; break;
case K_GIVE: case K_GIVE:
dogive(r, u, S, S->s[0]=='@'?true:false); dogive(r, u, S, S->s[0]=='@'?true:false, TWOPASS_GIVE);
break; break;
case K_LIEFERE: case K_LIEFERE:
dogive(r, u, S, true); dogive(r, u, S, true, TWOPASS_GIVE);
break; break;
case K_FORGET: case K_FORGET:
@ -1263,7 +1266,20 @@ economics(void)
} }
} }
} }
#if TWOPASS_GIVE
for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) {
switch (igetkeyword(S->s, u->faction->locale)) {
case K_GIVE:
dogive(r, u, S, S->s[0]=='@'?true:false, 2);
break;
case K_LIEFERE:
dogive(r, u, S, true, 2);
break;
}
}
}
#endif
/* RECRUIT orders */ /* RECRUIT orders */
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
@ -1307,11 +1323,11 @@ manufacture(unit * u, const item_type * itype, int want)
switch (n) { switch (n) {
case ENEEDSKILL: case ENEEDSKILL:
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
msg_error(u, u->thisorder, "skill_needed", "skill", sk)); msg_error(u, findorder(u, u->thisorder), "skill_needed", "skill", sk));
return; return;
case ELOWSKILL: case ELOWSKILL:
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
msg_error(u, u->thisorder, "manufacture_skills", "skill minskill product", msg_error(u, findorder(u, u->thisorder), "manufacture_skills", "skill minskill product",
sk, minskill, itype->rtype, 1)); sk, minskill, itype->rtype, 1));
return; return;
case ENOMATERIALS: case ENOMATERIALS:
@ -1330,7 +1346,7 @@ manufacture(unit * u, const item_type * itype, int want)
ch = ch+strlen(ch); ch = ch+strlen(ch);
} }
strcat(ch,"."); strcat(ch,".");
mistake(u, u->thisorder, buf, MSG_PRODUCE); mistake(u, findorder(u, u->thisorder), buf, MSG_PRODUCE);
return; return;
} }
} }
@ -1409,8 +1425,8 @@ allocate_resource(unit * u, const resource_type * rtype, int want)
&& armedmen(u2) && armedmen(u2)
#endif #endif
) { ) {
sprintf(buf, "%s bewacht die Region", unitname(u2)); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_PRODUCE); msg_error(u, findorder(u, u->thisorder), "region_guarded", "guard", u2));
return; return;
} }
} }
@ -1429,8 +1445,8 @@ allocate_resource(unit * u, const resource_type * rtype, int want)
&& !ucontact(u2, u) && !ucontact(u2, u)
&& !allied(u2, u->faction, HELP_GUARD)) && !allied(u2, u->faction, HELP_GUARD))
{ {
sprintf(buf, "%s bewacht die Region", unitname(u2)); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_PRODUCE); msg_error(u, findorder(u, u->thisorder), "region_guarded", "guard", u2));
return; return;
} }
} }
@ -1441,13 +1457,13 @@ allocate_resource(unit * u, const resource_type * rtype, int want)
if (skill == 0) { if (skill == 0) {
skill_t sk = itype->construction->skill; skill_t sk = itype->construction->skill;
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
msg_error(u, u->thisorder, "skill_needed", "skill", sk)); msg_error(u, findorder(u, u->thisorder), "skill_needed", "skill", sk));
return; return;
} }
if (skill < itype->construction->minskill) { if (skill < itype->construction->minskill) {
skill_t sk = itype->construction->skill; skill_t sk = itype->construction->skill;
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
msg_error(u, u->thisorder, "manufacture_skills", "skill minskill product", msg_error(u, findorder(u, u->thisorder), "manufacture_skills", "skill minskill product",
sk, itype->construction->minskill, itype->rtype)); sk, itype->construction->minskill, itype->rtype));
return; return;
} else { } else {
@ -1618,7 +1634,7 @@ create_potion(unit * u, const potion_type * ptype, int want)
ch = ch+strlen(ch); ch = ch+strlen(ch);
} }
strcat(ch,"."); strcat(ch,".");
mistake(u, u->thisorder, buf, MSG_PRODUCE); mistake(u, findorder(u, u->thisorder), buf, MSG_PRODUCE);
return; return;
} }
break; break;
@ -1640,7 +1656,7 @@ create_item(unit * u, const item_type * itype, int want)
const potion_type * ptype = resource2potion(itype->rtype); const potion_type * ptype = resource2potion(itype->rtype);
if (ptype!=NULL) create_potion(u, ptype, want); if (ptype!=NULL) create_potion(u, ptype, want);
else if (itype->construction) manufacture(u, itype, want); else if (itype->construction) manufacture(u, itype, want);
else cmistake(u, u->thisorder, 125, MSG_PRODUCE); else cmistake(u, findorder(u, u->thisorder), 125, MSG_PRODUCE);
} }
} }
@ -1692,7 +1708,7 @@ make(region * r, unit * u)
return; return;
} }
build_road(r, u, m, d); build_road(r, u, m, d);
} else cmistake(u, u->thisorder, 71, MSG_PRODUCE); } else cmistake(u, findorder(u, u->thisorder), 71, MSG_PRODUCE);
return; return;
} else if (p == P_SHIP) { } else if (p == P_SHIP) {
if(r->planep && fval(r->planep, PFL_NOBUILD)) { if(r->planep && fval(r->planep, PFL_NOBUILD)) {
@ -1915,9 +1931,8 @@ buy(region * r, unit * u, request ** buyorders, const char * cmd)
} }
} }
if (r_demand(r, ltype)) { if (r_demand(r, ltype)) {
sprintf(buf, "Dieses Luxusgut wird in %s nicht produziert", add_message(&u->faction->msgs,
regionid(r)); msg_error(u, cmd, "luxury_notsold", ""));
mistake(u, cmd, buf, MSG_COMMERCE);
return; return;
} }
o = (request *) calloc(1, sizeof(request)); o = (request *) calloc(1, sizeof(request));
@ -2137,8 +2152,8 @@ sell(region * r, unit * u, request ** sellorders, const char * cmd)
/* Belagerte Einheiten können nichts verkaufen. */ /* Belagerte Einheiten können nichts verkaufen. */
if (besieged(u)) { if (besieged(u)) {
sprintf(buf, "%s wird belagert.", unitname(u)); add_message(&u->faction->msgs,
mistake(u, cmd, buf, MSG_COMMERCE); msg_error(u, cmd, "error60", ""));
return; return;
} }
/* In der Region muß es eine Burg geben. */ /* In der Region muß es eine Burg geben. */
@ -2293,18 +2308,18 @@ plant(region *r, unit *u)
} }
/* Wasser des Lebens prüfen */ /* Wasser des Lebens prüfen */
if (get_pooled(u, r, R_TREES) == 0) { if (get_pooled(u, r, R_TREES) == 0) {
sprintf(buf, "Dazu braucht man %s.", add_message(&u->faction->msgs,
locale_string(u->faction->locale, resourcename(oldresourcetype[R_TREES], GR_PLURAL))); msg_error(u, findorder(u, u->thisorder), "resource_missing", "missing",
mistake(u, u->thisorder, buf, MSG_PRODUCE); oldresourcetype[R_TREES]));
return; return;
} }
htype = rherbtype(r); htype = rherbtype(r);
n = new_get_pooled(u, htype->itype->rtype, GET_DEFAULT); n = new_get_pooled(u, htype->itype->rtype, GET_DEFAULT);
/* Kräuter prüfen */ /* Kräuter prüfen */
if (n==0) { if (n==0) {
sprintf(buf, "Dazu braucht man %s.", add_message(&u->faction->msgs,
locale_string(u->faction->locale, resourcename(htype->itype->rtype, GR_PLURAL))); msg_error(u, findorder(u, u->thisorder), "resource_missing", "missing",
mistake(u, u->thisorder, buf, MSG_PRODUCE); htype->itype->rtype));
return; return;
} }
@ -2388,7 +2403,7 @@ research(region *r, unit *u)
if (findparam(s, u->faction->locale) == P_HERBS) { if (findparam(s, u->faction->locale) == P_HERBS) {
if (eff_skill(u, SK_HERBALISM, r) < 7) { if (eff_skill(u, SK_HERBALISM, r) < 7) {
cmistake(u, u->thisorder, 227, MSG_EVENT); cmistake(u, findorder(u, u->thisorder), 227, MSG_EVENT);
return; return;
} }
@ -2464,16 +2479,14 @@ steal(region * r, unit * u, request ** stealorders)
} }
if (u2->faction->age < IMMUN_GEGEN_ANGRIFF) { if (u2->faction->age < IMMUN_GEGEN_ANGRIFF) {
sprintf(buf, "Eine Partei muß mindestens %d Wochen alt sein, bevor sie " add_message(&u->faction->msgs,
"bestohlen werden kann.", IMMUN_GEGEN_ANGRIFF); msg_error(u, findorder(u, u->thisorder), "steal_immunity", "age", IMMUN_GEGEN_ANGRIFF));
mistake(u, u->thisorder, buf, MSG_INCOME);
return; return;
} }
assert(u->region==u2->region); assert(u->region==u2->region);
if (!can_contact(r, u, u2)) { if (!can_contact(r, u, u2)) {
sprintf(buf, "%s wird belagert.", unitname(u2)); add_message(&u->faction->msgs, msg_error(u, findorder(u, u->thisorder), "error60", ""));
mistake(u, u->thisorder, buf, MSG_INCOME);
return; return;
} }
n = eff_skill(u, SK_STEALTH, r) - wahrnehmung(r, f); n = eff_skill(u, SK_STEALTH, r) - wahrnehmung(r, f);
@ -2755,8 +2768,8 @@ tax(region * r, unit * u, request ** taxorders)
u2 = is_guarded(r, u, GUARD_TAX); u2 = is_guarded(r, u, GUARD_TAX);
if (u2) { if (u2) {
sprintf(buf, "%s bewacht die Region.", unitname(u2)); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_INCOME); msg_error(u, findorder(u, u->thisorder), "region_guarded", "guard", u2));
return; return;
} }
@ -2861,8 +2874,8 @@ produce(void)
if (!nonplayer(u)) if (!nonplayer(u))
work(r, u); work(r, u);
else if (u->faction->no > 0) { else if (u->faction->no > 0) {
sprintf(buf, "%s können nicht arbeiten", race[u->race].name[1]); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_INCOME); msg_error(u, findorder(u, u->thisorder), "race_cantwork", "race", u->race));
} }
break; break;

View File

@ -1759,8 +1759,8 @@ set_passw(void)
case K_MAGIEGEBIET: case K_MAGIEGEBIET:
if(u->faction->magiegebiet != 0) { if(u->faction->magiegebiet != 0) {
mistake(u, S->s, "Die Partei hat bereits ein Magiegebiet", add_message(&u->faction->msgs,
MSG_EVENT); msg_error(u, S->s, "one_circle_only", ""));
} else { } else {
mtyp = getmagicskill(); mtyp = getmagicskill();
if(mtyp == M_NONE) { if(mtyp == M_NONE) {
@ -1993,7 +1993,8 @@ instant_orders(void)
default: default:
if (strlen(param)) { if (strlen(param)) {
mistake(u, S->s, "unbekannter Kampfstatus", MSG_EVENT); add_message(&u->faction->msgs,
msg_error(u, S->s, "unknown_status", ""));
} else { } else {
u->status = ST_FIGHT; u->status = ST_FIGHT;
} }
@ -2138,8 +2139,8 @@ bewache_an(void)
strlist *S; strlist *S;
/* letzte schnellen befehle - bewache */ /* letzte schnellen befehle - bewache */
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next) {
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next) {
if (!fval(u, FL_MOVED)) { if (!fval(u, FL_MOVED)) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if (igetkeyword(S->s, u->faction->locale) == K_GUARD && getparam(u->faction->locale) != P_NOT) { if (igetkeyword(S->s, u->faction->locale) == K_GUARD && getparam(u->faction->locale) != P_NOT) {
@ -2147,8 +2148,8 @@ bewache_an(void)
if (!illusionary(u) && u->race != RC_SPELL) { if (!illusionary(u) && u->race != RC_SPELL) {
#ifdef WACH_WAFF #ifdef WACH_WAFF
if (!armedmen(u)) { if (!armedmen(u)) {
mistake(u, S->s, add_message(&u->faction->msgs,
"Die Einheit ist nicht bewaffnet und kampffähig", MSG_EVENT); msg_error(u, S->s, "unit_unarmed", ""));
continue; continue;
} }
#endif #endif
@ -2162,7 +2163,8 @@ bewache_an(void)
} }
} }
} }
}
}
} }
void void

View File

@ -2605,7 +2605,7 @@ reports(void)
init_intervals(); init_intervals();
#endif #endif
remove_empty_units(); remove_empty_units();
log_printf("Report timestamp - %s", pzTime); log_printf("Report timestamp - %s\n", pzTime);
for (f = factions; f; f = f->next) { for (f = factions; f; f = f->next) {
attrib * a = a_find(f->attribs, &at_reportspell); attrib * a = a_find(f->attribs, &at_reportspell);
current_faction = f; current_faction = f;

View File

@ -198,10 +198,12 @@ teach_unit(unit * teacher, unit * student, int teaching, skill_t sk, boolean rep
teaching = max(0, teaching - student->number * 30); teaching = max(0, teaching - student->number * 30);
if (report || teacher->faction != student->faction) { if (report || teacher->faction != student->faction) {
add_message(&student->faction->msgs, new_message(student->faction, add_message(&student->faction->msgs, msg_message("teach",
"teach%u:teacher%u:student%t:skill", teacher, student, sk)); "teacher student skill", teacher, student, sk));
add_message(&teacher->faction->msgs, new_message(teacher->faction, if (teacher->faction != student->faction) {
"teach%u:teacher%u:student%t:skill", teacher, student, sk)); add_message(&teacher->faction->msgs, msg_message("teach",
"teacher student skill", teacher, student, sk));
}
} }
} }
return n; return n;
@ -236,8 +238,8 @@ teach(region * r, unit * u)
teaching -= i * 30; teaching -= i * 30;
change_effect(u, oldpotiontype[P_FOOL], -i); change_effect(u, oldpotiontype[P_FOOL], -i);
j = teaching / 30; j = teaching / 30;
add_message(&u->faction->msgs, new_message(u->faction, add_message(&u->faction->msgs, msg_message("teachdumb",
"teachdumb%u:teacher%i:amount", u, j)); "teacher amount", u, j));
} }
if (teaching == 0) if (teaching == 0)
return; return;
@ -570,10 +572,8 @@ learn(void)
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning)); if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
if (money>0) { if (money>0) {
use_pooled(u, r, R_SILVER, money); use_pooled(u, r, R_SILVER, money);
add_message(&u->faction->msgs, add_message(&u->faction->msgs, msg_message("studycost",
new_message(u->faction, "unit region cost skill", u, u->region, money, i));
"studycost%u:unit%r:region%i:cost%t:skill",
u, u->region, money, i));
} }
if (get_effect(u, oldpotiontype[P_WISE])) { if (get_effect(u, oldpotiontype[P_WISE])) {

View File

@ -1046,7 +1046,6 @@ void * gc_add(void * p);
void gc_done(void); void gc_done(void);
void mistake(const struct unit * u, const char *cmd, const char *text, int mtype); void mistake(const struct unit * u, const char *cmd, const char *text, int mtype);
void addmessage(struct region * r, struct faction * f, const char *s, msg_t mtype, int level); void addmessage(struct region * r, struct faction * f, const char *s, msg_t mtype, int level);
void caddmessage(struct region * r, struct faction * f, char *s, msg_t mtype, int level);
void cmistake(const struct unit * u, const char *cmd, int mno, int mtype); void cmistake(const struct unit * u, const char *cmd, int mno, int mtype);
/* grammatik-flags: */ /* grammatik-flags: */

View File

@ -7,21 +7,21 @@
CFG=kernel - Win32 Conversion CFG=kernel - Win32 Conversion
!MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run !MESSAGE use the Export Makefile command and run
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "kernel-6.mak". !MESSAGE NMAKE /f "kernel-6.mak".
!MESSAGE !MESSAGE
!MESSAGE You can specify a configuration when running NMAKE !MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "kernel-6.mak" CFG="kernel - Win32 Conversion" !MESSAGE NMAKE /f "kernel-6.mak" CFG="kernel - Win32 Conversion"
!MESSAGE !MESSAGE
!MESSAGE Possible choices for configuration are: !MESSAGE Possible choices for configuration are:
!MESSAGE !MESSAGE
!MESSAGE "kernel - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "kernel - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE "kernel - Win32 Conversion" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Conversion" (based on "Win32 (x86) Static Library")
!MESSAGE "kernel - Win32 Profile" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Profile" (based on "Win32 (x86) Static Library")
!MESSAGE !MESSAGE
# Begin Project # Begin Project
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
@ -122,7 +122,7 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo # ADD LIB32 /nologo
!ENDIF !ENDIF
# Begin Target # Begin Target
@ -372,6 +372,10 @@ SOURCE=.\plane.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\player.c
# End Source File
# Begin Source File
SOURCE=.\pool.c SOURCE=.\pool.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -416,6 +420,10 @@ SOURCE=.\terrain.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\ugroup.c
# End Source File
# Begin Source File
SOURCE=.\unit.c SOURCE=.\unit.c
# End Source File # End Source File
# End Target # End Target

View File

@ -264,7 +264,10 @@ msg_error(const struct unit * u, const char * cmd, const char * name, const char
const char *ic = sig; const char *ic = sig;
void * args[16]; void * args[16];
memset(args, 0, sizeof(args)); memset(args, 0, sizeof(args));
if (cmd==NULL) cmd = u->thisorder;
assert(cmd!=u->thisorder || !"only use entries from u->orders - memory corruption imminent.");
if (cmd==NULL) cmd = findorder(u, u->thisorder);
if (!mtype) { if (!mtype) {
fprintf(stderr, "trying to create message of unknown type \"%s\"\n", name); fprintf(stderr, "trying to create message of unknown type \"%s\"\n", name);
@ -422,73 +425,82 @@ new_message(struct faction * receiver, const char* sig, ...)
return msg_create(mtype, (void**)args); return msg_create(mtype, (void**)args);
} }
void static void
addmessage(region * r, faction * f, const char *s, msg_t mtype, int level) caddmessage(region * r, faction * f, const char *s, msg_t mtype, int level)
{
caddmessage(r, f, gc_add(strdup(translate_regions(s, f))), mtype, level);
}
void
caddmessage(region * r, faction * f, char *s, msg_t mtype, int level)
{ {
const char * section = NULL;
message * m = NULL; message * m = NULL;
unused(level);
switch (mtype) { switch (mtype) {
case MSG_INCOME: case MSG_INCOME:
assert(f); assert(f);
m = add_message(&f->msgs, new_message(f, "msg_economy%s:string", s)); m = add_message(&f->msgs, msg_message("msg_economy", "string", s));
break; break;
case MSG_BATTLE: case MSG_BATTLE:
assert(0 || !"battle-meldungen nicht über addmessage machen"); assert(0 || !"battle-meldungen nicht über addmessage machen");
break; break;
case MSG_MOVE: case MSG_MOVE:
assert(f); assert(f);
m = add_message(&f->msgs, new_message(f, "msg_movement%s:string", s)); m = add_message(&f->msgs, msg_message("msg_movement", "string", s));
break; break;
case MSG_COMMERCE: case MSG_COMMERCE:
assert(f); assert(f);
m = add_message(&f->msgs, new_message(f, "msg_economy%s:string", s)); m = add_message(&f->msgs, msg_message("msg_economy", "string", s));
break; break;
case MSG_PRODUCE: case MSG_PRODUCE:
assert(f); assert(f);
m = add_message(&f->msgs, new_message(f, "msg_production%s:string", s)); m = add_message(&f->msgs, msg_message("msg_production", "string", s));
break; break;
case MSG_MAGIC: case MSG_MAGIC:
case MSG_COMMENT: case MSG_COMMENT:
case MSG_MESSAGE: case MSG_MESSAGE:
/* Botschaften an REGION oder einzelne PARTEI */ /* Botschaften an REGION oder einzelne PARTEI */
if (!r) if (!r) {
m = add_message(&f->msgs, new_message(f, "msg_event%s:string", s)); assert(f);
m = add_message(&f->msgs, msg_message("msg_event", "string", s));
}
else else
m = add_message(&r->msgs, new_message(f, "msg_event%s:string", s)); m = add_message(&r->msgs, msg_message("msg_event", "string", s));
break; break;
case MSG_ORCVERMEHRUNG: case MSG_ORCVERMEHRUNG:
case MSG_EVENT: case MSG_EVENT:
/* Botschaften an REGION oder einzelne PARTEI */ /* Botschaften an REGION oder einzelne PARTEI */
if (!r) if (!r) {
m = add_message(&f->msgs, new_message(f, "msg_event%s:string", s)); assert(f);
m = add_message(&f->msgs, msg_message("msg_event", "string", s));
}
else else
m = add_message(&r->msgs, new_message(f, "msg_event%s:string", s)); m = add_message(&r->msgs, msg_message("msg_event", "string", s));
break; break;
default: default:
assert(!"Ungültige Msg-Klasse!"); assert(!"Ungültige Msg-Klasse!");
} }
} }
void
addmessage(region * r, faction * f, const char *s, msg_t mtype, int level)
{
caddmessage(r, f, gc_add(strdup(translate_regions(s, f))), mtype, level);
}
void void
xmistake(const unit * u, const char *s, const char *comment, int mtype) xmistake(const unit * u, const char *s, const char *comment, int mtype)
{ {
if (u->faction->no == MONSTER_FACTION) return; if (u->faction->no == MONSTER_FACTION) return;
add_message(&u->faction->msgs, new_message(u->faction, "mistake%s:command%s:error%u:unit%r:region", s, comment, u, u->region)); add_message(&u->faction->msgs, msg_message("mistake",
"command error unit region", s, comment, u, u->region));
} }
void void
cmistake(const unit * u, const char *cmd, int mno, int mtype) cmistake(const unit * u, const char *cmd, int mno, int mtype)
{ {
static char lbuf[64]; static char ebuf[20];
if (u->faction->no == MONSTER_FACTION) return; if (u->faction->no == MONSTER_FACTION) return;
sprintf(lbuf, "error%d", mno); sprintf(ebuf, "error%d", mno);
strcat(lbuf, "%s:command%u:unit%r:region"); add_message(&u->faction->msgs, msg_message(ebuf,
add_message(&u->faction->msgs, new_message(u->faction, lbuf, cmd, u, u->region)); "command unit region", cmd, u, u->region));
} }
void void

View File

@ -50,7 +50,7 @@ void read_msglevels(struct warning ** w, FILE * F);
void set_msglevel(struct warning ** warnings, const char * type, int level); void set_msglevel(struct warning ** warnings, const char * type, int level);
extern struct message * msg_message(const char * name, const char* sig, ...); extern struct message * msg_message(const char * name, const char* sig, ...);
extern struct message * msg_error(const struct unit *, const char *, extern struct message * msg_error(const struct unit *, const char *cmd,
const char * name, const char* sig, ...); const char * name, const char* sig, ...);
extern struct message * add_message(struct message_list** pm, struct message * m); extern struct message * add_message(struct message_list** pm, struct message * m);
extern void free_messages(struct message_list * m); extern void free_messages(struct message_list * m);

View File

@ -280,11 +280,11 @@ render_immediate(const message * m, const char * find, localizer * l)
} else { } else {
var = "die Bevölkerung"; var = "die Bevölkerung";
} }
} else if(m->data[i] == NULL) { } else if(m->data[i] == NULL || m->data[i] == &u_unknown) {
if (b == rbuf) { if (b == rbuf) {
var = "Eine unsichtbare Einheit"; var = "Eine unerkannte Einheit";
} else { } else {
var = "eine unsichtbare Einheit"; var = "eine unerkannte Einheit";
} }
} else { } else {
var = unitname((unit*)m->data[i]); var = unitname((unit*)m->data[i]);

View File

@ -839,3 +839,9 @@ spy_message(int spy, unit *u, unit *target)
} }
} }
const struct unit *
ucansee(const struct faction *f, const struct unit *u, const struct unit *x)
{
if (cansee(f, u->region, u, 0)) return u;
return x;
}

View File

@ -46,6 +46,8 @@ void reports(void);
char *gamedate(const struct locale *); char *gamedate(const struct locale *);
char *gamedate2(void); char *gamedate2(void);
extern const struct unit *ucansee(const struct faction *f, const struct unit *u, const struct unit *x);
struct summary; struct summary;
extern void report_summary(struct summary * n, struct summary * o, boolean full); extern void report_summary(struct summary * n, struct summary * o, boolean full);
extern struct summary * make_summary(boolean count_new); extern struct summary * make_summary(boolean count_new);

View File

@ -8,7 +8,6 @@
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. without prior permission by the authors of Eressea.
$Id: ugroup.c,v 1.3 2001/04/29 19:27:42 enno Exp $
*/ */
#include <config.h> #include <config.h>

View File

@ -55,7 +55,8 @@
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
const unit u_peasants = { NULL, NULL, NULL, NULL, NULL, 2, "Die Bauern" }; const unit u_peasants = { NULL, NULL, NULL, NULL, NULL, 2, "die Bauern" };
const unit u_unknown = { NULL, NULL, NULL, NULL, NULL, 1, "eine unbekannte Einheit" };
#define DMAXHASH 8191 #define DMAXHASH 8191
typedef struct dead { typedef struct dead {

View File

@ -153,6 +153,7 @@ struct unit * findnewunit (const struct region * r, const struct faction *f, int
#define upotions(u) fval(u, FL_POTIONS) #define upotions(u) fval(u, FL_POTIONS)
extern const struct unit u_peasants; extern const struct unit u_peasants;
extern const struct unit u_unknown;
int change_skill(struct unit * u, skill_t id, int byvalue); int change_skill(struct unit * u, skill_t id, int byvalue);
void set_skill(struct unit * u, skill_t id, int value); void set_skill(struct unit * u, skill_t id, int value);

View File

@ -28,6 +28,7 @@
/* libc includes */ /* libc includes */
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
extern const char *directions[]; extern const char *directions[];

View File

@ -143,6 +143,10 @@ SOURCE=.\base36.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\command.h
# End Source File
# Begin Source File
SOURCE=.\crmessage.h SOURCE=.\crmessage.h
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -163,6 +167,10 @@ SOURCE=.\goodies.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\graph.h
# End Source File
# Begin Source File
SOURCE=.\language.h SOURCE=.\language.h
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -224,6 +232,10 @@ SOURCE=.\base36.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\command.c
# End Source File
# Begin Source File
SOURCE=.\crmessage.c SOURCE=.\crmessage.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -248,6 +260,10 @@ SOURCE=.\goodies.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\graph.c
# End Source File
# Begin Source File
SOURCE=.\language.c SOURCE=.\language.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -644,6 +644,14 @@ SOURCE=..\common\modules\gmcmd.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\modules\infocmd.c
# End Source File
# Begin Source File
SOURCE=..\common\modules\infocmd.h
# End Source File
# Begin Source File
SOURCE=..\common\modules\museum.c SOURCE=..\common\modules\museum.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -692,6 +700,10 @@ SOURCE=..\common\modules\oceannames.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\modules\oceannames.h
# End Source File
# Begin Source File
SOURCE=..\common\modules\score.c SOURCE=..\common\modules\score.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -716,6 +728,14 @@ SOURCE=..\common\modules\score.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\modules\weather.c
# End Source File
# Begin Source File
SOURCE=..\common\modules\weather.h
# End Source File
# Begin Source File
SOURCE=..\common\modules\xmas2000.c SOURCE=..\common\modules\xmas2000.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -1108,19 +1128,6 @@ SOURCE=..\common\attributes\orcification.c
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\otherfaction.c SOURCE=..\common\attributes\otherfaction.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -1271,6 +1278,10 @@ SOURCE=..\common\attributes\targetregion.h
!ENDIF !ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\ugroup.c
# End Source File # End Source File
# End Group # End Group
# Begin Group "Triggers" # Begin Group "Triggers"
@ -1535,10 +1546,6 @@ SOURCE=.\main.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\otherfaction.c
# End Source File
# Begin Source File
SOURCE=.\spells.c SOURCE=.\spells.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -2943,6 +2943,60 @@
</locale> </locale>
</message> </message>
<message name="one_circle_only">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"$unit($unit) in $region($region): '$command' - Die Partei hat bereits ein Magiegebiet."</text>
</nr>
</locale>
<locale name="de">
<nr section="events">
<text>"$unit($unit) in $region($region): '$command' - Your faction can only study one school of magic."</text>
</nr>
</locale>
</message>
<message name="unit_unarmed">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Die Einheit ist nicht bewaffnet und kampffähig."</text>
</nr>
</locale>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - The unit is not armed and trained for combat."</text>
</nr>
</locale>
</message>
<message name="unknown_status">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - unbekannter Kampfstatus."</text>
</nr>
</locale>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - unknown status."</text>
</nr>
</locale>
</message>
<message name="error226"> <message name="error226">
<type> <type>
<arg name="unit" type="unit"></arg> <arg name="unit" type="unit"></arg>
@ -6529,10 +6583,11 @@
<arg name="region" type="region"></arg> <arg name="region" type="region"></arg>
<arg name="building" type="building"></arg> <arg name="building" type="building"></arg>
<arg name="opfer" type="int"></arg> <arg name="opfer" type="int"></arg>
<arg name="road" type="int"></arg>
</type> </type>
<locale name="de"> <locale name="de">
<nr section="events"> <nr section="events">
<text>"In $region($region) stürzte $building($building) ein.$if($opfer," $int($opfer) Opfer sind zu beklagen.","")"</text> <text>"In $region($region) stürzte $building($building) ein.$if($road," Beim Einsturz wurde die halbe Straße vernichtet.","")$if($opfer," $int($opfer) Opfer $if($eq($opfer,1),"ist","sind") zu beklagen.","")"</text>
</nr> </nr>
</locale> </locale>
<locale name="en"> <locale name="en">
@ -6566,4 +6621,137 @@
</locale> </locale>
</message> </message>
<message name="race_nogive">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="race" type="race"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) geben nichts weg."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) do not give things away."</text>
</nr>
</locale>
</message>
<message name="race_noregroup">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="race" type="race"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) können nicht neu gruppiert werden."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) cannot be regrouped."</text>
</nr>
</locale>
</message>
<message name="race_notake">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="race" type="race"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) nehmen nichts an."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $race($race,0) will not accept anything."</text>
</nr>
</locale>
</message>
<message name="resource_missing">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="missing" type="resource"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - Dazu benötigt man $resource($missing,0)."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - This requires $resource($missing,0)."</text>
</nr>
</locale>
</message>
<message name="region_guarded">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="guard" type="unit"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $unit($guard) bewacht die Region."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - $unit($guard) is guarding the region."</text>
</nr>
</locale>
</message>
<message name="luxury_notsold">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - Dieses Luxusgut wird hier nicht verkauft."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - These goods are not on sale here."</text>
</nr>
</locale>
</message>
<message name="luxury_notsold">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="age" type="int"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - Eine Partei muß mindestens $int($age) Wochen alt sein, bevor sie bestohlen werden kann."</text>
</nr>
</locale>
<locale name="en">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - A faction must be at least $int($age) weeks old before you can steal from it."</text>
</nr>
</locale>
</message>
</messages> </messages>

View File

@ -564,7 +564,7 @@ nr_size;en;size
nr_spells;en;spells nr_spells;en;spells
nr_combatspells;en;combat spells nr_combatspells;en;combat spells
nr_nospells;en;none nr_nospells;en;none
nr_addresslist;en;Addresses nr_addresses;en;Addresses
## Küsten ## Küsten
Nordwestküste;en;northwest coast Nordwestküste;en;northwest coast
@ -586,3 +586,4 @@ ADRESSEN;en;ADDRESSES
ZIPPED;en;ZIPPED ZIPPED;en;ZIPPED
BZIP2;en;BZIP2 BZIP2;en;BZIP2
PUNKTE;en;SCORE PUNKTE;en;SCORE
INFO;en;INFO