diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 1b6063cce..b3c86ad92 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -817,7 +817,7 @@ rmfighter(fighter *df, int i) } -void +static void rmtroop(troop dt) { fighter *df = dt.fighter; @@ -835,6 +835,24 @@ rmtroop(troop dt) void remove_troop(troop dt) +{ + fighter * df = dt.fighter; + struct person p = df->person[dt.index]; + battle * b = df->side->battle; +#ifdef FASTCOUNT + b->fast.alive = -1; /* invalidate cached value */ +#endif +#ifdef FASTROW + b->rowcache.alive = -1; /* invalidate cached value */ +#endif + ++df->removed; + ++df->side->removed; + df->person[dt.index] = df->person[df->alive-df->removed]; + df->person[df->alive - df->removed] = p; +} + +void +kill_troop(troop dt) { fighter * df = dt.fighter; unit * du = df->unit; @@ -1211,7 +1229,7 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) if (rng_int() % 4 < 1) i_change(pitm, itype, -1); } } - remove_troop(dt); + kill_troop(dt); return true; } @@ -3687,7 +3705,7 @@ flee(const troop dt) fig->run.hp += fig->person[dt.index].hp; ++fig->run.number; - remove_troop(dt); + kill_troop(dt); } #ifdef DELAYED_OFFENSE diff --git a/src/common/kernel/battle.h b/src/common/kernel/battle.h index 389ec4195..cec5885d2 100644 --- a/src/common/kernel/battle.h +++ b/src/common/kernel/battle.h @@ -254,7 +254,8 @@ extern "C" { extern fighter * make_fighter(struct battle * b, struct unit * u, side * s, boolean attack); extern int statusrow(int status); extern void drain_exp(struct unit *u, int d); - extern void rmtroop(troop dt); + extern void kill_troop(troop dt); + extern void remove_troop(troop dt); /* not the same as the badly named rmtroop */ extern boolean is_attacker(const fighter * fig); #ifdef __cplusplus diff --git a/src/common/spells/combatspells.c b/src/common/spells/combatspells.c index 2907ef2ca..41ab91c86 100644 --- a/src/common/spells/combatspells.c +++ b/src/common/spells/combatspells.c @@ -184,16 +184,11 @@ sp_versteinern(fighter * fi, int level, double power, spell * sp) while (force && stoned < enemies) { troop dt = select_enemy(fi, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE); - fighter * df = dt.fighter; - unit * du = df->unit; + unit * du = dt.fighter->unit; if (is_magic_resistant(mage, du, 0) == false) { /* person ans ende hinter die lebenden schieben */ - struct person p = dt.fighter->person[dt.index]; - ++dt.fighter->removed; - ++dt.fighter->side->removed; + remove_troop(dt); ++stoned; - dt.fighter->person[dt.index] = dt.fighter->person[df->alive-df->removed]; - dt.fighter->person[(df->alive - df->removed)] = p; } --force; } @@ -528,7 +523,7 @@ sp_mindblast(fighter * fi, int level, double power, spell * sp) reduce_skill(du, sv, n); } else { /* Keine Skills mehr, Einheit töten */ - rmtroop(dt); + kill_troop(dt); ++killed; } --enemies;