diff --git a/asm/ov00/Player/LinkStateItem.s b/asm/ov00/Player/LinkStateItem.s new file mode 100644 index 00000000..2936071b --- /dev/null +++ b/asm/ov00/Player/LinkStateItem.s @@ -0,0 +1,229 @@ + .include "macros/function.inc" + .include "ov00/Player/include/LinkStateItem.inc" + + .text + + .global func_ov00_020abd78 + thumb_func_start func_ov00_020abd78 +func_ov00_020abd78: ; 0x020abd78 + bx lr + .align 2, 0 + thumb_func_end func_ov00_020abd78 + + .global func_ov00_020abd7c + arm_func_start func_ov00_020abd7c +func_ov00_020abd7c: ; 0x020abd7c + mov r0, #1 + bx lr + arm_func_end func_ov00_020abd7c + + .global func_ov00_020abd84 + arm_func_start func_ov00_020abd84 +func_ov00_020abd84: ; 0x020abd84 + ldr r0, [r0, #0x14] + cmp r0, #8 + bne _020abd98 + mov r0, #0 + bx lr +_020abd98: + mvn r0, #0 + bx lr + arm_func_end func_ov00_020abd84 + + .global func_ov00_020abda0 + arm_func_start func_ov00_020abda0 +func_ov00_020abda0: ; 0x020abda0 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r1 + bl _ZN13LinkStateBase12OnStateLeaveEi + ldr r0, [r5, #0x14] + cmp r0, #0xa + addls pc, pc, r0, lsl #2 + b _020abe68 +_020abdc0: ; jump table + b _020abe68 ; case 0 + b _020abe68 ; case 1 + b _020abe68 ; case 2 + b _020abe60 ; case 3 + b _020abe1c ; case 4 + b _020abe68 ; case 5 + b _020abe2c ; case 6 + b _020abdec ; case 7 + b _020abe38 ; case 8 + b _020abe44 ; case 9 + b _020abe44 ; case 10 +_020abdec: + ldr r0, _020abf44 ; =data_027e103c + ldr r0, [r0] + bl func_ov00_020cf01c + ldrb r0, [r0, #0xe0] + cmp r0, #0 + bne _020abe0c + bl func_ov00_020abf50 + bl func_ov14_0213ec64 +_020abe0c: + ldr r0, _020abf48 ; =data_027e1098 + ldr r0, [r0] + blx func_ov14_0211fd04 + b _020abe68 +_020abe1c: + mov r0, r5 + mov r1, r4 + bl func_ov55_02198f90 + b _020abe68 +_020abe2c: + mov r0, r5 + bl func_ov57_0219a32c + b _020abe68 +_020abe38: + mov r0, r5 + bl func_ov59_0219931c + b _020abe68 +_020abe44: + ldr r0, _020abf44 ; =data_027e103c + mov r1, #0 + ldr r0, [r0] + mov r2, r1 + strb r1, [r0, #0x2a] + bl func_ov00_020cf9dc + b _020abe68 +_020abe60: + mov r0, r5 + bl func_ov54_021997f0 +_020abe68: + ldr r1, [r5, #0x14] + mvn r0, #0 + cmp r1, r0 + beq _020abe8c + mov r0, r5 + bl _ZN13LinkStateBase12GetEquipItemEi + ldr r1, [r0] + ldr r1, [r1, #0x1c] + blx r1 +_020abe8c: + ldr r1, [r5, #0x14] + cmp r1, #9 + bgt _020abec0 + bge _020abec8 + cmp r1, #1 + bgt _020abed4 + mvn r0, #0 + cmp r1, r0 + blt _020abed4 + cmpne r1, #0 + cmpne r1, #1 + beq _020abef4 + b _020abed4 +_020abec0: + cmp r1, #0xa + bne _020abed4 +_020abec8: + mov r0, r5 + bl _ZN13LinkStateBase18EquipItem_vfunc_28Ev + b _020abef4 +_020abed4: + mov r0, r5 + bl _ZN13LinkStateBase18EquipItem_vfunc_28Ev + cmp r4, #4 + cmpne r4, #2 + beq _020abef4 + bl func_ov00_020abf60 + mov r1, #1 + strb r1, [r0, #0x14] +_020abef4: + mvn r0, #0 + add r6, r5, #0x50 + add r4, r5, #0x58 + str r0, [r5, #0x18] + cmp r6, r4 + beq _020abf20 +_020abf0c: + mov r0, r6 + bl func_ov00_020b7e6c + add r6, r6, #4 + cmp r6, r4 + bne _020abf0c +_020abf20: + ldr r0, _020abf4c ; =data_027e0fb8 + ldr r0, [r0] + ldrb r1, [r0, #0x80] + cmp r1, #0 + beq _020abf38 + bl func_ov00_020af050 +_020abf38: + mov r0, #0 + strb r0, [r5, #0x26] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 + arm_func_end func_ov00_020abda0 +_020abf44: .word data_027e103c +_020abf48: .word data_027e1098 +_020abf4c: .word data_027e0fb8 + + .global func_ov00_020abf50 + arm_func_start func_ov00_020abf50 +func_ov00_020abf50: ; 0x020abf50 + ldr ip, _020abf5c ; =func_01fffcec + mov r0, #7 + bx ip + .align 2, 0 + arm_func_end func_ov00_020abf50 +_020abf5c: .word func_01fffcec + + .global func_ov00_020abf60 + arm_func_start func_ov00_020abf60 +func_ov00_020abf60: ; 0x020abf60 + ldr ip, _020abf6c ; =func_01fffcd8 + mov r0, #0 + bx ip + .align 2, 0 + arm_func_end func_ov00_020abf60 +_020abf6c: .word func_01fffcd8 + + .global func_ov00_020abf70 + arm_func_start func_ov00_020abf70 +func_ov00_020abf70: ; 0x020abf70 + ldr r1, _020abf88 ; =data_027e0f74 + mov r2, r0 + ldr r0, [r1] + ldr ip, _020abf8c ; =func_ov00_02097b9c + ldr r1, [r2, #0x5c] + bx ip + .align 2, 0 + arm_func_end func_ov00_020abf70 +_020abf88: .word data_027e0f74 +_020abf8c: .word func_ov00_02097b9c + + .global func_ov00_020abf90 + arm_func_start func_ov00_020abf90 +func_ov00_020abf90: ; 0x020abf90 + ldr r0, [r0, #0x5c] + cmp r0, #0 + movlt r0, #1 + movge r0, #0 + bx lr + arm_func_end func_ov00_020abf90 + + .data + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + .global data_ov00_020e5a48 +data_ov00_020e5a48: ; 0x020e5a48 + .word func_ov00_020abd78 + .word func_ov04_02109ae8 + .word func_ov04_02109b08 + .word func_ov00_020abd7c - 1 + .word func_ov04_0210adf8 + .word func_ov05_0210540c + .word func_ov00_020abda0 - 1 + .word func_ov05_021055e0 + .word func_ov05_02105670 + .word func_ov05_021057c4 + .word func_ov00_020abf90 - 1 + .word func_ov05_0210f704 + .word func_ov05_0210f708 + .word _ZN13LinkStateBase8vfunc_34EP5Vec3p + .word func_ov05_0210f70c + .word func_ov05_0210f714 + .word func_ov05_0210f71c diff --git a/asm/ov00/Player/include/LinkStateItem.inc b/asm/ov00/Player/include/LinkStateItem.inc new file mode 100644 index 00000000..46c4a02a --- /dev/null +++ b/asm/ov00/Player/include/LinkStateItem.inc @@ -0,0 +1,35 @@ +#pragma once +.extern _ZN13LinkStateBase12OnStateLeaveEi +.extern func_ov00_020cf01c +.extern func_ov14_0213ec64 +.extern func_ov14_0211fd04 +.extern func_ov55_02198f90 +.extern func_ov57_0219a32c +.extern func_ov59_0219931c +.extern func_ov00_020cf9dc +.extern func_ov54_021997f0 +.extern _ZN13LinkStateBase12GetEquipItemEi +.extern _ZN13LinkStateBase18EquipItem_vfunc_28Ev +.extern _ZN13LinkStateBase18EquipItem_vfunc_28Ev +.extern func_ov00_020b7e6c +.extern func_ov00_020af050 +.extern data_027e103c +.extern data_027e1098 +.extern data_027e0fb8 +.extern func_01fffcec +.extern func_01fffcd8 +.extern data_027e0f74 +.extern func_ov00_02097b9c +.extern func_ov04_02109ae8 +.extern func_ov04_02109b08 +.extern func_ov04_0210adf8 +.extern func_ov05_0210540c +.extern func_ov05_021055e0 +.extern func_ov05_02105670 +.extern func_ov05_021057c4 +.extern func_ov05_0210f704 +.extern func_ov05_0210f708 +.extern _ZN13LinkStateBase8vfunc_34EP5Vec3p +.extern func_ov05_0210f70c +.extern func_ov05_0210f714 +.extern func_ov05_0210f71c diff --git a/asm/ov00/ov00_020a8e04.s b/asm/ov00/ov00_020a8e04.s index 42447445..8386fece 100644 --- a/asm/ov00/ov00_020a8e04.s +++ b/asm/ov00/ov00_020a8e04.s @@ -4006,208 +4006,6 @@ _020abd6c: .word data_027e0fb8 _020abd70: .word data_027e0fe4 _020abd74: .word data_ov00_020eec9c - .global func_ov00_020abd78 - thumb_func_start func_ov00_020abd78 -func_ov00_020abd78: ; 0x020abd78 - bx lr - .align 2, 0 - thumb_func_end func_ov00_020abd78 - - .global func_ov00_020abd7c - arm_func_start func_ov00_020abd7c -func_ov00_020abd7c: ; 0x020abd7c - mov r0, #1 - bx lr - arm_func_end func_ov00_020abd7c - - .global func_ov00_020abd84 - arm_func_start func_ov00_020abd84 -func_ov00_020abd84: ; 0x020abd84 - ldr r0, [r0, #0x14] - cmp r0, #8 - bne _020abd98 - mov r0, #0 - bx lr -_020abd98: - mvn r0, #0 - bx lr - arm_func_end func_ov00_020abd84 - - .global func_ov00_020abda0 - arm_func_start func_ov00_020abda0 -func_ov00_020abda0: ; 0x020abda0 - stmdb sp!, {r4, r5, r6, lr} - mov r5, r0 - mov r4, r1 - bl _ZN13LinkStateBase12OnStateLeaveEi - ldr r0, [r5, #0x14] - cmp r0, #0xa - addls pc, pc, r0, lsl #2 - b _020abe68 -_020abdc0: ; jump table - b _020abe68 ; case 0 - b _020abe68 ; case 1 - b _020abe68 ; case 2 - b _020abe60 ; case 3 - b _020abe1c ; case 4 - b _020abe68 ; case 5 - b _020abe2c ; case 6 - b _020abdec ; case 7 - b _020abe38 ; case 8 - b _020abe44 ; case 9 - b _020abe44 ; case 10 -_020abdec: - ldr r0, _020abf44 ; =data_027e103c - ldr r0, [r0] - bl func_ov00_020cf01c - ldrb r0, [r0, #0xe0] - cmp r0, #0 - bne _020abe0c - bl func_ov00_020abf50 - bl func_ov14_0213ec64 -_020abe0c: - ldr r0, _020abf48 ; =data_027e1098 - ldr r0, [r0] - blx func_ov14_0211fd04 - b _020abe68 -_020abe1c: - mov r0, r5 - mov r1, r4 - bl func_ov55_02198f90 - b _020abe68 -_020abe2c: - mov r0, r5 - bl func_ov57_0219a32c - b _020abe68 -_020abe38: - mov r0, r5 - bl func_ov59_0219931c - b _020abe68 -_020abe44: - ldr r0, _020abf44 ; =data_027e103c - mov r1, #0 - ldr r0, [r0] - mov r2, r1 - strb r1, [r0, #0x2a] - bl func_ov00_020cf9dc - b _020abe68 -_020abe60: - mov r0, r5 - bl func_ov54_021997f0 -_020abe68: - ldr r1, [r5, #0x14] - mvn r0, #0 - cmp r1, r0 - beq _020abe8c - mov r0, r5 - bl _ZN13LinkStateBase12GetEquipItemEi - ldr r1, [r0] - ldr r1, [r1, #0x1c] - blx r1 -_020abe8c: - ldr r1, [r5, #0x14] - cmp r1, #9 - bgt _020abec0 - bge _020abec8 - cmp r1, #1 - bgt _020abed4 - mvn r0, #0 - cmp r1, r0 - blt _020abed4 - cmpne r1, #0 - cmpne r1, #1 - beq _020abef4 - b _020abed4 -_020abec0: - cmp r1, #0xa - bne _020abed4 -_020abec8: - mov r0, r5 - bl _ZN13LinkStateBase18EquipItem_vfunc_28Ev - b _020abef4 -_020abed4: - mov r0, r5 - bl _ZN13LinkStateBase18EquipItem_vfunc_28Ev - cmp r4, #4 - cmpne r4, #2 - beq _020abef4 - bl func_ov00_020abf60 - mov r1, #1 - strb r1, [r0, #0x14] -_020abef4: - mvn r0, #0 - add r6, r5, #0x50 - add r4, r5, #0x58 - str r0, [r5, #0x18] - cmp r6, r4 - beq _020abf20 -_020abf0c: - mov r0, r6 - bl func_ov00_020b7e6c - add r6, r6, #4 - cmp r6, r4 - bne _020abf0c -_020abf20: - ldr r0, _020abf4c ; =data_027e0fb8 - ldr r0, [r0] - ldrb r1, [r0, #0x80] - cmp r1, #0 - beq _020abf38 - bl func_ov00_020af050 -_020abf38: - mov r0, #0 - strb r0, [r5, #0x26] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 - arm_func_end func_ov00_020abda0 -_020abf44: .word data_027e103c -_020abf48: .word data_027e1098 -_020abf4c: .word data_027e0fb8 - - .global func_ov00_020abf50 - arm_func_start func_ov00_020abf50 -func_ov00_020abf50: ; 0x020abf50 - ldr ip, _020abf5c ; =func_01fffcec - mov r0, #7 - bx ip - .align 2, 0 - arm_func_end func_ov00_020abf50 -_020abf5c: .word func_01fffcec - - .global func_ov00_020abf60 - arm_func_start func_ov00_020abf60 -func_ov00_020abf60: ; 0x020abf60 - ldr ip, _020abf6c ; =func_01fffcd8 - mov r0, #0 - bx ip - .align 2, 0 - arm_func_end func_ov00_020abf60 -_020abf6c: .word func_01fffcd8 - - .global func_ov00_020abf70 - arm_func_start func_ov00_020abf70 -func_ov00_020abf70: ; 0x020abf70 - ldr r1, _020abf88 ; =data_027e0f74 - mov r2, r0 - ldr r0, [r1] - ldr ip, _020abf8c ; =func_ov00_02097b9c - ldr r1, [r2, #0x5c] - bx ip - .align 2, 0 - arm_func_end func_ov00_020abf70 -_020abf88: .word data_027e0f74 -_020abf8c: .word func_ov00_02097b9c - - .global func_ov00_020abf90 - arm_func_start func_ov00_020abf90 -func_ov00_020abf90: ; 0x020abf90 - ldr r0, [r0, #0x5c] - cmp r0, #0 - movlt r0, #1 - movge r0, #0 - bx lr - arm_func_end func_ov00_020abf90 - .rodata .global data_ov00_020dc528 data_ov00_020dc528: ; 0x020dc528 @@ -4921,59 +4719,3 @@ data_ov00_020e5a38: ; 0x020e5a38 data_ov00_020e5a3c: ; 0x020e5a3c .byte 0x00, 0x00, 0x00, 0x00 .global data_ov00_020e5a40 -data_ov00_020e5a40: ; 0x020e5a40 - .byte 0x00, 0x00, 0x00, 0x00 - .global data_ov00_020e5a44 -data_ov00_020e5a44: ; 0x020e5a44 - .byte 0x00, 0x00, 0x00, 0x00 - .global data_ov00_020e5a48 -data_ov00_020e5a48: ; 0x020e5a48 - .word func_ov00_020abd78 - .global data_ov00_020e5a4c -data_ov00_020e5a4c: ; 0x020e5a4c - .word func_ov04_02109ae8 ; data_ov07_02109ae8 - .global data_ov00_020e5a50 -data_ov00_020e5a50: ; 0x020e5a50 - .word func_ov04_02109b08 ; data_ov07_02109b08 - .global data_ov00_020e5a54 -data_ov00_020e5a54: ; 0x020e5a54 - .word func_ov00_020abd7c - 1 - .global data_ov00_020e5a58 -data_ov00_020e5a58: ; 0x020e5a58 - .word func_ov04_0210adf8 ; data_ov07_0210adf8 - .global data_ov00_020e5a5c -data_ov00_020e5a5c: ; 0x020e5a5c - .word func_ov05_0210540c ; data_ov07_0210540c - .global data_ov00_020e5a60 -data_ov00_020e5a60: ; 0x020e5a60 - .word func_ov00_020abda0 - 1 - .global data_ov00_020e5a64 -data_ov00_020e5a64: ; 0x020e5a64 - .word func_ov05_021055e0 ; data_ov07_021055e0 - .global data_ov00_020e5a68 -data_ov00_020e5a68: ; 0x020e5a68 - .word func_ov05_02105670 ; data_ov07_02105670 - .global data_ov00_020e5a6c -data_ov00_020e5a6c: ; 0x020e5a6c - .word func_ov05_021057c4 ; data_ov07_021057c4 - .global data_ov00_020e5a70 -data_ov00_020e5a70: ; 0x020e5a70 - .word func_ov00_020abf90 - 1 - .global data_ov00_020e5a74 -data_ov00_020e5a74: ; 0x020e5a74 - .word func_ov05_0210f704 - .global data_ov00_020e5a78 -data_ov00_020e5a78: ; 0x020e5a78 - .word func_ov05_0210f708 - .global data_ov00_020e5a7c -data_ov00_020e5a7c: ; 0x020e5a7c - .word _ZN13LinkStateBase8vfunc_34EP5Vec3p - .global data_ov00_020e5a80 -data_ov00_020e5a80: ; 0x020e5a80 - .word func_ov05_0210f70c - .global data_ov00_020e5a84 -data_ov00_020e5a84: ; 0x020e5a84 - .word func_ov05_0210f714 - .global data_ov00_020e5a88 -data_ov00_020e5a88: ; 0x020e5a88 - .word func_ov05_0210f71c diff --git a/include/Player/LinkStateItem.hpp b/include/Player/LinkStateItem.hpp index 4cef7c4f..680ebbd9 100644 --- a/include/Player/LinkStateItem.hpp +++ b/include/Player/LinkStateItem.hpp @@ -4,6 +4,8 @@ #include "types.h" #include "Player/LinkStateBase.hpp" +#include "Player/LinkStateMove.hpp" +#include "Player/EquipBombchu.hpp" #include "Item/Item.hpp" class LinkStateItem : public LinkStateBase { @@ -35,7 +37,7 @@ public: /* 00 */ virtual void vfunc_00() override; /* 04 */ virtual ~LinkStateItem() override; - /* 0c */ virtual LinkStateId GetId() = 0 override; + /* 0c */ virtual LinkStateId GetId() override; /* 14 */ virtual void OnStateEnter() override; /* 18 */ virtual void OnStateLeave(s32 param1) override; /* 1c */ virtual void vfunc_1c() override; @@ -43,4 +45,9 @@ public: /* 24 */ virtual bool vfunc_24(s32 param1) override; /* 28 */ virtual bool vfunc_28() override; /* 44 */ + + s32 IsHammerEquipped(); // returns 0 if hammer is equipped, otherwise -1 + EquipBombchu* GetEquipBombchu(); + LinkStateMove* GetLinkStateMove(); + bool func_ov00_020abf70(); }; diff --git a/src/00_Core/Player/LinkStateItem.cpp b/src/00_Core/Player/LinkStateItem.cpp new file mode 100644 index 00000000..dfd2ef62 --- /dev/null +++ b/src/00_Core/Player/LinkStateItem.cpp @@ -0,0 +1,13 @@ +#include "Player/LinkStateItem.hpp" + +#ifdef STUBS + +void LinkStateItem::vfunc_00() {} +LinkStateId LinkStateItem::GetId() {} +s32 LinkStateItem::IsHammerEquipped() {} +void LinkStateItem::OnStateLeave(s32 param1) {} +EquipBombchu* LinkStateItem::GetEquipBombchu() {} +LinkStateMove* LinkStateItem::GetLinkStateMove() {} +bool LinkStateItem::func_ov00_020abf70() {} + +#endif diff --git a/tools/lcf.py b/tools/lcf.py index 78b10126..355a9312 100644 --- a/tools/lcf.py +++ b/tools/lcf.py @@ -29,6 +29,8 @@ ov00 = Overlay(name='ov00', after='ARM9', objects=[ 'asm/ov00/ov00_0207af9c.s', 'asm/ov00/Player/LinkStateBase.s', 'asm/ov00/ov00_020a8e04.s', + 'src/00_Core/Player/LinkStateItem.cpp', + 'asm/ov00/Player/LinkStateItem.s', 'src/00_Core/Player/LinkStateDamage.cpp', 'asm/ov00/Player/LinkStateDamage.s', 'src/00_Core/Item/Item.cpp',