diff --git a/asm/ov00/ItemManager/ItemManager.s b/asm/ov00/ItemManager/ItemManager.s index 485c7470..2e3c183b 100644 --- a/asm/ov00/ItemManager/ItemManager.s +++ b/asm/ov00/ItemManager/ItemManager.s @@ -3,103 +3,6 @@ .text - .global _ZN11ItemManager18func_ov00_020ad790Ej - arm_func_start _ZN11ItemManager18func_ov00_020ad790Ej -_ZN11ItemManager18func_ov00_020ad790Ej: ; 0x020ad790 - stmdb sp!, {r4, r5, r6, lr} - ldr r2, _020ad8c4 ; =data_027e0d38 - mov r6, r0 - ldr r0, [r2] - mov r5, r1 - bl func_ov00_02078b40 - cmp r0, #2 - bne _020ad7c0 - ldr r0, _020ad8c8 ; =data_027e10a4 - ldr r0, [r0] - bl func_ov15_02136670 - ldmia sp!, {r4, r5, r6, pc} -_020ad7c0: - ldr r0, _020ad8c4 ; =data_027e0d38 - ldr r0, [r0] - ldr r0, [r0, #0x14] - cmp r0, #1 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - ldr r0, _020ad8cc ; =gOverlayManager - ldr r1, _020ad8d0 ; =0x0000001d - ldr r0, [r0, #0x18] - cmp r0, r1 - bne _020ad800 - ldr r0, _020ad8d4 ; =data_ov29_0217a4ac - ldrb r0, [r0, #0x54] - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, pc} -_020ad800: - ldr r0, _020ad8d8 ; =data_027e0e60 - ldr r4, [r6, #8] - ldr r0, [r0] - bl func_ov00_020849f8 - cmp r0, #0 - moveq r2, #1 - ldr r1, [r6] - mvn r0, #0 - movne r2, #0 - cmp r1, r0 - beq _020ad874 - cmp r2, #0 - bne _020ad840 - sub r0, r1, #9 - cmp r0, #1 - bhi _020ad874 -_020ad840: - ldr r0, _020ad8dc ; =data_027e0fc8 - ldr r0, [r0] - cmp r0, #0 - beq _020ad860 - mov r1, r5 - bl func_ov00_020bbd80 - cmp r0, #0 - beq _020ad874 -_020ad860: - ldr r1, [r6] - mov r0, r6 - bl _ZN11ItemManager7HasItemEj - cmp r0, #0 - ldrne r4, [r6] -_020ad874: - mvn r0, #0 - cmp r4, r0 - beq _020ad8bc - ldrh r0, [r6, #0x20] - cmp r0, #0 - beq _020ad89c - cmp r5, #0 - moveq r0, #1 - movne r0, #0 - ldmia sp!, {r4, r5, r6, pc} -_020ad89c: - mov r0, r6 - mov r1, r4 - bl _ZN11ItemManager12GetEquipItemEj - ldr r2, [r0] - mov r1, r5 - ldr r2, [r2, #0x14] - blx r2 - ldmia sp!, {r4, r5, r6, pc} -_020ad8bc: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 - arm_func_end _ZN11ItemManager18func_ov00_020ad790Ej -_020ad8c4: .word data_027e0d38 -_020ad8c8: .word data_027e10a4 -_020ad8cc: .word gOverlayManager -_020ad8d0: .word 0x0000001d -_020ad8d4: .word data_ov29_0217a4ac -_020ad8d8: .word data_027e0e60 -_020ad8dc: .word data_027e0fc8 - .global _ZNK11ItemManager19GetEquippedShipPartEj thumb_func_start _ZNK11ItemManager19GetEquippedShipPartEj _ZNK11ItemManager19GetEquippedShipPartEj: ; 0x020ad8e0 @@ -1625,7 +1528,7 @@ _ZN11ItemManager17EquipPreviousItemEv: ; 0x020ae3c0 bx ip .align 2, 0 arm_func_end _ZN11ItemManager17EquipPreviousItemEv -_020ae3cc: .word _ZN11ItemManager15SetEquippedItemEj +_020ae3cc: .word _ZN11ItemManager15SetEquippedItemEj - 1 .global _ZN11ItemManager13ForceEquipItemEj thumb_func_start _ZN11ItemManager13ForceEquipItemEj diff --git a/asm/ov00/ItemManager/ItemManager_func_ov00_020ad790.inc b/asm/ov00/ItemManager/ItemManager_func_ov00_020ad790.inc new file mode 100644 index 00000000..a1d98ad8 --- /dev/null +++ b/asm/ov00/ItemManager/ItemManager_func_ov00_020ad790.inc @@ -0,0 +1,85 @@ + + stmdb sp!, {r4, r5, r6, lr} + lda r2, data_027e0d38 + mov r6, r0 + ldr r0, [r2] + mov r5, r1 + bl func_ov00_02078b40 + cmp r0, #2 + bne _020ad7c0 + lda r0, data_027e10a4 + ldr r0, [r0] + bl func_ov15_02136670 + ldmia sp!, {r4, r5, r6, pc} +_020ad7c0: + lda r0, data_027e0d38 + ldr r0, [r0] + ldr r0, [r0, #0x14] + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + lda r0, gOverlayManager + ldconst r1, #0x1d + ldr r0, [r0, #0x18] + cmp r0, r1 + bne _020ad800 + lda r0, data_ov29_0217a4ac + ldrb r0, [r0, #0x54] + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} +_020ad800: + lda r0, data_027e0e60 + ldr r4, [r6, #8] + ldr r0, [r0] + bl func_ov00_020849f8 + cmp r0, #0 + moveq r2, #1 + ldr r1, [r6] + mvn r0, #0 + movne r2, #0 + cmp r1, r0 + beq _020ad874 + cmp r2, #0 + bne _020ad840 + sub r0, r1, #9 + cmp r0, #1 + bhi _020ad874 +_020ad840: + lda r0, data_027e0fc8 + ldr r0, [r0] + cmp r0, #0 + beq _020ad860 + mov r1, r5 + bl func_ov00_020bbd80 + cmp r0, #0 + beq _020ad874 +_020ad860: + ldr r1, [r6] + mov r0, r6 + bl _ZN11ItemManager7HasItemEj + cmp r0, #0 + ldrne r4, [r6] +_020ad874: + mvn r0, #0 + cmp r4, r0 + beq _020ad8bc + ldrh r0, [r6, #0x20] + cmp r0, #0 + beq _020ad89c + cmp r5, #0 + moveq r0, #1 + movne r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_020ad89c: + mov r0, r6 + mov r1, r4 + bl _ZN11ItemManager12GetEquipItemEj + ldr r2, [r0] + mov r1, r5 + ldr r2, [r2, #0x14] + blx r2 + ldmia sp!, {r4, r5, r6, pc} +_020ad8bc: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} diff --git a/include/ItemManager.hpp b/include/ItemManager.hpp index ee88540c..17e83728 100644 --- a/include/ItemManager.hpp +++ b/include/ItemManager.hpp @@ -254,7 +254,7 @@ public: bool EquipItem_vfunc_3c(Vec4p *param1, ItemFlag equipId); void EquipItem_vfunc_2c(ItemFlag equipId); EquipItem* GetEquipItem(ItemFlag equipId); - unk32 func_ov00_020ad790(unk32 param1); + bool func_ov00_020ad790(unk32 param1); bool SetEquippedItem(ItemFlag equipId); void EquipPreviousItem(); void ForceEquipItem(ItemFlag equipId); diff --git a/include/OverlayManager.hpp b/include/OverlayManager.hpp index ce0a68fe..b3d3621d 100644 --- a/include/OverlayManager.hpp +++ b/include/OverlayManager.hpp @@ -88,9 +88,9 @@ enum OverlayIndex_ { }; class OverlayManager { +public: OverlayId mLoadedOverlays[OverlayIndex_COUNT]; -public: void Unload(OverlayIndex index); void Load(OverlayIndex index, OverlayId id); void LoadIfNotLoaded(OverlayIndex index, OverlayId id); diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index cafc7373..d8b71b76 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -263,3 +263,44 @@ ARM void ItemManager::GiveAmmo(ItemFlag equipId, u16 amount) { if ((*this->mAmmo)[equipId] <= this->GetMaxAmmo(equipId)) return; (*this->mAmmo)[equipId] = this->GetMaxAmmo(equipId); } + +extern "C" unk32 func_ov00_02078b40(UnkStruct_027e0d38 *param1); +extern void *data_027e10a4; +extern "C" bool func_ov15_02136670(void *param1); +extern unk8 data_ov29_0217a4ac[]; +extern void *data_027e0e60; +extern "C" bool func_ov00_020849f8(void *param1); +extern unk32 data_027e0fc8; +extern "C" bool func_ov00_020bbd80(unk32 param1, unk32 param2); +extern "C" void _ZN11ItemManager12GetEquipItemEj(); +ARM NONMATCH bool ItemManager::func_ov00_020ad790(unk32 param1) { + #ifndef NONMATCHING + #include "../asm/ov00/ItemManager/ItemManager_func_ov00_020ad790.inc" + #else + unk32 unk1 = func_ov00_02078b40(data_027e0d38); + if (unk1 == 2) return func_ov15_02136670(data_027e10a4); + if (data_027e0d38->mUnk_14 == 1) return false; + // NONMATCH: OverlayId_29 should be in constant pool + if (gOverlayManager.mLoadedOverlays[OverlayIndex_6] == OverlayId_29 && data_ov29_0217a4ac[0x54] != 0) { + return false; + } + + ItemFlag equipId = this->mForcedItem; + bool unk2 = !func_ov00_020849f8(data_027e0e60); + if ( + this->mEquippedItem != ItemFlag_None && + (unk2 || this->mEquippedItem - 9 <= 1) && + (data_027e0fc8 == 0 || func_ov00_020bbd80(data_027e0fc8, param1)) && + this->HasItem(this->mEquippedItem) + ) { + equipId = this->mEquippedItem; + } + + if (equipId != ItemFlag_None) { + if (this->mEquipLoadTimer != 0) return param1 == 0; + return this->GetEquipItem(equipId)->IsUsable(param1); + } + return false; + #endif +} +