diff options
Diffstat (limited to 'crawl-ref')
-rw-r--r-- | crawl-ref/source/decks.cc | 38 | ||||
-rw-r--r-- | crawl-ref/source/terrain.cc | 47 |
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. |