Add support for a ton more ap options

This commit is contained in:
aMannus
2025-07-28 12:03:04 +02:00
parent 54a3a4704b
commit 9f11e1fcde

View File

@@ -468,27 +468,27 @@ void Context::ParseArchipelagoOptions(const std::map<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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<ArchipelagoClient
}
}
}
itemLocationTable[RC_ZR_MAGIC_BEAN_SALESMAN].SetCustomPrice(60);
itemLocationTable[RC_KAK_GRANNYS_SHOP].SetCustomPrice(100);
itemLocationTable[RC_WASTELAND_BOMBCHU_SALESMAN].SetCustomPrice(200);
itemLocationTable[RC_GC_MEDIGORON].SetCustomPrice(200);
}
void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson) {