making self-initiated explosions happen directly in melee_attack::mons_self_destructs() and by calling arena_monster_died() after the spore has exploded instead of before.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8268 c06c8d41-db1a-0410-9941-cceddc491573
KOVRG7IPNFPXQNBFVMYEY7T6WM55CHJ37I4E763S6EJ6IZH32FYAC
NGBG6Z5EW7TWWOHKXNCUSVWMOCPYWUK5LDY6FHBQE7SOTNO45YTQC
3EREXXQMWTOWPI5ZV4UABEIR4RTGPNM7V2O6CG2EOFPHA5GEB2WAC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
R32CQ6FQJTQLB35P3HENIDCBDT3UWXBBCDAAUWHUQO6G6NKEDPKQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
TZMLB4SJENS4JWIPIG7HFOFRIOZYYH5YB4TG7ZGBYT63C5B3MXDQC
K4CJM2GNQKZAPQT3FD2FSG4IXBUUZS42VSXH3QCVSWTZ3JOZT6YQC
PKXXBHS3LWLPZI2QVRX22MSQ4R2626IXRSNHFFYHXYTLJJQU54LQC
if (arena::faction_a.active_members > 0
&& arena::faction_b.active_members <= 0)
{
arena::faction_a.won = true;
return;
}
else if (arena::faction_b.active_members > 0
&& arena::faction_a.active_members <= 0)
{
arena::faction_b.won = true;
return;
}
const monsters* atk =
(invalid_monster_index(killer_index) || menv[killer_index].type == -1)
? NULL : &menv[killer_index];
// Was the death caused by the suicide attack of a gas spore or
// ball lightning which was the final member of its faction?
if (arena::faction_a.active_members <= 0
&& arena::faction_b.active_members <= 0
&& !invalid_monster_index(killer_index)
&& menv[killer_index].type != -1)
if (atk && atk->alive())
if (atk->attitude == ATT_FRIENDLY)
arena::faction_a.won = true;
else if (atk->attitude == ATT_HOSTILE)
arena::faction_b.won = true;
arena::faction_a.won = true;
// If all monsters are dead and the last one to die is a giant spore
// or ball lightning then that monster's faction is the winner,
// since self destruction is their purpose. But if a trap causes
// the spore to explode and that kills everything it's a tie since
// it counts as the trap killing everyone.
else if (arena::faction_a.active_members <= 0
&& arena::faction_b.active_members <= 0
&& mons_self_destructs(monster)
&& MON_KILL(killer))
{
if (monster->attitude == ATT_FRIENDLY)
arena::faction_a.won = true;
else if (monster->attitude == ATT_HOSTILE)
arena::faction_b.won = true;
}