From 9f11e1fcdea4fd40d2e4fa99f9a0642f27a900d9 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 28 Jul 2025 12:03:04 +0200 Subject: [PATCH] Add support for a ton more ap options --- soh/soh/Enhancements/randomizer/context.cpp | 146 ++++++++++++-------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 8614a35bc..bcf682242 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -468,27 +468,27 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat nlohmann::json slotData = ArchipelagoClient::GetInstance().GetSlotData(); mOptions[RSK_LOGIC_RULES].Set(RO_LOGIC_NO_LOGIC); - mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_OFF); - mOptions[RSK_KAK_GATE].Set(RO_KAK_GATE_OPEN); - mOptions[RSK_DOOR_OF_TIME].Set(RO_DOOROFTIME_OPEN); - mOptions[RSK_ZORAS_FOUNTAIN].Set(RO_ZF_CLOSED); - mOptions[RSK_SLEEPING_WATERFALL].Set(RO_WATERFALL_CLOSED); + mOptions[RSK_FOREST].Set(slotData["closed_forest"]); + mOptions[RSK_KAK_GATE].Set(slotData["kakariko_gate"]); + mOptions[RSK_DOOR_OF_TIME].Set(slotData["door_of_time"]); + mOptions[RSK_ZORAS_FOUNTAIN].Set(slotData["zoras_fountain"]); + mOptions[RSK_SLEEPING_WATERFALL].Set(slotData["sleeping_waterfall"]); mOptions[RSK_STARTING_AGE].Set(RO_AGE_CHILD); mOptions[RSK_SELECTED_STARTING_AGE].Set(0); - mOptions[RSK_GERUDO_FORTRESS].Set(RO_GF_CARPENTERS_NORMAL); - mOptions[RSK_RAINBOW_BRIDGE].Set(RO_BRIDGE_GREG); - mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT].Set(0); - mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT].Set(0); - mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT].Set(0); - mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT].Set(0); - mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT].Set(0); + mOptions[RSK_GERUDO_FORTRESS].Set(slotData["fortress_carpenters"]); + mOptions[RSK_RAINBOW_BRIDGE].Set(slotData["rainbow_bridge"]); + mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT].Set(slotData["rainbow_bridge_stones_required"]); + mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT].Set(slotData["rainbow_bridge_medallions_required"]); + mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT].Set(slotData["rainbow_bridge_dungeon_rewards_required"]); + mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT].Set(slotData["rainbow_bridge_dungeons_required"]); + mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT].Set(slotData["rainbow_bridge_skull_tokens_required"]); mOptions[RSK_BRIDGE_OPTIONS].Set(0); - mOptions[RSK_GANONS_TRIALS].Set(RO_GANONS_TRIALS_SKIP); - mOptions[RSK_TRIAL_COUNT].Set(0); + mOptions[RSK_GANONS_TRIALS].Set(RO_GANONS_TRIALS_SET_NUMBER); + mOptions[RSK_TRIAL_COUNT].Set(slotData["ganons_trials_required"]); mOptions[RSK_STARTING_OCARINA].Set(RO_GENERIC_NO); mOptions[RSK_SHUFFLE_OCARINA].Set(RO_GENERIC_YES); - mOptions[RSK_SHUFFLE_OCARINA_BUTTONS].Set(RO_GENERIC_NO); - mOptions[RSK_SHUFFLE_SWIM].Set(RO_GENERIC_NO); + mOptions[RSK_SHUFFLE_OCARINA_BUTTONS].Set(slotData["shuffle_ocarina_buttons"]); + mOptions[RSK_SHUFFLE_SWIM].Set(slotData["shuffle_swim"]); mOptions[RSK_STARTING_DEKU_SHIELD].Set(RO_GENERIC_NO); mOptions[RSK_STARTING_KOKIRI_SWORD].Set(RO_GENERIC_NO); mOptions[RSK_STARTING_MASTER_SWORD].Set(RO_GENERIC_NO); @@ -505,12 +505,14 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW].Set(RO_GENERIC_NO); mOptions[RSK_STARTING_PRELUDE_OF_LIGHT].Set(RO_GENERIC_NO); mOptions[RSK_SHUFFLE_KOKIRI_SWORD].Set(RO_GENERIC_YES); - mOptions[RSK_SHUFFLE_MASTER_SWORD].Set(RO_GENERIC_NO); - mOptions[RSK_SHUFFLE_CHILD_WALLET].Set(RO_GENERIC_NO); + mOptions[RSK_SHUFFLE_MASTER_SWORD].Set(slotData["shuffle_master_sword"]); + mOptions[RSK_SHUFFLE_CHILD_WALLET].Set(slotData["shuffle_childs_wallet"]); mOptions[RSK_INCLUDE_TYCOON_WALLET].Set(RO_GENERIC_YES); if (slotData["shuffle_dungeon_rewards"] == 0) { mOptions[RSK_SHUFFLE_DUNGEON_REWARDS].Set(RO_DUNGEON_REWARDS_VANILLA); } else if (slotData["shuffle_dungeon_rewards"] == 1) { + mOptions[RSK_SHUFFLE_DUNGEON_REWARDS].Set(RO_DUNGEON_REWARDS_END_OF_DUNGEON); + } else if (slotData["shuffle_dungeon_rewards"] == 2) { mOptions[RSK_SHUFFLE_DUNGEON_REWARDS].Set(RO_DUNGEON_REWARDS_ANYWHERE); } mOptions[RSK_SHUFFLE_SONGS].Set(RO_SONG_SHUFFLE_ANYWHERE); @@ -544,11 +546,11 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_SCRUBS_PRICES_AFFORDABLE].Set(0); mOptions[RSK_SHUFFLE_BEEHIVES].Set(slotData["shuffle_beehives"]); mOptions[RSK_SHUFFLE_COWS].Set(slotData["shuffle_cows"]); - mOptions[RSK_SHUFFLE_WEIRD_EGG].Set(RO_GENERIC_NO); + mOptions[RSK_SHUFFLE_WEIRD_EGG].Set(slotData["shuffle_weird_egg"]); mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD].Set(RO_GENERIC_YES); mOptions[RSK_SHUFFLE_POTS].Set(slotData["shuffle_pots"]); mOptions[RSK_SHUFFLE_CRATES].Set(slotData["shuffle_crates"]); - mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES].Set(slotData["shuffle_frogs"]); + mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES].Set(slotData["shuffle_frog_song_rupees"]); mOptions[RSK_ITEM_POOL].Set(0); mOptions[RSK_ICE_TRAPS].Set(0); mOptions[RSK_GOSSIP_STONE_HINTS].Set(RO_GOSSIP_STONES_NONE); @@ -579,32 +581,43 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_FISHING_POLE_HINT].Set(RO_GENERIC_NO); mOptions[RSK_HINT_CLARITY].Set(0); mOptions[RSK_HINT_DISTRIBUTION].Set(0); - mOptions[RSK_SHUFFLE_MAPANDCOMPASS].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); + if (slotData["maps_and_compasses"] == 0) { + mOptions[RSK_SHUFFLE_MAPANDCOMPASS].Set(RO_DUNGEON_ITEM_LOC_STARTWITH); + } else if (slotData["maps_and_compasses"] == 1) { + mOptions[RSK_SHUFFLE_MAPANDCOMPASS].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); + } mOptions[RSK_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); mOptions[RSK_GERUDO_KEYS].Set(RO_GERUDO_KEYS_ANYWHERE); mOptions[RSK_BOSS_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); - if (slotData["gcbk_setting"] == 1) { + if (slotData["ganons_castle_boss_key"] == 0) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_VANILLA); + } else if (slotData["ganons_castle_boss_key"] == 1) { mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_ANYWHERE); - } else if (slotData["gcbk_setting"] == 0) { + } else if (slotData["ganons_castle_boss_key"] == 2) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_VANILLA); + } else if (slotData["ganons_castle_boss_key"] == 3) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_STONES); + } else if (slotData["ganons_castle_boss_key"] == 4) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_MEDALLIONS); + } else if (slotData["ganons_castle_boss_key"] == 5) { mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_REWARDS); + } else if (slotData["ganons_castle_boss_key"] == 6) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_DUNGEONS); + } else if (slotData["ganons_castle_boss_key"] == 7) { + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_LACS_TOKENS); } - mOptions[RSK_SKIP_CHILD_STEALTH].Set(RO_GENERIC_YES); - mOptions[RSK_SKIP_CHILD_ZELDA].Set(RO_GENERIC_YES); + mOptions[RSK_SKIP_CHILD_ZELDA].Set(slotData["skip_child_zelda"]); mOptions[RSK_STARTING_STICKS].Set(RO_GENERIC_NO); mOptions[RSK_STARTING_NUTS].Set(RO_GENERIC_NO); - mOptions[RSK_FULL_WALLETS].Set(RO_GENERIC_YES); + mOptions[RSK_FULL_WALLETS].Set(slotData["full_wallets"]); mOptions[RSK_SHUFFLE_CHEST_MINIGAME].Set(RO_GENERIC_NO); - mOptions[RSK_BIG_POE_COUNT].Set(1); - mOptions[RSK_SKIP_EPONA_RACE].Set(RO_GENERIC_YES); - mOptions[RSK_COMPLETE_MASK_QUEST].Set(RO_GENERIC_YES); - mOptions[RSK_SKIP_SCARECROWS_SONG].Set(RO_GENERIC_YES); + mOptions[RSK_BIG_POE_COUNT].Set(slotData["big_poe_target_count"]); + mOptions[RSK_SKIP_EPONA_RACE].Set(slotData["skip_epona_race"]); + mOptions[RSK_COMPLETE_MASK_QUEST].Set(slotData["complete_mask_quest"]); + mOptions[RSK_SKIP_SCARECROWS_SONG].Set(slotData["skip_scarecrows_song"]); mOptions[RSK_SKULLS_SUNS_SONG].Set(0); - mOptions[RSK_SHUFFLE_ADULT_TRADE].Set(slotData["shuffle_trade_items"]); - if (slotData["shuffle_merchants"] == 1) { - mOptions[RSK_SHUFFLE_MERCHANTS].Set(RO_SHUFFLE_MERCHANTS_ALL); - } else { - mOptions[RSK_SHUFFLE_MERCHANTS].Set(RO_SHUFFLE_MERCHANTS_OFF); - } + mOptions[RSK_SHUFFLE_ADULT_TRADE].Set(slotData["shuffle_adult_trade_items"]); + mOptions[RSK_SHUFFLE_MERCHANTS].Set(slotData["shuffle_merchants"]); mOptions[RSK_MERCHANT_PRICES].Set(0); mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE].Set(0); mOptions[RSK_MERCHANT_PRICES_RANGE_1].Set(0); @@ -615,10 +628,10 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT].Set(0); mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT].Set(0); mOptions[RSK_MERCHANT_PRICES_AFFORDABLE].Set(0); - mOptions[RSK_BLUE_FIRE_ARROWS].Set(RO_GENERIC_YES); - mOptions[RSK_SUNLIGHT_ARROWS].Set(RO_GENERIC_YES); - mOptions[RSK_ENABLE_BOMBCHU_DROPS].Set(RO_GENERIC_YES); - mOptions[RSK_BOMBCHU_BAG].Set(RO_GENERIC_YES); + mOptions[RSK_BLUE_FIRE_ARROWS].Set(slotData["blue_fire_arrows"]); + mOptions[RSK_SUNLIGHT_ARROWS].Set(slotData["sunlight_arrows"]); + mOptions[RSK_ENABLE_BOMBCHU_DROPS].Set(slotData["bombchu_drops"]); + mOptions[RSK_BOMBCHU_BAG].Set(slotData["bombchu_bag"]); mOptions[RSK_LINKS_POCKET].Set(RO_LINKS_POCKET_ANYTHING); mOptions[RSK_MQ_DUNGEON_RANDOM].Set(0); mOptions[RSK_MQ_DUNGEON_COUNT].Set(0); @@ -635,14 +648,18 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_MQ_ICE_CAVERN].Set(0); mOptions[RSK_MQ_GTG].Set(0); mOptions[RSK_MQ_GANONS_CASTLE].Set(0); - mOptions[RSK_LACS_STONE_COUNT].Set(0); - mOptions[RSK_LACS_MEDALLION_COUNT].Set(0); - mOptions[RSK_LACS_REWARD_COUNT].Set(slotData["gcbk_rewards_required"]); - mOptions[RSK_LACS_DUNGEON_COUNT].Set(0); - mOptions[RSK_LACS_TOKEN_COUNT].Set(0); + mOptions[RSK_LACS_STONE_COUNT].Set(slotData["ganons_castle_boss_key_stones_required"]); + mOptions[RSK_LACS_MEDALLION_COUNT].Set(slotData["ganons_castle_boss_key_medallions_required"]); + mOptions[RSK_LACS_REWARD_COUNT].Set(slotData["ganons_castle_boss_key_dungeon_rewards_required"]); + mOptions[RSK_LACS_DUNGEON_COUNT].Set(slotData["ganons_castle_boss_key_dungeons_required"]); + mOptions[RSK_LACS_TOKEN_COUNT].Set(slotData["ganons_castle_boss_key_skull_tokens_required"]); mOptions[RSK_LACS_OPTIONS].Set(0); - mOptions[RSK_KEYRINGS].Set(0); - mOptions[RSK_KEYRINGS_RANDOM_COUNT].Set(0); + if (slotData["key_rings"] == 0) { + mOptions[RSK_KEYRINGS].Set(RO_KEYRINGS_OFF); + } else if (slotData["key_rings"] == 1) { + mOptions[RSK_KEYRINGS].Set(RO_KEYRINGS_COUNT); + } + mOptions[RSK_KEYRINGS_RANDOM_COUNT].Set(9); mOptions[RSK_KEYRINGS_GERUDO_FORTRESS].Set(0); mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Set(0); mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Set(0); @@ -673,10 +690,16 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_ALL_LOCATIONS_REACHABLE].Set(0); mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].Set(0); mOptions[RSK_SHUFFLE_100_GS_REWARD].Set(RO_GENERIC_NO); - mOptions[RSK_TRIFORCE_HUNT].Set(RO_GENERIC_NO); - mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL].Set(0); - mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED].Set(0); - mOptions[RSK_SHUFFLE_BOSS_SOULS].Set(RO_GENERIC_NO); + mOptions[RSK_TRIFORCE_HUNT].Set(slotData["triforce_hunt"]); + uint16_t triforcePiecesRequired = slotData["triforce_hunt_required_pieces"]; + uint16_t triforcePiecesExtraPercentage = slotData["triforce_hunt_extra_pieces_percentage"]; + uint16_t triforcePiecesTotal = floor(triforcePiecesRequired * (1 + (triforcePiecesExtraPercentage / 100))); + if (triforcePiecesTotal > 100) { + triforcePiecesTotal = 100; + } + mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL].Set(triforcePiecesTotal); + mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED].Set(triforcePiecesRequired); + mOptions[RSK_SHUFFLE_BOSS_SOULS].Set(slotData["shuffle_boss_souls"]); if (slotData["shuffle_fish"] == 0) { mOptions[RSK_FISHSANITY].Set(RO_FISHSANITY_OFF); } else if (slotData["shuffle_fish"] == 1) { @@ -687,15 +710,15 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_FISHSANITY].Set(RO_FISHSANITY_BOTH); } mOptions[RSK_FISHSANITY_POND_COUNT].Set(15); - mOptions[RSK_FISHSANITY_AGE_SPLIT].Set(15); - mOptions[RSK_SHUFFLE_FISHING_POLE].Set(RO_GENERIC_NO); - mOptions[RSK_INFINITE_UPGRADES].Set(RO_INF_UPGRADES_OFF); - mOptions[RSK_SKELETON_KEY].Set(RO_GENERIC_NO); - mOptions[RSK_SHUFFLE_DEKU_STICK_BAG].Set(RO_GENERIC_NO); - mOptions[RSK_SHUFFLE_DEKU_NUT_BAG].Set(RO_GENERIC_NO); - mOptions[RSK_SHUFFLE_FREESTANDING].Set(slotData["shuffle_freestanding"]); + mOptions[RSK_FISHSANITY_AGE_SPLIT].Set(1); + mOptions[RSK_SHUFFLE_FISHING_POLE].Set(slotData["shuffle_fishing_pole"]); + mOptions[RSK_INFINITE_UPGRADES].Set(slotData["infinite_upgrades"]); + mOptions[RSK_SKELETON_KEY].Set(slotData["skeleton_key"]); + mOptions[RSK_SHUFFLE_DEKU_STICK_BAG].Set(slotData["shuffle_deku_stick_bag"]); + mOptions[RSK_SHUFFLE_DEKU_NUT_BAG].Set(slotData["shuffle_deku_nut_bag"]); + mOptions[RSK_SHUFFLE_FREESTANDING].Set(slotData["shuffle_freestanding_items"]); mOptions[RSK_SHUFFLE_FAIRIES].Set(slotData["shuffle_fairies"]); - mOptions[RSK_LOCK_OVERWORLD_DOORS].Set(RO_GENERIC_NO); + mOptions[RSK_LOCK_OVERWORLD_DOORS].Set(slotData["lock_overworld_doors"]); mOptions[RSK_SHUFFLE_GRASS].Set(slotData["shuffle_grass"]); } @@ -732,6 +755,11 @@ void Context::ParseArchipelagoItemsLocations(const std::vector