From 317c057e86277d963807f5e3c200432689c8a126 Mon Sep 17 00:00:00 2001 From: A Green Spoon <121978037+A-Green-Spoon@users.noreply.github.com> Date: Mon, 30 Mar 2026 22:35:54 +0900 Subject: [PATCH] [Rando] Shuffle Signs (#6406) Exploding Royal Family's Tombstone grants check --- .../vanilla-behavior/GIVanillaBehavior.h | 8 + .../hint_list/hint_list_exclude_dungeon.cpp | 8 + .../hint_list/hint_list_exclude_overworld.cpp | 88 +++++ .../Enhancements/randomizer/SeedContext.cpp | 8 +- .../Enhancements/randomizer/ShuffleSigns.cpp | 335 ++++++++++++++++++ soh/soh/Enhancements/randomizer/location.cpp | 8 + soh/soh/Enhancements/randomizer/location.h | 4 + .../dungeons/dodongos_cavern.cpp | 6 +- .../dungeons/shadow_temple.cpp | 6 +- .../overworld/castle_grounds.cpp | 1 + .../overworld/death_mountain_crater.cpp | 9 +- .../overworld/death_mountain_trail.cpp | 37 +- .../overworld/gerudo_fortress.cpp | 16 +- .../overworld/gerudo_valley.cpp | 4 +- .../location_access/overworld/goron_city.cpp | 36 +- .../location_access/overworld/graveyard.cpp | 5 + .../overworld/haunted_wasteland.cpp | 22 +- .../overworld/hyrule_field.cpp | 321 +++++++++-------- .../location_access/overworld/kakariko.cpp | 7 +- .../overworld/kokiri_forest.cpp | 145 ++++---- .../location_access/overworld/lake_hylia.cpp | 83 +++-- .../location_access/overworld/lost_woods.cpp | 1 + .../location_access/overworld/market.cpp | 6 +- .../overworld/temple_of_time.cpp | 1 + .../overworld/zoras_domain.cpp | 5 + .../overworld/zoras_fountain.cpp | 42 +-- .../location_access/overworld/zoras_river.cpp | 1 + soh/soh/Enhancements/randomizer/logic.cpp | 4 + soh/soh/Enhancements/randomizer/logic.h | 1 + .../randomizer/option_descriptions.cpp | 11 + .../Enhancements/randomizer/randomizer.cpp | 143 ++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 1 + .../randomizerEnums/RandomizerCheck.h | 78 ++++ .../randomizerEnums/RandomizerHintTextKey.h | 25 ++ .../randomizerEnums/RandomizerInf.h | 78 ++++ .../randomizerEnums/RandomizerMiscEnums.h | 1 + .../randomizerEnums/RandomizerOptions.h | 8 + .../randomizerEnums/RandomizerSettingKey.h | 1 + .../randomizer/randomizer_check_objects.cpp | 2 + .../randomizer/randomizer_check_tracker.cpp | 26 ++ soh/soh/Enhancements/randomizer/settings.cpp | 3 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../actors/ovl_player_actor/z_player.c | 5 +- 43 files changed, 1262 insertions(+), 339 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ShuffleSigns.cpp diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 6d2f21a33..4c5581da5 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2108,6 +2108,14 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_SKIP_TALKING, + // #### `result` // ```c // (collectible >= 0) && (collectible <= 0x19 diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index aa375716f..03bf883de 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -313,6 +313,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_SIGN_DODONGOS_CAVERN] = HintText(CustomMessage("They say that #reading a pedestal in Dodongo's Cavern# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Podests in Dodongos Höhle# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un piédestal dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ @@ -1589,6 +1593,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Kiste im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_SIGN_SHADOW_TEMPLE] = HintText(CustomMessage("They say that #reading a sign in Shadow Temple# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes im Schattentempel# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans le Temple de l'Ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 83e04f5e2..abdc0f2bb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -2159,6 +2159,94 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_BUTTERFLY_FAIRY_LAKE_HYLIA] = HintText(CustomMessage("They say that a #butterfly near a lake# reveals #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Schmetterling in der Nähe eines Sees# #[[1]]# enthülle.", /*french*/ "Selon moi, une #un papillon près d'un lac# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_KOKIRI_FOREST] = HintText(CustomMessage("They say that #reading a sign in a forest# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in einem Wald# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans un fôret# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_LINKS_HOUSE] = HintText(CustomMessage("They say that #reading a sign in Link's House# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in Links Haus# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans la Maison de Link# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_DEKU_THEATER] = HintText(CustomMessage("They say that #reading a sign in an underground theater# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in einem unterirdischen Theater# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans un théâtre souterrain# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_HYRULE_FIELD] = HintText(CustomMessage("They say that #reading a sign in an underground theater# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Ebene von Hyrule# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans la Plaine d'Hyrule# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_MK_SHOOTING_GALLERY] = HintText(CustomMessage("They say that #reading before shooting in youth# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen vor dem Schießen in der Jugend# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire avant de tirer dans sa jeunesse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_KAK_SHOOTING_GALLERY] = HintText(CustomMessage("They say that #reading before shooting in maturity# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen vor dem Schießen im Erwachsenenalter# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire avant de tirer dans sa maturité# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_HAPPY_MASK_SHOP] = HintText(CustomMessage("They say that #reading a sign in a mask shop# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in einem Maskenladen# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans un magasin de masques# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_TEMPLE_OF_TIME] = HintText(CustomMessage("They say that #reading a sign in a mask shop# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Altars im Tempel der Zeit# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un autel dans le Temple du Temps# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_HYRULE_CASTLE] = HintText(CustomMessage("They say that #reading a sign near the castle# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Nähe des Schloßes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau rès du château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that #reading a sign in Kakariko Village# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in Kakariko# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans le Village de Cocorico# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_GRAVEYARD] = HintText(CustomMessage("They say that #reading in the graveyard# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen auf dem Friedhof# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire dans le cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_DEATH_MOUNTAIN_TRAIL] = HintText(CustomMessage("They say that #reading a sign on Death Mountain Trail# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes auf dem Todesberggipfel-Pfad# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau sur le sentier de la Montagne de la Mort# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_GORON_CITY] = HintText(CustomMessage("They say that #reading a sign in Goron City# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in Goronia# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans le Village Goron# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that #reading a sign in Death Mountain Crater# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes im Todeskrater# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau sur le Mont du Péril# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_ZORAS_RIVER] = HintText(CustomMessage("They say that #reading a sign near a river# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Nähe eines Flusses# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau près d'une rivière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_ZORAS_DOMAIN] = HintText(CustomMessage("They say that #reading a sign in Zora's Domain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in Zoras Reich# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans le Domaine Zora# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that #reading a sign in Zora's Fountain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in Zoras Quelle# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans la Fontaine Zora# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_LAKE_HYLIA] = HintText(CustomMessage("They say that #reading near a lake# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen in der Nähe eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire près d'un lac# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_FISHING_POND] = HintText(CustomMessage("They say that #reading a sign in a fishing pond# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in einem Fischteich# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans un étang de pêche# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_GERUDO_VALLEY] = HintText(CustomMessage("They say that #reading a sign in Gerudo Valley# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes im Gerudotalh# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans une vallée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_GERUDO_FORTRESS] = HintText(CustomMessage("They say that #reading a sign in Gerudo Fortress# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Gerudo-Festung# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans la Forteresse Gerudo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SIGN_HAUNTED_WASTELAND] = HintText(CustomMessage("They say that #reading a sign in Haunted Wasteland# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Lesen eines Schildes in der Gespensterwüste# #[[1]]# enthülle.", + /*french*/ "Selon moi, #lire un panneau dans le Désert Hanté# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/SeedContext.cpp b/soh/soh/Enhancements/randomizer/SeedContext.cpp index 86eec9e2d..3855546a0 100644 --- a/soh/soh/Enhancements/randomizer/SeedContext.cpp +++ b/soh/soh/Enhancements/randomizer/SeedContext.cpp @@ -216,6 +216,7 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_NLTREE && (!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) || (location.GetRCType() == RCTYPE_BUSH && !mOptions[RSK_SHUFFLE_BUSHES]) || + (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OFF)) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) { @@ -233,7 +234,8 @@ void Context::GenerateLocationPool() { mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || (location.GetRCType() == RCTYPE_SMALL_CRATE && - mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -254,7 +256,9 @@ void Context::GenerateLocationPool() { mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || (location.GetRCType() == RCTYPE_SMALL_CRATE && - mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_SIGN && + mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp new file mode 100644 index 000000000..84d1b1b78 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSigns.cpp @@ -0,0 +1,335 @@ +#include +#include "soh/ObjectExtension/ObjectExtension.h" +#include "item_category_adj.h" +extern "C" { +extern PlayState* gPlayState; +#include "overlays/actors/ovl_En_Kanban/z_en_kanban.h" +#include "objects/gameplay_keep/gameplay_keep.h" +#include "overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.h" +#include "overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.h" +} + +typedef enum { + PARTICLE_MAJOR, + PARTICLE_SKULLTULA_TOKEN, + PARTICLE_SMALL_KEY, + PARTICLE_BOSS_KEY, + PARTICLE_HEALTH, + PARTICLE_LESSER, + PARTICLE_JUNK, +} SignCMCColors; + +uint8_t Sign_RandomizerHoldsItem(Actor* actor, PlayState* play) { + const auto signIdentity = ObjectExtension::GetInstance().Get(actor); + if (signIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = signIdentity->randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + auto signSetting = RAND_GET_OPTION(RSK_SHUFFLE_SIGNS); + + // Don't pull randomized item if sign isn't randomized or is already checked + if (!IS_RANDO || (signSetting.Is(RO_SHUFFLE_SIGNS_OVERWORLD) && isDungeon) || + (signSetting.Is(RO_SHUFFLE_SIGNS_DUNGEONS) && !isDungeon) || + Flags_GetRandomizerInf(signIdentity->randomizerInf) || signIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +static void Sign_RandomizerDraw(Actor* actor, Color_RGBA8* primColor, Color_RGBA8* secColor, Color_RGBA8* envColor) { + Vec3f pos; + static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + float yKanbanOffset = LINK_IS_CHILD && actor->id == ACTOR_EN_KANBAN ? 15.0f : 0.0f; + + velocity.y = -0.05f; + accel.y = -0.025f; + + pos.x = Rand_CenteredFloat(10.0f) + actor->world.pos.x; + pos.y = (Rand_ZeroOne() * 10.0f) + actor->world.pos.y + yKanbanOffset; + pos.z = Rand_CenteredFloat(10.0f) + actor->world.pos.z; + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, secColor, envColor, 2000, 100); + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, primColor, envColor, 2000, 100); +} + +void Sign_RandomizerDrawSetup(void* actor) { + GetItemCategory getItemCategory; + Actor* signActor = (Actor*)actor; + + // If not a randomized item or too far, don't draw + if (!Sign_RandomizerHoldsItem(signActor, gPlayState) || signActor->xzDistToPlayer > 1000.0f) { + return; + } + + bool cmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + // Color of the circle for the particles + static Color_RGBA8 mainColors[7][3] = { + { 250, 185, 40 }, // Major + { 0, 0, 0 }, // Skulltula Token + { 180, 180, 180 }, // Small Key + { 255, 255, 0 }, // Boss Key + { 250, 0, 0 }, // Health + { 170, 50, 0 }, // Lesser + { 255, 255, 255 } // Junk + }; + + // Secondary color of the circle for the particles + static Color_RGBA8 secColors[7][3] = { + { 255, 220, 135 }, // Major + { 255, 250, 190 }, // Skulltula Token + { 130, 130, 130 }, // Small Key + { 0, 200, 255 }, // Boss Key + { 0, 0, 255 }, // Health + { 250, 75, 0 }, // Lesser + { 255, 255, 255 } // Junk + }; + + // Color of the faded flares stretching off the particles + static Color_RGBA8 flareColors[7][3] = { + { 250, 220, 180 }, // Major + { 255, 255, 255 }, // Skulltula Token + { 100, 100, 100 }, // Small Key + { 0, 200, 255 }, // Boss Key + { 255, 125, 125 }, // Health + { 255, 160, 100 }, // Lesser + { 135, 135, 135 } // Junk + }; + + s16 colorIndex; + Color_RGBA8 primColor; + Color_RGBA8 secColor; + Color_RGBA8 envColor; + + const auto signIdentity = ObjectExtension::GetInstance().Get(signActor); + if (signIdentity == nullptr) { + return; + } + + GetItemEntry signItem = + Rando::Context::GetInstance()->GetFinalGIEntry(signIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = Randomizer_AdjustItemCategory(signItem); + + if (isNotCMC) { + colorIndex = PARTICLE_MAJOR; + Color_RGBA8_Copy(&primColor, mainColors[colorIndex]); + Color_RGBA8_Copy(&secColor, secColors[colorIndex]); + Color_RGBA8_Copy(&envColor, flareColors[colorIndex]); + Sign_RandomizerDraw(signActor, &primColor, &secColor, &envColor); + return; + } + + // Change particle color for CMC + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + colorIndex = PARTICLE_MAJOR; + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + colorIndex = PARTICLE_SKULLTULA_TOKEN; + break; + case ITEM_CATEGORY_SMALL_KEY: + colorIndex = PARTICLE_SMALL_KEY; + break; + case ITEM_CATEGORY_BOSS_KEY: + colorIndex = PARTICLE_BOSS_KEY; + break; + case ITEM_CATEGORY_HEALTH: + colorIndex = PARTICLE_HEALTH; + break; + case ITEM_CATEGORY_LESSER: + colorIndex = PARTICLE_LESSER; + break; + case ITEM_CATEGORY_JUNK: + default: + colorIndex = PARTICLE_JUNK; + break; + } + Color_RGBA8_Copy(&primColor, mainColors[colorIndex]); + Color_RGBA8_Copy(&secColor, secColors[colorIndex]); + Color_RGBA8_Copy(&envColor, flareColors[colorIndex]); + Sign_RandomizerDraw(signActor, &primColor, &secColor, &envColor); +} + +void Sign_RandomizerSpawnCollectible(Actor* actor) { + const auto signIdentity = ObjectExtension::GetInstance().Get(actor); + + if (signIdentity == nullptr) { + return; + } + Flags_SetRandomizerInf(signIdentity->randomizerInf); +} + +void Sign_RoyalTombSpawnCollectible(int16_t flagType, int16_t flag) { + if (!Flags_GetRandomizerInf(RAND_INF_GY_ROYAL_TOMB_GRAVE) && + Flags_GetEventChkInf(EVENTCHKINF_DESTROYED_ROYAL_FAMILY_TOMB)) { + Flags_SetRandomizerInf(RAND_INF_GY_ROYAL_TOMB_GRAVE); + } +} + +void RegisterShuffleSigns() { + bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_SIGNS).Get(); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_KANBAN, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + EnKanban* signActor = static_cast(actorRef); + + auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id); + ObjectExtension::GetInstance().Set(actor, std::move(signIdentity)); + }); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_A_OBJ, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + EnAObj* signActor = static_cast(actorRef); + + auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id); + ObjectExtension::GetInstance().Set(actor, std::move(signIdentity)); + }); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_WONDER_TALK, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + EnWonderTalk* signActor = static_cast(actorRef); + + auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id); + ObjectExtension::GetInstance().Set(actor, std::move(signIdentity)); + }); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_WONDER_TALK2, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + EnWonderTalk2* signActor = static_cast(actorRef); + + auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id); + ObjectExtension::GetInstance().Set(actor, std::move(signIdentity)); + }); + + // Draw particle effect to indicate a randomized item + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KANBAN, shouldRegister, Sign_RandomizerDrawSetup); + + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_A_OBJ, shouldRegister, Sign_RandomizerDrawSetup); + + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_WONDER_TALK, shouldRegister, Sign_RandomizerDrawSetup); + + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_WONDER_TALK2, shouldRegister, Sign_RandomizerDrawSetup); + + COND_VB_SHOULD(VB_SKIP_TALKING, shouldRegister, { + Actor* talkActor = GET_PLAYER(gPlayState)->talkActor; + if (talkActor != NULL) { + switch (talkActor->id) { + case ACTOR_EN_KANBAN: + case ACTOR_EN_A_OBJ: + case ACTOR_EN_WONDER_TALK: + case ACTOR_EN_WONDER_TALK2: + if (Sign_RandomizerHoldsItem(talkActor, gPlayState)) { + Sign_RandomizerSpawnCollectible(talkActor); + *should = false; + } + break; + default: + break; + } + } + }); + + // Give Royal Tomb item if destroyed + COND_HOOK(OnFlagSet, shouldRegister, Sign_RoyalTombSpawnCollectible); +} + +void Rando::StaticData::RegisterSignLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Overworld Signs + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Actor Id Spoiler Collection Check +locationTable[RC_KF_DEKU_TREE_RECTANGLE_SIGN] = Location::Sign(RC_KF_DEKU_TREE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(871, 311), "Deku Tree Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RECTANGLE_SIGN)); +locationTable[RC_KF_STEPPING_STONES_RECTANGLE_SIGN] = Location::Sign(RC_KF_STEPPING_STONES_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(607, -80), "Stepping Stones Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STEPPING_STONES_RECTANGLE_SIGN)); +locationTable[RC_KF_LINKS_HOUSE_RECTANGLE_SIGN] = Location::Sign(RC_KF_LINKS_HOUSE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(49, 967), "Link's House Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_RECTANGLE_SIGN)); +locationTable[RC_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN] = Location::Sign(RC_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-494, 598), "First Training Center Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN)); +locationTable[RC_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN] = Location::Sign(RC_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-538, 718), "Second Training Center Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN)); +locationTable[RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN] = Location::Sign(RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-784, 1675), "After Crawlspace Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN)); +locationTable[RC_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN] = Location::Sign(RC_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-845, 1018), "Crawl Rectangle Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN)); +locationTable[RC_KF_LOST_WOODS_RECTANGLE_SIGN] = Location::Sign(RC_KF_LOST_WOODS_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1432, -426), "Lost Woods Rectangle Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LOST_WOODS_RECTANGLE_SIGN)); +locationTable[RC_KF_HOUSE_OF_TWINS_ARROW_SIGN] = Location::Sign(RC_KF_HOUSE_OF_TWINS_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1089, 473), "House of Twins Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_HOUSE_OF_TWINS_ARROW_SIGN)); +locationTable[RC_KF_SHOP_ARROW_SIGN] = Location::Sign(RC_KF_SHOP_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(728, -195), "Shop Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SHOP_ARROW_SIGN)); +locationTable[RC_KF_SARIAS_HOUSE_ARROW_SIGN] = Location::Sign(RC_KF_SARIAS_HOUSE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(436, 601), "Saria's House Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_HOUSE_ARROW_SIGN)); +locationTable[RC_KF_LOST_WOODS_ARROW_SIGN] = Location::Sign(RC_KF_LOST_WOODS_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-170, -1335), "Lost Woods Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LOST_WOODS_ARROW_SIGN)); +locationTable[RC_KF_MIDOS_HOUSE_ARROW_SIGN] = Location::Sign(RC_KF_MIDOS_HOUSE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-512, -459), "Mido's House Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_MIDOS_HOUSE_ARROW_SIGN)); +locationTable[RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN] = Location::Sign(RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-779, 424), "Training Center Entrance Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN)); +locationTable[RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN] = Location::Sign(RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-924, 928), "Inner Training Center Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_INNER_TRAINING_CENTER_ARROW_SIGN)); +locationTable[RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN] = Location::Sign(RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1008, 479), "Know-It-All Brothers House Arrow Sign", RHT_SIGN_KOKIRI_FOREST, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN)); +locationTable[RC_KF_LINKS_HOUSE_SIGN] = Location::Sign(RC_KF_LINKS_HOUSE_SIGN, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(78, 116), "Link's House Sign", RHT_SIGN_LINKS_HOUSE, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_SIGN)); +locationTable[RC_LW_THEATER_RECTANGLE_SIGN] = Location::Sign(RC_LW_THEATER_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3898, 1228), "Theater Rectangle Sign", RHT_SIGN_DEKU_THEATER, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_THEATER_RECTANGLE_SIGN)); +locationTable[RC_HF_CASTLE_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_CASTLE_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-130, 2105), "Castle Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CASTLE_EXIT_ARROW_SIGN)); +locationTable[RC_HF_WOODED_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_WOODED_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3952, 7232), "Wooded Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_WOODED_EXIT_ARROW_SIGN)); +locationTable[RC_HF_ROCKY_PATH_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_ROCKY_PATH_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-8780, 7680), "Rocky Path Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ROCKY_PATH_EXIT_ARROW_SIGN)); +locationTable[RC_HF_FENCED_ARROW_SIGN] = Location::Sign(RC_HF_FENCED_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4935, 14045), "Fenced Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCED_ARROW_SIGN)); +locationTable[RC_HF_CENTER_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_CENTER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1564, 4318), "Center Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTER_EXIT_ARROW_SIGN)); +locationTable[RC_HF_RIVER_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_RIVER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(5925, 3805), "River Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_RIVER_EXIT_ARROW_SIGN)); +locationTable[RC_HF_STAIRS_EXIT_ARROW_SIGN] = Location::Sign(RC_HF_STAIRS_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3230, 570), "Stairs Exit Arrow Sign", RHT_SIGN_HYRULE_FIELD, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_STAIRS_EXIT_ARROW_SIGN)); +locationTable[RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN] = Location::Sign(RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_MARKET, SCENE_SHOOTING_GALLERY, TWO_ACTOR_PARAMS(59, 365), "Shooting Gallery Rectangle Sign", RHT_SIGN_MK_SHOOTING_GALLERY, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_RECTANGLE_SIGN)); +locationTable[RC_MK_MASK_SHOP_SIGN] = Location::Sign(RC_MK_MASK_SHOP_SIGN, RCQUEST_BOTH, RCAREA_MARKET, SCENE_HAPPY_MASK_SHOP, TWO_ACTOR_PARAMS(-112, 31), "Mask Shop Sign", RHT_SIGN_HAPPY_MASK_SHOP, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_MASK_SHOP_SIGN)); +locationTable[RC_TOT_ALTAR] = Location::Sign(RC_TOT_ALTAR, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME, TWO_ACTOR_PARAMS(0, 1330), "Altar", RHT_SIGN_TEMPLE_OF_TIME, ACTOR_EN_WONDER_TALK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_ALTAR)); +locationTable[RC_HC_DEAD_END_RECTANGLE_SIGN] = Location::Sign(RC_HC_DEAD_END_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(2351, 2634), "Dead End Rectangle Sign", RHT_SIGN_HYRULE_CASTLE, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_DEAD_END_RECTANGLE_SIGN)); +locationTable[RC_KAK_GUARD_GATE_RECTANGLE_SIGN] = Location::Sign(RC_KAK_GUARD_GATE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(210, -1275), "Guard Gate Rectangle Sign", RHT_SIGN_KAKARIKO_VILLAGE, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GUARD_GATE_RECTANGLE_SIGN)); +locationTable[RC_KAK_WELL_RECTANGLE_SIGN] = Location::Sign(RC_KAK_WELL_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(655, 525), "Well Rectangle Sign", RHT_SIGN_KAKARIKO_VILLAGE, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_WELL_RECTANGLE_SIGN)); +locationTable[RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN] = Location::Sign(RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1165, 1550), "Southeast Exit Arrow Sign", RHT_SIGN_KAKARIKO_VILLAGE, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_SOUTHEAST_EXIT_ARROW_SIGN)); +locationTable[RC_KAK_FRONT_GATE_ARROW_SIGN] = Location::Sign(RC_KAK_FRONT_GATE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-2590, 965), "Front Gate Arrow Sign", RHT_SIGN_KAKARIKO_VILLAGE, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_FRONT_GATE_ARROW_SIGN)); +locationTable[RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN] = Location::Sign(RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_SHOOTING_GALLERY, TWO_ACTOR_PARAMS(59, 365), "Shooting Gallery Rectangle Sign", RHT_SIGN_KAK_SHOOTING_GALLERY, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN)); +locationTable[RC_GY_ENTRANCE_RECTANGLE_SIGN] = Location::Sign(RC_GY_ENTRANCE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1110, 430), "Entrance Rectangle Sign", RHT_SIGN_GRAVEYARD, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_ENTRANCE_RECTANGLE_SIGN)); +locationTable[RC_GY_ENTRANCE_PLINTH] = Location::Sign(RC_GY_ENTRANCE_PLINTH, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-805, 266), "Entrance Plinth", RHT_SIGN_GRAVEYARD, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_ENTRANCE_PLINTH)); +locationTable[RC_GY_RIGHT_OF_ROYAL_TOMB_GRAVE] = Location::Sign(RC_GY_RIGHT_OF_ROYAL_TOMB_GRAVE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(654, 258), "Right of Royal Tomb Grave", RHT_SIGN_GRAVEYARD, ACTOR_EN_WONDER_TALK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_RIGHT_OF_ROYAL_TOMB_GRAVE)); +locationTable[RC_GY_LEFT_OF_ROYAL_TOMB_GRAVE] = Location::Sign(RC_GY_LEFT_OF_ROYAL_TOMB_GRAVE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(654, -102), "Left of Royal Tomb Grave", RHT_SIGN_GRAVEYARD, ACTOR_EN_WONDER_TALK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_LEFT_OF_ROYAL_TOMB_GRAVE)); +locationTable[RC_GY_ROYAL_TOMB_GRAVE] = Location::Sign(RC_GY_ROYAL_TOMB_GRAVE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(752, 85), "Royal Tomb Grave", RHT_SIGN_GRAVEYARD, ACTOR_EN_WONDER_TALK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_ROYAL_TOMB_GRAVE)); +locationTable[RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN] = Location::Sign(RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1300, -496), "Above Dodongo Rectangle Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ABOVE_DODONGO_RECTANGLE_SIGN)); +locationTable[RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN] = Location::Sign(RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-299, -1787), "Adult Center Exit Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_ADULT_CENTER_EXIT_ARROW_SIGN)); +locationTable[RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN] = Location::Sign(RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-299, -1787), "Child Center Exit Rectangle Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN)); +locationTable[RC_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN] = Location::Sign(RC_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1834, -571), "Dodongo's Cavern Rectangle Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN)); +locationTable[RC_DMT_CENTER_TRAIL_RECTANGLE_SIGN] = Location::Sign(RC_DMT_CENTER_TRAIL_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1260, 540), "Center Trail Rectangle Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_CENTER_TRAIL_RECTANGLE_SIGN)); +locationTable[RC_DMT_TO_UPPER_TRAIL_ARROW_SIGN] = Location::Sign(RC_DMT_TO_UPPER_TRAIL_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1127, 44), "To Upper Trail Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_TO_UPPER_TRAIL_ARROW_SIGN)); +locationTable[RC_DMT_UPPER_EXIT_ARROW_SIGN] = Location::Sign(RC_DMT_UPPER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-40, -4410), "Upper Exit Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_UPPER_EXIT_ARROW_SIGN)); +locationTable[RC_DMT_TO_CENTER_EXIT_ARROW_SIGN] = Location::Sign(RC_DMT_TO_CENTER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-735, 595), "To Center Exit Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_TO_CENTER_EXIT_ARROW_SIGN)); +locationTable[RC_DMT_LOWER_EXIT_ARROW_SIGN] = Location::Sign(RC_DMT_LOWER_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1300, 2155), "Lower Exit Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_LOWER_EXIT_ARROW_SIGN)); +locationTable[RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN] = Location::Sign(RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(333, -684), "Child Rolling Goron Rectangle Sign", RHT_SIGN_GORON_CITY, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN)); +locationTable[RC_DMC_BRIDGE_EXIT_ARROW_SIGN] = Location::Sign(RC_DMC_BRIDGE_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1610, 95), "Bridge Exit Arrow Sign", RHT_SIGN_DEATH_MOUNTAIN_CRATER, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BRIDGE_EXIT_ARROW_SIGN)); +locationTable[RC_ZR_SLEEPLESS_WATERFALL_PLAQUE] = Location::Sign(RC_ZR_SLEEPLESS_WATERFALL_PLAQUE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4096, -1401), "Sleepless Waterfall Plaque", RHT_SIGN_ZORAS_RIVER, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_SLEEPLESS_WATERFALL_PLAQUE)); +locationTable[RC_ZD_SHOP_RECTANGLE_SIGN] = Location::Sign(RC_ZD_SHOP_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(477, 318), "Shop Rectangle Sign", RHT_SIGN_ZORAS_DOMAIN, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_SHOP_RECTANGLE_SIGN)); +locationTable[RC_ZD_ENTRANCE_RECTANGLE_SIGN] = Location::Sign(RC_ZD_ENTRANCE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(-980, -210), "Entrance Rectangle Sign", RHT_SIGN_ZORAS_DOMAIN, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_ENTRANCE_RECTANGLE_SIGN)); +locationTable[RC_ZD_KING_ZORA_PATH_ARROW_SIGN] = Location::Sign(RC_ZD_KING_ZORA_PATH_ARROW_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(217, 150), "King Zora Path Arrow Sign", RHT_SIGN_ZORAS_DOMAIN, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_KING_ZORA_PATH_ARROW_SIGN)); +locationTable[RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN] = Location::Sign(RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(720, -1345), "Near King Zora Rectangle Sign", RHT_SIGN_ZORAS_DOMAIN, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN)); +locationTable[RC_ZD_NEAR_KING_ZORA_ARROW_SIGN] = Location::Sign(RC_ZD_NEAR_KING_ZORA_ARROW_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(345, -1572), "Near King Zora Arrow Sign", RHT_SIGN_ZORAS_DOMAIN, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_KING_ZORA_ARROW_SIGN)); +locationTable[RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN] = Location::Sign(RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1900, 208), "Jabu-Jabu Platform Rectangle Sign", RHT_SIGN_ZORAS_FOUNTAIN, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN)); +locationTable[RC_ZF_ENTRANCE_ARROW_SIGN] = Location::Sign(RC_ZF_ENTRANCE_ARROW_SIGN, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-2557, 486), "Entrance Arrow Sign", RHT_SIGN_ZORAS_FOUNTAIN, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_ENTRANCE_ARROW_SIGN)); +locationTable[RC_LH_LAB_RECTANGLE_SIGN] = Location::Sign(RC_LH_LAB_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2300, 3670), "Lab Rectangle Sign", RHT_SIGN_LAKE_HYLIA, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_RECTANGLE_SIGN)); +locationTable[RC_LH_NORTH_EXIT_ARROW_SIGN] = Location::Sign(RC_LH_NORTH_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1835, 995), "North Exit Arrow Sign", RHT_SIGN_LAKE_HYLIA, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_NORTH_EXIT_ARROW_SIGN)); +locationTable[RC_LH_FISHING_SIGN] = Location::Sign(RC_LH_FISHING_SIGN, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(1341, 3779), "Fishing Sign", RHT_SIGN_LAKE_HYLIA, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FISHING_SIGN)); +locationTable[RC_LH_ISLAND_PEDESTAL] = Location::Sign(RC_LH_ISLAND_PEDESTAL, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-491, 7259), "Island Pedestal", RHT_SIGN_LAKE_HYLIA, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_PEDESTAL)); +locationTable[RC_LH_FISHING_POND_RECTANGLE_SIGN] = Location::Sign(RC_LH_FISHING_POND_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_FISHING_POND, TWO_ACTOR_PARAMS(53, 982), "Fishing Pond Rectangle Sign", RHT_SIGN_FISHING_POND, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FISHING_POND_RECTANGLE_SIGN)); +locationTable[RC_GV_BRIDGE_RECTANGLE_SIGN] = Location::Sign(RC_GV_BRIDGE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(359, 254), "Bridge Rectangle Sign", RHT_SIGN_GERUDO_VALLEY, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BRIDGE_RECTANGLE_SIGN)); +locationTable[RC_GV_EAST_EXIT_ARROW_SIGN] = Location::Sign(RC_GV_EAST_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(2778, 593), "East Exit Arrow Sign", RHT_SIGN_GERUDO_VALLEY, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_EAST_EXIT_ARROW_SIGN)); +locationTable[RC_GF_EAST_EXIT_ARROW_SIGN] = Location::Sign(RC_GF_EAST_EXIT_ARROW_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-730, -70), "East Exit Arrow Sign", RHT_SIGN_GERUDO_FORTRESS, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_EAST_EXIT_ARROW_SIGN)); +locationTable[RC_GF_HBA_RECTANGLE_SIGN] = Location::Sign(RC_GF_HBA_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3635, -360), "HBA Rectangle Sign", RHT_SIGN_GERUDO_FORTRESS, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RECTANGLE_SIGN)); +locationTable[RC_GF_GATE_EXIT_RECTANGLE_SIGN] = Location::Sign(RC_GF_GATE_EXIT_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-1850, -3250), "Gate Exit Rectangle Sign", RHT_SIGN_GERUDO_FORTRESS, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_GATE_EXIT_RECTANGLE_SIGN)); +locationTable[RC_GF_GTG_ENTRANCE_RECTANGLE_SIGN] = Location::Sign(RC_GF_GTG_ENTRANCE_RECTANGLE_SIGN, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(14, -1159), "GTG Entrance Rectangle Sign", RHT_SIGN_GERUDO_FORTRESS, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_GTG_ENTRANCE_RECTANGLE_SIGN)); +locationTable[RC_HW_CARPET_SALESMAN_ARROW_SIGN] = Location::Sign(RC_HW_CARPET_SALESMAN_ARROW_SIGN, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(2104, 2389), "Carpet Salesman Arrow Sign", RHT_SIGN_HAUNTED_WASTELAND, ACTOR_EN_A_OBJ, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_CARPET_SALESMAN_ARROW_SIGN)); +locationTable[RC_HW_POE_ALTAR] = Location::Sign(RC_HW_POE_ALTAR, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(645, -2234), "Poe Altar", RHT_SIGN_HAUNTED_WASTELAND, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_POE_ALTAR)); +// Dungeon Signs +locationTable[RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL] = Location::Sign(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, RCQUEST_BOTH, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(578, -929), "Top Floor Pedestal", RHT_SIGN_DODONGOS_CAVERN, ACTOR_EN_WONDER_TALK2, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL)); +locationTable[RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN] = Location::Sign(RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(910, -192), "Truthspinner Rectangle Sign", RHT_SIGN_SHADOW_TEMPLE, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN)); +// MQ Dungeon Signs +locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN] = Location::Sign(RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2893, 2705), "Lower Pit Rectangle Sign", RHT_SIGN_SHADOW_TEMPLE, ACTOR_EN_KANBAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN)); + + // clang-format on +} + +static RegisterShipInitFunc initFunc(RegisterShuffleSigns, { "IS_RANDO" }); +static RegisterShipInitFunc registerSignLocations(Rando::StaticData::RegisterSignLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index e17cecac3..fc99508b4 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -647,3 +647,11 @@ Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, collectionCheck }; } + +Rando::Location Rando::Location::Sign(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, ActorID actorId, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_SIGN, area_, actorId, scene_, actorParams_, std::move(shortName_), + hintKey, RG_NONE, false, collectionCheck }; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 618c00f32..7e731a283 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -257,6 +257,10 @@ class Location { int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Sign(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + ActorID actorId_, SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index a562b6c1d..6410e2627 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -242,6 +242,7 @@ void RegionTable_Init_DodongosCavern() { }, { //Locations LOCATION(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, logic->CanBreakMudWalls() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, logic->CanRead()), }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_LOBBY, true), @@ -328,7 +329,10 @@ void RegionTable_Init_DodongosCavern() { //Events EVENT_ACCESS(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS, logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE)), EVENT_ACCESS(LOGIC_DC_EYES_LIT, logic->HasExplosives() || (logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS) && logic->HasItem(RG_GORONS_BRACELET) && ((logic->IsAdult && ctx->GetTrickOption(RT_DC_MQ_ADULT_EYES)) || (logic->IsChild && ctx->GetTrickOption(RT_DC_MQ_CHILD_EYES))))), - }, {}, { + }, { + //Locations + LOCATION(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, logic->CanRead()), + }, { //Exits ENTRANCE(RR_DODONGOS_CAVERN_MQ_LOBBY, true), ENTRANCE(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER, logic->Get(LOGIC_DC_MQ_CLEAR_UPPER_LOBBY_ROCKS)), 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 f5cf05985..f146a9415 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -16,7 +16,10 @@ void RegionTable_Init_ShadowTemple() { #pragma region Vanilla - areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", SCENE_SHADOW_TEMPLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", SCENE_SHADOW_TEMPLE, {}, { + //Locations + LOCATION(RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN, logic->CanRead()), + }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_ENTRYWAY, (ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))), ENTRANCE(RR_SHADOW_TEMPLE_WHISPERING_WALLS_START, ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)), @@ -527,6 +530,7 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR_B3, logic->CanUse(RG_LONGSHOT)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index c5354ba81..7e113d406 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -68,6 +68,7 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_NEAR_STAIRS_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), LOCATION(RC_HC_NEAR_BOULDER_PATH_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), LOCATION(RC_HC_NEAR_ARCHWAY_BUTTERFLY_FAIRY, logic->CanUse(RG_STICKS)), + LOCATION(RC_HC_DEAD_END_RECTANGLE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_HC_GATE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index d0194ac67..bb0a9cd27 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -282,10 +282,11 @@ void RegionTable_Init_DeathMountainCrater() { areaTable[RR_DMC_POTS] = Region("DMC Pots", SCENE_DEATH_MOUNTAIN_CRATER, {}, { // Locations - LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_3, logic->CanBreakPots()), - LOCATION(RC_DMC_NEAR_GC_POT_4, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_3, logic->CanBreakPots()), + LOCATION(RC_DMC_NEAR_GC_POT_4, logic->CanBreakPots()), + LOCATION(RC_DMC_BRIDGE_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_GC_DARUNIAS_CHAMBER, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index 9109ce14a..7e5200f12 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -10,20 +10,28 @@ void RegionTable_Init_DeathMountainTrail() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), }, { //Locations - LOCATION(RC_DMT_CHEST, (logic->BlastOrSmash() || (ctx->GetTrickOption(RT_DMT_BOMBABLE) && logic->IsChild && logic->HasItem(RG_GORONS_BRACELET))) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_DMT_FREESTANDING_POH, logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET)))), - LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), - LOCATION(RC_DMT_GS_NEAR_KAK, logic->BlastOrSmash() && (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->CanGetNightTimeGS() && - ((logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DMT_JS_LOWER_GS) && logic->CanJumpslash())) || - ((ctx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL)) || (ctx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) && - (logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || ((ctx->GetTrickOption(RT_BOULDER_COLLISION) || ctx->GetTrickOption(RT_ITEM_EXTENSION)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))) || logic->CanJumpslash())))), - LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), - LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_DMT_CHEST, (logic->BlastOrSmash() || (ctx->GetTrickOption(RT_DMT_BOMBABLE) && logic->IsChild && logic->HasItem(RG_GORONS_BRACELET))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_DMT_FREESTANDING_POH, logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET)))), + LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->TakeDamage() || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), + LOCATION(RC_DMT_GS_NEAR_KAK, logic->BlastOrSmash() && (logic->HasItem(RG_CLIMB) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->CanGetNightTimeGS() && + ((logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_BOULDER_COLLISION) && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DMT_JS_LOWER_GS) && logic->CanJumpslash())) || + ((ctx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL, RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL)) || (ctx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) && + (logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || ((ctx->GetTrickOption(RT_BOULDER_COLLISION) || ctx->GetTrickOption(RT_ITEM_EXTENSION)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))) || logic->CanJumpslash())))), + LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_DEATH_MOUNTAIN_TRAIL_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN, logic->IsAdult && logic->CanRead()), + LOCATION(RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_DMT_CENTER_TRAIL_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_DMT_TO_UPPER_TRAIL_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_DMT_TO_CENTER_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_DMT_LOWER_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_KAK_BEHIND_GATE, true), @@ -60,6 +68,7 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMT_GOSSIP_STONE, true), LOCATION(RC_BIGGORON_HINT, logic->IsAdult && logic->HasItem(RG_SPEAK_GORON)), + LOCATION(RC_DMT_UPPER_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_DEATH_MOUNTAIN_ROCKFALL, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp index 9d797c0e0..e9115890b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -9,8 +9,9 @@ void RegionTable_Init_GerudoFortress() { areaTable[RR_GF_OUTSKIRTS] = Region("Gerudo Fortress Outskirts", SCENE_GERUDOS_FORTRESS, {}, { //Locations - LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_EAST_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_GV_FORTRESS_SIDE, true), @@ -45,7 +46,10 @@ void RegionTable_Init_GerudoFortress() { areaTable[RR_GF_OUTSIDE_GTG] = Region("GF Outside GTG", SCENE_GERUDOS_FORTRESS, { //Events EVENT_ACCESS(LOGIC_GTG_GATE_OPEN, logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_GERUDO)), - }, {}, { + }, { + //Locations + LOCATION(RC_GF_GTG_ENTRANCE_RECTANGLE_SIGN, logic->IsAdult && logic->CanRead()), + }, { //Exits ENTRANCE(RR_GF_TO_GTG, logic->Get(LOGIC_GTG_GATE_OPEN) && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES))), //Jail @@ -240,6 +244,7 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()), LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RECTANGLE_SIGN, logic->IsAdult && logic->CanRead()), }, { //Exits ENTRANCE(RR_GF_OUTSIDE_GTG, logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)), @@ -248,7 +253,10 @@ void RegionTable_Init_GerudoFortress() { areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", SCENE_GERUDOS_FORTRESS, { //Events EVENT_ACCESS(LOGIC_GF_GATE_OPEN, logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_SPEAK_GERUDO)), - }, {}, { + }, { + //Locations + LOCATION(RC_GF_GATE_EXIT_RECTANGLE_SIGN, logic->IsAdult && logic->CanRead()), + }, { //Exits ENTRANCE(RR_GF_OUTSKIRTS, logic->Get(LOGIC_GF_GATE_OPEN)), ENTRANCE(RR_WASTELAND_NEAR_FORTRESS, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index bd0337a25..7c1fd800d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -10,7 +10,9 @@ void RegionTable_Init_GerudoValley() { EVENT_ACCESS(LOGIC_BUG_ACCESS, logic->IsChild && logic->HasItem(RG_POWER_BRACELET)), }, { //Locations - LOCATION(RC_GV_GS_SMALL_BRIDGE, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_GS_SMALL_BRIDGE, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_BRIDGE_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_GV_EAST_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_HYRULE_FIELD, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index e1995b0ce..8ca66bd5f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -18,24 +18,24 @@ void RegionTable_Init_GoronCity() { (ctx->GetTrickOption(RT_GC_LINK_GORON_DINS) && (logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE)))))), }, { //Locations - LOCATION(RC_GC_MAZE_LEFT_CHEST, (logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_SILVER_GAUNTLETS) || (ctx->GetTrickOption(RT_GC_LEFTMOST) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS))) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GC_MAZE_CENTER_CHEST, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GC_MAZE_RIGHT_CHEST, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GC_POT_FREESTANDING_POH, logic->IsChild && logic->Get(LOGIC_GORON_CITY_CHILD_FIRE) && (logic->CanUse(RG_BOMB_BAG) || (logic->HasItem(RG_GORONS_BRACELET) && ctx->GetTrickOption(RT_GC_POT_STRENGTH)) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_GC_POT)))), - LOCATION(RC_GC_ROLLING_GORON_AS_CHILD, logic->IsChild && logic->HasItem(RG_SPEAK_GORON) && (logic->HasExplosives() || (logic->HasItem(RG_GORONS_BRACELET) && ctx->GetTrickOption(RT_GC_ROLLING_STRENGTH)))), - LOCATION(RC_GC_ROLLING_GORON_AS_ADULT, logic->Get(LOGIC_GORON_CITY_STOP_ROLLING_GORON_AS_ADULT)), - LOCATION(RC_GC_GS_BOULDER_MAZE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_GC_GS_CENTER_PLATFORM, logic->IsAdult && logic->CanAttack()), - LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CallGossipFairyExceptSuns()), - LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_GC_MAZE_GOSSIP_STONE, logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)), - LOCATION(RC_GC_LOWER_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_GC_LOWER_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), - + LOCATION(RC_GC_MAZE_LEFT_CHEST, (logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_SILVER_GAUNTLETS) || (ctx->GetTrickOption(RT_GC_LEFTMOST) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS))) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GC_MAZE_CENTER_CHEST, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GC_MAZE_RIGHT_CHEST, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GC_POT_FREESTANDING_POH, logic->IsChild && logic->Get(LOGIC_GORON_CITY_CHILD_FIRE) && (logic->CanUse(RG_BOMB_BAG) || (logic->HasItem(RG_GORONS_BRACELET) && ctx->GetTrickOption(RT_GC_POT_STRENGTH)) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_GC_POT)))), + LOCATION(RC_GC_ROLLING_GORON_AS_CHILD, logic->IsChild && logic->HasItem(RG_SPEAK_GORON) && (logic->HasExplosives() || (logic->HasItem(RG_GORONS_BRACELET) && ctx->GetTrickOption(RT_GC_ROLLING_STRENGTH)))), + LOCATION(RC_GC_ROLLING_GORON_AS_ADULT, logic->Get(LOGIC_GORON_CITY_STOP_ROLLING_GORON_AS_ADULT)), + LOCATION(RC_GC_GS_BOULDER_MAZE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_GC_GS_CENTER_PLATFORM, logic->IsAdult && logic->CanAttack()), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CallGossipFairyExceptSuns()), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, (logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GC_MAZE_GOSSIP_STONE, logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS)), + LOCATION(RC_GC_LOWER_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_GC_LOWER_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + LOCATION(RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), }, { //Exits ENTRANCE(RR_DEATH_MOUNTAIN_TRAIL, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index b34ab2132..41e1904c2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -33,6 +33,11 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD, RG_GRAVEYARD_BEAN_SOUL)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), LOCATION(RC_GY_NEAR_HUT_GRAVE_BUTTERFLY_FAIRY, logic->IsChild && logic->AtDay && logic->CanUse(RG_STICKS)), + LOCATION(RC_GY_ENTRANCE_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_GY_ENTRANCE_PLINTH, logic->CanRead()), + LOCATION(RC_GY_RIGHT_OF_ROYAL_TOMB_GRAVE, logic->CanRead()), + LOCATION(RC_GY_LEFT_OF_ROYAL_TOMB_GRAVE, logic->CanRead()), + LOCATION(RC_GY_ROYAL_TOMB_GRAVE, logic->CanRead() || logic->CanUse(RG_ZELDAS_LULLABY)), }, { //Exits ENTRANCE(RR_GRAVEYARD_SHIELD_GRAVE, (logic->IsAdult || logic->AtNight) && logic->HasItem(RG_POWER_BRACELET)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index a78cb1f53..8766b6db6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -22,16 +22,18 @@ void RegionTable_Init_HauntedWasteland() { EVENT_ACCESS(LOGIC_CARPET_MERCHANT, logic->HasItem(RG_ADULT_WALLET) && GetCheckPrice(RC_WASTELAND_BOMBCHU_SALESMAN) <= GetWalletCapacity() && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), }, { //Locations - LOCATION(RC_WASTELAND_CHEST, logic->HasFireSource() && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS)) && logic->HasItem(RG_SPEAK_HYLIAN) && GetCheckPrice() <= GetWalletCapacity()), - LOCATION(RC_WASTELAND_GS, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) || (logic->IsAdult && logic->CanGroundJumpslash())), // need to jumpslash immediately with two handed weapons - LOCATION(RC_WASTELAND_NEAR_GS_POT_1, logic->CanBreakPots()), - LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), - LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), - LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), - LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), - LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WASTELAND_CHEST, logic->HasFireSource() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS)) && logic->HasItem(RG_SPEAK_HYLIAN) && GetCheckPrice() <= GetWalletCapacity()), + LOCATION(RC_WASTELAND_GS, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) || (logic->IsAdult && logic->CanGroundJumpslash())), // need to jumpslash immediately with two handed weapons + LOCATION(RC_WASTELAND_NEAR_GS_POT_1, logic->CanBreakPots()), + LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), + LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), + LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_HW_CARPET_SALESMAN_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HW_POE_ALTAR, logic->CanRead()), }, { //Exits ENTRANCE(RR_WASTELAND_NEAR_COLOSSUS, ctx->GetTrickOption(RT_LENS_HW) || logic->CanUse(RG_LENS_OF_TRUTH)), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index 6691f0e94..c11d02741 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -11,163 +11,170 @@ void RegionTable_Init_HyruleField() { EVENT_ACCESS(LOGIC_BORROW_RIGHT_MASKS, logic->IsChild && logic->Get(LOGIC_BORROW_BUNNY_HOOD) && logic->HasItem(RG_KOKIRI_EMERALD) && logic->HasItem(RG_GORON_RUBY) && logic->HasItem(RG_ZORA_SAPPHIRE) && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN)), }, { //Locations - LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), - LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), - LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()), - LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()), - LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), - LOCATION(RC_HF_NEAR_LLR_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_LH_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_NEAR_GV_TREE, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_ADULT_NEAR_GV_TREE, logic->IsAdult && logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_ZR_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_KAK_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_KAK_SMALL_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_MARKET_TREE_1, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_MARKET_TREE_2, logic->CanBonkTrees()), - LOCATION(RC_HF_NEAR_MARKET_TREE_3, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_1, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_2, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_3, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_4, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_5, logic->CanBonkTrees()), - LOCATION(RC_HF_NORTHWEST_TREE_6, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_1, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_2, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_3, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_4, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_5, logic->CanBonkTrees()), - LOCATION(RC_HF_EAST_TREE_6, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_1, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_2, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_3, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_4, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_5, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_6, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_7, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_8, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_9, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_10, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_11, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_12, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_13, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_14, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_15, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_16, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_17, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_18, logic->CanBonkTrees()), - LOCATION(RC_HF_SOUTHEAST_TREE_19, logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_1, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_2, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_3, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_4, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_5, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_6, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_HF_TEKTITE_GROTTO_TREE, logic->CanBonkTrees()), - LOCATION(RC_HF_BUSH_NEAR_LAKE_1, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_2, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_3, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_4, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_5, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_6, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_7, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_8, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_9, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_10, true), - LOCATION(RC_HF_BUSH_NEAR_LAKE_11, true), - LOCATION(RC_HF_NORTHERN_BUSH_1, true), - LOCATION(RC_HF_NORTHERN_BUSH_2, true), - LOCATION(RC_HF_NORTHERN_BUSH_3, true), - LOCATION(RC_HF_NORTHERN_BUSH_4, true), - LOCATION(RC_HF_NORTHERN_BUSH_5, true), - LOCATION(RC_HF_NORTHERN_BUSH_6, true), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_1, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_2, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_3, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_4, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_5, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_6, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_7, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_8, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_9, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_10, logic->IsChild), - LOCATION(RC_HF_CHILD_NORTHERN_BUSH_11, logic->IsChild), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_1, true), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_2, true), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_3, true), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_4, true), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_5, true), - LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_6, true), - LOCATION(RC_HF_SOUTHERN_BUSH_1, true), - LOCATION(RC_HF_SOUTHERN_BUSH_2, true), - LOCATION(RC_HF_SOUTHERN_BUSH_3, true), - LOCATION(RC_HF_SOUTHERN_BUSH_4, true), - LOCATION(RC_HF_SOUTHERN_BUSH_5, true), - LOCATION(RC_HF_SOUTHERN_BUSH_6, true), - LOCATION(RC_HF_SOUTHERN_BUSH_7, true), - LOCATION(RC_HF_SOUTHERN_BUSH_8, true), - LOCATION(RC_HF_SOUTHERN_BUSH_9, true), - LOCATION(RC_HF_SOUTHERN_BUSH_10, true), - LOCATION(RC_HF_SOUTHERN_BUSH_11, true), - LOCATION(RC_HF_SOUTHERN_BUSH_12, true), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_1, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_2, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_3, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_4, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_5, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_6, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_7, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_8, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_9, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_10, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_11, logic->IsChild), - LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_12, logic->IsChild), + LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_LLR_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_LH_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_NEAR_GV_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_ADULT_NEAR_GV_TREE, logic->IsAdult && logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_ZR_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_KAK_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_KAK_SMALL_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_MARKET_TREE_1, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_MARKET_TREE_2, logic->CanBonkTrees()), + LOCATION(RC_HF_NEAR_MARKET_TREE_3, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_1, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_2, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_3, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_4, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_5, logic->CanBonkTrees()), + LOCATION(RC_HF_NORTHWEST_TREE_6, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_1, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_2, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_3, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_4, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_5, logic->CanBonkTrees()), + LOCATION(RC_HF_EAST_TREE_6, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_1, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_2, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_3, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_4, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_5, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_6, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_7, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_8, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_9, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_10, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_11, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_12, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_13, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_14, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_15, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_16, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_17, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_18, logic->CanBonkTrees()), + LOCATION(RC_HF_SOUTHEAST_TREE_19, logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_1, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_2, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_3, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_4, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_5, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_6, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_HF_TEKTITE_GROTTO_TREE, logic->CanBonkTrees()), + LOCATION(RC_HF_BUSH_NEAR_LAKE_1, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_2, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_3, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_4, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_5, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_6, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_7, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_8, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_9, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_10, true), + LOCATION(RC_HF_BUSH_NEAR_LAKE_11, true), + LOCATION(RC_HF_NORTHERN_BUSH_1, true), + LOCATION(RC_HF_NORTHERN_BUSH_2, true), + LOCATION(RC_HF_NORTHERN_BUSH_3, true), + LOCATION(RC_HF_NORTHERN_BUSH_4, true), + LOCATION(RC_HF_NORTHERN_BUSH_5, true), + LOCATION(RC_HF_NORTHERN_BUSH_6, true), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_1, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_2, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_3, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_4, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_5, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_6, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_7, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_8, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_9, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_10, logic->IsChild), + LOCATION(RC_HF_CHILD_NORTHERN_BUSH_11, logic->IsChild), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_1, true), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_2, true), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_3, true), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_4, true), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_5, true), + LOCATION(RC_HF_BUSH_BY_ROCKY_PATH_6, true), + LOCATION(RC_HF_SOUTHERN_BUSH_1, true), + LOCATION(RC_HF_SOUTHERN_BUSH_2, true), + LOCATION(RC_HF_SOUTHERN_BUSH_3, true), + LOCATION(RC_HF_SOUTHERN_BUSH_4, true), + LOCATION(RC_HF_SOUTHERN_BUSH_5, true), + LOCATION(RC_HF_SOUTHERN_BUSH_6, true), + LOCATION(RC_HF_SOUTHERN_BUSH_7, true), + LOCATION(RC_HF_SOUTHERN_BUSH_8, true), + LOCATION(RC_HF_SOUTHERN_BUSH_9, true), + LOCATION(RC_HF_SOUTHERN_BUSH_10, true), + LOCATION(RC_HF_SOUTHERN_BUSH_11, true), + LOCATION(RC_HF_SOUTHERN_BUSH_12, true), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_1, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_2, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_3, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_4, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_5, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_6, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_7, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_8, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_9, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_10, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_11, logic->IsChild), + LOCATION(RC_HF_CHILD_SOUTHERN_BUSH_12, logic->IsChild), + LOCATION(RC_HF_CASTLE_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_WOODED_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_ROCKY_PATH_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_FENCED_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_CENTER_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_RIVER_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_HF_STAIRS_EXIT_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_LW_BRIDGE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index de64cc2f7..77eced01d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -60,6 +60,10 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), LOCATION(RC_KAK_TREE, logic->CanBonkTrees()), + LOCATION(RC_KAK_GUARD_GATE_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KAK_WELL_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KAK_FRONT_GATE_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_HYRULE_FIELD, true), @@ -215,7 +219,8 @@ void RegionTable_Init_Kakariko() { areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations - LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN, logic->IsAdult && logic->CanRead()), }, { //Exits ENTRANCE(RR_KAKARIKO_VILLAGE, 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 d0e78f824..70ce57bf5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -11,62 +11,77 @@ void RegionTable_Init_KokiriForest() { EVENT_ACCESS(LOGIC_SHOWED_MIDO_SWORD_AND_SHIELD, logic->IsChild && logic->HasItem(RG_SPEAK_KOKIRI) && logic->CanUse(RG_KOKIRI_SWORD) && logic->CanUse(RG_DEKU_SHIELD)), }, { //Locations - LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanGetNightTimeGS()), - LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), - LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->CanGetNightTimeGS() && - (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) || - (ctx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)))), - LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_KF_BRIDGE_RUPEE, logic->IsChild), - LOCATION(RC_KF_BEHIND_MIDOS_RUPEE, logic->IsChild), - LOCATION(RC_KF_SOUTH_GRASS_WEST_RUPEE, logic->IsChild), - LOCATION(RC_KF_SOUTH_GRASS_EAST_RUPEE, logic->IsChild), - LOCATION(RC_KF_NORTH_GRASS_WEST_RUPEE, logic->IsChild), - LOCATION(RC_KF_NORTH_GRASS_EAST_RUPEE, logic->IsChild), - LOCATION(RC_KF_BEAN_RUPEE_1, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RUPEE_2, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RUPEE_3, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RUPEE_4, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_KF_SARIAS_ROOF_WEST_HEART, logic->IsChild), - LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), - LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), - LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), - LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanGetNightTimeGS()), + LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanSpawnSoilSkull(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->CanGetNightTimeGS() && + (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) || + (ctx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)))), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->HasItem(RG_KOKIRI_FOREST_BEAN_SOUL) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BRIDGE_RUPEE, logic->IsChild), + LOCATION(RC_KF_BEHIND_MIDOS_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_BEAN_RUPEE_1, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RUPEE_2, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RUPEE_3, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RUPEE_4, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST, RG_KOKIRI_FOREST_BEAN_SOUL) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_KF_SARIAS_ROOF_WEST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), + LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_DEKU_TREE_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_KF_STEPPING_STONES_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_KF_LINKS_HOUSE_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_LOST_WOODS_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_KF_HOUSE_OF_TWINS_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KF_SHOP_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KF_SARIAS_HOUSE_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KF_LOST_WOODS_ARROW_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_MIDOS_HOUSE_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_KF_BOULDER_LOOP, logic->CanUse(RG_CRAWL)), @@ -86,12 +101,13 @@ void RegionTable_Init_KokiriForest() { areaTable[RR_KF_BOULDER_LOOP] = Region("KF Boulder Loop", SCENE_KOKIRI_FOREST, {}, { //Locations - LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_KF_BOULDER_RUPEE_1, logic->IsChild), - LOCATION(RC_KF_BOULDER_RUPEE_2, logic->IsChild), - LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_KF_BOULDER_RUPEE_1, logic->IsChild), + LOCATION(RC_KF_BOULDER_RUPEE_2, logic->IsChild), + LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), }, { //Exits ENTRANCE(RR_KOKIRI_FOREST, logic->CanUse(RG_CRAWL)), @@ -124,8 +140,9 @@ void RegionTable_Init_KokiriForest() { areaTable[RR_KF_LINKS_HOUSE] = Region("KF Link's House", SCENE_LINKS_HOUSE, {}, { //Locations - LOCATION(RC_KF_LINKS_HOUSE_COW, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && logic->Get(LOGIC_LINKS_COW)), - LOCATION(RC_KF_LINKS_HOUSE_POT, logic->HasItem(RG_POWER_BRACELET)), // TODO: CanBreakPots() restricted + LOCATION(RC_KF_LINKS_HOUSE_COW, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && logic->Get(LOGIC_LINKS_COW)), + LOCATION(RC_KF_LINKS_HOUSE_POT, logic->HasItem(RG_POWER_BRACELET)), // TODO: CanBreakPots() restricted + LOCATION(RC_KF_LINKS_HOUSE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_KF_LINKS_PORCH, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 7aefb5440..9619fc569 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -80,6 +80,9 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_LH_SCARECROW_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), + LOCATION(RC_LH_LAB_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_LH_NORTH_EXIT_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_LH_ISLAND_PEDESTAL, logic->CanRead()), }, { //Exits ENTRANCE(RR_HF_TO_LAKE_HYLIA, true), @@ -103,7 +106,10 @@ void RegionTable_Init_LakeHylia() { ENTRANCE(RR_WATER_TEMPLE_ENTRYWAY, logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)))), }); - areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", SCENE_LAKE_HYLIA, {}, {}, { + areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", SCENE_LAKE_HYLIA, {}, { + //Locations + LOCATION(RC_LH_FISHING_SIGN, logic->CanRead()), + }, { //Exits ENTRANCE(RR_LAKE_HYLIA, logic->HasItem(RG_BRONZE_SCALE)), ENTRANCE(RR_LH_FISHING_POND, logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY)), @@ -131,43 +137,44 @@ void RegionTable_Init_LakeHylia() { // TODO: should some of these helpers be done via events instead? areaTable[RR_LH_FISHING_POND] = Region("LH Fishing Hole", SCENE_FISHING_POND, {}, { //Locations - LOCATION(RC_LH_CHILD_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsChild), - LOCATION(RC_LH_CHILD_FISH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_3, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_4, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_5, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_6, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_7, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_8, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_9, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_10, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_11, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_12, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_13, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_14, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_FISH_15, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_LOACH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_CHILD_LOACH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), - LOCATION(RC_LH_ADULT_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult), - LOCATION(RC_LH_ADULT_FISH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_3, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_4, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_5, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_6, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_7, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_8, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_9, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_10, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_11, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_12, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_13, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_14, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_FISH_15, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_ADULT_LOACH, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), - LOCATION(RC_LH_HYRULE_LOACH, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN)), - LOCATION(RC_FISHING_POLE_HINT, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_LH_CHILD_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsChild), + LOCATION(RC_LH_CHILD_FISH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_3, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_4, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_5, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_6, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_7, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_8, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_9, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_10, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_11, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_12, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_13, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_14, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_FISH_15, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_LOACH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_CHILD_LOACH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), + LOCATION(RC_LH_ADULT_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult), + LOCATION(RC_LH_ADULT_FISH_1, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_2, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_3, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_4, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_5, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_6, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_7, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_8, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_9, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_10, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_11, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_12, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_13, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_14, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_FISH_15, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_ADULT_LOACH, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->IsAdult && ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)), + LOCATION(RC_LH_HYRULE_LOACH, logic->CanUse(RG_FISHING_POLE) && logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_FISHING_POLE_HINT, logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_LH_FISHING_POND_RECTANGLE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_LH_FISHING_ISLAND, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index e9ccde9ed..d6b1d5429 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -125,6 +125,7 @@ void RegionTable_Init_LostWoods() { //Locations LOCATION(RC_DEKU_THEATER_SKULL_MASK, logic->CanUse(RG_SKULL_MASK)), LOCATION(RC_DEKU_THEATER_MASK_OF_TRUTH, logic->CanUse(RG_MASK_OF_TRUTH) && logic->HasItem(RG_SPEAK_DEKU)), + LOCATION(RC_LW_THEATER_RECTANGLE_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_LW_BEYOND_MIDO, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 9eabf6c29..352c35f12 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -149,7 +149,8 @@ void RegionTable_Init_Market() { EVENT_ACCESS(LOGIC_BORROW_RIGHT_MASKS, ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_COMPLETED) && logic->HasItem(RG_SPEAK_HYLIAN) && logic->Get(LOGIC_CAN_BORROW_MASKS)), }, { //Locations - LOCATION(RC_MASK_SHOP_HINT, true), + LOCATION(RC_MASK_SHOP_HINT, true), + LOCATION(RC_MK_MASK_SHOP_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_THE_MARKET, true), @@ -157,7 +158,8 @@ void RegionTable_Init_Market() { areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations - LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), }, { //Exits ENTRANCE(RR_THE_MARKET, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp index 8871ee293..3089f75ef 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp @@ -34,6 +34,7 @@ void RegionTable_Init_TempleOfTime() { LOCATION(RC_ALTAR_HINT_CHILD, logic->IsChild), LOCATION(RC_ALTAR_HINT_ADULT, logic->IsAdult), LOCATION(RC_TOT_SHEIK_HINT, logic->IsAdult && logic->HasItem(RG_SPEAK_HYLIAN)), + LOCATION(RC_TOT_ALTAR, logic->CanRead()), }, { //Exits ENTRANCE(RR_TOT_ENTRANCE, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 87c97f6b3..5f824b709 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -35,6 +35,11 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_NEAR_SHOP_POT_3, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_4, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_5, logic->CanBreakPots()), + LOCATION(RC_ZD_SHOP_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_ZD_ENTRANCE_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_ZD_KING_ZORA_PATH_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN, logic->CanRead()), + LOCATION(RC_ZD_NEAR_KING_ZORA_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_ZR_BEHIND_WATERFALL, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index 3b68da385..da6a5f714 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -10,26 +10,28 @@ void RegionTable_Init_ZorasFountain() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CallGossipFairyExceptSuns() || (logic->CanUse(RG_STICKS) && logic->AtDay)), }, { //Locations - LOCATION(RC_ZF_GS_TREE, logic->IsChild && logic->CanBonkTrees() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), - LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), - LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), - LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_TREE, logic->IsChild && logic->CanBonkTrees()), - LOCATION(RC_ZF_BUSH_1, logic->IsChild), - LOCATION(RC_ZF_BUSH_2, logic->IsChild), - LOCATION(RC_ZF_BUSH_3, logic->IsChild), - LOCATION(RC_ZF_BUSH_4, logic->IsChild), - LOCATION(RC_ZF_BUSH_5, logic->IsChild), - LOCATION(RC_ZF_BUSH_6, logic->IsChild), - LOCATION(RC_ZF_LOG_BUTTERFLY_FAIRY, logic->IsChild && logic->AtDay && logic->CanUse(RG_STICKS)), + LOCATION(RC_ZF_GS_TREE, logic->IsChild && logic->CanBonkTrees() && (logic->HasItem(RG_POWER_BRACELET) || logic->CanKillEnemy(RE_GOLD_SKULLTULA))), + LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), + LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), + LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_TREE, logic->IsChild && logic->CanBonkTrees()), + LOCATION(RC_ZF_BUSH_1, logic->IsChild), + LOCATION(RC_ZF_BUSH_2, logic->IsChild), + LOCATION(RC_ZF_BUSH_3, logic->IsChild), + LOCATION(RC_ZF_BUSH_4, logic->IsChild), + LOCATION(RC_ZF_BUSH_5, logic->IsChild), + LOCATION(RC_ZF_BUSH_6, logic->IsChild), + LOCATION(RC_ZF_LOG_BUTTERFLY_FAIRY, logic->IsChild && logic->AtDay && logic->CanUse(RG_STICKS)), + LOCATION(RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN, logic->IsChild && logic->CanRead()), + LOCATION(RC_ZF_ENTRANCE_ARROW_SIGN, logic->CanRead()), }, { //Exits ENTRANCE(RR_ZD_BEHIND_KING_ZORA, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 9ee33c325..a4dff23b3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -58,6 +58,7 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanUse(RG_BOOMERANG)), LOCATION(RC_ZR_NEAR_ROCK_CIRCLE_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), LOCATION(RC_ZR_WATERFALL_BUTTERFLY_FAIRY, logic->IsChild && logic->CanUse(RG_STICKS)), + LOCATION(RC_ZR_SLEEPLESS_WATERFALL_PLAQUE, logic->CanRead()), }, { //Exits ENTRANCE(RR_ZR_FRONT, logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_POWER_BRACELET) || logic->BlastOrSmash() || logic->HasItem(RG_HOVER_BOOTS)), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 18366f479..075296105 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1334,6 +1334,10 @@ bool Logic::CanBonkTrees() { return true; } +bool Logic::CanRead() { + return true; +} + bool Logic::HasExplosives() { return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index fd86befc4..496a6190c 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -105,6 +105,7 @@ class Logic { bool CanBreakCrates(); bool CanBreakSmallCrates(); bool CanBonkTrees(); + bool CanRead(); bool HasFireSource(); bool HasFireSourceWithTorch(); bool SunlightArrows(); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 6fc8dda5e..a837b2ed2 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -312,6 +312,17 @@ void Settings::CreateOptionDescriptions() { "only shuffle with No Logic."; mOptionDescriptions[RSK_SHUFFLE_BUSHES] = "Bushes in Hyrule Field & Zora's Fountain will contain randomized items when first walked through."; + mOptionDescriptions[RSK_SHUFFLE_SIGNS] = "Signs and readable pedestals, plinths, altars, and graves will grant a " + "randomized item the first time they are read. " + "Signs will have a particle effect when they hold a randomized item.\n" + "\n" + "Off - Signs will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle signs that are within dungeons.\n" + "\n" + "Overworld - Only shuffle signs that are outside of dungeons.\n" + "\n" + "All Signs - Shuffle all signs."; mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index aa3a05dff..23acc4c5a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2980,6 +2980,80 @@ std::map rcToRandomizerInf = { { RC_ZF_BUSH_4, RAND_INF_ZF_BUSH_4 }, { RC_ZF_BUSH_5, RAND_INF_ZF_BUSH_5 }, { RC_ZF_BUSH_6, RAND_INF_ZF_BUSH_6 }, + { RC_KF_DEKU_TREE_RECTANGLE_SIGN, RAND_INF_KF_DEKU_TREE_RECTANGLE_SIGN }, + { RC_KF_STEPPING_STONES_RECTANGLE_SIGN, RAND_INF_KF_STEPPING_STONES_RECTANGLE_SIGN }, + { RC_KF_LINKS_HOUSE_RECTANGLE_SIGN, RAND_INF_KF_LINKS_HOUSE_RECTANGLE_SIGN }, + { RC_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN, RAND_INF_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN }, + { RC_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN, RAND_INF_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN }, + { RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN, RAND_INF_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN }, + { RC_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN, RAND_INF_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN }, + { RC_KF_LOST_WOODS_RECTANGLE_SIGN, RAND_INF_KF_LOST_WOODS_RECTANGLE_SIGN }, + { RC_KF_HOUSE_OF_TWINS_ARROW_SIGN, RAND_INF_KF_HOUSE_OF_TWINS_ARROW_SIGN }, + { RC_KF_SHOP_ARROW_SIGN, RAND_INF_KF_SHOP_ARROW_SIGN }, + { RC_KF_SARIAS_HOUSE_ARROW_SIGN, RAND_INF_KF_SARIAS_HOUSE_ARROW_SIGN }, + { RC_KF_LOST_WOODS_ARROW_SIGN, RAND_INF_KF_LOST_WOODS_ARROW_SIGN }, + { RC_KF_MIDOS_HOUSE_ARROW_SIGN, RAND_INF_KF_MIDOS_HOUSE_ARROW_SIGN }, + { RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN, RAND_INF_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN }, + { RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN, RAND_INF_KF_INNER_TRAINING_CENTER_ARROW_SIGN }, + { RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN, RAND_INF_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN }, + { RC_KF_LINKS_HOUSE_SIGN, RAND_INF_KF_LINKS_HOUSE_SIGN }, + { RC_LW_THEATER_RECTANGLE_SIGN, RAND_INF_LW_THEATER_RECTANGLE_SIGN }, + { RC_HF_CASTLE_EXIT_ARROW_SIGN, RAND_INF_HF_CASTLE_EXIT_ARROW_SIGN }, + { RC_HF_WOODED_EXIT_ARROW_SIGN, RAND_INF_HF_WOODED_EXIT_ARROW_SIGN }, + { RC_HF_ROCKY_PATH_EXIT_ARROW_SIGN, RAND_INF_HF_ROCKY_PATH_EXIT_ARROW_SIGN }, + { RC_HF_FENCED_ARROW_SIGN, RAND_INF_HF_FENCED_ARROW_SIGN }, + { RC_HF_CENTER_EXIT_ARROW_SIGN, RAND_INF_HF_CENTER_EXIT_ARROW_SIGN }, + { RC_HF_RIVER_EXIT_ARROW_SIGN, RAND_INF_HF_RIVER_EXIT_ARROW_SIGN }, + { RC_HF_STAIRS_EXIT_ARROW_SIGN, RAND_INF_HF_STAIRS_EXIT_ARROW_SIGN }, + { RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN, RAND_INF_MK_SHOOTING_GALLERY_RECTANGLE_SIGN }, + { RC_MK_MASK_SHOP_SIGN, RAND_INF_MK_MASK_SHOP_SIGN }, + { RC_TOT_ALTAR, RAND_INF_TOT_ALTAR }, + { RC_HC_DEAD_END_RECTANGLE_SIGN, RAND_INF_HC_DEAD_END_RECTANGLE_SIGN }, + { RC_KAK_GUARD_GATE_RECTANGLE_SIGN, RAND_INF_KAK_GUARD_GATE_RECTANGLE_SIGN }, + { RC_KAK_WELL_RECTANGLE_SIGN, RAND_INF_KAK_WELL_RECTANGLE_SIGN }, + { RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN, RAND_INF_KAK_SOUTHEAST_EXIT_ARROW_SIGN }, + { RC_KAK_FRONT_GATE_ARROW_SIGN, RAND_INF_KAK_FRONT_GATE_ARROW_SIGN }, + { RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN, RAND_INF_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN }, + { RC_GY_ENTRANCE_RECTANGLE_SIGN, RAND_INF_GY_ENTRANCE_RECTANGLE_SIGN }, + { RC_GY_ENTRANCE_PLINTH, RAND_INF_GY_ENTRANCE_PLINTH }, + { RC_GY_RIGHT_OF_ROYAL_TOMB_GRAVE, RAND_INF_GY_RIGHT_OF_ROYAL_TOMB_GRAVE }, + { RC_GY_LEFT_OF_ROYAL_TOMB_GRAVE, RAND_INF_GY_LEFT_OF_ROYAL_TOMB_GRAVE }, + { RC_GY_ROYAL_TOMB_GRAVE, RAND_INF_GY_ROYAL_TOMB_GRAVE }, + { RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN, RAND_INF_DMT_ABOVE_DODONGO_RECTANGLE_SIGN }, + { RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN, RAND_INF_DMT_ADULT_CENTER_EXIT_ARROW_SIGN }, + { RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN, RAND_INF_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN }, + { RC_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN, RAND_INF_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN }, + { RC_DMT_CENTER_TRAIL_RECTANGLE_SIGN, RAND_INF_DMT_CENTER_TRAIL_RECTANGLE_SIGN }, + { RC_DMT_TO_UPPER_TRAIL_ARROW_SIGN, RAND_INF_DMT_TO_UPPER_TRAIL_ARROW_SIGN }, + { RC_DMT_UPPER_EXIT_ARROW_SIGN, RAND_INF_DMT_UPPER_EXIT_ARROW_SIGN }, + { RC_DMT_TO_CENTER_EXIT_ARROW_SIGN, RAND_INF_DMT_TO_CENTER_EXIT_ARROW_SIGN }, + { RC_DMT_LOWER_EXIT_ARROW_SIGN, RAND_INF_DMT_LOWER_EXIT_ARROW_SIGN }, + { RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN, RAND_INF_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN }, + { RC_DMC_BRIDGE_EXIT_ARROW_SIGN, RAND_INF_DMC_BRIDGE_EXIT_ARROW_SIGN }, + { RC_ZR_SLEEPLESS_WATERFALL_PLAQUE, RAND_INF_ZR_SLEEPLESS_WATERFALL_PLAQUE }, + { RC_ZD_SHOP_RECTANGLE_SIGN, RAND_INF_ZD_SHOP_RECTANGLE_SIGN }, + { RC_ZD_ENTRANCE_RECTANGLE_SIGN, RAND_INF_ZD_ENTRANCE_RECTANGLE_SIGN }, + { RC_ZD_KING_ZORA_PATH_ARROW_SIGN, RAND_INF_ZD_KING_ZORA_PATH_ARROW_SIGN }, + { RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN, RAND_INF_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN }, + { RC_ZD_NEAR_KING_ZORA_ARROW_SIGN, RAND_INF_ZD_NEAR_KING_ZORA_ARROW_SIGN }, + { RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN, RAND_INF_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN }, + { RC_ZF_ENTRANCE_ARROW_SIGN, RAND_INF_ZF_ENTRANCE_ARROW_SIGN }, + { RC_LH_LAB_RECTANGLE_SIGN, RAND_INF_LH_LAB_RECTANGLE_SIGN }, + { RC_LH_NORTH_EXIT_ARROW_SIGN, RAND_INF_LH_NORTH_EXIT_ARROW_SIGN }, + { RC_LH_FISHING_SIGN, RAND_INF_LH_FISHING_SIGN }, + { RC_LH_ISLAND_PEDESTAL, RAND_INF_LH_ISLAND_PEDESTAL }, + { RC_LH_FISHING_POND_RECTANGLE_SIGN, RAND_INF_LH_FISHING_POND_RECTANGLE_SIGN }, + { RC_GV_BRIDGE_RECTANGLE_SIGN, RAND_INF_GV_BRIDGE_RECTANGLE_SIGN }, + { RC_GV_EAST_EXIT_ARROW_SIGN, RAND_INF_GV_EAST_EXIT_ARROW_SIGN }, + { RC_GF_EAST_EXIT_ARROW_SIGN, RAND_INF_GF_EAST_EXIT_ARROW_SIGN }, + { RC_GF_HBA_RECTANGLE_SIGN, RAND_INF_GF_HBA_RECTANGLE_SIGN }, + { RC_GF_GATE_EXIT_RECTANGLE_SIGN, RAND_INF_GF_GATE_EXIT_RECTANGLE_SIGN }, + { RC_GF_GTG_ENTRANCE_RECTANGLE_SIGN, RAND_INF_GF_GTG_ENTRANCE_RECTANGLE_SIGN }, + { RC_HW_CARPET_SALESMAN_ARROW_SIGN, RAND_INF_HW_CARPET_SALESMAN_ARROW_SIGN }, + { RC_HW_POE_ALTAR, RAND_INF_HW_POE_ALTAR }, + { RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL, RAND_INF_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL }, + { RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN, RAND_INF_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN }, + { RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN, RAND_INF_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN }, }; CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -3121,6 +3195,16 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, specialRc = RC_DODONGOS_CAVERN_GOSSIP_STONE; } break; + case SCENE_SHOOTING_GALLERY: + // special case for shooting gallery sign + if (actorId == ACTOR_EN_KANBAN) { + if (LINK_IS_ADULT) { + specialRc = RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN; + } else { + specialRc = RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN; + } + } + break; } if (specialRc != RC_UNKNOWN_CHECK) { @@ -3424,6 +3508,65 @@ CheckIdentity Randomizer::IdentifyTree(s32 sceneNum, s32 posX, s32 posZ) { return treeIdentity; } +CheckIdentity Randomizer::IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id) { + struct CheckIdentity signIdentity; + uint32_t signSceneNum = sceneNum; + Rando::Location* location = nullptr; + + // align child/adult signs + if (sceneNum == SCENE_KAKARIKO_VILLAGE && LINK_IS_ADULT && posX == 1165 && posZ == 1545) { + posZ = 1550; + } else if (sceneNum == SCENE_GRAVEYARD && LINK_IS_ADULT) { + if (id == ACTOR_EN_WONDER_TALK2 && posX == -807 && posZ == 266) { + posX = -805; + } else if (id == ACTOR_EN_WONDER_TALK) { + if (posX == 634 && posZ == 260) { + posX = 654; + posZ = 258; + } else if (posX == 634 && posZ == -100) { + posX = 654; + posZ = -102; + } else if (posX == 753 && posZ == 85) { + posX = 752; + } + } + } else if (sceneNum == SCENE_ZORAS_RIVER && LINK_IS_ADULT && posX == 4097 && posZ == -1399) { + posX = 4096; + posZ = -1401; + } + + signIdentity.randomizerInf = RAND_INF_MAX; + signIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + switch (id) { + case ACTOR_EN_KANBAN: + location = GetCheckObjectFromActor(ACTOR_EN_KANBAN, signSceneNum, actorParams); + break; + case ACTOR_EN_A_OBJ: + location = GetCheckObjectFromActor(ACTOR_EN_A_OBJ, signSceneNum, actorParams); + break; + case ACTOR_EN_WONDER_TALK2: + location = GetCheckObjectFromActor(ACTOR_EN_WONDER_TALK2, signSceneNum, actorParams); + break; + case ACTOR_EN_WONDER_TALK: + location = GetCheckObjectFromActor(ACTOR_EN_WONDER_TALK, signSceneNum, actorParams); + break; + default: + return signIdentity; + } + + if (location == nullptr || location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifySign did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + } else { + signIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + signIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return signIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index b64a804e4..babb1c5dc 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -43,6 +43,7 @@ class Randomizer { CheckIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); CheckIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); CheckIdentity IdentifyTree(s32 sceneNum, s32 posX, s32 posZ); + CheckIdentity IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h index a525f39c2..0ba94e8fb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h @@ -2573,6 +2573,84 @@ RANDO_ENUM_ITEM(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7) RANDO_ENUM_ITEM(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8) // End Grass +// Overworld Signs +RANDO_ENUM_ITEM(RC_KF_DEKU_TREE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_STEPPING_STONES_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_LINKS_HOUSE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_LOST_WOODS_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KF_HOUSE_OF_TWINS_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_SHOP_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_SARIAS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_LOST_WOODS_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_MIDOS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_INNER_TRAINING_CENTER_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KF_LINKS_HOUSE_SIGN) +RANDO_ENUM_ITEM(RC_LW_THEATER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_HF_CASTLE_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_WOODED_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_ROCKY_PATH_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_FENCED_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_RIVER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HF_STAIRS_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_MK_SHOOTING_GALLERY_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_MK_MASK_SHOP_SIGN) +RANDO_ENUM_ITEM(RC_TOT_ALTAR) +RANDO_ENUM_ITEM(RC_HC_DEAD_END_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KAK_GUARD_GATE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KAK_WELL_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_KAK_SOUTHEAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KAK_FRONT_GATE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GY_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GY_ENTRANCE_PLINTH) +RANDO_ENUM_ITEM(RC_GY_RIGHT_OF_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RC_GY_LEFT_OF_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RC_GY_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RC_DMT_ABOVE_DODONGO_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_DMT_ADULT_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_DMT_CENTER_TRAIL_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_DMT_TO_UPPER_TRAIL_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_DMT_UPPER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_DMT_TO_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_DMT_LOWER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_DMC_BRIDGE_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_ZR_SLEEPLESS_WATERFALL_PLAQUE) +RANDO_ENUM_ITEM(RC_ZD_SHOP_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_ZD_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_ZD_KING_ZORA_PATH_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_ZD_NEAR_KING_ZORA_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_ZF_ENTRANCE_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_LH_LAB_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_LH_NORTH_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_LH_FISHING_SIGN) +RANDO_ENUM_ITEM(RC_LH_ISLAND_PEDESTAL) +RANDO_ENUM_ITEM(RC_LH_FISHING_POND_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GV_BRIDGE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GV_EAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_GF_EAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_GF_HBA_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GF_GATE_EXIT_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_GF_GTG_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RC_HW_CARPET_SALESMAN_ARROW_SIGN) +RANDO_ENUM_ITEM(RC_HW_POE_ALTAR) +// Dungeon Signs +RANDO_ENUM_ITEM(RC_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL) +RANDO_ENUM_ITEM(RC_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN) +// MQ Dungeon Signs +RANDO_ENUM_ITEM(RC_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN) + RANDO_ENUM_ITEM(RC_MAX) RANDO_ENUM_END(RandomizerCheck) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h index 16ae03a7f..18fa5e72b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h @@ -1553,6 +1553,31 @@ RANDO_ENUM_ITEM(RHT_DEKU_TREE_GRASS) RANDO_ENUM_ITEM(RHT_DODONGOS_CAVERN_GRASS) RANDO_ENUM_ITEM(RHT_BOTTOM_OF_THE_WELL_GRASS) RANDO_ENUM_ITEM(RHT_JABU_JABUS_BELLY_GRASS) +// SIGNS +RANDO_ENUM_ITEM(RHT_SIGN_KOKIRI_FOREST) +RANDO_ENUM_ITEM(RHT_SIGN_LINKS_HOUSE) +RANDO_ENUM_ITEM(RHT_SIGN_DEKU_THEATER) +RANDO_ENUM_ITEM(RHT_SIGN_HYRULE_FIELD) +RANDO_ENUM_ITEM(RHT_SIGN_MK_SHOOTING_GALLERY) +RANDO_ENUM_ITEM(RHT_SIGN_HAPPY_MASK_SHOP) +RANDO_ENUM_ITEM(RHT_SIGN_TEMPLE_OF_TIME) +RANDO_ENUM_ITEM(RHT_SIGN_HYRULE_CASTLE) +RANDO_ENUM_ITEM(RHT_SIGN_KAKARIKO_VILLAGE) +RANDO_ENUM_ITEM(RHT_SIGN_KAK_SHOOTING_GALLERY) +RANDO_ENUM_ITEM(RHT_SIGN_GRAVEYARD) +RANDO_ENUM_ITEM(RHT_SIGN_DEATH_MOUNTAIN_TRAIL) +RANDO_ENUM_ITEM(RHT_SIGN_GORON_CITY) +RANDO_ENUM_ITEM(RHT_SIGN_DEATH_MOUNTAIN_CRATER) +RANDO_ENUM_ITEM(RHT_SIGN_ZORAS_RIVER) +RANDO_ENUM_ITEM(RHT_SIGN_ZORAS_DOMAIN) +RANDO_ENUM_ITEM(RHT_SIGN_ZORAS_FOUNTAIN) +RANDO_ENUM_ITEM(RHT_SIGN_LAKE_HYLIA) +RANDO_ENUM_ITEM(RHT_SIGN_FISHING_POND) +RANDO_ENUM_ITEM(RHT_SIGN_GERUDO_VALLEY) +RANDO_ENUM_ITEM(RHT_SIGN_GERUDO_FORTRESS) +RANDO_ENUM_ITEM(RHT_SIGN_HAUNTED_WASTELAND) +RANDO_ENUM_ITEM(RHT_SIGN_DODONGOS_CAVERN) +RANDO_ENUM_ITEM(RHT_SIGN_SHADOW_TEMPLE) // MAX RANDO_ENUM_ITEM(RHT_MAX) RANDO_ENUM_END(RandomizerHintTextKey) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h index f19137a46..483927a71 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h @@ -2141,6 +2141,84 @@ RANDO_ENUM_ITEM(RAND_INF_OBTAINED_NAYRUS_LOVE) RANDO_ENUM_ITEM(RAND_INF_OBTAINED_ROCS_FEATHER) RANDO_ENUM_ITEM(RAND_INF_TALON_SENT_MALON_HOME) +// Overworld Signs +RANDO_ENUM_ITEM(RAND_INF_KF_DEKU_TREE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_STEPPING_STONES_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_LINKS_HOUSE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_FIRST_TRAINING_CENTER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_SECOND_TRAINING_CENTER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_AFTER_CRAWLSPACE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_CRAWL_RECTANGLE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_LOST_WOODS_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_HOUSE_OF_TWINS_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_SHOP_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_SARIAS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_LOST_WOODS_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_MIDOS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_TRAINING_CENTER_ENTRANCE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_INNER_TRAINING_CENTER_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_KNOW_IT_ALL_BROTHERS_HOUSE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KF_LINKS_HOUSE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_LW_THEATER_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_CASTLE_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_WOODED_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_ROCKY_PATH_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_FENCED_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_RIVER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HF_STAIRS_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_MK_SHOOTING_GALLERY_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_MK_MASK_SHOP_SIGN) +RANDO_ENUM_ITEM(RAND_INF_TOT_ALTAR) +RANDO_ENUM_ITEM(RAND_INF_HC_DEAD_END_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KAK_GUARD_GATE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KAK_WELL_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KAK_SOUTHEAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KAK_FRONT_GATE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_KAK_SHOOTING_GALLERY_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GY_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GY_ENTRANCE_PLINTH) +RANDO_ENUM_ITEM(RAND_INF_GY_RIGHT_OF_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RAND_INF_GY_LEFT_OF_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RAND_INF_GY_ROYAL_TOMB_GRAVE) +RANDO_ENUM_ITEM(RAND_INF_DMT_ABOVE_DODONGO_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_ADULT_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_CHILD_CENTER_EXIT_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_DODONGOS_CAVERN_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_CENTER_TRAIL_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_TO_UPPER_TRAIL_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_UPPER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_TO_CENTER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMT_LOWER_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GC_CHILD_ROLLING_GORON_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_DMC_BRIDGE_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZR_SLEEPLESS_WATERFALL_PLAQUE) +RANDO_ENUM_ITEM(RAND_INF_ZD_SHOP_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZD_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZD_KING_ZORA_PATH_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZD_NEAR_KING_ZORA_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZF_JABU_JABU_PLATFORM_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_ZF_ENTRANCE_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_LH_LAB_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_LH_NORTH_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_LH_FISHING_SIGN) +RANDO_ENUM_ITEM(RAND_INF_LH_ISLAND_PEDESTAL) +RANDO_ENUM_ITEM(RAND_INF_LH_FISHING_POND_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GV_BRIDGE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GV_EAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GF_EAST_EXIT_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GF_HBA_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GF_GATE_EXIT_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_GF_GTG_ENTRANCE_RECTANGLE_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HW_CARPET_SALESMAN_ARROW_SIGN) +RANDO_ENUM_ITEM(RAND_INF_HW_POE_ALTAR) +// Dungeon Signs +RANDO_ENUM_ITEM(RAND_INF_DODONGOS_CAVERN_TOP_FLOOR_PEDESTAL) +RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_TRUTHSPINNER_RECTANGLE_SIGN) +// MQ Dungeon Signs +RANDO_ENUM_ITEM(RAND_INF_SHADOW_TEMPLE_MQ_LOWER_PIT_RECTANGLE_SIGN) + RANDO_ENUM_ITEM(RAND_INF_MAX) RANDO_ENUM_END(RandomizerInf) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h index eee5b23ee..a7305b382 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h @@ -130,6 +130,7 @@ RANDO_ENUM_ITEM(RCTYPE_BEAN_FAIRY) // Fairies from Beans RANDO_ENUM_ITEM(RCTYPE_SONG_FAIRY) // Fairies from Songs RANDO_ENUM_ITEM(RCTYPE_BUTTERFLY_FAIRY) // Fairies from Butterflies RANDO_ENUM_ITEM(RCTYPE_GRASS) // Grass +RANDO_ENUM_ITEM(RCTYPE_SIGN) // Signs RANDO_ENUM_END(RandomizerCheckType) RANDO_ENUM_BEGIN(RandomizerCheckQuest) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h index ac0c4dded..c141f6e9c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerOptions.h @@ -389,6 +389,14 @@ RANDO_ENUM_ITEM(RO_SHUFFLE_CRATES_OVERWORLD) RANDO_ENUM_ITEM(RO_SHUFFLE_CRATES_ALL) RANDO_ENUM_END(RandoOptionShuffleCrates) +// Shuffle Signs settings (off, dungeons, overworld, all) +RANDO_ENUM_BEGIN(RandoOptionShuffleSigns) +RANDO_ENUM_ITEM(RO_SHUFFLE_SIGNS_OFF) +RANDO_ENUM_ITEM(RO_SHUFFLE_SIGNS_DUNGEONS) +RANDO_ENUM_ITEM(RO_SHUFFLE_SIGNS_OVERWORLD) +RANDO_ENUM_ITEM(RO_SHUFFLE_SIGNS_ALL) +RANDO_ENUM_END(RandoOptionShuffleSigns) + // Link's Pocket Settings (dungeon reward, advancement, anything, nothing) RANDO_ENUM_BEGIN(RandoOptionLinksPocket) RANDO_ENUM_ITEM(RO_LINKS_POCKET_DUNGEON_REWARD) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h index 285c7d408..55327a67d 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h @@ -244,6 +244,7 @@ RANDO_ENUM_ITEM(RSK_SHUFFLE_SONG_FAIRIES) RANDO_ENUM_ITEM(RSK_SHUFFLE_BUTTERFLY_FAIRIES) RANDO_ENUM_ITEM(RSK_LOCK_OVERWORLD_DOORS) RANDO_ENUM_ITEM(RSK_SHUFFLE_GRASS) +RANDO_ENUM_ITEM(RSK_SHUFFLE_SIGNS) RANDO_ENUM_ITEM(RSK_ROCS_FEATHER) RANDO_ENUM_ITEM(RSK_MAX) RANDO_ENUM_END(RandomizerSettingKey) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9e097508b..54efb9d2f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -197,6 +197,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_NLTREE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SIGN || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSigns"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 56a97d705..c8c7511bf 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -79,6 +79,8 @@ bool showOverworldCrates; bool showDungeonCrates; bool showTrees; bool showBushes; +bool showOverworldSigns; +bool showDungeonSigns; bool showFrogSongRupees; bool showFountainFairies; bool showStoneFairies; @@ -1468,6 +1470,25 @@ void LoadSettings() { showDungeonCrates = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SIGNS)) { + case RO_SHUFFLE_SIGNS_ALL: + showOverworldSigns = true; + showDungeonSigns = true; + break; + case RO_SHUFFLE_SIGNS_OVERWORLD: + showOverworldSigns = true; + showDungeonSigns = false; + break; + case RO_SHUFFLE_SIGNS_DUNGEONS: + showOverworldSigns = false; + showDungeonSigns = true; + break; + default: + showOverworldSigns = false; + showDungeonSigns = false; + break; + } showTrees = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TREES); showBushes = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BUSHES); } else { // Vanilla @@ -1479,6 +1500,8 @@ void LoadSettings() { showDungeonGrass = false; showOverworldCrates = false; showDungeonCrates = false; + showOverworldSigns = false; + showDungeonSigns = false; showTrees = false; showBushes = false; } @@ -1598,6 +1621,9 @@ bool IsCheckShuffled(RandomizerCheck rc) { (showTrees && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC)) && (loc->GetRCType() != RCTYPE_BUSH || showBushes) && (loc->GetRCType() != RCTYPE_COW || showCows) && + (loc->GetRCType() != RCTYPE_SIGN || + (showOverworldSigns && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonSigns && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 20bf223a3..f0da76ac8 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -841,6 +841,7 @@ void Settings::CreateOptions() { OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_CRATES_OFF); OPT_BOOL(RSK_SHUFFLE_TREES, "Shuffle Trees", CVAR_RANDOMIZER_SETTING("ShuffleTrees"), mOptionDescriptions[RSK_SHUFFLE_TREES]); OPT_BOOL(RSK_SHUFFLE_BUSHES, "Shuffle Bushes", CVAR_RANDOMIZER_SETTING("ShuffleBushes"), mOptionDescriptions[RSK_SHUFFLE_BUSHES]); + OPT_U8(RSK_SHUFFLE_SIGNS, "Shuffle Signs", {"Off", "Dungeons", "Overworld", "All Signs"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSigns"), mOptionDescriptions[RSK_SHUFFLE_SIGNS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_SIGNS_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_CALLBACK(RSK_SHUFFLE_FISHING_POLE, { // Disable fishing pole hint if the fishing pole is not shuffled @@ -1856,6 +1857,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], + &mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], &mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_100_GS_REWARD], @@ -2137,6 +2139,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], + &mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_OCARINA], &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index ccc895d7b..149a1b707 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -62,6 +62,7 @@ class StaticData { static void RegisterGrassLocations(); static void RegisterCrateLocations(); static void RegisterTreeLocations(); + static void RegisterSignLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 130644968..91574e517 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5606,7 +5606,6 @@ void func_8083A0F4(PlayState* play, Player* this) { void Player_SetupTalk(PlayState* play, Player* this) { Player_SetupActionPreserveAnimMovement(play, this, Player_Action_Talk, 0); - this->stateFlags1 |= PLAYER_STATE1_TALKING | PLAYER_STATE1_IN_CUTSCENE; if (this->actor.textId != 0) { @@ -6227,7 +6226,9 @@ s32 Player_ActionHandler_Talk(Player* this, PlayState* play) { // text will be used. This is especially important to prevent unwanted behavior with regards to mask // trading. this->currentMask = sSavedCurrentMask; - Player_StartTalking(play, talkOfferActor); + if (GameInteractor_Should(VB_SKIP_TALKING, true)) { + Player_StartTalking(play, talkOfferActor); + } return true; } }