- hungernde, die einen NMR haben, arbeiteten nicht

Crashbug falsche Messageparameter (Magie)
This commit is contained in:
Enno Rehling 2004-05-22 14:41:27 +00:00
parent 6e5da8ac25
commit 75ea8e150b
2 changed files with 120 additions and 119 deletions

View File

@ -3178,147 +3178,148 @@ new_units (void)
static void static void
setdefaults (void) setdefaults (void)
{ {
region *r; region *r;
unit *u;
strlist *S;
for (r = regions; r; r = r->next){ for (r = regions; r; r = r->next) {
for (u = r->units; u; u = u->next) { unit *u;
boolean trade = false;
set_string(&u->thisorder, u->lastorder); for (u = r->units; u; u = u->next) {
for(S = u->orders; S; S = S->next) { strlist *slist;
const char * cmd; boolean trade = false;
keyword_t keyword = igetkeyword(S->s, u->faction->locale);
switch (keyword) { if (LongHunger() && fval(u, UFL_HUNGER)) {
/* Hungernde Einheiten führen NUR den default-Befehl aus */
const char * cmd = locale_string(u->faction->locale, "defaultorder");
set_string(&u->thisorder, cmd);
continue;
}
/* Wenn gehandelt wird, darf kein langer Befehl ausgeführt /* by default the default long order becomes the new long order. */
* werden. Da Handel erst nach anderen langen Befehlen kommt, set_string(&u->thisorder, u->lastorder);
* muß das vorher abgefangen werden. Wir merken uns also
* hier, ob die Einheit handelt. */
case K_BUY: /* check all orders for a potential new long order this round: */
case K_SELL: for (slist=u->orders; !trade && slist!=NULL; slist=slist->next) {
trade = true; const char * cmd = slist->s;
break;
case K_CAST: keyword_t keyword = igetkeyword(cmd, u->faction->locale);
set_string(&u->thisorder, ""); switch (keyword) {
break;
/* dient dazu, das neben Zaubern kein weiterer Befehl
* ausgeführt werden kann, Zaubern ist ein kurzer Befehl */
/* Falls wir MACHE TEMP haben, ignorieren wir es. Alle anderen case K_BUY:
* Arten von MACHE zaehlen aber als neue defaults und werden case K_SELL:
* behandelt wie die anderen (deswegen kein break nach case /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht
* K_MAKE) - und in thisorder (der aktuelle 30-Tage Befehl) * werden. */
* abgespeichert). */ set_string(&u->thisorder, "");
trade = true;
break;
case K_CAST:
/* dient dazu, das neben Zaubern kein weiterer Befehl
* ausgeführt werden kann, Zaubern ist ein kurzer Befehl */
set_string(&u->thisorder, "");
break;
case K_MAKE:
/* Falls wir MACHE TEMP haben, ignorieren wir es. Alle anderen
* Arten von MACHE zaehlen aber als neue defaults und werden
* behandelt wie die anderen (deswegen kein break nach case
* K_MAKE) - und in thisorder (der aktuelle 30-Tage Befehl)
* abgespeichert). */
if (getparam(u->faction->locale) == P_TEMP) break;
/* else fall through */
case K_MAKE:
if (getparam(u->faction->locale) == P_TEMP) break;
case K_BESIEGE:
case K_ENTERTAIN:
case K_TAX:
case K_RESEARCH:
case K_SPY:
case K_STEAL:
case K_SABOTAGE:
case K_STUDY:
case K_TEACH:
case K_ZUECHTE:
#if GROWING_TREES #if GROWING_TREES
case K_PFLANZE: case K_PFLANZE:
#endif #endif
case K_BIETE: case K_BESIEGE:
case K_PIRACY: case K_ENTERTAIN:
if (idle (u->faction)) { case K_TAX:
set_string (&u->thisorder, locale_string(u->faction->locale, "defaultorder")); case K_RESEARCH:
break; case K_SPY:
} case K_STEAL:
/* Ab hier Befehle, die auch eine idle case K_SABOTAGE:
* Faction machen darf: */ case K_STUDY:
case K_ROUTE: case K_TEACH:
case K_WORK: case K_ZUECHTE:
case K_DRIVE: case K_BIETE:
case K_MOVE: case K_PIRACY:
case K_WEREWOLF: /* Über dieser Zeile nur Befehle, die auch eine idle Faction machen darf */
cmd = S->s; if (idle (u->faction)) {
if (LongHunger() && fval(u, UFL_HUNGER)) { set_string (&u->thisorder, locale_string(u->faction->locale, "defaultorder"));
cmd = locale_string(u->faction->locale, "defaultorder"); break;
} }
set_string(&u->thisorder, cmd); /* else fall through */
break;
/* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen case K_ROUTE:
* mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern case K_WORK:
* nicht moeglich ist, Schulden zu machen. */ case K_DRIVE:
} case K_MOVE:
} case K_WEREWOLF:
set_string(&u->thisorder, cmd);
break;
/* Wenn die Einheit handelt, muß der Default-Befehl gelöscht /* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen
* werden. */ * mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern
* nicht moeglich ist, Schulden zu machen. */
}
}
if(trade == true) { /* thisorder kopieren wir nun nach lastorder. in lastorder steht
/* fset(u, UFL_LONGACTION); */ * der DEFAULT befehl der einheit. da MOVE kein default werden
set_string(&u->thisorder, ""); * darf, wird MOVE nicht in lastorder kopiert. MACHE TEMP wurde ja
} * schon gar nicht erst in thisorder kopiert, so dass MACHE TEMP
/* thisorder kopieren wir nun nach lastorder. in lastorder steht * durch diesen code auch nicht zum default wird Ebenso soll BIETE
* der DEFAULT befehl der einheit. da MOVE kein default werden * nicht hierher, da i.A. die Einheit dann ja weg ist (und damit
* darf, wird MOVE nicht in lastorder kopiert. MACHE TEMP wurde ja * die Einheitsnummer ungueltig). Auch Attackiere sollte nie in
* schon gar nicht erst in thisorder kopiert, so dass MACHE TEMP * den Default übernommen werden */
* durch diesen code auch nicht zum default wird Ebenso soll BIETE switch (igetkeyword (u->thisorder, u->faction->locale)) {
* nicht hierher, da i.A. die Einheit dann ja weg ist (und damit case K_MOVE:
* die Einheitsnummer ungueltig). Auch Attackiere sollte nie in case K_BIETE:
* den Default übernommen werden */ case K_ATTACK:
case K_WEREWOLF:
case NOKEYWORD:
break;
switch (igetkeyword (u->thisorder, u->faction->locale)) { default:
case K_MOVE: set_string(&u->lastorder, u->thisorder);
case K_BIETE: }
case K_ATTACK:
case K_WEREWOLF:
break;
default: /* Attackiere sollte niemals Default werden */
set_string(&u->lastorder, u->thisorder); if (igetkeyword(u->lastorder, u->faction->locale) == K_ATTACK) {
} set_string(&u->lastorder, locale_string(u->faction->locale, "defaultorder"));
/* Attackiere sollte niemals Default werden */ }
if (igetkeyword(u->lastorder, u->faction->locale) == K_ATTACK) }
set_string(&u->lastorder, locale_string(u->faction->locale, "defaultorder")); }
}
}
} }
static int static int
use_item(unit * u, const item_type * itype, int amount, const char * cmd) use_item(unit * u, const item_type * itype, int amount, const char * cmd)
{ {
int i; int i;
int target = read_unitid(u->faction, u->region); int target = read_unitid(u->faction, u->region);
i = new_get_pooled(u, itype->rtype, GET_DEFAULT); i = new_get_pooled(u, itype->rtype, GET_DEFAULT);
if (amount>i) { if (amount>i) {
amount = i; amount = i;
} }
if (i==0) { if (i==0) {
cmistake(u, cmd, 43, MSG_PRODUCE); cmistake(u, cmd, 43, MSG_PRODUCE);
return ENOITEM; return ENOITEM;
} }
if (target==-1) { if (target==-1) {
if (itype->use==NULL) { if (itype->use==NULL) {
cmistake(u, cmd, 76, MSG_PRODUCE); cmistake(u, cmd, 76, MSG_PRODUCE);
return EUNUSABLE; return EUNUSABLE;
} }
return itype->use(u, itype, amount, cmd); return itype->use(u, itype, amount, cmd);
} else { } else {
if (itype->useonother==NULL) { if (itype->useonother==NULL) {
cmistake(u, cmd, 76, MSG_PRODUCE); cmistake(u, cmd, 76, MSG_PRODUCE);
return EUNUSABLE; return EUNUSABLE;
} }
return itype->useonother(u, target, itype, amount, cmd); return itype->useonother(u, target, itype, amount, cmd);
} }
} }

View File

@ -2824,7 +2824,7 @@ magic(void)
continue; continue;
} }
if (range > 1024) { /* (2^10) weiter als 10 Regionen entfernt */ if (range > 1024) { /* (2^10) weiter als 10 Regionen entfernt */
ADDMSG(&u->faction->msgs, msg_message("spellfail::nolevel", ADDMSG(&u->faction->msgs, msg_message("spellfail::nocontact",
"mage region command target", u, u->region, so->s, "mage region command target", u, u->region, so->s,
gc_add(strdup(regionid(target_r))))); gc_add(strdup(regionid(target_r)))));
continue; continue;