diff options
-rw-r--r-- | crawl-ref/source/directn.cc | 24 | ||||
-rw-r--r-- | crawl-ref/source/show.cc | 16 |
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; } |