From 9c59624d646a1596c7c827a479cc692302662004 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 02:08:32 -0400 Subject: [PATCH 1/2] Makes freestanding items set player->getItemEntry. This prevents freestanding items from setting the global modIndex. This is part of a larger transition that needs to happen to switch to setting getItemEntries for all of the rando items. This prevents some things that set getItemId of GI_MAX from granting a Fire Medallion when the global modIndex is MOD_RANDOMIZER. --- soh/soh/Enhancements/item-tables/ItemTableTypes.h | 9 +++++---- soh/soh/OTRGlobals.cpp | 3 ++- soh/src/code/z_en_item00.c | 12 ++++++++---- soh/src/overlays/actors/ovl_player_actor/z_player.c | 3 +-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index f5a2c1f68e..1a703f30dd 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -7,10 +7,10 @@ #define CHEST_ANIM_LONG 1 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0, 0, 0 } + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false } typedef struct { /* 0x00 */ uint16_t itemId; @@ -20,5 +20,6 @@ typedef struct { /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? /* 0x08 */ uint16_t getItemId; - /* 0x10 */ uint16_t gid; // Stores the GID value unmodified for future reference. -} GetItemEntry; // size = 0x10 + /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. + /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. +} GetItemEntry; // size = 0x0F diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e8d3a74c4b..9a189bfa34 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1610,7 +1610,8 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check) } extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) { - return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID); + return giEntry; } extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) { diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index b2ac1bd725..89bf5b3eb9 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -335,6 +335,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { f32 yOffset = 980.0f; f32 shadowScale = 6.0f; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 spawnParam8000 = this->actor.params & 0x8000; s32 pad1; @@ -509,8 +510,9 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { } if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - func_8002F554(&this->actor, globalCtx, getItemId); + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + func_8002F554(&this->actor, globalCtx, getItem.getItemId); + GET_PLAYER(globalCtx)->getItemEntry = getItem; } EnItem00_SetupAction(this, func_8001E5C8); @@ -702,6 +704,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { s16* params; Actor* dynaActor; s32 getItemId = GI_NONE; + GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE; s16 sp3A = 0; s16 i; u32* temp; @@ -881,9 +884,10 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if (gSaveContext.n64ddFlag) { - getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + GET_PLAYER(globalCtx)->getItemEntry = getItem; } - func_8002F554(&this->actor, globalCtx, getItemId); + func_8002F554(&this->actor, globalCtx, getItem.getItemId); } switch (*params) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 2c33afbb14..a16eb7879f 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6110,8 +6110,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } else { giEntry = this->getItemEntry; } - if ((giEntry.modIndex == MOD_NONE && this->getItemId < GI_MAX) || - (giEntry.modIndex == MOD_RANDOMIZER && this->getItemId < RG_MAX)) { + if (giEntry.collectable) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; } From 6b4f300eda39ca72a3e00e8c4287ceb0b38e8f8b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 15 Aug 2022 02:17:06 -0400 Subject: [PATCH 2/2] Makes sure we aren't using getItemEntry when not randoed. --- soh/src/code/z_en_item00.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 89bf5b3eb9..5245e45c0c 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -511,7 +511,8 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); - func_8002F554(&this->actor, globalCtx, getItem.getItemId); + getItemId = getItem.getItemId; + func_8002F554(&this->actor, globalCtx, getItemId); GET_PLAYER(globalCtx)->getItemEntry = getItem; } @@ -886,8 +887,9 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GET_PLAYER(globalCtx)->getItemEntry = getItem; + getItemId = getItem.getItemId; } - func_8002F554(&this->actor, globalCtx, getItem.getItemId); + func_8002F554(&this->actor, globalCtx, getItemId); } switch (*params) {