From 26683f83c269d89f94fe4717e582fe77b41e48c4 Mon Sep 17 00:00:00 2001 From: Mityno <84503460+Mityno@users.noreply.github.com> Date: Mon, 29 Jun 2026 12:12:28 +0000 Subject: [PATCH] ActorUnkRMSD: Unify code structure between RMSX files (#94) * feat: Unify code structure to fit other RMSX files fix: Change type of ActorUnkRMSD.mUnk_158 that was too big to unk32 as placeholder * feat: Apply patch from Yanis Co-authored-by: Yanis <35189056+Yanis002@users.noreply.github.com> * fix: Update code to get rid of GetResource and use new function * Update src/063_Shrine/Actor/ActorUnkRMSD.cpp Co-authored-by: Yanis <35189056+Yanis002@users.noreply.github.com> * Merge branch 'main' into ActorUnkRMSD * fix: Format file * feat: Rename RMSX base class --------- Co-authored-by: Yanis <35189056+Yanis002@users.noreply.github.com> --- config/eur/arm9/overlays/ov063/symbols.txt | 4 +- config/jp/arm9/overlays/ov063/symbols.txt | 4 +- include/Actor/ActorUnkRMSD.hpp | 24 ++++-- include/Unknown/Common.hpp | 81 -------------------- include/profile.hpp | 88 ++++++++++++++++++++++ libs/nns/include/nns/g3d/g3d.h | 5 +- src/031_Land/Actor/ActorShotArrow.cpp | 19 ++--- src/063_Shrine/Actor/ActorUnkRMSD.cpp | 21 ++++-- 8 files changed, 131 insertions(+), 115 deletions(-) diff --git a/config/eur/arm9/overlays/ov063/symbols.txt b/config/eur/arm9/overlays/ov063/symbols.txt index 5ce5b85f..11b13797 100644 --- a/config/eur/arm9/overlays/ov063/symbols.txt +++ b/config/eur/arm9/overlays/ov063/symbols.txt @@ -447,8 +447,8 @@ _ZTV19data_ov063_021633c4 kind:data(any) addr:0x021633c4 _ZTV19data_ov063_02163428 kind:data(any) addr:0x02163428 _ZTV19data_ov063_0216344c kind:data(any) addr:0x0216344c data_ov063_021634b0 kind:data(any) addr:0x021634b0 -_ZTV19data_ov063_021634c8 kind:data(any) addr:0x021634c8 -_ZTV19data_ov063_021634ec kind:data(any) addr:0x021634ec +_ZTV19ActorProfileUnkRMSD kind:data(any) addr:0x021634c8 +_ZTV12ActorUnkRMSD kind:data(any) addr:0x021634ec _ZTV19data_ov063_02163510 kind:data(any) addr:0x02163510 ambiguous _ZTV19data_ov063_02163550 kind:data(any) addr:0x02163550 _ZTV19data_ov063_02163574 kind:data(any) addr:0x02163574 diff --git a/config/jp/arm9/overlays/ov063/symbols.txt b/config/jp/arm9/overlays/ov063/symbols.txt index bca22435..a65454e4 100644 --- a/config/jp/arm9/overlays/ov063/symbols.txt +++ b/config/jp/arm9/overlays/ov063/symbols.txt @@ -449,8 +449,8 @@ data_ov063_02165248 kind:data(any) addr:0x02165248 ambiguous _ZTV19data_ov063_02165248 kind:data(any) addr:0x02165248 _ZTV19data_ov063_0216526c kind:data(any) addr:0x0216526c data_ov063_021652d0 kind:data(any) addr:0x021652d0 -_ZTV19data_ov063_021652e8 kind:data(any) addr:0x021652e8 -_ZTV19data_ov063_0216530c kind:data(any) addr:0x0216530c +_ZTV19ActorProfileUnkRMSD kind:data(any) addr:0x021652e8 +_ZTV12ActorUnkRMSD kind:data(any) addr:0x0216530c _ZTV19data_ov063_02165370 kind:data(any) addr:0x02165370 _ZTV19data_ov063_02165394 kind:data(any) addr:0x02165394 _ZTV19data_ov063_021653f8 kind:data(any) addr:0x021653f8 diff --git a/include/Actor/ActorUnkRMSD.hpp b/include/Actor/ActorUnkRMSD.hpp index b497e59a..d3617295 100644 --- a/include/Actor/ActorUnkRMSD.hpp +++ b/include/Actor/ActorUnkRMSD.hpp @@ -8,6 +8,7 @@ #include "Render/ModelRender.hpp" #include "Unknown/Common.hpp" #include "global.h" +#include "nns/g3d/g3d.h" #include "types.h" class ActorUnkRMSD_C4 : public Actor_C4 { @@ -20,12 +21,23 @@ public: /* 0C */ virtual void vfunc_0C(unk32 param1) override; }; -class ActorUnkRMSD : public Actor { +class ActorUnkRMSBase : public Actor { public: /* 00 (base) */ - /* 94 */ unk8 mUnk_94; - /* 95 */ STRUCT_PAD(0x95, 0x158); - /* 158 */ Actor mUnk_158; + /* 94 */ ModelRender mUnk_94; + /* F4 */ ModelRender mUnk_F4; + /* 154 */ unk32 mUnk_154; + /* 158 */ + + ActorUnkRMSBase(); +}; + +class ActorUnkRMSD : public ActorUnkRMSBase { +public: + /* 00 (base) */ + /* 158 */ unk32 mUnk_158; //! INFO: Some class with a vfunc_34 + /* 15C */ STRUCT_PAD(0x15C, 0x1D4); //! INFO: Force alignment to match ::Create + /* 1D4 */ ActorUnkRMSD(); @@ -34,8 +46,8 @@ public: void func_ov063_0215c408(void); void func_ov063_0215c45c(void); void func_ov063_0215c474(void); - void *func_ov063_0215c488(void); //! TODO: G3d_Model? - void *func_ov063_0215c4c8(void); //! TODO: G3d_Model? + G3d_Model *func_ov063_0215c488(void); //! INFO: G3d_Model deduced from RMSF + G3d_Model *func_ov063_0215c4c8(void); //! INFO: same as above }; class ActorProfileUnkRMSD : public ActorProfile_Derived1 { diff --git a/include/Unknown/Common.hpp b/include/Unknown/Common.hpp index 26802f46..0a0e5d12 100644 --- a/include/Unknown/Common.hpp +++ b/include/Unknown/Common.hpp @@ -839,22 +839,6 @@ public: /* 04 */ virtual void vfunc_04() override; }; -class UnkSystem3 { -public: - /* 00 */ void *mUnk_00; - /* 04 */ void *mUnk_04; - /* 08 */ unk32 mUnk_08; - /* 0C */ - - UnkSystem3(const char *path, unk32 param2); - UnkSystem3(const char *path, unk32 param2, unk32 param3, unk32 param4); - ~UnkSystem3(); - - void func_02015410(const char *path, unk32 param2); - void func_0201541c(const char *param1, unk32 param2); - void func_02015460(const char *param1, void *param2, unk32 param3); -}; - class UnkStruct2 { public: /* 00 */ unk32 mUnk_00; @@ -1151,71 +1135,6 @@ struct InputInformations { void *unk_0C; }; -class MapObjectProfile_Derived2_20_Base_18 { -public: - /* 00 */ const char *mUnk_00; - /* 04 */ unk32 mUnk_04; - /* 08 */ - - MapObjectProfile_Derived2_20_Base_18(); // func_02016620 - ~MapObjectProfile_Derived2_20_Base_18(); -}; - -class MapObjectProfile_Derived2_20_Base_54 { -public: - /* 00 (vtable) */ - /* 04 */ const char *mUnk_04; - /* 08 */ unk32 mUnk_08; - /* 0C */ unk32 mUnk_0C; - /* 10 */ - - MapObjectProfile_Derived2_20_Base_54(); - ~MapObjectProfile_Derived2_20_Base_54(); - - /* 00 */ virtual void vfunc_00(); - /* 04 */ virtual void vfunc_04(); - /* 08 */ virtual void vfunc_08(unk32 param1); - /* 0C */ virtual void vfunc_0C(); -}; - -class MapObjectProfile_Derived2_20_Base { -public: - /* 00 (vtable) */ - /* 04 */ const char *mDirName; - /* 08 */ const char *mArchiveName; - /* 0C */ void *mUnk_0C; - /* 10 */ void *mUnk_10; - /* 14 */ u8 mUnk_14; - /* 15 */ u8 mUnk_15; - /* 16 */ u8 mUnk_16; - /* 17 */ u8 mUnk_17; - /* 18 */ MapObjectProfile_Derived2_20_Base_18 mUnk_18; - /* 20 */ UnkSystem3 mUnk_20; - /* 2C */ UnkFileSystem3 mUnk_2C; - /* 3C */ UnkFileSystem5 mUnk_3C; - /* 50 */ BMDSectionModel *mUnk_50; - /* 54 */ MapObjectProfile_Derived2_20_Base_54 mUnk_54[4]; - /* 94 */ - - MapObjectProfile_Derived2_20_Base(const char *directory, const char *archiveName, const char *param3, const char *param4, - unk32 param5, - unk32 param6); // func_ov000_02058540 - - // data_ov000_020b1b14 - /* 00 */ virtual ~MapObjectProfile_Derived2_20_Base(); - /* 08 */ - - void func_ov000_020586b4(unk32 param1, unk32 param2, unk32 param3, unk32 param4); - void func_ov000_020588f0(void *param1, unk32 param2, unk32 param3, void *param4); - void func_ov000_02058900(void); - void func_ov000_02058914(void *param1); - void func_ov000_020589e4(void); - unk32 func_ov000_02058a24(); - void unc_ov000_02058a58(void); - unk32 func_ov000_02058a84(unk32 param1, const char *param2); - void func_ov000_02058ab0(void); -}; - class MapObjectProfile_Derived5 : public MapObjectProfile_Derived2_20_Base { public: /* 00 (base) */ diff --git a/include/profile.hpp b/include/profile.hpp index 9ded035d..95ded464 100644 --- a/include/profile.hpp +++ b/include/profile.hpp @@ -1,7 +1,91 @@ #pragma once +#include "Unknown/UnkFileSystem.hpp" +#include "types.h" #include +//! TODO: doesn't belong here but since we don't know what it is... +class UnkSystem3 { +public: + /* 00 */ void *mUnk_00; + /* 04 */ void *mUnk_04; + /* 08 */ unk32 mUnk_08; + /* 0C */ + + UnkSystem3(const char *path, unk32 param2); + UnkSystem3(const char *path, unk32 param2, unk32 param3, unk32 param4); + ~UnkSystem3(); + + void func_02015410(const char *path, unk32 param2); + void func_0201541c(const char *param1, unk32 param2); + void func_02015460(const char *param1, void *param2, unk32 param3); +}; + +class MapObjectProfile_Derived2_20_Base_18 { +public: + /* 00 */ const char *mUnk_00; + /* 04 */ unk32 mUnk_04; + /* 08 */ + + MapObjectProfile_Derived2_20_Base_18(); // func_02016620 + ~MapObjectProfile_Derived2_20_Base_18(); +}; + +class MapObjectProfile_Derived2_20_Base_54 { +public: + /* 00 (vtable) */ + /* 04 */ const char *mUnk_04; + /* 08 */ unk32 mUnk_08; + /* 0C */ unk32 mUnk_0C; + /* 10 */ + + MapObjectProfile_Derived2_20_Base_54(); + ~MapObjectProfile_Derived2_20_Base_54(); + + /* 00 */ virtual void vfunc_00(); + /* 04 */ virtual void vfunc_04(); + /* 08 */ virtual void vfunc_08(unk32 param1); + /* 0C */ virtual void vfunc_0C(); +}; + +class MapObjectProfile_Derived2_20_Base { +public: + /* 00 (vtable) */ + /* 04 */ const char *mDirName; + /* 08 */ const char *mArchiveName; + /* 0C */ void *mUnk_0C; + /* 10 */ void *mUnk_10; + /* 14 */ u8 mUnk_14; + /* 15 */ u8 mUnk_15; + /* 16 */ u8 mUnk_16; + /* 17 */ u8 mUnk_17; + /* 18 */ MapObjectProfile_Derived2_20_Base_18 mUnk_18; + /* 20 */ UnkSystem3 mUnk_20; + /* 2C */ UnkFileSystem3 mUnk_2C; + /* 3C */ UnkFileSystem5 mUnk_3C; + /* 50 */ BMDSectionModel *mUnk_50; + /* 54 */ MapObjectProfile_Derived2_20_Base_54 mUnk_54[4]; + /* 94 */ + + MapObjectProfile_Derived2_20_Base(const char *directory, const char *archiveName, const char *param3, const char *param4, + unk32 param5, + unk32 param6); // func_ov000_02058540 + + // data_ov000_020b1b14 + /* 00 */ virtual ~MapObjectProfile_Derived2_20_Base(); + /* 08 */ + + void func_ov000_020586b4(unk32 param1, unk32 param2, unk32 param3, unk32 param4); + void func_ov000_020588f0(void *param1, unk32 param2, unk32 param3, void *param4); + void func_ov000_02058900(void); + void func_ov000_02058914(void *param1); + void func_ov000_020589e4(void); + unk32 func_ov000_02058a24(); + void unc_ov000_02058a58(void); + unk32 func_ov000_02058a84(unk32 param1, const char *param2); + void func_ov000_02058ab0(void); +}; + #define GET_PROFILE(T) (&ProfileInstance::sProfile) #define GET_PROFILE_20(T) (&ProfileInstance::sProfile.mUnk_20) #define GET_PROFILE_20_50(T) (ProfileInstance::sProfile.mUnk_20.mUnk_50) @@ -26,3 +110,7 @@ template static inline G3d_Model *GetModelFromProfile2(s32 param1, pProfile->func_ov000_0209ccd8(param1, resId); return G3d_GetModelPtr((BMDSectionModel *) pProfile->mUnk_20[param1]->mUnk_50); } + +static inline G3d_Model *GetModelFromProfile3(MapObjectProfile_Derived2_20_Base *param1, const char *name) { + return G3d_GetUnkPtr(param1->mUnk_50, name); +} diff --git a/libs/nns/include/nns/g3d/g3d.h b/libs/nns/include/nns/g3d/g3d.h index 7a1234da..e0b5317e 100644 --- a/libs/nns/include/nns/g3d/g3d.h +++ b/libs/nns/include/nns/g3d/g3d.h @@ -222,13 +222,12 @@ static inline G3d_Model *G3d_GetModelPtr(const BMDSectionModel *pSection) { return G3d_GetModelVariantPtr(pSection, 0); } -//! TODO: returns `G3d_Model*`? -static inline void *G3d_GetUnkPtr(const BMDSectionModel *pSection, const char *name) { +static inline G3d_Model *G3d_GetUnkPtr(const BMDSectionModel *pSection, const char *name) { if (pSection != NULL) { u32 *pOffset = G3d_0200f05c(&pSection->modelList, name); if (pOffset != NULL) { - return (void *) ((u8 *) pSection + *pOffset); + return (G3d_Model *) ((u8 *) pSection + *pOffset); } } diff --git a/src/031_Land/Actor/ActorShotArrow.cpp b/src/031_Land/Actor/ActorShotArrow.cpp index 6f61b398..cc63bd94 100644 --- a/src/031_Land/Actor/ActorShotArrow.cpp +++ b/src/031_Land/Actor/ActorShotArrow.cpp @@ -112,14 +112,6 @@ MapObjectProfile_Derived2_20_Base *func_ov031_020f1404() { return data_027e0ce0->mUnk_1C->mUnk_0C; } -inline G3d_Model *GetResource(char *str) { - return (G3d_Model *) G3d_GetUnkPtr(func_ov031_020f1404()->mUnk_50, str); -} - -inline G3d_Model *GetResource() { - return (G3d_Model *) G3d_GetUnkPtr(func_ov031_020f1404()->mUnk_50, data_ov031_02110b5c); -} - DECL_PROFILE(ActorProfileShotArrow); Actor *ActorProfileShotArrow::Create() { @@ -133,8 +125,9 @@ ActorProfileShotArrow::ActorProfileShotArrow() : ActorShotArrow::ActorShotArrow() : mUnk_9C(true), - mUnk_A0(GetResource()), - mUnk_100(&this->mUnk_120, GetResource(), func_ov031_020f1404()->func_ov000_02058a84(0, data_ov031_02110b08)), + mUnk_A0(GetModelFromProfile3(func_ov031_020f1404(), data_ov031_02110b5c)), + mUnk_100(&this->mUnk_120, GetModelFromProfile3(func_ov031_020f1404(), data_ov031_02110b5c), + func_ov031_020f1404()->func_ov000_02058a84(0, data_ov031_02110b08)), mUnk_140(this), mUnk_168(0), mUnk_16C(0), @@ -639,15 +632,15 @@ void ActorShotArrow::func_ov031_020f2654(Mat3p *param1) {} void ActorShotArrow::func_ov031_020f2794(unk16 param1) { switch (param1) { case 0x0: - this->mUnk_94.vfunc_08(GetResource(data_ov031_02110b3c)); + this->mUnk_94.vfunc_08(GetModelFromProfile3(func_ov031_020f1404(), data_ov031_02110b3c)); this->mUnk_25A = false; break; case 0x1: - this->mUnk_94.vfunc_08(GetResource(data_ov031_02110b4c)); + this->mUnk_94.vfunc_08(GetModelFromProfile3(func_ov031_020f1404(), data_ov031_02110b4c)); this->mUnk_25A = false; break; case 0x2: - this->mUnk_94.vfunc_08(GetResource(data_ov031_02110b4c)); + this->mUnk_94.vfunc_08(GetModelFromProfile3(func_ov031_020f1404(), data_ov031_02110b4c)); this->mUnk_25A = true; func_ov000_02057c98(&this->mUnk_A0, &this->mUnk_100); break; diff --git a/src/063_Shrine/Actor/ActorUnkRMSD.cpp b/src/063_Shrine/Actor/ActorUnkRMSD.cpp index 1e7a86b8..8c0813f1 100644 --- a/src/063_Shrine/Actor/ActorUnkRMSD.cpp +++ b/src/063_Shrine/Actor/ActorUnkRMSD.cpp @@ -3,14 +3,15 @@ #include "Actor/ActorUnkRMSD.hpp" #include "Render/ModelRender.hpp" -#include "System/SysNew.hpp" +#include "nns/g3d/g3d.h" +#include "profile.hpp" extern "C" void func_ov073_0215bb34(ActorUnkRMSD *); DECL_PROFILE(ActorProfileUnkRMSD); -char data_ov063_021625d8[0x10] = "RMSD_wall"; -char data_ov063_021625e8[0x10] = "RMSD"; +char data_ov063_021625d8[0x10]; // = "RMSD_wall"; +char data_ov063_021625e8[0x10]; // = "RMSD"; Actor *ActorProfileUnkRMSD::Create() { return new(HeapIndex_2) ActorUnkRMSD(); @@ -19,6 +20,10 @@ Actor *ActorProfileUnkRMSD::Create() { ActorProfileUnkRMSD::ActorProfileUnkRMSD() : ActorProfile_Derived1(ActorId_RMSD) {} +ActorUnkRMSBase::ActorUnkRMSBase() : + mUnk_94(NULL), + mUnk_F4(NULL) {} + ActorUnkRMSD::ActorUnkRMSD() { ActorProfileUnkRMSD *r0 = GET_PROFILE(ActorProfileUnkRMSD); r0->vfunc_04(); @@ -27,18 +32,18 @@ ActorUnkRMSD::ActorUnkRMSD() { void ActorUnkRMSD::func_ov063_0215c408(void) {} void ActorUnkRMSD::func_ov063_0215c45c(void) { - this->mUnk_158.vfunc_34(); + (*(Actor *) &this->mUnk_158).vfunc_34(); // Not an Actor } void ActorUnkRMSD::func_ov063_0215c474(void) { this->vfunc_20(); } -void *ActorUnkRMSD::func_ov063_0215c488(void) { - return G3d_GetUnkPtr(GET_PROFILE(ActorProfileUnkRMSD)->mUnk_3C.mUnk_50, data_ov063_021625e8); +G3d_Model *ActorUnkRMSD::func_ov063_0215c488(void) { + return GetModelFromProfile3(&GET_PROFILE(ActorProfileUnkRMSD)->mUnk_3C, data_ov063_021625e8); } -void *ActorUnkRMSD::func_ov063_0215c4c8(void) { - return G3d_GetUnkPtr(GET_PROFILE(ActorProfileUnkRMSD)->mUnk_3C.mUnk_50, data_ov063_021625d8); +G3d_Model *ActorUnkRMSD::func_ov063_0215c4c8(void) { + return GetModelFromProfile3(&GET_PROFILE(ActorProfileUnkRMSD)->mUnk_3C, data_ov063_021625d8); } ActorUnkRMSD::~ActorUnkRMSD() {}