Don't wind blast monsters through walls (Naruni, #7434)
authorNeil Moore <neil@s-z.org>
Tue, 29 Oct 2013 02:00:06 +0000 (22:00 -0400)
committerNeil Moore <neil@s-z.org>
Tue, 29 Oct 2013 12:35:20 +0000 (08:35 -0400)
commitf7ffa3a73a640f8d055ae87ed790d8d9621772fe
tree9c787fffe4aca10362cef93d6506f5e284e8caea
parent43d4df31c70399cfb62718df6243ed2a7ca59eab
Don't wind blast monsters through walls (Naruni, #7434)

Consider the following situation, with a monster at m and
a wall at %.

....^%##
....m#!
...*.#
...*.#
..*..#
.@...#

The previous code, on seeing that % was blocked, would look for a new
spot adjacent to % and equidistant from @ (compared to %).  The spot
marked ! satisfies the constraints, despite being disconnected from m,
so the monster could be shoved to ! across a wall.

Now we look for spots adjacent to both m and % (and equidistant from @
compared to %).  That way the monster moves step-by-step without
skipping over any potential walls.  In this case, the spot marked ^
is a candidate.

This should also fix some cases of monsters "bouncing" off walls.  Now
if the blast is at a shallow angle (less than 45 degrees, as in the
example above), the monster will slide along the wall; if the angle
is deeeper, the monster will be stuck in place against the wall.

(cherry picked from commit c31db72ae92c5e4b58c9ab5a88218eb1e549a95b)
crawl-ref/source/evoke.cc