diff options
Diffstat (limited to 'crawl-ref/source/abyss.cc')
-rw-r--r-- | crawl-ref/source/abyss.cc | 16 |
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; |