summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/viewmap.cc
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2013-07-14 22:27:13 +0200
committerAdam Borowski <kilobyte@angband.pl>2013-07-15 01:55:52 +0200
commitc50a79afaf218f9c9ea27920dbc5fc0356d7c54e (patch)
treee2a6e1801f7fd252d5821f67ee5da955d2e968f6 /crawl-ref/source/viewmap.cc
parent620b36ed2e9e745560c0b93f23b272ac2bb0098f (diff)
downloadcrawl-ref-c50a79afaf218f9c9ea27920dbc5fc0356d7c54e.tar.gz
crawl-ref-c50a79afaf218f9c9ea27920dbc5fc0356d7c54e.zip
Allow map forgotten via X^F to be restored with X^U.
Diffstat (limited to 'crawl-ref/source/viewmap.cc')
-rw-r--r--crawl-ref/source/viewmap.cc32
1 files changed, 30 insertions, 2 deletions
diff --git a/crawl-ref/source/viewmap.cc b/crawl-ref/source/viewmap.cc
index 2bf694590b..eaf3cfc65a 100644
--- a/crawl-ref/source/viewmap.cc
+++ b/crawl-ref/source/viewmap.cc
@@ -698,6 +698,21 @@ static level_pos _stair_dest(const coord_def& p, command_type dir)
return sinf->destination;
}
+static void _unforget_map()
+{
+ ASSERT(env.map_forgotten.get());
+ MapKnowledge &old(*env.map_forgotten.get());
+
+ for (rectangle_iterator ri(0); ri; ++ri)
+ if (!env.map_knowledge(*ri).known()
+ && (!env.map_knowledge(*ri).mapped() || old(*ri).known()))
+ {
+ // Don't overwrite known squares, nor magic-mapped with
+ // magic-mapped data -- what was forgotten is less up to date.
+ env.map_knowledge(*ri) = old(*ri);
+ }
+}
+
// show_map() now centers the known map along x or y. This prevents
// the player from getting "artificial" location clues by using the
// map to see how close to the end they are. They'll need to explore
@@ -955,13 +970,26 @@ bool show_map(level_pos &lpos,
break;
case CMD_MAP_FORGET:
- if (yesno("Really forget level map?", true, 'n'))
{
+ // Merge it with already forgotten data first.
+ if (env.map_forgotten.get())
+ _unforget_map();
+ MapKnowledge *old = new MapKnowledge(env.map_knowledge);
forget_map();
+ env.map_forgotten.reset(old);
mpr("Level map cleared.");
}
+ break;
+
+ case CMD_MAP_UNFORGET:
+ if (env.map_forgotten.get())
+ {
+ _unforget_map();
+ env.map_forgotten.reset();
+ mpr("Remembered map restored.");
+ }
else
- canned_msg(MSG_OK);
+ mpr("No remembered map.");
break;
case CMD_MAP_ADD_WAYPOINT: