diff options
author | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-02-06 14:32:02 +0000 |
---|---|---|
committer | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-02-06 14:32:02 +0000 |
commit | 8dbcc4dbe18b959b2eab5a2c20aac3f97c6179f9 (patch) | |
tree | 43dcc1b16a420b31b645bbafc938c0c0a3d1b03d /crawl-ref/source/fight.cc | |
parent | 31fb4f573fea4f4ebcceb1f4fcfc478daa0897dc (diff) | |
download | crawl-ref-8dbcc4dbe18b959b2eab5a2c20aac3f97c6179f9.tar.gz crawl-ref-8dbcc4dbe18b959b2eab5a2c20aac3f97c6179f9.zip |
Restore a monster's attitude from the beginning of the attack if it
changes during the attack and the monster is about to die, so that
you don't get Okawaru piety for killing an ally just before you
receive the penance. Fixes [2436051].
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8925 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/fight.cc')
-rw-r--r-- | crawl-ref/source/fight.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index 29176020ae..e9dc16ee95 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -320,6 +320,7 @@ melee_attack::melee_attack(actor *attk, actor *defn, did_hit(false), perceived_attack(false), obvious_effect(false), needs_message(false), attacker_visible(false), defender_visible(false), attacker_invisible(false), defender_invisible(false), + defender_starting_attitude(ATT_HOSTILE), unarmed_ok(allow_unarmed), attack_number(which_attack), to_hit(0), base_damage(0), potential_damage(0), damage_done(0), @@ -378,6 +379,17 @@ void melee_attack::init_attack() && see_grid(defender->pos())); needs_message = (attacker_visible || defender_visible); + if (defender && defender->atype() == ACT_MONSTER) + { + defender_starting_attitude = defender_as_monster()->temp_attitude(); + } + else + { + // Not really, but this is used for god conducts, + // so hostile is fine. + defender_starting_attitude = ATT_HOSTILE; + } + if (defender && defender->submerged()) unarmed_ok = false; @@ -1949,6 +1961,14 @@ void melee_attack::_monster_die(monsters* monster, killer_type killer, if (chaos) def_copy = new monsters(*monster); + // The monster is about to die, so restore its original attitude + // for the cleanup effects (god reactions.) This could be a + // problem if the "killing" is actually an Abyss banishment - we + // don't want to create permafriendlies this way - so don't do it + // then. + if (monster == defender && killer != KILL_RESET) + monster->attitude = defender_starting_attitude; + monster_die(monster, killer, killer_index); if (chaos) |