Fixes some Spoiler Parsing Bugs (#3759)

* Fixes bug causing dropped spoiler not to be parsed.

* Fixes bugs with parsing enabled tricks

* Fixes bugs with parsing excluded locations.

* Fixes bugs parsing the Bombchu Drops setting
This commit is contained in:
Christopher Leggett 2023-12-30 12:10:31 -05:00 committed by GitHub
commit dbb1e60734
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 203 additions and 193 deletions

View file

@ -616,7 +616,7 @@ namespace Logic {
FoundBombchus = (BombchuDrop || Bombchus || Bombchus5 || Bombchus10 || Bombchus20); FoundBombchus = (BombchuDrop || Bombchus || Bombchus5 || Bombchus10 || Bombchus20);
CanPlayBowling = (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && FoundBombchus) || (!ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && BombBag); 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 // 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); HasExplosives = Bombs || (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && HasBombchus);

View file

@ -437,7 +437,7 @@ static void WriteEnabledTricks(tinyxml2::XMLDocument& spoilerLog) {
if (setting->GetSelectedOptionIndex() != RO_GENERIC_ON/* || !setting->IsCategory(OptionCategory::Setting)*/) { if (setting->GetSelectedOptionIndex() != RO_GENERIC_ON/* || !setting->IsCategory(OptionCategory::Setting)*/) {
continue; 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"); //auto node = parentNode->InsertNewChildElement("trick");
//node->SetAttribute("name", RemoveLineBreaks(setting->GetName()).c_str()); //node->SetAttribute("name", RemoveLineBreaks(setting->GetName()).c_str());
} }

View file

@ -16,6 +16,8 @@ namespace Rando {
std::weak_ptr<Context> Context::mContext; std::weak_ptr<Context> Context::mContext;
Context::Context() { Context::Context() {
StaticData::InitItemTable();
StaticData::InitLocationTable();
for (auto& location : StaticData::GetLocationTable()) { for (auto& location : StaticData::GetLocationTable()) {
mSpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck(); mSpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck();
} }

View file

@ -3641,9 +3641,9 @@ typedef enum {
//Ammo drop settings (on, "on+bombchu", off) //Ammo drop settings (on, "on+bombchu", off)
typedef enum { typedef enum {
RO_AMMO_DROPS_ON,
RO_AMMO_DROPS_ON_PLUS_BOMBCHU,
RO_AMMO_DROPS_OFF, RO_AMMO_DROPS_OFF,
//RO_AMMO_DROPS_ON_PLUS_BOMBCHU,
RO_AMMO_DROPS_ON,
} RandoOptionAmmoDrops; } RandoOptionAmmoDrops;
typedef enum { typedef enum {

View file

@ -197,177 +197,177 @@ void Settings::CreateOptions() {
mExcludeLocationsOptionsGroups.reserve(SPOILER_COLLECTION_GROUP_COUNT); mExcludeLocationsOptionsGroups.reserve(SPOILER_COLLECTION_GROUP_COUNT);
mTrickOptions[RT_VISIBLE_COLLISION] = Option::LogicTrick(std::to_string(RT_VISIBLE_COLLISION)); mTrickOptions[RT_VISIBLE_COLLISION] = Option::LogicTrick("Pass Through Visible One-Way Collision");
mTrickOptions[RT_GROTTOS_WITHOUT_AGONY] = Option::LogicTrick(std::to_string(RT_GROTTOS_WITHOUT_AGONY)); mTrickOptions[RT_GROTTOS_WITHOUT_AGONY] = Option::LogicTrick("Hidden Grottos without Stone of Agony");
mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS] = Option::LogicTrick(std::to_string(RT_FEWER_TUNIC_REQUIREMENTS)); mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS] = Option::LogicTrick("Fewer Tunic Requirements");
mTrickOptions[RT_RUSTED_SWITCHES] = Option::LogicTrick(std::to_string(RT_RUSTED_SWITCHES)); mTrickOptions[RT_RUSTED_SWITCHES] = Option::LogicTrick("Hammer Rusted Switches Through Walls");
mTrickOptions[RT_FLAMING_CHESTS] = Option::LogicTrick(std::to_string(RT_FLAMING_CHESTS)); mTrickOptions[RT_FLAMING_CHESTS] = Option::LogicTrick("Flaming Chests");
mTrickOptions[RT_BUNNY_HOOD_JUMPS] = Option::LogicTrick(std::to_string(RT_BUNNY_HOOD_JUMPS)); mTrickOptions[RT_BUNNY_HOOD_JUMPS] = Option::LogicTrick("Bunny Hood Jumps");
mTrickOptions[RT_DAMAGE_BOOST_SIMPLE] = Option::LogicTrick(std::to_string(RT_DAMAGE_BOOST_SIMPLE)); mTrickOptions[RT_DAMAGE_BOOST_SIMPLE] = Option::LogicTrick("Simple damage boosts");
mTrickOptions[RT_HOVER_BOOST_SIMPLE] = Option::LogicTrick(std::to_string(RT_HOVER_BOOST_SIMPLE)); mTrickOptions[RT_HOVER_BOOST_SIMPLE] = Option::LogicTrick("Simple hover boosts");
mTrickOptions[RT_KF_ADULT_GS] = Option::LogicTrick(std::to_string(RT_KF_ADULT_GS)); mTrickOptions[RT_KF_ADULT_GS] = Option::LogicTrick("Adult Kokiri Forest GS with Hover Boots");
mTrickOptions[RT_LW_BRIDGE] = Option::LogicTrick(std::to_string(RT_LW_BRIDGE)); mTrickOptions[RT_LW_BRIDGE] = Option::LogicTrick("Jump onto the Lost Woods Bridge as Adult with Nothing");
mTrickOptions[RT_LW_MIDO_BACKFLIP] = Option::LogicTrick(std::to_string(RT_LW_MIDO_BACKFLIP)); mTrickOptions[RT_LW_MIDO_BACKFLIP] = Option::LogicTrick("Backflip over Mido as Adult");
mTrickOptions[RT_LW_GS_BEAN] = Option::LogicTrick(std::to_string(RT_LW_GS_BEAN)); mTrickOptions[RT_LW_GS_BEAN] = Option::LogicTrick("Lost Woods Adult GS without Bean");
mTrickOptions[RT_HC_STORMS_GS] = Option::LogicTrick(std::to_string(RT_HC_STORMS_GS)); mTrickOptions[RT_HC_STORMS_GS] = Option::LogicTrick("Hyrule Castle Storms Grotto GS with Just Boomerang");
mTrickOptions[RT_KAK_MAN_ON_ROOF] = Option::LogicTrick(std::to_string(RT_KAK_MAN_ON_ROOF)); mTrickOptions[RT_KAK_MAN_ON_ROOF] = Option::LogicTrick("Man on Roof without Hookshot");
mTrickOptions[RT_KAK_TOWER_GS] = Option::LogicTrick(std::to_string(RT_KAK_TOWER_GS)); mTrickOptions[RT_KAK_TOWER_GS] = Option::LogicTrick("Kakariko Tower GS with Jump Slash");
mTrickOptions[RT_KAK_ADULT_WINDMILL_POH] = Option::LogicTrick(std::to_string(RT_KAK_ADULT_WINDMILL_POH)); mTrickOptions[RT_KAK_ADULT_WINDMILL_POH] = Option::LogicTrick("Windmill PoH as Adult with Nothing");
mTrickOptions[RT_KAK_CHILD_WINDMILL_POH] = Option::LogicTrick(std::to_string(RT_KAK_CHILD_WINDMILL_POH)); mTrickOptions[RT_KAK_CHILD_WINDMILL_POH] = Option::LogicTrick("Windmill PoH as Child with Precise Jump Slash");
mTrickOptions[RT_KAK_ROOFTOP_GS] = Option::LogicTrick(std::to_string(RT_KAK_ROOFTOP_GS)); mTrickOptions[RT_KAK_ROOFTOP_GS] = Option::LogicTrick("Kakariko Rooftop GS with Hover Boots");
mTrickOptions[RT_GY_POH] = Option::LogicTrick(std::to_string(RT_GY_POH)); mTrickOptions[RT_GY_POH] = Option::LogicTrick("Graveyard Freestanding PoH with Boomerang");
mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH] = Option::LogicTrick(std::to_string(RT_GY_CHILD_DAMPE_RACE_POH)); mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH] = Option::LogicTrick("Second Dampe Race as Child");
mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS] = Option::LogicTrick(std::to_string(RT_GY_SHADOW_FIRE_ARROWS)); mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS] = Option::LogicTrick("Shadow Temple Entry with Fire Arrows");
mTrickOptions[RT_DMT_SOIL_GS] = Option::LogicTrick(std::to_string(RT_DMT_SOIL_GS)); mTrickOptions[RT_DMT_SOIL_GS] = Option::LogicTrick("Death Mountain Trail Soil GS without Destroying Boulder");
mTrickOptions[RT_DMT_BOMBABLE] = Option::LogicTrick(std::to_string(RT_DMT_BOMBABLE)); mTrickOptions[RT_DMT_BOMBABLE] = Option::LogicTrick("Death Mountain Trail Chest with Strength");
mTrickOptions[RT_DMT_HOOKSHOT_LOWER_GS] = Option::LogicTrick(std::to_string(RT_DMT_HOOKSHOT_LOWER_GS)); 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(std::to_string(RT_DMT_HOVERS_LOWER_GS)); 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(std::to_string(RT_DMT_BEAN_LOWER_GS)); 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(std::to_string(RT_DMT_JS_LOWER_GS)); 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(std::to_string(RT_DMT_CLIMB_HOVERS)); mTrickOptions[RT_DMT_CLIMB_HOVERS] = Option::LogicTrick("Death Mountain Trail Climb with Hover Boots");
mTrickOptions[RT_DMT_UPPER_GS] = Option::LogicTrick(std::to_string(RT_DMT_UPPER_GS)); mTrickOptions[RT_DMT_UPPER_GS] = Option::LogicTrick("Death Mountain Trail Upper Red Rock GS without Hammer");
mTrickOptions[RT_DMT_BOLERO_BIGGORON] = Option::LogicTrick(std::to_string(RT_DMT_BOLERO_BIGGORON)); mTrickOptions[RT_DMT_BOLERO_BIGGORON] = Option::LogicTrick("Deliver Eye Drops with Bolero of Fire");
mTrickOptions[RT_GC_POT] = Option::LogicTrick(std::to_string(RT_GC_POT)); mTrickOptions[RT_GC_POT] = Option::LogicTrick("Goron City Spinning Pot PoH with Bombchu");
mTrickOptions[RT_GC_POT_STRENGTH] = Option::LogicTrick(std::to_string(RT_GC_POT_STRENGTH)); mTrickOptions[RT_GC_POT_STRENGTH] = Option::LogicTrick("Goron City Spinning Pot PoH with Strength");
mTrickOptions[RT_GC_ROLLING_STRENGTH] = Option::LogicTrick(std::to_string(RT_GC_ROLLING_STRENGTH)); mTrickOptions[RT_GC_ROLLING_STRENGTH] = Option::LogicTrick("Rolling Goron (Hot Rodder Goron) as Child with Strength");
mTrickOptions[RT_GC_LEFTMOST] = Option::LogicTrick(std::to_string(RT_GC_LEFTMOST)); mTrickOptions[RT_GC_LEFTMOST] = Option::LogicTrick("Goron City Maze Left Chest with Hover Boots");
mTrickOptions[RT_GC_GROTTO] = Option::LogicTrick(std::to_string(RT_GC_GROTTO)); mTrickOptions[RT_GC_GROTTO] = Option::LogicTrick("Goron City Grotto with Hookshot While Taking Damage");
mTrickOptions[RT_GC_LINK_GORON_DINS] = Option::LogicTrick(std::to_string(RT_GC_LINK_GORON_DINS)); mTrickOptions[RT_GC_LINK_GORON_DINS] = Option::LogicTrick("Stop Link the Goron with Din\'s Fire");
mTrickOptions[RT_DMC_HOVER_BEAN_POH] = Option::LogicTrick(std::to_string(RT_DMC_HOVER_BEAN_POH)); mTrickOptions[RT_DMC_HOVER_BEAN_POH] = Option::LogicTrick("Crater\'s Bean PoH with Hover Boots");
mTrickOptions[RT_DMC_BOLERO_JUMP] = Option::LogicTrick(std::to_string(RT_DMC_BOLERO_JUMP)); mTrickOptions[RT_DMC_BOLERO_JUMP] = Option::LogicTrick("Death Mountain Crater Jump to Bolero");
mTrickOptions[RT_DMC_BOULDER_JS] = Option::LogicTrick(std::to_string(RT_DMC_BOULDER_JS)); mTrickOptions[RT_DMC_BOULDER_JS] = Option::LogicTrick("Death Mountain Crater Upper to Lower with Hammer");
mTrickOptions[RT_DMC_BOULDER_SKIP] = Option::LogicTrick(std::to_string(RT_DMC_BOULDER_SKIP)); mTrickOptions[RT_DMC_BOULDER_SKIP] = Option::LogicTrick("Death Mountain Crater Upper to Lower Boulder Skip");
mTrickOptions[RT_ZR_LOWER] = Option::LogicTrick(std::to_string(RT_ZR_LOWER)); mTrickOptions[RT_ZR_LOWER] = Option::LogicTrick("Zora\'s River Lower Freestanding PoH as Adult with Nothing");
mTrickOptions[RT_ZR_UPPER] = Option::LogicTrick(std::to_string(RT_ZR_UPPER)); mTrickOptions[RT_ZR_UPPER] = Option::LogicTrick("Zora\'s River Upper Freestanding PoH as Adult with Nothing");
mTrickOptions[RT_ZR_HOVERS] = Option::LogicTrick(std::to_string(RT_ZR_HOVERS)); mTrickOptions[RT_ZR_HOVERS] = Option::LogicTrick("Zora\'s Domain Entry with Hover Boots");
mTrickOptions[RT_ZR_CUCCO] = Option::LogicTrick(std::to_string(RT_ZR_CUCCO)); mTrickOptions[RT_ZR_CUCCO] = Option::LogicTrick("Zora\'s Domain Entry with Cucco");
mTrickOptions[RT_ZD_KING_ZORA_SKIP] = Option::LogicTrick(std::to_string(RT_ZD_KING_ZORA_SKIP)); mTrickOptions[RT_ZD_KING_ZORA_SKIP] = Option::LogicTrick("Skip King Zora as Adult with Nothing");
mTrickOptions[RT_ZD_GS] = Option::LogicTrick(std::to_string(RT_ZD_GS)); mTrickOptions[RT_ZD_GS] = Option::LogicTrick("Zora\'s Domain GS with No Additional Items");
mTrickOptions[RT_LH_LAB_WALL_GS] = Option::LogicTrick(std::to_string(RT_LH_LAB_WALL_GS)); mTrickOptions[RT_LH_LAB_WALL_GS] = Option::LogicTrick("Lake Hylia Lab Wall GS with Jump Slash");
mTrickOptions[RT_LH_LAB_DIVING] = Option::LogicTrick(std::to_string(RT_LH_LAB_DIVING)); mTrickOptions[RT_LH_LAB_DIVING] = Option::LogicTrick("Lake Hylia Lab Dive without Gold Scale");
mTrickOptions[RT_LH_WATER_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_LH_WATER_HOOKSHOT)); mTrickOptions[RT_LH_WATER_HOOKSHOT] = Option::LogicTrick("Water Temple Entry without Iron Boots using Hookshot");
mTrickOptions[RT_GV_CRATE_HOVERS] = Option::LogicTrick(std::to_string(RT_GV_CRATE_HOVERS)); mTrickOptions[RT_GV_CRATE_HOVERS] = Option::LogicTrick("Gerudo Valley Crate PoH as Adult with Hover Boots");
mTrickOptions[RT_GF_KITCHEN] = Option::LogicTrick(std::to_string(RT_GF_KITCHEN)); mTrickOptions[RT_GF_KITCHEN] = Option::LogicTrick("Thieves\' Hideout \"Kitchen\" with No Additional Items");
mTrickOptions[RT_GF_JUMP] = Option::LogicTrick(std::to_string(RT_GF_JUMP)); mTrickOptions[RT_GF_JUMP] = Option::LogicTrick("Gerudo\'s Fortress Ledge Jumps");
mTrickOptions[RT_HW_BUNNY_CROSSING] = Option::LogicTrick(std::to_string(RT_HW_BUNNY_CROSSING)); mTrickOptions[RT_HW_BUNNY_CROSSING] = Option::LogicTrick("Wasteland Crossing with Bunny Hood");
mTrickOptions[RT_HW_CROSSING] = Option::LogicTrick(std::to_string(RT_HW_CROSSING)); mTrickOptions[RT_HW_CROSSING] = Option::LogicTrick("Wasteland Crossing without Hover Boots or Longshot");
mTrickOptions[RT_LENS_HW] = Option::LogicTrick(std::to_string(RT_LENS_HW)); mTrickOptions[RT_LENS_HW] = Option::LogicTrick("Lensless Wasteland");
mTrickOptions[RT_HW_REVERSE] = Option::LogicTrick(std::to_string(RT_HW_REVERSE)); mTrickOptions[RT_HW_REVERSE] = Option::LogicTrick("Reverse Wasteland");
mTrickOptions[RT_COLOSSUS_GS] = Option::LogicTrick(std::to_string(RT_COLOSSUS_GS)); mTrickOptions[RT_COLOSSUS_GS] = Option::LogicTrick("Colossus Hill GS with Hookshot");
mTrickOptions[RT_DEKU_BASEMENT_GS] = Option::LogicTrick(std::to_string(RT_DEKU_BASEMENT_GS)); mTrickOptions[RT_DEKU_BASEMENT_GS] = Option::LogicTrick("Deku Tree Basement Vines GS with Jump Slash");
mTrickOptions[RT_DEKU_B1_SKIP] = Option::LogicTrick(std::to_string(RT_DEKU_B1_SKIP)); mTrickOptions[RT_DEKU_B1_SKIP] = Option::LogicTrick("Deku Tree Basement without Slingshot");
mTrickOptions[RT_DEKU_B1_BOW_WEBS] = Option::LogicTrick(std::to_string(RT_DEKU_B1_BOW_WEBS)); mTrickOptions[RT_DEKU_B1_BOW_WEBS] = Option::LogicTrick("Deku Tree Basement Web to Gohma with Bow");
mTrickOptions[RT_DEKU_MQ_COMPASS_GS] = Option::LogicTrick(std::to_string(RT_DEKU_MQ_COMPASS_GS)); 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(std::to_string(RT_DEKU_MQ_LOG)); mTrickOptions[RT_DEKU_MQ_LOG] = Option::LogicTrick("Deku Tree MQ Roll Under the Spiked Log");
mTrickOptions[RT_DC_SCARECROW_GS] = Option::LogicTrick(std::to_string(RT_DC_SCARECROW_GS)); mTrickOptions[RT_DC_SCARECROW_GS] = Option::LogicTrick("Dodongo\'s Cavern Scarecrow GS with Armos Statue");
mTrickOptions[RT_DC_VINES_GS] = Option::LogicTrick(std::to_string(RT_DC_VINES_GS)); mTrickOptions[RT_DC_VINES_GS] = Option::LogicTrick("Dodongo\'s Cavern Vines GS from Below with Longshot");
mTrickOptions[RT_DC_STAIRCASE] = Option::LogicTrick(std::to_string(RT_DC_STAIRCASE)); mTrickOptions[RT_DC_STAIRCASE] = Option::LogicTrick("Dodongo\'s Cavern Staircase with Bow");
mTrickOptions[RT_DC_SLINGSHOT_SKIP] = Option::LogicTrick(std::to_string(RT_DC_SLINGSHOT_SKIP)); mTrickOptions[RT_DC_SLINGSHOT_SKIP] = Option::LogicTrick("Dodongo\'s Cavern Child Slingshot Skips");
mTrickOptions[RT_DC_SCRUB_ROOM] = Option::LogicTrick(std::to_string(RT_DC_SCRUB_ROOM)); mTrickOptions[RT_DC_SCRUB_ROOM] = Option::LogicTrick("Dodongo\'s Cavern Two Scrub Room with Strength");
mTrickOptions[RT_DC_JUMP] = Option::LogicTrick(std::to_string(RT_DC_JUMP)); mTrickOptions[RT_DC_JUMP] = Option::LogicTrick("Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots");
mTrickOptions[RT_DC_HAMMER_FLOOR] = Option::LogicTrick(std::to_string(RT_DC_HAMMER_FLOOR)); mTrickOptions[RT_DC_HAMMER_FLOOR] = Option::LogicTrick("Dodongo\'s Cavern Smash the Boss Lobby Floor");
mTrickOptions[RT_DC_MQ_CHILD_BOMBS] = Option::LogicTrick(std::to_string(RT_DC_MQ_CHILD_BOMBS)); 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(std::to_string(RT_DC_MQ_CHILD_EYES)); 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(std::to_string(RT_DC_MQ_ADULT_EYES)); 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(std::to_string(RT_JABU_ALCOVE_JUMP_DIVE)); mTrickOptions[RT_JABU_ALCOVE_JUMP_DIVE] = Option::LogicTrick("Jabu Underwater Alcove as Adult with Jump Dive");
mTrickOptions[RT_JABU_BOSS_HOVER] = Option::LogicTrick(std::to_string(RT_JABU_BOSS_HOVER)); mTrickOptions[RT_JABU_BOSS_HOVER] = Option::LogicTrick("Jabu Near Boss Room with Hover Boots");
mTrickOptions[RT_JABU_NEAR_BOSS_RANGED] = Option::LogicTrick(std::to_string(RT_JABU_NEAR_BOSS_RANGED)); 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(std::to_string(RT_JABU_NEAR_BOSS_EXPLOSIVES)); mTrickOptions[RT_JABU_NEAR_BOSS_EXPLOSIVES] = Option::LogicTrick("Jabu Near Boss Ceiling Switch with Explosives");
mTrickOptions[RT_LENS_JABU_MQ] = Option::LogicTrick(std::to_string(RT_LENS_JABU_MQ)); mTrickOptions[RT_LENS_JABU_MQ] = Option::LogicTrick("Jabu MQ without Lens of Truth");
mTrickOptions[RT_JABU_MQ_RANG_JUMP] = Option::LogicTrick(std::to_string(RT_JABU_MQ_RANG_JUMP)); mTrickOptions[RT_JABU_MQ_RANG_JUMP] = Option::LogicTrick("Jabu MQ Compass Chest with Boomerang");
mTrickOptions[RT_JABU_MQ_SOT_GS] = Option::LogicTrick(std::to_string(RT_JABU_MQ_SOT_GS)); mTrickOptions[RT_JABU_MQ_SOT_GS] = Option::LogicTrick("Jabu MQ Song of Time Block GS with Boomerang");
mTrickOptions[RT_LENS_BOTW] = Option::LogicTrick(std::to_string(RT_LENS_BOTW)); mTrickOptions[RT_LENS_BOTW] = Option::LogicTrick("Bottom of the Well without Lens of Truth");
mTrickOptions[RT_BOTW_CHILD_DEADHAND] = Option::LogicTrick(std::to_string(RT_BOTW_CHILD_DEADHAND)); mTrickOptions[RT_BOTW_CHILD_DEADHAND] = Option::LogicTrick("Child Dead Hand without Kokiri Sword");
mTrickOptions[RT_BOTW_BASEMENT] = Option::LogicTrick(std::to_string(RT_BOTW_BASEMENT)); mTrickOptions[RT_BOTW_BASEMENT] = Option::LogicTrick("Bottom of the Well Map Chest with Strength & Sticks");
mTrickOptions[RT_BOTW_MQ_PITS] = Option::LogicTrick(std::to_string(RT_BOTW_MQ_PITS)); mTrickOptions[RT_BOTW_MQ_PITS] = Option::LogicTrick("Bottom of the Well MQ Jump Over the Pits");
mTrickOptions[RT_BOTW_MQ_DEADHAND_KEY] = Option::LogicTrick(std::to_string(RT_BOTW_MQ_DEADHAND_KEY)); 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(std::to_string(RT_FOREST_FIRST_GS)); 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(std::to_string(RT_FOREST_OUTDOORS_EAST_GS)); mTrickOptions[RT_FOREST_OUTDOORS_EAST_GS] = Option::LogicTrick("Forest Temple East Courtyard GS with Boomerang");
mTrickOptions[RT_FOREST_VINES] = Option::LogicTrick(std::to_string(RT_FOREST_VINES)); mTrickOptions[RT_FOREST_VINES] = Option::LogicTrick("Forest Temple East Courtyard Vines with Hookshot");
mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = Option::LogicTrick(std::to_string(RT_FOREST_OUTDOORS_LEDGE)); mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = Option::LogicTrick("Forest Temple NE Outdoors Ledge with Hover Boots");
mTrickOptions[RT_FOREST_DOORFRAME] = Option::LogicTrick(std::to_string(RT_FOREST_DOORFRAME)); mTrickOptions[RT_FOREST_DOORFRAME] = Option::LogicTrick("Forest Temple East Courtyard Door Frame with Hover Boots");
mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = Option::LogicTrick(std::to_string(RT_FOREST_OUTSIDE_BACKDOOR)); mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = Option::LogicTrick("Forest Temple Outside Backdoor with Jump Slash");
mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_WELL_SWIM)); mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = Option::LogicTrick("Swim Through Forest Temple MQ Well with Hookshot");
mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = Option::LogicTrick(std::to_string(RT_FOREST_MQ_BLOCK_PUZZLE)); 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(std::to_string(RT_FOREST_MQ_JS_HALLWAY_SWITCH)); 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(std::to_string(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH)); 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(std::to_string(RT_FOREST_MQ_RANG_HALLWAY_SWITCH)); 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(std::to_string(RT_FIRE_BOSS_DOOR_JUMP)); mTrickOptions[RT_FIRE_BOSS_DOOR_JUMP] = Option::LogicTrick("Fire Temple Boss Door without Hover Boots or Pillar");
mTrickOptions[RT_FIRE_SOT] = Option::LogicTrick(std::to_string(RT_FIRE_SOT)); mTrickOptions[RT_FIRE_SOT] = Option::LogicTrick("Fire Temple Song of Time Room GS without Song of Time");
mTrickOptions[RT_FIRE_STRENGTH] = Option::LogicTrick(std::to_string(RT_FIRE_STRENGTH)); mTrickOptions[RT_FIRE_STRENGTH] = Option::LogicTrick("Fire Temple Climb without Strength");
mTrickOptions[RT_FIRE_SCARECROW] = Option::LogicTrick(std::to_string(RT_FIRE_SCARECROW)); mTrickOptions[RT_FIRE_SCARECROW] = Option::LogicTrick("Fire Temple East Tower without Scarecrow\'s Song");
mTrickOptions[RT_FIRE_FLAME_MAZE] = Option::LogicTrick(std::to_string(RT_FIRE_FLAME_MAZE)); mTrickOptions[RT_FIRE_FLAME_MAZE] = Option::LogicTrick("Fire Temple Flame Wall Maze Skip");
mTrickOptions[RT_FIRE_MQ_NEAR_BOSS] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_NEAR_BOSS)); 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(std::to_string(RT_FIRE_MQ_BLOCKED_CHEST)); 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(std::to_string(RT_FIRE_MQ_BK_CHEST)); mTrickOptions[RT_FIRE_MQ_BK_CHEST] = Option::LogicTrick("Fire Temple MQ Boss Key Chest without Bow");
mTrickOptions[RT_FIRE_MQ_CLIMB] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_CLIMB)); mTrickOptions[RT_FIRE_MQ_CLIMB] = Option::LogicTrick("Fire Temple MQ Climb without Fire Source");
mTrickOptions[RT_FIRE_MQ_MAZE_SIDE_ROOM] = Option::LogicTrick(std::to_string(RT_FIRE_MQ_MAZE_SIDE_ROOM)); 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(std::to_string(RT_FIRE_MQ_MAZE_HOVERS)); 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(std::to_string(RT_FIRE_MQ_MAZE_JUMP)); 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(std::to_string(RT_FIRE_MQ_ABOVE_MAZE_GS)); 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(std::to_string(RT_FIRE_MQ_FLAME_MAZE)); mTrickOptions[RT_FIRE_MQ_FLAME_MAZE] = Option::LogicTrick("Fire Temple MQ Flame Wall Maze Skip");
mTrickOptions[RT_WATER_LONGSHOT_TORCH] = Option::LogicTrick(std::to_string(RT_WATER_LONGSHOT_TORCH)); mTrickOptions[RT_WATER_LONGSHOT_TORCH] = Option::LogicTrick("Water Temple Torch Longshot");
mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS] = Option::LogicTrick(std::to_string(RT_WATER_CRACKED_WALL_HOVERS)); mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS] = Option::LogicTrick("Water Temple Cracked Wall with Hover Boots");
mTrickOptions[RT_WATER_CRACKED_WALL] = Option::LogicTrick(std::to_string(RT_WATER_CRACKED_WALL)); mTrickOptions[RT_WATER_CRACKED_WALL] = Option::LogicTrick("Water Temple Cracked Wall with No Additional Items");
mTrickOptions[RT_WATER_BK_REGION] = Option::LogicTrick(std::to_string(RT_WATER_BK_REGION)); mTrickOptions[RT_WATER_BK_REGION] = Option::LogicTrick("Water Temple Boss Key Region with Hover Boots");
mTrickOptions[RT_WATER_NORTH_BASEMENT_LEDGE_JUMP] = Option::LogicTrick(std::to_string(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP)); 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(std::to_string(RT_WATER_BK_JUMP_DIVE)); mTrickOptions[RT_WATER_BK_JUMP_DIVE] = Option::LogicTrick("Water Temple Boss Key Jump Dive");
mTrickOptions[RT_WATER_FW_CENTRAL_GS] = Option::LogicTrick(std::to_string(RT_WATER_FW_CENTRAL_GS)); 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(std::to_string(RT_WATER_IRONS_CENTRAL_GS)); mTrickOptions[RT_WATER_IRONS_CENTRAL_GS] = Option::LogicTrick("Water Temple Central Pillar GS with Iron Boots");
mTrickOptions[RT_WATER_CENTRAL_BOW] = Option::LogicTrick(std::to_string(RT_WATER_CENTRAL_BOW)); 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(std::to_string(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS)); 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(std::to_string(RT_WATER_RANG_FALLING_PLATFORM_GS)); mTrickOptions[RT_WATER_RANG_FALLING_PLATFORM_GS] = Option::LogicTrick("Water Temple Falling Platform Room GS with Boomerang");
mTrickOptions[RT_WATER_RIVER_GS] = Option::LogicTrick(std::to_string(RT_WATER_RIVER_GS)); mTrickOptions[RT_WATER_RIVER_GS] = Option::LogicTrick("Water Temple River GS without Iron Boots");
mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE] = Option::LogicTrick(std::to_string(RT_WATER_DRAGON_JUMP_DIVE)); mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE] = Option::LogicTrick("Water Temple Dragon Statue Jump Dive");
mTrickOptions[RT_WATER_ADULT_DRAGON] = Option::LogicTrick(std::to_string(RT_WATER_ADULT_DRAGON)); 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(std::to_string(RT_WATER_CHILD_DRAGON)); 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(std::to_string(RT_WATER_MQ_CENTRAL_PILLAR)); mTrickOptions[RT_WATER_MQ_CENTRAL_PILLAR] = Option::LogicTrick("Water Temple MQ Central Pillar with Fire Arrows");
mTrickOptions[RT_WATER_MQ_LOCKED_GS] = Option::LogicTrick(std::to_string(RT_WATER_MQ_LOCKED_GS)); mTrickOptions[RT_WATER_MQ_LOCKED_GS] = Option::LogicTrick("Water Temple MQ North Basement GS without Small Key");
mTrickOptions[RT_LENS_SHADOW] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW)); mTrickOptions[RT_LENS_SHADOW] = Option::LogicTrick("Shadow Temple Stationary Objects without Lens of Truth");
mTrickOptions[RT_LENS_SHADOW_PLATFORM] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_PLATFORM)); mTrickOptions[RT_LENS_SHADOW_PLATFORM] = Option::LogicTrick("Shadow Temple Invisible Moving Platform without Lens of Truth");
mTrickOptions[RT_LENS_BONGO] = Option::LogicTrick(std::to_string(RT_LENS_BONGO)); mTrickOptions[RT_LENS_BONGO] = Option::LogicTrick("Shadow Temple Bongo Bongo without Lens of Truth");
mTrickOptions[RT_SHADOW_UMBRELLA] = Option::LogicTrick(std::to_string(RT_SHADOW_UMBRELLA)); mTrickOptions[RT_SHADOW_UMBRELLA] = Option::LogicTrick("Shadow Temple Stone Umbrella Skip");
mTrickOptions[RT_SHADOW_UMBRELLA_GS] = Option::LogicTrick(std::to_string(RT_SHADOW_UMBRELLA_GS)); mTrickOptions[RT_SHADOW_UMBRELLA_GS] = Option::LogicTrick("Shadow Temple Falling Spikes GS with Hover Boots");
mTrickOptions[RT_SHADOW_FREESTANDING_KEY] = Option::LogicTrick(std::to_string(RT_SHADOW_FREESTANDING_KEY)); mTrickOptions[RT_SHADOW_FREESTANDING_KEY] = Option::LogicTrick("Shadow Temple Freestanding Key with Bombchu");
mTrickOptions[RT_SHADOW_STATUE] = Option::LogicTrick(std::to_string(RT_SHADOW_STATUE)); mTrickOptions[RT_SHADOW_STATUE] = Option::LogicTrick("Shadow Temple River Statue with Bombchu");
mTrickOptions[RT_SHADOW_BONGO] = Option::LogicTrick(std::to_string(RT_SHADOW_BONGO)); mTrickOptions[RT_SHADOW_BONGO] = Option::LogicTrick("Shadow Temple Bongo Bongo without projectiles");
mTrickOptions[RT_LENS_SHADOW_MQ] = Option::LogicTrick(std::to_string(RT_LENS_SHADOW_MQ)); 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(std::to_string(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES)); 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(std::to_string(RT_LENS_SHADOW_MQ_PLATFORM)); 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(std::to_string(RT_LENS_SHADOW_MQ_DEADHAND)); 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(std::to_string(RT_SHADOW_MQ_GAP)); mTrickOptions[RT_SHADOW_MQ_GAP] = Option::LogicTrick("Shadow Temple MQ Truth Spinner Gap with Longshot");
mTrickOptions[RT_SHADOW_MQ_INVISIBLE_BLADES] = Option::LogicTrick(std::to_string(RT_SHADOW_MQ_INVISIBLE_BLADES)); 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(std::to_string(RT_SHADOW_MQ_HUGE_PIT)); 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(std::to_string(RT_SHADOW_MQ_WINDY_WALKWAY)); mTrickOptions[RT_SHADOW_MQ_WINDY_WALKWAY] = Option::LogicTrick("Shadow Temple MQ Windy Walkway Reverse without Hover Boots");
mTrickOptions[RT_LENS_SPIRIT] = Option::LogicTrick(std::to_string(RT_LENS_SPIRIT)); mTrickOptions[RT_LENS_SPIRIT] = Option::LogicTrick("Spirit Temple without Lens of Truth");
mTrickOptions[RT_SPIRIT_CHILD_CHU] = Option::LogicTrick(std::to_string(RT_SPIRIT_CHILD_CHU)); mTrickOptions[RT_SPIRIT_CHILD_CHU] = Option::LogicTrick("Spirit Temple Child Side Bridge with Bombchu");
mTrickOptions[RT_SPIRIT_LOBBY_GS] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOBBY_GS)); mTrickOptions[RT_SPIRIT_LOBBY_GS] = Option::LogicTrick("Spirit Temple Main Room GS with Boomerang");
mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOWER_ADULT_SWITCH)); mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH] = Option::LogicTrick("Spirit Temple Lower Adult Switch with Bombs");
mTrickOptions[RT_SPIRIT_LOBBY_JUMP] = Option::LogicTrick(std::to_string(RT_SPIRIT_LOBBY_JUMP)); mTrickOptions[RT_SPIRIT_LOBBY_JUMP] = Option::LogicTrick("Spirit Temple Main Room Jump from Hands to Upper Ledges");
mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_SPIRIT_PLATFORM_HOOKSHOT)); mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT] = Option::LogicTrick("Spirit Temple Main Room Hookshot to Boss Platform");
mTrickOptions[RT_SPIRIT_MAP_CHEST] = Option::LogicTrick(std::to_string(RT_SPIRIT_MAP_CHEST)); mTrickOptions[RT_SPIRIT_MAP_CHEST] = Option::LogicTrick("Spirit Temple Map Chest with Bow");
mTrickOptions[RT_SPIRIT_SUN_CHEST] = Option::LogicTrick(std::to_string(RT_SPIRIT_SUN_CHEST)); mTrickOptions[RT_SPIRIT_SUN_CHEST] = Option::LogicTrick("Spirit Temple Sun Block Room Chest with Bow");
mTrickOptions[RT_SPIRIT_WALL] = Option::LogicTrick(std::to_string(RT_SPIRIT_WALL)); mTrickOptions[RT_SPIRIT_WALL] = Option::LogicTrick("Spirit Temple Shifting Wall with No Additional Items");
mTrickOptions[RT_LENS_SPIRIT_MQ] = Option::LogicTrick(std::to_string(RT_LENS_SPIRIT_MQ)); mTrickOptions[RT_LENS_SPIRIT_MQ] = Option::LogicTrick("Spirit Temple MQ without Lens of Truth");
mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_SOT] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_SUN_BLOCK_SOT)); 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(std::to_string(RT_SPIRIT_MQ_SUN_BLOCK_GS)); 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(std::to_string(RT_SPIRIT_MQ_LOWER_ADULT)); mTrickOptions[RT_SPIRIT_MQ_LOWER_ADULT] = Option::LogicTrick("Spirit Temple MQ Lower Adult without Fire Arrows");
mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE] = Option::LogicTrick(std::to_string(RT_SPIRIT_MQ_FROZEN_EYE)); mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE] = Option::LogicTrick("Spirit Temple MQ Frozen Eye Switch without Fire");
mTrickOptions[RT_ICE_BLOCK_GS] = Option::LogicTrick(std::to_string(RT_ICE_BLOCK_GS)); mTrickOptions[RT_ICE_BLOCK_GS] = Option::LogicTrick("Ice Cavern Block Room GS with Hover Boots");
mTrickOptions[RT_ICE_MQ_RED_ICE_GS] = Option::LogicTrick(std::to_string(RT_ICE_MQ_RED_ICE_GS)); 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(std::to_string(RT_ICE_MQ_SCARECROW)); mTrickOptions[RT_ICE_MQ_SCARECROW] = Option::LogicTrick("Ice Cavern MQ Scarecrow GS with No Additional Items");
mTrickOptions[RT_LENS_GTG] = Option::LogicTrick(std::to_string(RT_LENS_GTG)); mTrickOptions[RT_LENS_GTG] = Option::LogicTrick("Gerudo Training Ground without Lens of Truth");
mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GTG_WITHOUT_HOOKSHOT)); mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT] = Option::LogicTrick("Gerudo Training Ground Left Side Silver Rupees without Hookshot");
mTrickOptions[RT_GTG_FAKE_WALL] = Option::LogicTrick(std::to_string(RT_GTG_FAKE_WALL)); mTrickOptions[RT_GTG_FAKE_WALL] = Option::LogicTrick("Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots");
mTrickOptions[RT_LENS_GTG_MQ] = Option::LogicTrick(std::to_string(RT_LENS_GTG_MQ)); mTrickOptions[RT_LENS_GTG_MQ] = Option::LogicTrick("Gerudo Training Ground MQ without Lens of Truth");
mTrickOptions[RT_GTG_MQ_WITH_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GTG_MQ_WITH_HOOKSHOT)); 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(std::to_string(RT_GTG_MQ_WIHTOUT_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(std::to_string(RT_LENS_GANON)); mTrickOptions[RT_LENS_GANON] = Option::LogicTrick("Ganon\'s Castle without Lens of Truth");
mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT] = Option::LogicTrick(std::to_string(RT_GANON_SPIRIT_TRIAL_HOOKSHOT)); mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT] = Option::LogicTrick("Spirit Trial without Hookshot");
mTrickOptions[RT_LENS_GANON_MQ] = Option::LogicTrick(std::to_string(RT_LENS_GANON_MQ)); mTrickOptions[RT_LENS_GANON_MQ] = Option::LogicTrick("Ganon\'s Castle MQ without Lens of Truth");
mTrickOptions[RT_GANON_MQ_FIRE_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_FIRE_TRIAL)); mTrickOptions[RT_GANON_MQ_FIRE_TRIAL] = Option::LogicTrick("Fire Trial MQ with Hookshot");
mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_SHADOW_TRIAL)); mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL] = Option::LogicTrick("Shadow Trial MQ Torch with Bow");
mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL] = Option::LogicTrick(std::to_string(RT_GANON_MQ_LIGHT_TRIAL)); mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL] = Option::LogicTrick("Light Trial MQ without Hookshot");
mOptionGroups[RSG_LOGIC] = OptionGroup::SubGroup("Logic Options", { mOptionGroups[RSG_LOGIC] = OptionGroup::SubGroup("Logic Options", {
&mOptions[RSK_LOGIC_RULES], &mOptions[RSK_LOGIC_RULES],
@ -548,6 +548,11 @@ void Settings::CreateOptions() {
&mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL], &mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL],
&mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL], &mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL],
}, false); }, false);
int i = 0;
for (const auto trick : mOptionGroups[RSG_TRICKS].GetOptions()) {
mTrickNameToEnum[std::string(trick->GetName())] = static_cast<RandomizerTrick>(i);
i++;
}
// TODO: Glitches // TODO: Glitches
mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", { mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", {
&mOptions[RSK_FOREST], &mOptions[RSK_FOREST],
@ -1686,18 +1691,20 @@ void Settings::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocatio
mOptions[RSK_LINKS_POCKET].SetSelectedIndex(RO_LINKS_POCKET_DUNGEON_REWARD); mOptions[RSK_LINKS_POCKET].SetSelectedIndex(RO_LINKS_POCKET_DUNGEON_REWARD);
} }
ctx->AddExcludedOptions(); if (!ctx->IsSpoilerLoaded()) {
for (const auto locationKey : ctx->everyPossibleLocation) { ctx->AddExcludedOptions();
if (const auto location = ctx->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) { for (const auto locationKey : ctx->everyPossibleLocation) {
location->GetExcludedOption()->SetSelectedIndex(1); if (const auto location = ctx->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) {
} else { location->GetExcludedOption()->SetSelectedIndex(1);
location->GetExcludedOption()->SetSelectedIndex(0); } 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_SHUFFLE_KOKIRI_SWORD]) {
if (mOptions[RSK_STARTING_KOKIRI_SWORD]) { if (mOptions[RSK_STARTING_KOKIRI_SWORD]) {
@ -2197,12 +2204,13 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) {
} }
break; break;
// Uses Ammo Drops option for now. "Off" not yet implemented // Uses Ammo Drops option for now. "Off" not yet implemented
// TODO: Change to Ammo Drops
case RSK_ENABLE_BOMBCHU_DROPS: case RSK_ENABLE_BOMBCHU_DROPS:
if (it.value() == "On") { if (it.value() == "Yes") {
mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON); mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON);
} else if (it.value() == "On + Bombchu") { // } else if (it.value() == "On + Bombchu") {
mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON_PLUS_BOMBCHU); // mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_ON_PLUS_BOMBCHU);
} else if (it.value() == "Off") { } else if (it.value() == "No") {
mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_OFF); mOptions[index].SetSelectedIndex(RO_AMMO_DROPS_OFF);
} }
break; break;
@ -2484,8 +2492,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) {
nlohmann::json enabledTricksJson = spoilerFileJson["enabledTricks"]; nlohmann::json enabledTricksJson = spoilerFileJson["enabledTricks"];
for (auto it = enabledTricksJson.begin(); it != enabledTricksJson.end(); ++it) { for (auto it = enabledTricksJson.begin(); it != enabledTricksJson.end(); ++it) {
std::string numericValueString = it.value(); const RandomizerTrick rt = mTrickNameToEnum[it.value()];
const auto rt = static_cast<RandomizerTrick>(std::stoi(numericValueString));
GetTrickOption(rt).SetSelectedIndex(RO_GENERIC_ON); GetTrickOption(rt).SetSelectedIndex(RO_GENERIC_ON);
} }
} }

