From e6257e902b7a31d80562dab5f22c612bbbb5bc6c Mon Sep 17 00:00:00 2001 From: Aetias Date: Wed, 20 Dec 2023 10:44:33 +0100 Subject: [PATCH] Update `Inventory` struct --- include/Actors/Navi/Navi.hpp | 3 + include/Inventory.hpp | 234 ++++++++++++++++++++++++++++------- include/types.h | 30 +++-- src/Inventory.cpp | 2 +- 4 files changed, 211 insertions(+), 58 deletions(-) create mode 100644 include/Actors/Navi/Navi.hpp diff --git a/include/Actors/Navi/Navi.hpp b/include/Actors/Navi/Navi.hpp new file mode 100644 index 00000000..b7c733ee --- /dev/null +++ b/include/Actors/Navi/Navi.hpp @@ -0,0 +1,3 @@ +#pragma once + +class Navi; diff --git a/include/Inventory.hpp b/include/Inventory.hpp index 82cc953d..18a65369 100644 --- a/include/Inventory.hpp +++ b/include/Inventory.hpp @@ -2,63 +2,207 @@ #include "types.h" #include "SysNew.hpp" - -typedef u32 EquipItem; -enum EquipItem_ { - EquipItem_None = -1, - EquipItem_Boomerang = 2, - EquipItem_Shovel = 3, - EquipItem_Bomb = 4, - EquipItem_Bow = 5, - EquipItem_GrapplingHook = 6, - EquipItem_Bombchu = 7, - EquipItem_Hammer = 8, - EquipItem_COUNT = 11, -}; - -enum ItemId { - +#include "Player/EquipItem.hpp" +#include "Actors/Navi/Navi.hpp" + +typedef u32 FairyId; +enum FairyId_ { + FairyId_None = -1, + FairyId_Courage = 0, + FairyId_Power = 1, + FairyId_Wisdom = 2, +}; + +enum Gem { + Gem_Courage, + Gem_Power, + Gem_Wisdom, + Gem_COUNT, +}; + +typedef u32 ShipPart; +enum ShipPart_ { + ShipPart_Anchor, + ShipPart_Prow, + ShipPart_Hull, + ShipPart_Cannon, + ShipPart_Handrail, + ShipPart_Wheel, + ShipPart_Chimney, + ShipPart_Bridge, + ShipPart_COUNT, +}; + +typedef u32 ShipType; +enum ShipType_ { + ShipType_Linebeck, + ShipType_Bright, + ShipType_Iron, + ShipType_Stone, + ShipType_Vintage, + ShipType_Demon, + ShipType_Tropical, + ShipType_Dignified, + ShipType_Golden, + ShipType_COUNT, +}; + +typedef u32 ShipItem; +#define SHIP_ITEM(part, ship) (ShipPart_ ## part * ShipPart_COUNT + ShipType_ ## type) +#define ShipItem_COUNT (ShipPart_COUNT * ShipType_COUNT) + +typedef u32 Treasure; +enum Treasure_ { + Treasure_PinkCoral, + Treasure_WhitePearlLoop, + Treasure_DarkPearlLoop, + Treasure_ZoraScale, + Treasure_GoronAmber, + Treasure_RutoCrown, + Treasure_HelmarocPlume, + Treasure_RegalRing, + + Treasure_COUNT, +}; + +#define NUM_POTIONS 2 +typedef u8 Potion; +enum Potion_ { + Potion_None, + Potion_Red, + Potion_Blue, + Potion_Yellow, + Potion_COUNT, +}; + +typedef u32 ItemFlag; +enum ItemFlag_ { + ItemFlag_None = -1, + ItemFlag_OshusSword = 0, + ItemFlag_WoodenShield = 1, + ItemFlag_Boomerang = 2, + ItemFlag_Shovel = 3, + ItemFlag_BombBag = 4, + ItemFlag_Bow = 5, + ItemFlag_GrapplingHook = 6, + ItemFlag_BombchuBag = 7, + ItemFlag_Hammer = 8, + ItemFlag_PotionA = 9, + ItemFlag_PotionB = 10, + ItemFlag_EQUIP_START = ItemFlag_OshusSword, + ItemFlag_EQUIP_END = ItemFlag_PotionB + 1, + ItemFlag_EQUIP_COUNT = ItemFlag_EQUIP_END - ItemFlag_EQUIP_START, + + ItemFlag_SpiritOfCourage = 20, + ItemFlag_SpiritOfPower = 21, + ItemFlag_SpiritOfWisdom = 22, + ItemFlag_CourageLv1 = 23, + ItemFlag_PowerLv1 = 24, + ItemFlag_WisdomLv1 = 25, + ItemFlag_CourageLv2 = 26, + ItemFlag_PowerLv2 = 27, + ItemFlag_WisdomLv2 = 28, + + ItemFlag_Hourglass = 32, + ItemFlag_SeaChartSW = 33, + ItemFlag_SeaChartNW = 34, + ItemFlag_SeaChartSE = 35, + ItemFlag_SeaChartNE = 36, + ItemFlag_PhantomSword = 37, + ItemFlag_SunKey = 38, + + ItemFlag_KingsKey = 42, + ItemFlag_GhostKey = 43, + + ItemFlag_SwordsmansScroll = 45, + + ItemFlag_COUNT = 128, +}; + +struct ItemFlags { + /* 00 */ u32 flags[CEIL_DIV(ItemFlag_COUNT, 32)]; + /* 10 */ +}; + +struct ShipPartPricesShown { + /* 0 */ u32 flags[CEIL_DIV(ShipItem_COUNT, 32)]; + /* c */ +}; + +struct ShipParts { + /* 0 */ u8 parts[ShipType_COUNT]; + /* 9 */ +}; + +struct SaveInventory { + /* 00 */ ItemFlags itemFlags; + /* 10 */ u32 salvagedTreasureFlags; + /* 14 */ ShipPartPricesShown shipPartPricesShown; + /* 20 */ u32 treasurePriceShownFlags[CEIL_DIV(Treasure_COUNT, 32)]; + /* 24 */ u8 equippedShipParts[ShipPart_COUNT]; + /* 2c */ ShipParts shipParts[ShipPart_COUNT]; + /* 74 */ s8 treasure[Treasure_COUNT]; + /* 7c */ unk8 unk_7c[4]; + /* 80 */ u16 hourglassSeconds; + /* 82 */ unk16 unk_82[6]; + /* 8e */ u16 numRupees; + /* 90 */ unk8 unk_90; + /* 91 */ unk8 unk_91; + /* 92 */ unk8 unk_92; + /* 93 */ u8 numBombs; + /* 94 */ u8 numBombchus; + /* 95 */ u8 numArrows; + /* 96 */ u8 equippedItem; + /* 97 */ Potion potions[NUM_POTIONS]; + /* 99 */ u8 numGems[Gem_COUNT]; + /* 9c */ u8 quiverSize; + /* 9d */ u8 bombBagSize; + /* 9e */ u8 bombchuBagSize; + /* 9f */ unk8 unk_9f[6]; + /* a5 */ u8 equippedFairy; + /* a6 */ }; class Inventory : public SysObject { private: - /* 000 */ EquipItem mEquippedItem; - /* 004 */ EquipItem mPrevEquippedItem; - /* 008 */ u32 mUnk_008; - /* 00c */ u32 mUnk_00c; - /* 010 */ u32 mUnk_010; - /* 014 */ void *mUnk_014; - /* 018 */ void *mUnk_018; - /* 01c */ void *mUnk_01c; + /* 000 */ ItemFlag mEquippedItem; + /* 004 */ ItemFlag mPrevEquippedItem; + /* 008 */ ItemFlag mForcedItem; // game crashes when any item besides this one is equipped + /* 00c */ u32 mHourglassSandFrames; + /* 010 */ FairyId mEquippedFairy; + /* 014 */ Navi *mNaviCourage; + /* 018 */ Navi *mNaviPower; + /* 01c */ Navi *mNaviWisdom; /* 020 */ u16 mEquipLoadTimer; /* 022 */ u16 mNumRupees; - /* 024 */ u8 mNumCourageGems; - /* 025 */ u8 mNumPowerGems; - /* 026 */ u8 mNumWisdomGems; - /* 027 */ u8 mUnk_027; - /* 028 */ u8 mUnk_028[0x20]; - /* 048 */ s32 mUnk_048[0x14]; - /* 098 */ s32 mUnk_098; - /* 09c */ s32 mUnk_09c; - /* 0a0 */ s32 mUnk_0a0; - /* 0a4 */ s32 mUnk_0a4; - /* 0a8 */ s32 mUnk_0a8; - /* 0ac */ void *(*mItemInfo)[EquipItem_COUNT]; - /* 0b0 */ u16 (*mAmmo)[EquipItem_COUNT]; + /* 024 */ u8 mNumGems[Gem_COUNT]; + /* 027 */ unk8 mUnk_027; // padding? + /* 028 */ ShipType mEquippedShipParts[ShipPart_COUNT]; + /* 048 */ ShipParts mShipParts[ShipPart_COUNT]; + /* 090 */ s8 mTreasure[Treasure_COUNT]; + /* 098 */ u8 mUnk_098[6]; + /* 09e */ u16 mUnk_09e[6]; // corresponds with mUnk_098 + /* 0a6 */ unk16 mUnk_0a6; // padding? + /* 0ac */ EquipItem *(*mEquipItems)[ItemFlag_EQUIP_COUNT]; + /* 0b0 */ u16 (*mAmmo)[ItemFlag_EQUIP_COUNT]; /* 0b4 */ u16 mQuiverSize; /* 0b6 */ u16 mBombBagSize; /* 0b8 */ u16 mBombchuBagSize; - /* 0ba */ u16 mUnk_0ba; - /* 0bc */ u8 mUnk_0bc[4]; - /* 0c0 */ void *mUnk_0c0[16]; - /* 100 */ s32 mUnk_100[5]; + /* 0ba */ unk16 mUnk_0ba; // only between 0 and 9 + /* 0bc */ Potion mPotions[2]; + /* 0be */ unk8 mUnk_0be[2]; // padding? + /* 0c0 */ void *mIslandData[16]; + /* 100 */ void *mDungeonData[5]; // non-null in dungeons/caves, similar struct to mIslandData /* 114 */ void *mUnk_114; - /* 118 */ s32 mUnk_118; - /* 11c */ s32 mUnk_11c; + /* 118 */ unk32 mUnk_118; + /* 11c */ unk32 mUnk_11c; /* 120 */ void *mUnk_120; /* 124 */ void *mUnk_124; - /* 128 */ u32 mItemFlags[4]; // Todo (aetias): Set this to ceil(ItemId::COUNT / 32) - /* 138 */ u8 mUnk_138[0x18]; + /* 128 */ ItemFlags mItemFlags; + /* 138 */ u32 mSalvagedTreasureFlags; + /* 13c */ ShipPartPricesShown mShipPartPricesShown; + /* 148 */ u32 mTreasurePriceShownFlags[CEIL_DIV(Treasure_COUNT, 32)]; + /* 14c */ unk8 mUnk_14c[0x4]; /* 150 */ public: diff --git a/include/types.h b/include/types.h index 02c19d7d..af5cda8c 100644 --- a/include/types.h +++ b/include/types.h @@ -1,12 +1,18 @@ -#ifndef PH_TYPES_H -#define PH_TYPES_H - -typedef unsigned int u32; -typedef unsigned short u16; -typedef unsigned char u8; - -typedef int s32; -typedef short s16; -typedef char s8; - -#endif +#ifndef PH_TYPES_H +#define PH_TYPES_H + +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; + +typedef int s32; +typedef short s16; +typedef char s8; + +typedef u8 unk8; +typedef u16 unk16; +typedef u32 unk32; + +#define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) + +#endif diff --git a/src/Inventory.cpp b/src/Inventory.cpp index 6708de0f..003f6cfb 100644 --- a/src/Inventory.cpp +++ b/src/Inventory.cpp @@ -15,7 +15,7 @@ void Inventory::Destroy() { #pragma interworking on void Inventory::ClearPrevEquippedItem() { - this->mPrevEquippedItem = EquipItem_None; + this->mPrevEquippedItem = ItemFlag_None; } #pragma interworking off