Generalisierung der Tests fuer lange Befehle, (Insekten, Meermenschen auf See usw.) damit ich die nicht ueberall vergesse.

This commit is contained in:
Enno Rehling 2007-03-25 00:04:40 +00:00
parent eb1d2373e8
commit c722a382a2
6 changed files with 117 additions and 154 deletions

View File

@ -1632,13 +1632,6 @@ make_cmd(unit * u, struct order * ord)
const char *s;
const struct locale * lang = u->faction->locale;
if (u->number==0) return 0;
if (fval(r->terrain, SEA_REGION) && u->race != new_race[RC_AQUARIAN]) {
cmistake(u, ord, 242, MSG_INCOME);
return;
}
init_tokens(ord);
skip_token();
s = getstrtoken();

View File

@ -3688,14 +3688,18 @@ claim_cmd(unit * u, struct order * ord)
return 0;
}
enum {
PROC_THISORDER = 1<<0,
PROC_LONGORDER = 1<<1
};
typedef struct processor {
struct processor * next;
int priority;
enum { PR_GLOBAL, PR_REGION_PRE, PR_UNIT, PR_ORDER, PR_REGION_POST } type;
unsigned int flags;
union {
struct {
keyword_t kword;
boolean thisorder;
int (*process)(struct unit *, struct order *);
} per_order;
struct {
@ -3736,13 +3740,13 @@ add_proc(int priority, const char * name, int type)
}
void
add_proc_order(int priority, keyword_t kword, int (*parser)(struct unit *, struct order *), boolean thisorder, const char * name)
add_proc_order(int priority, keyword_t kword, int (*parser)(struct unit *, struct order *), unsigned int flags, const char * name)
{
processor * proc = add_proc(priority, name, PR_ORDER);
if (proc) {
proc->data.per_order.process = parser;
proc->data.per_order.kword = kword;
proc->data.per_order.thisorder = thisorder;
proc->flags = flags;
}
}
@ -3827,13 +3831,31 @@ process(void)
porder = punit;
while (porder && porder->priority==prio && porder->type==PR_ORDER) {
order ** ordp = &u->orders;
if (porder->data.per_order.thisorder) ordp = &u->thisorder;
if (porder->flags & PROC_THISORDER) ordp = &u->thisorder;
while (*ordp) {
order * ord = *ordp;
if (get_keyword(ord) == porder->data.per_order.kword) {
if (u->number==0) {
ord = NULL;
} else if (porder->flags & PROC_LONGORDER) {
if (u->race == new_race[RC_INSECT] && r_insectstalled(r) && !is_cursed(u->attribs, C_KAELTESCHUTZ,0)) {
ord = NULL;
} else if (LongHunger(u)) {
cmistake(u, ord, 224, MSG_MAGIC);
ord = NULL;
} else if (fval(u, UFL_LONGACTION)) {
cmistake(u, ord, 52, MSG_PRODUCE);
ord = NULL;
} else if (fval(r->terrain, SEA_REGION) && u->race != new_race[RC_AQUARIAN] && !(u->race->flags & RCF_SWIM)) {
cmistake(u, ord, 242, MSG_INCOME);
ord = NULL;
}
}
if (ord) {
porder->data.per_order.process(u, ord);
}
if (*ordp==ord) ordp=&ord->next;
}
if (!ord || *ordp==ord) ordp=&(*ordp)->next;
}
porder = porder->next;
}
@ -3876,28 +3898,28 @@ processorders (void)
p+=10;
add_proc_unit(p, &setdefaults, "Default-Befehle");
add_proc_order(p, K_BANNER, &banner_cmd, false, NULL);
add_proc_order(p, K_EMAIL, &email_cmd, false, NULL);
add_proc_order(p, K_PASSWORD, &password_cmd, false, NULL);
add_proc_order(p, K_SEND, &send_cmd, false, NULL);
add_proc_order(p, K_GROUP, &group_cmd, false, NULL);
add_proc_order(p, K_BANNER, &banner_cmd, 0, NULL);
add_proc_order(p, K_EMAIL, &email_cmd, 0, NULL);
add_proc_order(p, K_PASSWORD, &password_cmd, 0, NULL);
add_proc_order(p, K_SEND, &send_cmd, 0, NULL);
add_proc_order(p, K_GROUP, &group_cmd, 0, NULL);
p+=10;
add_proc_unit(p, &reset_moved, "Instant-Befehle");
add_proc_order(p, K_QUIT, &quit_cmd, false, NULL);
add_proc_order(p, K_URSPRUNG, &origin_cmd, false, NULL);
add_proc_order(p, K_ALLY, &ally_cmd, false, NULL);
add_proc_order(p, K_PREFIX, &prefix_cmd, false, NULL);
add_proc_order(p, K_SYNONYM, &synonym_cmd, false, NULL);
add_proc_order(p, K_SETSTEALTH, &setstealth_cmd, false, NULL);
add_proc_order(p, K_STATUS, &status_cmd, false, NULL);
add_proc_order(p, K_COMBAT, &combatspell_cmd, false, NULL);
add_proc_order(p, K_DISPLAY, &display_cmd, false, NULL);
add_proc_order(p, K_NAME, &name_cmd, false, NULL);
add_proc_order(p, K_GUARD, &guard_off_cmd, false, NULL);
add_proc_order(p, K_RESHOW, &reshow_cmd, false, NULL);
add_proc_order(p, K_QUIT, &quit_cmd, 0, NULL);
add_proc_order(p, K_URSPRUNG, &origin_cmd, 0, NULL);
add_proc_order(p, K_ALLY, &ally_cmd, 0, NULL);
add_proc_order(p, K_PREFIX, &prefix_cmd, 0, NULL);
add_proc_order(p, K_SYNONYM, &synonym_cmd, 0, NULL);
add_proc_order(p, K_SETSTEALTH, &setstealth_cmd, 0, NULL);
add_proc_order(p, K_STATUS, &status_cmd, 0, NULL);
add_proc_order(p, K_COMBAT, &combatspell_cmd, 0, NULL);
add_proc_order(p, K_DISPLAY, &display_cmd, 0, NULL);
add_proc_order(p, K_NAME, &name_cmd, 0, NULL);
add_proc_order(p, K_GUARD, &guard_off_cmd, 0, NULL);
add_proc_order(p, K_RESHOW, &reshow_cmd, 0, NULL);
#ifdef KARMA_MODULE
add_proc_order(p, K_WEREWOLF, &setwere_cmd, false, NULL);
add_proc_order(p, K_WEREWOLF, &setwere_cmd, 0, NULL);
#endif /* KARMA_MODULE */
if (alliances!=NULL) {
@ -3907,12 +3929,12 @@ processorders (void)
p+=10;
add_proc_global(p, &age_factions, "Parteienalter++");
add_proc_order(p, K_MAIL, &mail_cmd, false, "Botschaften");
add_proc_order(p, K_CLAIM, &claim_cmd, false, NULL);
add_proc_order(p, K_MAIL, &mail_cmd, 0, "Botschaften");
add_proc_order(p, K_CLAIM, &claim_cmd, 0, NULL);
p+=10; /* all claims must be done before we can USE */
add_proc_region(p, &enter_1, "Kontaktieren & Betreten (1. Versuch)");
add_proc_order(p, K_USE, &use_cmd, false, "Benutzen");
add_proc_order(p, K_USE, &use_cmd, 0, "Benutzen");
if (alliances!=NULL) {
p+=10; /* in case USE changes it */
@ -3925,7 +3947,7 @@ processorders (void)
add_proc_global(p, &gmcommands, "GM Kommandos");
p += 10; /* in case it has any effects on allincevictories */
add_proc_order(p, K_LEAVE, &leave_cmd, false, "Verlassen");
add_proc_order(p, K_LEAVE, &leave_cmd, 0, "Verlassen");
if (!nobattle) {
#ifdef KARMA_MODULE
@ -3941,7 +3963,7 @@ processorders (void)
p+=10; /* can't allow reserve before siege (weapons) */
add_proc_region(p, &enter_1, "Kontaktieren & Betreten (2. Versuch)");
add_proc_order(p, K_RESERVE, &reserve_cmd, false, "Reservieren");
add_proc_order(p, K_RESERVE, &reserve_cmd, 0, "Reservieren");
add_proc_unit(p, &follow_unit, "Folge auf Einheiten setzen");
p+=10; /* rest rng again before economics */
@ -3960,13 +3982,14 @@ processorders (void)
p+=10;
if (!global.disabled[K_TEACH]) {
add_proc_region(p, &teaching, "Lehren");
add_proc_order(p, K_TEACH, &teach_cmd, PROC_THISORDER|PROC_LONGORDER, "Lehren");
}
add_proc_order(p, K_STUDY, &learn_cmd, true, "Lernen");
p+=10;
add_proc_order(p, K_STUDY, &learn_cmd, PROC_THISORDER|PROC_LONGORDER, "Lernen");
p+=10;
add_proc_global(p, &produce, "Arbeiten, Handel, Rekruten");
add_proc_order(p, K_MAKE, &make_cmd, true, "Produktion");
add_proc_order(p, K_MAKE, &make_cmd, PROC_THISORDER|PROC_LONGORDER, "Produktion");
add_proc_postregion(p, &split_allocations, "Produktion II");
p+=10;
@ -3979,10 +4002,10 @@ processorders (void)
add_proc_global(p, &movement, "Bewegungen");
p+=10;
add_proc_order(p, K_GUARD, &guard_on_cmd, false, "Bewache (an)");
add_proc_order(p, K_GUARD, &guard_on_cmd, 0, "Bewache (an)");
#ifdef XECMD_MODULE
/* can do together with guard */
add_proc_order(p, K_LEAVE, &xecmd, false, "Zeitung");
add_proc_order(p, K_LEAVE, &xecmd, 0, "Zeitung");
#endif
p+=10;
@ -4018,9 +4041,9 @@ processorders (void)
add_proc_global(p, &declare_war, "Krieg & Frieden");
#endif
#ifdef HEROES
add_proc_order(p, K_PROMOTION, &promotion_cmd, false, "Heldenbeförderung");
add_proc_order(p, K_PROMOTION, &promotion_cmd, 0, "Heldenbeförderung");
#endif
add_proc_order(p, K_NUMBER, &renumber_cmd, false, "Neue Nummern (Einheiten)");
add_proc_order(p, K_NUMBER, &renumber_cmd, 0, "Neue Nummern (Einheiten)");
p+=10;
add_proc_global(p, &renumber_factions, "Neue Nummern");

View File

@ -238,22 +238,33 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
return n;
}
static void
teach(unit * u, struct order * ord)
int
teach_cmd(unit * u, struct order * ord)
{
static const curse_type * gbdream_ct = NULL;
region * r = u->region;
int teaching, i, j, count, academy=0;
unit *u2;
skill_t sk = NOSKILL;
if (gbdream_ct==0) gbdream_ct = ct_find("gbdream");
if (gbdream_ct) {
if (get_curse(u->region->attribs, gbdream_ct)) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "gbdream_noteach", ""));
return 0;
}
}
if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) {
cmistake(u, ord, 274, MSG_EVENT);
return;
return 0;
}
if (r->planep && fval(r->planep, PFL_NOTEACH)) {
cmistake(u, ord, 273, MSG_EVENT);
return;
return 0;
}
teaching = u->number * 30 * TEACHNUMBER;
@ -267,7 +278,7 @@ teach(unit * u, struct order * ord)
ADDMSG(&u->faction->msgs, msg_message("teachdumb",
"teacher amount", u, j));
}
if (teaching == 0) return;
if (teaching == 0) return 0;
u2 = 0;
@ -436,6 +447,7 @@ teach(unit * u, struct order * ord)
academy = academy/30; /* anzahl gelehrter wochen, max. 10 */
learn_skill(u, sk, academy/30.0/TEACHNUMBER);
}
return 0;
}
/* ------------------------------------------------------------- */
@ -460,23 +472,6 @@ learn_cmd(unit * u, order * ord)
else learn_newskills = 1;
}
if (u->number==0) return 0;
if (fval(r->terrain, SEA_REGION)) {
/* sonderbehandlung aller die auf Ozeanen lernen können */
if (u->race!=new_race[RC_AQUARIAN] && !(u->race->flags & RCF_SWIM)) {
return 0;
}
}
if (fval(u, UFL_LONGACTION)) return 0;
if (u->race == new_race[RC_INSECT] && r_insectstalled(r)
&& !is_cursed(u->attribs, C_KAELTESCHUTZ,0)) {
return 0;
}
if (fval(u, UFL_LONGACTION)) {
cmistake(u, ord, 52, MSG_PRODUCE);
return 0;
}
if ((u->race->flags & RCF_NOLEARN) || fval(u, UFL_WERE)) {
sprintf(buf, "%s können nichts lernen", LOC(default_locale, rc_name(u->race, 1)));
mistake(u, ord, buf, MSG_EVENT);
@ -744,51 +739,3 @@ learn_cmd(unit * u, order * ord)
}
return 0;
}
void
teaching(region *r)
{
/* das sind alles befehle, die 30 tage brauchen, und die in thisorder
* stehen! von allen 30-tage befehlen wird einfach der letzte verwendet
* (dosetdefaults).
*
* lehren vor lernen. */
unit *u;
for (u = r->units; u; u = u->next) {
if (u->race == new_race[RC_SPELL] || fval(u, UFL_LONGACTION))
continue;
if (fval(r->terrain, SEA_REGION)
&& u->race != new_race[RC_AQUARIAN]
&& !(u->race->flags & RCF_SWIM))
continue;
if (u->race == new_race[RC_INSECT] && r_insectstalled(r)
&& !is_cursed(u->attribs, C_KAELTESCHUTZ,0)) {
continue;
}
switch (get_keyword(u->thisorder)) {
case K_TEACH:
if (fval(u, UFL_LONGACTION)) {
cmistake(u, u->thisorder, 52, MSG_PRODUCE);
continue;
} else {
static const curse_type * gbdream_ct = NULL;
if (gbdream_ct==0) gbdream_ct = ct_find("gbdream");
if (gbdream_ct) {
if (get_curse(u->region->attribs, gbdream_ct)) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, u->thisorder, "gbdream_noteach", ""));
continue;
}
}
}
teach(u, u->thisorder);
break;
}
}
}

View File

@ -19,7 +19,7 @@
extern "C" {
#endif
extern void teaching(struct region * r);
extern int teach_cmd(struct unit * u, struct order * ord);
extern int learn_cmd(struct unit * u, struct order * ord);
extern magic_t getmagicskill(void);