summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/monstuff.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-03-28 21:14:58 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-03-28 21:14:58 +0000
commit1164be44d09a7f8ece0fbfb49c37565ca812da00 (patch)
tree8ff9c7369277d0954d837d3ec02e8169b04dedb0 /crawl-ref/source/monstuff.cc
parent2c8f3a56d75a8f309862a9ab264eff69514ec80e (diff)
downloadcrawl-ref-1164be44d09a7f8ece0fbfb49c37565ca812da00.tar.gz
crawl-ref-1164be44d09a7f8ece0fbfb49c37565ca812da00.zip
Scrolls of fear no longer make allies hostile. Fleeing allies will still run
away from you, but they'll eventually return to your side. Note that charmed allies *will* abandon you. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9563 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r--crawl-ref/source/monstuff.cc43
1 files changed, 34 insertions, 9 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 061a2f33f7..c0048a05d6 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -2549,8 +2549,8 @@ void behaviour_event(monsters *mon, mon_event_type event, int src,
if (is_sanctuary(mon->pos()) && mons_is_fleeing_sanctuary(mon))
{
mon->behaviour = BEH_FLEE;
- mon->foe = MHITYOU;
- mon->target = env.sanctuary_pos;
+ mon->foe = MHITYOU;
+ mon->target = env.sanctuary_pos;
return;
}
@@ -2677,11 +2677,29 @@ void behaviour_event(monsters *mon, mon_event_type event, int src,
break;
}
- mon->foe = src;
- mon->behaviour = BEH_FLEE;
// Assume monsters know where to run from, even if player is
// invisible.
- setTarget = true;
+ mon->behaviour = BEH_FLEE;
+ mon->foe = src;
+ mon->target = src_pos;
+ if (src == MHITYOU)
+ {
+ // Friendly monsters don't become hostile if you read a
+ // scroll of fear, but enslaved ones will.
+ // Send friendlies off to a random target so they don't cling
+ // to you in fear.
+ if (mons_friendly(mon))
+ {
+ breakCharm = true;
+ mon->foe = MHITNOT;
+ _set_random_target(mon);
+ }
+ else
+ setTarget = true;
+ }
+ else if (mons_friendly(mon))
+ mon->foe = MHITYOU;
+
if (see_grid(mon->pos()))
learned_something_new(TUT_FLEEING_MONSTER);
break;
@@ -2697,7 +2715,15 @@ void behaviour_event(monsters *mon, mon_event_type event, int src,
// Just set behaviour... foe doesn't change.
if (!mons_is_cornered(mon))
- simple_monster_message(mon, " turns to fight!");
+ {
+ if (mons_friendly(mon))
+ {
+ mon->foe = MHITYOU;
+ simple_monster_message(mon, " returns to your side!");
+ }
+ else
+ simple_monster_message(mon, " turns to fight!");
+ }
mon->behaviour = BEH_CORNERED;
break;
@@ -2714,9 +2740,7 @@ void behaviour_event(monsters *mon, mon_event_type event, int src,
mon->attitude = ATT_HOSTILE;
}
else if (src != MHITNOT)
- {
mon->target = menv[src].pos();
- }
}
// Now, break charms if appropriate.
@@ -4252,7 +4276,8 @@ static void _handle_behaviour(monsters *mon)
if (isFriendly)
{
// Special-cased below so that it will flee *towards* you.
- mon->target = you.pos();
+ if (mon->foe == MHITYOU)
+ mon->target = you.pos();
}
else if (mons_wall_shielded(mon) && _find_wall_target(mon))
; // Wall target found.