summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/docs/develop/level_design.txt4
-rw-r--r--crawl-ref/docs/options_guide.txt10
-rw-r--r--crawl-ref/source/chardump.cc16
-rw-r--r--crawl-ref/source/dat/clua/ziggurat.lua1
-rw-r--r--crawl-ref/source/dat/crypt.des4
-rw-r--r--crawl-ref/source/dat/hells.des2
-rw-r--r--crawl-ref/source/dat/hive.des1
-rw-r--r--crawl-ref/source/dat/lair.des2
-rw-r--r--crawl-ref/source/dat/levdes.vim2
-rw-r--r--crawl-ref/source/dat/shoals.des4
-rw-r--r--crawl-ref/source/dat/vaults.des4
-rw-r--r--crawl-ref/source/dat/zot.des9
-rw-r--r--crawl-ref/source/dungeon.cc126
-rw-r--r--crawl-ref/source/dungeon.h4
-rw-r--r--crawl-ref/source/place.cc13
-rw-r--r--crawl-ref/source/place.h2
-rw-r--r--crawl-ref/source/player.h2
-rw-r--r--crawl-ref/source/tags.cc8
-rw-r--r--crawl-ref/source/tags.h3
19 files changed, 201 insertions, 16 deletions
diff --git a/crawl-ref/docs/develop/level_design.txt b/crawl-ref/docs/develop/level_design.txt
index 802d9b6624..2a8889c193 100644
--- a/crawl-ref/docs/develop/level_design.txt
+++ b/crawl-ref/docs/develop/level_design.txt
@@ -489,6 +489,10 @@ TAGS: Tags go an a TAGS: line and are space-separated. You can have several
This tag should be used exclusively for the generic (one tile)
entries to portal vaults, like bazaars and labyrinths. Other
portal vaults may be eligible for Trowel, too.
+ * "no_dump": Don't dump out this vault's name in the list of
+ vaults generated during the game. Use this if the vault
+ is predictable (like the Vault:8 and Slime:6 vaults) or
+ are for weird internal uses (like the shoalhut vaults).
LFLAGS: Persistent, changeable per-level flags which affect game behaviour
(FLAGS just controls how the vault is placed); should only be used
diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt
index d992fd7b27..5238314f01 100644
--- a/crawl-ref/docs/options_guide.txt
+++ b/crawl-ref/docs/options_guide.txt
@@ -1782,12 +1782,18 @@ dump_order += monlist,kills
dump_order lines - all lines but the first must use
dump_order +=
- Two optional dump sections are turns_by_place and
- kills_by_place, which add detailed statistics to where turns
+ Two optional dump sections are "turns_by_place" and
+ "kills_by_place", which add detailed statistics to where turns
were spent and monsters were killed. You can add them to your
dump as:
dump_order += turns_by_place, kills_by_place
+ Another optional dump section is "vaults", which will list the
+ locations and names of all the vaults that have been generated
+ in the game. This will only be included in the final dump
+ which happens when you die, quit or win (or in ordinary dumps
+ while in wizard mode).
+
dump_book_spells = true
By default all randart spellbooks in inventory will have all their
spells listed in the dump. If this option is set to true, spells will
diff --git a/crawl-ref/source/chardump.cc b/crawl-ref/source/chardump.cc
index 99bfe4cd94..8e2b12749b 100644
--- a/crawl-ref/source/chardump.cc
+++ b/crawl-ref/source/chardump.cc
@@ -28,6 +28,7 @@
#include "artefact.h"
#include "debug.h"
#include "describe.h"
+#include "dungeon.h"
#include "hiscores.h"
#include "initfile.h"
#include "itemprop.h"
@@ -80,6 +81,7 @@ static void _sdump_newline(dump_params &);
static void _sdump_overview(dump_params &);
static void _sdump_hiscore(dump_params &);
static void _sdump_monster_list(dump_params &);
+static void _sdump_vault_list(dump_params &);
static void _sdump_separator(dump_params &);
#ifdef CLUA_BINDINGS
static void _sdump_lua(dump_params &);
@@ -133,6 +135,7 @@ static dump_section_handler dump_handlers[] = {
{ "overview", _sdump_overview },
{ "hiscore", _sdump_hiscore },
{ "monlist", _sdump_monster_list },
+ { "vaults", _sdump_vault_list },
// Conveniences for the .crawlrc artist.
{ "", _sdump_newline },
@@ -1142,6 +1145,19 @@ static void _sdump_monster_list(dump_params &par)
par.text += "\n\n";
}
+static void _sdump_vault_list(dump_params &par)
+{
+ if (par.full_id || par.se
+#ifdef WIZARD
+ || you.wizard
+#endif
+ )
+ {
+ par.text += "Vault maps used:\n\n";
+ par.text += dump_vault_maps();
+ }
+}
+
static void _sdump_mutations(dump_params &par)
{
std::string &text(par.text);
diff --git a/crawl-ref/source/dat/clua/ziggurat.lua b/crawl-ref/source/dat/clua/ziggurat.lua
index 74e7029b3e..ba35595d70 100644
--- a/crawl-ref/source/dat/clua/ziggurat.lua
+++ b/crawl-ref/source/dat/clua/ziggurat.lua
@@ -119,6 +119,7 @@ end
function ziggurat_level(e)
e.tags("ziggurat")
e.tags("allow_dup")
+ e.tags("no_dump")
e.orient("encompass")
if crawl.game_started() then
diff --git a/crawl-ref/source/dat/crypt.des b/crawl-ref/source/dat/crypt.des
index 7c883eb520..bd0fb16f45 100644
--- a/crawl-ref/source/dat/crypt.des
+++ b/crawl-ref/source/dat/crypt.des
@@ -784,6 +784,7 @@ PLACE: Tomb:1
BFLAGS: no_tele_control
ORIENT: encompass
+TAGS: no_dump
#
SHUFFLE: ([{, AB), ]}, FIJKL/fijkl, _-
SUBST: A=|*, B=|*
@@ -885,6 +886,7 @@ NAME: tomb_2
PLACE: Tomb:2
# Can be rotated!
ORIENT: encompass
+TAGS: no_dump
#
NSUBST: A = [ / '
SHUFFLE: Ww/Yy/Zz, Uu/Vv, Qq/Rr/Ss
@@ -992,7 +994,7 @@ ENDMAP
NAME: tomb_3
PLACE: Tomb:3
ORIENT: encompass
-TAGS: no_rotate
+TAGS: no_rotate no_dump
#
SUBST: ' : " $ ':80
SUBST: ' = " $
diff --git a/crawl-ref/source/dat/hells.des b/crawl-ref/source/dat/hells.des
index 6122bc4027..2506875d95 100644
--- a/crawl-ref/source/dat/hells.des
+++ b/crawl-ref/source/dat/hells.des
@@ -317,7 +317,7 @@ ENDMAP
NAME: vestibule_of_hell
PLACE: Hell
ORIENT: encompass
-TAGS: no_rotate
+TAGS: no_rotate no_dump
MARKER: D=feat:enter_dis
MARKER: G=feat:enter_gehenna
MARKER: C=feat:enter_cocytus
diff --git a/crawl-ref/source/dat/hive.des b/crawl-ref/source/dat/hive.des
index 73a175718a..dea4ab62ae 100644
--- a/crawl-ref/source/dat/hive.des
+++ b/crawl-ref/source/dat/hive.des
@@ -476,6 +476,7 @@ ENDMAP
NAME: beehive
PLACE: Hive:2
ORIENT: encompass
+TAGS: no_dump
MONS: queen bee, killer bee, killer bee larva, plant, yellow wasp
MONS: random, random
KITEM: R = w:2 honeycomb / w:1 royal jelly
diff --git a/crawl-ref/source/dat/lair.des b/crawl-ref/source/dat/lair.des
index 3b921d8780..cce7bc7266 100644
--- a/crawl-ref/source/dat/lair.des
+++ b/crawl-ref/source/dat/lair.des
@@ -716,7 +716,7 @@ ENDMAP
NAME: slime_pit
PLACE: Slime:6
ORIENT: encompass
-TAGS: no_rotate
+TAGS: no_rotate no_dump
MONS: the royal jelly
MONS: acid blob
MONS: great orb of eyes / nothing
diff --git a/crawl-ref/source/dat/levdes.vim b/crawl-ref/source/dat/levdes.vim
index b46c67d2b7..465d23f946 100644
--- a/crawl-ref/source/dat/levdes.vim
+++ b/crawl-ref/source/dat/levdes.vim
@@ -55,7 +55,7 @@ syn keyword desDeclarator NAME: ORIENT: DEPTH: PLACE: MONS: FLAGS: default-depth
syn keyword desOrientation encompass north south east west northeast northwest southeast southwest float
syn keyword desOrientation no_hmirror no_vmirror no_rotate
syn keyword desOrientation entry pan lab bazaar allow_dup dummy mini_float minotaur
-syn keyword desOrientation no_pool_fixup no_wall_fixup no_monster_gen generate_awake no_item_gen no_tele_control not_mappable no_magic_map no_secret_doors generate_loot
+syn keyword desOrientation no_pool_fixup no_wall_fixup no_monster_gen generate_awake no_item_gen no_tele_control not_mappable no_magic_map no_secret_doors generate_loot no_dump
syn keyword desOrientation Temple Orc Elf Lair Swamp Shoal Slime Snake Hive Vault Blade Crypt Tomb Hell Dis Geh Coc Tar
syn keyword desOrientation D: contained
diff --git a/crawl-ref/source/dat/shoals.des b/crawl-ref/source/dat/shoals.des
index 8928e8009d..4983347ecd 100644
--- a/crawl-ref/source/dat/shoals.des
+++ b/crawl-ref/source/dat/shoals.des
@@ -238,7 +238,7 @@ ENDMAP
#
# Shoal:$ is hand-hacked to force lots of minivaults.
NAME: shoalhut_rune
-TAGS: shoal_rune water_ok
+TAGS: shoal_rune water_ok no_dump
SHUFFLE: ABCD
SUBST: A:x, B:x, C:x=, D=+
LROCKTILE: wall_vines
@@ -258,7 +258,7 @@ ENDMAP
# Shoal:$ is hand-hacked to force lots of minivaults.
NAME: shoalhut_norune
DEPTH: Shoal:$
-TAGS: allow_dup water_ok shoal
+TAGS: allow_dup water_ok shoal no_dump
SHUFFLE: ABCD
SUBST: A:x, B:x, C:x=, D=+
MAP
diff --git a/crawl-ref/source/dat/vaults.des b/crawl-ref/source/dat/vaults.des
index 660fcd70bf..a037fc0d31 100644
--- a/crawl-ref/source/dat/vaults.des
+++ b/crawl-ref/source/dat/vaults.des
@@ -281,7 +281,7 @@ ENDMAP
NAME: vaults_vault
PLACE: Vault:8
ORIENT: encompass
-TAGS: no_rotate
+TAGS: no_rotate no_dump
#
# the rune's spot, occassionally put nasty on the rune
NSUBST: O = O / o
@@ -408,7 +408,7 @@ ENDMAP
NAME: hall_of_blades
PLACE: Blade
ORIENT: north
-TAGS: no_rotate
+TAGS: no_rotate no_dump
MONS: dancing weapon
SHUFFLE: cv
MAP
diff --git a/crawl-ref/source/dat/zot.des b/crawl-ref/source/dat/zot.des
index 8a8329cc40..a416dd2543 100644
--- a/crawl-ref/source/dat/zot.des
+++ b/crawl-ref/source/dat/zot.des
@@ -330,6 +330,7 @@ ENDMAP
NAME: hall_of_Zot
PLACE: Zot:5
ORIENT: north
+TAGS: no_dump
LFLAGS: no_tele_control
MARKER: Z = lua:item_pickup_change_flags { \
level_flags="!no_tele_control", item="Orb of Zot" \
@@ -410,7 +411,7 @@ ENDMAP
NAME: hall_of_Zot_1
PLACE: Zot:1
-TAGS: transparent
+TAGS: transparent no_dump
ORIENT: float
LFLOORCOL: lightgrey
LROCKCOL: lightgrey
@@ -422,7 +423,7 @@ ENDMAP
NAME: hall_of_Zot_2
PLACE: Zot:2
-TAGS: transparent
+TAGS: transparent no_dump
ORIENT: float
LFLOORCOL: lightgrey
LROCKCOL: blue
@@ -434,7 +435,7 @@ ENDMAP
NAME: hall_of_Zot_3
PLACE: Zot:3
-TAGS: transparent
+TAGS: transparent no_dump
ORIENT: float
LFLOORCOL: blue
LROCKCOL: lightblue
@@ -446,7 +447,7 @@ ENDMAP
NAME: hall_of_Zot_4
PLACE: Zot:4
-TAGS: transparent
+TAGS: transparent no_dump
ORIENT: float
LFLOORCOL: lightblue
LROCKCOL: magenta
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 4e3d68f95d..528fe317f4 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -56,6 +56,9 @@
#include "cio.h" // for cancelable_get_line()
#endif
+#define YOU_DUNGEON_VAULTS_KEY "you_dungeon_vaults_key"
+#define YOU_PORTAL_VAULT_MAPS_KEY "you_portal_vault_maps_key"
+
spec_room lua_special_room_spec;
int lua_special_room_level;
@@ -235,6 +238,9 @@ static bool use_random_maps = true;
static bool dgn_check_connectivity = false;
static int dgn_zones = 0;
+static CrawlHashTable _you_vault_list;
+static std::string _portal_vault_map_name;
+
struct coloured_feature
{
dungeon_feature_type feature;
@@ -311,10 +317,37 @@ bool builder(int level_number, int level_type)
if (dgn_Build_Method.size() > 0 && dgn_Build_Method[0] == ' ')
dgn_Build_Method = dgn_Build_Method.substr(1);
+ // Save information in the level's properties hash table
+ // so we can inlcude it in crash reports.
env.properties[BUILD_METHOD_KEY] = dgn_Build_Method;
env.properties[LAYOUT_TYPE_KEY] = dgn_Layout_Type;
env.properties[LEVEL_ID_KEY] = level_id::current().describe();
+ // Save information in the player's properties has table so
+ // we can include it in the character dump.
+ if (!_you_vault_list.empty())
+ {
+ const std::string lev = level_id::current().describe();
+ CrawlHashTable &all_vaults =
+ you.props[YOU_DUNGEON_VAULTS_KEY].get_table();
+
+ CrawlHashTable &this_level = all_vaults[lev].get_table();
+ this_level = _you_vault_list;
+ }
+ else if (!_portal_vault_map_name.empty())
+ {
+ CrawlVector &vault_maps =
+ you.props[YOU_PORTAL_VAULT_MAPS_KEY].get_vector();
+ vault_maps.push_back(_portal_vault_map_name);
+ }
+
+ if (you.level_type == LEVEL_PORTAL_VAULT)
+ {
+ CrawlVector &vault_names =
+ you.props[YOU_PORTAL_VAULT_NAMES_KEY].get_vector();
+ vault_names.push_back(you.level_type_name);
+ }
+
dgn_Layout_Type.clear();
Level_Unique_Maps.clear();
Level_Unique_Tags.clear();
@@ -900,6 +933,8 @@ void dgn_reset_level()
Level_Unique_Maps.clear();
Level_Unique_Tags.clear();
+ _portal_vault_map_name.clear();
+ _you_vault_list.clear();
dgn_Build_Method.clear();
dgn_Layout_Type.clear();
level_clear_vault_memory();
@@ -4317,7 +4352,9 @@ static bool _build_vaults(int level_number, const map_def *vault,
// Must do this only after target_connections is finalised, or the vault
// exits will not be correctly set.
Level_Vaults.push_back(place);
- remember_vault_placement(LEVEL_VAULTS_KEY, place);
+ remember_vault_placement(vault->has_tag("extra")
+ ? LEVEL_EXTRAS_KEY: LEVEL_VAULTS_KEY,
+ place);
#ifdef DEBUG_DIAGNOSTICS
if (crawl_state.map_stat_gen)
@@ -8343,6 +8380,9 @@ void vault_placement::draw_at(const coord_def &c)
void remember_vault_placement(std::string key, vault_placement &place)
{
+ // First we store some info on the vault into the level's properties
+ // hash table, so that if there's a crash the crash report can list
+ // them all.
CrawlHashTable &table = env.properties[key].get_table();
std::string name = make_stringf("%s [%d]", place.map.name.c_str(),
@@ -8356,4 +8396,88 @@ void remember_vault_placement(std::string key, vault_placement &place)
place.num_runes, place.rune_subst);
table[name] = place_str;
+
+ // Second we setup some info to be saved in the player's properties
+ // hash table, so the information can be included in the character
+ // dump when the player dies/quits/wins.
+ if (you.level_type == LEVEL_DUNGEON
+ && !place.map.has_tag("layout")
+ && !place.map.has_tag_suffix("dummy")
+ && !place.map.has_tag("no_dump"))
+ {
+ const std::string type = place.map.has_tag("extra")
+ ? "extra" : "normal";
+
+ _you_vault_list[type].get_vector().push_back(place.map.name);
+ }
+ else if (you.level_type == LEVEL_PORTAL_VAULT
+ && place.map.orient == MAP_ENCOMPASS
+ && !place.map.has_tag("no_dump"))
+ {
+ _portal_vault_map_name = place.map.name;
+ }
}
+
+std::string dump_vault_maps()
+{
+ std::string out = "";
+
+ std::vector<level_id> levels = all_dungeon_ids();
+
+ CrawlHashTable &vaults = you.props[YOU_DUNGEON_VAULTS_KEY].get_table();
+ for (unsigned int i = 0; i < levels.size(); i++)
+ {
+ level_id &lid = levels[i];
+ std::string lev = lid.describe();
+
+ if (!vaults.exists(lev))
+ continue;
+
+ out += lid.describe() + ":\n";
+
+ CrawlHashTable &lists = vaults[lev].get_table();
+
+ const char *types[] = {"normal", "extra"};
+ for (int j = 0; j < 2; j++)
+ {
+ if (!lists.exists(types[j]))
+ continue;
+
+ out += " ";
+ out += types[j];
+ out += ": ";
+
+ CrawlVector &vec = lists[types[j]].get_vector();
+
+ for (unsigned int k = 0, size = vec.size(); k < size; k++)
+ {
+ out += vec[k].get_string();
+ if (k < (size - 1))
+ out += ", ";
+ }
+
+ out += "\n";
+ }
+ out += "\n";
+ }
+ CrawlVector &portals = you.props[YOU_PORTAL_VAULT_MAPS_KEY].get_vector();
+
+ if (!portals.empty())
+ {
+ out += "\n";
+
+ out += "Portal vault maps: ";
+
+ for (unsigned int i = 0, size = portals.size(); i < size; i++)
+ {
+ out += portals[i].get_string();
+
+ if (i < (size - 1))
+ out += ", ";
+ }
+
+ out += "\n\n";
+ }
+ return (out);
+}
+
diff --git a/crawl-ref/source/dungeon.h b/crawl-ref/source/dungeon.h
index 75f5d641c5..f6932d1cb6 100644
--- a/crawl-ref/source/dungeon.h
+++ b/crawl-ref/source/dungeon.h
@@ -27,6 +27,8 @@
#define LEVEL_EXTRAS_KEY "level_extras_key"
#define LEVEL_ID_KEY "level_id_key"
+#define YOU_PORTAL_VAULT_NAMES_KEY "you_portal_vault_names_key"
+
enum portal_type
{
PORTAL_NONE = 0,
@@ -423,4 +425,6 @@ inline int count_neighbours(const coord_def& p, dungeon_feature_type feat)
}
void remember_vault_placement(std::string key, vault_placement &place);
+
+std::string dump_vault_maps();
#endif
diff --git a/crawl-ref/source/place.cc b/crawl-ref/source/place.cc
index 9322716835..2064fb0dfb 100644
--- a/crawl-ref/source/place.cc
+++ b/crawl-ref/source/place.cc
@@ -198,3 +198,16 @@ bool level_type_is_stash_trackable(level_area_type type)
{
return (type != LEVEL_ABYSS && type != LEVEL_LABYRINTH);
}
+
+std::vector<level_id> all_dungeon_ids()
+{
+ std::vector<level_id> out;
+ for (int i = 0; i < NUM_BRANCHES; i++)
+ {
+ const Branch &branch = branches[i];
+
+ for (int depth = 1; depth <= branch.depth; depth++)
+ out.push_back(level_id(branch.id, depth));
+ }
+ return (out);
+}
diff --git a/crawl-ref/source/place.h b/crawl-ref/source/place.h
index 47dd89f3c4..092a737b6e 100644
--- a/crawl-ref/source/place.h
+++ b/crawl-ref/source/place.h
@@ -48,4 +48,6 @@ bool level_type_exits_down(level_area_type type);
bool level_type_allows_followers(level_area_type type);
bool level_type_is_stash_trackable(level_area_type type);
+std::vector<level_id> all_dungeon_ids();
+
#endif
diff --git a/crawl-ref/source/player.h b/crawl-ref/source/player.h
index e8250fc3ac..bd07a101c8 100644
--- a/crawl-ref/source/player.h
+++ b/crawl-ref/source/player.h
@@ -278,6 +278,8 @@ public:
int escaped_death_cause;
std::string escaped_death_aux;
+ CrawlHashTable props;
+
protected:
FixedVector<PlaceInfo, NUM_BRANCHES> branch_info;
FixedVector<PlaceInfo, NUM_LEVEL_AREA_TYPES - 1> non_branch_info;
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 91fe0c0643..ab02149019 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -1020,6 +1020,8 @@ static void tag_construct_you(writer &th)
std::string revision = "Git:";
revision += Version::Long();
marshallString(th, revision);
+
+ you.props.write(th);
}
static void tag_construct_you_items(writer &th)
@@ -1468,6 +1470,12 @@ static void tag_read_you(reader &th, char minorVersion)
std::string rev_str = unmarshallString(th);
UNUSED(rev_str);
}
+
+ if (minorVersion >= TAG_MINOR_YOU_PROP)
+ {
+ you.props.clear();
+ you.props.read(th);
+ }
}
static void tag_read_you_items(reader &th, char minorVersion)
diff --git a/crawl-ref/source/tags.h b/crawl-ref/source/tags.h
index 4f0fcf4116..3bb38318fd 100644
--- a/crawl-ref/source/tags.h
+++ b/crawl-ref/source/tags.h
@@ -57,7 +57,8 @@ enum tag_minor_version
TAG_MINOR_TRANS = 7, // Keep track of cancellable transformations.
TAG_MINOR_GITREV = 8, // Removed SVN revision and added Git revision.
TAG_MINOR_DSTRAITS = 9, // Pre-calculate demonspawn mutations
- TAG_MINOR_VERSION = 9 // Current version. (Keep equal to max.)
+ TAG_MINOR_YOU_PROP = 10, // Player class has CrawlHashTable
+ TAG_MINOR_VERSION = 10 // Current version. (Keep equal to max.)
};