Files
st/include/Player/PlayerActorBase.hpp
T
Mityno 7c266293a7 Decompiling ActorUnkCANS (#103)
* feat: Start decompiling ActorUnkCANS ctor and vfunc_10

* feat: Improve vfunc_10

* feat: Decompile vfunc_18 and 1C

* fix: Remove trailing return

* feat: Progress on vfunc_20

* fix: Rename symbol

* feat: Finish first run over vfunc_20

* feat: Improve vfunc_20

* feat: Improve vfunc_20

* feat: Heavily improve vfunc_20

Almost done

* feat: Keep vfunc_20 going, add UnkAngleStruct to Actor.hpp

* feat: Some polish on vfunc_20

That's about what I can do, there are some tweaks left but I'm unable to
get anywhere.
Kind of proud ngl

* feat: Rename symbols and match vfunc_24

* fix: Fix jp symbol conflict

* feat: Decompile vfunc_2C

* feat: Fix symbols and signatures

* fix: Match switch statement by adding every cases

* feat: Match func_ov063_02157fa4

* feat: Match func_ov063_02158424

* feat: Match func_ov063_02158448

* feat: Match func_ov063_02158490

* feat: Match func_ov063_02158b0c

* feat: Match func_ov063_02158b34

* feat: Decompile most of func_ov063_02158b98 (need regalloc fix)

* feat: Create inner classes of ActorUnkCANS, match some vfuncs

* feat: Update some dtor symbol and match some ctor

* feat: Decompile UnkStruct 02162ee8 ctor

* feat: Rename jp symbols

* feat: Match func_ov063_021590c8

* feat: Match func_ov063_02159dfc

* feat: Decompile some functions

* fix: Fix old accesses

* fix: More merge artifacts

* fix: More merge artifacts

* chore: Move structs around and fix some uses

* feat: Start decompiling func_ov063_02158db0

* feat: Decompile some vfunc

vfunc_0C is really really weird

* fix: Fix use of removed struct

* feat: Match func_ov063_02159258

* feat: Match func_ov063_02159494

* feat: Match func_ov063_021595a4

* feat: Match func_ov063_02159618

* feat: Match func_ov063_02159714

* feat: Match func_ov063_02159784

* fix: Move UnkAngleStruct to math.hpp

* fix: .data of ActorRollingStone & ActorShotArrow

* feat: Match func_ov063_021598fc

* fix: Cleanup code for func_ov063_021598fc

* feat: Match func_ov063_02159ca8

* feat: Match func_ov063_02159d68

* fix: Fix double declaration of func

* feat: Match func_ov063_02159e20

* feat: Decompile most of func_ov063_02159ec0

* feat: Match func_ov063_0215a428

* feat: Match func_ov063_0215a474

* feat: Update lots of symbols (mainly for jp)

* feat: Start decompiling two funcs with fx mul

* fix: Fix broken symbol def after merge

* feat: Match func_ov063_0215a514

* feat: Match func_ov063_0215a56c

* feat: Match func_ov063_0215a5a0

* feat: Match func_ov063_0215a5bc

* feat: Match func_ov063_0215a5d8

* feat: Decompile most of func_ov063_0215a678

* fix: Fix some regalloc order in func_ov063_0215a678

* feat: Update symbols and create unk class

* feat: Update CANS member with the new class

* feat: Update symbols, remove dead variables

* feat: Improve ctor and some local struct layout

* feat: Improve ActorUnkCANS ctor

* fix: Fix ActorUnkCANS members layout

* feat: Improve ActorUnkCANS ctor more

* fix: Fix wrong symbol reloc

* feat: Add intermediate struct and update symbols

* feat: Match some jp only code, symbols

* feat: Decompile part of func_ov063_0215a2c0

* fix: Fix jp only code in func_ov063_0215a2c0

* feat: Update symbols

* feat: Cleanup unused functions

* feat: Cleanup JP ifguards handling

* feat: Remove lot of useless temps, use DEG_TO_ANG where it seems appropriate

* feat: Small code cleanup

* Apply suggestions from code review

Co-authored-by: Alessevan <44125445+Alessevan@users.noreply.github.com>

* fix: Fix style

* feat: Apply suggestions from review

* feat: More code cleanup

* feat: Some more improvements

* fix: Remove auto-generated comment headers

* fix broken matches

* fix broken matches 2

---------

Co-authored-by: Alessevan <44125445+Alessevan@users.noreply.github.com>
Co-authored-by: Yanis002 <35189056+Yanis002@users.noreply.github.com>
2026-08-02 15:27:10 +02:00

464 lines
12 KiB
C++

#pragma once
#include "Actor/ActorRef.hpp"
#include "Render/ModelRender.hpp"
#include "Unknown/Common.hpp"
#include "math.hpp"
#include "types.h"
#include <nns/g3d/g3d.h>
class Actor_C4;
class UnkStruct_027e0ce0_40_328;
class ItemManager;
struct ActorGrabParams;
extern "C" void func_ov000_0205d500(ActorGrabParams *, unk32, unk32);
bool PlayerCharacter_IsNotLink(s32 character);
struct ActorGrabParams {
/* 00 */ u16 unk_00;
/* 02 */ u16 unk_02;
/* 04 */
ActorGrabParams() {}
ActorGrabParams(unk32 param2, unk32 param3) {
ActorGrabParams local_1c;
func_ov000_0205d500(&local_1c, param3, param2);
*this = local_1c;
}
void operator=(ActorGrabParams &from) {
*(u32 *) this = *(u32 *) &from;
}
};
class UnkStruct_027e0ce0_40;
class PlayerActorBase_70;
typedef s32 PlayerCharacter;
enum PlayerCharacter_ {
/* 0 */ PlayerCharacter_Link = 0,
/* 1 */ PlayerCharacter_Phantom = 1,
/* 2 */ PlayerCharacter_Zelda = 2,
/* 3 */ PlayerCharacter_Max,
};
struct UnkStruct_ov000_020ab4dc {
/* 00 */ const char *mpDirectory;
/* 04 */ const char mUnk_04[16];
/* 14 */ const char mUnk_14[16];
/* 24 */ const char mUnk_24[16];
/* 34 */ const char mUnk_34[16];
/* 44 */ const char mUnk_44[16];
/* 54 */ STRUCT_PAD(0x54, 0x66);
/* 66 */ s16 mUnk_66;
/* 66 */ unk16 mUnk_68;
/* 66 */ unk16 mUnk_6A;
/* 66 */ unk16 mUnk_6C;
/* 66 */ unk16 mUnk_6E;
/* 66 */ unk16 mUnk_70;
/* 66 */ unk16 mUnk_72;
/* 74 */ s16 mUnk_74;
/* 78 */ STRUCT_PAD(0x76, 0x86);
/* 86 */ u8 mUnk_86[7];
/* 8D */ STRUCT_PAD(0x8D, 0x98);
/* 98 */ unk32 mUnk_98;
/* 9C */
};
extern const UnkStruct_ov000_020ab4dc data_ov000_020ab4dc[PlayerCharacter_Max];
extern "C" G3d_Model *func_ov000_0208eadc(PlayerCharacter, unk32, bool);
extern "C" G3d_Model *func_ov000_0208eb44(PlayerCharacter, unk32, bool);
inline bool PlayerCharacter_IsNotLink(PlayerCharacter character) {
bool ret = false;
if (character != PlayerCharacter_Link) {
ret = true;
}
return ret;
}
inline bool PlayerCharacter_IsNotLink2(PlayerCharacter character) {
bool ret = true;
if (character == PlayerCharacter_Link) {
ret = false;
}
return ret;
}
class UnkStruct_PlayerGet_64 {
public:
/* 00 */ ActorRef *mUnk_00;
/* 04 */ unk32 mUnk_04;
/* 08 */ u16 mUnk_08; // makes link invisible when set
/* 0A */ unk16 mUnk_0A;
/* 0C */
UnkStruct_PlayerGet_64(void *param1);
~UnkStruct_PlayerGet_64();
void func_ov000_0208a100();
};
class ModelRender_Derived3 : public ModelRender {
public:
/* 00 (base) */
/* 60 */
ModelRender_Derived3(PlayerCharacter character, G3d_Model *pModel);
// data_ov000_020b2b44
/* 00 */ virtual ~ModelRender_Derived3() override {}
void func_ov000_0208c058(unk32 param1);
};
class ModelRender_Derived4 : public ModelRender_Derived3 {
public:
/* 00 (base) */
/* 60 */ STRUCT_PAD(0x60, 0x78);
/* 78 */ unk32 mUnk_78;
/* 7C */ unk32 mUnk_7C[9];
/* A0 */ unk32 mUnk_A0[7];
/* BC */ unk32 mUnk_BC;
/* C0 */
ModelRender_Derived4(PlayerCharacter character, unk32 param2, G3d_Model *pModel, G3d_BoneMtxStruct *pCacheJntAnm);
// data_ov000_020b2b70
/* 1C */ virtual void vfunc_1C(UnkSystem4_vfunc_1C *param1) override;
};
class ModelRender_Derived5 : public ModelRender_Derived3 {
public:
/* 00 (base) */
/* 60 */ STRUCT_PAD(0x60, 0xA8);
/* A8 */
ModelRender_Derived5(PlayerCharacter character, G3d_Model *pModel, G3d_BoneMtxStruct *pCacheJntAnm);
// data_ov093_021787e8
/* 00 */ virtual ~ModelRender_Derived5() override {}
/* 1C */ virtual void vfunc_1C(UnkSystem4_vfunc_1C *param1) override;
};
class PlayerActorBase_38 {
private:
/* 00 */ UnkStruct_PlayerGet_64 mUnk_00;
public:
PlayerActorBase_38(void *param1) :
mUnk_00(param1) {
this->mUnk_00.mUnk_08 = 0;
}
void Reset() {
this->mUnk_00.~UnkStruct_PlayerGet_64();
this->mUnk_00.mUnk_08 = 0;
}
};
class PlayerActorBase_5C {
public:
/* 00 */ unk32 mUnk_00;
/* 04 */ unk32 mUnk_04;
/* 08 */ unk32 mUnk_08;
/* 0C */ unk32 mUnk_0C;
/* 10 */ void *mUnk_10;
/* 14 */
void func_ov000_02089dc4();
};
class PlayerActorBase_70_0C {
private:
/* 00 */ G3d_Model *mpModel1;
/* 04 */ G3d_Model *mpModel2;
/* 08 */ ModelRender_Derived3 *mUnk_08;
/* 0C */ ModelRender_Derived3 *mUnk_0C;
/* 10 */
public:
// clang-format off
G3d_Model* GetModel1() const { return this->mpModel1; }
G3d_Model* GetModel2() const { return this->mpModel2; }
ModelRender_Derived3* GetUnk08() const { return this->mUnk_08; }
ModelRender_Derived3* GetUnk0C() const { return this->mUnk_0C; }
// clang-format on
PlayerActorBase_70_0C(PlayerCharacter character, unk32 param2) :
mpModel1(func_ov000_0208eadc(character, param2, true)),
mpModel2(func_ov000_0208eb44(character, param2, true)) {
ModelRender_Derived3 *unk_08;
ModelRender_Derived3 *unk_0C;
G3d_Model *pModel;
{
pModel = mpModel1;
if (!PlayerCharacter_IsNotLink2(character)) {
unk_08 = new(HeapIndex_1) ModelRender_Derived4(character, param2, pModel, NULL);
} else {
unk_08 = new(HeapIndex_1) ModelRender_Derived5(character, pModel, NULL);
}
this->mUnk_08 = unk_08;
}
{
pModel = mpModel2;
if (!PlayerCharacter_IsNotLink(character)) {
unk_0C = new(HeapIndex_1) ModelRender_Derived4(character, param2, pModel, unk_08->mRenderObj.cacheJntAnm);
} else {
unk_0C = new(HeapIndex_1) ModelRender_Derived5(character, pModel, unk_08->mRenderObj.cacheJntAnm);
}
this->mUnk_0C = unk_0C;
}
}
};
class PlayerActorBase_70_1C : public UnkStruct_PlayerGet_74_base {
private:
/* 00 (base) */
/* 04 */ STRUCT_PAD(0x04, 0x2C);
/* 2C */
public:
PlayerActorBase_70_1C(PlayerActorBase_70 *pParent);
// data_ov000_020b2b9c
/* 00 */ virtual void vfunc_00(unk32 param1, unk32 param2, unk32 param3) override;
};
class PlayerActorBase_70_30 {
private:
/* 00 */ STRUCT_PAD(0x00, 0x1C);
/* 1C */
public:
PlayerActorBase_70_30(PlayerCharacter character, ModelRender_UnkSystem1 *param2, ModelRender_UnkSystem1 *param3);
};
class PlayerActorBase_70_6C {
private:
/* 00 */ UnkSystem5 mUnk_00;
/* 20 */ STRUCT_PAD(0x20, 0x70);
/* 70 */
public:
PlayerActorBase_70_6C(PlayerCharacter character, void *pBTX, G3d_Model *pModel);
~PlayerActorBase_70_6C();
};
class PlayerActorBase_70_DC {
private:
/* 00 */ UnkSystem5 mUnk_00;
/* 20 */ STRUCT_PAD(0x20, 0x60);
/* 60 */
public:
PlayerActorBase_70_DC(PlayerCharacter character, G3d_Model *pModel);
~PlayerActorBase_70_DC();
};
class PlayerActorBase_70_E0 {
private:
/* 00 */ unk32 mUnk_00;
public:
PlayerActorBase_70_E0(ModelRender_Derived3 *pUnk_08, PlayerCharacter character) {
unk32 value;
if (pUnk_08->mpModel != NULL) {
value = pUnk_08->func_ov000_02057f18(data_ov000_020ab4dc[character].mUnk_14);
} else {
value = -1;
}
this->mUnk_00 = value;
}
};
class PlayerActorBase_70_E4 {
private:
/* 00 */ STRUCT_PAD(0x00, 0x30);
/* 30 */
public:
PlayerActorBase_70_E4();
};
class PlayerActorBase_70_134 {
private:
/* 00 */ STRUCT_PAD(0x00, 0x28);
/* 28 */
public:
PlayerActorBase_70_134();
};
struct UnkStruct_func_ov000_020830d4 {
u16 mUnk_00;
u16 mUnk_04;
u8 mUnk_08;
u32 mUnk_0C;
};
class PlayerActorBase_70 {
private:
/* 000 */ BOOL mIsNotLink;
/* 004 */ PlayerCharacter mCharacter;
/* 008 */ unk32 mUnk_008;
/* 014 */ PlayerActorBase_70_0C mUnk_00C;
/* 01C */ PlayerActorBase_70_1C *mUnk_01C;
/* 020 */ ModelRender_UnkSystem1 *mUnk_020;
/* 024 */ ModelRender_UnkSystem1 *mUnk_024;
/* 028 */ ModelRender_UnkSystem1 *mUnk_028;
/* 02C */ ModelRender_UnkSystem1 *mUnk_02C;
/* 030 */ PlayerActorBase_70_30 mUnk_030;
/* 04C */ PlayerActorBase_70_30 mUnk_04C;
/* 068 */ unk16 mUnk_068;
/* 06A */ unk16 mUnk_06A;
/* 06C */ PlayerActorBase_70_6C mUnk_06C;
/* 0DC */ PlayerActorBase_70_DC *mUnk_0DC;
/* 0E0 */ PlayerActorBase_70_E0 mUnk_0E0;
/* 0E4 */ PlayerActorBase_70_E4 mUnk_0E4;
/* 114 */ Mat4x3p *mUnk_114;
/* 118 */ unk32 mUnk_118;
/* 11C */ unk32 mUnk_11C;
/* 120 */ unk32 mUnk_120;
/* 124 */ unk16 mUnk_124;
/* 126 */ bool mUnk_126;
/* 127 */ bool mUnk_127;
/* 128 */ bool mUnk_128;
/* 129 */ bool mUnk_129;
/* 12A */ bool mUnk_12A;
/* 12B */ bool mUnk_12B;
/* 12C */ bool mUnk_12C;
/* 12D */ bool mUnk_12D;
/* 12E */ bool mUnk_12E;
/* 12F */ bool mUnk_12F;
/* 130 */ bool mUnk_130;
/* 131 */ bool mUnk_131;
/* 132 */ unk16 mUnk_132;
/* 134 */ PlayerActorBase_70_134 mUnk_134;
/* 15C */ unk32 mUnk_15C;
/* 160 */
public:
PlayerActorBase_70(PlayerCharacter character, unk32 param2);
~PlayerActorBase_70();
// overlay 0
void func_ov000_02082e78(unk32 param1, unk32 param2, unk32 param3, unk32 param4);
void func_ov000_020830d4(UnkAngleStruct param1, u32 param2, u8 param3, unk32 param4);
// overlay 1
void func_ov001_020bbe18(unk32 param1, UnkAngleStruct param2, u32 param3, u8 param4);
};
class PlayerActorBase_74 {
private:
/* 00 */ STRUCT_PAD(0x00, 0x34);
/* 34 */
public:
PlayerActorBase_74() {
this->func_ov001_020db190();
}
void func_ov001_020db190();
};
struct PlayerActorBase_78_04 {
STRUCT_PAD(0x00, 0x0C);
void func_ov000_0205c584(unk32 param1, unk32 param2);
};
class PlayerActorBase_78 {
private:
/* 00 */ STRUCT_PAD(0x00, 0x0C);
/* 0C */
public:
void func_ov000_0205c584(volatile unk32 param1, volatile unk32 param2);
};
class PlayerLinkActor_9C_34 {
private:
/* 00 */ unk32 mUnk_00;
/* 04 */ VecFx32 mUnk_04;
/* 10 */ VecFx32 mUnk_10;
public:
void func_ov000_0208efd0(VecFx32 *pVec);
};
class PlayerLinkActor_9C {
public:
/* 000 (vtable) */
/* 004 */ STRUCT_PAD(0x04, 0x34);
/* 034 */ PlayerLinkActor_9C_34 mUnk_34;
/* 004 */ STRUCT_PAD(0x50, 0xF4);
/* 0F4 */ UnkStruct_027e0ce0_40_328 *mUnk_0F4;
/* 0F8 */ STRUCT_PAD(0xF8, 0x154);
/* 154 */
PlayerLinkActor_9C(UnkStruct_027e0ce0_40 *param1, u32 rawGrabParams, PlayerCharacter character);
// data_ov000_020b2a8c
/* 00 */ virtual ~PlayerLinkActor_9C();
};
class PlayerActorBase {
public:
/* 00 */ VecFx32 mPos;
/* 0C */ VecFx32 mPrevPos;
/* 18 */ VecFx32 mVel;
/* 24 */ VecFx32 mAccel;
/* 30 */ union {
u16 mAngle;
UnkAngleStruct mAngleStruct;
};
/* 32 */ u8 mInvincibilityTimer;
/* 33 */ u8 mInvincibilityIconTimer; // the blinking icon on top-screen
/* 34 */ ActorRef mGrabActor;
/* 38 */ PlayerActorBase_38 mUnk_38;
/* 44 */ unk32 mUnk_44;
/* 48 */ PlayerCharacter mCharacter;
/* 4C */ unk32 mUnk_4C;
/* 50 */ ActorGrabParams mUnk_50;
/* 54 */ ItemManager *mUnk_54;
/* 58 */ UnkStruct_027e0ce0_40 *mUnk_58;
/* 5C */ PlayerActorBase_5C mUnk_5C;
/* 70 */ PlayerActorBase_70 *mUnk_70;
/* 74 */ PlayerActorBase_74 *mUnk_74;
/* 78 */ PlayerActorBase_78 mUnk_78;
/* 84 */ UnkStruct_ov019_020d24c8_28_258_00 mUnk_84;
/* 8C */ unk32 mUnk_8C;
/* 90 */ PlayerLinkActor_9C *mUnk_90;
/* 94 */
PlayerActorBase(PlayerCharacter character, unk32 param2, ItemManager *pItemMgr, UnkStruct_027e0ce0_40 *param4);
~PlayerActorBase();
// overlay 0
void func_ov000_0208c8f8(VecFx32 *pVec);
void func_ov000_0208c914();
void func_ov000_0208d3fc();
void func_ov000_0208d7f0(bool param1);
// overlay 1
void func_ov001_020bc96c(); // ResetState? or just Reset? idk
};