diff --git a/.gitignore b/.gitignore index f73e3bd0..3039bf43 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ ph_*/ *bios.bin /m2ctx *.sav +*.ml* *.xMAP objdiff.json /objdiff-cli diff --git a/config/eur/arm9/overlays/ov000/delinks.txt b/config/eur/arm9/overlays/ov000/delinks.txt index 88530a50..487cf9a2 100644 --- a/config/eur/arm9/overlays/ov000/delinks.txt +++ b/config/eur/arm9/overlays/ov000/delinks.txt @@ -8,3 +8,6 @@ src/000_Second/Actor/Actor.cpp: .text start:0x02098388 end:0x02098654 .data start:0x020b30e4 end:0x020b3148 + +src/000_Second/Item/ItemManager.cpp: + .text start:0x020a865c end:0x020aa224 diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 2f7398b4..2f567142 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -2993,22 +2993,22 @@ func_ov000_020a8524 kind:function(arm,size=0x48) addr:0x020a8524 func_ov000_020a856c kind:function(arm,size=0x50) addr:0x020a856c func_ov000_020a85bc kind:function(thumb,size=0x80) addr:0x020a85bc func_ov000_020a863c kind:function(arm,size=0x20) addr:0x020a863c -func_ov000_020a865c kind:function(arm,size=0x24) addr:0x020a865c +_ZN11ItemManager19func_ov000_020a865cEj kind:function(arm,size=0x24) addr:0x020a865c func_ov000_020a8680 kind:function(arm,size=0x24) addr:0x020a8680 func_ov000_020a86a4 kind:function(arm,size=0x2c) addr:0x020a86a4 -func_ov000_020a86d0 kind:function(arm,size=0x58) addr:0x020a86d0 -func_ov000_020a8728 kind:function(arm,size=0x20) addr:0x020a8728 -func_ov000_020a8748 kind:function(arm,size=0x20) addr:0x020a8748 +_ZN11ItemManager19func_ov000_020a86d0Ej kind:function(arm,size=0x58) addr:0x020a86d0 +_ZN11ItemManager19func_ov000_020a8728Ev kind:function(arm,size=0x20) addr:0x020a8728 +_ZN11ItemManager19func_ov000_020a8748Ev kind:function(arm,size=0x20) addr:0x020a8748 func_ov000_020a8768 kind:function(arm,size=0x60) addr:0x020a8768 -func_ov000_020a87c8 kind:function(arm,size=0x24) addr:0x020a87c8 -func_ov000_020a87ec kind:function(arm,size=0x34) addr:0x020a87ec -func_ov000_020a8820 kind:function(arm,size=0x34) addr:0x020a8820 +_ZN11ItemManager19func_ov000_020a87c8Ei kind:function(arm,size=0x24) addr:0x020a87c8 +_ZN11ItemManager19func_ov000_020a87ecEi kind:function(arm,size=0x34) addr:0x020a87ec +_ZN11ItemManager19func_ov000_020a8820Ei kind:function(arm,size=0x34) addr:0x020a8820 func_ov000_020a8854 kind:function(arm,size=0x38) addr:0x020a8854 -func_ov000_020a888c kind:function(arm,size=0x3c) addr:0x020a888c -func_ov000_020a88c8 kind:function(arm,size=0x2c) addr:0x020a88c8 -func_ov000_020a88f4 kind:function(arm,size=0x2c) addr:0x020a88f4 -func_ov000_020a8920 kind:function(arm,size=0x28) addr:0x020a8920 -func_ov000_020a8948 kind:function(arm,size=0x2c) addr:0x020a8948 +_ZN11ItemManager19func_ov000_020a888cEj kind:function(arm,size=0x3c) addr:0x020a888c +_ZN11ItemManager19func_ov000_020a88c8Ev kind:function(arm,size=0x2c) addr:0x020a88c8 +_ZN11ItemManager19func_ov000_020a88f4Ev kind:function(arm,size=0x2c) addr:0x020a88f4 +_ZN11ItemManager19func_ov000_020a8920Ev kind:function(arm,size=0x28) addr:0x020a8920 +_ZN11ItemManager19func_ov000_020a8948Ev kind:function(arm,size=0x2c) addr:0x020a8948 func_ov000_020a8974 kind:function(arm,size=0x10) addr:0x020a8974 func_ov000_020a8984 kind:function(arm,size=0x38) addr:0x020a8984 func_ov000_020a89bc kind:function(thumb,size=0x18) addr:0x020a89bc @@ -3082,17 +3082,17 @@ func_ov000_020a9b2c kind:function(arm,size=0x10) addr:0x020a9b2c func_ov000_020a9b3c kind:function(arm,size=0x10) addr:0x020a9b3c func_ov000_020a9b4c kind:function(arm,size=0x100) addr:0x020a9b4c func_ov000_020a9c4c kind:function(arm,size=0x18) addr:0x020a9c4c -func_ov000_020a9c64 kind:function(arm,size=0x2c) addr:0x020a9c64 -func_ov000_020a9c90 kind:function(arm,size=0x14) addr:0x020a9c90 -func_ov000_020a9ca4 kind:function(arm,size=0x18) addr:0x020a9ca4 -func_ov000_020a9cbc kind:function(arm,size=0x40) addr:0x020a9cbc +_ZN11ItemManager19func_ov000_020a9c64Ev kind:function(arm,size=0x2c) addr:0x020a9c64 +_ZN11ItemManager19func_ov000_020a9c90Es kind:function(arm,size=0x14) addr:0x020a9c90 +_ZN11ItemManager19func_ov000_020a9ca4Es kind:function(arm,size=0x18) addr:0x020a9ca4 +_ZN11ItemManager19func_ov000_020a9cbcEsi kind:function(arm,size=0x40) addr:0x020a9cbc func_ov000_020a9cfc kind:function(arm,size=0x7c) addr:0x020a9cfc func_ov000_020a9d78 kind:function(arm,size=0x9c) addr:0x020a9d78 func_ov000_020a9e14 kind:function(arm,size=0x9c) addr:0x020a9e14 func_ov000_020a9eb0 kind:function(arm,size=0x9c) addr:0x020a9eb0 func_ov000_020a9f4c kind:function(arm,size=0xe0) addr:0x020a9f4c func_ov000_020aa02c kind:function(arm,size=0x80) addr:0x020aa02c -func_ov000_020aa0ac kind:function(arm,size=0x154) addr:0x020aa0ac +_ZN11ItemManager19func_ov000_020aa0acEj kind:function(arm,size=0x154) addr:0x020aa0ac func_ov000_020aa200 kind:function(arm,size=0x10) addr:0x020aa200 func_ov000_020aa210 kind:function(arm,size=0x14) addr:0x020aa210 func_ov000_020aa224 kind:function(arm,size=0x14) addr:0x020aa224 diff --git a/include/Item/Item.hpp b/include/Item/Item.hpp index 368001dd..ea8696a4 100644 --- a/include/Item/Item.hpp +++ b/include/Item/Item.hpp @@ -1,5 +1,171 @@ #pragma once +#include "flags.h" #include "types.h" +#define MAX_KEYS 8 + +typedef u32 ItemFlag; +enum ItemFlag_ { + ItemFlag_Whirlwind = FLAG(0, 0), + ItemFlag_Boomerang = FLAG(0, 1), + ItemFlag_Whip = FLAG(0, 2), + ItemFlag_Bow = FLAG(0, 3), + ItemFlag_Bombs = FLAG(0, 4), + ItemFlag_SandRod = FLAG(0, 5), + ItemFlag_EQUIP_START = ItemFlag_Whirlwind, + ItemFlag_EQUIP_END = ItemFlag_SandRod + 1, + ItemFlag_EQUIP_COUNT = ItemFlag_EQUIP_END - ItemFlag_EQUIP_START, + + ItemFlag_Shield = FLAG(0, 6), + ItemFlag_Sword = FLAG(0, 7), + ItemFlag_LokomoSword = FLAG(0, 8), + ItemFlag_Soldier = FLAG(0, 9), + ItemFlag_Scroll1 = FLAG(0, 10), + ItemFlag_Scroll2 = FLAG(0, 11), + ItemFlag_AncientShield = FLAG(0, 12), + ItemFlag_PanFlute = FLAG(0, 13), +}; + +typedef u32 ItemId; +enum ItemId_ { + ItemId_None = -1, + ItemId_Nothing = 0, + ItemId_NormalShield = 1, + ItemId_NormalSword = 2, + ItemId_Whirlwind = 3, + ItemId_BombBag = 4, + ItemId_NormalBow = 5, + ItemId_Boomerang = 6, + ItemId_Whip = 7, + ItemId_SandRod = 8, + ItemId_NormalKey = 10, + ItemId_BossKey = 11, + ItemId_GreenRupee = 12, + ItemId_BlueRupee = 13, + ItemId_RedRupee = 14, + ItemId_BigGreenRupee = 15, + ItemId_BigRedRupee = 16, + ItemId_BigGoldRupee = 17, + ItemId_ForceGem13 = 18, // kidnapped papuchia man + ItemId_ForceGem14 = 19, // ice for fish seller + ItemId_ForceGem8 = 20, // goron lava house ice + ItemId_ForestGlyph = 21, + ItemId_SnowGlyph = 22, + ItemId_OceanGlyph = 23, + ItemId_FireGlyph = 24, + ItemId_FinalTrack = 30, // unlocks the endgame portal + ItemId_ForceGemX = 35, // rightmost fire gem + ItemId_ForceGemXx = 36, // right snow gem + ItemId_ForceGemXxx = 37, // top fire gem + ItemId_RecruitUniform = 38, + ItemId_PostmasterLetter = 39, + ItemId_HeartContainer = 40, + ItemId_QuiverMedium = 41, + ItemId_BombBagMedium = 42, + ItemId_ForceGem_43 = 43, // one of rightmost forest + ItemId_ForceGem_44 = 44, // the other rightmost forest, but more middle than top + ItemId_ForceGem_45 = 45, // the bottom-rightmost forest + ItemId_ForceGem_46 = 46, // the top-rightmost fire + ItemId_ForceGem_47 = 47, // the center forest + ItemId_ForceGem_48 = 48, // the middle-left forest + ItemId_ForceGem_49 = 49, // the below middle-left forest + ItemId_ForceGem_50 = 50, + ItemId_ForceGem_51 = 51, + ItemId_ForceGem_52 = 52, + ItemId_ForceGem_53 = 53, + ItemId_ForceGem_54 = 54, + ItemId_ForceGem_55 = 55, + ItemId_ForceGem_56 = 56, + ItemId_ForceGem_57 = 57, + ItemId_ForceGem_58 = 58, + ItemId_ForceGem_59 = 59, + ItemId_ForceGem_60 = 60, + ItemId_ForceGem_61 = 61, + ItemId_PanFlute = 62, + ItemId_StampBook = 63, + ItemId_LightBow = 64, + ItemId_LocomoSword = 65, + ItemId_TenPriceCard = 66, + ItemId_RedPotion = 67, + ItemId_PurplePotion = 68, + ItemId_YellowPotion = 69, + ItemId_DemonFossil = 70, + ItemId_StalfosSkull = 71, + ItemId_StarFragment = 72, + ItemId_BeeLarvae = 73, + ItemId_WoodHeart = 74, + ItemId_DarkPearlLoop = 75, + ItemId_WhitePearlLoop = 76, + ItemId_RutoCrown = 77, + ItemId_DragonScale = 78, + ItemId_PirateNecklace = 79, + ItemId_PalaceDish = 80, + ItemId_GoronAmber = 81, + ItemId_MysticJade = 82, + ItemId_AncientCoin = 83, + ItemId_PricelessStone = 84, + ItemId_RegalRing = 85, + ItemId_ArrowsRefill = 86, + ItemId_BombsRefill = 87, + ItemId_SoldOutSign = 88, + ItemId_AncientShield = 89, + ItemId_QuiverLarge = 90, + ItemId_BombBagLarge = 91, + ItemId_RandCommonTreasure = 92, + ItemId_RandUncommonTreasure = 93, + ItemId_RandRareTreasure = 94, + ItemId_RandLegendaryTreasure = 95, + ItemId_TearLight = 96, + ItemId_LightCompass = 97, + ItemId_SuperSpinScroll = 98, + ItemId_BeamScroll = 99, + ItemId_LinebeckLetter = 100, + ItemId_PanFluteSong_101 = 101, + ItemId_PanFluteSong_102 = 102, + ItemId_PanFluteSong_103 = 103, + ItemId_PanFluteSong_104 = 104, + ItemId_PanFluteSong_105 = 105, + ItemId_RabbitNet = 106, + ItemId_BeedleCard = 107, + ItemId_SilverCard = 108, + ItemId_GoldCard = 109, + ItemId_PlatinumCard = 110, + ItemId_DiamondCard = 111, + ItemId_FreebieCard = 112, + ItemId_QuintupleCard = 113, + ItemId_CarbenLetter = 114, + ItemId_RecruitUniform2 = 115, + ItemId_EngineerUniform = 116, +}; + +#define MAX_TREASURE 99 +typedef s16 TreasureType; +enum TreasureType_ { + TreasureType_None = -1, + TreasureType_DemonFossil = 0, + TreasureType_StalfosSkull = 1, + TreasureType_StarFragment = 2, + TreasureType_BeeLarvae = 3, + TreasureType_WoodHeart = 4, + TreasureType_DarkPearlLoop = 5, + TreasureType_WhitePearlLoop = 6, + TreasureType_RutoCrown = 7, + TreasureType_DragonScale = 8, + TreasureType_PirateNecklace = 9, + TreasureType_PalaceDish = 10, + TreasureType_GoronAmber = 11, + TreasureType_MysticJade = 12, + TreasureType_AncientCoin = 13, + TreasureType_PricelessStone = 14, + TreasureType_RegalRing = 15 +}; + #define MAX_POTIONS 2 +typedef u32 PotionType; +enum PotionType_ { + PotionType_None = 0, + PotionType_Red = 1, + PotionType_Purple = 2, // auto revives when you die + PotionType_Yellow = 3, +}; diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index a81f9bac..0e578358 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -8,24 +8,42 @@ class ItemManager : public SysObject { public: /* 00 */ unk32 mEquippedItem; /* 04 */ unk32 mForcedItem; - /* 08 */ unk16 mUnk_08; // inventory items bitfield - /* 0a */ unk16 mUnk_0a; // collection/equipment bitfield - /* 0c */ unk32 mUnk_0c; + /* 08 */ u32 mUnk_08[2]; // inventory items bitfield & collection/equipment bitfield /* 10 */ unk16 mNumRupees; /* 12 */ unk16 mUnk_12; // "toggle bitfield" /* 14 */ unk16 mItemRestrictions; // bitfield /* 16 */ unk8 mTearsAmount; // number of tears of light - /* 17 */ unk8 mKeyAmount; // number of small keys - /* 18 */ unk8 mQuiverCapacity; - /* 19 */ unk8 mBombBagCapacity; - /* 1a */ unk8 mArrowAmount; - /* 1b */ unk8 mBombAmount; - /* 1c */ unk8 mPotions[MAX_POTIONS]; + /* 17 */ u8 mKeyAmount; // number of small keys + /* 18 */ u8 mQuiverCapacity; + /* 19 */ u8 mBombBagCapacity; + /* 1a */ u8 mArrowAmount; + /* 1b */ u8 mBombAmount; + /* 1c */ u8 mPotions[MAX_POTIONS]; /* 1e */ unk16 mUnk_1e; /* 20 */ unk32 *mUnk_20; /* 24 */ unk32 mUnk_24; - /* 28 */ + /* 28 */ unk8 mUnk_28[0x3C - 0x28]; + /* 3c */ TreasureType mUnk_3c[16]; // treasures + /* 5c */ ItemManager(); ~ItemManager(); + + void func_ov000_020a865c(u32 bitIdx); + u32 func_ov000_020a86d0(ItemFlag itemFlag); + u8 func_ov000_020a8728(); + u8 func_ov000_020a8748(); + void func_ov000_020a87c8(s32 amount); + void func_ov000_020a87ec(s32 amount); + void func_ov000_020a8820(s32 amount); + void func_ov000_020a888c(PotionType type); + bool func_ov000_020a88c8(); + bool func_ov000_020a88f4(); + void func_ov000_020a8920(); + bool func_ov000_020a8948(); + bool func_ov000_020a9c64(); + unk32 func_ov000_020a9c90(TreasureType type); + bool func_ov000_020a9ca4(TreasureType type); + void func_ov000_020a9cbc(TreasureType type, s32 amount); + void func_ov000_020aa0ac(ItemId itemId); }; diff --git a/include/flags.h b/include/flags.h new file mode 100644 index 00000000..de9a4114 --- /dev/null +++ b/include/flags.h @@ -0,0 +1,16 @@ +#pragma once + +#include "types.h" + +/** + * Flags value format: + * - 0x001F: 0000 0000 0001 1111 -> the shift value to read or write the flag's bit + * - 0xFFE0: 1111 1111 1110 0000 -> index of the value in the array + * + * `FLAG` is a macro that allows you to get the final value from the index and the slot number. + */ + +#define GET_FLAG(arr, pos) (((arr)[((u32) (pos)) >> 5] & (1 << ((pos) & 0x1F))) != 0) +#define SET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] |= 1 << ((pos) & 0x1F)) +#define UNSET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] &= ~(1 << ((pos) & 0x1F))) +#define FLAG(index, pos) (((index) << 5) | ((pos) & 0x1F)) diff --git a/include/global.h b/include/global.h index 7171d4ec..bfff0961 100644 --- a/include/global.h +++ b/include/global.h @@ -1,10 +1,6 @@ #ifndef GLOBAL_H #define GLOBAL_H -#define GET_FLAG(arr, pos) (((1 << ((pos) & 0x1f)) & (arr)[((u32) (pos)) >> 5]) != 0) -#define SET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] |= 1 << ((pos) & 0x1f)) -#define RESET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] &= ~(1 << ((pos) & 0x1f))) - #define ARRAY_LEN_U(arr) (u32)((sizeof(arr) / sizeof(*arr))) #define ARRAY_LEN(arr) (s32)((sizeof(arr) / sizeof(*arr))) @@ -22,8 +18,4 @@ #pragma define_section sbss ".data" \ ".sbss" -// Force variables to be in .data by using #pragma section force_data begin|end -#pragma define_section force_data ".data" \ - ".data" - #endif diff --git a/src/000_Second/Item/ItemManager.cpp b/src/000_Second/Item/ItemManager.cpp new file mode 100644 index 00000000..875005cc --- /dev/null +++ b/src/000_Second/Item/ItemManager.cpp @@ -0,0 +1,246 @@ +#include "Item/ItemManager.hpp" +#include "global.h" + +// quiver and bomb bag tiers +extern u8 data_ov000_020afc40[3]; +extern u8 data_ov000_020afc43[3]; + +// removeEquipmentItem +ARM void ItemManager::func_ov000_020a865c(u32 bitIdx) { + UNSET_FLAG(this->mUnk_08, bitIdx); +} + +// getItemAmmo +ARM u32 ItemManager::func_ov000_020a86d0(ItemFlag itemFlag) { + bool canUse = GET_FLAG(this->mUnk_08, itemFlag); + + switch (itemFlag) { + case ItemFlag_Bow: + return canUse ? this->mArrowAmount : 0; + case ItemFlag_Bombs: + return canUse ? this->mBombAmount : 0; + default: + break; + } + + return canUse; +} + +// getMaxArrows +ARM u8 ItemManager::func_ov000_020a8728() { + if (GET_FLAG(this->mUnk_08, ItemFlag_Bow) == 0) { + return 0; + } + + return data_ov000_020afc40[this->mQuiverCapacity]; +} + +// getMaxBombs +ARM u8 ItemManager::func_ov000_020a8748() { + if (GET_FLAG(this->mUnk_08, ItemFlag_Bombs) == 0) { + return 0; + } + + return data_ov000_020afc43[this->mBombBagCapacity]; +} + +// addKeys +ARM void ItemManager::func_ov000_020a87c8(s32 amount) { + s32 newAmount = this->mKeyAmount + amount; + + if (newAmount > MAX_KEYS) { + newAmount = MAX_KEYS; + } else if (newAmount < 0) { + newAmount = 0; + } + + this->mKeyAmount = newAmount; +} + +// gainArrows +ARM void ItemManager::func_ov000_020a87ec(s32 amount) { + s32 maxArrows = this->func_ov000_020a8728(); + s32 newAmount = this->mArrowAmount + amount; + + if (newAmount > maxArrows) { + newAmount = maxArrows; + } else if (newAmount < 0) { + newAmount = 0; + } + + this->mArrowAmount = newAmount; +} + +// gainBombs +ARM void ItemManager::func_ov000_020a8820(s32 amount) { + s32 maxBombs = this->func_ov000_020a8748(); + s32 newAmount = this->mBombAmount + amount; + + if (newAmount > maxBombs) { + newAmount = maxBombs; + } else if (newAmount < 0) { + newAmount = 0; + } + + this->mBombAmount = newAmount; +} + +// gainPotion +ARM void ItemManager::func_ov000_020a888c(PotionType type) { + switch (type) { + case PotionType_Red: + case PotionType_Purple: + case PotionType_Yellow: + for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) { + if (this->mPotions[i] == PotionType_None) { + this->mPotions[i] = type; + break; + } + } + break; + default: + break; + } +} + +// hasPotion +ARM bool ItemManager::func_ov000_020a88c8() { + for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) { + if (this->mPotions[i] != PotionType_None) { + return true; + } + } + + return false; +} + +// hasPurplePotion +ARM bool ItemManager::func_ov000_020a88f4() { + for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) { + if (this->mPotions[i] == PotionType_Purple) { + return true; + } + } + + return false; +} + +// removePurplePotion +ARM void ItemManager::func_ov000_020a8920() { + for (s32 i = ARRAY_LEN(this->mPotions) - 1; i >= 0; i--) { + if (this->mPotions[i] == PotionType_Purple) { + this->mPotions[i] = PotionType_None; + return; + } + } +} + +// potionInventoryFull +ARM bool ItemManager::func_ov000_020a8948() { + for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) { + if (this->mPotions[i] == PotionType_None) { + return false; + } + } + return true; +} + +// hasAnyTreasure +ARM bool ItemManager::func_ov000_020a9c64() { + for (s32 i = 0; i < ARRAY_LEN(this->mUnk_3c); i++) { + if (this->mUnk_3c[i] >= 0) { + return true; + } + } + + return false; +} + +// getTreasureAmount +ARM unk32 ItemManager::func_ov000_020a9c90(TreasureType type) { + if (this->mUnk_3c[type] >= 0) { + return this->mUnk_3c[type]; + } + + return 0; +} + +// isTreasureAmountMaxed +ARM bool ItemManager::func_ov000_020a9ca4(TreasureType type) { + return this->func_ov000_020a9c90(type) >= MAX_TREASURE; +} + +// gainTreasure +ARM void ItemManager::func_ov000_020a9cbc(TreasureType type, s32 amount) { + s32 newAmount; + + if (this->mUnk_3c[type] < 0) { + this->mUnk_3c[type] = 0; + } + + newAmount = this->mUnk_3c[type] + amount; + + if (newAmount > MAX_TREASURE) { + newAmount = MAX_TREASURE; + } else if (newAmount < 0) { + newAmount = 0; + } + + this->mUnk_3c[type] = newAmount; +} + +// gainTreasureFromItem +ARM void ItemManager::func_ov000_020aa0ac(ItemId itemId) { + switch (itemId) { + case ItemId_DemonFossil: + this->func_ov000_020a9cbc(TreasureType_DemonFossil, 1); + break; + case ItemId_StalfosSkull: + this->func_ov000_020a9cbc(TreasureType_StalfosSkull, 1); + break; + case ItemId_StarFragment: + this->func_ov000_020a9cbc(TreasureType_StarFragment, 1); + break; + case ItemId_BeeLarvae: + this->func_ov000_020a9cbc(TreasureType_BeeLarvae, 1); + break; + case ItemId_WoodHeart: + this->func_ov000_020a9cbc(TreasureType_WoodHeart, 1); + break; + case ItemId_DarkPearlLoop: + this->func_ov000_020a9cbc(TreasureType_DarkPearlLoop, 1); + break; + case ItemId_WhitePearlLoop: + this->func_ov000_020a9cbc(TreasureType_WhitePearlLoop, 1); + break; + case ItemId_RutoCrown: + this->func_ov000_020a9cbc(TreasureType_RutoCrown, 1); + break; + case ItemId_DragonScale: + this->func_ov000_020a9cbc(TreasureType_DragonScale, 1); + break; + case ItemId_PirateNecklace: + this->func_ov000_020a9cbc(TreasureType_PirateNecklace, 1); + break; + case ItemId_PalaceDish: + this->func_ov000_020a9cbc(TreasureType_PalaceDish, 1); + break; + case ItemId_GoronAmber: + this->func_ov000_020a9cbc(TreasureType_GoronAmber, 1); + break; + case ItemId_MysticJade: + this->func_ov000_020a9cbc(TreasureType_MysticJade, 1); + break; + case ItemId_AncientCoin: + this->func_ov000_020a9cbc(TreasureType_AncientCoin, 1); + break; + case ItemId_PricelessStone: + this->func_ov000_020a9cbc(TreasureType_PricelessStone, 1); + break; + case ItemId_RegalRing: + this->func_ov000_020a9cbc(TreasureType_RegalRing, 1); + break; + default: + break; + } +}