From d057996378f1235c67d93014595e9fd929a4efb6 Mon Sep 17 00:00:00 2001 From: Aetias Date: Mon, 10 Feb 2025 23:07:55 +0100 Subject: [PATCH] PlayerControl: Decomp 38% --- config/eur/arm9/overlays/ov000/symbols.txt | 8 +- config/eur/arm9/overlays/ov024/symbols.txt | 2 +- config/usa/arm9/overlays/ov000/symbols.txt | 8 +- config/usa/arm9/overlays/ov024/symbols.txt | 2 +- include/Actor/Navi/ActorNaviBase.hpp | 2 +- include/Player/PlayerControl.hpp | 8 +- include/Player/PlayerControlData.hpp | 6 +- src/00_Core/Actor/Navi/ActorNaviBase.cpp | 2 +- src/00_Core/Player/PlayerControl.cpp | 181 +++++++++++++++++++-- src/00_Core/Player/PlayerControlData.cpp | 4 +- 10 files changed, 190 insertions(+), 33 deletions(-) diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 33405289..394c8faf 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -2202,10 +2202,10 @@ _ZN13PlayerControl18func_ov00_020afad8EP5Vec3p kind:function(arm,size=0x94) addr _ZN13PlayerControl18func_ov00_020afb6cEv kind:function(arm,size=0x31c) addr:0x20afb6c _ZN13PlayerControl18func_ov00_020afe88Eib kind:function(arm,size=0x64) addr:0x20afe88 _ZN13PlayerControl18func_ov00_020afeecEib kind:function(arm,size=0xa4) addr:0x20afeec -_ZN13PlayerControl18func_ov00_020aff90Eii kind:function(arm,size=0x5c) addr:0x20aff90 +_ZN13PlayerControl18func_ov00_020aff90EP8Cylinderi kind:function(arm,size=0x5c) addr:0x20aff90 _ZN13PlayerControl18func_ov00_020affecEP5Vec3piiS1_ kind:function(arm,size=0x160) addr:0x20affec -_ZN13PlayerControl18func_ov00_020b014cEv kind:function(arm,size=0xd0) addr:0x20b014c -_ZN13PlayerControl6SetAimEv kind:function(arm,size=0x24) addr:0x20b021c +_ZN13PlayerControl18func_ov00_020b014cEP5Vec3p kind:function(arm,size=0xd0) addr:0x20b014c +_ZN13PlayerControl8ResetAimEv kind:function(arm,size=0x24) addr:0x20b021c _ZN13PlayerControl14UpdateAimWorldEP5Vec3p kind:function(arm,size=0xe8) addr:0x20b0240 _ZN13PlayerControl13GetTouchAngleEv kind:function(arm,size=0x24) addr:0x20b0328 _ZN13PlayerControl18func_ov00_020b034cEv kind:function(arm,size=0xcc) addr:0x20b034c @@ -2479,7 +2479,7 @@ _ZN13ActorNaviBase8vfunc_84Ev kind:function(arm,size=0x18) addr:0x20ba5d4 _ZN13ActorNaviBase8vfunc_78Ev kind:function(arm,size=0x288) addr:0x20ba5ec _ZN13ActorNaviBase8vfunc_bcEici kind:function(arm,size=0x400) addr:0x20ba874 _ZN13ActorNaviBase8vfunc_74Ev kind:function(arm,size=0x34) addr:0x20bac74 -_ZN13ActorNaviBase19func_ov000_020baca8EP5Vec3pi kind:function(arm,size=0x70) addr:0x20baca8 +_ZN13ActorNaviBase19func_ov000_020baca8EP8Cylinderi kind:function(arm,size=0x70) addr:0x20baca8 _ZN13ActorNaviBase19func_ov000_020bad18Ev kind:function(arm,size=0x2c) addr:0x20bad18 _ZN13ActorNaviBase8vfunc_90Ev kind:function(arm,size=0x224) addr:0x20bad44 _ZN13ActorNaviBase8vfunc_94Ev kind:function(arm,size=0x144) addr:0x20baf68 diff --git a/config/eur/arm9/overlays/ov024/symbols.txt b/config/eur/arm9/overlays/ov024/symbols.txt index bca88683..1cd13f2a 100644 --- a/config/eur/arm9/overlays/ov024/symbols.txt +++ b/config/eur/arm9/overlays/ov024/symbols.txt @@ -286,7 +286,7 @@ func_ov024_02178204 kind:function(arm,size=0x30) addr:0x2178204 func_ov024_02178234 kind:function(arm,size=0xec) addr:0x2178234 func_ov024_02178320 kind:function(arm,size=0x20) addr:0x2178320 func_ov024_02178340 kind:function(arm,size=0x8) addr:0x2178340 -func_ov024_02178348 kind:function(arm,size=0x358) addr:0x2178348 +_ZN13PlayerControl19func_ov024_02178348EP5Vec3p kind:function(arm,size=0x358) addr:0x2178348 func_ov024_021786a0 kind:function(arm,size=0x10) addr:0x21786a0 func_ov024_021786b0 kind:function(arm,size=0x30) addr:0x21786b0 func_ov024_021786e0 kind:function(arm,size=0x20) addr:0x21786e0 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index d1eca585..96a0dcfe 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -2202,10 +2202,10 @@ _ZN13PlayerControl18func_ov00_020afad8EP5Vec3p kind:function(arm,size=0x94) addr _ZN13PlayerControl18func_ov00_020afb6cEv kind:function(arm,size=0x31c) addr:0x20afb0c _ZN13PlayerControl18func_ov00_020afe88Eib kind:function(arm,size=0x64) addr:0x20afe28 _ZN13PlayerControl18func_ov00_020afeecEib kind:function(arm,size=0xa4) addr:0x20afe8c -_ZN13PlayerControl18func_ov00_020aff90Eii kind:function(arm,size=0x5c) addr:0x20aff30 +_ZN13PlayerControl18func_ov00_020aff90EP8Cylinderi kind:function(arm,size=0x5c) addr:0x20aff30 _ZN13PlayerControl18func_ov00_020affecEP5Vec3piiS1_ kind:function(arm,size=0x160) addr:0x20aff8c -_ZN13PlayerControl18func_ov00_020b014cEv kind:function(arm,size=0xd0) addr:0x20b00ec -_ZN13PlayerControl6SetAimEv kind:function(arm,size=0x24) addr:0x20b01bc +_ZN13PlayerControl18func_ov00_020b014cEP5Vec3p kind:function(arm,size=0xd0) addr:0x20b00ec +_ZN13PlayerControl8ResetAimEv kind:function(arm,size=0x24) addr:0x20b01bc _ZN13PlayerControl14UpdateAimWorldEP5Vec3p kind:function(arm,size=0xe8) addr:0x20b01e0 _ZN13PlayerControl13GetTouchAngleEv kind:function(arm,size=0x24) addr:0x20b02c8 _ZN13PlayerControl18func_ov00_020b034cEv kind:function(arm,size=0xcc) addr:0x20b02ec @@ -2479,7 +2479,7 @@ _ZN13ActorNaviBase8vfunc_84Ev kind:function(arm,size=0x18) addr:0x20ba574 _ZN13ActorNaviBase8vfunc_78Ev kind:function(arm,size=0x288) addr:0x20ba58c _ZN13ActorNaviBase8vfunc_bcEici kind:function(arm,size=0x400) addr:0x20ba814 _ZN13ActorNaviBase8vfunc_74Ev kind:function(arm,size=0x34) addr:0x20bac14 -_ZN13ActorNaviBase19func_ov000_020baca8EP5Vec3pi kind:function(arm,size=0x70) addr:0x20bac48 +_ZN13ActorNaviBase19func_ov000_020baca8EP8Cylinderi kind:function(arm,size=0x70) addr:0x20bac48 _ZN13ActorNaviBase19func_ov000_020bad18Ev kind:function(arm,size=0x2c) addr:0x20bacb8 _ZN13ActorNaviBase8vfunc_90Ev kind:function(arm,size=0x224) addr:0x20bace4 _ZN13ActorNaviBase8vfunc_94Ev kind:function(arm,size=0x144) addr:0x20baf08 diff --git a/config/usa/arm9/overlays/ov024/symbols.txt b/config/usa/arm9/overlays/ov024/symbols.txt index 2ab381dd..39e1c794 100644 --- a/config/usa/arm9/overlays/ov024/symbols.txt +++ b/config/usa/arm9/overlays/ov024/symbols.txt @@ -286,7 +286,7 @@ func_ov024_02178204 kind:function(arm,size=0x30) addr:0x2178164 func_ov024_02178234 kind:function(arm,size=0xec) addr:0x2178194 func_ov024_02178320 kind:function(arm,size=0x20) addr:0x2178280 func_ov024_02178340 kind:function(arm,size=0x8) addr:0x21782a0 -func_ov024_02178348 kind:function(arm,size=0x358) addr:0x21782a8 +_ZN13PlayerControl19func_ov024_02178348EP5Vec3p kind:function(arm,size=0x358) addr:0x21782a8 func_ov024_021786a0 kind:function(arm,size=0x10) addr:0x2178600 func_ov024_021786b0 kind:function(arm,size=0x30) addr:0x2178610 func_ov024_021786e0 kind:function(arm,size=0x20) addr:0x2178640 diff --git a/include/Actor/Navi/ActorNaviBase.hpp b/include/Actor/Navi/ActorNaviBase.hpp index 95a34c6c..1571fdc0 100644 --- a/include/Actor/Navi/ActorNaviBase.hpp +++ b/include/Actor/Navi/ActorNaviBase.hpp @@ -97,7 +97,7 @@ public: bool func_ov000_020ba458(); void func_ov000_020ba4e4(); void func_ov000_020ba53c(); - void func_ov000_020baca8(Vec3p *param1, unk32 param2); + void func_ov000_020baca8(Cylinder *param1, unk32 param2); void func_ov000_020bad18(); static void func_ov000_020bb0ac(); static void func_ov000_020bb0e0(); diff --git a/include/Player/PlayerControl.hpp b/include/Player/PlayerControl.hpp index 1bfdd833..c11ad0ce 100644 --- a/include/Player/PlayerControl.hpp +++ b/include/Player/PlayerControl.hpp @@ -59,7 +59,7 @@ public: /* 94 */ ActorRef mLastFollowRef; /* 9c */ Vec2b mUnk_9c; /* 9e */ unk8 mUnk_9e[2]; - /* a0 */ void *mFollowActor; + /* a0 */ void *mFollowObject; /* a4 */ q20 mFollowDist; /* a8 */ u16 mFollowStuckTimer; /* aa */ s16 mCutsceneEndTimer; @@ -98,8 +98,8 @@ public: bool func_ov00_020afeec(unk32 param1, bool param2); void func_ov00_020aff90(Cylinder *param1, unk32 param2); void func_ov00_020affec(Vec3p *param1, s32 y, s32 param3, Vec3p *param4); - void func_ov00_020b014c(); - void SetAim(); + void func_ov00_020b014c(Vec3p *param1); + void ResetAim(); bool UpdateAimWorld(Vec3p *param1); s16 GetTouchAngle(); u32 func_ov00_020b034c(); @@ -137,6 +137,8 @@ public: void Init(); void func_ov004_0210b1d0(); static void func_ov004_0210b1f0(); + + bool func_ov024_02178348(Vec3p *param1); }; extern PlayerControl *gPlayerControl; diff --git a/include/Player/PlayerControlData.hpp b/include/Player/PlayerControlData.hpp index 3527810c..cdcd8db8 100644 --- a/include/Player/PlayerControlData.hpp +++ b/include/Player/PlayerControlData.hpp @@ -87,8 +87,8 @@ public: /* 68 */ virtual void vfunc_68(unk32 param1, unk32 param2); /* 6c */ virtual void vfunc_6c(s32 param1, Vec3p *param2); /* 70 */ virtual void vfunc_70(s32 param1); - /* 74 */ virtual unk32 vfunc_74(); - /* 78 */ virtual unk32 vfunc_78(); + /* 74 */ virtual unk32 vfunc_74(s32 param1); + /* 78 */ virtual unk32 vfunc_78(s32 param1); /* 7c */ virtual unk32 vfunc_7c(); /* 80 */ @@ -105,3 +105,5 @@ public: PlayerControlData(); }; + +extern PlayerControlData *gPlayerControlData; diff --git a/src/00_Core/Actor/Navi/ActorNaviBase.cpp b/src/00_Core/Actor/Navi/ActorNaviBase.cpp index 677d677b..242fe27a 100644 --- a/src/00_Core/Actor/Navi/ActorNaviBase.cpp +++ b/src/00_Core/Actor/Navi/ActorNaviBase.cpp @@ -37,7 +37,7 @@ void ActorNaviBase::vfunc_84() {} bool ActorNaviBase::vfunc_78() {} bool ActorNaviBase::vfunc_bc(unk32 param1, unk8 param2, s32 param3) {} void ActorNaviBase::vfunc_74() {} -void ActorNaviBase::func_ov000_020baca8(Vec3p *param1, unk32 param2) {} +void ActorNaviBase::func_ov000_020baca8(Cylinder *param1, unk32 param2) {} void ActorNaviBase::func_ov000_020bad18() {} bool ActorNaviBase::vfunc_90() {} void ActorNaviBase::vfunc_94() {} diff --git a/src/00_Core/Player/PlayerControl.cpp b/src/00_Core/Player/PlayerControl.cpp index 79b0b4ef..0cf8d23a 100644 --- a/src/00_Core/Player/PlayerControl.cpp +++ b/src/00_Core/Player/PlayerControl.cpp @@ -78,8 +78,8 @@ ARM void PlayerControl::SetUnk_80() { ARM void PlayerControl::StopFollowing() { mFollowRef.Reset(); - mFollowing = false; - mFollowActor = NULL; + mFollowing = false; + mFollowObject = NULL; } ARM void PlayerControl::func_ov00_020af06c() { @@ -442,13 +442,13 @@ ARM void PlayerControl::func_ov00_020afb6c() { } if (!mFollowing) { - mFollowActor = NULL; + mFollowObject = NULL; } else { - mFollowActor = (void *) gMapManager->MapData_vfunc_78(); + mFollowObject = (void *) gMapManager->MapData_vfunc_78(); Vec3p local_3c; s32 iVar2; s32 iVar7; - if (mFollowActor == NULL) { + if (mFollowObject == NULL) { local_3c.y = gPlayerPos.y; Vec2b local_44 = mUnk_9c; gMapManager->func_ov00_02083c7c(&local_3c, local_44); @@ -459,15 +459,168 @@ ARM void PlayerControl::func_ov00_020afb6c() { } } -bool PlayerControl::func_ov00_020afe88(s32 param1, bool param2) {} -bool PlayerControl::func_ov00_020afeec(unk32 param1, bool param2) {} -void PlayerControl::func_ov00_020aff90(Cylinder *param1, unk32 param2) {} -void PlayerControl::func_ov00_020affec(Vec3p *param1, s32 y, s32 param3, Vec3p *param4) {} -void PlayerControl::func_ov00_020b014c() {} -void PlayerControl::SetAim() {} -bool PlayerControl::UpdateAimWorld(Vec3p *param1) {} -s16 PlayerControl::GetTouchAngle() {} -u32 PlayerControl::func_ov00_020b034c() {} +ARM bool PlayerControl::func_ov00_020afe88(s32 param1, bool param2) { + if (!mUnk_7d || !gPlayerControlData->vfunc_74(param1)) { + return false; + } + if (!param2) { + return true; + } + return param1 == 2 || param1 == 6; +} + +ARM bool PlayerControl::func_ov00_020afeec(unk32 param1, bool param2) { + if (!mUnk_7d) { + return false; + } + if (!gPlayerControlData->vfunc_78(param1)) { + return false; + } + switch (param1) { + case 1: + case 2: + case 7: + case 13: return true; + + case 10: + case 11: return param2; + + default: return !param2; + } +} + +ARM void PlayerControl::func_ov00_020aff90(Cylinder *param1, unk32 param2) { + if (data_027e0d38->func_ov000_02078b40() == 2) { + return; + } + ItemManager *itemMgr = gItemManager; + FairyId fairyId = itemMgr->GetEquippedFairy(); + ActorNaviBase *fairy = itemMgr->GetFairy(fairyId); + if (fairy == NULL) { + return; + } + fairy->func_ov000_020baca8(param1, param2); +} + +ARM void PlayerControl::func_ov00_020affec(Vec3p *param1, s32 y, s32 param3, Vec3p *param4) { + if (mUnk_44.x != 0 || mUnk_44.z != 0) { + Vec3p local_24; + Vec3p_Axpy(y, &mUnk_44, &mTouchWorld, &local_24); + + Vec3p local_30; + local_30.x = param4->x - local_24.x; + local_30.y = 0; + local_30.z = param4->z - local_24.z; + q20 iVar2 = Vec3p_Length(&local_30); + if (iVar2 <= param3) { + *param1 = local_24; + return; + } + + Vec3p local_3c; + local_3c.x = mUnk_44.x; + local_3c.y = 0; + local_3c.z = mUnk_44.z; + q20 lengthInv = CoReciprocal(Vec3p_Length(&local_3c)); + local_3c.x = MUL_Q20(local_3c.x, lengthInv); + local_3c.z = MUL_Q20(local_3c.z, lengthInv); + iVar2 = Vec3p_Dot(&local_30, &local_3c); + + Vec3p local_48; + local_48.x = local_3c.x; + local_48.y = lengthInv; + local_48.z = local_3c.z; + Vec3p_Axpy(iVar2 - param3, &local_48, &local_24, param1); + return; + } + + param1->x = mTouchWorld.x; + param1->y = y; + param1->z = mTouchWorld.z; +} + +extern u32 data_ov000_020ee198; +extern u32 data_027e0f64; + +ARM void PlayerControl::func_ov00_020b014c(Vec3p *param1) { + if ((data_ov000_020ee198 & 1) == 0) { + data_ov000_020ee198 |= 1; + } + if (*(s32 *) (*(s32 *) (data_027e0f64 + 0x4) + 0x15c) == 0x16) { + return; + } + if (!this->func_ov00_020aeef8()) { + return; + } + if (mTouchDuration > 0) { + ItemManager *itemMgr = gItemManager; + FairyId fairyId = itemMgr->GetEquippedFairy(); + ActorNaviBase *fairy = itemMgr->GetFairy(fairyId); + if (fairy != NULL) { + Vec3p auStack_1c; + this->func_ov00_020affec(&auStack_1c, FLOAT_TO_Q20(0.5), FLOAT_TO_Q20(8.0), param1); + fairy->func_ov000_020ba204(&auStack_1c, &mUnk_44, mTouchWorld.y + FLOAT_TO_Q20(4.2)); + } + } +} + +ARM void PlayerControl::ResetAim() { + mAim = gVec3p_ZERO; +} + +extern "C" s32 func_ov000_020a5e9c(unk32 param1); + +ARM bool PlayerControl::UpdateAimWorld(Vec3p *param1) { + Vec3p pos; + pos = gPlayerPos; + + s32 iVar2 = func_ov000_020a5e9c(data_027e0d38->mUnk_0c); + if (iVar2 == 0x2f && *(s32 *) (*(s32 *) (data_027e0f64 + 0x4) + 0x15c) == 0x31) { + return this->func_ov024_02178348(param1); + } + + if (this->CheckTouching(1)) { + this->func_ov00_020affec(param1, 0, FLOAT_TO_Q20(8.0), &pos); + mAimWorld = *param1; + return true; + } + *param1 = mAimWorld; + return false; +} + +ARM s16 PlayerControl::GetTouchAngle() { + if (mTouchDuration >= 0) { + return mTouchAngle; + } + if (!mUnk_7f) { + return 0; + } + return mUnk_ac; +} + +const q20 data_ov000_020e6144 = FLOAT_TO_Q20(80.0); + +ARM u32 PlayerControl::func_ov00_020b034c() { + if (mTouchDuration >= 0 && this->func_ov00_020af2d4(1, true)) { + q20 uVar5 = func_01ff992c(data_ov000_020e6144); + s64 lVar1 = mTouchDist * uVar5; + if (mTouchDuration < 4) { + lVar1 -= (4 - mTouchDuration) * FLOAT_TO_Q20(1.0); + } + if (lVar1 < 0) { + return 0; + } + if (lVar1 > FLOAT_TO_Q20(1.0)) { + return FLOAT_TO_Q20(1.0); + } + return lVar1; + } + if (!mUnk_7f && (data_027e05f8.mUnk_0 & 0xf0) != 0) { + return FLOAT_TO_Q20(1.0); + } + return 0; +} + s32 PlayerControl::func_ov00_020b0418() {} bool PlayerControl::func_ov00_020b049c(Vec3p *param1, bool param2) {} bool PlayerControl::func_ov00_020b05e8(Vec3p *param1) {} diff --git a/src/00_Core/Player/PlayerControlData.cpp b/src/00_Core/Player/PlayerControlData.cpp index 50e6c853..1485048a 100644 --- a/src/00_Core/Player/PlayerControlData.cpp +++ b/src/00_Core/Player/PlayerControlData.cpp @@ -18,8 +18,8 @@ void PlayerControlData::vfunc_2c() {} void PlayerControlData::vfunc_30() {} void PlayerControlData::vfunc_34() {} unk32 PlayerControlData::vfunc_7c() {} -unk32 PlayerControlData::vfunc_74() {} -unk32 PlayerControlData::vfunc_78() {} +unk32 PlayerControlData::vfunc_74(s32 param1) {} +unk32 PlayerControlData::vfunc_78(s32 param1) {} void PlayerControlData::func_ov000_020b484c(s32 param1, s32 param2, s32 param3) {} void PlayerControlData::vfunc_6c(s32 param1, Vec3p *param2) {} void PlayerControlData::vfunc_5c() {}