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