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 a9e162742d..da6a5da797 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..5245e45c0c 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,10 @@ 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); + getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); + getItemId = getItem.getItemId; func_8002F554(&this->actor, globalCtx, getItemId); + GET_PLAYER(globalCtx)->getItemEntry = getItem; } EnItem00_SetupAction(this, func_8001E5C8); @@ -702,6 +705,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,7 +885,9 @@ 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; + getItemId = getItem.getItemId; } func_8002F554(&this->actor, globalCtx, getItemId); } 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 2465b5a68f..97e0f5072d 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6110,9 +6110,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { } else { giEntry = this->getItemEntry; } - if ((giEntry.modIndex == MOD_NONE && (this->getItemId < GI_MAX || - (giEntry.getItemId >= RG_KOKIRI_EMERALD && giEntry.getItemId <= RG_LIGHT_MEDALLION))) || - (giEntry.modIndex == MOD_RANDOMIZER && this->getItemId < RG_MAX)) { + if (giEntry.collectable) { if ((interactedActor != &this->actor) && !iREG(67)) { interactedActor->parent = &this->actor; }