From c81b52be8649fa4569ff404b3f33beba9686c1f6 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Sat, 8 Feb 2025 19:30:22 +0100 Subject: [PATCH] progress on ActorNaviBase.cpp --- config/eur/arm9/overlays/ov000/symbols.txt | 4 +- config/usa/arm9/overlays/ov000/symbols.txt | 4 +- include/Actor/Navi/ActorNavi.hpp | 12 +- include/Actor/Navi/ActorNaviBase.hpp | 2 +- include/Item/ItemManager.hpp | 2 + include/Map/MapManager.hpp | 2 +- include/Player/EquipHammer.hpp | 4 + src/00_Core/Actor/Navi/ActorNaviBase.cpp | 2 +- src/59_Hammer/Actor/Navi/ActorNaviBase.cpp | 310 ++++++++++++++++++++- src/59_Hammer/Player/EquipHammer.cpp | 3 +- src/ITCM/Map/MapManager.cpp | 2 +- 11 files changed, 327 insertions(+), 20 deletions(-) diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 4279427d..e62ed97a 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -2421,7 +2421,7 @@ func_ov000_020b849c kind:function(arm,size=0x34) addr:0x20b849c func_ov000_020b84d0 kind:function(arm,size=0x8) addr:0x20b84d0 func_ov000_020b84d8 kind:function(arm,size=0x54) addr:0x20b84d8 func_ov000_020b852c kind:function(arm,size=0x10) addr:0x20b852c -func_ov000_020b853c kind:function(arm,size=0x14) addr:0x20b853c +_ZN9ActorNavi19func_ov000_020b853cEv kind:function(arm,size=0x14) addr:0x20b853c func_ov000_020b8550 kind:function(arm,size=0x48) addr:0x20b8550 func_ov000_020b8598 kind:function(arm,size=0x40) addr:0x20b8598 func_ov000_020b85d8 kind:function(thumb,size=0x28) addr:0x20b85d8 @@ -2450,7 +2450,7 @@ _ZN13ActorNaviBase8vfunc_ccEPi kind:function(arm,size=0x2cc) addr:0x20b88c4 _ZN13ActorNaviBase12GetOffsetPosEP5Vec3p kind:function(arm,size=0x1c) addr:0x20b8b90 _ZN13ActorNaviBase8vfunc_38Ev kind:function(arm,size=0x18) addr:0x20b8bac _ZN13ActorNaviBase8vfunc_d0Ev kind:function(arm,size=0x8c) addr:0x20b8bc4 -_ZN13ActorNaviBase19func_ov000_020b8c50Ev kind:function(arm,size=0x48) addr:0x20b8c50 +_ZN13ActorNaviBase19func_ov000_020b8c50Ei kind:function(arm,size=0x48) addr:0x20b8c50 _ZN13ActorNaviBase19func_ov000_020b8c98Eiii kind:function(arm,size=0x9c) addr:0x20b8c98 _ZN13ActorNaviBase8vfunc_d4Ev kind:function(arm,size=0x444) addr:0x20b8d34 _ZN13ActorNaviBase8vfunc_d8Ev kind:function(arm,size=0x4) addr:0x20b9178 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index bee557ee..59c770c6 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -2421,7 +2421,7 @@ func_ov000_020b849c kind:function(arm,size=0x34) addr:0x20b843c func_ov000_020b84d0 kind:function(arm,size=0x8) addr:0x20b8470 func_ov000_020b84d8 kind:function(arm,size=0x54) addr:0x20b8478 func_ov000_020b852c kind:function(arm,size=0x10) addr:0x20b84cc -func_ov000_020b853c kind:function(arm,size=0x14) addr:0x20b84dc +_ZN9ActorNavi19func_ov000_020b853cEv kind:function(arm,size=0x14) addr:0x20b84dc func_ov000_020b8550 kind:function(arm,size=0x48) addr:0x20b84f0 func_ov000_020b8598 kind:function(arm,size=0x40) addr:0x20b8538 func_ov000_020b85d8 kind:function(thumb,size=0x28) addr:0x20b8578 @@ -2450,7 +2450,7 @@ _ZN13ActorNaviBase8vfunc_ccEPi kind:function(arm,size=0x2cc) addr:0x20b8864 _ZN13ActorNaviBase12GetOffsetPosEP5Vec3p kind:function(arm,size=0x1c) addr:0x20b8b30 _ZN13ActorNaviBase8vfunc_38Ev kind:function(arm,size=0x18) addr:0x20b8b4c _ZN13ActorNaviBase8vfunc_d0Ev kind:function(arm,size=0x8c) addr:0x20b8b64 -_ZN13ActorNaviBase19func_ov000_020b8c50Ev kind:function(arm,size=0x48) addr:0x20b8bf0 +_ZN13ActorNaviBase19func_ov000_020b8c50Ei kind:function(arm,size=0x48) addr:0x20b8bf0 _ZN13ActorNaviBase19func_ov000_020b8c98Eiii kind:function(arm,size=0x9c) addr:0x20b8c38 _ZN13ActorNaviBase8vfunc_d4Ev kind:function(arm,size=0x444) addr:0x20b8cd4 _ZN13ActorNaviBase8vfunc_d8Ev kind:function(arm,size=0x4) addr:0x20b9118 diff --git a/include/Actor/Navi/ActorNavi.hpp b/include/Actor/Navi/ActorNavi.hpp index 5604893c..c2504f50 100644 --- a/include/Actor/Navi/ActorNavi.hpp +++ b/include/Actor/Navi/ActorNavi.hpp @@ -7,20 +7,22 @@ public: /* 294 */ ModelRender mUnk_294; /* 2f0 */ void *mUnk_2f0; /* 2f4 */ unk8 mUnk_2f4[0x40]; - /* 334 */ unk32 mUnk_334; - /* 338 */ unk32 mUnk_338; - /* 33c */ unk32 mUnk_33c; + /* 334 */ Vec3p mUnk_334; /* 340 */ unk16 mUnk_340; /* 342 */ unk8 mUnk_342[0x2]; - /* 344 */ unk32 mUnk_344; + /* 344 */ u32 mUnk_344; /* 348 */ unk32 mUnk_348; - /* 34c */ unk8 mUnk_34c[0x68]; + /* 34c */ unk8 mUnk_34c[0x38]; + /* 384 */ Mat3p mUnk_384; + /* 3a8 */ unk8 mUnk_3a8[0xC]; /* 3b4 */ EquipHammer *mHammer; /* 3b8 */ unk32 mUnk_3b8; /* 3bc */ unk32 mUnk_3bc; /* 3c0 */ u8 mUnk_3c0[0x8]; /* 3c8 */ + void func_ov000_020b853c(void); + bool func_ov059_0219933c(u32 param1); void func_ov059_0219a0ac(); void func_ov059_0219aa08(); diff --git a/include/Actor/Navi/ActorNaviBase.hpp b/include/Actor/Navi/ActorNaviBase.hpp index 7df4559f..27e12ef2 100644 --- a/include/Actor/Navi/ActorNaviBase.hpp +++ b/include/Actor/Navi/ActorNaviBase.hpp @@ -70,7 +70,7 @@ public: /* ec */ virtual void vfunc_ec(); /* f0 */ - void func_ov000_020b8c50(); + void func_ov000_020b8c50(unk32); void func_ov000_020b8c98(unk32 param1, unk32 param2, unk32 param3); void TeleportAboveLink(); void func_ov000_020b9770(s32 param1); diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index 3d5340ce..7f9f48f8 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -215,6 +215,8 @@ public: // Unknown void func_ov00_020ae4dc(s32 param1); + void func_ov000_020c0c44(void*); + void func_ov000_020c0e5c(void*, unk32); }; extern ItemManager *gItemManager; diff --git a/include/Map/MapManager.hpp b/include/Map/MapManager.hpp index 346d43d8..59506f33 100644 --- a/include/Map/MapManager.hpp +++ b/include/Map/MapManager.hpp @@ -41,7 +41,7 @@ public: /* 10 */ bool func_01ffbe78(Vec3p *param1, Vec3p *param2, Vec3p *param3, Vec4p *param4); - bool func_01ffbf5c(s32 param1, Vec3p *param2, Vec3p *param3, s32 length); + bool func_01ffbf5c(struct UnkStruct* param1, Vec3p *param2, Vec3p *param3, s32 length); bool func_01ffc118(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7); bool func_01ffd1e0(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7); diff --git a/include/Player/EquipHammer.hpp b/include/Player/EquipHammer.hpp index 187100be..65fa2024 100644 --- a/include/Player/EquipHammer.hpp +++ b/include/Player/EquipHammer.hpp @@ -55,6 +55,10 @@ public: return mState; } + inline bool IsReleased(void) { + return mIsReleased; + } + inline unk32 GetChargeTimer(void) { return mChargeTimer; } diff --git a/src/00_Core/Actor/Navi/ActorNaviBase.cpp b/src/00_Core/Actor/Navi/ActorNaviBase.cpp index 0c681c70..39eb0bb5 100644 --- a/src/00_Core/Actor/Navi/ActorNaviBase.cpp +++ b/src/00_Core/Actor/Navi/ActorNaviBase.cpp @@ -8,7 +8,7 @@ bool ActorNaviBase::vfunc_cc(unk32 *param1) {} void ActorNaviBase::GetOffsetPos(Vec3p *pos) {} unk32 ActorNaviBase::vfunc_38() {} void ActorNaviBase::vfunc_d0() {} -void ActorNaviBase::func_ov000_020b8c50() {} +void ActorNaviBase::func_ov000_020b8c50(unk32) {} void ActorNaviBase::func_ov000_020b8c98(unk32 param1, unk32 param2, unk32 param3) {} void ActorNaviBase::vfunc_d4() {} void ActorNaviBase::vfunc_d8() {} diff --git a/src/59_Hammer/Actor/Navi/ActorNaviBase.cpp b/src/59_Hammer/Actor/Navi/ActorNaviBase.cpp index f272c4e0..14f6cab8 100644 --- a/src/59_Hammer/Actor/Navi/ActorNaviBase.cpp +++ b/src/59_Hammer/Actor/Navi/ActorNaviBase.cpp @@ -1,17 +1,317 @@ #include "Actor/Navi/ActorNaviBase.hpp" #include "Actor/Navi/ActorNavi.hpp" #include "Player/PlayerControl.hpp" +#include "Player/PlayerBase.hpp" +#include "Player/LinkStateItem.hpp" #include "Item/ItemManager.hpp" +#include "Map/MapManager.hpp" +#include "DTCM/UnkStruct_027e0fd4.hpp" + +extern unk32 data_ov000_020dc7d0; +extern unk32 data_ov000_020dc7e4; +extern u32 data_ov000_020e9370[]; +extern "C" void Vec3p_RotateY(u32, Vec3p*); +extern "C" void func_ov005_02102c2c(u32 *param_1, int param_2, Vec3p *param_3, int param_4, int param_5, u32 param_6, int param_7, + char param_8, char param_9, char param_10); ARM bool ActorNavi::func_ov059_0219933c(u32 param1) {} ARM void ActorNavi::func_ov059_0219a0ac() {} -ARM void ActorNavi::func_ov059_0219aa08() {} -ARM void ActorNavi::func_ov059_0219aba8(u32 param1) {} -ARM bool ActorNavi::func_ov059_0219af14() {} -ARM bool ActorNavi::func_ov059_0219afc4() {} + +// non-matching +ARM void ActorNavi::func_ov059_0219aa08() { + int iVar1; + s64 lVar2; + u16 uVar3; + u32 uVar4; + Vec3p VStack_60; + Vec3p uStack_54; + Mat3p MStack_48; + Vec3p VStack_24; + + if (this->mUnk_3c0[0] != 0) { + VStack_24.x = this->mPos.x; + VStack_24.y = this->mPos.y + 0x333; // FLOAT_TO_Q20(0.2)? + VStack_24.z = this->mPos.z; + + uVar3 = this->mUnk_340 - 0x4000; // FLOAT_TO_Q20(12.0)? + Mat3p_InitYRotation(&MStack_48, SIN(uVar3), COS(uVar3)); + + uStack_54.x = uStack_54.y = uStack_54.z = this->mUnk_344; + this->mUnk_294.vfunc_38(); + this->mUnk_294.SetTransform(&uStack_54, &MStack_48, &VStack_24); + lVar2 = 0x666 * this->mUnk_344; + uVar4 = lVar2; + + this->mUnk_334.x = ROUND_Q20(uVar4) | + ((this->mUnk_344 >> 0x1F) * 0x666 + (lVar2 >> 0x20) + (~0x800 < uVar4)) * 0x100000; + + Mat3p_MultiplyVec(&this->mUnk_334, &this->mUnk_384, &this->mUnk_334); + Vec3p_RotateY(uVar3, &this->mUnk_334); + Vec3p_Add(&this->mUnk_334, &VStack_24, &this->mUnk_334); + VStack_60.z = this->mUnk_334.z; + VStack_60.x = this->mUnk_334.x; + lVar2 = 0x333 * this->mUnk_344; + uVar4 = lVar2; + VStack_60.y = this->mUnk_334.y + 0x800; + uVar4 = ROUND_Q20(uVar4) | + ((this->mUnk_344 >> 0x1F) * 0x333 + (lVar2 >> 0x20) + (~0x800 < uVar4)) * 0x100000; + func_ov005_02102c2c(&data_ov000_020e9370[0], 0, &VStack_60, uVar4, uVar4, 0, 0x10, 0, 0, 0); + } +} + +struct UnkStruct { + /* 00 */ u16 mUnk_00; + /* 02 */ unk16 mUnk_02; + /* 04 */ unk16 mUnk_04; + /* 06 */ unk16 mUnk_06; + /* 08 */ unk16 mUnk_08; + /* 09 */ unk8 mUnk_09; + /* 0a */ unk8 mUnk_0a; + /* 0b */ unk8 mUnk_0b; + /* 0c */ unk8 mUnk_0c; + /* 0d */ unk8 mUnk_0d; + /* 0e */ unk8 mUnk_0e; + /* 0f */ unk8 mUnk_0f; + /* 10 */ unk8 mUnk_10; + /* 11 */ unk8 mUnk_11; + /* 12 */ unk8 mUnk_12; + /* 13 */ unk8 mUnk_13; + /* 14 */ Vec3p mUnk_14; + /* 14 */ unk8 mUnk_20[4]; + /* 24 */ +}; + +// non-matching +ARM void ActorNavi::func_ov059_0219aba8(u32 param1) { + bool bVar1; + LinkStateItem *uVar1; + ItemManager *pIVar3; + int uVar4; + int iVar5; + int uVar6; + bool bVar7; + Vec3p local_134; + Vec3p local_128; + Vec3p local_11c; + Vec3p local_110; + Vec3p local_104; + Vec3p local_e4; + + UnkStruct auStack_e0; + u16 local_bc; + unk16 local_ba; + unk16 local_b8; + unk16 local_b6; + unk16 local_b4; + unk32 local_92; + unk32 local_91; + unk32 local_90; + unk32 local_8f; + unk32 local_88; + unk32 local_87; + unk32 local_86; + unk32 local_85; + unk32 local_84; + unk32 local_83; + UnkStruct auStack_80; + u16 local_5c; + unk16 local_5a; + unk16 local_58; + unk16 local_56; + unk16 local_54; + unk32 local_32; + unk32 local_31; + unk32 local_30; + unk32 local_2f; + unk32 local_28; + unk32 local_27; + unk32 local_26; + unk32 local_25; + unk32 local_24; + unk32 local_23; + ItemManager *puVar1; + + switch (param1) { + case 3: + uVar1 = GetLinkStateItem(); + + if (uVar1->mUnk_25[2] != 0 && uVar1->mUnk_25[3] != 0) { + break; + } + + local_11c.x = data_027e0fd4->mUnk_020.pos.x; + local_11c.z = data_027e0fd4->mUnk_020.pos.z; + + iVar5 = gPlayerPos.y + FLOAT_TO_Q20(0.5); + uVar4 = this->mPos.x; + uVar6 = this->mPos.z; + + auStack_80.mUnk_00 = -1; + auStack_80.mUnk_02 = 0; + auStack_80.mUnk_04 = 0; + auStack_80.mUnk_06 = 0; + auStack_80.mUnk_08 = 0; + auStack_80.mUnk_09 = 0; + auStack_80.mUnk_0a = 0; + auStack_80.mUnk_0b = 0; + auStack_80.mUnk_0c = 0; + auStack_80.mUnk_0d = 0; + auStack_80.mUnk_0e = 0; + auStack_80.mUnk_0f = 0; + auStack_80.mUnk_10 = 0; + auStack_80.mUnk_11 = 0; + auStack_80.mUnk_12 = 0; + local_11c.y = iVar5; + + local_110.x = uVar4; + local_110.y = iVar5; + // local_110.z = uVar6; + + local_e4.x = local_11c.x; + local_e4.y = iVar5; + local_e4.z = local_11c.z; + + local_5a = local_5c; + local_58 = local_5c; + local_56 = local_5c; + + if (gMapManager->func_01ffbf5c(&auStack_80, &local_110, &local_11c, this->mUnk_08c.size) ? false : true) { + this->mPos = local_e4; + this->mPrevPos = local_e4; + this->mUnk_158 = local_e4; + } else { + this->mUnk_158.x = uVar4; + this->mUnk_158.y = iVar5; + this->mUnk_158.z = uVar6; + } + break; + case 4: + uVar1 = GetLinkStateItem(); + + if (uVar1->mUnk_25[2] != 0 && uVar1->mUnk_25[3] != 0) { + break; + } + + auStack_e0.mUnk_14.x = data_027e0fd4->mUnk_020.pos.x; + auStack_e0.mUnk_14.y = gPlayerPos.y + FLOAT_TO_Q20(0.5); + auStack_e0.mUnk_14.z = data_027e0fd4->mUnk_020.pos.z; + + bVar1 = gPlayerControl->UpdateAimWorld(&local_104); + bVar7 = false; + local_104.y = auStack_e0.mUnk_14.y; + auStack_80.mUnk_00 = -1; + auStack_80.mUnk_02 = 0; + auStack_80.mUnk_04 = 0; + auStack_80.mUnk_06 = 0; + auStack_80.mUnk_08 = 0; + auStack_80.mUnk_09 = 0; + auStack_80.mUnk_0a = 0; + auStack_80.mUnk_0b = 0; + auStack_80.mUnk_0c = 0; + auStack_80.mUnk_0d = 0; + auStack_80.mUnk_0e = 0; + auStack_80.mUnk_0f = 0; + auStack_80.mUnk_10 = 0; + auStack_80.mUnk_11 = 0; + auStack_80.mUnk_12 = 0; + local_ba = local_bc; + local_b8 = local_bc; + local_b6 = local_bc; + + if (bVar1) { + local_128 = auStack_e0.mUnk_14; + + // local_134.x = local_104.x; + // local_134.y = auStack_e0.mUnk_14.y; + // local_134.z = local_104.z; + + if (!gMapManager->func_01ffbf5c(&auStack_e0, &local_134, &local_128, this->mUnk_08c.size)) { + bVar7 = true; + } + } + + if (!bVar7) { + this->mPos = auStack_e0.mUnk_14; + this->mPrevPos = auStack_e0.mUnk_14; + this->mUnk_158 = auStack_e0.mUnk_14; + } + break; + default: + this->func_ov000_020b853c(); + break; + } + + pIVar3 = gItemManager; + switch (param1) { + case 3: + pIVar3->func_ov00_020ad538(data_ov000_020dc7d0); + pIVar3->func_ov000_020c0c44(&this->mUnk_2f0); + pIVar3->func_ov000_020c0e5c(&this->mUnk_2f0, 0); + break; + case 4: + this->mUnk_348 = 0; + pIVar3->func_ov00_020ad538(data_ov000_020dc7e4); + pIVar3->func_ov000_020c0c44(&this->mUnk_2f0); + pIVar3->func_ov000_020c0e5c(&this->mUnk_2f0, 1); + break; + default: + break; + } +} + +ARM bool ActorNavi::func_ov059_0219af14() { + int iVar1; + + if (this->mUnk_3c0[2] != 0) { + return false; + } + + iVar1 = this->mUnk_130; + + switch (this->mUnk_130) { + case 3: + if (this->mUnk_348 > 0) { + this->mVel.x = 0; + this->mVel.y = 0; + this->mVel.z = 0; + this->mUnk_348--; + return true; + } + break; + case 4: + if (this->mHammer->IsReleased()) { + this->mVel.y = this->mUnk_158.y - this->mPos.y; + return true; + } else { + this->func_ov000_020b8c50(0x3000); + this->mVel.y = this->mUnk_158.y - this->mPos.y; + return true; + } + default: + break; + } + + return false; +} + +ARM bool ActorNavi::func_ov059_0219afc4() { + this->mUnk_3c0[2] = 0; + this->func_ov059_0219933c(0); + + switch (this->mUnk_130) { + case 3: + this->mUnk_158.y = gPlayerPos.y + 0x1666; + return true; + case 4: + return true; + default: + break; + } + + return false; +} ARM void ActorNavi::func_ov059_0219b020() { - if (gItemManager->GetEquippedFairy() != FairyId_Courage) { ItemManager* itemMgr = gItemManager; diff --git a/src/59_Hammer/Player/EquipHammer.cpp b/src/59_Hammer/Player/EquipHammer.cpp index 806544e1..b126f292 100644 --- a/src/59_Hammer/Player/EquipHammer.cpp +++ b/src/59_Hammer/Player/EquipHammer.cpp @@ -8,7 +8,6 @@ #include "Player/PlayerLink.hpp" extern "C" void ApproachAngle_thunk(s16 *src, s16 dst, u32 param3); -extern "C" void func_ov000_020b853c(ActorNavi *); struct EquipHammer_UnkStruct { /* 00 */ unk8 mUnk_00[0x20]; @@ -243,5 +242,5 @@ ARM EquipHammer *GetEquipHammer() { } ARM void LinkStateItem::StopUsingHammer() { - func_ov000_020b853c(gItemManager->GetFairy(FairyId_Courage)); + gItemManager->GetFairy(FairyId_Courage)->func_ov000_020b853c(); } diff --git a/src/ITCM/Map/MapManager.cpp b/src/ITCM/Map/MapManager.cpp index 1ed5d73e..befbe174 100644 --- a/src/ITCM/Map/MapManager.cpp +++ b/src/ITCM/Map/MapManager.cpp @@ -1,6 +1,6 @@ #include "Map/MapManager.hpp" bool MapManager::func_01ffbe78(Vec3p *param1, Vec3p *param2, Vec3p *param3, Vec4p *param4) {} -bool MapManager::func_01ffbf5c(s32 param1, Vec3p *param2, Vec3p *param3, s32 length) {} +bool MapManager::func_01ffbf5c(struct UnkStruct* param1, Vec3p *param2, Vec3p *param3, s32 length) {} bool MapManager::func_01ffc118(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7) {} bool MapManager::func_01ffd1e0(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7) {}