diff --git a/asm/global.inc b/asm/global.inc index ea22d87e..37a2819b 100644 --- a/asm/global.inc +++ b/asm/global.inc @@ -264286,7 +264286,7 @@ .extern _ZN9Inventory7DestroyEv .extern func_ov00_020ad0ce .extern _ZN9Inventory21ClearPrevEquippedItemEv -.extern func_ov00_020ad0e4 +.extern _ZN9Inventory4SaveEP13SaveInventory .extern func_ov00_020ad104 .extern func_ov00_020ad160 .extern func_ov00_020ad17e diff --git a/asm/ov00/include/ov00_020b4940.inc b/asm/ov00/include/ov00_020b4940.inc index 0e2a55ac..e00d5c0e 100644 --- a/asm/ov00/include/ov00_020b4940.inc +++ b/asm/ov00/include/ov00_020b4940.inc @@ -189,7 +189,7 @@ .extern _ZN9SysObjectdlEPv .extern func_ov00_020b3ea8 .extern func_020078d8 -.extern func_ov00_020ad0e4 +.extern _ZN9Inventory4SaveEP13SaveInventory .extern gInventory .extern func_ov00_020ad8e0 .extern gInventory diff --git a/asm/ov00/inventory/Inventory_Save.inc b/asm/ov00/inventory/Inventory_Save.inc new file mode 100644 index 00000000..70be19b4 --- /dev/null +++ b/asm/ov00/inventory/Inventory_Save.inc @@ -0,0 +1,181 @@ + push {r3, r4, r5, r6, r7, lr} + add r7, r0, #0 + mov r0, #0x4a + add r4, r1, #0 + lsl r0, r0, #2 + add r3, r7, r0 + add r2, r4, #0 + ldmia r3!, {r0, r1} + stmia r2!, {r0, r1} + ldmia r3!, {r0, r1} + stmia r2!, {r0, r1} + add r0, r4, #0 + ldrh r1, [r7, #0x22] + add r0, #0x8e + mov r2, #0 + strh r1, [r0] +_020ad104: + add r0, r7, r2 + add r0, #0xbc + ldrb r1, [r0] + add r0, r4, r2 + add r0, #0x97 + add r2, r2, #1 + strb r1, [r0] + cmp r2, #2 + blt _020ad104 + add r0, r7, #0 + add r0, #0xb0 + ldr r0, [r0, #0] + ldrh r1, [r0, #8] + add r0, r4, #0 + add r0, #0x93 + strb r1, [r0, #0] + add r0, r7, #0 + add r0, #0xb0 + ldr r0, [r0, #0] + ldrh r1, [r0, #0xe] + add r0, r4, #0 + add r0, #0x94 + strb r1, [r0] + add r0, r7, #0 + add r0, #0xb0 + ldr r0, [r0, #0] + ldrh r1, [r0, #0xa] + add r0, r4, #0 + add r0, #0x95 + strb r1, [r0] + add r0, r4, #0 + ldr r1, [r7, #0] + add r0, #0x96 + strb r1, [r0] + mov r0, #0x4e + lsl r0, r0, #2 + ldr r0, [r7, r0] + mov r1, #0x3c + str r0, [r4, #0x10] + ldr r0, [r7, #0xc] + bl FastDivide + add r1, r4, #0 + add r1, #0x80 + strh r0, [r1] + mov r2, #0 +_020ad160: + add r0, r7, r2 + add r0, #0x24 + ldrb r1, [r0] + add r0, r4, r2 + add r0, #0x99 + add r2, r2, #1 + strb r1, [r0] + cmp r2, #3 + blt _020ad160 + mov r0, #0 + mov ip, r0 + str r7, [sp] + add r3, r7, #0 + add r5, r4, #0 + mov r6, #0x48 +_020ad17e: + ldr r0, [sp] + mov r2, #0 + ldr r1, [r0, #0x28] + mov r0, ip + add r0, r4, r0 + add r0, #0x24 + strb r1, [r0] +_020ad18c: + add r0, r3, r2 + ldrsb r1, [r0, r6] + add r0, r5, r2 + add r0, #0x2c + add r2, r2, #1 + strb r1, [r0] + cmp r2, #9 + blt _020ad18c + ldr r0, [sp] + add r3, #9 + add r0, r0, #4 + str r0, [sp] + mov r0, ip + add r0, r0, #1 + add r5, #9 + mov ip, r0 + cmp r0, #8 + blt _020ad17e + mov r0, #0x4f + lsl r0, r0, #2 + add r3, r7, r0 + add r2, r4, #0 + ldmia r3!, {r0, r1} + add r2, #0x14 + stmia r2!, {r0, r1} + ldr r0, [r3, #0] + mov r3, #0 + str r0, [r2] + mov r0, #0x90 +_020ad1c6: + add r1, r7, r3 + ldrsb r2, [r1, r0] + add r1, r4, r3 + add r1, #0x74 + add r3, r3, #1 + strb r2, [r1] + cmp r3, #8 + blt _020ad1c6 + mov r0, #0x52 + lsl r0, r0, #2 + ldr r0, [r7, r0] + add r1, r7, #0 + str r0, [r4, #0x20] + mov r0, #0 + add r2, r4, #0 +_020ad1e4: + add r3, r7, r0 + add r3, #0x98 + ldrb r5, [r3] + add r3, r4, r0 + add r3, #0x9f + strb r5, [r3] + add r3, r1, #0 + add r3, #0x9e + ldrh r5, [r3] + add r3, r2, #0 + add r3, #0x82 + add r0, r0, #1 + strh r5, [r3] + add r1, r1, #2 + add r2, r2, #2 + cmp r0, #6 + blt _020ad1e4 + add r0, r7, #0 + add r0, #0xb4 + ldrh r1, [r0] + add r0, r4, #0 + add r0, #0x9c + strb r1, [r0] + add r0, r7, #0 + add r0, #0xb6 + ldrh r1, [r0] + add r0, r4, #0 + add r0, #0x9d + strb r1, [r0] + add r0, r7, #0 + add r0, #0xb8 + ldrh r1, [r0] + add r0, r4, #0 + add r0, #0x9e + strb r1, [r0] + mov r0, #0 + ldr r1, [r7, #0x10] + mvn r0, r0 + cmp r1, r0 + bne _020ad23c + mov r0, #3 + add r4, #0xa5 + strb r0, [r4] + pop {r3, r4, r5, r6, r7, pc} +_020ad23c: + add r4, #0xa5 + strb r1, [r4] + pop {r3, r4, r5, r6, r7, pc} diff --git a/asm/ov00/inventory.s b/asm/ov00/inventory/inventory.s similarity index 95% rename from asm/ov00/inventory.s rename to asm/ov00/inventory/inventory.s index 3fa4afec..88ea8ab8 100644 --- a/asm/ov00/inventory.s +++ b/asm/ov00/inventory/inventory.s @@ -3,193 +3,6 @@ .text - .global func_ov00_020ad0e4 - thumb_func_start func_ov00_020ad0e4 -func_ov00_020ad0e4: ; 0x020ad0e4 - push {r3, r4, r5, r6, r7, lr} - add r7, r0, #0 - mov r0, #0x4a - add r4, r1, #0 - lsl r0, r0, #2 - add r3, r7, r0 - add r2, r4, #0 - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - add r0, r4, #0 - ldrh r1, [r7, #0x22] - add r0, #0x8e - mov r2, #0 - strh r1, [r0] -_020ad104: - add r0, r7, r2 - add r0, #0xbc - ldrb r1, [r0] - add r0, r4, r2 - add r0, #0x97 - add r2, r2, #1 - strb r1, [r0] - cmp r2, #2 - blt _020ad104 - add r0, r7, #0 - add r0, #0xb0 - ldr r0, [r0] - ldrh r1, [r0, #8] - add r0, r4, #0 - add r0, #0x93 - strb r1, [r0] - add r0, r7, #0 - add r0, #0xb0 - ldr r0, [r0] - ldrh r1, [r0, #0xe] - add r0, r4, #0 - add r0, #0x94 - strb r1, [r0] - add r0, r7, #0 - add r0, #0xb0 - ldr r0, [r0] - ldrh r1, [r0, #0xa] - add r0, r4, #0 - add r0, #0x95 - strb r1, [r0] - add r0, r4, #0 - ldr r1, [r7] - add r0, #0x96 - strb r1, [r0] - mov r0, #0x4e - lsl r0, r0, #2 - ldr r0, [r7, r0] - mov r1, #0x3c - str r0, [r4, #0x10] - ldr r0, [r7, #0xc] - blx func_02002e20 - add r1, r4, #0 - add r1, #0x80 - strh r0, [r1] - mov r2, #0 -_020ad160: - add r0, r7, r2 - add r0, #0x24 - ldrb r1, [r0] - add r0, r4, r2 - add r0, #0x99 - add r2, r2, #1 - strb r1, [r0] - cmp r2, #3 - blt _020ad160 - mov r0, #0 - mov ip, r0 - str r7, [sp] - add r3, r7, #0 - add r5, r4, #0 - mov r6, #0x48 -_020ad17e: - ldr r0, [sp] - mov r2, #0 - ldr r1, [r0, #0x28] - mov r0, ip - add r0, r4, r0 - add r0, #0x24 - strb r1, [r0] -_020ad18c: - add r0, r3, r2 - ldrsb r1, [r0, r6] - add r0, r5, r2 - add r0, #0x2c - add r2, r2, #1 - strb r1, [r0] - cmp r2, #9 - blt _020ad18c - ldr r0, [sp] - add r3, #9 - add r0, r0, #4 - str r0, [sp] - mov r0, ip - add r0, r0, #1 - add r5, #9 - mov ip, r0 - cmp r0, #8 - blt _020ad17e - mov r0, #0x4f - lsl r0, r0, #2 - add r3, r7, r0 - add r2, r4, #0 - ldmia r3!, {r0, r1} - add r2, #0x14 - stmia r2!, {r0, r1} - ldr r0, [r3] - mov r3, #0 - str r0, [r2] - mov r0, #0x90 -_020ad1c6: - add r1, r7, r3 - ldrsb r2, [r1, r0] - add r1, r4, r3 - add r1, #0x74 - add r3, r3, #1 - strb r2, [r1] - cmp r3, #8 - blt _020ad1c6 - mov r0, #0x52 - lsl r0, r0, #2 - ldr r0, [r7, r0] - add r1, r7, #0 - str r0, [r4, #0x20] - mov r0, #0 - add r2, r4, #0 -_020ad1e4: - add r3, r7, r0 - add r3, #0x98 - ldrb r5, [r3] - add r3, r4, r0 - add r3, #0x9f - strb r5, [r3] - add r3, r1, #0 - add r3, #0x9e - ldrh r5, [r3] - add r3, r2, #0 - add r3, #0x82 - add r0, r0, #1 - strh r5, [r3] - add r1, r1, #2 - add r2, r2, #2 - cmp r0, #6 - blt _020ad1e4 - add r0, r7, #0 - add r0, #0xb4 - ldrh r1, [r0] - add r0, r4, #0 - add r0, #0x9c - strb r1, [r0] - add r0, r7, #0 - add r0, #0xb6 - ldrh r1, [r0] - add r0, r4, #0 - add r0, #0x9d - strb r1, [r0] - add r0, r7, #0 - add r0, #0xb8 - ldrh r1, [r0] - add r0, r4, #0 - add r0, #0x9e - strb r1, [r0] - mov r0, #0 - ldr r1, [r7, #0x10] - mvn r0, r0 - cmp r1, r0 - bne _020ad23c - mov r0, #3 - add r4, #0xa5 - strb r0, [r4] - pop {r3, r4, r5, r6, r7, pc} -_020ad23c: - add r4, #0xa5 - strb r1, [r4] - pop {r3, r4, r5, r6, r7, pc} - .align 2, 0 - thumb_func_end func_ov00_020ad0e4 - .global func_ov00_020ad244 thumb_func_start func_ov00_020ad244 func_ov00_020ad244: ; 0x020ad244 diff --git a/asm/ov00/ov00_020b4940.s b/asm/ov00/ov00_020b4940.s index 3e76af01..1d299e16 100644 --- a/asm/ov00/ov00_020b4940.s +++ b/asm/ov00/ov00_020b4940.s @@ -4097,7 +4097,7 @@ _020b8016: ldr r0, _020b8048 ; =gInventory add r1, r4, #0 ldr r0, [r0] - bl func_ov00_020ad0e4 + bl _ZN9Inventory4SaveEP13SaveInventory pop {r4, pc} nop thumb_func_end func_ov00_020b7ffc diff --git a/include/Inventory.hpp b/include/Inventory.hpp index 18a65369..93eef4a8 100644 --- a/include/Inventory.hpp +++ b/include/Inventory.hpp @@ -1,7 +1,7 @@ -#pragma once - -#include "types.h" -#include "SysNew.hpp" +#pragma once + +#include "types.h" +#include "SysNew.hpp" #include "Player/EquipItem.hpp" #include "Actors/Navi/Navi.hpp" @@ -161,10 +161,10 @@ struct SaveInventory { /* 9f */ unk8 unk_9f[6]; /* a5 */ u8 equippedFairy; /* a6 */ -}; - -class Inventory : public SysObject { -private: +}; + +class Inventory : public SysObject { +private: /* 000 */ ItemFlag mEquippedItem; /* 004 */ ItemFlag mPrevEquippedItem; /* 008 */ ItemFlag mForcedItem; // game crashes when any item besides this one is equipped @@ -173,8 +173,8 @@ private: /* 014 */ Navi *mNaviCourage; /* 018 */ Navi *mNaviPower; /* 01c */ Navi *mNaviWisdom; - /* 020 */ u16 mEquipLoadTimer; - /* 022 */ u16 mNumRupees; + /* 020 */ u16 mEquipLoadTimer; + /* 022 */ u16 mNumRupees; /* 024 */ u8 mNumGems[Gem_COUNT]; /* 027 */ unk8 mUnk_027; // padding? /* 028 */ ShipType mEquippedShipParts[ShipPart_COUNT]; @@ -185,33 +185,34 @@ private: /* 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; + /* 0b4 */ u16 mQuiverSize; + /* 0b6 */ u16 mBombBagSize; + /* 0b8 */ u16 mBombchuBagSize; /* 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; + /* 114 */ void *mUnk_114; /* 118 */ unk32 mUnk_118; /* 11c */ unk32 mUnk_11c; - /* 120 */ void *mUnk_120; - /* 124 */ void *mUnk_124; + /* 120 */ void *mUnk_120; + /* 124 */ void *mUnk_124; /* 128 */ ItemFlags mItemFlags; /* 138 */ u32 mSalvagedTreasureFlags; /* 13c */ ShipPartPricesShown mShipPartPricesShown; /* 148 */ u32 mTreasurePriceShownFlags[CEIL_DIV(Treasure_COUNT, 32)]; /* 14c */ unk8 mUnk_14c[0x4]; - /* 150 */ - -public: - static Inventory* Create(); - static void Destroy(); - Inventory(); - ~Inventory(); - - void ClearPrevEquippedItem(); -}; - -extern Inventory *gInventory; + /* 150 */ + +public: + static Inventory* Create(); + static void Destroy(); + Inventory(); + ~Inventory(); + + void ClearPrevEquippedItem(); + void Save(SaveInventory *save); +}; + +extern Inventory *gInventory; diff --git a/include/SysNew.hpp b/include/SysNew.hpp index 0869af26..20d4a46f 100644 --- a/include/SysNew.hpp +++ b/include/SysNew.hpp @@ -1,9 +1,9 @@ -#pragma once - -#include "types.h" - -class SysObject { -public: - static void* operator new(unsigned long length, u32 *id, u32 idLength); - static void operator delete(void *ptr); -}; +#pragma once + +#include "types.h" + +class SysObject { +public: + static void* operator new(unsigned long length, u32 *id, u32 idLength); + static void operator delete(void *ptr); +}; diff --git a/src/Inventory.cpp b/src/Inventory.cpp index 003f6cfb..fdc23159 100644 --- a/src/Inventory.cpp +++ b/src/Inventory.cpp @@ -1,22 +1,67 @@ -#include "Inventory.hpp" - -extern u32 *data_027e0ce0[]; - -#pragma thumb on -Inventory* Inventory::Create() { - gInventory = new(data_027e0ce0[1], 4) Inventory(); - return gInventory; -} - -void Inventory::Destroy() { - delete gInventory; - gInventory = 0; -} - -#pragma interworking on -void Inventory::ClearPrevEquippedItem() { +#include "Inventory.hpp" +#include "lib/math.h" +#include "global.h" + +extern u32 *data_027e0ce0[]; + +#pragma thumb on +Inventory* Inventory::Create() { + gInventory = new(data_027e0ce0[1], 4) Inventory(); + return gInventory; +} + +void Inventory::Destroy() { + delete gInventory; + gInventory = 0; +} + +#pragma interworking on +void Inventory::ClearPrevEquippedItem() { this->mPrevEquippedItem = ItemFlag_None; -} -#pragma interworking off - -#pragma thumb off +} +#pragma interworking off + +NONMATCH void Inventory::Save(SaveInventory *save) { + #ifndef NONMATCHING + #include "../asm/ov00/inventory/Inventory_Save.inc" + #else + save->itemFlags = this->mItemFlags; + save->numRupees = this->mNumRupees; + for (s32 i = 0; i < NUM_POTIONS; ++i) { + save->potions[i] = this->mPotions[i]; + } + save->numBombs = (u8) (*this->mAmmo)[ItemFlag_BombBag]; + save->numBombchus = (u8) (*this->mAmmo)[ItemFlag_BombchuBag]; + save->numArrows = (u8) (*this->mAmmo)[ItemFlag_Bow]; + save->equippedItem = (u8) this->mEquippedItem; + save->salvagedTreasureFlags = this->mSalvagedTreasureFlags; + save->hourglassSeconds = FastDivide(this->mHourglassSandFrames, 60); + for (s32 i = 0; i < Gem_COUNT; ++i) { + save->numGems[i] = this->mNumGems[i]; + } + for (s32 i = 0; i < ShipPart_COUNT; ++i) { + save->equippedShipParts[i] = this->mEquippedShipParts[i]; + for (s32 j = 0; j < ShipType_COUNT; ++j) { + save->shipParts[i].parts[j] = this->mShipParts[i].parts[j]; + } + } + save->shipPartPricesShown = this->mShipPartPricesShown; + for (s32 i = 0; i < Treasure_COUNT; ++i) { + save->treasure[i] = this->mTreasure[i]; + } + save->treasurePriceShownFlags[0] = this->mTreasurePriceShownFlags[0]; + for (s32 i = 0; i < 6; ++i) { + save->unk_9f[i] = this->mUnk_098[i]; + save->unk_82[i] = this->mUnk_09e[i]; + } + save->quiverSize = this->mQuiverSize; + save->bombBagSize = this->mBombBagSize; + save->bombchuBagSize = this->mBombchuBagSize; + if (this->mEquippedFairy == FairyId_None) { + save->equippedFairy = 3; + return; + } + save->equippedFairy = (u8) this->mEquippedFairy; + #endif +} +#pragma thumb off diff --git a/tools/lcf.py b/tools/lcf.py index 96ec455f..d7972a6a 100644 --- a/tools/lcf.py +++ b/tools/lcf.py @@ -31,7 +31,7 @@ ov00 = Overlay(name='ov00', after='ARM9', objects=[ 'asm/ov00/ov00_0209bea0.s', 'asm/ov00/ov00_020a03e4.s', 'src/Inventory.cpp', - 'asm/ov00/inventory.s', + 'asm/ov00/inventory/inventory.s', 'asm/ov00/ov00_020ae7a4.s', 'asm/ov00/ov00_020b4940.s', 'asm/ov00/ov00_020c36b4.s',