summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/monstuff.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r--crawl-ref/source/monstuff.cc38
1 files changed, 18 insertions, 20 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 1c3be21281..125739af66 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -4408,32 +4408,30 @@ static bool _mons_check_set_foe(monsters *mon, const coord_def& p,
return (false);
}
-// Choose nearest monster as a foe. (Used for berserking monsters.)
+// Choose random nearest monster as a foe. (Used for berserking monsters.)
void _set_nearest_monster_foe(monsters *mon)
{
const bool friendly = mons_friendly_real(mon);
const bool neutral = mons_neutral(mon);
- std::vector<coord_def> d;
- d.push_back(coord_def(-1,-1));
- d.push_back(coord_def( 0,-1));
- d.push_back(coord_def( 1,-1));
- d.push_back(coord_def(-1, 0));
- d.push_back(coord_def( 1, 0));
- d.push_back(coord_def(-1, 1));
- d.push_back(coord_def( 0, 1));
- d.push_back(coord_def( 1, 1));
-
- // Search the eight possible directions in random order, with increasing
- // distance from the monster.
- std::random_shuffle(d.begin(), d.end(), random2);
for (int k = 1; k <= LOS_RADIUS; ++k)
- for (unsigned int i = 0; i < d.size(); i++)
- {
- const coord_def p = mon->pos() + coord_def(k*d[i].x, k*d[i].y);
- if (_mons_check_set_foe(mon, p, friendly, neutral))
- return;
- }
+ {
+ int count = 0;
+ bool success = false;
+ for (int i = -k; i <= k; ++i)
+ for (int j = -k; j <= k; (abs(i) == k ? j++ : j += 2*k))
+ {
+ const coord_def p = mon->pos() + coord_def(i, j);
+ if (one_chance_in(++count)
+ && _mons_check_set_foe(mon, p, friendly, neutral))
+ {
+ success = true;
+ }
+ }
+
+ if (success)
+ break;
+ }
}
// The default suitable() function for choose_random_nearby_monster().