From 6e59fd8267b8c68a3f48385e895fa61f8a67ab93 Mon Sep 17 00:00:00 2001 From: theAzack9 Date: Fri, 30 Jan 2026 17:09:39 +0100 Subject: [PATCH 1/5] 100% match for TMario::actnMain --- include/M3DUtil/M3UModel.hpp | 5 +-- include/M3DUtil/M3UModelMario.hpp | 24 ++++++++++ include/Player/MarioMain.hpp | 46 ++++++++++++++----- src/Player/MarioAction.cpp | 74 +++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 include/M3DUtil/M3UModelMario.hpp diff --git a/include/M3DUtil/M3UModel.hpp b/include/M3DUtil/M3UModel.hpp index bbfa67b9..bf533334 100644 --- a/include/M3DUtil/M3UModel.hpp +++ b/include/M3DUtil/M3UModel.hpp @@ -2,12 +2,9 @@ #define M3DUTIL_M3U_MODEL_HPP #include +#include struct M3UMtxCalcSetInfo; -class J3DModel; -class J3DFrameCtrl; -class J3DAnmTexPattern; -class J3DTexNoAnm; class M3UModelCommon { public: diff --git a/include/M3DUtil/M3UModelMario.hpp b/include/M3DUtil/M3UModelMario.hpp new file mode 100644 index 00000000..68757853 --- /dev/null +++ b/include/M3DUtil/M3UModelMario.hpp @@ -0,0 +1,24 @@ +#ifndef M3DUTIL_M3U_MODEL_MARIO_HPP +#define M3DUTIL_M3U_MODEL_MARIO_HPP + +#include + +class M3UModelCommonMario : public M3UModelCommon { +public: + virtual void getMtxCalc(const M3UMtxCalcSetInfo&); + +public: +}; + +class M3UModelMario : public M3UModel { +public: + virtual void changeMtxCalcSIAnmBQAnmTransform(int, u8); + virtual void updateIn(); + virtual void updateInMotion(); + virtual void updateOut(); + +public: + // TODO: +}; + +#endif diff --git a/include/Player/MarioMain.hpp b/include/Player/MarioMain.hpp index 1bf5b65f..f5aa1074 100644 --- a/include/Player/MarioMain.hpp +++ b/include/Player/MarioMain.hpp @@ -6,6 +6,9 @@ #include #include #include +#include +#include +#include class TLiveActor; class TBGCheckData; @@ -15,7 +18,7 @@ class J3DAnmTransform; struct TBGWallCheckRecord; // TODO: where should this be? -enum E_SIDEWALK_TYPE {}; +enum E_SIDEWALK_TYPE { }; struct TRidingInfo { const TLiveActor* unk0; @@ -565,12 +568,12 @@ class TMario : public TTakeActor, public TDrawSyncCallback { virtual void damageExec(THitActor*, int, int, int, f32, int, f32, s16); virtual void getVoiceStatus(); - void actnMain(); + bool actnMain(); void pitching(); void putting(); void catchLost(); void takePose(); - void taking(); + bool taking(); void demoMain(); void disappear(); void nomotion(); @@ -637,7 +640,7 @@ class TMario : public TTakeActor, public TDrawSyncCallback { void changeHandByRate(f32); void changeHand(int); void isAnimeLoopOrStop(); - void isLast1AnimeFrame(); + s32 isLast1AnimeFrame(); void getMotionFrameCtrl(); void getCurrentFrame(int); void getRailMtx() const; @@ -753,10 +756,10 @@ class TMario : public TTakeActor, public TDrawSyncCallback { void checkGraffitoDamage(); void makeGraffitoDamage(const TMario::TEParams&); void checkAllMotions(); - void changePlayerDropping(u32, u32); - void changePlayerJumping(u32, u32); + bool changePlayerDropping(u32, u32); + bool changePlayerJumping(u32, u32); void changePlayerTriJump(); - void changePlayerStatus(u32, u32, bool); + bool changePlayerStatus(u32, u32, bool); void throwMario(const JGeometry::TVec3&, f32); void setStatusToRunning(u32, u32); void setStatusToJumping(u32, u32); @@ -779,7 +782,7 @@ class TMario : public TTakeActor, public TDrawSyncCallback { void changePos(const Vec&); void isSpeedZero(); void canBendBody(); - void considerRotateJumpStart(); + s32 considerRotateJumpStart(); void addVelocity(f32); u32 onYoshi() const; void getGroundJumpPower() const; @@ -1137,8 +1140,31 @@ class TMario : public TTakeActor, public TDrawSyncCallback { // TODO: Make enum (0 = red, 1 = yellow, 2 = green) /* 0x388 */ u16 mBlooperColor; - - /* 0x38A */ char unk38A[0x5A]; + /* 0x38A */ u16 unk38A; + /* 0x38C */ f32 mHolderHeightDiff; + /* 0x390 */ u32 _390; + /* 0x394 */ J3DDrawBuffer* mDrawBufferA; + /* 0x398 */ J3DDrawBuffer* mDrawBufferB; + /* 0x39C */ u32 _39C; + /* 0x3A0 */ u32 _3A0; + /* 0x3A4 */ u32 _3A4; + /* 0x3A8 */ M3UModelMario* mModelData; + /* 0x3AC */ J3DModelData* mBodyModelData; + /* 0x3B0 */ J3DModel* mHandModel2R; + /* 0x3B4 */ J3DModel* mHandModel2L; + /* 0x3B8 */ J3DModel* mHandModel3R; + /* 0x3BC */ J3DModel* mHandModel3L; + /* 0x3C0 */ J3DModel* mHandModel4R; + /* 0x3C4 */ u8 _3C4; + /* 0x3C5 */ u8 mBindBoneIDArray[12]; + /* 0x3D1 */ u8 _3D1; // padding? + /* 0x3D2 */ u8 _3D2; // padding? + /* 0x3D3 */ u8 _3D3; // padding? + /* 0x3D4 */ u16 _3D4; + /* 0x3D6 */ u16 _3D6; + /* 0x3D8 */ f32 _3D8; + /* 0x3DC */ f32 _3DC; + /* 0x3E0 */ void* mCap; // TMarioCap /* 0x3E4 */ void* mWaterGun; // TWaterGun diff --git a/src/Player/MarioAction.cpp b/src/Player/MarioAction.cpp index e69de29b..ea22718f 100644 --- a/src/Player/MarioAction.cpp +++ b/src/Player/MarioAction.cpp @@ -0,0 +1,74 @@ +#include + +bool TMario::actnMain() +{ + u32 action = mAction; + + bool result = false; + + // TODO: Action enum + switch (action) { + case 0x383: + result = taking(); + break; + case 0x384: + if ((mInput & 4) != 0) { + result = changePlayerDropping(0x88C, 0); + } else { + if (isLast1AnimeFrame()) { + setAnimation(0xC3, 1.0f); + result = changePlayerStatus(0xC400201, 0, false); + } else { + stopCommon(0x110, 0xC400201); + result = false; + } + } + break; + case 0x386: + if ((mInput & 2) != 0) { + if (considerRotateJumpStart()) { + result = true; + } else { + result = changePlayerJumping(0x2000880, false); + } + } else { + if ((mInput & 4) != 0) { + result = changePlayerStatus(0x88C, 0, false); + } else { + if ((mInput & 8) != 0) { + result = changePlayerStatus(0x50, 0, false); + } else { + stopCommon(0x5A, 0xC400201); + result = false; + } + } + } + break; + case 0x80000387: + if ((mInput & 4) != 0) { + result = changePlayerDropping(0x88c, 0); + } else { + stopCommon(0x6E, 0xC400201); + // Probably some inlined function + // I suspect this part: mModelData->unkC->checkPass(20.0f) + // Might be wrong + if (mHeldObject != nullptr + && mModelData->getFrameCtrl()->checkPass(20.0f)) { + mHeldObject->receiveMessage(this, 0x6); + mHeldObject = nullptr; + } + result = false; + } + break; + case 0x80000588: + if ((mInput & 4) != 0) { + result = changePlayerDropping(0x88C, 0); + } else { + stopCommon(0x65, 0xC400201); + checkThrowObject(); + result = false; + } + break; + } + return result; +} From bb96731b70aedc222f4a95b39cea28322f9af36f Mon Sep 17 00:00:00 2001 From: theAzack9 Date: Fri, 30 Jan 2026 17:12:18 +0100 Subject: [PATCH 2/5] Cleanup --- include/Player/MarioMain.hpp | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/include/Player/MarioMain.hpp b/include/Player/MarioMain.hpp index f5aa1074..2f985b42 100644 --- a/include/Player/MarioMain.hpp +++ b/include/Player/MarioMain.hpp @@ -18,7 +18,7 @@ class J3DAnmTransform; struct TBGWallCheckRecord; // TODO: where should this be? -enum E_SIDEWALK_TYPE { }; +enum E_SIDEWALK_TYPE {}; struct TRidingInfo { const TLiveActor* unk0; @@ -1142,28 +1142,28 @@ class TMario : public TTakeActor, public TDrawSyncCallback { /* 0x388 */ u16 mBlooperColor; /* 0x38A */ u16 unk38A; /* 0x38C */ f32 mHolderHeightDiff; - /* 0x390 */ u32 _390; - /* 0x394 */ J3DDrawBuffer* mDrawBufferA; - /* 0x398 */ J3DDrawBuffer* mDrawBufferB; - /* 0x39C */ u32 _39C; - /* 0x3A0 */ u32 _3A0; - /* 0x3A4 */ u32 _3A4; - /* 0x3A8 */ M3UModelMario* mModelData; - /* 0x3AC */ J3DModelData* mBodyModelData; - /* 0x3B0 */ J3DModel* mHandModel2R; - /* 0x3B4 */ J3DModel* mHandModel2L; - /* 0x3B8 */ J3DModel* mHandModel3R; - /* 0x3BC */ J3DModel* mHandModel3L; - /* 0x3C0 */ J3DModel* mHandModel4R; - /* 0x3C4 */ u8 _3C4; - /* 0x3C5 */ u8 mBindBoneIDArray[12]; - /* 0x3D1 */ u8 _3D1; // padding? - /* 0x3D2 */ u8 _3D2; // padding? - /* 0x3D3 */ u8 _3D3; // padding? - /* 0x3D4 */ u16 _3D4; - /* 0x3D6 */ u16 _3D6; - /* 0x3D8 */ f32 _3D8; - /* 0x3DC */ f32 _3DC; + /* 0x390 */ u32 unk390; + /* 0x394 */ J3DDrawBuffer* unk394; + /* 0x398 */ J3DDrawBuffer* unk398; + /* 0x39C */ u32 unk39C; + /* 0x3A0 */ u32 unk3A0; + /* 0x3A4 */ u32 unk3A4; + /* 0x3A8 */ M3UModelMario* unk3A8; // Full model data + /* 0x3AC */ J3DModelData* unk3AC; // Body model data + /* 0x3B0 */ J3DModel* unk3B0; // R Hand 2nd model + /* 0x3B4 */ J3DModel* unk3B4; // L Hand 2nd model + /* 0x3B8 */ J3DModel* unk3B8; // R Hand 3nd model + /* 0x3BC */ J3DModel* unk3BC; // L Hand 3nd model + /* 0x3C0 */ J3DModel* unk3C0; // R Hand 4nd model + /* 0x3C4 */ u8 unk3C4; + /* 0x3C5 */ u8 unk3C5[12]; // Array of bone ids + /* 0x3D1 */ u8 unk3D1; + /* 0x3D2 */ u8 unk3D2; + /* 0x3D3 */ u8 unk3D3; + /* 0x3D4 */ u16 unk3D4; + /* 0x3D6 */ u16 unk3D6; + /* 0x3D8 */ f32 unk3D8; + /* 0x3DC */ f32 unk3DC; /* 0x3E0 */ void* mCap; // TMarioCap /* 0x3E4 */ void* mWaterGun; // TWaterGun From b804772bc486d9ae545aa288ae26f62314e56df7 Mon Sep 17 00:00:00 2001 From: theAzack9 Date: Fri, 30 Jan 2026 17:15:09 +0100 Subject: [PATCH 3/5] Fix mistake after cleanup --- include/M3DUtil/M3UModel.hpp | 3 +++ src/Player/MarioAction.cpp | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/M3DUtil/M3UModel.hpp b/include/M3DUtil/M3UModel.hpp index bf533334..cb31c9af 100644 --- a/include/M3DUtil/M3UModel.hpp +++ b/include/M3DUtil/M3UModel.hpp @@ -33,6 +33,9 @@ class M3UModel { void updateInTexPatternAnm(); void updateInMotion(); + // Fabricated + J3DFrameCtrl* getFrameCtrl() { return unkC; } + public: /* 0x4 */ M3UModelCommon* unk4; /* 0x8 */ J3DModel* unk8; diff --git a/src/Player/MarioAction.cpp b/src/Player/MarioAction.cpp index ea22718f..61daaafa 100644 --- a/src/Player/MarioAction.cpp +++ b/src/Player/MarioAction.cpp @@ -49,11 +49,8 @@ bool TMario::actnMain() result = changePlayerDropping(0x88c, 0); } else { stopCommon(0x6E, 0xC400201); - // Probably some inlined function - // I suspect this part: mModelData->unkC->checkPass(20.0f) - // Might be wrong if (mHeldObject != nullptr - && mModelData->getFrameCtrl()->checkPass(20.0f)) { + && unk3A8->getFrameCtrl()->checkPass(20.0f)) { mHeldObject->receiveMessage(this, 0x6); mHeldObject = nullptr; } From f98a8bfbe630f4b614de4bc58ec5be8719cb97a0 Mon Sep 17 00:00:00 2001 From: theAzack9 Date: Fri, 30 Jan 2026 17:17:05 +0100 Subject: [PATCH 4/5] More cleanup --- include/M3DUtil/M3UModel.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/M3DUtil/M3UModel.hpp b/include/M3DUtil/M3UModel.hpp index cb31c9af..740068d0 100644 --- a/include/M3DUtil/M3UModel.hpp +++ b/include/M3DUtil/M3UModel.hpp @@ -5,6 +5,8 @@ #include struct M3UMtxCalcSetInfo; +class J3DModel; +class J3DTexNoAnm; class M3UModelCommon { public: From f5ec273a36857bdb50cc878a0e349fe2186fdd50 Mon Sep 17 00:00:00 2001 From: theAzack9 Date: Sat, 31 Jan 2026 09:12:42 +0100 Subject: [PATCH 5/5] Cleanup: s32 -> BOOL for boolish returns --- include/Player/MarioMain.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Player/MarioMain.hpp b/include/Player/MarioMain.hpp index 2f985b42..d8a6919c 100644 --- a/include/Player/MarioMain.hpp +++ b/include/Player/MarioMain.hpp @@ -640,7 +640,7 @@ class TMario : public TTakeActor, public TDrawSyncCallback { void changeHandByRate(f32); void changeHand(int); void isAnimeLoopOrStop(); - s32 isLast1AnimeFrame(); + BOOL isLast1AnimeFrame(); void getMotionFrameCtrl(); void getCurrentFrame(int); void getRailMtx() const; @@ -782,7 +782,7 @@ class TMario : public TTakeActor, public TDrawSyncCallback { void changePos(const Vec&); void isSpeedZero(); void canBendBody(); - s32 considerRotateJumpStart(); + BOOL considerRotateJumpStart(); void addVelocity(f32); u32 onYoshi() const; void getGroundJumpPower() const;