From 300b157c23f4b3a0727a19b3fd89d24e909f5184 Mon Sep 17 00:00:00 2001 From: haranp Date: Sun, 21 Sep 2008 10:49:08 +0000 Subject: Fix 2085598: Nemelex won't be disappointed if there are invisible monsters nearby when drawing from Destruction, even if you can't see them. Xom can now act on creatures you can't see. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6960 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/misc.cc | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'crawl-ref/source/misc.cc') diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc index 6f3fb1b150..5831e431db 100644 --- a/crawl-ref/source/misc.cc +++ b/crawl-ref/source/misc.cc @@ -2320,23 +2320,27 @@ bool mons_is_safe(const struct monsters *mon, bool want_move) return (is_safe); } -// Return all monsters in range (default: LOS) that the player is able to see -// and recognize as being a monster. +// Return all nearby monsters in range (default: LOS) that the player +// is able to recognize as being monsters (i.e. no unknown mimics or +// submerged creatures.) // // want_move (??) Somehow affects what monsters are considered dangerous // just_check Return zero or one monsters only // dangerous_only Return only "dangerous" monsters +// require_visible Require that monsters be visible to the player // range search radius (defaults: LOS) // -void get_playervisible_monsters(std::vector &mons, - bool want_move, - bool just_check, - bool dangerous_only, - int range) +std::vector get_nearby_monsters(bool want_move, + bool just_check, + bool dangerous_only, + bool require_visible, + int range) { if (range == -1) range = LOS_RADIUS; + std::vector mons; + // Sweep every square within range. for ( radius_iterator ri(you.pos(), range); ri; ++ri ) { @@ -2345,20 +2349,21 @@ void get_playervisible_monsters(std::vector &mons, { if (see_grid(*ri)) { - monsters *mon = &env.mons[targ_monst]; + monsters *mon = &menv[targ_monst]; if (mon->alive() - && player_monster_visible(mon) + && (!require_visible || player_monster_visible(mon)) && !mons_is_submerged(mon) && (!mons_is_mimic(mon->type) || mons_is_known_mimic(mon)) && (!dangerous_only || !mons_is_safe(mon, want_move))) { mons.push_back(mon); if (just_check) // stop once you find one - return; + return mons; } } } } + return mons; } bool i_feel_safe(bool announce, bool want_move, bool just_monsters, int range) @@ -2388,8 +2393,8 @@ bool i_feel_safe(bool announce, bool want_move, bool just_monsters, int range) } // Monster check. - std::vector visible; - get_playervisible_monsters(visible, want_move, !announce, true, range); + std::vector visible = + get_nearby_monsters(want_move, !announce, true, true, range); // No monsters found. if (visible.empty()) @@ -2417,13 +2422,10 @@ bool i_feel_safe(bool announce, bool want_move, bool just_monsters, int range) return (false); } -bool there_are_monsters_nearby() +bool there_are_monsters_nearby(bool dangerous_only, bool require_visible) { - // Monster check. - std::vector visible; - get_playervisible_monsters(visible, false, true); - - return (!visible.empty()); + return (!get_nearby_monsters(false, true, + dangerous_only, require_visible).empty()); } static const char *shop_types[] = { -- cgit v1.2.3-54-g00ecf