diff --git a/soh/soh/Enhancements/randomizer/3drando/logic.cpp b/soh/soh/Enhancements/randomizer/3drando/logic.cpp index 120c385bf..bd6508b69 100644 --- a/soh/soh/Enhancements/randomizer/3drando/logic.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/logic.cpp @@ -616,7 +616,7 @@ namespace Logic { FoundBombchus = (BombchuDrop || Bombchus || Bombchus5 || Bombchus10 || Bombchus20); CanPlayBowling = (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && FoundBombchus) || (!ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && BombBag); // TODO: Implement Ammo Drop Setting in place of bombchu drops - HasBombchus = (BuyBombchus || (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON_PLUS_BOMBCHU) && FoundBombchus)); + HasBombchus = (BuyBombchus || (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON/*_PLUS_BOMBCHU*/) && FoundBombchus)); HasExplosives = Bombs || (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && HasBombchus); diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 1ef83c7ef..fb5b6e591 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -437,7 +437,7 @@ static void WriteEnabledTricks(tinyxml2::XMLDocument& spoilerLog) { if (setting->GetSelectedOptionIndex() != RO_GENERIC_ON/* || !setting->IsCategory(OptionCategory::Setting)*/) { continue; } - jsonData["enabledTricks"].push_back(RemoveLineBreaks(RandomizerTricks::GetRTName((RandomizerTrick)std::stoi(setting->GetName()))).c_str()); + jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); //auto node = parentNode->InsertNewChildElement("trick"); //node->SetAttribute("name", RemoveLineBreaks(setting->GetName()).c_str()); } diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 8f4a4b25e..8c2d02dab 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -16,6 +16,8 @@ namespace Rando { std::weak_ptr Context::mContext; Context::Context() { + StaticData::InitItemTable(); + StaticData::InitLocationTable(); for (auto& location : StaticData::GetLocationTable()) { mSpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck(); } diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 95845883f..9cb8d9ef5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3641,9 +3641,9 @@ typedef enum { //Ammo drop settings (on, "on+bombchu", off) typedef enum { - RO_AMMO_DROPS_ON, - RO_AMMO_DROPS_ON_PLUS_BOMBCHU, RO_AMMO_DROPS_OFF, + //RO_AMMO_DROPS_ON_PLUS_BOMBCHU, + RO_AMMO_DROPS_ON, } RandoOptionAmmoDrops; typedef enum { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 7215415e2..d858bb567 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -197,177 +197,177 @@ void Settings::CreateOptions() { mExcludeLocationsOptionsGroups.reserve(SPOILER_COLLECTION_GROUP_COUNT); - mTrickOptions[RT_VISIBLE_COLLISION] = Option::LogicTrick(std::to_string(RT_VISIBLE_COLLISION)); - mTrickOptions[RT_GROTTOS_WITHOUT_AGONY] = Option::LogicTrick(std::to_string(RT_GROTTOS_WITHOUT_AGONY)); - mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS] = Option::LogicTrick(std::to_string(RT_FEWER_TUNIC_REQUIREMENTS)); - mTrickOptions[RT_RUSTED_SWITCHES] = Option::LogicTrick(std::to_string(RT_RUSTED_SWITCHES)); - mTrickOptions[RT_FLAMING_CHESTS] = Option::LogicTrick(std::to_string(RT_FLAMING_CHESTS)); - mTrickOptions[RT_BUNNY_HOOD_JUMPS] = Option::LogicTrick(std::to_string(RT_BUNNY_HOOD_JUMPS)); - mTrickOptions[RT_DAMAGE_BOOST_SIMPLE] = Option::LogicTrick(std::to_string(RT_DAMAGE_BOOST_SIMPLE)); - mTrickOptions[RT_HOVER_BOOST_SIMPLE] = Option::LogicTrick(std::to_string(RT_HOVER_BOOST_SIMPLE)); - mTrickOptions[RT_KF_ADULT_GS] = Option::LogicTrick(std::to_string(RT_KF_ADULT_GS)); - mTrickOptions[RT_LW_BRIDGE] = Option::LogicTrick(std::to_string(RT_LW_BRIDGE)); - mTrickOptions[RT_LW_MIDO_BACKFLIP] = Option::LogicTrick(std::to_string(RT_LW_MIDO_BACKFLIP)); - mTrickOptions[RT_LW_GS_BEAN] = Option::LogicTrick(std::to_string(RT_LW_GS_BEAN)); - mTrickOptions[RT_HC_STORMS_GS] = Option::LogicTrick(std::to_string(RT_HC_STORMS_GS)); - mTrickOptions[RT_KAK_MAN_ON_ROOF] = Option::LogicTrick(std::to_string(RT_KAK_MAN_ON_ROOF)); - mTrickOptions[RT_KAK_TOWER_GS] = Option::LogicTrick(std::to_string(RT_KAK_TOWER_GS)); - mTrickOptions[RT_KAK_ADULT_WINDMILL_POH] = Option::LogicTrick(std::to_string(RT_KAK_ADULT_WINDMILL_POH)); - mTrickOptions[RT_KAK_CHILD_WINDMILL_POH] = Option::LogicTrick(std::to_string(RT_KAK_CHILD_WINDMILL_POH)); - mTrickOptions[RT_KAK_ROOFTOP_GS] = Option::LogicTrick(std::to_string(RT_KAK_ROOFTOP_GS)); - mTrickOptions[RT_GY_POH] = Option::LogicTrick(std::to_string(RT_GY_POH)); - mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH] = Option::LogicTrick(std::to_string(RT_GY_CHILD_DAMPE_RACE_POH)); - mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS] = Option::LogicTrick(std::to_string(RT_GY_SHADOW_FIRE_ARROWS)); - mTrickOptions[RT_DMT_SOIL_GS] = Option::LogicTrick(std::to_string(RT_DMT_SOIL_GS)); - mTrickOptions[RT_DMT_BOMBABLE] = Option::LogicTrick(std::to_string(RT_DMT_BOMBABLE)); - mTrickOptions[RT_DMT_HOOKSHOT_LOWER_GS] = Option::LogicTrick(std::to_string(RT_DMT_HOOKSHOT_LOWER_GS)); - mTrickOptions[RT_DMT_HOVERS_LOWER_GS] = Option::LogicTrick(std::to_string(RT_DMT_HOVERS_LOWER_GS)); - mTrickOptions[RT_DMT_BEAN_LOWER_GS] = Option::LogicTrick(std::to_string(RT_DMT_BEAN_LOWER_GS)); - mTrickOptions[RT_DMT_JS_LOWER_GS] = Option::LogicTrick(std::to_string(RT_DMT_JS_LOWER_GS)); - mTrickOptions[RT_DMT_CLIMB_HOVERS] = Option::LogicTrick(std::to_string(RT_DMT_CLIMB_HOVERS)); - mTrickOptions[RT_DMT_UPPER_GS] = Option::LogicTrick(std::to_string(RT_DMT_UPPER_GS)); - mTrickOptions[RT_DMT_BOLERO_BIGGORON] = Option::LogicTrick(std::to_string(RT_DMT_BOLERO_BIGGORON)); - mTrickOptions[RT_GC_POT] = Option::LogicTrick(std::to_string(RT_GC_POT)); - mTrickOptions[RT_GC_POT_STRENGTH] = Option::LogicTrick(std::to_string(RT_GC_POT_STRENGTH)); - mTrickOptions[RT_GC_ROLLING_STRENGTH] = Option::LogicTrick(std::to_string(RT_GC_ROLLING_STRENGTH)); - mTrickOptions[RT_GC_LEFTMOST] = Option::LogicTrick(std::to_string(RT_GC_LEFTMOST)); - mTrickOptions[RT_GC_GROTTO] = Option::LogicTrick(std::to_string(RT_GC_GROTTO)); - mTrickOptions[RT_GC_LINK_GORON_DINS] = Option::LogicTrick(std::to_string(RT_GC_LINK_GORON_DINS)); - mTrickOptions[RT_DMC_HOVER_BEAN_POH] = Option::LogicTrick(std::to_string(RT_DMC_HOVER_BEAN_POH)); - mTrickOptions[RT_DMC_BOLERO_JUMP] = Option::LogicTrick(std::to_string(RT_DMC_BOLERO_JUMP)); - mTrickOptions[RT_DMC_BOULDER_JS] = Option::LogicTrick(std::to_string(RT_DMC_BOULDER_JS)); - mTrickOptions[RT_DMC_BOULDER_SKIP] = Option::LogicTrick(std::to_string(RT_DMC_BOULDER_SKIP)); - mTrickOptions[RT_ZR_LOWER] = Option::LogicTrick(std::to_string(RT_ZR_LOWER)); - mTrickOptions[RT_ZR_UPPER] = Option::LogicTrick(std::to_string(RT_ZR_UPPER)); - mTrickOptions[RT_ZR_HOVERS] = Option::LogicTrick(std::to_string(RT_ZR_HOVERS)); - mTrickOptions[RT_ZR_CUCCO] = Option::LogicTrick(std::to_string(RT_ZR_CUCCO)); - mTrickOptions[RT_ZD_KING_ZORA_SKIP] = Option::LogicTrick(std::to_string(RT_ZD_KING_ZORA_SKIP)); - mTrickOptions[RT_ZD_GS] = Option::LogicTrick(std::to_string(RT_ZD_GS)); - mTrickOptions[RT_LH_LAB_WALL_GS] = Option::LogicTrick(std::to_string(RT_LH_LAB_WALL_GS)); - mTrickOptions[RT_LH_LAB_DIVING] = Option::LogicTrick(std::to_string(RT_LH_LAB_DIVING)); - mTrickOptions[RT_LH_WATER_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_LH_WATER_HOOKSHOT)); - mTrickOptions[RT_GV_CRATE_HOVERS] = Option::LogicTrick(std::to_string(RT_GV_CRATE_HOVERS)); - mTrickOptions[RT_GF_KITCHEN] = Option::LogicTrick(std::to_string(RT_GF_KITCHEN)); - mTrickOptions[RT_GF_JUMP] = Option::LogicTrick(std::to_string(RT_GF_JUMP)); - mTrickOptions[RT_HW_BUNNY_CROSSING] = Option::LogicTrick(std::to_string(RT_HW_BUNNY_CROSSING)); - mTrickOptions[RT_HW_CROSSING] = Option::LogicTrick(std::to_string(RT_HW_CROSSING)); - mTrickOptions[RT_LENS_HW] = Option::LogicTrick(std::to_string(RT_LENS_HW)); - mTrickOptions[RT_HW_REVERSE] = Option::LogicTrick(std::to_string(RT_HW_REVERSE)); - mTrickOptions[RT_COLOSSUS_GS] = Option::LogicTrick(std::to_string(RT_COLOSSUS_GS)); - mTrickOptions[RT_DEKU_BASEMENT_GS] = Option::LogicTrick(std::to_string(RT_DEKU_BASEMENT_GS)); - mTrickOptions[RT_DEKU_B1_SKIP] = Option::LogicTrick(std::to_string(RT_DEKU_B1_SKIP)); - mTrickOptions[RT_DEKU_B1_BOW_WEBS] = Option::LogicTrick(std::to_string(RT_DEKU_B1_BOW_WEBS)); - mTrickOptions[RT_DEKU_MQ_COMPASS_GS] = Option::LogicTrick(std::to_string(RT_DEKU_MQ_COMPASS_GS)); - mTrickOptions[RT_DEKU_MQ_LOG] = Option::LogicTrick(std::to_string(RT_DEKU_MQ_LOG)); - mTrickOptions[RT_DC_SCARECROW_GS] = Option::LogicTrick(std::to_string(RT_DC_SCARECROW_GS)); - mTrickOptions[RT_DC_VINES_GS] = Option::LogicTrick(std::to_string(RT_DC_VINES_GS)); - mTrickOptions[RT_DC_STAIRCASE] = Option::LogicTrick(std::to_string(RT_DC_STAIRCASE)); - mTrickOptions[RT_DC_SLINGSHOT_SKIP] = Option::LogicTrick(std::to_string(RT_DC_SLINGSHOT_SKIP)); - mTrickOptions[RT_DC_SCRUB_ROOM] = Option::LogicTrick(std::to_string(RT_DC_SCRUB_ROOM)); - mTrickOptions[RT_DC_JUMP] = Option::LogicTrick(std::to_string(RT_DC_JUMP)); - mTrickOptions[RT_DC_HAMMER_FLOOR] = Option::LogicTrick(std::to_string(RT_DC_HAMMER_FLOOR)); - mTrickOptions[RT_DC_MQ_CHILD_BOMBS] = Option::LogicTrick(std::to_string(RT_DC_MQ_CHILD_BOMBS)); - mTrickOptions[RT_DC_MQ_CHILD_EYES] = Option::LogicTrick(std::to_string(RT_DC_MQ_CHILD_EYES)); - mTrickOptions[RT_DC_MQ_ADULT_EYES] = Option::LogicTrick(std::to_string(RT_DC_MQ_ADULT_EYES)); - mTrickOptions[RT_JABU_ALCOVE_JUMP_DIVE] = Option::LogicTrick(std::to_string(RT_JABU_ALCOVE_JUMP_DIVE)); - mTrickOptions[RT_JABU_BOSS_HOVER] = Option::LogicTrick(std::to_string(RT_JABU_BOSS_HOVER)); - mTrickOptions[RT_JABU_NEAR_BOSS_RANGED] = Option::LogicTrick(std::to_string(RT_JABU_NEAR_BOSS_RANGED)); - mTrickOptions[RT_JABU_NEAR_BOSS_EXPLOSIVES] = Option::LogicTrick(std::to_string(RT_JABU_NEAR_BOSS_EXPLOSIVES)); - mTrickOptions[RT_LENS_JABU_MQ] = Option::LogicTrick(std::to_string(RT_LENS_JABU_MQ)); - mTrickOptions[RT_JABU_MQ_RANG_JUMP] = Option::LogicTrick(std::to_string(RT_JABU_MQ_RANG_JUMP)); - mTrickOptions[RT_JABU_MQ_SOT_GS] = Option::LogicTrick(std::to_string(RT_JABU_MQ_SOT_GS)); - mTrickOptions[RT_LENS_BOTW] = Option::LogicTrick(std::to_string(RT_LENS_BOTW)); - mTrickOptions[RT_BOTW_CHILD_DEADHAND] = Option::LogicTrick(std::to_string(RT_BOTW_CHILD_DEADHAND)); - mTrickOptions[RT_BOTW_BASEMENT] = Option::LogicTrick(std::to_string(RT_BOTW_BASEMENT)); - mTrickOptions[RT_BOTW_MQ_PITS] = Option::LogicTrick(std::to_string(RT_BOTW_MQ_PITS)); - mTrickOptions[RT_BOTW_MQ_DEADHAND_KEY] = Option::LogicTrick(std::to_string(RT_BOTW_MQ_DEADHAND_KEY)); - mTrickOptions[RT_FOREST_FIRST_GS] = Option::LogicTrick(std::to_string(RT_FOREST_FIRST_GS)); - mTrickOptions[RT_FOREST_OUTDOORS_EAST_GS] = Option::LogicTrick(std::to_string(RT_FOREST_OUTDOORS_EAST_GS)); - mTrickOptions[RT_FOREST_VINES] = Option::LogicTrick(std::to_string(RT_FOREST_VINES)); - mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = Option::LogicTrick(std::to_string(RT_FOREST_OUTDOORS_LEDGE)); - mTrickOptions[RT_FOREST_DOORFRAME] = Option::LogicTrick(std::to_string(RT_FOREST_DOORFRAME)); - mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = Option::LogicTrick(std::to_string(RT_FOREST_OUTSIDE_BACKDOOR)); - mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_WELL_SWIM)); - mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_BLOCK_PUZZLE)); - mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_JS_HALLWAY_SWITCH)); - mTrickOptions[RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH)); - mTrickOptions[RT_FOREST_MQ_RANG_HALLWAY_SWITCH] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_RANG_HALLWAY_SWITCH)); - mTrickOptions[RT_FIRE_BOSS_DOOR_JUMP] = Option::LogicTrick(std::to_string(RT_FIRE_BOSS_DOOR_JUMP)); - mTrickOptions[RT_FIRE_SOT] = Option::LogicTrick(std::to_string(RT_FIRE_SOT)); - mTrickOptions[RT_FIRE_STRENGTH] = Option::LogicTrick(std::to_string(RT_FIRE_STRENGTH)); - mTrickOptions[RT_FIRE_SCARECROW] = Option::LogicTrick(std::to_string(RT_FIRE_SCARECROW)); - mTrickOptions[RT_FIRE_FLAME_MAZE] = Option::LogicTrick(std::to_string(RT_FIRE_FLAME_MAZE)); - mTrickOptions[RT_FIRE_MQ_NEAR_BOSS] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_NEAR_BOSS)); - mTrickOptions[RT_FIRE_MQ_BLOCKED_CHEST] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_BLOCKED_CHEST)); - mTrickOptions[RT_FIRE_MQ_BK_CHEST] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_BK_CHEST)); - mTrickOptions[RT_FIRE_MQ_CLIMB] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_CLIMB)); - mTrickOptions[RT_FIRE_MQ_MAZE_SIDE_ROOM] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_MAZE_SIDE_ROOM)); - mTrickOptions[RT_FIRE_MQ_MAZE_HOVERS] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_MAZE_HOVERS)); - mTrickOptions[RT_FIRE_MQ_MAZE_JUMP] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_MAZE_JUMP)); - mTrickOptions[RT_FIRE_MQ_ABOVE_MAZE_GS] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_ABOVE_MAZE_GS)); - mTrickOptions[RT_FIRE_MQ_FLAME_MAZE] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_FLAME_MAZE)); - mTrickOptions[RT_WATER_LONGSHOT_TORCH] = Option::LogicTrick(std::to_string(RT_WATER_LONGSHOT_TORCH)); - mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS] = Option::LogicTrick(std::to_string(RT_WATER_CRACKED_WALL_HOVERS)); - mTrickOptions[RT_WATER_CRACKED_WALL] = Option::LogicTrick(std::to_string(RT_WATER_CRACKED_WALL)); - mTrickOptions[RT_WATER_BK_REGION] = Option::LogicTrick(std::to_string(RT_WATER_BK_REGION)); - mTrickOptions[RT_WATER_NORTH_BASEMENT_LEDGE_JUMP] = Option::LogicTrick(std::to_string(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP)); - mTrickOptions[RT_WATER_BK_JUMP_DIVE] = Option::LogicTrick(std::to_string(RT_WATER_BK_JUMP_DIVE)); - mTrickOptions[RT_WATER_FW_CENTRAL_GS] = Option::LogicTrick(std::to_string(RT_WATER_FW_CENTRAL_GS)); - mTrickOptions[RT_WATER_IRONS_CENTRAL_GS] = Option::LogicTrick(std::to_string(RT_WATER_IRONS_CENTRAL_GS)); - mTrickOptions[RT_WATER_CENTRAL_BOW] = Option::LogicTrick(std::to_string(RT_WATER_CENTRAL_BOW)); - mTrickOptions[RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS] = Option::LogicTrick(std::to_string(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS)); - mTrickOptions[RT_WATER_RANG_FALLING_PLATFORM_GS] = Option::LogicTrick(std::to_string(RT_WATER_RANG_FALLING_PLATFORM_GS)); - mTrickOptions[RT_WATER_RIVER_GS] = Option::LogicTrick(std::to_string(RT_WATER_RIVER_GS)); - mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE] = Option::LogicTrick(std::to_string(RT_WATER_DRAGON_JUMP_DIVE)); - mTrickOptions[RT_WATER_ADULT_DRAGON] = Option::LogicTrick(std::to_string(RT_WATER_ADULT_DRAGON)); - mTrickOptions[RT_WATER_CHILD_DRAGON] = Option::LogicTrick(std::to_string(RT_WATER_CHILD_DRAGON)); - mTrickOptions[RT_WATER_MQ_CENTRAL_PILLAR] = Option::LogicTrick(std::to_string(RT_WATER_MQ_CENTRAL_PILLAR)); - mTrickOptions[RT_WATER_MQ_LOCKED_GS] = Option::LogicTrick(std::to_string(RT_WATER_MQ_LOCKED_GS)); - mTrickOptions[RT_LENS_SHADOW] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW)); - mTrickOptions[RT_LENS_SHADOW_PLATFORM] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_PLATFORM)); - mTrickOptions[RT_LENS_BONGO] = Option::LogicTrick(std::to_string(RT_LENS_BONGO)); - mTrickOptions[RT_SHADOW_UMBRELLA] = Option::LogicTrick(std::to_string(RT_SHADOW_UMBRELLA)); - mTrickOptions[RT_SHADOW_UMBRELLA_GS] = Option::LogicTrick(std::to_string(RT_SHADOW_UMBRELLA_GS)); - mTrickOptions[RT_SHADOW_FREESTANDING_KEY] = Option::LogicTrick(std::to_string(RT_SHADOW_FREESTANDING_KEY)); - mTrickOptions[RT_SHADOW_STATUE] = Option::LogicTrick(std::to_string(RT_SHADOW_STATUE)); - mTrickOptions[RT_SHADOW_BONGO] = Option::LogicTrick(std::to_string(RT_SHADOW_BONGO)); - mTrickOptions[RT_LENS_SHADOW_MQ] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_MQ)); - mTrickOptions[RT_LENS_SHADOW_MQ_INVISIBLE_BLADES] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES)); - mTrickOptions[RT_LENS_SHADOW_MQ_PLATFORM] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_MQ_PLATFORM)); - mTrickOptions[RT_LENS_SHADOW_MQ_DEADHAND] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_MQ_DEADHAND)); - mTrickOptions[RT_SHADOW_MQ_GAP] = Option::LogicTrick(std::to_string(RT_SHADOW_MQ_GAP)); - mTrickOptions[RT_SHADOW_MQ_INVISIBLE_BLADES] = Option::LogicTrick(std::to_string(RT_SHADOW_MQ_INVISIBLE_BLADES)); - mTrickOptions[RT_SHADOW_MQ_HUGE_PIT] = Option::LogicTrick(std::to_string(RT_SHADOW_MQ_HUGE_PIT)); - mTrickOptions[RT_SHADOW_MQ_WINDY_WALKWAY] = Option::LogicTrick(std::to_string(RT_SHADOW_MQ_WINDY_WALKWAY)); - mTrickOptions[RT_LENS_SPIRIT] = Option::LogicTrick(std::to_string(RT_LENS_SPIRIT)); - mTrickOptions[RT_SPIRIT_CHILD_CHU] = Option::LogicTrick(std::to_string(RT_SPIRIT_CHILD_CHU)); - mTrickOptions[RT_SPIRIT_LOBBY_GS] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOBBY_GS)); - mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOWER_ADULT_SWITCH)); - mTrickOptions[RT_SPIRIT_LOBBY_JUMP] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOBBY_JUMP)); - mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_SPIRIT_PLATFORM_HOOKSHOT)); - mTrickOptions[RT_SPIRIT_MAP_CHEST] = Option::LogicTrick(std::to_string(RT_SPIRIT_MAP_CHEST)); - mTrickOptions[RT_SPIRIT_SUN_CHEST] = Option::LogicTrick(std::to_string(RT_SPIRIT_SUN_CHEST)); - mTrickOptions[RT_SPIRIT_WALL] = Option::LogicTrick(std::to_string(RT_SPIRIT_WALL)); - mTrickOptions[RT_LENS_SPIRIT_MQ] = Option::LogicTrick(std::to_string(RT_LENS_SPIRIT_MQ)); - mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_SOT] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_SUN_BLOCK_SOT)); - mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_GS] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_SUN_BLOCK_GS)); - mTrickOptions[RT_SPIRIT_MQ_LOWER_ADULT] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_LOWER_ADULT)); - mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_FROZEN_EYE)); - mTrickOptions[RT_ICE_BLOCK_GS] = Option::LogicTrick(std::to_string(RT_ICE_BLOCK_GS)); - mTrickOptions[RT_ICE_MQ_RED_ICE_GS] = Option::LogicTrick(std::to_string(RT_ICE_MQ_RED_ICE_GS)); - mTrickOptions[RT_ICE_MQ_SCARECROW] = Option::LogicTrick(std::to_string(RT_ICE_MQ_SCARECROW)); - mTrickOptions[RT_LENS_GTG] = Option::LogicTrick(std::to_string(RT_LENS_GTG)); - mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GTG_WITHOUT_HOOKSHOT)); - mTrickOptions[RT_GTG_FAKE_WALL] = Option::LogicTrick(std::to_string(RT_GTG_FAKE_WALL)); - mTrickOptions[RT_LENS_GTG_MQ] = Option::LogicTrick(std::to_string(RT_LENS_GTG_MQ)); - mTrickOptions[RT_GTG_MQ_WITH_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GTG_MQ_WITH_HOOKSHOT)); - mTrickOptions[RT_GTG_MQ_WIHTOUT_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GTG_MQ_WIHTOUT_HOOKSHOT)); - mTrickOptions[RT_LENS_GANON] = Option::LogicTrick(std::to_string(RT_LENS_GANON)); - mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GANON_SPIRIT_TRIAL_HOOKSHOT)); - mTrickOptions[RT_LENS_GANON_MQ] = Option::LogicTrick(std::to_string(RT_LENS_GANON_MQ)); - mTrickOptions[RT_GANON_MQ_FIRE_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_FIRE_TRIAL)); - mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_SHADOW_TRIAL)); - mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_LIGHT_TRIAL)); + mTrickOptions[RT_VISIBLE_COLLISION] = Option::LogicTrick("Pass Through Visible One-Way Collision"); + mTrickOptions[RT_GROTTOS_WITHOUT_AGONY] = Option::LogicTrick("Hidden Grottos without Stone of Agony"); + mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS] = Option::LogicTrick("Fewer Tunic Requirements"); + mTrickOptions[RT_RUSTED_SWITCHES] = Option::LogicTrick("Hammer Rusted Switches Through Walls"); + mTrickOptions[RT_FLAMING_CHESTS] = Option::LogicTrick("Flaming Chests"); + mTrickOptions[RT_BUNNY_HOOD_JUMPS] = Option::LogicTrick("Bunny Hood Jumps"); + mTrickOptions[RT_DAMAGE_BOOST_SIMPLE] = Option::LogicTrick("Simple damage boosts"); + mTrickOptions[RT_HOVER_BOOST_SIMPLE] = Option::LogicTrick("Simple hover boosts"); + mTrickOptions[RT_KF_ADULT_GS] = Option::LogicTrick("Adult Kokiri Forest GS with Hover Boots"); + mTrickOptions[RT_LW_BRIDGE] = Option::LogicTrick("Jump onto the Lost Woods Bridge as Adult with Nothing"); + mTrickOptions[RT_LW_MIDO_BACKFLIP] = Option::LogicTrick("Backflip over Mido as Adult"); + mTrickOptions[RT_LW_GS_BEAN] = Option::LogicTrick("Lost Woods Adult GS without Bean"); + mTrickOptions[RT_HC_STORMS_GS] = Option::LogicTrick("Hyrule Castle Storms Grotto GS with Just Boomerang"); + mTrickOptions[RT_KAK_MAN_ON_ROOF] = Option::LogicTrick("Man on Roof without Hookshot"); + mTrickOptions[RT_KAK_TOWER_GS] = Option::LogicTrick("Kakariko Tower GS with Jump Slash"); + mTrickOptions[RT_KAK_ADULT_WINDMILL_POH] = Option::LogicTrick("Windmill PoH as Adult with Nothing"); + mTrickOptions[RT_KAK_CHILD_WINDMILL_POH] = Option::LogicTrick("Windmill PoH as Child with Precise Jump Slash"); + mTrickOptions[RT_KAK_ROOFTOP_GS] = Option::LogicTrick("Kakariko Rooftop GS with Hover Boots"); + mTrickOptions[RT_GY_POH] = Option::LogicTrick("Graveyard Freestanding PoH with Boomerang"); + mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH] = Option::LogicTrick("Second Dampe Race as Child"); + mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS] = Option::LogicTrick("Shadow Temple Entry with Fire Arrows"); + mTrickOptions[RT_DMT_SOIL_GS] = Option::LogicTrick("Death Mountain Trail Soil GS without Destroying Boulder"); + mTrickOptions[RT_DMT_BOMBABLE] = Option::LogicTrick("Death Mountain Trail Chest with Strength"); + mTrickOptions[RT_DMT_HOOKSHOT_LOWER_GS] = Option::LogicTrick("Death Mountain Trail Lower Red Rock GS with Hookshot"); + mTrickOptions[RT_DMT_HOVERS_LOWER_GS] = Option::LogicTrick("Death Mountain Trail Lower Red Rock GS with Hover Boots"); + mTrickOptions[RT_DMT_BEAN_LOWER_GS] = Option::LogicTrick("Death Mountain Trail Lower Red Rock GS with Magic Bean"); + mTrickOptions[RT_DMT_JS_LOWER_GS] = Option::LogicTrick("Death Mountain Trail Lower Red Rock GS with Jump Slash"); + mTrickOptions[RT_DMT_CLIMB_HOVERS] = Option::LogicTrick("Death Mountain Trail Climb with Hover Boots"); + mTrickOptions[RT_DMT_UPPER_GS] = Option::LogicTrick("Death Mountain Trail Upper Red Rock GS without Hammer"); + mTrickOptions[RT_DMT_BOLERO_BIGGORON] = Option::LogicTrick("Deliver Eye Drops with Bolero of Fire"); + mTrickOptions[RT_GC_POT] = Option::LogicTrick("Goron City Spinning Pot PoH with Bombchu"); + mTrickOptions[RT_GC_POT_STRENGTH] = Option::LogicTrick("Goron City Spinning Pot PoH with Strength"); + mTrickOptions[RT_GC_ROLLING_STRENGTH] = Option::LogicTrick("Rolling Goron (Hot Rodder Goron) as Child with Strength"); + mTrickOptions[RT_GC_LEFTMOST] = Option::LogicTrick("Goron City Maze Left Chest with Hover Boots"); + mTrickOptions[RT_GC_GROTTO] = Option::LogicTrick("Goron City Grotto with Hookshot While Taking Damage"); + mTrickOptions[RT_GC_LINK_GORON_DINS] = Option::LogicTrick("Stop Link the Goron with Din\'s Fire"); + mTrickOptions[RT_DMC_HOVER_BEAN_POH] = Option::LogicTrick("Crater\'s Bean PoH with Hover Boots"); + mTrickOptions[RT_DMC_BOLERO_JUMP] = Option::LogicTrick("Death Mountain Crater Jump to Bolero"); + mTrickOptions[RT_DMC_BOULDER_JS] = Option::LogicTrick("Death Mountain Crater Upper to Lower with Hammer"); + mTrickOptions[RT_DMC_BOULDER_SKIP] = Option::LogicTrick("Death Mountain Crater Upper to Lower Boulder Skip"); + mTrickOptions[RT_ZR_LOWER] = Option::LogicTrick("Zora\'s River Lower Freestanding PoH as Adult with Nothing"); + mTrickOptions[RT_ZR_UPPER] = Option::LogicTrick("Zora\'s River Upper Freestanding PoH as Adult with Nothing"); + mTrickOptions[RT_ZR_HOVERS] = Option::LogicTrick("Zora\'s Domain Entry with Hover Boots"); + mTrickOptions[RT_ZR_CUCCO] = Option::LogicTrick("Zora\'s Domain Entry with Cucco"); + mTrickOptions[RT_ZD_KING_ZORA_SKIP] = Option::LogicTrick("Skip King Zora as Adult with Nothing"); + mTrickOptions[RT_ZD_GS] = Option::LogicTrick("Zora\'s Domain GS with No Additional Items"); + mTrickOptions[RT_LH_LAB_WALL_GS] = Option::LogicTrick("Lake Hylia Lab Wall GS with Jump Slash"); + mTrickOptions[RT_LH_LAB_DIVING] = Option::LogicTrick("Lake Hylia Lab Dive without Gold Scale"); + mTrickOptions[RT_LH_WATER_HOOKSHOT] = Option::LogicTrick("Water Temple Entry without Iron Boots using Hookshot"); + mTrickOptions[RT_GV_CRATE_HOVERS] = Option::LogicTrick("Gerudo Valley Crate PoH as Adult with Hover Boots"); + mTrickOptions[RT_GF_KITCHEN] = Option::LogicTrick("Thieves\' Hideout \"Kitchen\" with No Additional Items"); + mTrickOptions[RT_GF_JUMP] = Option::LogicTrick("Gerudo\'s Fortress Ledge Jumps"); + mTrickOptions[RT_HW_BUNNY_CROSSING] = Option::LogicTrick("Wasteland Crossing with Bunny Hood"); + mTrickOptions[RT_HW_CROSSING] = Option::LogicTrick("Wasteland Crossing without Hover Boots or Longshot"); + mTrickOptions[RT_LENS_HW] = Option::LogicTrick("Lensless Wasteland"); + mTrickOptions[RT_HW_REVERSE] = Option::LogicTrick("Reverse Wasteland"); + mTrickOptions[RT_COLOSSUS_GS] = Option::LogicTrick("Colossus Hill GS with Hookshot"); + mTrickOptions[RT_DEKU_BASEMENT_GS] = Option::LogicTrick("Deku Tree Basement Vines GS with Jump Slash"); + mTrickOptions[RT_DEKU_B1_SKIP] = Option::LogicTrick("Deku Tree Basement without Slingshot"); + mTrickOptions[RT_DEKU_B1_BOW_WEBS] = Option::LogicTrick("Deku Tree Basement Web to Gohma with Bow"); + mTrickOptions[RT_DEKU_MQ_COMPASS_GS] = Option::LogicTrick("Deku Tree MQ Compass Room GS Boulders with Just Hammer"); + mTrickOptions[RT_DEKU_MQ_LOG] = Option::LogicTrick("Deku Tree MQ Roll Under the Spiked Log"); + mTrickOptions[RT_DC_SCARECROW_GS] = Option::LogicTrick("Dodongo\'s Cavern Scarecrow GS with Armos Statue"); + mTrickOptions[RT_DC_VINES_GS] = Option::LogicTrick("Dodongo\'s Cavern Vines GS from Below with Longshot"); + mTrickOptions[RT_DC_STAIRCASE] = Option::LogicTrick("Dodongo\'s Cavern Staircase with Bow"); + mTrickOptions[RT_DC_SLINGSHOT_SKIP] = Option::LogicTrick("Dodongo\'s Cavern Child Slingshot Skips"); + mTrickOptions[RT_DC_SCRUB_ROOM] = Option::LogicTrick("Dodongo\'s Cavern Two Scrub Room with Strength"); + mTrickOptions[RT_DC_JUMP] = Option::LogicTrick("Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots"); + mTrickOptions[RT_DC_HAMMER_FLOOR] = Option::LogicTrick("Dodongo\'s Cavern Smash the Boss Lobby Floor"); + mTrickOptions[RT_DC_MQ_CHILD_BOMBS] = Option::LogicTrick("Dodongo\'s Cavern MQ Early Bomb Bag Area as Child"); + mTrickOptions[RT_DC_MQ_CHILD_EYES] = Option::LogicTrick("Dodongo\'s Cavern MQ Light the Eyes with Strength as Child"); + mTrickOptions[RT_DC_MQ_ADULT_EYES] = Option::LogicTrick("Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult"); + mTrickOptions[RT_JABU_ALCOVE_JUMP_DIVE] = Option::LogicTrick("Jabu Underwater Alcove as Adult with Jump Dive"); + mTrickOptions[RT_JABU_BOSS_HOVER] = Option::LogicTrick("Jabu Near Boss Room with Hover Boots"); + mTrickOptions[RT_JABU_NEAR_BOSS_RANGED] = Option::LogicTrick("Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives"); + mTrickOptions[RT_JABU_NEAR_BOSS_EXPLOSIVES] = Option::LogicTrick("Jabu Near Boss Ceiling Switch with Explosives"); + mTrickOptions[RT_LENS_JABU_MQ] = Option::LogicTrick("Jabu MQ without Lens of Truth"); + mTrickOptions[RT_JABU_MQ_RANG_JUMP] = Option::LogicTrick("Jabu MQ Compass Chest with Boomerang"); + mTrickOptions[RT_JABU_MQ_SOT_GS] = Option::LogicTrick("Jabu MQ Song of Time Block GS with Boomerang"); + mTrickOptions[RT_LENS_BOTW] = Option::LogicTrick("Bottom of the Well without Lens of Truth"); + mTrickOptions[RT_BOTW_CHILD_DEADHAND] = Option::LogicTrick("Child Dead Hand without Kokiri Sword"); + mTrickOptions[RT_BOTW_BASEMENT] = Option::LogicTrick("Bottom of the Well Map Chest with Strength & Sticks"); + mTrickOptions[RT_BOTW_MQ_PITS] = Option::LogicTrick("Bottom of the Well MQ Jump Over the Pits"); + mTrickOptions[RT_BOTW_MQ_DEADHAND_KEY] = Option::LogicTrick("Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang"); + mTrickOptions[RT_FOREST_FIRST_GS] = Option::LogicTrick("Forest Temple First Room GS with Difficult-to-Use Weapons"); + mTrickOptions[RT_FOREST_OUTDOORS_EAST_GS] = Option::LogicTrick("Forest Temple East Courtyard GS with Boomerang"); + mTrickOptions[RT_FOREST_VINES] = Option::LogicTrick("Forest Temple East Courtyard Vines with Hookshot"); + mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = Option::LogicTrick("Forest Temple NE Outdoors Ledge with Hover Boots"); + mTrickOptions[RT_FOREST_DOORFRAME] = Option::LogicTrick("Forest Temple East Courtyard Door Frame with Hover Boots"); + mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = Option::LogicTrick("Forest Temple Outside Backdoor with Jump Slash"); + mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = Option::LogicTrick("Swim Through Forest Temple MQ Well with Hookshot"); + mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = Option::LogicTrick("Skip Forest Temple MQ Block Puzzle with Bombchu"); + mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH] = Option::LogicTrick("Forest Temple MQ Twisted Hallway Switch with Jump Slash"); + mTrickOptions[RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH] = Option::LogicTrick("Forest Temple MQ Twisted Hallway Switch with Hookshot"); + mTrickOptions[RT_FOREST_MQ_RANG_HALLWAY_SWITCH] = Option::LogicTrick("Forest Temple MQ Twisted Hallway Switch with Boomerang"); + mTrickOptions[RT_FIRE_BOSS_DOOR_JUMP] = Option::LogicTrick("Fire Temple Boss Door without Hover Boots or Pillar"); + mTrickOptions[RT_FIRE_SOT] = Option::LogicTrick("Fire Temple Song of Time Room GS without Song of Time"); + mTrickOptions[RT_FIRE_STRENGTH] = Option::LogicTrick("Fire Temple Climb without Strength"); + mTrickOptions[RT_FIRE_SCARECROW] = Option::LogicTrick("Fire Temple East Tower without Scarecrow\'s Song"); + mTrickOptions[RT_FIRE_FLAME_MAZE] = Option::LogicTrick("Fire Temple Flame Wall Maze Skip"); + mTrickOptions[RT_FIRE_MQ_NEAR_BOSS] = Option::LogicTrick("Fire Temple MQ Chest Near Boss without Breaking Crate"); + mTrickOptions[RT_FIRE_MQ_BLOCKED_CHEST] = Option::LogicTrick("Fire Temple MQ Big Lava Room Blocked Door without Hookshot"); + mTrickOptions[RT_FIRE_MQ_BK_CHEST] = Option::LogicTrick("Fire Temple MQ Boss Key Chest without Bow"); + mTrickOptions[RT_FIRE_MQ_CLIMB] = Option::LogicTrick("Fire Temple MQ Climb without Fire Source"); + mTrickOptions[RT_FIRE_MQ_MAZE_SIDE_ROOM] = Option::LogicTrick("Fire Temple MQ Lizalfos Maze Side Room without Box"); + mTrickOptions[RT_FIRE_MQ_MAZE_HOVERS] = Option::LogicTrick("Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots"); + mTrickOptions[RT_FIRE_MQ_MAZE_JUMP] = Option::LogicTrick("Fire Temple MQ Lower to Upper Lizalfos Maze with Precise Jump"); + mTrickOptions[RT_FIRE_MQ_ABOVE_MAZE_GS] = Option::LogicTrick("Fire Temple MQ Above Flame Wall Maze GS from Below with Longshot"); + mTrickOptions[RT_FIRE_MQ_FLAME_MAZE] = Option::LogicTrick("Fire Temple MQ Flame Wall Maze Skip"); + mTrickOptions[RT_WATER_LONGSHOT_TORCH] = Option::LogicTrick("Water Temple Torch Longshot"); + mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS] = Option::LogicTrick("Water Temple Cracked Wall with Hover Boots"); + mTrickOptions[RT_WATER_CRACKED_WALL] = Option::LogicTrick("Water Temple Cracked Wall with No Additional Items"); + mTrickOptions[RT_WATER_BK_REGION] = Option::LogicTrick("Water Temple Boss Key Region with Hover Boots"); + mTrickOptions[RT_WATER_NORTH_BASEMENT_LEDGE_JUMP] = Option::LogicTrick("Water Temple North Basement Ledge with Precise Jump"); + mTrickOptions[RT_WATER_BK_JUMP_DIVE] = Option::LogicTrick("Water Temple Boss Key Jump Dive"); + mTrickOptions[RT_WATER_FW_CENTRAL_GS] = Option::LogicTrick("Water Temple Central Pillar GS with Farore\'s Wind"); + mTrickOptions[RT_WATER_IRONS_CENTRAL_GS] = Option::LogicTrick("Water Temple Central Pillar GS with Iron Boots"); + mTrickOptions[RT_WATER_CENTRAL_BOW] = Option::LogicTrick("Water Temple Central Bow Target without Longshot or Hover Boots"); + mTrickOptions[RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS] = Option::LogicTrick("Water Temple Falling Platform Room GS with Hookshot"); + mTrickOptions[RT_WATER_RANG_FALLING_PLATFORM_GS] = Option::LogicTrick("Water Temple Falling Platform Room GS with Boomerang"); + mTrickOptions[RT_WATER_RIVER_GS] = Option::LogicTrick("Water Temple River GS without Iron Boots"); + mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE] = Option::LogicTrick("Water Temple Dragon Statue Jump Dive"); + mTrickOptions[RT_WATER_ADULT_DRAGON] = Option::LogicTrick("Water Temple Dragon Statue Switch from Above the Water as Adult"); + mTrickOptions[RT_WATER_CHILD_DRAGON] = Option::LogicTrick("Water Temple Dragon Statue Switch from Above the Water as Child"); + mTrickOptions[RT_WATER_MQ_CENTRAL_PILLAR] = Option::LogicTrick("Water Temple MQ Central Pillar with Fire Arrows"); + mTrickOptions[RT_WATER_MQ_LOCKED_GS] = Option::LogicTrick("Water Temple MQ North Basement GS without Small Key"); + mTrickOptions[RT_LENS_SHADOW] = Option::LogicTrick("Shadow Temple Stationary Objects without Lens of Truth"); + mTrickOptions[RT_LENS_SHADOW_PLATFORM] = Option::LogicTrick("Shadow Temple Invisible Moving Platform without Lens of Truth"); + mTrickOptions[RT_LENS_BONGO] = Option::LogicTrick("Shadow Temple Bongo Bongo without Lens of Truth"); + mTrickOptions[RT_SHADOW_UMBRELLA] = Option::LogicTrick("Shadow Temple Stone Umbrella Skip"); + mTrickOptions[RT_SHADOW_UMBRELLA_GS] = Option::LogicTrick("Shadow Temple Falling Spikes GS with Hover Boots"); + mTrickOptions[RT_SHADOW_FREESTANDING_KEY] = Option::LogicTrick("Shadow Temple Freestanding Key with Bombchu"); + mTrickOptions[RT_SHADOW_STATUE] = Option::LogicTrick("Shadow Temple River Statue with Bombchu"); + mTrickOptions[RT_SHADOW_BONGO] = Option::LogicTrick("Shadow Temple Bongo Bongo without projectiles"); + mTrickOptions[RT_LENS_SHADOW_MQ] = Option::LogicTrick("Shadow Temple MQ Stationary Objects without Lens of Truth"); + mTrickOptions[RT_LENS_SHADOW_MQ_INVISIBLE_BLADES] = Option::LogicTrick("Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth"); + mTrickOptions[RT_LENS_SHADOW_MQ_PLATFORM] = Option::LogicTrick("Shadow Temple MQ Invisible Moving Platform without Lens of Truth"); + mTrickOptions[RT_LENS_SHADOW_MQ_DEADHAND] = Option::LogicTrick("Shadow Temple MQ 2nd Dead Hand without Lens of Truth"); + mTrickOptions[RT_SHADOW_MQ_GAP] = Option::LogicTrick("Shadow Temple MQ Truth Spinner Gap with Longshot"); + mTrickOptions[RT_SHADOW_MQ_INVISIBLE_BLADES] = Option::LogicTrick("Shadow Temple MQ Invisible Blades without Song of Time"); + mTrickOptions[RT_SHADOW_MQ_HUGE_PIT] = Option::LogicTrick("Shadow Temple MQ Lower Huge Pit without Fire Source"); + mTrickOptions[RT_SHADOW_MQ_WINDY_WALKWAY] = Option::LogicTrick("Shadow Temple MQ Windy Walkway Reverse without Hover Boots"); + mTrickOptions[RT_LENS_SPIRIT] = Option::LogicTrick("Spirit Temple without Lens of Truth"); + mTrickOptions[RT_SPIRIT_CHILD_CHU] = Option::LogicTrick("Spirit Temple Child Side Bridge with Bombchu"); + mTrickOptions[RT_SPIRIT_LOBBY_GS] = Option::LogicTrick("Spirit Temple Main Room GS with Boomerang"); + mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH] = Option::LogicTrick("Spirit Temple Lower Adult Switch with Bombs"); + mTrickOptions[RT_SPIRIT_LOBBY_JUMP] = Option::LogicTrick("Spirit Temple Main Room Jump from Hands to Upper Ledges"); + mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT] = Option::LogicTrick("Spirit Temple Main Room Hookshot to Boss Platform"); + mTrickOptions[RT_SPIRIT_MAP_CHEST] = Option::LogicTrick("Spirit Temple Map Chest with Bow"); + mTrickOptions[RT_SPIRIT_SUN_CHEST] = Option::LogicTrick("Spirit Temple Sun Block Room Chest with Bow"); + mTrickOptions[RT_SPIRIT_WALL] = Option::LogicTrick("Spirit Temple Shifting Wall with No Additional Items"); + mTrickOptions[RT_LENS_SPIRIT_MQ] = Option::LogicTrick("Spirit Temple MQ without Lens of Truth"); + mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_SOT] = Option::LogicTrick("Spirit Temple MQ Sun Block Room as Child without Song of Time"); + mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_GS] = Option::LogicTrick("Spirit Temple MQ Sun Block Room GS with Boomerang"); + mTrickOptions[RT_SPIRIT_MQ_LOWER_ADULT] = Option::LogicTrick("Spirit Temple MQ Lower Adult without Fire Arrows"); + mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE] = Option::LogicTrick("Spirit Temple MQ Frozen Eye Switch without Fire"); + mTrickOptions[RT_ICE_BLOCK_GS] = Option::LogicTrick("Ice Cavern Block Room GS with Hover Boots"); + mTrickOptions[RT_ICE_MQ_RED_ICE_GS] = Option::LogicTrick("Ice Cavern MQ Red Ice GS without Song of Time"); + mTrickOptions[RT_ICE_MQ_SCARECROW] = Option::LogicTrick("Ice Cavern MQ Scarecrow GS with No Additional Items"); + mTrickOptions[RT_LENS_GTG] = Option::LogicTrick("Gerudo Training Ground without Lens of Truth"); + mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT] = Option::LogicTrick("Gerudo Training Ground Left Side Silver Rupees without Hookshot"); + mTrickOptions[RT_GTG_FAKE_WALL] = Option::LogicTrick("Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots"); + mTrickOptions[RT_LENS_GTG_MQ] = Option::LogicTrick("Gerudo Training Ground MQ without Lens of Truth"); + mTrickOptions[RT_GTG_MQ_WITH_HOOKSHOT] = Option::LogicTrick("Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot"); + mTrickOptions[RT_GTG_MQ_WIHTOUT_HOOKSHOT] = Option::LogicTrick("Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot"); + mTrickOptions[RT_LENS_GANON] = Option::LogicTrick("Ganon\'s Castle without Lens of Truth"); + mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT] = Option::LogicTrick("Spirit Trial without Hookshot"); + mTrickOptions[RT_LENS_GANON_MQ] = Option::LogicTrick("Ganon\'s Castle MQ without Lens of Truth"); + mTrickOptions[RT_GANON_MQ_FIRE_TRIAL] = Option::LogicTrick("Fire Trial MQ with Hookshot"); + mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL] = Option::LogicTrick("Shadow Trial MQ Torch with Bow"); + mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL] = Option::LogicTrick("Light Trial MQ without Hookshot"); mOptionGroups[RSG_LOGIC] = OptionGroup::SubGroup("Logic Options", { &mOptions[RSK_LOGIC_RULES], @@ -548,6 +548,11 @@ void Settings::CreateOptions() { &mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL], &mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL], }, false); + int i = 0; + for (const auto trick : mOptionGroups[RSG_TRICKS].GetOptions()) { + mTrickNameToEnum[std::string(trick->GetName())] = static_cast(i); + i++; + } // TODO: Glitches mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", { &mOptions[RSK_FOREST], @@ -1686,18 +1691,20 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio mOptions[RSK_LINKS_POCKET].SetSelectedIndex(RO_LINKS_POCKET_DUNGEON_REWARD); } - ctx->AddExcludedOptions(); - for (const auto locationKey : ctx->everyPossibleLocation) { - if (const auto location = ctx->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) { - location->GetExcludedOption()->SetSelectedIndex(1); - } else { - location->GetExcludedOption()->SetSelectedIndex(0); + if (!ctx->IsSpoilerLoaded()) { + ctx->AddExcludedOptions(); + for (const auto locationKey : ctx->everyPossibleLocation) { + if (const auto location = ctx->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) { + location->GetExcludedOption()->SetSelectedIndex(1); + } else { + location->GetExcludedOption()->SetSelectedIndex(0); + } + } + // Tricks + ResetTrickOptions(); + for (const auto randomizerTrick : enabledTricks) { + mTrickOptions[randomizerTrick].SetSelectedIndex(1); } - } - // Tricks - ResetTrickOptions(); - for (const auto randomizerTrick : enabledTricks) { - mTrickOptions[randomizerTrick].SetSelectedIndex(1); } if (!mOptions[RSK_SHUFFLE_KOKIRI_SWORD]) { if (mOptions[RSK_STARTING_KOKIRI_SWORD]) { @@ -2197,12 +2204,13 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { } break; // Uses Ammo Drops option for now. "Off" not yet implemented + // TODO: Change to Ammo Drops case RSK_ENABLE_BOMBCHU_DROPS: - if (it.value() == "On") { + if (it.value() == "Yes") { mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON); - } else if (it.value() == "On + Bombchu") { - mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON_PLUS_BOMBCHU); - } else if (it.value() == "Off") { + // } else if (it.value() == "On + Bombchu") { + // mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON_PLUS_BOMBCHU); + } else if (it.value() == "No") { mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_OFF); } break; @@ -2484,8 +2492,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { nlohmann::json enabledTricksJson = spoilerFileJson["enabledTricks"]; for (auto it = enabledTricksJson.begin(); it != enabledTricksJson.end(); ++it) { - std::string numericValueString = it.value(); - const auto rt = static_cast(std::stoi(numericValueString)); + const RandomizerTrick rt = mTrickNameToEnum[it.value()]; GetTrickOption(rt).SetSelectedIndex(RO_GENERIC_ON); } } diff --git a/soh/soh/Enhancements/randomizer/settings.h b/soh/soh/Enhancements/randomizer/settings.h index 90c45e698..fbd2adacc 100644 --- a/soh/soh/Enhancements/randomizer/settings.h +++ b/soh/soh/Enhancements/randomizer/settings.h @@ -191,5 +191,6 @@ class Settings { std::string mHash; std::string mSeedString; uint32_t mFinalSeed = 0; + std::unordered_map mTrickNameToEnum; }; } // namespace Rando diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 194395d3b..ac7d2aa29 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1025,10 +1025,10 @@ void FileChoose_UpdateRandomizer() { if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0 || !(Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) && SpoilerFileExists(CVarGetString("gSpoilerLog", "")) && !fileSelectSpoilerFileLoaded) { - const char* fileLoc = CVarGetString("gSpoilerLog", ""); if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0) { CVarSetString("gSpoilerLog", CVarGetString("gRandomizerDroppedFile", "")); } + const char* fileLoc = CVarGetString("gSpoilerLog", ""); CVarSetInteger("gRandomizerNewFileDropped", 0); CVarSetString("gRandomizerDroppedFile", ""); Randomizer_ParseSpoiler(fileLoc);