A bit of progress

This commit is contained in:
robojumper
2025-05-22 01:23:01 +02:00
parent bcbba3a60c
commit 93e5291422
3 changed files with 689 additions and 21 deletions
+16 -12
View File
@@ -2681,7 +2681,7 @@ fn_8005F890__19daPlayerModelBase_cFPQ34nw4r4math5MTX34 = .text:0x8005F890; // ty
vt_0x2E8__19daPlayerModelBase_cFPQ34nw4r4math5MTX34PCUsb = .text:0x8005FB50; // type:function size:0x8
vt_0x304__19daPlayerModelBase_cCFv = .text:0x8005FB60; // type:function size:0xC
isOnClawTargetMaybe__19daPlayerModelBase_cFlR4mAngR4mAng = .text:0x8005FB70; // type:function size:0x14
fn_8005FB90 = .text:0x8005FB90; // type:function size:0x220
fn_8005FB90__19daPlayerModelBase_cFPQ34nw4r4math5MTX34 = .text:0x8005FB90; // type:function size:0x220
mainModelTimingA__19daPlayerModelBase_cFUlPQ34nw4r3g3d12ChrAnmResult = .text:0x8005FDB0; // type:function size:0x4
mainModelTimingB__19daPlayerModelBase_cFUlPQ34nw4r3g3d13WorldMtxManip = .text:0x8005FDC0; // type:function size:0x78
mainModelTimingC__19daPlayerModelBase_cFPQ34nw4r4math5MTX34 = .text:0x8005FE40; // type:function size:0x4C
@@ -2689,28 +2689,28 @@ handsCallbackC__19daPlayerModelBase_cFPQ34nw4r4math5MTX34Q34nw4r3g3d6ResMdlPQ34n
headModelTimingB__19daPlayerModelBase_cFUlPQ34nw4r3g3d13WorldMtxManip = .text:0x8005FF40; // type:function size:0x118
setTransformAndCalc__19daPlayerModelBase_cFRQ23m3d9scnLeaf_cPC6mMtx_c = .text:0x80060060; // type:function size:0x40
setShieldTransform__19daPlayerModelBase_cFb = .text:0x800600A0; // type:function size:0xD4
fn_80060180 = .text:0x80060180; // type:function size:0xB0
loadTwoAnmChrs__19daPlayerModelBase_cFlllb = .text:0x80060180; // type:function size:0xB0
getItemResFile__19daPlayerModelBase_cFPCcR12mAllocator_c = .text:0x80060230; // type:function size:0xD4
getExternalCompressedFile__19daPlayerModelBase_cFPCcPCcPvUl = .text:0x80060310; // type:function size:0x94
getExternalAnmChr__19daPlayerModelBase_cFPCcPvUl = .text:0x800603B0; // type:function size:0x94
getExternalAnmTexPat__19daPlayerModelBase_cFPCcPvUl = .text:0x80060450; // type:function size:0xD4
getExternalAnmTexSrt__19daPlayerModelBase_cFPCcPvUl = .text:0x80060530; // type:function size:0x94
fn_800605D0 = .text:0x800605D0; // type:function size:0x30
ActorLink__SetFaceTexPat = .text:0x80060600; // type:function size:0xEC
canStart__19daPlayerModelBase_cCFbUsUsPUsPUs = .text:0x800605D0; // type:function size:0x30
setFaceTexPat__19daPlayerModelBase_cFlb = .text:0x80060600; // type:function size:0xEC
fn_800606F0 = .text:0x800606F0; // type:function size:0x38
ActorLink__SetFaceTexSrt = .text:0x80060730; // type:function size:0xAC
setFaceTexSrt__19daPlayerModelBase_cFlb = .text:0x80060730; // type:function size:0xAC
fn_800607E0 = .text:0x800607E0; // type:function size:0x38
ActorLink__SetFaceAnmChr = .text:0x80060820; // type:function size:0xF0
setFaceAnmChr__19daPlayerModelBase_cFlb = .text:0x80060820; // type:function size:0xF0
fn_80060910 = .text:0x80060910; // type:function size:0x38
fn_80060950 = .text:0x80060950; // type:function size:0x164
fn_80060AC0 = .text:0x80060AC0; // type:function size:0x6C
loadSound__19daPlayerModelBase_cFQ34nw4r3g3d7ResFilePCcl = .text:0x80060B30; // type:function size:0xCC
fn_80060C00 = .text:0x80060C00; // type:function size:0xE0
loadAnmChr__19daPlayerModelBase_cFllPvUl = .text:0x80060950; // type:function size:0x164
removeAnmChr__19daPlayerModelBase_cFl = .text:0x80060AC0; // type:function size:0x6C
loadSound__19daPlayerModelBase_cFRQ34nw4r3g3d7ResFilePCcl = .text:0x80060B30; // type:function size:0xCC
loadSoundForAnim__19daPlayerModelBase_cFl = .text:0x80060C00; // type:function size:0xE0
syncSoundWithAnim__19daPlayerModelBase_cFv = .text:0x80060CE0; // type:function size:0x64
registMassObj__19daPlayerModelBase_cFP8cCcD_ObjUc = .text:0x80060D50; // type:function size:0x54
updateModelColliders__19daPlayerModelBase_cFv = .text:0x80060DB0; // type:function size:0x29C
updateCachedPositions__19daPlayerModelBase_cFv = .text:0x80061050; // type:function size:0x1B0
fn_80061200 = .text:0x80061200; // type:function size:0x210
setPosCopy3__19daPlayerModelBase_cFv = .text:0x80061200; // type:function size:0x210
fn_80061410__19daPlayerModelBase_cFv = .text:0x80061410; // type:function size:0x6C
alwaysRet0__19daPlayerModelBase_cFv = .text:0x80061480; // type:function size:0x8
somethingWithCarriedActorFlags__19daPlayerModelBase_cFv = .text:0x80061490; // type:function size:0x1C
@@ -28156,7 +28156,11 @@ sSwordRelatedUnk = .rodata:0x804E07F4; // type:object size:0x1C
sSwordRelatedZ = .rodata:0x804E0810; // type:object size:0x1C
sSwordRelatedY = .rodata:0x804E082C; // type:object size:0x1C
lbl_804E0848 = .rodata:0x804E0848; // type:object size:0x24 align:4 data:float
lbl_804E086C = .rodata:0x804E086C; // type:object size:0xAC align:4 data:float
lbl_804E086C = .rodata:0x804E086C; // type:object size:0x78 align:4 data:float
lbl_804E08E4 = .rodata:0x804E08E4; // type:object size:0xC
lbl_804E08F0 = .rodata:0x804E08F0; // type:object size:0xC
lbl_804E08FC = .rodata:0x804E08FC; // type:object size:0xC
lbl_804E0908 = .rodata:0x804E0908; // type:object size:0x10
lbl_804E0918 = .rodata:0x804E0918; // type:object size:0x14
lbl_804E092C = .rodata:0x804E092C; // type:object size:0x14 align:4 data:float
lbl_804E0940 = .rodata:0x804E0940; // type:object size:0x14 align:4 data:float
+45 -4
View File
@@ -114,6 +114,18 @@ public:
mpSoundData = data;
}
void setField_0x58(u8 val) {
field_0x58 = val;
}
u16 getField_0x5A() const {
return field_0x5A;
}
void *getSoundData() const {
return mpSoundData;
}
private:
/* 0x24 */ daPlBaseMdlCallback_c mCallback;
/* 0x58 */ u8 field_0x58;
@@ -142,6 +154,10 @@ public:
void play() override;
bool isFinished();
void setField_0x35(u8 value) {
field_0x35 = value;
}
private:
/* 0x35 */ u8 field_0x35;
/* 0x36 */ u8 field_0x36;
@@ -726,6 +742,18 @@ public:
mForceOrPreventActionFlags |= mask;
}
inline void onFaceUpdateFlags(u32 mask) {
mFaceUpdateFlags |= mask;
}
inline void offFaceUpdateFlags(u32 mask) {
mFaceUpdateFlags &= ~mask;
}
inline bool checkFaceUpdateFlags(u32 mask) const {
return (mFaceUpdateFlags & mask) != 0;
}
bool CheckPlayerFly() const {
return mActionFlags & FLG0_FLY;
}
@@ -791,7 +819,7 @@ protected:
/* 0x339 */ u8 mRidingActorType;
/* 0x33A */ u8 unk_0x33A[0x340 - 0x33A];
/* 0x340 */ u32 someFlags_0x340;
/* 0x344 */ u8 unk_0x344[0x348 - 0x344];
/* 0x344 */ u32 mFaceUpdateFlags;
/* 0x348 */ u32 mSwordAndMoreStates;
/* 0x34C */ u32 mModelUpdateFlags;
/* 0x350 */ u32 someFlags_0x350;
@@ -842,7 +870,7 @@ public:
PLAYER_MAIN_NODE_ARM_L2 = 8,
PLAYER_MAIN_NODE_HAND_L = 9,
PLAYER_MAIN_NODE_WEAPON_L = 10,
PLAYER_MAIN_NODE_SHOULDER_R = 11,
PLAYER_MAIN_NODE_ARM_R1 = 12,
PLAYER_MAIN_NODE_ARM_R2 = 13,
@@ -891,6 +919,7 @@ public:
};
void fn_8005F890(nw4r::math::MTX34 *);
void fn_8005FB90(nw4r::math::MTX34 *);
void fn_80061410();
static void freeFrmHeap(mHeapAllocator_c *allocator);
@@ -1011,10 +1040,21 @@ public:
mSwordAndMoreStates &= ~mask;
}
void loadSound(nw4r::g3d::ResFile file, const char *name, s32 animIdx);
bool canStart(bool force, u16 newIdx, u16 invalidValue, u16 *out1, u16 *out2) const;
void setFaceTexPat(s32 faceIdx, bool force);
void setFaceTexSrt(s32 faceIdx, bool force);
void setFaceAnmChr(s32 faceIdx, bool force);
void setPosCopy3();
void loadTwoAnmChrs(s32 childIdx, s32 animIdx, s32 animIdx2, bool b);
void loadAnmChr(s32 childIdx, s32 animIdx, void *dest, u32 maxSize);
void removeAnmChr(s32 childIdx);
void loadSound(nw4r::g3d::ResFile &file, const char *name, s32 childIdx);
void loadSoundForAnim(s32 childIdx);
void syncSoundWithAnim();
static void registMassObj(cCcD_Obj* obj, u8 priority);
static void registMassObj(cCcD_Obj *obj, u8 priority);
void updateModelColliders();
void updateCachedPositions();
@@ -1037,6 +1077,7 @@ public:
void applyWorldRotationMaybe(nw4r::g3d::WorldMtxManip *result, mAng x, mAng y, mAng z, mVec3_c *off, bool order);
static const PlayerAnimation sAnimations[443];
static const s32 sUnkDuration;
static const u8 sShieldDurabilities[10];
static const u8 sShieldRegenTimes[10];
static mColor sGuideColor1;
+628 -5
View File
@@ -21,6 +21,7 @@
#include "nw4r/g3d/g3d_scnobj.h"
#include "nw4r/g3d/res/g3d_resanmchr.h"
#include "nw4r/g3d/res/g3d_resanmclr.h"
#include "nw4r/g3d/res/g3d_resanmtexpat.h"
#include "nw4r/g3d/res/g3d_resanmtexsrt.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
@@ -102,8 +103,456 @@ static const char *sFaceResNames[] = {
// and this whole array is part of the .data pool
"",
};
const PlayerAnimation daPlayerModelBase_c::sAnimations[] = {
{ "atrFW", 13, 6, 1, 0, 0},
{ "atrFW_R", 7, 0, 1, 0, 0},
{ "atrFD", 13, 6, 1, 0, 0},
{ "atrFD_R", 7, 0, 1, 0, 0},
{ "atrbW", 13, 6, 1, 0, 0},
{ "atrbW_R", 7, 0, 1, 0, 0},
{ "atrbD", 13, 6, 1, 0, 0},
{ "atrbD_R", 7, 0, 1, 0, 0},
{ "atrsWL", 13, 6, 1, 0, 0},
{ "atrsDL", 13, 6, 1, 0, 0},
{ "atrsWR", 13, 6, 1, 0, 0},
{ "atrsDR", 13, 6, 1, 0, 0},
{ "atsWL", 13, 6, 1, 0, 0},
{ "atsDL", 13, 6, 1, 0, 0},
{ "atsWR", 13, 6, 1, 0, 0},
{ "atsDR", 13, 6, 1, 0, 0},
{ "atsWL_right", 13, 6, 1, 0, 0},
{ "atsDL_right", 13, 6, 1, 0, 0},
{ "atL", 9, 2, 1, 0, 0},
{ "atR", 9, 2, 1, 0, 0},
{ "dashA", 13, 56, 1, 0, 0},
{ "dashS", 13, 56, 1, 0, 0},
{ "atrbWH", 7, 0, 1, 0, 0},
{ "atbW", 13, 6, 1, 0, 0},
{ "atbD", 13, 6, 1, 0, 0},
{ "walkH", 7, 50, 1, 0, 0},
{ "waitS", 13, 56, 1, 0, 0},
{ "walkS", 13, 56, 1, 0, 0},
{ "stepL", 13, 56, 1, 0, 0},
{ "stepR", 13, 56, 1, 0, 0},
{ "atsJLSt", 7, 50, 1, 0, 2},
{ "atsJLEd", 9, 52, 1, 0, 2},
{ "atsJRSt", 7, 50, 1, 0, 2},
{ "atsJREd", 9, 52, 1, 0, 2},
{ "atsJFSt", 13, 56, 1, 0, 2},
{ "atsJFEd", 9, 52, 1, 0, 2},
{ "rollBSt", 13, 56, 1, 0, 2},
{ "rollBEd", 9, 52, 1, 0, 2},
{ "waitB", 9, 52, 1, 0, 2},
{ "waitBtoA", 9, 52, 1, 0, 0},
{ "sjmpSt", 7, 50, 1, 0, 0},
{ "sjmpEd", 7, 50, 1, 0, 0},
{ "rollF", 7, 50, 1, 0, 2},
{ "rollFmis", 7, 0, 17, 0, 17},
{ "jumpSt", 7, 50, 1, 0, 2},
{ "jumpSEd", 7, 50, 1, 0, 2},
{ "vjmp", 7, 50, 1, 0, 2},
{ "vjmpChA", 7, 50, 1, 0, 2},
{ "vjmpChB", 7, 50, 1, 0, 2},
{ "vjmpCl", 7, 50, 1, 0, 2},
{ "hangL", 7, 50, 1, 0, 2},
{ "hangR", 7, 50, 1, 0, 2},
{ "Hang", 7, 50, 1, 0, 2},
{ "climbHang", 12, 55, 1, 0, 2},
{ "climbSlideL", 12, 55, 1, 0, 2},
{ "climbSlideR", 12, 55, 1, 0, 2},
{ "climbHangmiss", 12, 55, 1, 0, 2},
{ "climbStruggle", 12, 5, 11, 0, 11},
{ "ClimbIvyHang", 12, 5, 1, 0, 2},
{ "ClimbIvyL", 12, 5, 1, 0, 2},
{ "ClimbIvyR", 12, 5, 1, 0, 2},
{ "ClimbIvyL_St", 12, 5, 1, 0, 2},
{ "ClimbIvyR_St", 12, 5, 1, 0, 2},
{ "ClimbIvySlideL", 12, 5, 1, 0, 2},
{ "ClimbIvySlideR", 12, 5, 1, 0, 2},
{ "ClimbIvySlantLU_RD", 12, 5, 1, 0, 2},
{ "ClimbIvySlideRU_LD", 12, 5, 1, 0, 2},
{ "ladUpSt", 13, 6, 1, 0, 0},
{ "ladUpEdL", 13, 6, 1, 0, 0},
{ "ladUpEdR", 13, 6, 1, 0, 0},
{ "ladDwSt", 13, 6, 1, 0, 0},
{ "ladDWEdL", 13, 6, 1, 0, 0},
{ "ladDWEdR", 13, 6, 1, 0, 0},
{ "ladRtoL", 13, 6, 1, 0, 0},
{ "ladLtoR", 13, 6, 1, 0, 0},
{ "LadJumpUpSt", 13, 6, 1, 0, 0},
{ "LadJumpDownSt", 13, 6, 1, 0, 0},
{ "LadJumpUpEd", 13, 6, 1, 0, 0},
{ "LadJumpDownEd", 13, 6, 1, 0, 0},
{ "cutT", 13, 100, 1, 0, 2},
{ "cutTB", 13, 4, 1, 0, 2},
{ "cutTL", 13, 4, 1, 0, 2},
{ "cutTLB", 13, 4, 1, 0, 2},
{ "cutJSt", 13, 4, 1, 0, 2},
{ "cutJEd", 13, 4, 1, 0, 2},
{ "damF", 13, 56, 6, 0, 6},
{ "damB", 13, 56, 6, 0, 6},
{ "damL", 13, 56, 6, 0, 6},
{ "damR", 13, 56, 6, 0, 6},
{ "DamageMFront", 13, 56, 6, 0, 6},
{ "DamageMBack", 13, 56, 6, 0, 6},
{ "DamageMLeft", 13, 56, 6, 0, 6},
{ "DamageMRight", 13, 56, 6, 0, 6},
{ "damFF", 13, 56, 7, 0, 7},
{ "damFB", 13, 56, 7, 0, 7},
{ "damFL", 13, 56, 7, 0, 7},
{ "damFR", 13, 56, 7, 0, 7},
{ "damFFup", 7, 50, 17, 0, 17},
{ "damFBup", 7, 50, 17, 0, 17},
{ "damFLup", 7, 50, 17, 0, 17},
{ "damFRup", 7, 50, 17, 0, 17},
{ "DamageLFrontSlide", 7, 50, 12, 0, 12},
{ "DamageLBackSlide", 7, 50, 12, 0, 12},
{ "DamageLLeftSlide", 7, 50, 12, 0, 12},
{ "DamageLRightSlide", 7, 50, 12, 0, 12},
{ "dam", 13, 56, 6, 0, 6},
{ "landDamA", 7, 50, 56, 0, 56},
{ "landDamAst", 13, 50, 17, 0, 17},
{ "cutST", 9, 52, 11, 0, 11},
{ "atDefNG", 9, 52, 6, 0, 6},
{ "die", 13, 56, 8, 8, 8},
{ "DieLargeDamageFront", 7, 0, 9, 9, 9},
{ "DieLargeDamageBack", 7, 0, 9, 9, 9},
{ "DieLargeDamageLeft", 7, 0, 9, 9, 9},
{ "DieLargeDamageRight", 7, 0, 9, 9, 9},
{ "swimwait", 7, 0, 1, 0, 0},
{ "swimingA", 7, 0, 1, 0, 0},
{ "swimP", 7, 0, 30, 30, 30},
{ "atsSwL", 7, 0, 1, 0, 0},
{ "atsSwR", 7, 0, 1, 0, 0},
{ "atbSw", 7, 0, 1, 0, 0},
{ "swimDive", 7, 0, 1, 0, 0},
{ "swimingSt", 7, 0, 1, 0, 0},
{ "swimingB", 7, 0, 1, 0, 0},
{ "swimingC", 7, 0, 1, 0, 2},
{ "SwimAttackMiss", 7, 0, 17, 0, 17},
{ "damSwF", 13, 6, 6, 0, 6},
{ "damSwB", 13, 6, 6, 0, 6},
{ "damSwL", 13, 6, 6, 0, 6},
{ "damSwR", 13, 6, 6, 0, 6},
{ "damSwW", 13, 6, 6, 0, 6},
{ "swimDieA", 13, 6, 25, 25, 25},
{ "swimDieP", 7, 0, 12, 8, 12},
{ "DieMagma", 7, 0, 10, 10, 10},
{ "slideF", 7, 50, 12, 0, 12},
{ "slideB", 7, 50, 12, 0, 12},
{ "slideFEd", 7, 50, 1, 0, 0},
{ "slideBEd", 7, 50, 1, 0, 0},
{ "HSjmpL", 8, 1, 1, 0, 2},
{ "HSjmpR", 8, 1, 1, 0, 2},
{ "HSshoot", 8, 1, 1, 0, 2},
{ "HShangEdL", 8, 1, 1, 0, 2},
{ "HShangEdR", 8, 1, 1, 0, 2},
{ "HShangL", 8, 1, 1, 0, 2},
{ "HShangR", 8, 1, 1, 0, 2},
{ "HShangwaitL", 8, 1, 1, 0, 2},
{ "HShangwaitR", 8, 1, 1, 0, 2},
{ "HShangshootL", 8, 1, 1, 0, 2},
{ "HShangshootR", 8, 1, 1, 0, 2},
{ "HSwallEdL", 8, 1, 1, 0, 2},
{ "HSwallEdR", 8, 1, 1, 0, 2},
{ "HSwallL", 8, 1, 1, 0, 2},
{ "HSwallR", 8, 1, 1, 0, 2},
{ "HSwallwaitL", 8, 1, 1, 0, 2},
{ "HSwallwaitR", 8, 1, 1, 0, 2},
{ "HSwallshootL", 8, 1, 1, 0, 2},
{ "HSwallshootR", 8, 1, 1, 0, 2},
{ "lie", 7, 0, 1, 0, 0},
{ "lieF", 7, 0, 1, 0, 0},
{ "waitST", 9, 2, 11, 0, 11},
{ "WaitStruggleDamage", 9, 2, 6, 0, 6},
{ "waitPP", 7, 0, 1, 0, 0},
{ "pushW", 7, 0, 1, 0, 2},
{ "pullW", 8, 1, 1, 0, 2},
{ "jumpBSt", 7, 0, 1, 0, 3},
{ "jumpB", 7, 0, 1, 0, 2},
{ "waitD", 13, 56, 56, 0, 56},
{ "waitAtoD", 13, 56, 1, 0, 0},
{ "WaitServiceA", 13, 6, 26, 26, 26},
{ "WaitServiceHotA", 13, 6, 27, 27, 27},
{ "dashUpL", 9, 52, 1, 0, 2},
{ "dashUpR", 9, 52, 1, 0, 2},
{ "climbjumpUSt", 12, 5, 1, 0, 2},
{ "climbjumpDSt", 12, 5, 1, 0, 2},
{ "climbjumpLSt", 12, 55, 1, 0, 2},
{ "climbjumpRSt", 12, 55, 1, 0, 2},
{ "climbjumpUEd", 12, 5, 1, 0, 2},
{ "climbjumpDEd", 12, 5, 1, 0, 2},
{ "climbjumpLEd", 12, 5, 1, 0, 2},
{ "climbjumpREd", 12, 5, 1, 0, 2},
{ "hangjumpLSt", 7, 50, 1, 0, 2},
{ "hangjumpRSt", 7, 50, 1, 0, 2},
{ "hangjumpLEd", 7, 50, 1, 0, 2},
{ "hangjumpREd", 7, 50, 1, 0, 2},
{ "DoorKnobPull", 13, 6, 1, 0, 0},
{ "DoorKnobPush", 13, 6, 1, 0, 0},
{ "DoorKnobPullLock", 13, 5, 1, 0, 0},
{ "DoorKnobPushLock", 13, 5, 1, 0, 0},
{ "DoorOpD", 7, 0, 1, 0, 2},
{ "dashB", 13, 6, 1, 0, 2},
{ "MgDig", 13, 6, 1, 0, 0},
{ "MPCutU", 13, 4, 1, 0, 2},
{ "MPCutU_Re", 13, 4, 1, 0, 2},
{ "MPCutLU", 13, 4, 1, 0, 2},
{ "MPCutLU_Re", 13, 4, 1, 0, 2},
{ "MPCutL", 13, 4, 1, 0, 2},
{ "MPCutL_Re", 13, 4, 1, 0, 2},
{ "MPCutLD", 13, 4, 1, 0, 2},
{ "MPCutLD_Re", 13, 4, 1, 0, 2},
{ "MPCutRD", 13, 4, 1, 0, 2},
{ "MPCutRD_Re", 13, 4, 1, 0, 2},
{ "MPCutR", 13, 4, 1, 0, 2},
{ "MPCutR_Re", 13, 4, 1, 0, 2},
{ "MPCutRU", 13, 4, 1, 0, 2},
{ "MPCutRU_Re", 13, 4, 1, 0, 2},
{ "MPCutD_right", 13, 4, 1, 0, 2},
{ "MPCutD_right_Re", 13, 4, 1, 0, 2},
{ "MPCutD_left", 13, 4, 1, 0, 2},
{ "MPCutD_left_Re", 13, 4, 1, 0, 2},
{ "CutPush", 13, 4, 1, 0, 2},
{ "CutPush_Re", 13, 4, 1, 0, 2},
{ "EnemyGuardJust", 13, 100, 6, 0, 6},
{ "LiftB_Before", 7, 0, 1, 0, 0},
{ "LiftM_Before", 7, 0, 1, 0, 0},
{ "LiftB", 7, 0, 1, 0, 0},
{ "LiftS", 7, 0, 1, 0, 0},
{ "LiftM", 7, 0, 1, 0, 0},
{ "LiftL", 7, 0, 1, 0, 2},
{ "ThrowBU", 7, 0, 1, 0, 2},
{ "ThrowSU", 7, 0, 1, 0, 2},
{ "ThrowMU", 7, 0, 1, 0, 2},
{ "ThrowLU", 7, 0, 1, 0, 2},
{ "ThrowBD", 7, 0, 1, 0, 2},
{ "ThrowSD", 7, 0, 1, 0, 2},
{ "MPGuardShield", 7, 2, 4, 0, 4},
{ "MPGuardShield_Impact", 7, 2, 1, 0, 2},
{ "MPGuardShield_Normal", 7, 2, 1, 0, 2},
{ "vjmpChA", 8, 1, 1, 0, 2},
{ "RopeHoldWait", 8, 1, 1, 0, 2},
{ "RopeClimbL", 8, 1, 1, 0, 2},
{ "RopeHoldWait", 8, 1, 1, 0, 2},
{ "RopePull", 8, 1, 1, 0, 2},
{ "RopeTightHold", 8, 1, 1, 0, 2},
{ "RopeFront", 8, 1, 1, 0, 2},
{ "RopeBack", 8, 1, 1, 0, 2},
{ "RopeStruggle", 8, 1, 11, 0, 11},
{ "DiveSt", 7, 0, 1, 0, 2},
{ "Dive", 7, 0, 1, 0, 2},
{ "StoleLand", 13, 6, 1, 0, 2},
{ "DiveDrop", 7, 0, 1, 0, 2},
{ "Float", 9, 2, 1, 0, 0},
{ "FloatAway", 9, 2, 12, 0, 12},
{ "DiveToFloat", 9, 2, 1, 0, 2},
{ "RocketBeetle_Wait", 9, 2, 1, 0, 0},
{ "RocketBeetle_Shoot", 9, 2, 1, 0, 0},
{ "RocketBeetle_Reset", 9, 2, 1, 0, 0},
{ "RocketBeetle_Back", 9, 2, 1, 0, 0},
{ "WhipU", 8, 4, 1, 0, 2},
{ "WhipLU", 8, 4, 1, 0, 2},
{ "WhipL", 8, 4, 1, 0, 2},
{ "WhipLD", 8, 4, 1, 0, 2},
{ "WhipRD", 8, 4, 1, 0, 2},
{ "WhipR", 8, 4, 1, 0, 2},
{ "WhipRU", 8, 4, 1, 0, 2},
{ "WhipBackRD", 7, 0, 1, 0, 2},
{ "WhipBackR", 7, 0, 1, 0, 2},
{ "WhipBackRU", 7, 0, 1, 0, 2},
{ "WhipBackU", 7, 0, 1, 0, 2},
{ "WhipBackLU", 7, 0, 1, 0, 2},
{ "WhipBackL", 7, 0, 1, 0, 2},
{ "WhipBackLD", 7, 0, 1, 0, 2},
{ "turnBack", 13, 6, 1, 0, 2},
{ "atLtoR", 7, 0, 1, 0, 0},
{ "atRtoL", 7, 0, 1, 0, 0},
{ "ChuchuStruggle", 9, 52, 11, 0, 11},
{ "ChuchuStruggle_big", 9, 52, 11, 0, 11},
{ "ChuchuStruggle_act", 9, 52, 1, 0, 2},
{"ChuchuStruggle_Escape", 9, 52, 1, 0, 2},
{ "Surprise", 13, 56, 12, 0, 12},
{ "Danger", 9, 52, 23, 23, 23},
{ "RockRide", 9, 52, 12, 0, 12},
{ "Notice", 13, 56, 29, 29, 29},
{ "waitinsect", 9, 52, 11, 0, 11},
{ "numbA", 12, 55, 7, 0, 7},
{ "numbB", 12, 5, 7, 0, 7},
{ "damFEF", 7, 50, 7, 0, 7},
{ "damFEB", 7, 50, 7, 0, 7},
{ "damFEL", 7, 50, 7, 0, 7},
{ "damFER", 7, 50, 7, 0, 7},
{ "getA", 7, 0, 1, 0, 0},
{ "getAwait", 7, 0, 1, 21, 21},
{ "GetBig", 7, 0, 1, 0, 0},
{ "GetBigWait", 7, 0, 1, 20, 20},
{ "BoxOpSmall", 7, 0, 1, 0, 0},
{ "BoxOp", 7, 0, 1, 28, 28},
{ "cutUSt", 7, 100, 1, 0, 2},
{ "cutU", 7, 100, 1, 0, 2},
{ "cutUEd", 9, 100, 1, 0, 2},
{ "cutUNG", 9, 100, 1, 0, 2},
{ "WaitLookRound", 13, 56, 1, 22, 22},
{ "entrance", 13, 6, 18, 18, 18},
{ "MPPosePower", 13, 255, 1, 0, 2},
{ "MPPosePowerL", 13, 255, 1, 0, 2},
{ "BinswingS", 13, 5, 1, 0, 0},
{ "BinswingU", 13, 5, 1, 0, 0},
{ "Binout", 13, 5, 19, 19, 19},
{ "Drift", 7, 0, 7, 0, 7},
{ "swimDieARevive", 13, 6, 17, 0, 17},
{ "MgLieFRevive", 7, 0, 17, 0, 17},
{ "CatchL", 13, 6, 1, 0, 0},
{ "CatchR", 13, 6, 1, 0, 0},
{ "BattleReady", 9, 52, 1, 0, 2},
{ "RollJump", 13, 6, 1, 0, 2},
{ "TansuOpen", 13, 6, 1, 0, 0},
{ "TansuClose", 13, 6, 1, 0, 0},
{ "BedSleepL", 13, 6, 31, 31, 31},
{ "BedSleep", 13, 6, 31, 31, 31},
{ "BedAwake", 8, 1, 32, 32, 32},
{ "Bird_Glide", 8, 1, 1, 0, 0},
{ "Bird_GlideAround", 8, 1, 1, 0, 0},
{ "Bird_Reach", 8, 5, 40, 40, 40},
{ "Bird_GetWait", 8, 0, 41, 41, 41},
{ "Bird_Accel", 8, 1, 4, 0, 4},
{ "Bird_Damage", 8, 1, 6, 0, 6},
{ "Bird_DamageSmall", 8, 1, 6, 0, 6},
{ "Bird_DamageTornado", 8, 1, 7, 0, 7},
{ "Bird_Call", 10, 3, 1, 0, 55},
{ "SwordPullSt", 13, 6, 33, 33, 33},
{ "SwordPullWait", 8, 1, 1, 0, 34},
{ "SwordPull", 8, 1, 35, 35, 35},
{ "SwordSirenSt", 13, 1, 36, 36, 36},
{ "SwordSirenStWait", 8, 1, 36, 36, 36},
{ "SwordSirenRaise", 8, 1, 37, 37, 37},
{ "SwordSirenRaiseWait", 8, 1, 37, 37, 37},
{ "SwordSirenStick", 8, 1, 38, 38, 38},
{ "SwordSirenAfter", 8, 100, 39, 39, 39},
{ "SwitchDial_st", 9, 4, 1, 0, 2},
{ "SwitchDial_stL", 9, 4, 1, 0, 2},
{ "SwitchDial_LtoR", 9, 4, 1, 0, 2},
{ "SwitchDial_push", 9, 4, 1, 0, 2},
{ "TruckLtoR", 12, 5, 1, 0, 2},
{ "TruckFrontToBack", 12, 5, 1, 0, 2},
{ "TruckJumpSt", 12, 5, 1, 0, 2},
{ "TruckJump", 12, 5, 1, 0, 2},
{ "TruckJumpEnd", 12, 5, 12, 0, 12},
{ "TruckBrake", 12, 5, 11, 0, 11},
{ "TruckIn", 13, 6, 1, 0, 0},
{ "TruckOut", 13, 6, 1, 0, 0},
{ "DieTruck", 13, 56, 42, 42, 42},
{ "DieTruckRevive", 13, 56, 17, 0, 17},
{ "MgDigIn", 7, 0, 1, 0, 2},
{ "MgDigOut", 7, 0, 1, 0, 2},
{ "MgLieF_L", 7, 0, 1, 0, 0},
{ "MgLieF_R", 7, 0, 1, 0, 0},
{ "MgAttackL", 7, 0, 4, 0, 4},
{ "MgAttackR", 7, 0, 4, 0, 4},
{ "MgDashL", 7, 0, 1, 0, 2},
{ "MgDashR", 7, 0, 1, 0, 2},
{ "MgDamage", 7, 0, 6, 0, 6},
{ "MgWaitBreath", 7, 0, 16, 0, 16},
{ "MgLieUp", 7, 0, 1, 0, 2},
{ "LiftRemly", 13, 6, 1, 21, 21},
{ "ThrowRemlyUp", 13, 6, 1, 21, 21},
{ "LiftRemlyUtoM", 13, 6, 1, 21, 21},
{ "Bird_FestivalStart", 9, 2, 43, 43, 43},
{ "GetSurprise", 13, 6, 44, 44, 44},
{ "GirahimGrapple", 9, 2, 1, 0, 2},
{ "GirahimPull", 9, 2, 1, 0, 2},
{ "GirahimPullUp", 9, 2, 1, 0, 2},
{ "GirahimChange", 13, 100, 12, 0, 12},
{ "RopeWalk", 7, 0, 1, 0, 2},
{ "RopeBend", 9, 2, 1, 0, 2},
{ "RopeHangBend", 12, 5, 1, 0, 0},
{ "RopeHangUp", 12, 5, 1, 0, 0},
{ "RopeBalance", 255, 255, 12, 57, 12},
{ "SetSekibanA", 13, 6, 1, 0, 0},
{ "SetSekibanB", 13, 6, 1, 0, 0},
{ "SetSekibanC", 13, 6, 1, 0, 0},
{ "pushTSWst", 7, 0, 1, 0, 2},
{ "pushTSW", 7, 0, 1, 0, 2},
{ "PushLog", 7, 0, 1, 0, 2},
{ "AsuraCutRight", 12, 5, 45, 0, 45},
{ "AsuraCutLeft", 12, 5, 45, 0, 45},
{ "AsuraCutUp", 12, 5, 45, 0, 45},
{ "AsuraCutRightSt", 12, 5, 46, 0, 46},
{ "AsuraCutLeftSt", 12, 5, 46, 0, 46},
{ "AsuraCutUpSt", 12, 5, 46, 0, 46},
{ "AsuraCutRightEd", 12, 5, 47, 0, 47},
{ "AsuraCutLeftEd", 12, 5, 47, 0, 47},
{ "AsuraCutUpEd", 12, 5, 47, 0, 47},
{ "AsuraSwordWait", 12, 5, 1, 0, 2},
{ "AsuraSwordLift", 12, 5, 1, 0, 2},
{ "BinScoop", 13, 5, 1, 0, 0},
{ "Fire", 9, 2, 1, 0, 2},
{ "crouch", 13, 6, 1, 0, 2},
{ "CannonWait", 13, 6, 48, 48, 48},
{ "Seal", 13, 6, 1, 0, 2},
{ "SealLoop", 13, 6, 1, 0, 2},
{ "SealFinish", 13, 6, 1, 0, 2},
{ "FinishEd", 13, 100, 1, 0, 2},
{ "SitDown", 13, 6, 1, 0, 0},
{ "SitWait", 13, 6, 1, 0, 0},
{ "SitWaitServiceA", 13, 6, 52, 52, 52},
{ "roofwait", 12, 5, 1, 0, 0},
{ "roofhang", 12, 5, 1, 0, 0},
{ "MgStruggle", 9, 52, 11, 0, 11},
{ "MgStruggle_act", 9, 52, 1, 0, 2},
{ "MgStruggle_Escape", 9, 52, 1, 0, 2},
{ "KrakenAppearance", 9, 2, 49, 49, 49},
{ "MgBury", 7, 0, 1, 0, 0},
{ "GetFlower", 7, 0, 50, 50, 50},
{ "DoorLargeOpen", 13, 6, 1, 0, 0},
{ "DoorLargeClose", 7, 0, 1, 0, 0},
{ "HarpPlayFinish", 7, 0, 1, 0, 0},
{ "LightningL", 13, 4, 53, 53, 53},
{ "LightningR", 13, 4, 53, 53, 53},
{ "LastAttack", 8, 100, 54, 54, 54},
{ "at", 255, 255, 57, 57, 2},
{ "take", 255, 255, 57, 57, 57},
{ "takeL", 255, 255, 57, 57, 57},
{ "takeR", 255, 255, 57, 57, 57},
{ "Take2", 255, 255, 57, 57, 57},
{ "waitAtoS", 9, 1, 57, 57, 2},
{ "damD", 255, 56, 6, 57, 6},
{ "Ashootwait", 13, 1, 57, 57, 2},
{ "Arelord", 8, 3, 57, 57, 2},
{ "Ashoot", 8, 3, 57, 57, 2},
{ "ArelordTame", 8, 3, 57, 57, 2},
{ "Ashootwait", 13, 1, 57, 57, 2},
{ "Arelord", 8, 3, 57, 57, 2},
{ "Ashoot", 8, 3, 57, 57, 2},
{ "damSw", 13, 6, 6, 57, 6},
{ "HSwait", 8, 1, 57, 57, 2},
{ "VacuumWait", 12, 5, 57, 57, 57},
{ "MPPoseFront", 13, 255, 57, 57, 2},
{ "MPPoseAround", 13, 255, 57, 57, 57},
{ "MPPoseAroundBack", 13, 255, 57, 57, 2},
{ "MPPoseDashFront", 13, 255, 57, 57, 2},
{ "MPPoseDashAround", 13, 255, 57, 57, 57},
{ "MPPoseDashAroundBack", 13, 255, 57, 57, 2},
{ "LiftB_UtoD", 7, 0, 57, 57, 2},
{ "LiftS_UtoD", 7, 0, 57, 57, 57},
{ "LiftLWalk", 7, 0, 57, 57, 2},
{ "MPGuardPose", 255, 255, 57, 57, 57},
{ "RockRide", 255, 56, 12, 57, 12},
{ "BinDrinkSt", 255, 5, 13, 13, 13},
{ "BinDrink", 255, 5, 14, 57, 14},
{ "BinDrinkEd", 255, 5, 15, 57, 15},
{ "HarpPose", 7, 6, 1, 0, 0},
{ "HarpPlayGo", 7, 1, 1, 0, 0},
{ "HarpPlayCome", 7, 0, 1, 0, 0},
{ "BinHold", 255, 5, 57, 57, 57},
{ "BinShield", 9, 5, 24, 24, 24},
};
#pragma pop
const s32 daPlayerModelBase_c::sUnkDuration = 0x2400;
const u8 daPlayerModelBase_c::sShieldDurabilities[10] = {16, 24, 32, 24, 36, 48, 12, 16, 20, 48};
const u8 daPlayerModelBase_c::sShieldRegenTimes[10] = {0, 0, 0, 0, 0, 0, 90, 90, 90, 0};
@@ -253,7 +702,7 @@ void daPlayerModelBase_c::allocFrmHeap(mHeapAllocator_c *allocator, u32 size, co
}
void daPlayerModelBase_c::allocExternalDataBuffers() {
mpExternalAnmCharBuffer = heap_allocator.alloc(0xD800);
mpExternalAnmCharBuffer = heap_allocator.alloc(0x2400 * 6);
mpAnmCharBuffer = heap_allocator.alloc(0x1000);
mpTexPatBuffer = heap_allocator.alloc(0x1000);
mpTexSrtBuffer = heap_allocator.alloc(0x1000);
@@ -973,6 +1422,16 @@ void daPlayerModelBase_c::fn_8005F890(nw4r::math::MTX34 *result) {
}
}
void daPlayerModelBase_c::fn_8005FB90(nw4r::math::MTX34 *result) {
// Will suffer from the same problem as above, so not too interested rn
static const u16 sNodeIdsLegs1[] = {PLAYER_MAIN_NODE_LEG_L1, PLAYER_MAIN_NODE_LEG_R1};
static const Vec sLegVecs[] = {
{ 30.0f, 0.0f, 0.0f},
{39.3635f, 0.0f, 0.0f},
{ 14.18f, 0.0f, 0.0f}
};
}
void daPlayerModelBase_c::mainModelTimingA(u32 nodeId, nw4r::g3d::ChrAnmResult *result) {
adjustMainModelChrAnm((PlayerMainModelNode_e)nodeId, result);
}
@@ -988,7 +1447,11 @@ void daPlayerModelBase_c::mainModelTimingB(u32 nodeId, nw4r::g3d::WorldMtxManip
}
}
void daPlayerModelBase_c::mainModelTimingC(nw4r::math::MTX34 *result) {}
void daPlayerModelBase_c::mainModelTimingC(nw4r::math::MTX34 *result) {
fn_8005FB90(result);
fn_8005F890(result);
mMainMdl.setField_0x58(1);
}
void daPlayerModelBase_c::handsCallbackC(
nw4r::math::MTX34 *pMtxArray, nw4r::g3d::ResMdl mdl, nw4r::g3d::FuncObjCalcWorld *pFuncObj
@@ -1038,6 +1501,37 @@ void daPlayerModelBase_c::setShieldTransform(bool inHand) {
setTransformAndCalc(mShieldMdl, &targetTransform);
}
void daPlayerModelBase_c::loadTwoAnmChrs(s32 childIdx, s32 animIdx, s32 animIdx2, bool b) {
void *data = (u8 *)mpExternalAnmCharBuffer + childIdx * 0x2400;
u32 size1;
void *data2;
u32 size2;
s32 otherChildIdx = 3;
if (childIdx == 0) {
otherChildIdx = 1;
}
if (animIdx == animIdx2) {
size1 = 0x2400 * 2;
if (b) {
size1 *= 2;
}
size2 = 0;
data2 = data;
} else {
size1 = 0x2400;
if (b) {
size1 *= 2;
}
size2 = size1;
data2 = (u8 *)data + size1;
}
loadAnmChr(childIdx, animIdx, data, size1);
loadAnmChr(otherChildIdx, animIdx2, data2, size2);
}
nw4r::g3d::ResFile daPlayerModelBase_c::getItemResFile(const char *name, mAllocator_c &allocator) {
SizedString<64> buf;
buf.sprintf("dat/%s.brresC", name);
@@ -1106,19 +1600,103 @@ nw4r::g3d::ResAnmTexSrt daPlayerModelBase_c::getExternalAnmTexSrt(const char *na
return result;
}
void daPlayerModelBase_c::loadSound(nw4r::g3d::ResFile file, const char *name, s32 animIdx) {
bool daPlayerModelBase_c::canStart(bool force, u16 faceIdx, u16 invalidValue, u16 *out1, u16 *out2) const {
if (force) {
*out2 = faceIdx;
} else {
*out1 = faceIdx;
if (*out2 != invalidValue) {
return false;
}
}
return true;
}
void daPlayerModelBase_c::setFaceTexPat(s32 faceIdx, bool force) {
// TODO branching
if ((force || ((mFaceAnmTexPatIdx1 != faceIdx || mFaceAnmTexPatIdx1 != 1) &&
(!checkFaceUpdateFlags(0x40000000) || (faceIdx != 1)))) &&
faceIdx != 0x38) {
offFaceUpdateFlags(0x40000000);
if (canStart(force, faceIdx, 0x39, &mFaceAnmTexPatIdx1, &mFaceAnmTexPatIdx2)) {
nw4r::g3d::ResAnmTexPat anm = getExternalAnmTexPat(sFaceResNames[faceIdx], mpTexPatBuffer, 0x1000);
mFaceTexPat.setAnm(mFaceMdl, anm, 0, m3d::PLAY_MODE_4);
mFaceTexPat.setFrame(0.0f, 0);
}
}
}
void daPlayerModelBase_c::setFaceTexSrt(s32 faceIdx, bool force) {
offFaceUpdateFlags(0x80000000);
if (canStart(force, faceIdx, 0x39, &mFaceAnmTexSrtIdx1, &mFaceAnmTexSrtIdx2)) {
nw4r::g3d::ResAnmTexSrt anm = getExternalAnmTexSrt(sFaceResNames[faceIdx], mpTexSrtBuffer, 0x1000);
mFaceTexSrt.setAnm(mFaceMdl, anm, 0, m3d::PLAY_MODE_4);
mFaceTexSrt.setFrame(0.0f, 0);
}
}
void daPlayerModelBase_c::setFaceAnmChr(s32 faceIdx, bool force) {
// TODO branching
if (faceIdx != 0x38 && (force || (!checkFaceUpdateFlags(0x20000000) || (faceIdx != 0 && faceIdx != 2)))) {
offFaceUpdateFlags(0x20000000);
if (canStart(force, faceIdx, 0x39, &mFaceAnmChrIdx1, &mFaceAnmChrIdx2)) {
nw4r::g3d::ResAnmChr anm = getExternalAnmChr(sFaceResNames[faceIdx], mpAnmCharBuffer, 0x1000);
mFaceAnmChr.setAnm(mFaceMdl, anm, m3d::PLAY_MODE_4);
mFaceAnmChr.setFrameOnly(0.0f);
mFaceMdl.setAnm(mFaceAnmChr);
}
}
}
void daPlayerModelBase_c::loadAnmChr(s32 childIdx, s32 animIdx, void *dest, u32 maxSize) {
nw4r::g3d::ResAnmChr anm = getExternalAnmChr(sAnimations[animIdx].animName, dest, maxSize);
mAnmChrs[childIdx].setAnm(mMainMdl, anm, m3d::PLAY_MODE_4);
nw4r::g3d::AnmObjChr *animObj = static_cast<nw4r::g3d::AnmObjChr *>(mAnmChrs[childIdx].getAnimObj());
animObj->Release();
nw4r::g3d::ResMdl bodyMdl = mMainMdl.getResMdl();
if (isBodyAnmPart_0_2_4(childIdx)) {
animObj->Bind(bodyMdl, PLAYER_MAIN_NODE_WAIST, nw4r::g3d::AnmObjChr::BIND_PARTIAL);
animObj->Bind(bodyMdl, PLAYER_MAIN_NODE_CENTER, nw4r::g3d::AnmObjChr::BIND_ONE);
} else {
animObj->Bind(bodyMdl, PLAYER_MAIN_NODE_BACKBONE_1, nw4r::g3d::AnmObjChr::BIND_PARTIAL);
}
mAnmChrBlend.attach(childIdx, &mAnmChrs[childIdx], 1.0f);
mMainMdl.setAnm(mAnmChrBlend);
mAnimations[childIdx] = animIdx;
mAnmChrs[childIdx].setField_0x35(0);
}
void daPlayerModelBase_c::removeAnmChr(s32 childIdx) {
mAnmChrs[childIdx].getAnimObj()->Release();
mAnmChrBlend.detach(childIdx);
mAnimations[childIdx] = 443;
}
void daPlayerModelBase_c::loadSound(nw4r::g3d::ResFile &file, const char *name, s32 childIdx) {
SoundSource *s = getSoundSource();
mCurrentAnmChrIdx = animIdx;
mCurrentAnmChrIdx = childIdx;
SizedString<64> path;
path.sprintf("%s.brasd", name);
void *dat = file.GetExternalData(path);
if (dat == nullptr && file == mCurrentRes) {
dat = mPlCommonSoundRes.GetExternalData(path);
}
mMainMdl.setSoundRelated(mAnimations[animIdx], dat);
mMainMdl.setSoundRelated(mAnimations[childIdx], dat);
s->load(dat, name);
}
void daPlayerModelBase_c::loadSoundForAnim(s32 childIdx) {
SoundSource *s = getSoundSource();
s32 anim = mAnimations[childIdx];
mCurrentAnmChrIdx = childIdx;
if (anim != mMainMdl.getField_0x5A()) {
loadSound(mCurrentRes.IsValid() ? mCurrentRes : mPlCommonSoundRes, sAnimations[anim].animName, childIdx);
} else {
s->load(mMainMdl.getSoundData(), sAnimations[anim].animName);
}
s->setRate(mAnmChrs[childIdx].getRate());
}
void daPlayerModelBase_c::syncSoundWithAnim() {
f32 frame = mAnmChrs[mCurrentAnmChrIdx].getFrame();
getSoundSource()->setFrame(frame);
@@ -1209,6 +1787,51 @@ void daPlayerModelBase_c::updateCachedPositions() {
}
}
void daPlayerModelBase_c::setPosCopy3() {
static const Vec posCopy3v0 = {0.0f, 150.0f, 0.0f};
static const Vec posCopy3v1 = {0.0f, 40.0f, 0.0f};
static const Vec posCopy3v2 = {0.0f, 95.0f, 0.0f};
static const Vec posCopy3v3 = {0.0f, 14.0f, 0.0f};
if (checkCurrentAction(/* FREE_FALL*/ 0x13) || checkCurrentAction(/* WALKING_ON_TIGHTROPE */ 0x81)) {
poscopy3 = position;
poscopy3.y += 180.0f;
} else if (checkCurrentAction(/* BEING_PULLED_BY_CLAWS */ 0x5A)) {
poscopy3 = poscopy2;
} else if (checkActionFlags(FLG0_SWING_ROPE)) {
poscopy3 = position;
} else if (checkActionFlagsCont(0x20000000) || checkCurrentAction(0x70) ||
checkCurrentAction(/* HANG_ON_ZIP */ 0x85)) {
poscopy3 = position;
poscopy3.y -= 100.0f;
} else if (checkActionFlags(FLG0_HANGING_LEDGE) || (getCurrentAction() >= 0x82 && getCurrentAction() <= 0x84)) {
const nw4r::math::MTX34 *c = mHeadMdl.getLocalMtx();
poscopy3.x = c->_03;
poscopy3.y = c->_13;
poscopy3.z = c->_23;
} else if (checkCurrentAction(/* SLIDING */ 0x09)) {
poscopy3 = position + mVec3_c(posCopy3v2);
} else {
mMtx_c mtx;
mMainMdl.getLocalMtx(mtx);
f32 f;
const Vec *v;
if (checkActionFlags(FLG0_IN_WATER) || checkCurrentAction(/* SWIM_DASH_INFO_AIR */ 0x57)) {
v = &posCopy3v3;
f = position.y;
} else {
if (checkCurrentAction(/* VOID_SAND */ 0x4C)) {
v = &posCopy3v3;
} else {
v = checkActionFlags(FLG0_CRAWLING) ? &posCopy3v1 : &posCopy3v0;
}
f = mtx.m[1][3];
}
poscopy3.set(v->x + position.x, v->y, v->z + position.z);
poscopy3.y += f;
}
}
void daPlayerModelBase_c::fn_80061410() {
// Just getting weak functions to appear here
alwaysRet0();