Include new dump section "vaults", which for game-end dumps (or any wizard-mode dumps) will include a list (by place) of all the vaults generated in the game.
The savefile now includes a player-associated CrawlHashTable (you.props), which can be used for storing player information which doesn't need to be accessed efficiently.
VICHU3LGDSE3FMPHG5KFD5CUJBQIINSIL7FDTAOY37SK4UBOBFMQC
X4334ZYEWSNUWWCQ4M5GBHPFMSPC3AY4GRVW3Y2IN74IQLNIP2BAC
4M6ZHDMFUEHLWP67J6CX54IYHUO67SEARX2X3VQFCHB65P2DIF5AC
FI3VHM2VQ6464NMVYMZECJOR6QRAF34DFTY4QMZK6OKLULDPWDLQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
AM7QPHDAWNXHLUEVUHVRHG2RO2DOIEFFU4GV3DCIROW6O5HW7H4AC
KSFNXBKBU4XJLJMHLVG73ZFW5CGN2D7UN32OUFHCXMHFOWF7C6TAC
JROZ5XCAQKPXFV242IO3OACFTD6KC4SNSWIXPI5WO4FQ5APRLC4QC
ASXBSZVXJCWVX5VQSRWXL5BWQ4NA7JLYXP6LWQTRGYW6DC2DZZPQC
7ISXWQPJNJPE23HHB7JLHYXHEW5QTDULNJIFVNSWONUZXWQJ2L7AC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
FDJFPTPB5IT7IFTUXKLIKOODLUC32YH7SPPBIVF4GV5GGTEFTLEAC
EJ4GIPFSSQCQASUMRF4CR2WPUQOTEHFRGLOYEZ7BH6YEMIR6DN4QC
2YSMM7QMFZOPD5NXAD2OAMDJEY5LOZO4NCYBC7UCQVANKINJRNBAC
7Z37EO2GGM2DAS65DWEI5VVPRPXMGH6XHB6IADG3Q6KOITSV25MAC
T2ZYXC5YLXGQUN5R4VRNTQWJDGD3KS3BVS3KAJ4BZ4GXRCQT2SYQC
CPBVQFT7NWEYLYD34D5VYZIEOZ32YADXYTSFMS635YNXX4OFIZVAC
W45PMU4HNPSAMMEBJ4XH4MTHLPVIASZT4FXTBPID5LFXKIMNUBKAC
KCHX2F3JFEWOZT3WMJVZAAQUU2QSZ5Q7RDCD7WUJ7VE65J52JFUQC
KIDHPMZSLUVK3TF4565MH7SJ57C45SORJXR274VJTOULNOTGHQ4AC
JUCA26S3JSQFMZTBL7566ITHCOXXEFTFT7KDOWSUXA5JLZK5QJWAC
H3552BCIAVBLKAYKE4DHFLBLFW5RGRMYBMRRYHYEB5IPIJRUVU5QC
WPEJ7FMV7OGOSO5OBZCW2X26HURT3KTPVYQ4Y6ULJYUOS2Y55VTQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
JLLHKFAADO34CHVDDMKI3UXD6DAL6TWPZ53ZWL6SNAJGZAUADZRQC
THRKXPFHTIZPBVQZXDH7BN63DV3HCCWCB3VBHQFEBJSQTHDDYXLAC
YZL4IWIOMIZ3AF3UQEQUAPLCXT2Y7IBO6HWPDC27RNGAF3OCNWLQC
JYNLSDNQDNOBCHDPQLJP6TNOJQ2IB4V7JHBYLL6UAUCTZ7DUZAWQC
KI7ALE2ELEJRP5PMS76ZGODKZD2PK46NI3QKWBJM22VGC6JUNXJAC
SHQUW7EH2E2SGQ5ONR63MAKN2VGLKQDQ3HIC2Q6D4DFGPGIJXXJQC
XXZGTB5UAFMP2SW2WWUHCTDY5TEM7LZEPAASEXKQLT7BSLBY3OTQC
X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC
TR4NPGNO5QNNRJNVMNSUEO5QLT37HCXXDOBKXCB5XWXRQNAJ5SHAC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
FLKXPXQ7SRFZPJPDM35D5CG6M52WP4SL32QNEZNSHGBNZYTKYGYAC
EHSY6DVGUMI6C67WKET3GDJVLWJWGYBYQONNDK5JVT7BCTHBEZVAC
Z5ORIVPW6DXOP3G37OTMP4CY4JYUYS4PGNJ4BTZQ3L2ZTWU67RWAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
5367JDYN2THJDKXGPP3UJYZFLBOUHCWRPPMBEQCFUALLAHLGAPOAC
IE3INS4WUXZOBVXB5VWRBYPVPXADD2U2W5H3TBTOYNWJ3EGRSGQQC
R6XS2HO5QX2FJUGL5UQQRNETKCMYWTUFPHPPS5SYWK3OQA4UDUQQC
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);
}
// 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);
}
// 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);
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