diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f4a17715..9f74df7c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -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 diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index bf18e973..c379de1b 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -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; diff --git a/src/d/d_player_mdl.cpp b/src/d/d_player_mdl.cpp index 5d73a345..e91aac8d 100644 --- a/src/d/d_player_mdl.cpp +++ b/src/d/d_player_mdl.cpp @@ -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(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();