summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-16 22:34:12 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-16 22:52:01 +0100
commitaf5c601305bfdb1a1327156e9c8f1980f83d34d5 (patch)
tree50fe9e0337662897c29374900dee0c07129b63c3 /crawl-ref/source
parent5c93440b007ff9e1948fab8761517fccf1046fc9 (diff)
downloadcrawl-ref-af5c601305bfdb1a1327156e9c8f1980f83d34d5.tar.gz
crawl-ref-af5c601305bfdb1a1327156e9c8f1980f83d34d5.zip
Expose invisible monsters in opaque clouds.
Implements FR 2898414.
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/directn.cc24
-rw-r--r--crawl-ref/source/show.cc16
2 files changed, 34 insertions, 6 deletions
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index fc9df131e7..a609856b88 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -311,6 +311,21 @@ static bool _mon_submerged_in_water(const monsters *mon)
&& !mons_flies(mon));
}
+static bool _mon_exposed_in_cloud(const monsters *mon)
+{
+ if (!mon)
+ return (false);
+
+ return (!mon->visible_to(&you)
+ && is_opaque_cloud(env.cgrid(mon->pos()))
+ && !mons_is_insubstantial(mon->type));
+}
+
+static bool _mon_exposed(const monsters* mon)
+{
+ return (_mon_submerged_in_water(mon) || _mon_exposed_in_cloud(mon));
+}
+
static bool _is_target_in_range(const coord_def& where, int range)
{
// Range doesn't matter.
@@ -1391,7 +1406,7 @@ void direction(dist& moves, targetting_type restricts,
if (!moves.isEndpoint)
{
const monsters* m = monster_at(moves.target);
- if (m && _mon_submerged_in_water(m))
+ if (m && _mon_exposed(m))
moves.isEndpoint = true;
}
moves.isValid = true;
@@ -1931,7 +1946,7 @@ static bool _mons_is_valid_target(const monsters *mon, int mode, int range)
// Also, don't target submerged monsters if there are other
// targets in sight. (This might be too restrictive.)
return (mode != TARG_FRIEND
- && _mon_submerged_in_water(mon)
+ && _mon_exposed(mon)
&& i_feel_safe(false, false, true, range));
}
@@ -3345,6 +3360,11 @@ static void _describe_cell(const coord_def& where, bool in_range)
mpr("There is a strange disturbance in the water here.",
MSGCH_EXAMINE_FILTER);
}
+ else if (_mon_exposed_in_cloud(mon))
+ {
+ mpr("There is a strange disturbance in the cloud here.",
+ MSGCH_EXAMINE_FILTER);
+ }
#if DEBUG_DIAGNOSTICS
if (!mon->visible_to(&you))
diff --git a/crawl-ref/source/show.cc b/crawl-ref/source/show.cc
index ada2ffa120..dbcd0c85c4 100644
--- a/crawl-ref/source/show.cc
+++ b/crawl-ref/source/show.cc
@@ -258,14 +258,15 @@ void show_def::_update_monster(const monsters* mons)
{
_check_monster_pos(mons);
- const coord_def e = grid2show(mons->pos());
+ const coord_def pos = mons->pos();
+ const coord_def e = grid2show(pos);
if (!mons->visible_to(&you))
{
// ripple effect?
- if (grd(mons->pos()) == DNGN_SHALLOW_WATER
+ if (grd(pos) == DNGN_SHALLOW_WATER
&& !mons_flies(mons)
- && env.cgrid(mons->pos()) == EMPTY_CLOUD)
+ && env.cgrid(pos) == EMPTY_CLOUD)
{
_set_backup(e);
grid(e).cls = SH_INVIS_EXPOSED;
@@ -273,7 +274,7 @@ void show_def::_update_monster(const monsters* mons)
// Translates between colours used for shallow and deep water,
// if not using the normal LIGHTCYAN / BLUE. The ripple uses
// the deep water colour.
- unsigned short base_colour = env.grid_colours(mons->pos());
+ unsigned short base_colour = env.grid_colours(pos);
static const unsigned short ripple_table[] =
{BLUE, // BLACK => BLUE (default)
@@ -295,6 +296,13 @@ void show_def::_update_monster(const monsters* mons)
grid(e).colour = ripple_table[base_colour & 0x0f];
}
+ else if (is_opaque_cloud(env.cgrid(pos)) &&
+ !mons->submerged() &&
+ !mons_is_insubstantial(mons->type))
+ {
+ grid(e).cls = SH_INVIS_EXPOSED;
+ grid(e).colour = get_cloud_colour(env.cgrid(pos));
+ }
return;
}