View file

@ -191,5 +191,6 @@ class Settings {
std::string mHash; std::string mHash;
std::string mSeedString; std::string mSeedString;
uint32_t mFinalSeed = 0; uint32_t mFinalSeed = 0;
std::unordered_map<std::string, RandomizerTrick> mTrickNameToEnum;
}; };
} // namespace Rando } // namespace Rando

View file

@ -1025,10 +1025,10 @@ void FileChoose_UpdateRandomizer() {
if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0 || !(Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) && if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0 || !(Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) &&
SpoilerFileExists(CVarGetString("gSpoilerLog", "")) && !fileSelectSpoilerFileLoaded) { SpoilerFileExists(CVarGetString("gSpoilerLog", "")) && !fileSelectSpoilerFileLoaded) {
const char* fileLoc = CVarGetString("gSpoilerLog", "");
if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0) { if (CVarGetInteger("gRandomizerNewFileDropped", 0) != 0) {
CVarSetString("gSpoilerLog", CVarGetString("gRandomizerDroppedFile", "")); CVarSetString("gSpoilerLog", CVarGetString("gRandomizerDroppedFile", ""));
} }
const char* fileLoc = CVarGetString("gSpoilerLog", "");
CVarSetInteger("gRandomizerNewFileDropped", 0); CVarSetInteger("gRandomizerNewFileDropped", 0);
CVarSetString("gRandomizerDroppedFile", ""); CVarSetString("gRandomizerDroppedFile", "");
Randomizer_ParseSpoiler(fileLoc); Randomizer_ParseSpoiler(fileLoc);