From 6521776b1fc7b68f7cb025397797cd8cad5a32e0 Mon Sep 17 00:00:00 2001 From: Matthew Cline Date: Sun, 8 Nov 2009 23:23:32 -0800 Subject: Bug 2852602: wall stopped beam gets two chances If a wall stopped an item beam, and there was an actor right in front of the wall, then the beam would try to hit the actor with the item, even if the beam had already missed. --- crawl-ref/source/beam.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'crawl-ref/source/beam.cc') diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index cd8d484634..2650e495b6 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -1882,7 +1882,8 @@ coord_def bolt::pos() const return ray.pos(); } -void bolt::hit_wall() +// Returns true if the beam ended due to hitting the wall. +bool bolt::hit_wall() { const dungeon_feature_type feat = grd(pos()); ASSERT( feat_is_solid(feat) ); @@ -1917,7 +1918,7 @@ void bolt::hit_wall() { beam_cancelled = true; finish_beam(); - return; + return (false); } // Well, we warned them. @@ -1954,7 +1955,11 @@ void bolt::hit_wall() target = ray.pos(); } finish_beam(); + + return (true); } + + return (false); } void bolt::affect_cell(bool avoid_self) @@ -1988,7 +1993,10 @@ void bolt::affect_cell(bool avoid_self) // Note that this can change the ray position and the solidity // of the wall. - hit_wall(); + if (hit_wall()) + // Beam ended due to hitting wall, so don't hit the player + // or monster with the regressed beam. + return; } const bool still_wall = (was_solid && old_pos == pos()); -- cgit v1.2.3-54-g00ecf