From 67e283c317aa62add14de6251c484187b7b5a275 Mon Sep 17 00:00:00 2001 From: Alessevan <44125445+Alessevan@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:21:20 +0200 Subject: [PATCH] Decompile ActorUnkATTG (99%) (#122) * feat: update * fix: regressions --- config/eur/arm9/overlays/ov031/delinks.txt | 1 + config/eur/arm9/overlays/ov031/relocs.txt | 2 +- config/eur/arm9/overlays/ov031/symbols.txt | 14 +-- config/jp/arm9/overlays/ov000/symbols.txt | 4 +- config/jp/arm9/overlays/ov031/delinks.txt | 1 + config/jp/arm9/overlays/ov031/relocs.txt | 2 +- config/jp/arm9/overlays/ov031/symbols.txt | 14 +-- include/Actor/ActorUnkATTG.hpp | 32 +++--- include/Unknown/Common.hpp | 8 +- src/031_Land/Actor/ActorUnkATTG.cpp | 119 +++++++++++++++++++-- 10 files changed, 146 insertions(+), 51 deletions(-) diff --git a/config/eur/arm9/overlays/ov031/delinks.txt b/config/eur/arm9/overlays/ov031/delinks.txt index 33c3b736..c96b7d0e 100644 --- a/config/eur/arm9/overlays/ov031/delinks.txt +++ b/config/eur/arm9/overlays/ov031/delinks.txt @@ -108,6 +108,7 @@ src/031_Land/Actor/ActorUnkATTG.cpp: .text start:0x020f3d7c end:0x020f409c .init start:0x02111598 end:0x021115e8 .ctor start:0x021127d8 end:0x021127dc + .data start:0x0211439c end:0x0211441c .bss start:0x02116abc end:0x02116b08 src/031_Land/Actor/ActorUnkNTTZ.cpp: diff --git a/config/eur/arm9/overlays/ov031/relocs.txt b/config/eur/arm9/overlays/ov031/relocs.txt index 02e9d6d7..4fea3f95 100644 --- a/config/eur/arm9/overlays/ov031/relocs.txt +++ b/config/eur/arm9/overlays/ov031/relocs.txt @@ -3055,7 +3055,7 @@ from:0x020f4130 kind:load to:0x02114438 add:0x8 module:overlay(31) from:0x020f4134 kind:load to:0x027e0ce0 module:dtcm from:0x020f4138 kind:load to:0x02110b70 module:overlay(31) from:0x020f413c kind:load to:0x020b1960 add:0x8 module:overlay(0) -from:0x020f4140 kind:load to:0x02114424 module:overlay(31) +from:0x020f4140 kind:load to:0x0211441c module:overlay(31) add:0x8 from:0x020f4154 kind:arm_call to:0x020f4790 module:overlay(31) from:0x020f4170 kind:arm_call to:0x020f5b7c module:overlay(31) from:0x020f41bc kind:arm_call_thumb to:0x0208ed30 module:overlay(0) diff --git a/config/eur/arm9/overlays/ov031/symbols.txt b/config/eur/arm9/overlays/ov031/symbols.txt index 0be6e5e5..ba1c04b4 100644 --- a/config/eur/arm9/overlays/ov031/symbols.txt +++ b/config/eur/arm9/overlays/ov031/symbols.txt @@ -936,10 +936,10 @@ _ZN19ActorProfileUnkATTG10GetProfileEv kind:function(arm,size=0xc) addr:0x020f3d _ZN19ActorProfileUnkATTG6CreateEv kind:function(arm,size=0x24) addr:0x020f3d88 _ZN19ActorProfileUnkATTGC1Ev kind:function(arm,size=0x28) addr:0x020f3dac _ZN12ActorUnkATTGC1Ev kind:function(arm,size=0x28) addr:0x020f3dd4 -_ZN12ActorUnkATTG19func_ov031_020f3dfcEv kind:function(arm,size=0x54) addr:0x020f3dfc -_ZN12ActorUnkATTG19func_ov031_020f3e50Ev kind:function(arm,size=0x5c) addr:0x020f3e50 -_ZN12ActorUnkATTG19func_ov031_020f3eacEv kind:function(arm,size=0x40) addr:0x020f3eac -_ZN12ActorUnkATTG19func_ov031_020f3eecEv kind:function(arm,size=0x128) addr:0x020f3eec +_ZN12ActorUnkATTG8vfunc_18Ei kind:function(arm,size=0x54) addr:0x020f3dfc +_ZN12ActorUnkATTG8vfunc_20Ev kind:function(arm,size=0x5c) addr:0x020f3e50 +_ZN12ActorUnkATTG8vfunc_24Ev kind:function(arm,size=0x40) addr:0x020f3eac +_ZN12ActorUnkATTG19func_ov031_020f3eecEsi kind:function(arm,size=0x128) addr:0x020f3eec _ZN12ActorUnkATTG19func_ov031_020f4014Ev kind:function(arm,size=0x44) addr:0x020f4014 _ZN12ActorUnkATTGD1Ev kind:function(arm,size=0x14) addr:0x020f4058 _ZN12ActorUnkATTGD0Ev kind:function(arm,size=0x1c) addr:0x020f406c @@ -2353,9 +2353,9 @@ _ZTV21ActorProfileShotArrow kind:data(any) addr:0x0211429c data_ov031_021142c0 kind:data(any) addr:0x021142c0 data_ov031_02114300 kind:data(any) addr:0x02114300 _ZTV14ActorShotArrow kind:data(any) addr:0x02114340 -_ZTV19data_ov031_0211439c kind:data(any) addr:0x0211439c -_ZTV19data_ov031_021143c0 kind:data(any) addr:0x021143c0 -data_ov031_02114424 kind:data(any) addr:0x02114424 +_ZTV19ActorProfileUnkATTG kind:data(any) addr:0x0211439c +_ZTV12ActorUnkATTG kind:data(any) addr:0x021143c0 +_ZTV19data_ov031_02114424 kind:data(any) addr:0x0211441c _ZTV19data_ov031_02114438 kind:data(any) addr:0x02114438 data_ov031_0211449c kind:data(any) addr:0x0211449c _ZTV19data_ov031_021144a0 kind:data(any) addr:0x021144a0 diff --git a/config/jp/arm9/overlays/ov000/symbols.txt b/config/jp/arm9/overlays/ov000/symbols.txt index 933f721d..c89a27af 100644 --- a/config/jp/arm9/overlays/ov000/symbols.txt +++ b/config/jp/arm9/overlays/ov000/symbols.txt @@ -1103,7 +1103,7 @@ func_ov000_020744fc kind:function(arm,size=0x114) addr:0x020744fc _ZN23UnkStruct_027e09ac_BaseC2Ev kind:function(arm,size=0x40) addr:0x02074610 func_ov000_02074650 kind:function(arm,size=0x24) addr:0x02074650 func_ov000_02074674 kind:function(arm,size=0x14) addr:0x02074674 -func_ov000_02074688 kind:function(arm,size=0xb0) addr:0x02074688 +func_ov000_02072fd0 kind:function(arm,size=0xb0) addr:0x02074688 func_ov000_02073080 kind:function(arm,size=0x2c) addr:0x02074738 _ZN17ActorUnk_vfunc_B0C1Ev kind:function(arm,size=0x58) addr:0x02074764 _ZN20stack_ov000_02073578C1Ev kind:function(arm,size=0x2c) addr:0x020747bc @@ -1228,7 +1228,7 @@ func_ov000_02078b38 kind:function(arm,size=0x10) addr:0x02078b38 _ZN19func_ov000_02078b48D1Ev kind:function(arm,size=0x14) addr:0x02078b48 _ZN19func_ov000_02078b5cD0Ev kind:function(arm,size=0x1c) addr:0x02078b5c func_ov000_02078b78 kind:function(arm,size=0xd0) addr:0x02078b78 -func_ov000_02078c48 kind:function(arm,size=0x48) addr:0x02078c48 +func_ov000_02077590 kind:function(arm,size=0x48) addr:0x02078c48 func_ov000_02078c90 kind:function(arm,size=0x60) addr:0x02078c90 func_ov000_02078cf0 kind:function(arm,size=0x3c) addr:0x02078cf0 _ZN21UnkStruct_027e09bc_0CC1Ei kind:function(arm,size=0x1bc) addr:0x02078d2c diff --git a/config/jp/arm9/overlays/ov031/delinks.txt b/config/jp/arm9/overlays/ov031/delinks.txt index 6516c2a1..722249ce 100644 --- a/config/jp/arm9/overlays/ov031/delinks.txt +++ b/config/jp/arm9/overlays/ov031/delinks.txt @@ -105,6 +105,7 @@ src/031_Land/Actor/ActorUnkATTG.cpp: .text start:0x020f5820 end:0x020f5b40 .init start:0x02113308 end:0x02113358 .ctor start:0x02114564 end:0x02114568 + .data start:0x0211613c end:0x021161bc .bss start:0x0211885c end:0x021188a8 src/031_Land/Actor/ActorUnkNTTZ.cpp: diff --git a/config/jp/arm9/overlays/ov031/relocs.txt b/config/jp/arm9/overlays/ov031/relocs.txt index 4c951a6f..8e383ba9 100644 --- a/config/jp/arm9/overlays/ov031/relocs.txt +++ b/config/jp/arm9/overlays/ov031/relocs.txt @@ -3060,7 +3060,7 @@ from:0x020f5bd4 kind:load to:0x021161d8 add:0x8 module:overlay(31) from:0x020f5bd8 kind:load to:0x027e0ce0 module:dtcm from:0x020f5bdc kind:load to:0x021128e0 module:overlay(31) from:0x020f5be0 kind:load to:0x020b3160 add:0x8 module:overlay(0) -from:0x020f5be4 kind:load to:0x021161c4 module:overlay(31) +from:0x020f5be4 kind:load to:0x021161bc module:overlay(31) add:0x8 from:0x020f5bf8 kind:arm_call to:0x020f6234 module:overlay(31) from:0x020f5c14 kind:arm_call to:0x020f761c module:overlay(31) from:0x020f5c60 kind:arm_call_thumb to:0x0209040c module:overlay(0) diff --git a/config/jp/arm9/overlays/ov031/symbols.txt b/config/jp/arm9/overlays/ov031/symbols.txt index f565e2de..f6beff85 100644 --- a/config/jp/arm9/overlays/ov031/symbols.txt +++ b/config/jp/arm9/overlays/ov031/symbols.txt @@ -936,10 +936,10 @@ _ZN19ActorProfileUnkATTG10GetProfileEv kind:function(arm,size=0xc) addr:0x020f58 _ZN19ActorProfileUnkATTG6CreateEv kind:function(arm,size=0x24) addr:0x020f582c _ZN19ActorProfileUnkATTGC1Ev kind:function(arm,size=0x28) addr:0x020f5850 _ZN12ActorUnkATTGC1Ev kind:function(arm,size=0x28) addr:0x020f5878 -_ZN12ActorUnkATTG19func_ov031_020f3dfcEv kind:function(arm,size=0x54) addr:0x020f58a0 -_ZN12ActorUnkATTG19func_ov031_020f3e50Ev kind:function(arm,size=0x5c) addr:0x020f58f4 -_ZN12ActorUnkATTG19func_ov031_020f3eacEv kind:function(arm,size=0x40) addr:0x020f5950 -_ZN12ActorUnkATTG19func_ov031_020f3eecEv kind:function(arm,size=0x128) addr:0x020f5990 +_ZN12ActorUnkATTG8vfunc_18Ei kind:function(arm,size=0x54) addr:0x020f58a0 +_ZN12ActorUnkATTG8vfunc_20Ev kind:function(arm,size=0x5c) addr:0x020f58f4 +_ZN12ActorUnkATTG8vfunc_24Ev kind:function(arm,size=0x40) addr:0x020f5950 +_ZN12ActorUnkATTG19func_ov031_020f3eecEsi kind:function(arm,size=0x128) addr:0x020f5990 _ZN12ActorUnkATTG19func_ov031_020f4014Ev kind:function(arm,size=0x44) addr:0x020f5ab8 _ZN12ActorUnkATTGD1Ev kind:function(arm,size=0x14) addr:0x020f5afc _ZN12ActorUnkATTGD0Ev kind:function(arm,size=0x1c) addr:0x020f5b10 @@ -2350,9 +2350,9 @@ _ZTV21ActorProfileShotArrow kind:data(any) addr:0x0211603c data_ov031_021142c0 kind:data(any) addr:0x02116060 data_ov031_02114300 kind:data(any) addr:0x021160a0 _ZTV14ActorShotArrow kind:data(any) addr:0x021160e0 -_ZTV19data_ov031_0211613c kind:data(any) addr:0x0211613c -_ZTV19data_ov031_02116160 kind:data(any) addr:0x02116160 -data_ov031_021161c4 kind:data(any) addr:0x021161c4 +_ZTV19ActorProfileUnkATTG kind:data(any) addr:0x0211613c +_ZTV12ActorUnkATTG kind:data(any) addr:0x02116160 +_ZTV19data_ov031_021161c4 kind:data(any) addr:0x021161bc _ZTV19data_ov031_021161d8 kind:data(any) addr:0x021161d8 data_ov031_0211623c kind:data(any) addr:0x0211623c _ZTV19data_ov031_02116240 kind:data(any) addr:0x02116240 diff --git a/include/Actor/ActorUnkATTG.hpp b/include/Actor/ActorUnkATTG.hpp index 385c698e..58e561e0 100644 --- a/include/Actor/ActorUnkATTG.hpp +++ b/include/Actor/ActorUnkATTG.hpp @@ -1,5 +1,3 @@ -//! TODO: This file was generated automatically and might contain errors - #pragma once #include "Actor/Actor.hpp" @@ -7,38 +5,34 @@ #include "global.h" #include "types.h" -class ActorUnkATTG_C4 : public Actor_C4 { -public: - ActorUnkATTG_C4(Actor *param1); - - /* 00 */ virtual bool vfunc_00(ActorRef ref, unk32 param2) override; - /* 04 */ virtual bool vfunc_04() override; - /* 08 */ virtual void vfunc_08() override; - /* 0C */ virtual void vfunc_0C(unk32 param1) override; +enum ActorUnkATTGState_ { + ActorUnkATTGState_0 = 0, + ActorUnkATTGState_1 = 1, + ActorUnkATTGState_2 = 2, + ActorUnkATTGState_MAX }; class ActorUnkATTG : public Actor { public: /* 00 (base) */ - /* 94 */ + /* 94 */ unk32 mUnk_94; + /* 98 */ ActorUnkATTG(); - /* 4C */ virtual ~ActorUnkATTG() override; - - void func_ov031_020f3dfc(void); - void func_ov031_020f3e50(void); - void func_ov031_020f3eac(void); - void func_ov031_020f3eec(void); - void func_ov031_020f4014(void); + /* 18 */ virtual bool vfunc_18(unk32 param1) override; + /* 20 */ virtual void vfunc_20() override; + /* 24 */ virtual void vfunc_24() override; + void func_ov031_020f3eec(ActorState state, unk32 param2); + bool func_ov031_020f4014(); }; class ActorProfileUnkATTG : public ActorProfile { public: /* 00 (base) */ + /* 3A */ ActorProfileUnkATTG(); - ~ActorProfileUnkATTG(); /* 0C */ virtual Actor *Create(); diff --git a/include/Unknown/Common.hpp b/include/Unknown/Common.hpp index bf0d59fa..45663ad3 100644 --- a/include/Unknown/Common.hpp +++ b/include/Unknown/Common.hpp @@ -902,10 +902,10 @@ struct UnkStackStruct1 { /* 1E */ unk16 mUnk_1E; /* 20 */ unk32 mUnk_20; /* 24 */ VecFx32 mUnk_24; - /* 30 */ unk16 mUnk_30; - /* 32 */ unk16 mUnk_32; - /* 34 */ unk16 mUnk_34; - /* 36 */ unk16 mUnk_36; + /* 30 */ u16 mUnk_30; + /* 32 */ u16 mUnk_32; + /* 34 */ u16 mUnk_34; + /* 36 */ u16 mUnk_36; /* 38 */ u16 mUnk_38; /* 3A */ unk8 mUnk_3A; /* 3B */ unk8 mUnk_3B; diff --git a/src/031_Land/Actor/ActorUnkATTG.cpp b/src/031_Land/Actor/ActorUnkATTG.cpp index 346273ce..c62c263e 100644 --- a/src/031_Land/Actor/ActorUnkATTG.cpp +++ b/src/031_Land/Actor/ActorUnkATTG.cpp @@ -1,7 +1,24 @@ -//! TODO: This file was generated automatically and might contain errors - #include "Actor/ActorUnkATTG.hpp" #include "System/SysNew.hpp" +#include "Unknown/UnkStruct_027e09b8.hpp" +#include "Unknown/UnkStruct_027e0cd8.hpp" +#include "Unknown/UnkStruct_ov000_020b5214.hpp" + +struct UnkStackStruct { + s16 mUnk_00; + s16 mUnk_02; + s16 mUnk_04; + s16 mUnk_06; + unk32 mUnk_08; + VecFx32 mUnk_0C; + u16 mUnk_18; + u16 mUnk_1A; + u16 mUnk_1C; + u16 mUnk_1E; +}; + +extern "C" void func_ov000_02072fd0(UnkStackStruct1 *); +extern "C" UnkStackStruct *func_ov000_02077590(unk32); DECL_PROFILE(ActorProfileUnkATTG); @@ -12,13 +29,95 @@ Actor *ActorProfileUnkATTG::Create() { ActorProfileUnkATTG::ActorProfileUnkATTG() : ActorProfile(ActorId_ATTG) {} -ActorUnkATTG::ActorUnkATTG() {} +ActorUnkATTG::ActorUnkATTG() : + mUnk_94(-0x1) {} -void ActorUnkATTG::func_ov031_020f3dfc(void) {} -void ActorUnkATTG::func_ov031_020f3e50(void) {} -void ActorUnkATTG::func_ov031_020f3eac(void) {} -void ActorUnkATTG::func_ov031_020f3eec(void) {} -void ActorUnkATTG::func_ov031_020f4014(void) {} +bool ActorUnkATTG::vfunc_18(unk32 param1) { + if (this->mUnk_5C.mUnk_1A[0] == 0x0 || !this->func_ov000_02098a60(0x0) || this->mUnk_5C.mParams[1] != 0x0) { + this->func_ov031_020f3eec(0x0, 0x1); + } else { + this->func_ov031_020f3eec(0x2, 0x1); + } + return true; +} -ActorUnkATTG::~ActorUnkATTG() {} -ActorProfileUnkATTG::~ActorProfileUnkATTG() {} +void ActorUnkATTG::vfunc_20() { + switch (this->mState) { + case ActorUnkATTGState_0: + if (!this->func_ov031_020f4014()) { + return; + } + if (this->mUnk_5C.mParams[1] != 0x0) { + return; + } + this->func_ov031_020f3eec(0x1, 0x0); + break; + case ActorUnkATTGState_1: + this->func_ov031_020f3eec(0x2, 0x0); + break; + default: + break; + } +} + +void ActorUnkATTG::vfunc_24() { + if (this->mUnk_94 < 0x0) { + return; + } + if (!data_027e09b8->func_ov000_020732ec(this->mUnk_94)) { + return; + } + this->vfunc_20(); +} + +void ActorUnkATTG::func_ov031_020f3eec(ActorState state, unk32 param2) { + this->mState = state; + switch (this->mState) { + case ActorUnkATTGState_1: + UnkStackStruct1 stack; + + func_ov000_02072fd0(&stack); + stack.mUnk_08 = 0x3C; + stack.mUnk_00 = 0x6C; + stack.mUnk_3A = 0x7; + + VecFx32_Copy(&this->mPos, &stack.mUnk_0C); + UnkStackStruct *r3 = func_ov000_02077590(0x1); + stack.mUnk_18 = r3->mUnk_00; + stack.mUnk_1A = r3->mUnk_02; + stack.mUnk_1C = r3->mUnk_04; + stack.mUnk_1E = r3->mUnk_06; + stack.mUnk_20 = r3->mUnk_08; + stack.mUnk_24 = r3->mUnk_0C; + + u16 unk_18 = r3->mUnk_18; + u16 unk_1A = r3->mUnk_1A; + stack.mUnk_30 = unk_18; + stack.mUnk_32 = unk_1A; + + u16 unk_1C = r3->mUnk_1C; + u16 unk_1E = r3->mUnk_1E; + stack.mUnk_34 = unk_1C; + stack.mUnk_36 = unk_1E; + + this->mUnk_94 = data_027e09b8->func_ov000_02073388(&stack, 0x0); + break; + case ActorUnkATTGState_2: + if (param2 == 0x0) { + data_ov000_020b5214.func_ov000_0206db44(0x2); + } + this->func_ov000_02098a88(0x0, 0x1); + this->func_ov000_020984d0(); + break; + default: + break; + } +} + +bool ActorUnkATTG::func_ov031_020f4014() { + unk32 param1 = this->mUnk_5C.mParams[0] & 0xFF; + UnkStruct_027e0cd8_0C_Base *ptr = data_027e0cd8->mUnk_0C; + VecFx32 *param2 = data_027e0ce0->func_01fff148(0x0); + + return ptr->func_ov000_020802ec(param1, param2); +}