From a782632882aac685086e83a144eca78e0f6390de Mon Sep 17 00:00:00 2001 From: HylianFreddy <82058772+HylianFreddy@users.noreply.github.com> Date: Thu, 7 May 2026 22:18:53 +0200 Subject: [PATCH 1/3] Skip overrides for vanilla items - Update Business Scrub implementation - Add enum for delayed overrides --- code/include/z3D/actors/z_en_dns.h | 32 ++++- code/oot.ld | 5 +- code/src/actors/business_scrubs.c | 77 +++++------ code/src/actors/business_scrubs.h | 2 + code/src/asm/hooks.s | 11 ++ code/src/asm/patches.s | 7 +- code/src/cutscenes.c | 36 ++--- code/src/item_override.c | 30 +---- code/src/main.c | 2 + code/src/master_sword_pedestal.c | 2 +- code/src/savefile.c | 2 +- shared/s_item_override.h | 25 ++++ source/item_location.cpp | 152 ++++++++++----------- source/item_location.hpp | 22 +-- source/item_pool.cpp | 209 ++++++++++++++--------------- source/spoiler_log.cpp | 2 +- 16 files changed, 321 insertions(+), 295 deletions(-) diff --git a/code/include/z3D/actors/z_en_dns.h b/code/include/z3D/actors/z_en_dns.h index 069f58636..5d81b9a2b 100644 --- a/code/include/z3D/actors/z_en_dns.h +++ b/code/include/z3D/actors/z_en_dns.h @@ -3,19 +3,41 @@ #include "z3D/z3D.h" +typedef enum EnDnsType { + DNS_TYPE_DEKU_NUTS_5, + DNS_TYPE_DEKU_STICKS_1, + DNS_TYPE_HEART_PIECE, + DNS_TYPE_DEKU_SEEDS_30, + DNS_TYPE_DEKU_SHIELD, + DNS_TYPE_BOMBS_5, + DNS_TYPE_ARROWS_30, + DNS_TYPE_RED_POTION, + DNS_TYPE_GREEN_POTION, + DNS_TYPE_DEKU_STICK_UPGRADE, + DNS_TYPE_DEKU_NUT_UPGRADE, + DNS_TYPE_MAX, +} EnDnsType; + +typedef enum EnDnsCanBuyResult { + DNS_CANBUY_RESULT_NEED_RUPEES, + DNS_CANBUY_RESULT_CAPACITY_FULL, + DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM, + DNS_CANBUY_RESULT_CANT_GET_NOW, + DNS_CANBUY_RESULT_SUCCESS, +} EnDnsCanBuyResult; + struct EnDns; typedef void (*EnDnsActionFunc)(struct EnDns* this, GlobalContext* globalCtx); - -typedef u32 (*EnDnsPurchaseableCheck)(struct EnDns*); -typedef void (*EnDnsSetRupeesAndFlags)(struct EnDns*); +typedef u32 (*EnDnsCanBuyFunc)(struct EnDns*); +typedef void (*EnDnsPaymentFunc)(struct EnDns*); typedef struct { /* 0x00 */ s16 itemPrice; /* 0x02 */ u16 itemAmount; /* 0x04 */ s32 getItemID; - /* 0x08 */ EnDnsPurchaseableCheck purchaseableCheck; - /* 0x0C */ EnDnsSetRupeesAndFlags setRupeesAndFlags; + /* 0x08 */ EnDnsCanBuyFunc canBuy; + /* 0x0C */ EnDnsPaymentFunc payment; } DnsItemEntry; // size = 0x10 typedef struct EnDns { diff --git a/code/oot.ld b/code/oot.ld index 0f6918286..f66d0cbea 100644 --- a/code/oot.ld +++ b/code/oot.ld @@ -116,7 +116,6 @@ SECTIONS EnBox_Init = 0x1899EC + _LD_OFF; EnCow_Init = 0x189FD4 + _LD_OFF; EnCow_Destroy = 0x18A3E4 + _LD_OFF; - .patch_BusinessScrubTable 0x18A634 + _LD_OFF : { *(.patch_BusinessScrubTable) } EnGe1_Init = 0x18B218 + _LD_OFF; .patch_CheckGerudoToken_18B368 0x18B368 + _LD_OFF : { *(.patch_CheckGerudoToken_18B368) } .patch_CheckGerudoToken_18B3A0 0x18B3A0 + _LD_OFF : { *(.patch_CheckGerudoToken_18B3A0) } @@ -285,7 +284,7 @@ SECTIONS .patch_patch_ItemGiveBombchuDropTwo 0x22BAE4 + _LD_OFF : { *(.patch_ItemGiveBombchuDropTwo) } .patch_GetObjectEntry_EnNutsballInit 0x22DEC4 + _LD_OFF : { *(.patch_GetObjectEntry_EnNutsballInit) } EnShopnuts_Init = 0x22ED2C + _LD_OFF; - .patch_BusinessScrubCheckFlags 0x22EE64 + _LD_OFF : { *(.patch_BusinessScrubCheckFlags) } + .patch_BusinessScrubCheckFlags 0x22EE60 + _LD_OFF : { *(.patch_BusinessScrubCheckFlags) } EnTorch2_Update = 0x22F0C8 + _LD_OFF; .patch_DarkLinkPlayerRecoil 0x22F838 + _LD_OFF : { *(.patch_DarkLinkPlayerRecoil) } ObjMure3_Update = 0x2318AC + _LD_OFF; @@ -853,7 +852,7 @@ SECTIONS gGanondorfBlood = 0x514F78 + _LD_OFF; gGanonBlood = 0x515194 + _LD_OFF; EnChanger_LoserGetItemIds = 0x521774 + _LD_OFF; - VanillaScrubTable = 0x522384 + _LD_OFF; + EnDns_ItemEntries = 0x522384 + _LD_OFF; EnGirlA_ShopItemEntries = 0x524F50 + _LD_OFF; .patch_BombchuCheapestPriceOne 0x525348 + _LD_OFF : { *(.patch_BombchuCheapestPriceOne) } .patch_BombchuCheapestPriceTwo 0x5253D8 + _LD_OFF : { *(.patch_BombchuCheapestPriceTwo) } diff --git a/code/src/actors/business_scrubs.c b/code/src/actors/business_scrubs.c index 1eba7b53e..bf28f1e0e 100644 --- a/code/src/actors/business_scrubs.c +++ b/code/src/actors/business_scrubs.c @@ -1,63 +1,45 @@ #include "business_scrubs.h" #include "settings.h" #include "multiplayer.h" +#include "common.h" void EnDns_Update(Actor* thisx, GlobalContext* globalCtx); void EnShopnuts_Init(Actor* thisx, GlobalContext* globalCtx); -u32 EnDns_rPurchaseableCheck(EnDns* scrub); -void EnDns_rSetRupeesAndFlags(EnDns* scrub); -void EnDns_rSetRupeesAndFlagsIfScrubsanity(EnDns* scrub); +u32 EnDns_rCanBuy(EnDns* scrub); +void EnDns_rPay(EnDns* scrub); -static const DnsItemEntry Scrub_0 = { 20, 5, 0x30, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_1 = { 15, 1, 0x31, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_2 = { 10, 1, 0x3E, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlags }; -static const DnsItemEntry Scrub_3 = { 40, 30, 0x33, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_4 = { 50, 1, 0x34, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_5 = { 40, 5, 0x37, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_6 = { 70, 20, 0x38, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_7 = { 40, 1, 0x39, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_8 = { 40, 1, 0x3A, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlagsIfScrubsanity }; -static const DnsItemEntry Scrub_9 = { 40, 1, 0x77, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlags }; -static const DnsItemEntry Scrub_A = { 40, 1, 0x79, EnDns_rPurchaseableCheck, EnDns_rSetRupeesAndFlags }; - -const DnsItemEntry* rScrubTable[] = { &Scrub_0, &Scrub_1, &Scrub_2, &Scrub_3, &Scrub_4, &Scrub_5, - &Scrub_6, &Scrub_7, &Scrub_8, &Scrub_9, &Scrub_A }; - -extern DnsItemEntry* VanillaScrubTable[]; +extern DnsItemEntry* EnDns_ItemEntries[]; s16 rScrubRandomItemPrices[11] = { 0 }; -u32 EnDns_rPurchaseableCheck(EnDns* scrub) { +void BusinessScrubs_Init(void) { + if (gSettingsContext.scrubsanity != SCRUBSANITY_OFF) { + for (s32 scrubType = 0; scrubType < DNS_TYPE_MAX; scrubType++) { + EnDns_ItemEntries[scrubType]->canBuy = EnDns_rCanBuy; + EnDns_ItemEntries[scrubType]->payment = EnDns_rPay; + } + } +} + +u32 EnDns_rCanBuy(EnDns* scrub) { s16 price; - if (gSettingsContext.scrubsanity == SCRUBSANITY_OFF) { - return VanillaScrubTable[scrub->actor.params]->purchaseableCheck(scrub); - } else if (gSettingsContext.scrubsanity == SCRUBSANITY_AFFORDABLE) { + if (gSettingsContext.scrubsanity == SCRUBSANITY_AFFORDABLE) { price = 10; } else if (gSettingsContext.scrubsanity == SCRUBSANITY_RANDOM_PRICES) { price = rScrubRandomItemPrices[scrub->actor.params]; - } else { + } else { // SCRUBSANITY_EXPENSIVE price = scrub->dnsItemEntry->itemPrice; } if (gSaveContext.rupees < price) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -void EnDns_rSetRupees(EnDns* scrub) { - if (gSettingsContext.scrubsanity == SCRUBSANITY_AFFORDABLE) { - Rupees_ChangeBy(-10); - } else if (gSettingsContext.scrubsanity == SCRUBSANITY_RANDOM_PRICES) { - Rupees_ChangeBy(-rScrubRandomItemPrices[scrub->actor.params]); - } else { - Rupees_ChangeBy(-scrub->dnsItemEntry->itemPrice); - } -} - -void EnDns_rSetRupeesAndFlags(EnDns* scrub) { +void EnDns_rPay(EnDns* scrub) { u32 sceneNum = gGlobalContext->sceneNum; u32 bitMask = (0x1 << (scrub->actor.params + 1)); @@ -68,18 +50,21 @@ void EnDns_rSetRupeesAndFlags(EnDns* scrub) { } gSaveContext.sceneFlags[sceneNum].unk |= bitMask; - EnDns_rSetRupees(scrub); -} -void EnDns_rSetRupeesAndFlagsIfScrubsanity(EnDns* scrub) { - if (gSettingsContext.scrubsanity == SCRUBSANITY_OFF) { - EnDns_rSetRupees(scrub); + if (gSettingsContext.scrubsanity == SCRUBSANITY_AFFORDABLE) { + Rupees_ChangeBy(-10); + } else if (gSettingsContext.scrubsanity == SCRUBSANITY_RANDOM_PRICES) { + Rupees_ChangeBy(-rScrubRandomItemPrices[scrub->actor.params]); } else { - EnDns_rSetRupeesAndFlags(scrub); + Rupees_ChangeBy(-scrub->dnsItemEntry->itemPrice); } } -u32 EnShopnnuts_rCheckFlags(EnShopnuts* scrub) { +s32 EnShopnnuts_rCheckFlags(EnShopnuts* scrub) { + if (gSettingsContext.scrubsanity == SCRUBSANITY_OFF) { + return -1; // Use vanilla checks. + } + u32 sceneNum = gGlobalContext->sceneNum; u32 bitMask = (0x1 << (scrub->actor.params + 1)); @@ -118,8 +103,8 @@ void EnDns_rUpdate(Actor* thisx, GlobalContext* globalCtx) { EnDns_Update(&scrub->actor, globalCtx); // Skip scrubs with repeatable purchases - if (gSettingsContext.scrubsanity == SCRUBSANITY_OFF && scrub->actor.params != 0x2 && scrub->actor.params != 0x9 && - scrub->actor.params != 0xA) { + if (gSettingsContext.scrubsanity == SCRUBSANITY_OFF && scrub->actor.params != DNS_TYPE_HEART_PIECE && + scrub->actor.params != DNS_TYPE_DEKU_STICK_UPGRADE && scrub->actor.params != DNS_TYPE_DEKU_NUT_UPGRADE) { return; } diff --git a/code/src/actors/business_scrubs.h b/code/src/actors/business_scrubs.h index e8bb55889..baa778dbf 100644 --- a/code/src/actors/business_scrubs.h +++ b/code/src/actors/business_scrubs.h @@ -5,6 +5,8 @@ #include "z3D/actors/z_en_dns.h" #include "z3D/actors/z_en_shopnuts.h" +void BusinessScrubs_Init(void); + void EnDns_rUpdate(Actor* thisx, GlobalContext* globalCtx); void EnDns_StartBurrow(EnDns* this); diff --git a/code/src/asm/hooks.s b/code/src/asm/hooks.s index 6cd8cccd1..7b1362b02 100644 --- a/code/src/asm/hooks.s +++ b/code/src/asm/hooks.s @@ -2181,3 +2181,14 @@ HOOK PlayerBonk bl Player_OnBonk pop {r0-r12, lr} bx lr + +HOOK BusinessScrubCheckFlags + push {r0-r12, lr} + cpy r0,r4 @ scrub actor + bl EnShopnnuts_rCheckFlags + cmp r0,#0x0 + pop {r0-r12, lr} + addeq lr,lr,#0x0C @ 0: skip checks, don't kill actor + addgt lr,lr,#0x10 @ 1: kill actor + cmplt r1,#0x2 @ -1: resume vanilla checks + bx lr diff --git a/code/src/asm/patches.s b/code/src/asm/patches.s index 0b8a5be89..39b7d35e0 100644 --- a/code/src/asm/patches.s +++ b/code/src/asm/patches.s @@ -410,12 +410,7 @@ PATCH FireArrowRequirement tst r2,#0x400 PATCH BusinessScrubCheckFlags - cpy r0,r4 - bl EnShopnnuts_rCheckFlags - cmp r0,#0x0 - -PATCH BusinessScrubTable - .word rScrubTable + bl hook_BusinessScrubCheckFlags PATCH KakarikoGateCheck bl hook_KakarikoGateCheck diff --git a/code/src/cutscenes.c b/code/src/cutscenes.c index 8ff377669..6f5eb59ac 100644 --- a/code/src/cutscenes.c +++ b/code/src/cutscenes.c @@ -57,7 +57,7 @@ void Cutscene_OverrideLACS(void) { break; } if (conditionMet) { - ItemOverride_PushDelayedOverride(0x01); + ItemOverride_PushDelayedOverride(DELOVR_LACS); EventSet(0xC4); gSaveContext.entranceIndex = 0x58C; } @@ -65,12 +65,12 @@ void Cutscene_OverrideLACS(void) { void Cutscene_OverrideMinuet(void) { gSaveContext.eventChkInf[5] |= 0x1; - ItemOverride_PushDelayedOverride(0x20); + ItemOverride_PushDelayedOverride(DELOVR_SONG_MINUET); } void Cutscene_OverrideBolero(void) { gSaveContext.eventChkInf[5] |= 0x2; - ItemOverride_PushDelayedOverride(0x21); + ItemOverride_PushDelayedOverride(DELOVR_SONG_BOLERO); } u32 Cutscene_SerenadeCheckChestFlag(void) { @@ -79,13 +79,13 @@ u32 Cutscene_SerenadeCheckChestFlag(void) { void Cutscene_OverrideSerenade(void) { gSaveContext.eventChkInf[5] |= 0x4; - ItemOverride_PushDelayedOverride(0x22); + ItemOverride_PushDelayedOverride(DELOVR_SONG_SERENADE); } u32 Cutscene_OverrideRequiem(void) { if (!EventCheck(0xAC) && Entrance_SceneAndSpawnAre(0x5C, 0x01)) { // Spirit Temple -> Desert Colossus, index 01E1 in the entrance table - ItemOverride_PushDelayedOverride(0x23); + ItemOverride_PushDelayedOverride(DELOVR_SONG_REQUIEM); EventSet(0xAC); gSaveContext.entranceIndex = 0x1ED; } @@ -96,7 +96,7 @@ void Cutscene_OverrideNocturne(void) { if ((gEntranceTable[gSaveContext.entranceIndex].scene == 0x52) && (gSaveContext.linkAge == AGE_ADULT)) { if ((gSaveContext.questItems & 0x1) && (gSaveContext.questItems & 0x2) && (gSaveContext.questItems & 0x4)) { if (!EventCheck(0xAA)) { - ItemOverride_PushDelayedOverride(0x24); + ItemOverride_PushDelayedOverride(DELOVR_SONG_NOCTURNE); EventSet(0xAA); gSaveContext.entranceIndex = 0x513; } @@ -106,7 +106,7 @@ void Cutscene_OverrideNocturne(void) { u32 Cutscene_OverridePrelude(void) { if (gSaveContext.questItems & 0x1) { - ItemOverride_PushDelayedOverride(0x25); + ItemOverride_PushDelayedOverride(DELOVR_SONG_PRELUDE); gSaveContext.eventChkInf[5] |= 0x20; return 1; } @@ -118,11 +118,11 @@ u32 Cutscene_CheckLullabyFlag(void) { } void Cutscene_OverrideLullaby(void) { + ItemOverride_PushDelayedOverride(DELOVR_SONG_LULLABY); gSaveContext.eventChkInf[5] |= 0x200; - ItemOverride_PushDelayedOverride(0x26); gGlobalContext->nextEntranceIndex = 0x594; gGlobalContext->sceneLoadFlag = 0x14; - PLAYER->actor.draw = NULL; + PLAYER->stateFlags1 |= 1; // Loading area } u32 Cutscene_CheckEponasSongFlag(void) { @@ -131,7 +131,7 @@ u32 Cutscene_CheckEponasSongFlag(void) { void Cutscene_OverrideEponasSong(void) { gSaveContext.eventChkInf[5] |= 0x100; - ItemOverride_PushDelayedOverride(0x27); + ItemOverride_PushDelayedOverride(DELOVR_SONG_EPONA); gGlobalContext->unk_2B7E = 4; } @@ -141,21 +141,21 @@ u32 Cutscene_CheckSariasSongFlag(void) { void Cutscene_OverrideSariasSong(void) { if (!(gSaveContext.eventChkInf[5] & 0x80)) { - ItemOverride_PushDelayedOverride(0x28); + ItemOverride_PushDelayedOverride(DELOVR_SONG_SARIA); gSaveContext.eventChkInf[5] |= 0x80; } } void Cutscene_OverrideSunsSong(void) { if (!(gSaveContext.eventChkInf[5] & 0x400)) { - ItemOverride_PushDelayedOverride(0x29); + ItemOverride_PushDelayedOverride(DELOVR_SONG_SUN); gSaveContext.eventChkInf[5] |= 0x400; } } void Cutscene_OverrideSongOfTime(Actor* ocarina) { gSaveContext.eventChkInf[10] |= 0x200; - ItemOverride_PushDelayedOverride(0x2A); + ItemOverride_PushDelayedOverride(DELOVR_SONG_TIME); gGlobalContext->nextEntranceIndex = 0x50F; gGlobalContext->sceneLoadFlag = 0x14; } @@ -163,21 +163,21 @@ void Cutscene_OverrideSongOfTime(Actor* ocarina) { void Cutscene_OverrideSongOfStorms(void) { gSaveContext.eventChkInf[6] |= 0x20; gSaveContext.eventChkInf[5] |= 0x800; - ItemOverride_PushDelayedOverride(0x2B); + ItemOverride_PushDelayedOverride(DELOVR_SONG_STORMS); gGlobalContext->unk_2B7E = 4; } void Cutscene_OverrideFairyReward(BgDyYoseizo* fairy) { s16 fairyIdx = fairy->unk_D2C; - if (gGlobalContext->sceneNum == 0x3D) { + if (gGlobalContext->sceneNum == SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS) { if (!(gSaveContext.itemGetInf[1] & (0x100 << fairyIdx))) { - ItemOverride_PushDelayedOverride(0x10 + fairyIdx); + ItemOverride_PushDelayedOverride(DELOVR_FAIRY_ZF + fairyIdx); gSaveContext.itemGetInf[1] |= (0x100 << fairyIdx); } - } else if (gGlobalContext->sceneNum == 0x3B) { + } else if (gGlobalContext->sceneNum == SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC) { if (!(gGlobalContext->actorCtx.flags.chest & (0x1 << fairyIdx))) { - ItemOverride_PushDelayedOverride(0x13 + fairyIdx); + ItemOverride_PushDelayedOverride(DELOVR_FAIRY_DMT + fairyIdx); gGlobalContext->actorCtx.flags.chest |= (0x1 << fairyIdx); } } diff --git a/code/src/item_override.c b/code/src/item_override.c index 88de1e276..f90f65d0a 100644 --- a/code/src/item_override.c +++ b/code/src/item_override.c @@ -464,21 +464,10 @@ void ItemOverride_GetItem(Actor* fromActor, Player* player, s8 incomingItemId) { } if (override.key.all == 0) { - // Hack for Scrubsanity Off - // The game will spawn different scrub actors in grottos depending on if - // Link is child or adult (one for deku seeds and another for arrows - // respectively). Since we only override the child deku scrubs when - // scrubsanity is off, the adult ones will return the Gold Scale getItemID - // and not find an override in the overrid table. This is where we fix that - // so adult Link will receive arrows properly. - if (incomingItemId == GI_SCALE_GOLD && gSettingsContext.scrubsanity == SCRUBSANITY_OFF) { - override.value.itemId = GI_ARROWS_LARGE; - } else { - // No override, use base game's item code - ItemOverride_Clear(); - player->getItemId = incomingItemId; - return; - } + // No override, use base game's item code + ItemOverride_Clear(); + player->getItemId = incomingItemId; + return; } IceTrap_UpdateOverride(&override, fromActor->id == ACTOR_CHEST); @@ -670,7 +659,7 @@ s32 ItemOverride_GiveSariasGift(void) { u32 receivedGift = EventCheck(0xC1); if (receivedGift == 0 && Entrance_SceneAndSpawnAre(0x5B, 0x09)) { // Kokiri Forest -> LW Bridge, index 05E0 in the entrance table - ItemOverride_PushDelayedOverride(0x02); + ItemOverride_PushDelayedOverride(DELOVR_SARIA_GIFT); EventSet(0xC1); } @@ -680,13 +669,8 @@ s32 ItemOverride_GiveSariasGift(void) { // If we haven't obtained Zelda's Letter and are in the castle courtyard, push it void ItemOverride_CheckZeldasLetter() { - if (EventCheck(0x40) == 0 && gGlobalContext->sceneNum == 0x4A) { - ItemOverride_Key key = { .all = 0 }; - key.scene = 0x4A; - key.type = OVR_BASE_ITEM; - key.flag = 0x0B; - ItemOverride override = ItemOverride_LookupByKey(key); - ItemOverride_PushPendingOverride(override); + if (!EventCheck(0x40) && gGlobalContext->sceneNum == SCENE_CASTLE_COURTYARD_ZELDA) { + ItemOverride_PushDelayedOverride(DELOVR_ZELDA_LETTER); EventSet(0x40); } } diff --git a/code/src/main.c b/code/src/main.c index 15a45756a..f9f19a000 100644 --- a/code/src/main.c +++ b/code/src/main.c @@ -21,6 +21,7 @@ #include "ocarina_notes.h" #include "icetrap.h" #include "bgm.h" +#include "business_scrubs.h" #include "z3D/z3D.h" #include "3ds/extdata.h" @@ -42,6 +43,7 @@ void Randomizer_Init() { extDataInit(); irrstInit(); Effects_Init(); + BusinessScrubs_Init(); s64 output = 0; svcGetSystemInfo(&output, 0x20000, 0); diff --git a/code/src/master_sword_pedestal.c b/code/src/master_sword_pedestal.c index 17da107bb..c9de806dd 100644 --- a/code/src/master_sword_pedestal.c +++ b/code/src/master_sword_pedestal.c @@ -24,7 +24,7 @@ void SetTimeTraveled() { void Pedestal_PickUpMasterSword(void) { // Push pedestal item if (gSettingsContext.shuffleMasterSword && !(gExtSaveData.extInf.masterSwordFlags & 2)) { - ItemOverride_PushDelayedOverride(0x00); + ItemOverride_PushDelayedOverride(DELOVR_MASTER_SWORD); } if (!SaveFile_SwordlessPatchesEnabled()) { diff --git a/code/src/savefile.c b/code/src/savefile.c index 8cd115bdb..bca9705b1 100644 --- a/code/src/savefile.c +++ b/code/src/savefile.c @@ -836,7 +836,7 @@ void SaveFile_LoadFileSwordless(void) { if (gSaveContext.linkAge == 0) { // Push pedestal item if adult and haven't received yet if (gSettingsContext.shuffleMasterSword && !(gExtSaveData.extInf.masterSwordFlags & 2)) { - ItemOverride_PushDelayedOverride(0x00); + ItemOverride_PushDelayedOverride(DELOVR_MASTER_SWORD); } // Mark pedestal item collected diff --git a/shared/s_item_override.h b/shared/s_item_override.h index b75bcd45d..b9d906853 100644 --- a/shared/s_item_override.h +++ b/shared/s_item_override.h @@ -24,3 +24,28 @@ typedef struct ItemOverride { ItemOverride_Key key; ItemOverride_Value value; } ItemOverride; + +typedef enum DelayedOverride { + DELOVR_MASTER_SWORD, + DELOVR_LACS, + DELOVR_SARIA_GIFT, + DELOVR_ZELDA_LETTER, + DELOVR_FAIRY_ZF, + DELOVR_FAIRY_HC, + DELOVR_FAIRY_DC, + DELOVR_FAIRY_DMT, + DELOVR_FAIRY_DMC, + DELOVR_FAIRY_OGC, + DELOVR_SONG_MINUET, + DELOVR_SONG_BOLERO, + DELOVR_SONG_SERENADE, + DELOVR_SONG_REQUIEM, + DELOVR_SONG_NOCTURNE, + DELOVR_SONG_PRELUDE, + DELOVR_SONG_LULLABY, + DELOVR_SONG_EPONA, + DELOVR_SONG_SARIA, + DELOVR_SONG_SUN, + DELOVR_SONG_TIME, + DELOVR_SONG_STORMS, +} DelayedOverride; diff --git a/source/item_location.cpp b/source/item_location.cpp index 8a60e10a8..d7bad27dc 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -33,18 +33,18 @@ void LocationTable_Init() { locationTable[LW_TRADE_ODD_POULTICE] = ItemLocation::Base (0x5B, 0x21, "LW Trade Odd Poultice", LW_TRADE_ODD_POULTICE, POACHERS_SAW, {Category::cLostWoods, Category::cForest, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(57), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (0x5B, 0x76, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {Category::cLostWoods, Category::cForest, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(31), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (0x5B, 0x60, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {Category::cLostWoods, Category::cForest,}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (0x5B, 0x30, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, DEKU_NUTS_5, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x01), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (0x5B, 0x31, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, DEKU_STICK_1, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x02), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (0x5B, 0x63, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, DEKU_NUTS_5, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x01), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (0x5B, 0x07, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, DEKU_STICK_1, {Category::cLostWoods, Category::cForest, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x5B, 0x02), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = ItemLocation::Base (0x5B, 0x77, "LW Deku Scrub Near Bridge", LW_DEKU_SCRUB_NEAR_BRIDGE, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(0x5B, 0x0A), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF5, 0x33, "LW Deku Scrub Grotto Rear", LW_DEKU_SCRUB_GROTTO_REAR, DEKU_SEEDS_30, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x04), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF5, 0x69, "LW Deku Scrub Grotto Rear", LW_DEKU_SCRUB_GROTTO_REAR, DEKU_SEEDS_30, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x04), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xF5, 0x79, "LW Deku Scrub Grotto Front", LW_DEKU_SCRUB_GROTTO_FRONT, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cDekuScrub, Category::cDekuScrubUpgrades, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1F, 0x0B), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[DEKU_THEATER_SKULL_MASK] = ItemLocation::Base (0x3E, 0x77, "Deku Theater Skull Mask", DEKU_THEATER_SKULL_MASK, PROGRESSIVE_STICK_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(22), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[DEKU_THEATER_MASK_OF_TRUTH] = ItemLocation::Base (0x3E, 0x7A, "Deku Theater Mask of Truth", DEKU_THEATER_MASK_OF_TRUTH, PROGRESSIVE_NUT_UPGRADE, {Category::cLostWoods, Category::cForest, Category::cNeedSpiritualStones, Category::cGrotto}, SpoilerCollectionCheck::ItemGetInf(23), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); // Sacred Forest Meadow locationTable[SFM_WOLFOS_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x11, "SFM Wolfos Grotto Chest", SFM_WOLFOS_GROTTO_CHEST, PURPLE_RUPEE, {Category::cSacredForestMeadow, Category::cForest, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SFM_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEE, 0x39, "SFM Deku Scrub Grotto Rear", SFM_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x08), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEE, 0x3A, "SFM Deku Scrub Grotto Front", SFM_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x09), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SFM_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEE, 0x10, "SFM Deku Scrub Grotto Rear", SFM_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x08), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SFM_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEE, 0x11, "SFM Deku Scrub Grotto Front", SFM_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cSacredForestMeadow, Category::cForest, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x18, 0x09), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); // Hyrule Field locationTable[HF_SOUTHEAST_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x02, "HF Southeast Grotto Chest", HF_SOUTHEAST_GROTTO_CHEST, RED_RUPEE, {Category::cHyruleField, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); @@ -62,17 +62,17 @@ void LocationTable_Init() { locationTable[LH_UNDERWATER_ITEM] = ItemLocation::Base (0x57, 0x15, "LH Underwater Item", LH_UNDERWATER_ITEM, RUTOS_LETTER, {Category::cLakeHylia,}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_SUN] = ItemLocation::Base (0x57, 0x58, "LH Sun", LH_SUN, FIRE_ARROWS, {Category::cLakeHylia,}, SpoilerCollectionCheck::Chest(0x57, 0x00), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_FREESTANDING_POH] = ItemLocation::Collectable(0x57, 0x1E, "LH Freestanding PoH", LH_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLakeHylia,}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xEF, 0x30, "LH Deku Scrub Grotto Left", LH_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x01), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xEF, 0x37, "LH Deku Scrub Grotto Right", LH_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x06), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xEF, 0x33, "LH Deku Scrub Grotto Center", LH_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x04), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xEF, 0x63, "LH Deku Scrub Grotto Left", LH_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x01), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xEF, 0x01, "LH Deku Scrub Grotto Right", LH_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x06), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xEF, 0x69, "LH Deku Scrub Grotto Center", LH_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, {Category::cLakeHylia, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x19, 0x04), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); // Gerudo Valley locationTable[GV_CHEST] = ItemLocation::Chest (0x5A, 0x00, "GV Chest", GV_CHEST, PURPLE_RUPEE, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GV_TRADE_SAW] = ItemLocation::Base (0x5A, 0x22, "GV Trade Saw", GV_TRADE_SAW, BROKEN_SWORD, {Category::cGerudoValley, Category::cGerudo, Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(58), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GV_WATERFALL_FREESTANDING_POH] = ItemLocation::Collectable(0x5A, 0x01, "GV Waterfall Freestanding PoH", GV_WATERFALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GV_CRATE_FREESTANDING_POH] = ItemLocation::Collectable(0x5A, 0x02, "GV Crate Freestanding PoH", GV_CRATE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGerudoValley, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF0, 0x39, "GV Deku Scrub Grotto Rear", GV_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GV_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xF0, 0x3A, "GV Deku Scrub Grotto Front", GV_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xF0, 0x10, "GV Deku Scrub Grotto Rear", GV_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xF0, 0x11, "GV Deku Scrub Grotto Front", GV_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cGerudoValley, Category::cGerudo, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x1A, 0x09), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); // Gerudo Fortress locationTable[GF_CHEST] = ItemLocation::Chest (0x5D, 0x00, "GF Chest", GF_CHEST, PIECE_OF_HEART, {Category::cGerudoFortress, Category::cGerudo,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); @@ -90,8 +90,8 @@ void LocationTable_Init() { // Desert Colossus locationTable[COLOSSUS_FREESTANDING_POH] = ItemLocation::Collectable(0x5C, 0x0D, "Colossus Freestanding PoH", COLOSSUS_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDesertColossus,}, SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xFD, 0x39, "Colossus Deku Scrub Grotto Rear", COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x08), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xFD, 0x3A, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x09), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xFD, 0x10, "Colossus Deku Scrub Grotto Rear", COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x08), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xFD, 0x11, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cDesertColossus, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x27, 0x09), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); // Market locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (0x10, 0x0A, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {Category::cInnerMarket, Category::cMarket, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_MARKET); @@ -109,7 +109,6 @@ void LocationTable_Init() { // Hyrule Castle locationTable[HC_MALON_EGG] = ItemLocation::Base (0x5F, 0x47, "HC Malon Egg", HC_MALON_EGG, WEIRD_EGG, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x12), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[HC_ZELDAS_LETTER] = ItemLocation::Base (0x4A, 0x0B, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); // Kakariko locationTable[KAK_REDEAD_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x0A, "Kak Redead Grotto Chest", KAK_REDEAD_GROTTO_CHEST, HUGE_RUPEE, {Category::cKakarikoVillage, Category::cKakariko, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); @@ -154,19 +153,19 @@ void LocationTable_Init() { locationTable[GC_ROLLING_GORON_AS_ADULT] = ItemLocation::Base (0x62, 0x2C, "GC Rolling Goron as Adult", GC_ROLLING_GORON_AS_ADULT, GORON_TUNIC, {Category::cGoronCity,}, SpoilerCollectionCheck::InfTable(0x10, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); locationTable[GC_DARUNIAS_JOY] = ItemLocation::Base (0x62, 0x54, "GC Darunias Joy", GC_DARUNIAS_JOY, PROGRESSIVE_STRENGTH, {Category::cGoronCity,}, SpoilerCollectionCheck::EventChkInf(0x36), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); locationTable[GC_POT_FREESTANDING_POH] = ItemLocation::Collectable(0x62, 0x1F, "GC Pot Freestanding PoH", GC_POT_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGoronCity,}, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFB, 0x30, "GC Deku Scrub Grotto Left", GC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFB, 0x37, "GC Deku Scrub Grotto Right", GC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); - locationTable[GC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFB, 0x33, "GC Deku Scrub Grotto Center", GC_DEKU_SCRUB_GROTTO_CENTER, ARROWS_30, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x04), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFB, 0x63, "GC Deku Scrub Grotto Left", GC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x01), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFB, 0x01, "GC Deku Scrub Grotto Right", GC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x06), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[GC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFB, 0x69, "GC Deku Scrub Grotto Center", GC_DEKU_SCRUB_GROTTO_CENTER, ARROWS_30, {Category::cGoronCity, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x25, 0x04), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); locationTable[GC_MEDIGORON] = ItemLocation::Base (0x62, 0x51, "GC Medigoron", GC_MEDIGORON, GIANTS_KNIFE, {Category::cGoronCity, Category::cMerchant,}, SpoilerCollectionCheck::EventChkInf(0x35), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); // Death Mountain Crater locationTable[DMC_UPPER_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x1A, "DMC Upper Grotto Chest", DMC_UPPER_GROTTO_CHEST, BOMBS_20, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); locationTable[DMC_WALL_FREESTANDING_POH] = ItemLocation::Collectable(0x61, 0x02, "DMC Wall Freestanding PoH", DMC_WALL_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); locationTable[DMC_VOLCANO_FREESTANDING_POH] = ItemLocation::Collectable(0x61, 0x08, "DMC Volcano Freestanding PoH", DMC_VOLCANO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cDeathMountainCrater, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[DMC_DEKU_SCRUB] = ItemLocation::Base (0x61, 0x37, "DMC Deku Scrub", DMC_DEKU_SCRUB, BOMBS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x61, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xF9, 0x30, "DMC Deku Scrub Grotto Left", DMC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xF9, 0x37, "DMC Deku Scrub Grotto Right", DMC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xF9, 0x33, "DMC Deku Scrub Grotto Center", DMC_DEKU_SCRUB_GROTTO_CENTER, ARROWS_30, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x04), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_DEKU_SCRUB] = ItemLocation::Base (0x61, 0x01, "DMC Deku Scrub", DMC_DEKU_SCRUB, BOMBS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(0x61, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xF9, 0x63, "DMC Deku Scrub Grotto Left", DMC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xF9, 0x01, "DMC Deku Scrub Grotto Right", DMC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x06), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xF9, 0x69, "DMC Deku Scrub Grotto Center", DMC_DEKU_SCRUB_GROTTO_CENTER, ARROWS_30, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x23, 0x04), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); // Zoras River locationTable[ZR_OPEN_GROTTO_CHEST] = ItemLocation::Chest (0x3E, 0x09, "ZR Open Grotto Chest", ZR_OPEN_GROTTO_CHEST, RED_RUPEE, {Category::cZorasRiver, Category::cGrotto,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); @@ -180,8 +179,8 @@ void LocationTable_Init() { locationTable[ZR_FROGS_OCARINA_GAME] = ItemLocation::Base (0x54, 0x76, "ZR Frogs Ocarina Game", ZR_FROGS_OCARINA_GAME, PIECE_OF_HEART, {Category::cZorasRiver, Category::cMinigame,}, SpoilerCollectionCheck::EventChkInf(0xD0), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = ItemLocation::Collectable(0x54, 0x04, "ZR Near Open Grotto Freestanding PoH", ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[ZR_NEAR_DOMAIN_FREESTANDING_POH] = ItemLocation::Collectable(0x54, 0x0B, "ZR Near Domain Freestanding PoH", ZR_NEAR_DOMAIN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cZorasRiver,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEB, 0x39, "ZR Deku Scrub Grotto Rear", ZR_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x08), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); - locationTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEB, 0x3A, "ZR Deku Scrub Grotto Front", ZR_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x09), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_DEKU_SCRUB_GROTTO_REAR] = ItemLocation::GrottoScrub(0xEB, 0x10, "ZR Deku Scrub Grotto Rear", ZR_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x08), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(0xEB, 0x11, "ZR Deku Scrub Grotto Front", ZR_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, {Category::cZorasRiver, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x15, 0x09), SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); // Zoras Domain locationTable[ZD_CHEST] = ItemLocation::Chest (0x58, 0x00, "ZD Chest", ZD_CHEST, PIECE_OF_HEART, {Category::cZorasDomain,}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); @@ -196,9 +195,9 @@ void LocationTable_Init() { // Lon Lon Ranch locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (0x4C, 0x14, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {Category::cLonLonRanch, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); locationTable[LLR_FREESTANDING_POH] = ItemLocation::Collectable(0x4C, 0x01, "LLR Freestanding PoH", LLR_FREESTANDING_POH, PIECE_OF_HEART, {Category::cLonLonRanch,}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFC, 0x30, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x01), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFC, 0x37, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x06), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFC, 0x33, "LLR Deku Scrub Grotto Center", LLR_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x04), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(0xFC, 0x63, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x01), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(0xFC, 0x01, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x06), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_DEKU_SCRUB_GROTTO_CENTER] = ItemLocation::GrottoScrub(0xFC, 0x69, "LLR Deku Scrub Grotto Center", LLR_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, {Category::cLonLonRanch, Category::cDekuScrub, Category::cGrotto}, SpoilerCollectionCheck::Scrub(0x26, 0x04), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); /*------------------- --- DUNGEONS --- @@ -219,7 +218,7 @@ void LocationTable_Init() { locationTable[DEKU_TREE_MQ_BASEMENT_CHEST] = ItemLocation::Chest (0x00, 0x04, "Deku Tree MQ Basement Chest", DEKU_TREE_MQ_BASEMENT_CHEST, DEKU_SHIELD, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = ItemLocation::Chest (0x00, 0x05, "Deku Tree MQ Before Spinning Log Chest", DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RECOVERY_HEART, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = ItemLocation::Chest (0x00, 0x00, "Deku Tree MQ After Spinning Log Chest", DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, PURPLE_RUPEE, {Category::cDekuTree,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); - locationTable[DEKU_TREE_MQ_DEKU_SCRUB] = ItemLocation::Base (0x00, 0x34, "Deku Tree MQ Deku Scrub", DEKU_TREE_MQ_DEKU_SCRUB, DEKU_SHIELD, {Category::cDekuTree, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x00, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[DEKU_TREE_MQ_DEKU_SCRUB] = ItemLocation::Base (0x00, 0x29, "Deku Tree MQ Deku Scrub", DEKU_TREE_MQ_DEKU_SCRUB, DEKU_SHIELD, {Category::cDekuTree, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x00, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); // Dodongos Cavern Shared locationTable[DODONGOS_CAVERN_BOSS_ROOM_CHEST] = ItemLocation::Chest (0x12, 0x00, "Dodongos Cavern Boss Room Chest", DODONGOS_CAVERN_BOSS_ROOM_CHEST, BOMBS_5, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); @@ -229,10 +228,10 @@ void LocationTable_Init() { locationTable[DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = ItemLocation::Chest (0x01, 0x06, "Dodongos Cavern Bomb Flower Platform Chest", DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RED_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[DODONGOS_CAVERN_BOMB_BAG_CHEST] = ItemLocation::Chest (0x01, 0x04, "Dodongos Cavern Bomb Bag Chest", DODONGOS_CAVERN_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = ItemLocation::Chest (0x01, 0x0A, "Dodongos Cavern End Of Bridge Chest", DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = ItemLocation::Base (0x01, 0x30, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, DEKU_NUTS_5, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = ItemLocation::Base (0x01, 0x31, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = ItemLocation::Base (0x01, 0x33, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = ItemLocation::Base (0x01, 0x34, "Dodongos Cavern Deku Scrub Lobby", DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = ItemLocation::Base (0x01, 0x63, "Dodongos Cavern Deku Scrub Near Bomb Bag Left", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, DEKU_NUTS_5, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = ItemLocation::Base (0x01, 0x07, "Dodongos Cavern Deku Scrub Side Room Near Dodongos", DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = ItemLocation::Base (0x01, 0x69, "Dodongos Cavern Deku Scrub Near Bomb Bag Right", DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = ItemLocation::Base (0x01, 0x29, "Dodongos Cavern Deku Scrub Lobby", DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); // Dodongos Cavern MQ locationTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (0x01, 0x00, "Dodongos Cavern MQ Map Chest", DODONGOS_CAVERN_MQ_MAP_CHEST, DODONGOS_CAVERN_MAP, {Category::cDodongosCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = ItemLocation::Chest (0x01, 0x04, "Dodongos Cavern MQ Bomb Bag Chest", DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, PROGRESSIVE_BOMB_BAG, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); @@ -240,16 +239,16 @@ void LocationTable_Init() { locationTable[DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = ItemLocation::Chest (0x01, 0x02, "Dodongos Cavern MQ Larvae Room Chest", DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, DEKU_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = ItemLocation::Chest (0x01, 0x03, "Dodongos Cavern MQ Torch Puzzle Room Chest", DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, BLUE_RUPEE, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = ItemLocation::Chest (0x01, 0x01, "Dodongos Cavern MQ Under Grave Chest", DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, HYLIAN_SHIELD, {Category::cDodongosCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = ItemLocation::Base (0x01, 0x31, "Dodongos Cavern Deku Scrub Lobby Rear", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = ItemLocation::Base (0x01, 0x33, "Dodongos Cavern Deku Scrub Lobby Front", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = ItemLocation::Base (0x01, 0x34, "Dodongos Cavern Deku Scrub Staircase", DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::Base (0x01, 0x39, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos",DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RED_POTION_REFILL, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = ItemLocation::Base (0x01, 0x07, "Dodongos Cavern Deku Scrub Lobby Rear", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, DEKU_STICK_1, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = ItemLocation::Base (0x01, 0x69, "Dodongos Cavern Deku Scrub Lobby Front", DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, DEKU_SEEDS_30, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = ItemLocation::Base (0x01, 0x29, "Dodongos Cavern Deku Scrub Staircase", DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, DEKU_SHIELD, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x05), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = ItemLocation::Base (0x01, 0x10, "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos",DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RED_POTION_REFILL, {Category::cDodongosCavern, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x01, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); // Jabu Jabus Belly Vanilla locationTable[JABU_JABUS_BELLY_MAP_CHEST] = ItemLocation::Chest (0x02, 0x02, "Jabu Jabus Belly Map Chest", JABU_JABUS_BELLY_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[JABU_JABUS_BELLY_COMPASS_CHEST] = ItemLocation::Chest (0x02, 0x04, "Jabu Jabus Belly Compass Chest", JABU_JABUS_BELLY_COMPASS_CHEST, JABU_JABUS_BELLY_COMPASS, {Category::cJabuJabusBelly, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[JABU_JABUS_BELLY_BOOMERANG_CHEST] = ItemLocation::Chest (0x02, 0x01, "Jabu Jabus Belly Boomerang Chest", JABU_JABUS_BELLY_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); - locationTable[JABU_JABUS_BELLY_DEKU_SCRUB] = ItemLocation::Base (0x02, 0x30, "Jabu Jabus Belly Deku Scrub", JABU_JABUS_BELLY_DEKU_SCRUB, DEKU_NUTS_5, {Category::cJabuJabusBelly, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x02, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_DEKU_SCRUB] = ItemLocation::Base (0x02, 0x63, "Jabu Jabus Belly Deku Scrub", JABU_JABUS_BELLY_DEKU_SCRUB, DEKU_NUTS_5, {Category::cJabuJabusBelly, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x02, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); // Jabu Jabus Belly MQ locationTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = ItemLocation::Chest (0x02, 0x05, "Jabu Jabus Belly MQ First Room Side Chest", JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[JABU_JABUS_BELLY_MQ_MAP_CHEST] = ItemLocation::Chest (0x02, 0x03, "Jabu Jabus Belly MQ Map Chest", JABU_JABUS_BELLY_MQ_MAP_CHEST, JABU_JABUS_BELLY_MAP, {Category::cJabuJabusBelly, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); @@ -515,10 +514,10 @@ void LocationTable_Init() { locationTable[GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = ItemLocation::Chest (0x0D, 0x0F, "Ganon's Castle Light Trial Third Right Chest", GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, ICE_TRAP, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = ItemLocation::Chest (0x0D, 0x10, "Ganon's Castle Light Trial Invisible Enemies Chest", GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = ItemLocation::Chest (0x0D, 0x11, "Ganon's Castle Light Trial Lullaby Chest", GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x37, "Ganon's Castle Deku Scrub Center-Left", GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x33, "Ganon's Castle Deku Scrub Center-Right", GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = ItemLocation::Base (0x0D, 0x39, "Ganon's Castle Deku Scrub Right", GANONS_CASTLE_DEKU_SCRUB_RIGHT, RED_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x3A, "Ganon's Castle Deku Scrub Left", GANONS_CASTLE_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x01, "Ganon's Castle Deku Scrub Center-Left", GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x69, "Ganon's Castle Deku Scrub Center-Right", GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_RIGHT] = ItemLocation::Base (0x0D, 0x10, "Ganon's Castle Deku Scrub Right", GANONS_CASTLE_DEKU_SCRUB_RIGHT, RED_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x11, "Ganon's Castle Deku Scrub Left", GANONS_CASTLE_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); // Ganons Castle MQ locationTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = ItemLocation::Chest (0x0D, 0x01, "Ganon's Castle MQ Water Trial Chest", GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RED_RUPEE, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = ItemLocation::Chest (0x0D, 0x02, "Ganon's Castle MQ Forest Trial Eye Switch Chest", GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); @@ -534,10 +533,10 @@ void LocationTable_Init() { locationTable[GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = ItemLocation::Chest (0x0D, 0x14, "Ganon's Castle MQ Spirit Trial Invisible Chest", GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ARROWS_10, {Category::cGanonsCastle,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = ItemLocation::Collectable(0x0D, 0x01, "Ganon's Castle MQ Forest Trial Freestanding Key", GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, GANONS_CASTLE_SMALL_KEY, {Category::cGanonsCastle, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = ItemLocation::Base (0x0D, 0x30, "Ganon's Castle MQ Deku Scrub Right", GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, DEKU_NUTS_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x01), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x37, "Ganon's Castle MQ Deku Scrub Center-Left", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = ItemLocation::Base (0x0D, 0x33, "Ganon's Castle MQ Deku Scrub Center", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x39, "Ganon's Castle MQ Deku Scrub Center-Right", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RED_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x3A, "Ganon's Castle MQ Deku Scrub Left", GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = ItemLocation::Base (0x0D, 0x01, "Ganon's Castle MQ Deku Scrub Center-Left", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x06), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = ItemLocation::Base (0x0D, 0x69, "Ganon's Castle MQ Deku Scrub Center", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, ARROWS_30, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x04), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = ItemLocation::Base (0x0D, 0x10, "Ganon's Castle MQ Deku Scrub Center-Right", GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RED_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x08), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = ItemLocation::Base (0x0D, 0x11, "Ganon's Castle MQ Deku Scrub Left", GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, {Category::cGanonsCastle, Category::cDekuScrub,}, SpoilerCollectionCheck::Scrub(0x0D, 0x09), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); /*------------------------------- --- GOLD SKULLTULA TOKENS --- @@ -757,28 +756,29 @@ void LocationTable_Init() { --- CUTSCENES --- -------------------------------*/ - locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(0xFF, 0x00, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(0xFF, 0x01, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(0xFF, 0x02, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x10, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); - locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x11, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x12, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x13, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); - locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x14, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, 0x15, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - - locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(0xFF, 0x20, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(0xFF, 0x21, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(0xFF, 0x22, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(0xFF, 0x23, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(0xFF, 0x24, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(0xFF, 0x25, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(0xFF, 0x26, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(0xFF, 0x27, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(0xFF, 0x28, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(0xFF, 0x29, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); - locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(0xFF, 0x2A, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(0xFF, 0x2B, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(0xFF, DELOVR_MASTER_SWORD, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(0xFF, DELOVR_LACS, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(0xFF, DELOVR_SARIA_GIFT, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[HC_ZELDAS_LETTER] = ItemLocation::Delayed(0xFF, DELOVR_ZELDA_LETTER, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_ZF, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_HC, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DC, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DMT, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DMC, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_OGC, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + + locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(0xFF, DELOVR_SONG_MINUET, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(0xFF, DELOVR_SONG_BOLERO, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SERENADE, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(0xFF, DELOVR_SONG_REQUIEM, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(0xFF, DELOVR_SONG_NOCTURNE, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(0xFF, DELOVR_SONG_PRELUDE, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(0xFF, DELOVR_SONG_LULLABY, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(0xFF, DELOVR_SONG_EPONA, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SARIA, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SUN, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(0xFF, DELOVR_SONG_TIME, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(0xFF, DELOVR_SONG_STORMS, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); /*------------------------------- --- COWS --- @@ -1707,8 +1707,7 @@ void GenerateLocationPool() { } } -void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmediately /*= false*/, - bool setHidden /*= false*/) { +void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmediately /*= false*/) { auto loc = Location(locKey); PlacementLog_Msg("\n"); PlacementLog_Msg(ItemTable(item).GetName().GetNAEnglish()); @@ -1738,9 +1737,6 @@ void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmed } loc->SetPlacedItem(item); - if (setHidden) { - loc->SetHidden(true); - } } std::vector GetLocations(const std::vector& locationPool, Category categoryInclude, @@ -1811,10 +1807,12 @@ void CreateItemOverrides() { if (loc->GetPlacedItemKey() == ICE_TRAP && loc->IsCategory(Category::cShop)) { NonShopItems[TransformShopIndex(GetShopIndex(locKey))].Name = GetIceTrapName(val.looksLikeItemId); } - overrides.insert({ - .key = loc->Key(), - .value = val, - }); + if (loc->IsOverridden()) { + overrides.insert({ + .key = loc->Key(), + .value = val, + }); + } PlacementLog_Msg("\tScene: "); PlacementLog_Msg(std::to_string(loc->Key().scene)); PlacementLog_Msg("\tType: "); @@ -1824,7 +1822,11 @@ void CreateItemOverrides() { PlacementLog_Msg("\t"); PlacementLog_Msg(loc->GetName()); PlacementLog_Msg(": "); - PlacementLog_Msg(loc->GetPlacedItemName().GetNAEnglish()); + if (loc->IsOverridden()) { + PlacementLog_Msg(loc->GetPlacedItemName().GetNAEnglish()); + } else { + PlacementLog_Msg("Not Overridden"); + } PlacementLog_Msg("\n"); } PlacementLog_Msg("Overrides Created: "); diff --git a/source/item_location.hpp b/source/item_location.hpp index fbaa48191..c0c8dfd61 100644 --- a/source/item_location.hpp +++ b/source/item_location.hpp @@ -183,6 +183,7 @@ class ItemLocation { void SetPlacedItem(const ItemKey item) { placedItem = item; SetPrice(ItemTable(placedItem).GetPrice()); + overridden = true; } // Saves an item to be set as placedItem later @@ -193,6 +194,8 @@ class ItemLocation { // Place the vanilla item in this location void PlaceVanillaItem() { placedItem = vanillaItem; + // Keep override only when it is required to give the vanilla item. + overridden = (type == ItemLocationType::Delayed || type == ItemLocationType::TempleReward); } void ApplyPlacedItemEffect() { @@ -203,6 +206,7 @@ class ItemLocation { void SaveDelayedItem() { placedItem = delayedItem; delayedItem = NONE; + overridden = true; } u16 GetPrice() const { @@ -270,14 +274,6 @@ class ItemLocation { hintedAt = true; } - bool IsHidden() const { - return hidden; - } - - void SetHidden(const bool hidden_) { - hidden = hidden_; - } - bool IsHintable() const { return isHintable; } @@ -294,6 +290,10 @@ class ItemLocation { return parentRegion; } + bool IsOverridden() { + return overridden; + } + void AddExcludeOption() { // setting description /*--------------------------------------------------*/ std::string_view desc = "Decide which locations you want to exclude from\n" @@ -433,7 +433,7 @@ class ItemLocation { isHintable = false; price = 0; hasShopsanityPrice = false; - hidden = false; + overridden = false; } private: @@ -457,7 +457,7 @@ class ItemLocation { bool isHintable = false; AreaKey parentRegion = NONE; bool hasShopsanityPrice = false; - bool hidden = false; + bool overridden = false; }; class ItemOverride_Compare { @@ -496,7 +496,7 @@ extern bool showItemProgress; extern u16 itemsPlaced; void GenerateLocationPool(); -void PlaceItemInLocation(LocationKey loc, ItemKey item, bool applyEffectImmediately = false, bool setHidden = false); +void PlaceItemInLocation(LocationKey loc, ItemKey item, bool applyEffectImmediately = false); std::vector GetLocations(const std::vector& locationPool, Category categoryInclude, Category categoryExclude = Category::cNull); void LocationReset(); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 00f626a05..5f2f2dcf9 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -344,61 +344,60 @@ void PlaceJunkInExcludedLocation(const LocationKey il) { } static void PlaceVanillaDekuScrubItems() { - PlaceItemInLocation(ZR_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(ZR_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(SFM_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(SFM_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(LH_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GV_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GV_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, DEKU_STICK_1, false, true); - PlaceItemInLocation(LW_DEKU_SCRUB_GROTTO_REAR, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RED_POTION_REFILL, false, true); - PlaceItemInLocation(COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB, BOMBS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(DMC_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(GC_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_RIGHT, BOMBS_5, false, true); - PlaceItemInLocation(LLR_DEKU_SCRUB_GROTTO_CENTER, DEKU_SEEDS_30, false, true); + Location(ZR_DEKU_SCRUB_GROTTO_REAR)->PlaceVanillaItem(); + Location(ZR_DEKU_SCRUB_GROTTO_FRONT)->PlaceVanillaItem(); + Location(SFM_DEKU_SCRUB_GROTTO_REAR)->PlaceVanillaItem(); + Location(SFM_DEKU_SCRUB_GROTTO_FRONT)->PlaceVanillaItem(); + Location(LH_DEKU_SCRUB_GROTTO_LEFT)->PlaceVanillaItem(); + Location(LH_DEKU_SCRUB_GROTTO_RIGHT)->PlaceVanillaItem(); + Location(LH_DEKU_SCRUB_GROTTO_CENTER)->PlaceVanillaItem(); + Location(GV_DEKU_SCRUB_GROTTO_REAR)->PlaceVanillaItem(); + Location(GV_DEKU_SCRUB_GROTTO_FRONT)->PlaceVanillaItem(); + Location(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT)->PlaceVanillaItem(); + Location(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT)->PlaceVanillaItem(); + Location(LW_DEKU_SCRUB_GROTTO_REAR)->PlaceVanillaItem(); + Location(COLOSSUS_DEKU_SCRUB_GROTTO_REAR)->PlaceVanillaItem(); + Location(COLOSSUS_DEKU_SCRUB_GROTTO_FRONT)->PlaceVanillaItem(); + Location(DMC_DEKU_SCRUB)->PlaceVanillaItem(); + Location(DMC_DEKU_SCRUB_GROTTO_LEFT)->PlaceVanillaItem(); + Location(DMC_DEKU_SCRUB_GROTTO_RIGHT)->PlaceVanillaItem(); + Location(DMC_DEKU_SCRUB_GROTTO_CENTER)->PlaceVanillaItem(); + Location(GC_DEKU_SCRUB_GROTTO_LEFT)->PlaceVanillaItem(); + Location(GC_DEKU_SCRUB_GROTTO_RIGHT)->PlaceVanillaItem(); + Location(GC_DEKU_SCRUB_GROTTO_CENTER)->PlaceVanillaItem(); + Location(LLR_DEKU_SCRUB_GROTTO_LEFT)->PlaceVanillaItem(); + Location(LLR_DEKU_SCRUB_GROTTO_RIGHT)->PlaceVanillaItem(); + Location(LLR_DEKU_SCRUB_GROTTO_CENTER)->PlaceVanillaItem(); // Dungeon Scrubs if (DekuTree.IsMQ()) { - PlaceItemInLocation(DEKU_TREE_MQ_DEKU_SCRUB, DEKU_SHIELD, false, true); + Location(DEKU_TREE_MQ_DEKU_SCRUB)->PlaceVanillaItem(); } if (DodongosCavern.IsMQ()) { - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, DEKU_STICK_1, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, DEKU_SHIELD, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RED_POTION_REFILL, false, - true); + Location(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS)->PlaceVanillaItem(); } else { - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, DEKU_NUTS_5, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, DEKU_STICK_1, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, DEKU_SHIELD, false, true); + Location(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT)->PlaceVanillaItem(); + Location(DODONGOS_CAVERN_DEKU_SCRUB_LOBBY)->PlaceVanillaItem(); } if (JabuJabusBelly.IsVanilla()) { - PlaceItemInLocation(JABU_JABUS_BELLY_DEKU_SCRUB, DEKU_NUTS_5); + Location(JABU_JABUS_BELLY_DEKU_SCRUB)->PlaceVanillaItem(); } if (GanonsCastle.IsMQ()) { - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, ARROWS_30, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, DEKU_NUTS_5, false, true); + Location(GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER)->PlaceVanillaItem(); + Location(GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT)->PlaceVanillaItem(); } else { - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, BOMBS_5, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, DEKU_SEEDS_30, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_RIGHT, RED_POTION_REFILL, false, true); - PlaceItemInLocation(GANONS_CASTLE_DEKU_SCRUB_LEFT, GREEN_POTION_REFILL, false, true); + Location(GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_DEKU_SCRUB_RIGHT)->PlaceVanillaItem(); + Location(GANONS_CASTLE_DEKU_SCRUB_LEFT)->PlaceVanillaItem(); } } @@ -422,18 +421,18 @@ static void PlaceVanillaBossKeys() { } static void PlaceVanillaCowMilk() { - PlaceItemInLocation(KF_LINKS_HOUSE_COW, MILK, false, true); - PlaceItemInLocation(HF_COW_GROTTO_COW, MILK, false, true); - PlaceItemInLocation(GV_COW, MILK, false, true); - PlaceItemInLocation(KAK_IMPAS_HOUSE_COW, MILK, false, true); - PlaceItemInLocation(DMT_COW_GROTTO_COW, MILK, false, true); - PlaceItemInLocation(LLR_STABLES_LEFT_COW, MILK, false, true); - PlaceItemInLocation(LLR_STABLES_RIGHT_COW, MILK, false, true); - PlaceItemInLocation(LLR_TOWER_LEFT_COW, MILK, false, true); - PlaceItemInLocation(LLR_TOWER_RIGHT_COW, MILK, false, true); + Location(KF_LINKS_HOUSE_COW)->PlaceVanillaItem(); + Location(HF_COW_GROTTO_COW)->PlaceVanillaItem(); + Location(GV_COW)->PlaceVanillaItem(); + Location(KAK_IMPAS_HOUSE_COW)->PlaceVanillaItem(); + Location(DMT_COW_GROTTO_COW)->PlaceVanillaItem(); + Location(LLR_STABLES_LEFT_COW)->PlaceVanillaItem(); + Location(LLR_STABLES_RIGHT_COW)->PlaceVanillaItem(); + Location(LLR_TOWER_LEFT_COW)->PlaceVanillaItem(); + Location(LLR_TOWER_RIGHT_COW)->PlaceVanillaItem(); if (JabuJabusBelly.IsMQ()) { - PlaceItemInLocation(JABU_JABUS_BELLY_MQ_COW, MILK, false, true); + Location(JABU_JABUS_BELLY_MQ_COW)->PlaceVanillaItem(); } } @@ -533,11 +532,11 @@ void GenerateItemPool() { // Fixed item locations // The Triforce is used to mark the win condition if (TriforceHunt) { - PlaceItemInLocation(GANON, GREEN_RUPEE, false, true); + PlaceItemInLocation(GANON, GREEN_RUPEE); PlaceItemInLocation(TRIFORCE_HUNT_GOAL, TRIFORCE); } else { PlaceItemInLocation(GANON, TRIFORCE); - PlaceItemInLocation(TRIFORCE_HUNT_GOAL, GREEN_RUPEE, false, true); + PlaceItemInLocation(TRIFORCE_HUNT_GOAL, GREEN_RUPEE); } PlaceItemInLocation(MARKET_BOMBCHU_BOWLING_BOMBCHUS, BOMBCHU_DROP); @@ -545,28 +544,28 @@ void GenerateItemPool() { AddItemToMainPool(KOKIRI_SWORD); IceTrapModels.push_back(GI_SWORD_KOKIRI); } else { - PlaceItemInLocation(KF_KOKIRI_SWORD_CHEST, KOKIRI_SWORD, false, true); + Location(KF_KOKIRI_SWORD_CHEST)->PlaceVanillaItem(); } if (ShuffleMasterSword) { AddItemToMainPool(MASTER_SWORD); IceTrapModels.push_back(GI_SWORD_MASTER); } else { - PlaceItemInLocation(TOT_MASTER_SWORD, MASTER_SWORD, false, true); + Location(TOT_MASTER_SWORD)->PlaceVanillaItem(); } if (ShuffleWeirdEgg) { AddItemToMainPool(WEIRD_EGG); IceTrapModels.push_back(GI_WEIRD_EGG); } else { - PlaceItemInLocation(HC_MALON_EGG, WEIRD_EGG, false, true); + Location(HC_MALON_EGG)->PlaceVanillaItem(); } if (ShuffleZeldasLetter) { AddItemToMainPool(ZELDAS_LETTER); IceTrapModels.push_back(GI_LETTER_ZELDA); } else { - PlaceItemInLocation(HC_ZELDAS_LETTER, ZELDAS_LETTER, false, true); + Location(HC_ZELDAS_LETTER)->PlaceVanillaItem(); } if (ShuffleOcarinas) { @@ -576,8 +575,8 @@ void GenerateItemPool() { } IceTrapModels.push_back(0x8B); // Progressive ocarina } else { - PlaceItemInLocation(LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, false, true); - PlaceItemInLocation(HF_OCARINA_OF_TIME_ITEM, PROGRESSIVE_OCARINA, false, true); + Location(LW_GIFT_FROM_SARIA)->PlaceVanillaItem(); + Location(HF_OCARINA_OF_TIME_ITEM)->PlaceVanillaItem(); } if (ShuffleCows) { @@ -600,7 +599,7 @@ void GenerateItemPool() { } IceTrapModels.push_back(0xC9); // Magic bean pack } else { - PlaceItemInLocation(ZR_MAGIC_BEAN_SALESMAN, MAGIC_BEAN, false, true); + Location(ZR_MAGIC_BEAN_SALESMAN)->PlaceVanillaItem(); } if (ShuffleMerchants.IsNot(SHUFFLEMERCHANTS_OFF)) { @@ -613,19 +612,19 @@ void GenerateItemPool() { AddItemToMainPool(BOMBCHU_10); } } else { - PlaceItemInLocation(KAK_GRANNYS_SHOP, BLUE_POTION_REFILL, false, true); - PlaceItemInLocation(GC_MEDIGORON, GIANTS_KNIFE, false, true); - PlaceItemInLocation(WASTELAND_BOMBCHU_SALESMAN, BOMBCHU_10, false, true); + Location(KAK_GRANNYS_SHOP)->PlaceVanillaItem(); + Location(GC_MEDIGORON)->PlaceVanillaItem(); + Location(WASTELAND_BOMBCHU_SALESMAN)->PlaceVanillaItem(); } if (ShuffleFrogSongRupees) { AddItemToMainPool(PURPLE_RUPEE, 5); } else { - PlaceItemInLocation(ZR_FROGS_ZELDAS_LULLABY, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_EPONAS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SARIAS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SUNS_SONG, PURPLE_RUPEE, false, true); - PlaceItemInLocation(ZR_FROGS_SONG_OF_TIME, PURPLE_RUPEE, false, true); + Location(ZR_FROGS_ZELDAS_LULLABY)->PlaceVanillaItem(); + Location(ZR_FROGS_EPONAS_SONG)->PlaceVanillaItem(); + Location(ZR_FROGS_SARIAS_SONG)->PlaceVanillaItem(); + Location(ZR_FROGS_SUNS_SONG)->PlaceVanillaItem(); + Location(ZR_FROGS_SONG_OF_TIME)->PlaceVanillaItem(); } if (ShuffleAdultTradeQuest) { @@ -639,15 +638,15 @@ void GenerateItemPool() { AddItemToMainPool(EYEBALL_FROG); AddItemToMainPool(EYEDROPS); } else { - PlaceItemInLocation(KAK_TRADE_POCKET_CUCCO, COJIRO, false, true); - PlaceItemInLocation(LW_TRADE_COJIRO, ODD_MUSHROOM, false, true); - PlaceItemInLocation(KAK_TRADE_ODD_MUSHROOM, ODD_POULTICE, false, true); - PlaceItemInLocation(LW_TRADE_ODD_POULTICE, POACHERS_SAW, false, true); - PlaceItemInLocation(GV_TRADE_SAW, BROKEN_SWORD, false, true); - PlaceItemInLocation(DMT_TRADE_BROKEN_SWORD, PRESCRIPTION, false, true); - PlaceItemInLocation(ZD_TRADE_PRESCRIPTION, EYEBALL_FROG, false, true); - PlaceItemInLocation(LH_TRADE_FROG, EYEDROPS, false, true); - PlaceItemInLocation(DMT_TRADE_EYEDROPS, CLAIM_CHECK, false, true); + Location(KAK_TRADE_POCKET_CUCCO)->PlaceVanillaItem(); + Location(LW_TRADE_COJIRO)->PlaceVanillaItem(); + Location(KAK_TRADE_ODD_MUSHROOM)->PlaceVanillaItem(); + Location(LW_TRADE_ODD_POULTICE)->PlaceVanillaItem(); + Location(GV_TRADE_SAW)->PlaceVanillaItem(); + Location(DMT_TRADE_BROKEN_SWORD)->PlaceVanillaItem(); + Location(ZD_TRADE_PRESCRIPTION)->PlaceVanillaItem(); + Location(LH_TRADE_FROG)->PlaceVanillaItem(); + Location(DMT_TRADE_EYEDROPS)->PlaceVanillaItem(); } AddItemToMainPool(CLAIM_CHECK); @@ -656,21 +655,21 @@ void GenerateItemPool() { } else if (ShuffleChestMinigame.Is(SHUFFLECHESTMINIGAME_PACK)) { AddItemToMainPool(TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 } else { - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_3, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_4, TREASURE_GAME_SMALL_KEY, false, true); - PlaceItemInLocation(MARKET_TREASURE_CHEST_GAME_ITEM_5, TREASURE_GAME_SMALL_KEY, false, true); + Location(MARKET_TREASURE_CHEST_GAME_ITEM_1)->PlaceVanillaItem(); + Location(MARKET_TREASURE_CHEST_GAME_ITEM_2)->PlaceVanillaItem(); + Location(MARKET_TREASURE_CHEST_GAME_ITEM_3)->PlaceVanillaItem(); + Location(MARKET_TREASURE_CHEST_GAME_ITEM_4)->PlaceVanillaItem(); + Location(MARKET_TREASURE_CHEST_GAME_ITEM_5)->PlaceVanillaItem(); }; if (Tokensanity.Is(TOKENSANITY_OFF)) { for (LocationKey loc : GetLocations(allLocations, Category::cSkulltula)) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + Location(loc)->PlaceVanillaItem(); } } else if (Tokensanity.Is(TOKENSANITY_DUNGEONS)) { for (LocationKey loc : GetLocations(allLocations, Category::cSkulltula)) { if (Location(loc)->IsOverworld()) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + Location(loc)->PlaceVanillaItem(); } else { AddItemToMainPool(GOLD_SKULLTULA_TOKEN); } @@ -678,7 +677,7 @@ void GenerateItemPool() { } else if (Tokensanity.Is(TOKENSANITY_OVERWORLD)) { for (LocationKey loc : GetLocations(allLocations, Category::cSkulltula)) { if (Location(loc)->IsDungeon()) { - PlaceItemInLocation(loc, GOLD_SKULLTULA_TOKEN, false, true); + Location(loc)->PlaceVanillaItem(); } else { AddItemToMainPool(GOLD_SKULLTULA_TOKEN); } @@ -716,16 +715,16 @@ void GenerateItemPool() { // Gerudo Fortress if (GerudoFortress.Is(GERUDOFORTRESS_OPEN)) { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + Location(GF_NORTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_NORTH_F2_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F2_CARPENTER)->PlaceVanillaItem(); } else if (GerudoKeys.IsNot(GERUDOKEYS_VANILLA)) { if (GerudoFortress.Is(GERUDOFORTRESS_FAST)) { AddItemToMainPool(GERUDO_FORTRESS_SMALL_KEY); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + Location(GF_NORTH_F2_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F2_CARPENTER)->PlaceVanillaItem(); } else { // Only add key ring if 4 Fortress keys necessary if (RingFortress) { @@ -747,15 +746,15 @@ void GenerateItemPool() { } } else { if (GerudoFortress.Is(GERUDOFORTRESS_FAST)) { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, RECOVERY_HEART, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, RECOVERY_HEART, false, true); + Location(GF_NORTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_NORTH_F2_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F2_CARPENTER)->PlaceVanillaItem(); } else { - PlaceItemInLocation(GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_SOUTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); - PlaceItemInLocation(GF_SOUTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, false, true); + Location(GF_NORTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_NORTH_F2_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F1_CARPENTER)->PlaceVanillaItem(); + Location(GF_SOUTH_F2_CARPENTER)->PlaceVanillaItem(); } } @@ -765,9 +764,9 @@ void GenerateItemPool() { IceTrapModels.push_back(GI_GERUDO_CARD); } else if (ShuffleGerudoToken) { AddItemToPool(PendingJunkPool, GERUDO_TOKEN); - PlaceItemInLocation(GF_GERUDO_TOKEN, ICE_TRAP, false, true); + PlaceItemInLocation(GF_GERUDO_TOKEN, ICE_TRAP); } else { - PlaceItemInLocation(GF_GERUDO_TOKEN, GERUDO_TOKEN, false, true); + Location(GF_GERUDO_TOKEN)->PlaceVanillaItem(); } // Keys diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 996b1321c..dfd489105 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -834,7 +834,7 @@ static void WriteAllLocations(tinyxml2::XMLDocument& spoilerLog, const bool coll auto parentNode = spoilerLog.NewElement("all-locations"); for (const LocationKey key : allLocations) { - if (!Location(key)->IsHidden()) { + if (Location(key)->IsOverridden()) { WriteLocation(parentNode, key, true); } } From f18e031f6c0de95c2ec329b3561ad1b70585822f Mon Sep 17 00:00:00 2001 From: HylianFreddy <82058772+HylianFreddy@users.noreply.github.com> Date: Sun, 10 May 2026 19:14:21 +0200 Subject: [PATCH 2/3] Change enum prefix to DLYOVR --- code/src/cutscenes.c | 30 ++++++++++----------- code/src/item_override.c | 4 +-- code/src/master_sword_pedestal.c | 2 +- code/src/savefile.c | 2 +- shared/s_item_override.h | 44 +++++++++++++++--------------- source/item_location.cpp | 46 ++++++++++++++++---------------- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/code/src/cutscenes.c b/code/src/cutscenes.c index 6f5eb59ac..8827bc125 100644 --- a/code/src/cutscenes.c +++ b/code/src/cutscenes.c @@ -57,7 +57,7 @@ void Cutscene_OverrideLACS(void) { break; } if (conditionMet) { - ItemOverride_PushDelayedOverride(DELOVR_LACS); + ItemOverride_PushDelayedOverride(DLYOVR_LACS); EventSet(0xC4); gSaveContext.entranceIndex = 0x58C; } @@ -65,12 +65,12 @@ void Cutscene_OverrideLACS(void) { void Cutscene_OverrideMinuet(void) { gSaveContext.eventChkInf[5] |= 0x1; - ItemOverride_PushDelayedOverride(DELOVR_SONG_MINUET); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_MINUET); } void Cutscene_OverrideBolero(void) { gSaveContext.eventChkInf[5] |= 0x2; - ItemOverride_PushDelayedOverride(DELOVR_SONG_BOLERO); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_BOLERO); } u32 Cutscene_SerenadeCheckChestFlag(void) { @@ -79,13 +79,13 @@ u32 Cutscene_SerenadeCheckChestFlag(void) { void Cutscene_OverrideSerenade(void) { gSaveContext.eventChkInf[5] |= 0x4; - ItemOverride_PushDelayedOverride(DELOVR_SONG_SERENADE); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_SERENADE); } u32 Cutscene_OverrideRequiem(void) { if (!EventCheck(0xAC) && Entrance_SceneAndSpawnAre(0x5C, 0x01)) { // Spirit Temple -> Desert Colossus, index 01E1 in the entrance table - ItemOverride_PushDelayedOverride(DELOVR_SONG_REQUIEM); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_REQUIEM); EventSet(0xAC); gSaveContext.entranceIndex = 0x1ED; } @@ -96,7 +96,7 @@ void Cutscene_OverrideNocturne(void) { if ((gEntranceTable[gSaveContext.entranceIndex].scene == 0x52) && (gSaveContext.linkAge == AGE_ADULT)) { if ((gSaveContext.questItems & 0x1) && (gSaveContext.questItems & 0x2) && (gSaveContext.questItems & 0x4)) { if (!EventCheck(0xAA)) { - ItemOverride_PushDelayedOverride(DELOVR_SONG_NOCTURNE); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_NOCTURNE); EventSet(0xAA); gSaveContext.entranceIndex = 0x513; } @@ -106,7 +106,7 @@ void Cutscene_OverrideNocturne(void) { u32 Cutscene_OverridePrelude(void) { if (gSaveContext.questItems & 0x1) { - ItemOverride_PushDelayedOverride(DELOVR_SONG_PRELUDE); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_PRELUDE); gSaveContext.eventChkInf[5] |= 0x20; return 1; } @@ -118,7 +118,7 @@ u32 Cutscene_CheckLullabyFlag(void) { } void Cutscene_OverrideLullaby(void) { - ItemOverride_PushDelayedOverride(DELOVR_SONG_LULLABY); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_LULLABY); gSaveContext.eventChkInf[5] |= 0x200; gGlobalContext->nextEntranceIndex = 0x594; gGlobalContext->sceneLoadFlag = 0x14; @@ -131,7 +131,7 @@ u32 Cutscene_CheckEponasSongFlag(void) { void Cutscene_OverrideEponasSong(void) { gSaveContext.eventChkInf[5] |= 0x100; - ItemOverride_PushDelayedOverride(DELOVR_SONG_EPONA); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_EPONA); gGlobalContext->unk_2B7E = 4; } @@ -141,21 +141,21 @@ u32 Cutscene_CheckSariasSongFlag(void) { void Cutscene_OverrideSariasSong(void) { if (!(gSaveContext.eventChkInf[5] & 0x80)) { - ItemOverride_PushDelayedOverride(DELOVR_SONG_SARIA); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_SARIA); gSaveContext.eventChkInf[5] |= 0x80; } } void Cutscene_OverrideSunsSong(void) { if (!(gSaveContext.eventChkInf[5] & 0x400)) { - ItemOverride_PushDelayedOverride(DELOVR_SONG_SUN); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_SUN); gSaveContext.eventChkInf[5] |= 0x400; } } void Cutscene_OverrideSongOfTime(Actor* ocarina) { gSaveContext.eventChkInf[10] |= 0x200; - ItemOverride_PushDelayedOverride(DELOVR_SONG_TIME); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_TIME); gGlobalContext->nextEntranceIndex = 0x50F; gGlobalContext->sceneLoadFlag = 0x14; } @@ -163,7 +163,7 @@ void Cutscene_OverrideSongOfTime(Actor* ocarina) { void Cutscene_OverrideSongOfStorms(void) { gSaveContext.eventChkInf[6] |= 0x20; gSaveContext.eventChkInf[5] |= 0x800; - ItemOverride_PushDelayedOverride(DELOVR_SONG_STORMS); + ItemOverride_PushDelayedOverride(DLYOVR_SONG_STORMS); gGlobalContext->unk_2B7E = 4; } @@ -172,12 +172,12 @@ void Cutscene_OverrideFairyReward(BgDyYoseizo* fairy) { if (gGlobalContext->sceneNum == SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS) { if (!(gSaveContext.itemGetInf[1] & (0x100 << fairyIdx))) { - ItemOverride_PushDelayedOverride(DELOVR_FAIRY_ZF + fairyIdx); + ItemOverride_PushDelayedOverride(DLYOVR_FAIRY_ZF + fairyIdx); gSaveContext.itemGetInf[1] |= (0x100 << fairyIdx); } } else if (gGlobalContext->sceneNum == SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC) { if (!(gGlobalContext->actorCtx.flags.chest & (0x1 << fairyIdx))) { - ItemOverride_PushDelayedOverride(DELOVR_FAIRY_DMT + fairyIdx); + ItemOverride_PushDelayedOverride(DLYOVR_FAIRY_DMT + fairyIdx); gGlobalContext->actorCtx.flags.chest |= (0x1 << fairyIdx); } } diff --git a/code/src/item_override.c b/code/src/item_override.c index f90f65d0a..3bca21605 100644 --- a/code/src/item_override.c +++ b/code/src/item_override.c @@ -659,7 +659,7 @@ s32 ItemOverride_GiveSariasGift(void) { u32 receivedGift = EventCheck(0xC1); if (receivedGift == 0 && Entrance_SceneAndSpawnAre(0x5B, 0x09)) { // Kokiri Forest -> LW Bridge, index 05E0 in the entrance table - ItemOverride_PushDelayedOverride(DELOVR_SARIA_GIFT); + ItemOverride_PushDelayedOverride(DLYOVR_SARIA_GIFT); EventSet(0xC1); } @@ -670,7 +670,7 @@ s32 ItemOverride_GiveSariasGift(void) { // If we haven't obtained Zelda's Letter and are in the castle courtyard, push it void ItemOverride_CheckZeldasLetter() { if (!EventCheck(0x40) && gGlobalContext->sceneNum == SCENE_CASTLE_COURTYARD_ZELDA) { - ItemOverride_PushDelayedOverride(DELOVR_ZELDA_LETTER); + ItemOverride_PushDelayedOverride(DLYOVR_ZELDA_LETTER); EventSet(0x40); } } diff --git a/code/src/master_sword_pedestal.c b/code/src/master_sword_pedestal.c index c9de806dd..6a2337561 100644 --- a/code/src/master_sword_pedestal.c +++ b/code/src/master_sword_pedestal.c @@ -24,7 +24,7 @@ void SetTimeTraveled() { void Pedestal_PickUpMasterSword(void) { // Push pedestal item if (gSettingsContext.shuffleMasterSword && !(gExtSaveData.extInf.masterSwordFlags & 2)) { - ItemOverride_PushDelayedOverride(DELOVR_MASTER_SWORD); + ItemOverride_PushDelayedOverride(DLYOVR_MASTER_SWORD); } if (!SaveFile_SwordlessPatchesEnabled()) { diff --git a/code/src/savefile.c b/code/src/savefile.c index bca9705b1..4850f5b4f 100644 --- a/code/src/savefile.c +++ b/code/src/savefile.c @@ -836,7 +836,7 @@ void SaveFile_LoadFileSwordless(void) { if (gSaveContext.linkAge == 0) { // Push pedestal item if adult and haven't received yet if (gSettingsContext.shuffleMasterSword && !(gExtSaveData.extInf.masterSwordFlags & 2)) { - ItemOverride_PushDelayedOverride(DELOVR_MASTER_SWORD); + ItemOverride_PushDelayedOverride(DLYOVR_MASTER_SWORD); } // Mark pedestal item collected diff --git a/shared/s_item_override.h b/shared/s_item_override.h index b9d906853..9df970dd0 100644 --- a/shared/s_item_override.h +++ b/shared/s_item_override.h @@ -26,26 +26,26 @@ typedef struct ItemOverride { } ItemOverride; typedef enum DelayedOverride { - DELOVR_MASTER_SWORD, - DELOVR_LACS, - DELOVR_SARIA_GIFT, - DELOVR_ZELDA_LETTER, - DELOVR_FAIRY_ZF, - DELOVR_FAIRY_HC, - DELOVR_FAIRY_DC, - DELOVR_FAIRY_DMT, - DELOVR_FAIRY_DMC, - DELOVR_FAIRY_OGC, - DELOVR_SONG_MINUET, - DELOVR_SONG_BOLERO, - DELOVR_SONG_SERENADE, - DELOVR_SONG_REQUIEM, - DELOVR_SONG_NOCTURNE, - DELOVR_SONG_PRELUDE, - DELOVR_SONG_LULLABY, - DELOVR_SONG_EPONA, - DELOVR_SONG_SARIA, - DELOVR_SONG_SUN, - DELOVR_SONG_TIME, - DELOVR_SONG_STORMS, + DLYOVR_MASTER_SWORD, + DLYOVR_LACS, + DLYOVR_SARIA_GIFT, + DLYOVR_ZELDA_LETTER, + DLYOVR_FAIRY_ZF, + DLYOVR_FAIRY_HC, + DLYOVR_FAIRY_DC, + DLYOVR_FAIRY_DMT, + DLYOVR_FAIRY_DMC, + DLYOVR_FAIRY_OGC, + DLYOVR_SONG_MINUET, + DLYOVR_SONG_BOLERO, + DLYOVR_SONG_SERENADE, + DLYOVR_SONG_REQUIEM, + DLYOVR_SONG_NOCTURNE, + DLYOVR_SONG_PRELUDE, + DLYOVR_SONG_LULLABY, + DLYOVR_SONG_EPONA, + DLYOVR_SONG_SARIA, + DLYOVR_SONG_SUN, + DLYOVR_SONG_TIME, + DLYOVR_SONG_STORMS, } DelayedOverride; diff --git a/source/item_location.cpp b/source/item_location.cpp index d7bad27dc..703052953 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -756,29 +756,29 @@ void LocationTable_Init() { --- CUTSCENES --- -------------------------------*/ - locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(0xFF, DELOVR_MASTER_SWORD, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(0xFF, DELOVR_LACS, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(0xFF, DELOVR_SARIA_GIFT, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[HC_ZELDAS_LETTER] = ItemLocation::Delayed(0xFF, DELOVR_ZELDA_LETTER, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_ZF, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); - locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_HC, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DC, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DMT, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); - locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_DMC, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DELOVR_FAIRY_OGC, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - - locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(0xFF, DELOVR_SONG_MINUET, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(0xFF, DELOVR_SONG_BOLERO, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); - locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SERENADE, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(0xFF, DELOVR_SONG_REQUIEM, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); - locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(0xFF, DELOVR_SONG_NOCTURNE, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(0xFF, DELOVR_SONG_PRELUDE, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_MARKET); - locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(0xFF, DELOVR_SONG_LULLABY, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(0xFF, DELOVR_SONG_EPONA, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); - locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SARIA, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); - locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(0xFF, DELOVR_SONG_SUN, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); - locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(0xFF, DELOVR_SONG_TIME, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); - locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(0xFF, DELOVR_SONG_STORMS, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[TOT_MASTER_SWORD] = ItemLocation::Delayed(0xFF, DLYOVR_MASTER_SWORD, "ToT Master Sword", TOT_MASTER_SWORD, MASTER_SWORD, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::MasterSword(), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[TOT_LIGHT_ARROWS_CUTSCENE] = ItemLocation::Delayed(0xFF, DLYOVR_LACS, "ToT Light Arrow Cutscene", TOT_LIGHT_ARROWS_CUTSCENE, LIGHT_ARROWS, {Category::cTempleOfTime, Category::cMarket}, SpoilerCollectionCheck::EventChkInf(0xC4), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[LW_GIFT_FROM_SARIA] = ItemLocation::Delayed(0xFF, DLYOVR_SARIA_GIFT, "LW Gift From Saria", LW_GIFT_FROM_SARIA, PROGRESSIVE_OCARINA, {Category::cLostWoods, Category::cForest}, SpoilerCollectionCheck::EventChkInf(0xC1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[HC_ZELDAS_LETTER] = ItemLocation::Delayed(0xFF, DLYOVR_ZELDA_LETTER, "HC Zeldas Letter", HC_ZELDAS_LETTER, ZELDAS_LETTER, {Category::cHyruleCastle, Category::cMarket,}, SpoilerCollectionCheck::EventChkInf(0x40), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[ZF_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_ZF, "ZF Great Fairy Reward", ZF_GREAT_FAIRY_REWARD, FARORES_WIND, {Category::cZorasFountain, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[HC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_HC, "HC Great Fairy Reward", HC_GREAT_FAIRY_REWARD, DINS_FIRE, {Category::cHyruleCastle, Category::cMarket, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[COLOSSUS_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_DC, "Colossus Great Fairy Reward", COLOSSUS_GREAT_FAIRY_REWARD, NAYRUS_LOVE, {Category::cDesertColossus, Category::cFairies}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[DMT_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_DMT, "DMT Great Fairy Reward", DMT_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainTrail, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x00), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_DMC, "DMC Great Fairy Reward", DMC_GREAT_FAIRY_REWARD, PROGRESSIVE_MAGIC_METER, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x01), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[OGC_GREAT_FAIRY_REWARD] = ItemLocation::Delayed(0xFF, DLYOVR_FAIRY_OGC, "OGC Great Fairy Reward", OGC_GREAT_FAIRY_REWARD, DOUBLE_DEFENSE, {Category::cOutsideGanonsCastle, Category::cFairies}, SpoilerCollectionCheck::Chest(0x3B, 0x02), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + + locationTable[SHEIK_IN_FOREST] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_MINUET, "Sheik in Forest", SHEIK_IN_FOREST, MINUET_OF_FOREST, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x50), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SHEIK_IN_CRATER] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_BOLERO, "Sheik in Crater", SHEIK_IN_CRATER, BOLERO_OF_FIRE, {Category::cDeathMountainCrater, Category::cDeathMountain, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x51), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[SHEIK_IN_ICE_CAVERN] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_SERENADE, "Sheik in Ice Cavern", SHEIK_IN_ICE_CAVERN, SERENADE_OF_WATER, {Category::cIceCavern, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x52), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[SHEIK_AT_COLOSSUS] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_REQUIEM, "Sheik at Colossus", SHEIK_AT_COLOSSUS, REQUIEM_OF_SPIRIT, {Category::cDesertColossus, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAC), SpoilerCollectionCheckGroup::GROUP_HAUNTED_WASTELAND); + locationTable[SHEIK_IN_KAKARIKO] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_NOCTURNE, "Sheik in Kakariko", SHEIK_IN_KAKARIKO, NOCTURNE_OF_SHADOW, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0xAA), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[SHEIK_AT_TEMPLE] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_PRELUDE, "Sheik at Temple", SHEIK_AT_TEMPLE, PRELUDE_OF_LIGHT, {Category::cTempleOfTime, Category::cMarket, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x55), SpoilerCollectionCheckGroup::GROUP_MARKET); + locationTable[SONG_FROM_IMPA] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_LULLABY, "Song from Impa", SONG_FROM_IMPA, ZELDAS_LULLABY, {Category::cHyruleCastle, Category::cMarket, Category::cSong, Category::cSongDungeonReward}, SpoilerCollectionCheck::EventChkInf(0x59), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[SONG_FROM_MALON] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_EPONA, "Song from Malon", SONG_FROM_MALON, EPONAS_SONG, {Category::cLonLonRanch, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x58), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[SONG_FROM_SARIA] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_SARIA, "Song from Saria", SONG_FROM_SARIA, SARIAS_SONG, {Category::cSacredForestMeadow, Category::cForest, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x57), SpoilerCollectionCheckGroup::GROUP_SACRED_FOREST_MEADOW); + locationTable[SONG_FROM_COMPOSERS_GRAVE] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_SUN, "Song from Composers Grave", SONG_FROM_COMPOSERS_GRAVE, SUNS_SONG, {Category::cGraveyard, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5A), SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[SONG_FROM_OCARINA_OF_TIME] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_TIME, "Song from Ocarina of Time", SONG_FROM_OCARINA_OF_TIME, SONG_OF_TIME, {Category::cHyruleField, Category::cSong, Category::cNeedSpiritualStones,}, SpoilerCollectionCheck::EventChkInf(0xA9), SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[SONG_FROM_WINDMILL] = ItemLocation::Delayed(0xFF, DLYOVR_SONG_STORMS, "Song from Windmill", SONG_FROM_WINDMILL, SONG_OF_STORMS, {Category::cKakarikoVillage, Category::cKakariko, Category::cSong,}, SpoilerCollectionCheck::EventChkInf(0x5B), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); /*------------------------------- --- COWS --- From f2d40f2abd9a95f370c9ad6a4afad346f18c1987 Mon Sep 17 00:00:00 2001 From: HylianFreddy <82058772+HylianFreddy@users.noreply.github.com> Date: Sun, 10 May 2026 19:18:49 +0200 Subject: [PATCH 3/3] Mark scrub functions as static --- code/src/actors/business_scrubs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/src/actors/business_scrubs.c b/code/src/actors/business_scrubs.c index bf28f1e0e..88f2ae745 100644 --- a/code/src/actors/business_scrubs.c +++ b/code/src/actors/business_scrubs.c @@ -6,8 +6,8 @@ void EnDns_Update(Actor* thisx, GlobalContext* globalCtx); void EnShopnuts_Init(Actor* thisx, GlobalContext* globalCtx); -u32 EnDns_rCanBuy(EnDns* scrub); -void EnDns_rPay(EnDns* scrub); +static u32 EnDns_rCanBuy(EnDns* scrub); +static void EnDns_rPay(EnDns* scrub); extern DnsItemEntry* EnDns_ItemEntries[]; @@ -22,7 +22,7 @@ void BusinessScrubs_Init(void) { } } -u32 EnDns_rCanBuy(EnDns* scrub) { +static u32 EnDns_rCanBuy(EnDns* scrub) { s16 price; if (gSettingsContext.scrubsanity == SCRUBSANITY_AFFORDABLE) { @@ -39,7 +39,7 @@ u32 EnDns_rCanBuy(EnDns* scrub) { return DNS_CANBUY_RESULT_SUCCESS; } -void EnDns_rPay(EnDns* scrub) { +static void EnDns_rPay(EnDns* scrub) { u32 sceneNum = gGlobalContext->sceneNum; u32 bitMask = (0x1 << (scrub->actor.params + 1));