88% match Inventory::Save

This commit is contained in:
Aetias
2023-12-20 10:45:27 +01:00
parent e6257e902b
commit e5cfa5950c
9 changed files with 289 additions and 249 deletions
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+181
View File
@@ -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}
@@ -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
+1 -1
View File
@@ -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
+29 -28
View File
@@ -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;
+9 -9
View File
@@ -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);
};
+66 -21
View File
@@ -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
+1 -1
View File
@@ -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',