From 1164be44d09a7f8ece0fbfb49c37565ca812da00 Mon Sep 17 00:00:00 2001 From: j-p-e-g Date: Sat, 28 Mar 2009 21:14:58 +0000 Subject: 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 --- crawl-ref/source/monstuff.cc | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'crawl-ref/source/monstuff.cc') 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. -- cgit v1.2.3-54-g00ecf