define SIMPLE_ESCAPE to disable units running to neighbouring regions in combat (step I of new rules)

This commit is contained in:
Enno Rehling 2007-02-10 11:25:23 +00:00
parent ca347ea1f7
commit 1d398a46fb
3 changed files with 47 additions and 13 deletions

View File

@ -121,6 +121,7 @@ army_index(side * s)
return s->battle->nsides - s->index - 1; return s->battle->nsides - s->index - 1;
} }
#ifndef SIMPLE_ESCAPE
region * region *
fleeregion(const unit * u) fleeregion(const unit * u)
{ {
@ -150,6 +151,7 @@ fleeregion(const unit * u)
return NULL; return NULL;
return neighbours[rng_int() % c]; return neighbours[rng_int() % c];
} }
#endif /* SIMPLE_ESCAPE */
static char * static char *
sidename(side * s, boolean truename) sidename(side * s, boolean truename)
@ -482,13 +484,17 @@ static void
reportcasualties(battle * b, fighter * fig, int dead) reportcasualties(battle * b, fighter * fig, int dead)
{ {
struct message * m; struct message * m;
region * r = NULL;
if (fig->alive == fig->unit->number) return; if (fig->alive == fig->unit->number) return;
#ifndef SIMPLE_ESCAPE
if (fig->run.region == NULL) { if (fig->run.region == NULL) {
fig->run.region = fleeregion(fig->unit); fig->run.region = fleeregion(fig->unit);
if (fig->run.region == NULL) fig->run.region = b->region; if (fig->run.region == NULL) fig->run.region = b->region;
} }
r = fig->run.region;
#endif /* SIMPLE_ESCAPE */
m = msg_message("casualties", "unit runto run alive fallen", m = msg_message("casualties", "unit runto run alive fallen",
fig->unit, fig->run.region, fig->run.number, fig->alive, dead); fig->unit, r, fig->run.number, fig->alive, dead);
message_all(b, m); message_all(b, m);
msg_release(m); msg_release(m);
} }
@ -2290,6 +2296,7 @@ loot_items(fighter * corpse)
} }
} }
#ifndef SIMPLE_ESCAPE
static void static void
loot_fleeing(fighter* fig, unit* runner) loot_fleeing(fighter* fig, unit* runner)
{ {
@ -2305,6 +2312,7 @@ merge_fleeloot(fighter* fig, unit* u)
{ {
i_merge(&u->items, &fig->run.items); i_merge(&u->items, &fig->run.items);
} }
#endif /* SIMPLE_ESCAPE */
static boolean static boolean
seematrix(const faction * f, const side * s) seematrix(const faction * f, const side * s)
@ -2480,22 +2488,30 @@ aftermath(battle * b)
/* Zuerst dürfen die Feinde plündern, die mitgenommenen Items /* Zuerst dürfen die Feinde plündern, die mitgenommenen Items
* stehen in fig->run.items. Dann werden die Fliehenden auf * stehen in fig->run.items. Dann werden die Fliehenden auf
* die leere (tote) alte Einheit gemapt */ * die leere (tote) alte Einheit gemapt */
#ifdef SIMPLE_ESCAPE
if (!fval(df, FIG_NOLOOT)){
loot_items(df);
}
#else
if (fval(df, FIG_NOLOOT)){ if (fval(df, FIG_NOLOOT)){
merge_fleeloot(df, du); merge_fleeloot(df, du);
} else { } else {
loot_items(df); loot_items(df);
loot_fleeing(df, du); loot_fleeing(df, du);
} }
#endif /* SIMPLE_ESCAPE */
scale_number(du, df->run.number); scale_number(du, df->run.number);
du->hp = df->run.hp; du->hp = df->run.hp;
set_order(&du->thisorder, NULL); set_order(&du->thisorder, NULL);
setguard(du, GUARD_NONE); setguard(du, GUARD_NONE);
fset(du, UFL_LONGACTION); fset(du, UFL_LONGACTION);
leave(du->region, du); leave(du->region, du);
#ifndef SIMPLE_ESCAPE
if (df->run.region) { if (df->run.region) {
run_to(du, df->run.region); run_to(du, df->run.region);
df->run.region = du->region; df->run.region = du->region;
} }
#endif /* SIMPLE_ESCAPE */
} else { } else {
/* nur teilweise geflohene Einheiten mergen sich wieder */ /* nur teilweise geflohene Einheiten mergen sich wieder */
df->alive += df->run.number; df->alive += df->run.number;
@ -2503,7 +2519,9 @@ aftermath(battle * b)
s->size[statusrow(df->status)] += df->run.number; s->size[statusrow(df->status)] += df->run.number;
s->alive += df->run.number; s->alive += df->run.number;
sum_hp += df->run.hp; sum_hp += df->run.hp;
#ifndef SIMPLE_ESCAPE
merge_fleeloot(df, du); merge_fleeloot(df, du);
#endif /* SIMPLE_ESCAPE */
df->run.number = 0; df->run.number = 0;
df->run.hp = 0; df->run.hp = 0;
/* df->run.region = NULL;*/ /* df->run.region = NULL;*/
@ -2518,7 +2536,9 @@ aftermath(battle * b)
/* alle sind tot, niemand geflohen. Einheit auflösen */ /* alle sind tot, niemand geflohen. Einheit auflösen */
df->run.number = 0; df->run.number = 0;
df->run.hp = 0; df->run.hp = 0;
#ifndef SIMPLE_ESCAPE
df->run.region = NULL; df->run.region = NULL;
#endif /* SIMPLE_ESCAPE */
/* Report the casualties */ /* Report the casualties */
reportcasualties(b, df, dead); reportcasualties(b, df, dead);
@ -3539,9 +3559,12 @@ static void
flee(const troop dt) flee(const troop dt)
{ {
fighter * fig = dt.fighter; fighter * fig = dt.fighter;
#ifndef SIMPLE_ESCAPE
unit * u = fig->unit; unit * u = fig->unit;
int carry = personcapacity(u) - u->race->weight; int carry = personcapacity(u) - u->race->weight;
int money; int money;
item ** ip = &u->items; item ** ip = &u->items;
while (*ip) { while (*ip) {
@ -3581,6 +3604,7 @@ flee(const troop dt)
i_change(&u->items, i_silver, -money); i_change(&u->items, i_silver, -money);
i_change(&fig->run.items, i_silver, +money); i_change(&fig->run.items, i_silver, +money);
} }
#endif /* SIMPLE_ESCAPE */
fig->run.hp += fig->person[dt.index].hp; fig->run.hp += fig->person[dt.index].hp;
++fig->run.number; ++fig->run.number;
@ -3904,8 +3928,10 @@ battle_flee(battle * b)
if (u->ship) continue; if (u->ship) continue;
dt.fighter = fig; dt.fighter = fig;
#ifndef SIMPLE_ESCAPE
if (!fig->run.region) fig->run.region = fleeregion(u); if (!fig->run.region) fig->run.region = fleeregion(u);
if (!fig->run.region) continue; if (!fig->run.region) continue;
#endif /* SIMPLE_ESCAPE */
dt.index = fig->alive - fig->removed; dt.index = fig->alive - fig->removed;
while (s->size[SUM_ROW] && dt.index != 0) { while (s->size[SUM_ROW] && dt.index != 0) {
double ispaniced = 0.0; double ispaniced = 0.0;
@ -3938,6 +3964,7 @@ battle_flee(battle * b)
if (chance(min(fleechance(u)+ispaniced, 0.90))) { if (chance(min(fleechance(u)+ispaniced, 0.90))) {
++runners; ++runners;
flee(dt); flee(dt);
#ifdef SMALL_BATTLE_MESSAGES #ifdef SMALL_BATTLE_MESSAGES
if (b->small) { if (b->small) {
sprintf(smallbuf, "%s/%d gelingt es, vom Schlachtfeld zu entkommen.", sprintf(smallbuf, "%s/%d gelingt es, vom Schlachtfeld zu entkommen.",

View File

@ -174,12 +174,14 @@ extern "C" {
struct { struct {
int number; /* number of people who fled */ int number; /* number of people who fled */
int hp; /* accumulated hp of fleeing people */ int hp; /* accumulated hp of fleeing people */
#ifndef SIMPLE_ESCAPE
struct region *region; /* destination of fleeing people */ struct region *region; /* destination of fleeing people */
struct item * items; /* items they take */ struct item * items; /* items they take */
#endif /* SIMPLE_ESCAPE */
} run; } run;
#ifndef SIMPLE_COMBAT #ifndef SIMPLE_COMBAT
int action_counter; /* number of active actions the struct unit did in the fight */ int action_counter; /* number of active actions the struct unit did in the fight */
#endif #endif /* SIMPLE_COMBAT */
#ifdef SHOW_KILLS #ifdef SHOW_KILLS
int kills; int kills;
int hits; int hits;
@ -225,7 +227,9 @@ extern "C" {
extern int get_unitrow(const struct fighter * af, const struct side * vs); extern int get_unitrow(const struct fighter * af, const struct side * vs);
extern boolean helping(const struct side * as, const struct side * ds); extern boolean helping(const struct side * as, const struct side * ds);
extern void rmfighter(fighter *df, int i); extern void rmfighter(fighter *df, int i);
#ifndef SIMPLE_ESCAPE
extern struct region * fleeregion(const struct unit * u); extern struct region * fleeregion(const struct unit * u);
#endif
extern struct fighter * select_corpse(struct battle * b, struct fighter * af); extern struct fighter * select_corpse(struct battle * b, struct fighter * af);
extern fighter * make_fighter(struct battle * b, struct unit * u, side * s, boolean attack); extern fighter * make_fighter(struct battle * b, struct unit * u, side * s, boolean attack);
extern int statusrow(int status); extern int statusrow(int status);

View File

@ -1316,6 +1316,7 @@ sp_denyattack(fighter * fi, int level, double power, spell * sp)
/* irgendwie den langen befehl sperren */ /* irgendwie den langen befehl sperren */
/* fset(fi, FIG_ATTACKED); */ /* fset(fi, FIG_ATTACKED); */
#ifndef SIMPLE_ESCAPE
/* Hat der Magier ein NACH, wird die angegebene Richtung bevorzugt */ /* Hat der Magier ein NACH, wird die angegebene Richtung bevorzugt */
switch (get_keyword(mage->thisorder)) { switch (get_keyword(mage->thisorder)) {
case K_MOVE: case K_MOVE:
@ -1332,18 +1333,20 @@ sp_denyattack(fighter * fi, int level, double power, spell * sp)
/* bewegung erst am Ende des Kampfes, zusammen mit den normalen /* bewegung erst am Ende des Kampfes, zusammen mit den normalen
* Flüchtlingen */ * Flüchtlingen */
if (fi->run.region) { if (!fi->run.region) return level;
/* wir tun so, als wäre die Person geflohen */ #endif /* SIMPLE_ESCAPE */
fset(fi, FIG_NOLOOT);
fi->run.hp = mage->hp; /* wir tun so, als wäre die Person geflohen */
fi->run.number = mage->number; fset(fi, FIG_NOLOOT);
/* fighter leeren */ fi->run.hp = mage->hp;
rmfighter(fi, mage->number); fi->run.number = mage->number;
/* fighter leeren */
rmfighter(fi, mage->number);
scat("Das Kampfgetümmel erstirbt und er kann unbehelligt "
"seines Weges ziehen.");
battlerecord(b, buf);
scat("Das Kampfgetümmel erstirbt und er kann unbehelligt "
"seines Weges ziehen.");
battlerecord(b, buf);
}
return level; return level;
} }