summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/abyss.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/abyss.cc')
-rw-r--r--crawl-ref/source/abyss.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/crawl-ref/source/abyss.cc b/crawl-ref/source/abyss.cc
index 60b508a33b..cd8d1aa08f 100644
--- a/crawl-ref/source/abyss.cc
+++ b/crawl-ref/source/abyss.cc
@@ -386,6 +386,8 @@ static void abyss_lose_monster(monsters &mons)
mons.reset();
}
+#define LOS_DIAMETER (LOS_RADIUS * 2 + 1)
+
void area_shift(void)
/*******************/
{
@@ -393,6 +395,16 @@ void area_shift(void)
mpr("area_shift().", MSGCH_DIAGNOSTICS);
#endif
+ // Preserve floor props around the player, primarily so that
+ // blood-splatter doesn't appear out of nowhere when doing an
+ // area shift.
+ FixedArray<unsigned short, LOS_DIAMETER, LOS_DIAMETER> fprops;
+ const coord_def los_delta(LOS_RADIUS, LOS_RADIUS);
+ radius_iterator ri(you.pos(), LOS_RADIUS);
+
+ for ( ; ri; ++ri )
+ fprops(you.pos() - *ri + los_delta) = env.map(*ri).property;
+
xom_check_nearness_setup();
for (unsigned int i = 0; i < MAX_MONSTERS; i++)
@@ -479,6 +491,10 @@ void area_shift(void)
xom_check_nearness();
+ radius_iterator ri2(you.pos(), LOS_RADIUS);
+ for ( ; ri2; ++ri2 )
+ env.map(*ri2).property = fprops(you.pos() - *ri2 + los_delta);
+
mgen_data mons;
mons.level_type = LEVEL_ABYSS;
mons.proximity = PROX_AWAY_FROM_PLAYER;