From f1b26f023441e9bb7b277ed1e559cc30fd4b1223 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 Aug 2006 00:36:42 +0000 Subject: [PATCH] Mehrere Bugfixes die aus der vorangegangenen Aenderung resultierten. Ausserdem: Bei falsch geschriebenen Befehlen (ZCHTE) wird der falsche Befehl in der Meldung ausgegeben. --- src/common/gamecode/items.c | 6 +- src/common/gamecode/laws.c | 140 +++++++++--------------------------- src/common/gamecode/study.c | 1 + src/common/kernel/order.c | 3 +- src/common/triggers/shock.c | 7 +- 5 files changed, 42 insertions(+), 115 deletions(-) diff --git a/src/common/gamecode/items.c b/src/common/gamecode/items.c index 935f0c16b..07e46481b 100644 --- a/src/common/gamecode/items.c +++ b/src/common/gamecode/items.c @@ -68,10 +68,8 @@ use_studypotion(struct unit * u, const struct item_type * itype, int amount, str static int use_speedsail(struct unit * u, const struct item_type * itype, int amount, struct order * ord) { - struct plane * p = rplane(u->region); - unused(amount); - unused(itype); #ifdef SPEEDAIL_ENABLED + struct plane * p = rplane(u->region); /* disabled because of abuse */ if (p!=NULL) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "use_realworld_only", "")); @@ -94,6 +92,8 @@ use_speedsail(struct unit * u, const struct item_type * itype, int amount, struc } } #endif + unused(amount); + unused(itype); return EUNUSABLE; } /* END speedsail */ diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index ba6e6f2cb..f0f347ff6 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -2548,85 +2548,6 @@ combatspell_cmd(unit * u, struct order * ord) return 0; } -static void -instant_orders(void) -{ - region *r; - faction *f; - - puts(" - Kontakte, Hilfe, Status, Kampfzauber, Texte, Bewachen (aus), Zeigen"); - - for (f = factions; f; f = f->next) { - attrib *a; - a = a_find(f->attribs, &at_showitem); - while (a!=NULL && a->type==&at_showitem) { - const item_type * itype = (const item_type *)a->data.v; - const potion_type * ptype = resource2potion(itype->rtype); - attrib * an = a->next; - if (ptype!=NULL) { - /* potions werden separat behandelt */ - display_item(f, NULL, (const item_type *)a->data.v); - a_remove(&f->attribs, a); - } - a = an; - } - } - - for (r = regions; r; r = r->next) { - unit * u; - for (u = r->units; u; u = u->next) { - order * ord; - freset(u, UFL_MOVED); /* reset, because it was saved in the datafile (monsters!) */ - for (ord = u->orders; ord; ord = ord->next) { - switch (get_keyword(ord)) { - case K_QUIT: - quit_cmd(u, ord); - break; - case K_URSPRUNG: - origin_cmd(u, ord); - break; - case K_ALLY: - ally_cmd(u, ord); - break; - case K_PREFIX: - prefix_cmd(u, ord); - break; - case K_SYNONYM: - synonym_cmd(u, ord); - break; - case K_SETSTEALTH: - setstealth_cmd(u, ord); - break; -#ifdef KARMA_MODULE - case K_WEREWOLF: - setwere_cmd(u, ord); - break; -#endif /* KARMA_MODULE */ - case K_STATUS: - /* KAEMPFE [ NICHT | AGGRESSIV | DEFENSIV | HINTEN | FLIEHE ] */ - status_cmd(u, ord); - break; - case K_COMBAT: - /* KAMPFZAUBER [[STUFE n] ""] [NICHT] */ - combatspell_cmd(u, ord); - break; - case K_DISPLAY: - display_cmd(u, ord); - break; - case K_NAME: - name_cmd(u, ord); - break; - case K_GUARD: - guard_off_cmd(u, ord); - break; - case K_RESHOW: - reshow_cmd(u, ord); - break; - } - } - } - } -} /* ------------------------------------------------------------- */ /* Beachten: einige Monster sollen auch unbewaffent die Region bewachen * können */ @@ -3400,26 +3321,29 @@ setdefaults(unit *u) * werden. Da Handel erst nach anderen langen Befehlen kommt, * muß das vorher abgefangen werden. Wir merken uns also * hier, ob die Einheit handelt. */ - case K_BUY: - case K_SELL: - /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht - * werden. */ - trade = true; - break; - - case K_CAST: - /* dient dazu, das neben Zaubern kein weiterer Befehl - * ausgeführt werden kann, Zaubern ist ein kurzer Befehl */ - set_order(&u->thisorder, NULL); - break; - - case K_WEREWOLF: - set_order(&u->thisorder, copy_order(ord)); - break; - - /* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen - * mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern - * nicht moeglich ist, Schulden zu machen. */ + case NOKEYWORD: + cmistake(u, ord, 22, MSG_EVENT); + break; + case K_BUY: + case K_SELL: + /* Wenn die Einheit handelt, muß der Default-Befehl gelöscht + * werden. */ + trade = true; + break; + + case K_CAST: + /* dient dazu, das neben Zaubern kein weiterer Befehl + * ausgeführt werden kann, Zaubern ist ein kurzer Befehl */ + set_order(&u->thisorder, NULL); + break; + + case K_WEREWOLF: + set_order(&u->thisorder, copy_order(ord)); + break; + + /* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen + * mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern + * nicht moeglich ist, Schulden zu machen. */ } } } @@ -3648,10 +3572,12 @@ update_spells(void) for(r=regions; r; r=r->next) { unit *u; for(u=r->units;u;u=u->next) { - sc_mage *m = get_mage(u); - if (u->faction->no != MONSTER_FACTION && m != NULL) { - if (m->magietyp == M_GRAU) continue; - updatespelllist(u); + if (u->faction!=NULL && u->number>0) { + sc_mage *m = get_mage(u); + if (u->faction->no != MONSTER_FACTION && m != NULL) { + if (m->magietyp == M_GRAU) continue; + updatespelllist(u); + } } } } @@ -3880,7 +3806,7 @@ process(void) if (pglobal==NULL || pglobal->priority!=prio) continue; for (r = regions; r; r = r->next) { - unit **up; + unit *u; processor *pregion = pglobal; while (pregion && pregion->priority==prio && pregion->type==PR_REGION) { @@ -3889,8 +3815,7 @@ process(void) } if (pregion==NULL || pregion->priority!=prio) continue; - for (up=&r->units;*up;) { - unit * u = *up; + for (u=r->units;u;u=u->next) { processor *porder, *punit = pregion; while (punit && punit->priority==prio && punit->type==PR_UNIT) { @@ -3912,8 +3837,6 @@ process(void) } porder = porder->next; } - assert(*up==u); - up=&u->next; } } } @@ -4095,6 +4018,7 @@ processorders (void) puts(" - Attribute altern"); ageing(); + remove_empty_units(); #ifdef WORMHOLE_MODULE create_wormholes(); diff --git a/src/common/gamecode/study.c b/src/common/gamecode/study.c index de0059b2e..7402041b3 100644 --- a/src/common/gamecode/study.c +++ b/src/common/gamecode/study.c @@ -730,6 +730,7 @@ learn_cmd(unit * u, order * ord) } } } + return 0; } void diff --git a/src/common/kernel/order.c b/src/common/kernel/order.c index d0e00879e..a8b89aeef 100644 --- a/src/common/kernel/order.c +++ b/src/common/kernel/order.c @@ -464,7 +464,8 @@ write_order(const order * ord, const struct locale * lang, char * buffer, size_t } else { keyword_t kwd = ORD_KEYWORD(ord); if (kwd==NOKEYWORD) { - buffer[0]=0; + const char * text = ORD_STRING(ord); + strlcpy(buffer, text, size); } else { get_command(ord, buffer, size); } diff --git a/src/common/triggers/shock.c b/src/common/triggers/shock.c index e8a7bdb3c..2f3a86e95 100644 --- a/src/common/triggers/shock.c +++ b/src/common/triggers/shock.c @@ -75,9 +75,10 @@ do_shock(unit *u, const char *reason) if (strcmp(reason, "trigger")==0) { remove_familiar(u); } - - ADDMSG(&u->faction->msgs, msg_message("shock", - "mage reason", u, strdup(reason))); + if (u->faction!=NULL) { + ADDMSG(&u->faction->msgs, msg_message("shock", + "mage reason", u, strdup(reason))); + } } static int