summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAetias <aetias@outlook.com>2023-12-20 10:44:33 +0100
committerAetias <aetias@outlook.com>2023-12-20 10:44:33 +0100
commite6257e902b7a31d80562dab5f22c612bbbb5bc6c (patch)
tree6ef6b181fe0e478012726bb9c095819c46bc938b /include
parente5d545a7da96b68cab00c17ba7d8a32bc6cb016c (diff)
Update `Inventory` struct
Diffstat (limited to 'include')
-rw-r--r--include/Actors/Navi/Navi.hpp3
-rw-r--r--include/Inventory.hpp234
-rw-r--r--include/types.h30
3 files changed, 210 insertions, 57 deletions
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