summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/fight.cc
diff options
context:
space:
mode:
authorharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-06 14:32:02 +0000
committerharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-06 14:32:02 +0000
commit8dbcc4dbe18b959b2eab5a2c20aac3f97c6179f9 (patch)
tree43dcc1b16a420b31b645bbafc938c0c0a3d1b03d /crawl-ref/source/fight.cc
parent31fb4f573fea4f4ebcceb1f4fcfc478daa0897dc (diff)
downloadcrawl-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.cc20
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)