summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dactions.cc
diff options
context:
space:
mode:
authorDracoOmega <draco_omega@live.com>2013-07-29 16:32:30 -0230
committerDracoOmega <draco_omega@live.com>2013-07-30 15:08:16 -0230
commit20a8841cf3646f604d16340aa879a271bd81c914 (patch)
tree383cc202346b95620ce797b771d53106c6ea571b /crawl-ref/source/dactions.cc
parentfd23a319141c1d6c4da4375ef1ad913ab0119c79 (diff)
downloadcrawl-ref-20a8841cf3646f604d16340aa879a271bd81c914.tar.gz
crawl-ref-20a8841cf3646f604d16340aa879a271bd81c914.zip
Change how Spirit Wolves work somewhat
While the very low per-turn chance of the wolves using their spirit howl was intended to mean that a majority of packs would not use it at all before being killed, in practice the randomness involved meant that sometimes a player could be afflicted by the status several encounters in a row. Worse, for a player with good defenses, the wolf attacks presented little danger, but still took a very long time to stop. In general, this could lead to them being an irritating encounter that nonetheless presented little danger. This commit is aimed at trying to address this. Spirit howl now lasts less time, but the spawning of packs within it happens somewhat more rapidly. Spirit wolves themselves hit noticably harder and are a little more accurate. The wolves attracted by spirit howl no longer count as summons, but are finite in number across all uses of spirit howl (ie: they represent the rest of the spirit pack, attracted from outside the waking world). This has a couple ramifications: there is now some reward for actually fighting them instead of running away until they time out (yet one that cannot be farmed) and (significantly) there is an upper limit on how many times the player has to deal with this effect, instead of potentially having to deal with it over and over and over again as one clears Forest. Wolves within sight of the player no longer disappear when the howl ends, though those out of view do (and are thus eligable to be called again by a subsequent spirit howl), providing another tangible strategic advantage to killing them instead of running away until they stop showing up. Finally, there is also a lengthly cooldown after the effect ends before any wolf can use it again (so there is no longer any chance for one to howl the moment the first one expires) Overall, the aim is that spirit howl occur less times in total, take up less of the player's overall time, be a little less annoying in some ways, and also provide more actual threat when it occurs. This commit also fixes multiple bugs with the original implementation: non-hostile wolves will no longer howl, placement will more properly respect LoS instead of sometimes spawning them immediately in view, and some pathfinding bugs that could cause wolves to not properly pursue the player have been fixed.
Diffstat (limited to 'crawl-ref/source/dactions.cc')
-rw-r--r--crawl-ref/source/dactions.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/crawl-ref/source/dactions.cc b/crawl-ref/source/dactions.cc
index a4359a826d..eb6428b161 100644
--- a/crawl-ref/source/dactions.cc
+++ b/crawl-ref/source/dactions.cc
@@ -119,6 +119,10 @@ bool mons_matches_daction(const monster* mon, daction_type act)
&& (mon->props.exists("kirke_band")
|| mon->props.exists(ORIG_MONSTER_KEY)));
+ case DACT_END_SPIRIT_HOWL:
+ return (mon->type == MONS_SPIRIT_WOLF
+ && mon->props.exists("howl_called"));
+
default:
return false;
}
@@ -220,6 +224,15 @@ void apply_daction_to_mons(monster* mon, daction_type act, bool local)
_daction_hog_to_human(mon);
break;
+ case DACT_END_SPIRIT_HOWL:
+ if (!you.can_see(mon))
+ {
+ // This wolf is available to be called again later
+ you.props["spirit_wolf_total"].get_int()++;
+ monster_die(mon, KILL_RESET, NON_MONSTER);
+ }
+ break;
+
// The other dactions do not affect monsters directly.
default:
break;
@@ -248,6 +261,7 @@ static void _apply_daction(daction_type act)
case DACT_HOLY_PETS_GO_NEUTRAL:
case DACT_PIKEL_SLAVES:
case DACT_KIRKE_HOGS:
+ case DACT_END_SPIRIT_HOWL:
for (monster_iterator mi; mi; ++mi)
{
if (mons_matches_daction(*mi, act))