summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/decks.cc38
-rw-r--r--crawl-ref/source/terrain.cc47
2 files changed, 54 insertions, 31 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index 34cf168221..1f525a83e9 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -2145,13 +2145,16 @@ static void _create_pond(const coord_def& center, int radius, bool allow_deep)
const coord_def p = *ri;
if ( p != you.pos() && coinflip() )
{
- destroy_trap(p);
if ( grd(p) == DNGN_FLOOR )
{
+ dungeon_feature_type feat;
+
if ( allow_deep )
- grd(p) = coinflip() ? DNGN_SHALLOW_WATER : DNGN_DEEP_WATER;
+ feat = coinflip() ? DNGN_SHALLOW_WATER : DNGN_DEEP_WATER;
else
- grd(p) = DNGN_SHALLOW_WATER;
+ feat = DNGN_SHALLOW_WATER;
+
+ dungeon_terrain_changed(p, feat);
}
}
}
@@ -2170,33 +2173,17 @@ static void _deepen_water(const coord_def& center, int radius)
p != you.pos() &&
random2(8) < 1 + count_neighbours(p.x, p.y, DNGN_DEEP_WATER) )
{
- grd(p) = DNGN_DEEP_WATER;
+ dungeon_terrain_changed(p, DNGN_DEEP_WATER);
}
if (grd(p) == DNGN_FLOOR &&
random2(3) < random2(count_neighbours(p.x,p.y,DNGN_DEEP_WATER) +
count_neighbours(p.x,p.y,DNGN_SHALLOW_WATER)))
{
- grd(p) = DNGN_SHALLOW_WATER;
+ dungeon_terrain_changed(p, DNGN_SHALLOW_WATER);
}
}
}
-static void _pond_creature_effect( const coord_def& center, int radius )
-{
- radius_iterator ri(center, radius, false);
- bool you_affected = false;
- for ( ; ri; ++ri )
- {
- const coord_def p = *ri;
- if ( p == you.pos() )
- you_affected = true;
- else if ( mgrd(p) != NON_MONSTER )
- mons_check_pool( &menv[mgrd(p)], KILL_YOU );
- }
- if ( you_affected )
- move_player_to_grid( you.x_pos, you.y_pos, false, true, true );
-}
-
static void _water_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
@@ -2204,7 +2191,6 @@ static void _water_card(int power, deck_rarity_type rarity)
{
mpr("You create a pond!");
_create_pond(you.pos(), 4, false);
- _pond_creature_effect(you.pos(), 4);
}
else if ( power_level == 1 )
{
@@ -2212,7 +2198,6 @@ static void _water_card(int power, deck_rarity_type rarity)
_create_pond(you.pos(), 6, true);
for ( int i = 0; i < 2; ++i )
_deepen_water(you.pos(), 6);
- _pond_creature_effect(you.pos(), 5);
}
else
{
@@ -2228,14 +2213,9 @@ static void _water_card(int power, deck_rarity_type rarity)
dungeon_feature_type new_feature = DNGN_SHALLOW_WATER;
if ( p != you.pos() && coinflip() )
new_feature = DNGN_DEEP_WATER;
- grd(p) = new_feature;
- // In the future we might want to place all the water first,
- // if monsters can scramble out.
- if ( mgrd(p) != NON_MONSTER )
- mons_check_pool( &menv[mgrd(p)], KILL_YOU );
+ dungeon_terrain_changed(p, new_feature);
}
}
- move_player_to_grid( you.x_pos, you.y_pos, false, true, true );
}
}
diff --git a/crawl-ref/source/terrain.cc b/crawl-ref/source/terrain.cc
index ec4cc04a53..c1cb3097cf 100644
--- a/crawl-ref/source/terrain.cc
+++ b/crawl-ref/source/terrain.cc
@@ -32,6 +32,7 @@
#include "spells3.h"
#include "stuff.h"
#include "transfor.h"
+#include "traps.h"
#include "view.h"
bool grid_is_wall(dungeon_feature_type grid)
@@ -429,13 +430,45 @@ static void _dgn_check_terrain_monsters(const coord_def &pos)
if (mindex != NON_MONSTER)
{
monsters *mons = &menv[mindex];
+
+ if (mons->has_ench(ENCH_SUBMERGED)
+ && !monster_can_submerge(mons, grd(pos))
+ && pos != you.pos())
+ {
+ mons->del_ench(ENCH_SUBMERGED);
+ }
+
if (grid_is_solid(grd(pos)))
monster_teleport(mons, true, false);
else
mons_check_pool(mons, KILL_MISC, -1);
}
- set_terrain_changed(pos.x, pos.y);
+}
+
+static void _dgn_check_terrain_blood(const coord_def &pos,
+ dungeon_feature_type old_feat,
+ dungeon_feature_type new_feat)
+{
+ if (env.map(pos).property != FPROP_BLOODY)
+ return;
+
+ if (new_feat == DNGN_UNSEEN)
+ {
+ // Caller has already changed the grid, and old_feat is actually
+ // the new feat.
+ if (old_feat != DNGN_FLOOR && !grid_is_solid(old_feat))
+ env.map(pos).property = FPROP_NONE;
+ }
+ else
+ {
+ if (grid_is_solid(old_feat) != grid_is_solid(new_feat)
+ || grid_is_water(new_feat) || grid_destroys_items(new_feat)
+ || is_critical_feature(new_feat))
+ {
+ env.map(pos).property = FPROP_NONE;
+ }
+ }
}
void dungeon_terrain_changed(const coord_def &pos,
@@ -444,6 +477,11 @@ void dungeon_terrain_changed(const coord_def &pos,
bool preserve_features,
bool preserve_items)
{
+ if (grd(pos) == nfeat)
+ return;
+
+ _dgn_check_terrain_blood(pos, grd(pos), nfeat);
+
if (nfeat != DNGN_UNSEEN)
{
if (preserve_features)
@@ -454,9 +492,13 @@ void dungeon_terrain_changed(const coord_def &pos,
env.grid_colours(pos) = BLACK;
if (is_notable_terrain(nfeat) && see_grid(pos))
seen_notable_thing(nfeat, pos.x, pos.y);
+
+ destroy_trap(pos);
}
_dgn_check_terrain_items(pos, preserve_items);
+ _dgn_check_terrain_monsters(pos);
+
if (affect_player && pos == you.pos())
{
if (!grid_is_solid(grd(pos)))
@@ -467,7 +509,8 @@ void dungeon_terrain_changed(const coord_def &pos,
else
you_teleport_now(true, false);
}
- _dgn_check_terrain_monsters(pos);
+
+ set_terrain_changed(pos.x, pos.y);
}
// returns true if we manage to scramble free.