From 4b90ae48c7edd1020896efca7c123a2ed9d4ce40 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:39:01 +0100 Subject: [PATCH] Add missing hint logic, cleanup ganon's tower and mido logic, change LA rock name (#6565) --- .../Enhancements/randomizer/ShuffleRocks.cpp | 2 +- .../location_access/dungeons/fire_temple.cpp | 5 ++++- .../dungeons/forest_temple.cpp | 5 ++++- .../dungeons/ganons_castle.cpp | 19 ++++++++++++++----- .../dungeons/shadow_temple.cpp | 9 ++++++--- .../dungeons/spirit_temple.cpp | 10 ++++++++-- .../location_access/dungeons/water_temple.cpp | 10 ++++++++-- .../overworld/kokiri_forest.cpp | 5 ++++- .../randomizer/location_access/root.cpp | 1 + .../Enhancements/randomizer/location_list.cpp | 7 +++++++ .../randomizerEnums/RandomizerCheck.h | 7 +++++++ .../randomizerEnums/RandomizerRegion.h | 1 + .../Enhancements/randomizer/static_data.cpp | 14 +++++++------- 13 files changed, 72 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp b/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp index c4e852841e..877333418e 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleRocks.cpp @@ -397,7 +397,7 @@ void Rando::StaticData::RegisterRockLocations() { locationTable[RC_KAK_ROCK_2] = Location::Rock(RC_KAK_ROCK_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-664, 1288), "Kak Rock 2", RHT_KAK_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_ROCK_2)); locationTable[RC_GY_ROCK] = Location::Rock(RC_GY_ROCK, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1193, 693), "GY Rock", RHT_GY_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_ROCK)); - locationTable[RC_LH_ROCK] = Location::Rock(RC_LH_ROCK, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(1222, 3953), "LA Rock", RHT_LH_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ROCK)); + locationTable[RC_LH_ROCK] = Location::Rock(RC_LH_ROCK, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(1222, 3953), "LH Rock", RHT_LH_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ROCK)); locationTable[RC_ZD_CIRCLE_ROCK_1] = Location::Rock(RC_ZD_CIRCLE_ROCK_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(462, -696), "ZD Circle Rock 1", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_1)); locationTable[RC_ZD_CIRCLE_ROCK_2] = Location::Rock(RC_ZD_CIRCLE_ROCK_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(518, -719), "ZD Circle Rock 2", RHT_ZD_ROCK, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_CIRCLE_ROCK_2)); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 3dc2896899..3293cc8b92 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -1077,7 +1077,10 @@ void RegionTable_Init_FireTemple() { #pragma endregion // Boss Room - areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", SCENE_FIRE_TEMPLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", SCENE_FIRE_TEMPLE, {}, { + // Locations + LOCATION(RC_FOREST_BOSS_KEY_HINT, true), + }, { // Exits ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla() && false), ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, ctx->GetDungeon(FIRE_TEMPLE)->IsMQ() && false), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index e3e9005b21..f60a0c2b89 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -829,7 +829,10 @@ void RegionTable_Init_ForestTemple() { #pragma endregion // Boss Room - areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", SCENE_FOREST_TEMPLE, {}, { + // Locations + LOCATION(RC_FOREST_BOSS_KEY_HINT, true), + }, { // Exits ENTRANCE(RR_FOREST_TEMPLE_BASEMENT, ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY)), ENTRANCE(RR_FOREST_TEMPLE_MQ_BASEMENT, ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 228873d7ce..3af0ffcad2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -827,11 +827,11 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_TOWER_STAIRS_4] = Region("Ganon's Tower Stairs 4", SCENE_GANONS_TOWER, {}, {}, { //Exits - ENTRANCE(RR_GANONS_TOWER_FLOOR_3, true), - ENTRANCE(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, true), + ENTRANCE(RR_GANONS_TOWER_FLOOR_3, true), + ENTRANCE(RR_GANONS_TOWER_POT_ROOM, true), }); - areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", SCENE_GANONS_TOWER, {}, { + areaTable[RR_GANONS_TOWER_POT_ROOM] = Region("Ganon's Tower Pot Room", SCENE_GANONS_TOWER, {}, { // Locations LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, logic->CanBreakPots()), LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, logic->CanBreakPots()), @@ -853,7 +853,16 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, logic->CanBreakPots()), }, { //Exits - ENTRANCE(RR_GANONS_TOWER_FLOOR_3, AnyAgeTime([]{return true;})), + ENTRANCE(RR_GANONS_TOWER_STAIRS_4, true;), + ENTRANCE(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, true;), + }); + + areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", SCENE_GANONS_TOWER, {}, { + //Locations + LOCATION(RC_GANONS_BOSS_KEY_HINT, true), + }, { + //Exits + ENTRANCE(RR_GANONS_TOWER_POT_ROOM, false;), ENTRANCE(RR_GANONS_TOWER_GANONDORF_LAIR, AnyAgeTime([]{return logic->HasItem(RG_GANONS_CASTLE_BOSS_KEY);})), }); @@ -862,7 +871,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONDORF_HINT, logic->HasBossSoul(RG_GANON_SOUL)), }, { //Exits - ENTRANCE(RR_GANONS_CASTLE_ESCAPE, logic->CanKillEnemy(RE_GANONDORF)), + ENTRANCE(RR_GANONS_CASTLE_ESCAPE, logic->CanKillEnemy(RE_GANONDORF)), }); areaTable[RR_GANONS_CASTLE_ESCAPE] = Region("Ganon's Castle Escape", SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 8de6eb9c19..c374402a9d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -367,7 +367,10 @@ void RegionTable_Init_ShadowTemple() { ENTRANCE(RR_SHADOW_TEMPLE_BOSS_DOOR, (ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOVER_BOOTS)), }); - areaTable[RR_SHADOW_TEMPLE_BOSS_DOOR] = Region("Shadow Temple Boss Door", SCENE_SHADOW_TEMPLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_BOSS_DOOR] = Region("Shadow Temple Boss Door", SCENE_SHADOW_TEMPLE, {}, { + //Locations + LOCATION(RC_SHADOW_BOSS_KEY_HINT, true), + }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_PRE_BOSS_ROOM, (ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOVER_BOOTS)), ENTRANCE(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, true), @@ -714,8 +717,8 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_BOSS_DOOR] = Region("Shadow Temple MQ Boss Door", SCENE_SHADOW_TEMPLE, {}, { //Locations - //you can drop onto this and the respawn is reasonable - LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, (logic->HookshotOrBoomerang() || ((logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW) || logic->CanUse(RG_MEGATON_HAMMER)) && ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_BOSS_KEY_HINT, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, (logic->HookshotOrBoomerang() || ((logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW) || logic->CanUse(RG_MEGATON_HAMMER)) && ctx->GetTrickOption(RT_VOIDOUT_COLLECTION))) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_MQ_PRE_BOSS_ROOM, logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 74a2f2173d..392224cda5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -536,7 +536,10 @@ void RegionTable_Init_SpiritTemple() { //WARNING these events are not glitchproofed and assume you need all keys to reach from the front EVENT_ACCESS(LOGIC_REVERSE_SPIRIT_CHILD, logic->IsChild), EVENT_ACCESS(LOGIC_REVERSE_SPIRIT_ADULT, logic->IsAdult), - }, {}, { + }, { + //Locations + LOCATION(RC_SPIRIT_BOSS_KEY_HINT, true), + }, { // Exits ENTRANCE(RR_SPIRIT_TEMPLE_STATUE_ROOM, true), //CanBunnyJump with a jumpslash can reach either hand and with good timing the platform as child. the latter is definitely a trick, the former may not be @@ -1132,7 +1135,10 @@ void RegionTable_Init_SpiritTemple() { //WARNING these events are not glitchproofed and assume you need all keys to reach from the front EVENT_ACCESS(LOGIC_REVERSE_SPIRIT_CHILD, logic->IsChild), EVENT_ACCESS(LOGIC_REVERSE_SPIRIT_ADULT, logic->IsAdult), - }, {}, { + }, { + //Locations + LOCATION(RC_SPIRIT_BOSS_KEY_HINT, true), + }, { // Exits ENTRANCE(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, true), //CanBunnyJump with a jumpslash can reach either hand and with good timing the platform as child. the latter is definitely a trick, the former may not be diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 6e06604873..5dc39724d1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -632,7 +632,10 @@ void RegionTable_Init_WaterTemple() { ENTRANCE(RR_WATER_TEMPLE_TRAPPED_SLOPE, true), }); - areaTable[RR_WATER_TEMPLE_TRAPPED_SLOPE] = Region("Water Temple Trapped Slope", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_TRAPPED_SLOPE] = Region("Water Temple Trapped Slope", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_BOSS_KEY_HINT, true), + }, { ENTRANCE(RR_WATER_TEMPLE_RISING_TARGET_LEDGE, true), ENTRANCE(RR_WATER_TEMPLE_BOSS_ENTRYWAY, true), }); @@ -772,7 +775,10 @@ void RegionTable_Init_WaterTemple() { ENTRANCE(RR_WATER_TEMPLE_MQ_BOSS_DOOR, logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_ICE_ARROWS) || logic->CanUse(RG_NAYRUS_LOVE)), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Boss Door", SCENE_WATER_TEMPLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Boss Door", SCENE_WATER_TEMPLE, {}, { + //Locations + LOCATION(RC_WATER_BOSS_KEY_HINT, true), + }, { //Exits ENTRANCE(RR_WATER_TEMPLE_MQ_BOSS_DOOR_RAMP, logic->CanUse(RG_ICE_ARROWS) || logic->TakeDamage()), ENTRANCE(RR_WATER_TEMPLE_BOSS_ENTRYWAY, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index 04882b95c7..68f2f7890f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -100,6 +100,8 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_WONDER_SIGN, logic->IsChild && logic->CanJumpslashExceptHammer()), LOCATION(RC_KF_WONDER_PLATFORMS_1, logic->IsChild), LOCATION(RC_KF_WONDER_PLATFORMS_2, logic->IsChild), + //Technically bad logic, because we can move Mido out of logic, but then we already have KSword... + LOCATION(RC_MIDO_HINT, !ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) && logic->IsChild && logic->CanUse(RG_SPEAK_KOKIRI)), }, { //Exits ENTRANCE(RR_KF_BOULDER_LOOP, logic->CanUse(RG_CRAWL)), @@ -111,7 +113,7 @@ void RegionTable_Init_KokiriForest() { ENTRANCE(RR_KF_HOUSE_OF_TWINS, true), ENTRANCE(RR_KF_KNOW_IT_ALL_HOUSE, true), ENTRANCE(RR_KF_KOKIRI_SHOP, true), - ENTRANCE(RR_KF_OUTSIDE_DEKU_TREE, (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->Get(LOGIC_FOREST_TEMPLE_CLEAR))) || ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->Get(LOGIC_SHOWED_MIDO_SWORD_AND_SHIELD)), + ENTRANCE(RR_KF_OUTSIDE_DEKU_TREE, (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->Get(LOGIC_FOREST_TEMPLE_CLEAR))) || logic->Get(LOGIC_SHOWED_MIDO_SWORD_AND_SHIELD)), ENTRANCE(RR_KF_OUTSIDE_LOST_WOODS, logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS)))), ENTRANCE(RR_KF_RUPEE_ALCOVE, logic->IsAdult && CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL)), ENTRANCE(RR_LW_BRIDGE_FROM_FOREST, logic->IsAdult || ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || logic->Get(LOGIC_DEKU_TREE_CLEAR)), @@ -175,6 +177,7 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_MIDOS_TOP_RIGHT_CHEST, logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, logic->HasItem(RG_OPEN_CHEST)), LOCATION(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_MIDO_HINT, logic->Get(LOGIC_SHOWED_MIDO_SWORD_AND_SHIELD) && logic->IsChild && logic->CanUse(RG_SPEAK_KOKIRI)), }, { //Exits ENTRANCE(RR_KOKIRI_FOREST, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/root.cpp b/soh/soh/Enhancements/randomizer/location_access/root.cpp index 4100ce875c..6807672a63 100644 --- a/soh/soh/Enhancements/randomizer/location_access/root.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/root.cpp @@ -14,6 +14,7 @@ void RegionTable_Init_Root() { EVENT_ACCESS(LOGIC_TH_COULD_FREE_SLOPE_CARPENTER, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)), EVENT_ACCESS(LOGIC_TH_RESCUED_ALL_CARPENTERS, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)), EVENT_ACCESS(LOGIC_FREED_EPONA, (bool)ctx->GetOption(RSK_SKIP_EPONA_RACE)), + EVENT_ACCESS(LOGIC_SHOWED_MIDO_SWORD_AND_SHIELD, ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF)), }, { //Locations LOCATION(RC_LINKS_POCKET, true), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 97f8015ef8..77444cc420 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -982,11 +982,18 @@ void Rando::StaticData::InitLocationTable() { // Other Hints locationTable[RC_GANONDORF_HINT] = Location::OtherHint(RC_GANONDORF_HINT, RCQUEST_BOTH, ACTOR_EN_GANON_MANT, SCENE_GANON_BOSS, "Ganondorf Hint"); + locationTable[RC_FOREST_BOSS_KEY_HINT] = Location::OtherHint(RC_FOREST_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_FOREST_TEMPLE, "Forest Temple Boss Key Hint"); + locationTable[RC_FIRE_BOSS_KEY_HINT] = Location::OtherHint(RC_FIRE_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_FIRE_TEMPLE, "Fire Temple Boss Key Hint"); + locationTable[RC_WATER_BOSS_KEY_HINT] = Location::OtherHint(RC_WATER_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_WATER_TEMPLE, "Water Temple Boss Key Hint"); + locationTable[RC_SPIRIT_BOSS_KEY_HINT] = Location::OtherHint(RC_SPIRIT_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_SPIRIT_TEMPLE, "Spirit Temple Boss Key Hint"); + locationTable[RC_SHADOW_BOSS_KEY_HINT] = Location::OtherHint(RC_SHADOW_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_SHADOW_TEMPLE, "Shadow Temple Boss Key Hint"); + locationTable[RC_GANONS_BOSS_KEY_HINT] = Location::OtherHint(RC_GANONS_BOSS_KEY_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_GANONS_TOWER, "Ganon's Castle Boss Key Hint"); locationTable[RC_SHEIK_HINT_GC] = Location::OtherHint(RC_SHEIK_HINT_GC, RCQUEST_VANILLA, ACTOR_EN_XC, SCENE_INSIDE_GANONS_CASTLE, "Sheik Hint"); locationTable[RC_SHEIK_HINT_MQ_GC] = Location::OtherHint(RC_SHEIK_HINT_MQ_GC, RCQUEST_MQ, ACTOR_EN_XC, SCENE_INSIDE_GANONS_CASTLE, "Sheik Hint"); locationTable[RC_DAMPE_HINT] = Location::OtherHint(RC_DAMPE_HINT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_GRAVEKEEPERS_HUT, "Diary Hint"); locationTable[RC_GREG_HINT] = Location::OtherHint(RC_GREG_HINT, RCQUEST_BOTH, RCAREA_MARKET, ACTOR_EN_TAKARA_MAN, SCENE_TREASURE_BOX_SHOP, "Greg Hint"); locationTable[RC_SARIA_SONG_HINT] = Location::OtherHint(RC_SARIA_SONG_HINT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, ACTOR_ID_MAX, SCENE_ID_MAX, "Sarias Song Hint", "Magic Hint Via Saria's Song"); + locationTable[RC_MIDO_HINT] = Location::OtherHint(RC_MIDO_HINT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, ACTOR_ID_MAX, SCENE_ID_MAX, "Mido Hint"); locationTable[RC_ALTAR_HINT_CHILD] = Location::OtherHint(RC_ALTAR_HINT_CHILD, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, "ToT Child Altar Hint"); locationTable[RC_ALTAR_HINT_ADULT] = Location::OtherHint(RC_ALTAR_HINT_ADULT, RCQUEST_BOTH, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, "ToT Adult Altar Hint"); locationTable[RC_FISHING_POLE_HINT] = Location::OtherHint(RC_FISHING_POLE_HINT, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, "Fishing Pole Hint"); diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h index 90d7d39451..51313bfb9c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h @@ -2065,6 +2065,13 @@ RANDO_ENUM_ITEM(RC_TRIFORCE_COMPLETED) RANDO_ENUM_ITEM(RC_DAMPE_HINT) RANDO_ENUM_ITEM(RC_GREG_HINT) RANDO_ENUM_ITEM(RC_SARIA_SONG_HINT) +RANDO_ENUM_ITEM(RC_MIDO_HINT) +RANDO_ENUM_ITEM(RC_FOREST_BOSS_KEY_HINT) +RANDO_ENUM_ITEM(RC_FIRE_BOSS_KEY_HINT) +RANDO_ENUM_ITEM(RC_WATER_BOSS_KEY_HINT) +RANDO_ENUM_ITEM(RC_SPIRIT_BOSS_KEY_HINT) +RANDO_ENUM_ITEM(RC_SHADOW_BOSS_KEY_HINT) +RANDO_ENUM_ITEM(RC_GANONS_BOSS_KEY_HINT) RANDO_ENUM_ITEM(RC_ALTAR_HINT_CHILD) RANDO_ENUM_ITEM(RC_ALTAR_HINT_ADULT) RANDO_ENUM_ITEM(RC_FISHING_POLE_HINT) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h index 9cf279b1e1..b2ad74ca67 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h @@ -1079,6 +1079,7 @@ RANDO_ENUM_ITEM(RR_GANONS_TOWER_FLOOR_2) RANDO_ENUM_ITEM(RR_GANONS_TOWER_STAIRS_3) RANDO_ENUM_ITEM(RR_GANONS_TOWER_FLOOR_3) RANDO_ENUM_ITEM(RR_GANONS_TOWER_STAIRS_4) +RANDO_ENUM_ITEM(RR_GANONS_TOWER_POT_ROOM) RANDO_ENUM_ITEM(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR) RANDO_ENUM_ITEM(RR_GANONS_TOWER_GANONDORF_LAIR) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_ESCAPE) diff --git a/soh/soh/Enhancements/randomizer/static_data.cpp b/soh/soh/Enhancements/randomizer/static_data.cpp index ecd4a11e30..390febf5e8 100644 --- a/soh/soh/Enhancements/randomizer/static_data.cpp +++ b/soh/soh/Enhancements/randomizer/static_data.cpp @@ -192,16 +192,16 @@ std::unordered_map StaticData::staticHintInfoMap // warp song hints are special cased due to entrances not being done properly yet // Ganondorf Joke is special cased as the text is random {RH_SHEIK_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SHEIK_HINT_LA_ONLY}, RSK_SHEIK_LA_HINT, true, {}, {RG_LIGHT_ARROWS}, {RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC}, true)}, - {RH_FOREST_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FOREST_TEMPLE_BOSS_KEY}, {}, true)}, - {RH_FIRE_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FIRE_TEMPLE_BOSS_KEY}, {}, true)}, - {RH_WATER_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_WATER_TEMPLE_BOSS_KEY}, {}, true)}, - {RH_SPIRIT_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SPIRIT_TEMPLE_BOSS_KEY}, {}, true)}, - {RH_SHADOW_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SHADOW_TEMPLE_BOSS_KEY}, {}, true)}, - {RH_GANONS_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_GANONS_CASTLE_BOSS_KEY}, {}, true)}, + {RH_FOREST_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FOREST_TEMPLE_BOSS_KEY}, {RC_FOREST_BOSS_KEY_HINT}, true)}, + {RH_FIRE_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_FIRE_TEMPLE_BOSS_KEY}, {RC_FIRE_BOSS_KEY_HINT}, true)}, + {RH_WATER_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_WATER_TEMPLE_BOSS_KEY}, {RC_WATER_BOSS_KEY_HINT}, true)}, + {RH_SPIRIT_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SPIRIT_TEMPLE_BOSS_KEY}, {RC_SPIRIT_BOSS_KEY_HINT}, true)}, + {RH_SHADOW_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_SHADOW_TEMPLE_BOSS_KEY}, {RC_SHADOW_BOSS_KEY_HINT}, true)}, + {RH_GANONS_BOSS_KEY_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_BOSS_KEY_HINT}, RSK_BOSS_KEY_HINT, true, {}, {RG_GANONS_CASTLE_BOSS_KEY}, {RC_GANONS_BOSS_KEY_HINT}, true)}, {RH_DAMPES_DIARY, StaticHintInfo(HINT_TYPE_AREA, {RHT_DAMPE_DIARY}, RSK_DAMPES_DIARY_HINT, true, {}, {RG_PROGRESSIVE_HOOKSHOT}, {RC_DAMPE_HINT})}, {RH_GREG_RUPEE, StaticHintInfo(HINT_TYPE_AREA, {RHT_GREG_HINT}, RSK_GREG_HINT, true, {}, {RG_GREG_RUPEE}, {RC_GREG_HINT})}, {RH_SARIA_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SARIA_TALK_HINT, RHT_SARIA_SONG_HINT}, RSK_SARIA_HINT, true, {}, {RG_PROGRESSIVE_MAGIC_METER}, {RC_SARIA_SONG_HINT, RC_SONG_FROM_SARIA}, true)}, - {RH_MIDO_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_MIDO_HINT}, RSK_MIDO_HINT, true, {}, {RG_KOKIRI_SWORD}, {}, true)}, + {RH_MIDO_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_MIDO_HINT}, RSK_MIDO_HINT, true, {}, {RG_KOKIRI_SWORD}, {RC_MIDO_HINT}, true)}, {RH_LOACH_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_LOACH_HINT}, RSK_LOACH_HINT, true, {RC_LH_HYRULE_LOACH})}, {RH_FISHING_POLE, StaticHintInfo(HINT_TYPE_AREA, {RHT_FISHING_POLE_HINT}, RSK_FISHING_POLE_HINT, true, {}, {RG_FISHING_POLE}, {RC_FISHING_POLE_HINT}, true)}, {RH_HBA_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_HBA_HINT_SIGN, RHT_HBA_HINT_NOT_ON_HORSE, RHT_HBA_HINT_INITIAL, RHT_HBA_HINT_HAVE_1000}, RSK_HBA_HINT, true, {RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS})},