From f436e7d24f238b1a0c08e17ece91b441b437bdc5 Mon Sep 17 00:00:00 2001 From: Matthew Cline Date: Fri, 13 Nov 2009 01:42:25 -0800 Subject: seen_replace_feat(): replace one feat with another Replacement for replace_area_wrapper, and a lua accessor for the function. Returns true if the player saw the feature being changed. --- crawl-ref/source/dungeon.cc | 22 +++++++++++++++++++--- crawl-ref/source/dungeon.h | 4 ++-- crawl-ref/source/l_dgngrd.cc | 11 +++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc index 6eab3cad24..22d4c9735d 100644 --- a/crawl-ref/source/dungeon.cc +++ b/crawl-ref/source/dungeon.cc @@ -5226,11 +5226,26 @@ static void _vault_grid( vault_placement &place, // Currently only used for Slime: branch end // where it will turn the stone walls into clear rock walls // once the royal jelly has been killed. -void replace_area_wrapper(dungeon_feature_type old_feat, - dungeon_feature_type new_feat) +bool seen_replace_feat(dungeon_feature_type old_feat, + dungeon_feature_type new_feat) { ASSERT(old_feat != new_feat); - _replace_area(0, 0, GXM-1, GYM-1, old_feat, new_feat, 0, false); + + coord_def p1(0, 0); + coord_def p2(GXM - 1, GYM - 1); + + bool seen = false; + for (rectangle_iterator ri(p1, p2); ri; ++ri) + { + if (grd(*ri) == old_feat) + { + grd(*ri) = new_feat; + if (you.see_cell(*ri)) + seen = true; + } + } + + return (seen); } static void _replace_area( const coord_def& p1, const coord_def& p2, @@ -5254,6 +5269,7 @@ static void _replace_area( const coord_def& p1, const coord_def& p2, } } + // With apologies to Metallica. bool unforbidden(const coord_def &c, unsigned mask) { diff --git a/crawl-ref/source/dungeon.h b/crawl-ref/source/dungeon.h index c9c236cb9b..793fccc2c8 100644 --- a/crawl-ref/source/dungeon.h +++ b/crawl-ref/source/dungeon.h @@ -354,8 +354,8 @@ void level_welcome_messages(); bool place_specific_trap(const coord_def& where, trap_type spec_type); void place_spec_shop(int level_number, const coord_def& where, int force_s_type, bool representative = false); -void replace_area_wrapper(dungeon_feature_type old_feat, - dungeon_feature_type new_feat); +bool seen_replace_feat(dungeon_feature_type replace, + dungeon_feature_type feature); bool unforbidden(const coord_def &c, unsigned mask); coord_def dgn_find_nearby_stair(dungeon_feature_type stair_to_find, coord_def base_pos, bool find_closest); diff --git a/crawl-ref/source/l_dgngrd.cc b/crawl-ref/source/l_dgngrd.cc index 4f2b62dbfe..90657819cd 100644 --- a/crawl-ref/source/l_dgngrd.cc +++ b/crawl-ref/source/l_dgngrd.cc @@ -11,6 +11,7 @@ #include "coord.h" #include "directn.h" +#include "dungeon.h" #include "env.h" #include "religion.h" #include "terrain.h" @@ -255,6 +256,15 @@ LUAFN(_dgn_is_opaque) return (1); } +LUAFN(dgn_seen_replace_feat) +{ + dungeon_feature_type f1 = _get_lua_feature(ls, 1); + dungeon_feature_type f2 = _get_lua_feature(ls, 2); + + lua_pushboolean(ls, seen_replace_feat(f1, f2)); + return (1); +} + const struct luaL_reg dgn_grid_dlib[] = { { "feature_number", dgn_feature_number }, @@ -263,6 +273,7 @@ const struct luaL_reg dgn_grid_dlib[] = { "feature_desc_at", dgn_feature_desc_at }, { "set_feature_desc_short", dgn_set_feature_desc_short }, { "set_feature_desc_long", dgn_set_feature_desc_long }, +{ "seen_replace_feat", dgn_seen_replace_feat }, { "grid", dgn_grid }, { "is_opaque", _dgn_is_opaque }, -- cgit v1.2.3-54-g00ecf