[Rando] Shuffle Signs (#6406)

Exploding Royal Family's Tombstone grants check
This commit is contained in:
A Green Spoon
2026-03-30 22:35:54 +09:00
committed by GitHub
parent 2b336a4582
commit 317c057e86
43 changed files with 1262 additions and 339 deletions

View File

@@ -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

View File

@@ -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 |
---------------------------*/

View File

@@ -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

View File

@@ -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.

View File

@@ -0,0 +1,335 @@
#include <soh/OTRGlobals.h>
#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<CheckIdentity>(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<CheckIdentity>(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<CheckIdentity>(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<Actor*>(actorRef);
EnKanban* signActor = static_cast<EnKanban*>(actorRef);
auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign(
gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id);
ObjectExtension::GetInstance().Set<CheckIdentity>(actor, std::move(signIdentity));
});
COND_ID_HOOK(OnActorInit, ACTOR_EN_A_OBJ, shouldRegister, [](void* actorRef) {
Actor* actor = static_cast<Actor*>(actorRef);
EnAObj* signActor = static_cast<EnAObj*>(actorRef);
auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign(
gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id);
ObjectExtension::GetInstance().Set<CheckIdentity>(actor, std::move(signIdentity));
});
COND_ID_HOOK(OnActorInit, ACTOR_EN_WONDER_TALK, shouldRegister, [](void* actorRef) {
Actor* actor = static_cast<Actor*>(actorRef);
EnWonderTalk* signActor = static_cast<EnWonderTalk*>(actorRef);
auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign(
gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id);
ObjectExtension::GetInstance().Set<CheckIdentity>(actor, std::move(signIdentity));
});
COND_ID_HOOK(OnActorInit, ACTOR_EN_WONDER_TALK2, shouldRegister, [](void* actorRef) {
Actor* actor = static_cast<Actor*>(actorRef);
EnWonderTalk2* signActor = static_cast<EnWonderTalk2*>(actorRef);
auto signIdentity = OTRGlobals::Instance->gRandomizer->IdentifySign(
gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, actor->id);
ObjectExtension::GetInstance().Set<CheckIdentity>(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);

View File

@@ -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 };
}

View File

@@ -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_);

View File

@@ -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)),

View File

@@ -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)),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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)),

View File

@@ -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)),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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),

View File

@@ -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)),

View File

@@ -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);
}

View File

@@ -105,6 +105,7 @@ class Logic {
bool CanBreakCrates();
bool CanBreakSmallCrates();
bool CanBonkTrees();
bool CanRead();
bool HasFireSource();
bool HasFireSourceWithTorch();
bool SunlightArrows();

View File

@@ -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.";

View File

@@ -2980,6 +2980,80 @@ std::map<RandomizerCheck, RandomizerInf> 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();
}

View File

@@ -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,

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 ||

View File

@@ -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 ||

View File

@@ -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],

View File

@@ -62,6 +62,7 @@ class StaticData {
static void RegisterGrassLocations();
static void RegisterCrateLocations();
static void RegisterTreeLocations();
static void RegisterSignLocations();
static void InitHashMaps();
static std::array<std::pair<RandomizerCheck, RandomizerCheck>, 17> randomizerFishingPondFish;
static std::unordered_map<int8_t, RandomizerCheck> randomizerGrottoFishMap;

View File

@@ -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;
}
}