From 64dcb37a50d82829663d5f4707e6cdc6efcb760d Mon Sep 17 00:00:00 2001 From: Phlex Date: Mon, 12 Feb 2024 07:49:11 -0600 Subject: [PATCH 1/2] Fix bottle logic not applying properly. Remove rnd namespace as that is the namespace we're currently in. From 01531f15e4d99ffd6ab2ae95d1175eae35b0cbe3 Mon Sep 17 00:00:00 2001 From: Phlex Date: Mon, 12 Feb 2024 13:24:43 -0600 Subject: [PATCH 2/2] Fix enGinkoMan override. Finalize fix for bottle overrides in chests as well. --- code/include/rnd/savefile.h | 30 +++++++------- code/source/rnd/item_override.cpp | 65 ++++++------------------------- 2 files changed, 26 insertions(+), 69 deletions(-) diff --git a/code/include/rnd/savefile.h b/code/include/rnd/savefile.h index 682c5520..8aa600cf 100644 --- a/code/include/rnd/savefile.h +++ b/code/include/rnd/savefile.h @@ -7,7 +7,7 @@ #include "z3d/z3DVec.h" // Increment the version number whenever the ExtSaveData structure is changed -#define EXTSAVEDATA_VERSION 14 +#define EXTSAVEDATA_VERSION 15 #define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 #define SAVEFILE_SPOILER_ITEM_MAX 512 @@ -73,20 +73,20 @@ namespace rnd { BitField<29, 1, u64> enOshGivenItem; BitField<30, 1, u64> enGoGivenItem; BitField<31, 1, u64> enBoss02GivenItem; - BitField<32, 1, u64> enGinkoManGivenItem; - BitField<33, 1, u64> enShnGivenItem; - BitField<34, 1, u64> enObjMoonStoneGivenItem; - BitField<35, 1, u64> enTownDeedGivenItem; - BitField<36, 1, u64> enSwampDeedGivenItem; - BitField<37, 1, u64> enMtnDeedGivenItem; - BitField<38, 1, u64> enOcnDeedGivenItem; - BitField<39, 1, u64> bottleMilkGiven; - BitField<40, 1, u64> bottleGoldDustGiven; - BitField<41, 1, u64> bottleSeahorseGiven; - BitField<42, 1, u64> bottleChateuGiven; - BitField<43, 1, u64> bottleMysteryMilkGiven; - BitField<44, 2, u64> progressiveSwordUpgrade; - BitField<45, 18, u64> unused; + BitField<32, 2, u64> enGinkoManGivenItem; + BitField<34, 1, u64> enShnGivenItem; + BitField<35, 1, u64> enObjMoonStoneGivenItem; + BitField<36, 1, u64> enTownDeedGivenItem; + BitField<37, 1, u64> enSwampDeedGivenItem; + BitField<38, 1, u64> enMtnDeedGivenItem; + BitField<39, 1, u64> enOcnDeedGivenItem; + BitField<40, 1, u64> bottleMilkGiven; + BitField<41, 1, u64> bottleGoldDustGiven; + BitField<42, 1, u64> bottleSeahorseGiven; + BitField<43, 1, u64> bottleChateuGiven; + BitField<44, 1, u64> bottleMysteryMilkGiven; + BitField<45, 2, u64> progressiveSwordUpgrade; + BitField<46, 18, u64> unused; }; GivenItemRegister givenItemChecks; union FairyCollectRegister { diff --git a/code/source/rnd/item_override.cpp b/code/source/rnd/item_override.cpp index cd5a6575..facdb86e 100644 --- a/code/source/rnd/item_override.cpp +++ b/code/source/rnd/item_override.cpp @@ -414,6 +414,10 @@ namespace rnd { gExtSaveData.givenItemChecks.enOskGivenItem = 1; } else if (actorId == game::act::Id::EnKitan) { getItemId = incomingNegative ? -0x03 : 0x03; + } else if (actorId == game::act::Id::EnGinkoMan) { + if (gExtSaveData.givenItemChecks.enGinkoManGivenItem == 1) { + getItemId = incomingNegative ? -0x03 : 0x03; + } } return getItemId; @@ -471,12 +475,9 @@ namespace rnd { } else if ((s16)storedGetItemId == -(s16)GetItemID::GI_MASK_GIANTS) { gExtSaveData.givenItemChecks.enBoss02GivenItem = 1; } else if (storedActorId == game::act::Id::EnGinkoMan) { - game::SaveData& saveData = game::GetCommonData().save; if (gExtSaveData.givenItemChecks.enGinkoManGivenItem == 0) { - saveData.anonymous_77 = saveData.anonymous_77 | 8; gExtSaveData.givenItemChecks.enGinkoManGivenItem = 1; } else if (gExtSaveData.givenItemChecks.enGinkoManGivenItem == 1) { - saveData.anonymous_117 = saveData.anonymous_117 | 8; gExtSaveData.givenItemChecks.enGinkoManGivenItem = 2; } } else if (storedActorId == game::act::Id::EnShn) { @@ -563,44 +564,6 @@ namespace rnd { return; } - u16 ItemOverride_SetBottleRefill(u16 refItemId) { - switch (refItemId) { - case 0x60: - if (gExtSaveData.givenItemChecks.bottleMilkGiven == 1) { - storedGetItemId = GetItemID::GI_BOTTLE_MILK_REFILL; - return 0x92; - } - break; - case 0x6A: - if (gExtSaveData.givenItemChecks.bottleGoldDustGiven == 1) { - storedGetItemId = GetItemID::GI_BOTTLE_GOLD_DUST_REFILL; - return 0x93; - } - break; - case 0x6F: - if (gExtSaveData.givenItemChecks.bottleChateuGiven == 1) { - storedGetItemId = GetItemID::GI_BOTTLE_CHATEAU_ROMANI_REFILL; - return 0x91; - } - break; - case 0x6E: - if (gExtSaveData.givenItemChecks.bottleSeahorseGiven == 1) { - storedGetItemId = GetItemID::GI_BOTTLE_SEAHORSE_REFILL; - return 0x95; - } - break; - case 0x70: - if (gExtSaveData.givenItemChecks.bottleMysteryMilkGiven == 0) { - storedGetItemId = GetItemID::GI_BOTTLE_MYSTERY_MILK_REFILL; - return 0x94; - } - break; - default: - return (u16)GetItemID::GI_RUPEE_BLUE; - } - return (u16)refItemId; - } - u8 ItemOverride_SetProgressiveItemDraw(ItemOverride override) { game::SaveData saveData = game::GetCommonData().save; if (override.value.getItemId == 0x12) { // Ice trap @@ -696,11 +659,14 @@ namespace rnd { player->get_item_id = incomingGetItemId; return; } else if (override.key.type == ItemOverride_Type::OVR_CHEST && - gExtSaveData.chestRewarded[override.key.scene][override.key.flag] == 1) { + gExtSaveData.chestRewarded[override.key.scene][override.key.flag] == 1 && + (override.value.getItemId != 0x60 || override.value.getItemId != 0x6A || + (override.value.getItemId < 0x6E && override.value.getItemId > 0x70))) { // Override was already given, check to see if we're a refill item now, if not, give a blue rupee instead. - u16 overrideGetItemId = ItemOverride_SetBottleRefill(override.value.getItemId); - override.value.getItemId = overrideGetItemId; - override.value.looksLikeItemId = overrideGetItemId; + // Only do this for items that are not bottle refills. + // Bottle logic is taken care of in the ItemUpgrade function. + override.value.getItemId = 0x02; + override.value.looksLikeItemId = 0x02; } // This check is mainly to ensure we do not have repeatable progressive items within these base items. @@ -735,15 +701,6 @@ namespace rnd { } } - // If we are a bottled item, store the GID to write the ext data. This will ensure through - // ItemUpgrade_BottleRefill that we get a refill on a bottle instead of a new bottle. - if (override.value.getItemId == 0x60 || override.value.getItemId == 0x6A || - (override.value.getItemId > 0x6D && override.value.getItemId < 0x71)) { - storedGetItemId = (GetItemID) override.value.getItemId; - u16 overrideGetItemId = ItemOverride_SetBottleRefill(override.value.getItemId); - override.value.getItemId = overrideGetItemId; - override.value.looksLikeItemId = overrideGetItemId; - } ItemOverride_Activate(override); s16 baseItemId = rActiveItemRow->baseItemId;