9inline constexpr const char* kMapNames[] = {
17 "TTC_TREASURE_TROVE_COVE",
18 "STUB_TEST_CS_HEIGHT_AND_DISTANCE",
19 "STUB_TEST_CS_SLIGHT_SLOPES",
23 "BGS_BUBBLEGLOOP_SWAMP",
35 "STUB_TEST_CS_STEEP_SLOPES",
37 "MMM_MAD_MONSTER_MANSION",
43 "CC_WITCH_SWITCH_ROOM",
45 "CC_GOLDFEATHER_ROOM",
53 "MMM_SECRET_CHURCH_ROOM",
57 "MMM_WATERDRAIN_BARREL",
59 "RBB_RUSTY_BUCKET_BAY",
61 "STUB_DEMO_INTRO_ROOM",
71 "RBB_NAVIGATION_ROOM",
76 "STUB_LL_TIPTUPS_CAVE",
83 "STUB_ML_MUMBOS_SKULL",
84 "CCW_SPRING_MUMBOS_SKULL",
85 "CCW_SUMMER_MUMBOS_SKULL",
86 "CCW_AUTUMN_MUMBOS_SKULL",
87 "CCW_WINTER_MUMBOS_SKULL",
88 "STUB_LL_MUMBOS_SKULL",
89 "STUB_FL_MUMBOS_SKULL_NORMAL",
90 "STUB_FL_MUMBOS_SKULL_RAIN_DANCE",
94 "STUB_ML_CRUSHER_SHED",
95 "STUB_ML_GENERATOR_CAVES",
98 "STUB_ML_WATER_CAVES",
100 "CCW_SUMMER_ZUBBA_HIVE",
101 "CCW_SPRING_ZUBBA_HIVE",
102 "CCW_AUTUMN_ZUBBA_HIVE",
103 "STUB_CCW_WINTER_ZUBBA_HIVE",
104 "CCW_SPRING_NABNUTS_HOUSE",
105 "CCW_SUMMER_NABNUTS_HOUSE",
106 "CCW_AUTUMN_NABNUTS_HOUSE",
107 "CCW_WINTER_NABNUTS_HOUSE",
108 "CCW_WINTER_HONEYCOMB_ROOM",
109 "CCW_AUTUMN_NABNUTS_WATER_SUPPLY",
110 "CCW_WINTER_NABNUTS_WATER_SUPPLY",
111 "CCW_SPRING_WHIPCRACK_ROOM",
112 "CCW_SUMMER_WHIPCRACK_ROOM",
113 "CCW_AUTUMN_WHIPCRACK_ROOM",
114 "CCW_WINTER_WHIPCRACK_ROOM",
116 "GL_TTC_AND_CC_PUZZLE",
118 "GL_RED_CAULDRON_ROOM",
125 "STUB_GL_ORIGINAL_FP_LOBBY",
130 "GL_RBB_AND_MMM_PUZZLE",
133 "CS_INTRO_GL_DINGPOT_1",
134 "CS_INTRO_BANJOS_HOUSE_1",
135 "CS_SPIRAL_MOUNTAIN_1",
136 "CS_SPIRAL_MOUNTAIN_2",
139 "CS_INTRO_GL_DINGPOT_2",
140 "CS_ENTERING_GL_MACHINE_ROOM",
141 "CS_GAME_OVER_MACHINE_ROOM",
142 "CS_UNUSED_MACHINE_ROOM",
143 "CS_SPIRAL_MOUNTAIN_3",
144 "CS_SPIRAL_MOUNTAIN_4",
145 "CS_SPIRAL_MOUNTAIN_5",
146 "CS_SPIRAL_MOUNTAIN_6",
147 "CS_INTRO_BANJOS_HOUSE_2",
148 "CS_INTRO_BANJOS_HOUSE_3",
153 "TTC_SHARKFOOD_ISLAND",
162 "CS_END_SPIRAL_MOUNTAIN_1",
163 "CS_END_SPIRAL_MOUNTAIN_2",
168inline constexpr const char* kLevelNames[] = {
169 "NONE",
"MUMBOS_MOUNTAIN",
"TREASURE_TROVE_COVE",
"CLANKERS_CAVERN",
"BUBBLEGLOOP_SWAMP",
"FREEZEEZY_PEAK",
170 "LAIR",
"GOBIS_VALLEY",
"CLICK_CLOCK_WOOD",
"RUSTY_BUCKET_BAY",
"MAD_MONSTER_MANSION",
"SPIRAL_MOUNTAIN",
174inline const char* MapName(uint32_t map) {
175 return map <
sizeof(kMapNames) /
sizeof(kMapNames[0]) ? kMapNames[map] :
nullptr;
178inline const char* LevelName(uint32_t level) {
179 return level <
sizeof(kLevelNames) /
sizeof(kLevelNames[0]) ? kLevelNames[level] :
nullptr;
183inline std::optional<uint16_t> MapFromName(
const std::string& name) {
184 for (uint16_t map = 1; map <
sizeof(kMapNames) /
sizeof(kMapNames[0]); map++) {
185 const std::string shortName = kMapNames[map];
186 if (name == shortName ||
187 (name.rfind(
"MAP_", 0) == 0 && name.size() > shortName.size() &&
188 name.compare(name.size() - shortName.size() - 1, std::string::npos,
"_" + shortName) == 0)) {
195inline std::optional<uint16_t> LevelFromName(
const std::string& name) {
196 for (uint16_t level = 1; level <
sizeof(kLevelNames) /
sizeof(kLevelNames[0]); level++) {
197 const std::string shortName = kLevelNames[level];
198 if (name == shortName ||
199 (name.rfind(
"LEVEL_", 0) == 0 && name.size() > shortName.size() &&
200 name.compare(name.size() - shortName.size() - 1, std::string::npos,
"_" + shortName) == 0)) {