#ifndef D_A_PLAYER_MDL_H #define D_A_PLAYER_MDL_H #include "d/col/cc/d_cc_d.h" #include "d/d_player_act.h" #include "m/m3d/m_anmchr.h" #include "m/m3d/m_anmchrblend.h" #include "m/m3d/m_anmmatclr.h" #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" #include "toBeSorted/stage_render_stuff.h" struct PlayerAnimation { /* 0x00 */ const char *animName; /* 0x04 */ u8 field_0x04; /* 0x05 */ u8 field_0x05; /* 0x06 */ u16 mFaceTexPatIdx; /* 0x08 */ u16 mFaceTexSrtIdx; /* 0x0A */ u16 mFaceAnmChrIdx; }; class daPlayerModelBase_c; class daPlBaseScnObjCallback_c : public dScnCallback_c { public: daPlBaseScnObjCallback_c(dAcObjBase_c *b) : dScnCallback_c(b), mpPlayer(b) {} /* vt 0x10 */ virtual void ExecCallback_CALC_MAT(nw4r::g3d::ScnObj::Timing, nw4r::g3d::ScnObj *, u32, void *) override; /* 0x18 */ virtual void ExecCallback_DRAW_OPA(nw4r::g3d::ScnObj::Timing, nw4r::g3d::ScnObj *, u32, void *) override; private: /* 0x0C */ dAcObjBase_c *mpPlayer; }; class daPlBaseMdlCallback_c : public m3d::mdl_c::mdlCallback_c { public: virtual void ExecCallbackA(nw4r::g3d::ChrAnmResult *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *) override; void setNodeIds(u16 min, u16 max) { mNodeIdMin = min; mNodeIdMax = max; } private: /* 0x30 */ u16 mNodeIdMin; /* 0x32 */ u16 mNodeIdMax; }; class daPlBaseMdl_c : public m3d::mdl_c { public: daPlBaseMdl_c() : mpSoundData(nullptr) {} virtual bool setAnm(m3d::banm_c &anm) override; virtual void remove() override; bool create( daPlayerModelBase_c *player, nw4r::g3d::ResMdl mdl, mAllocator_c *alloc, u32 bufferOption, u32 nView, u32 *pSize ); void setBlendNodeRange(u16, u16, f32); nw4r::g3d::ChrAnmResult *getNodeResult(u16 node) { return mCallback.getNodeResult(node); } void setSoundRelated(u16 id, void *data) { field_0x5A = id; 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; /* 0x5A */ u16 field_0x5A; /* 0x5C */ void *mpSoundData; }; class daPlBaseMainCallback_c : public m3d::callback_c { public: virtual void timingA(u32, nw4r::g3d::ChrAnmResult *, nw4r::g3d::ResMdl) override; virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; virtual void timingC(nw4r::math::MTX34 *, nw4r::g3d::ResMdl) override; void setPlayer(daPlayerModelBase_c *p) { mpPlayer = p; } private: daPlayerModelBase_c *mpPlayer; }; class daPlBaseAnmChr_c : public m3d::anmChr_c { public: daPlBaseAnmChr_c() : field_0x35(0), field_0x36(0) {} void play() override; bool isFinished(); void setField_0x35(u8 value) { field_0x35 = value; } private: /* 0x35 */ u8 field_0x35; /* 0x36 */ u8 field_0x36; }; class daPlBaseHandsCallback_c : public nw4r::g3d::ICalcWorldCallback { public: virtual void ExecCallbackC( nw4r::math::MTX34 *pMtxArray, nw4r::g3d::ResMdl mdl, nw4r::g3d::FuncObjCalcWorld *pFuncObj ) override; // at 0x14 void setPlayer(daPlayerModelBase_c *p) { mpPlayer = p; } private: /* 0x04 */ daPlayerModelBase_c *mpPlayer; }; class daPlBaseHeadCallback_c : public m3d::callback_c { public: virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; void setPlayer(daPlayerModelBase_c *p) { mpPlayer = p; } private: daPlayerModelBase_c *mpPlayer; }; // Vtable at 8050da00, dtor reveals two superclasses // until dAcObjBase_c. Name unknown class daPlayerModelBase_c : public daPlayerActBase_c { public: daPlayerModelBase_c() : mSwordRes(nullptr), mAlinkRes(nullptr), mPlCommonAnimeRes(nullptr), mPlCommonSoundRes(nullptr), mCurrentRes(nullptr), mAlink2Res(nullptr), mScnObjCallback(this), mScnCallback1(this), mScnCallback2(this), mScnCallback3(this), mScnCallback4(this), mScnCallback5(this) {} virtual ~daPlayerModelBase_c() {} enum TunicType_e { TUNIC_0, TUNIC_1, TUNIC_SILENT, }; enum PlayerMainModelFace_e { PLAYER_FACE_DEFAULT = 0, PLAYER_FACEMABA01 = 1, PLAYER_FACE_M = 2, PLAYER_FACE_HA = 3, PLAYER_FACE_CUT = 4, PLAYER_FACE_CUTAROUND = 5, PLAYER_FACE_DAMAGE = 6, PLAYER_FACE_DAMAGELARGE = 7, PLAYER_FACE_DIE = 8, PLAYER_FACE_DIELARGEDAMAGE = 9, PLAYER_FACE_DIEMAGMA = 10, PLAYER_FACE_PAIN = 11, PLAYER_FACE_WA = 12, PLAYER_FACE_DRINKST = 13, PLAYER_FACE_DRINK = 14, PLAYER_FACE_DRINKED = 15, PLAYER_FACE_BREATH = 16, PLAYER_FACE_CLOSE = 17, PLAYER_FACE_ENTRANCE = 18, PLAYER_FACE_BINOUT = 19, PLAYER_FACE_GETBIGWAIT = 20, PLAYER_FACE_GETAWAITNICE = 21, PLAYER_FACE_WAITLOOKROUND = 22, PLAYER_FACE_DANGER = 23, PLAYER_FACE_BINSHIELD = 24, PLAYER_FACE_SWIMDIEA = 25, PLAYER_FACE_WAITSERVICEA = 26, PLAYER_FACE_WAITSERVICEHOTA = 27, PLAYER_FACE_BOXOP = 28, PLAYER_FACE_NOTICE = 29, PLAYER_FACE_SWIMP = 30, PLAYER_FACE_BEDSLEEP = 31, PLAYER_FACE_BEDAWAKE = 32, PLAYER_FACE_SWORDPULLST = 33, PLAYER_FACE_SWORDPULLWAIT = 34, PLAYER_FACE_SWORDPULL = 35, PLAYER_FACE_SWORDSIRENST = 36, PLAYER_FACE_SWORDSIRENRAISE = 37, PLAYER_FACE_SWORDSIRENSTICK = 38, PLAYER_FACE_SWORDSIRENAFTER = 39, PLAYER_FACE_BIRD_REACH = 40, PLAYER_FACE_BIRD_GETWAIT = 41, PLAYER_FACE_DIETRUCK = 42, PLAYER_FACE_BIRD_FESTIVALSTART = 43, PLAYER_FACE_GETSURPRISE = 44, PLAYER_FACE_ASURACUT = 45, PLAYER_FACE_ASURACUTST = 46, PLAYER_FACE_ASURACUTED = 47, PLAYER_FACE_CANNONWAIT = 48, PLAYER_FACE_KRAKENAPPEARANCE = 49, PLAYER_FACE_GETFLOWER = 50, PLAYER_FACE_HARP = 51, PLAYER_FACE_SITWAITSERVICEA = 52, PLAYER_FACE_LIGHTNING = 53, PLAYER_FACE_LASTATTACK = 54, PLAYER_FACE_BIRD_CALL = 55, PLAYER_FACE_NONE = 56, PLAYER_FACE_MAX = 57, }; enum PlayerMainAnim_e { PLAYER_ANIM_ATRFW = 0, PLAYER_ANIM_ATRFW_R = 1, PLAYER_ANIM_ATRFD = 2, PLAYER_ANIM_ATRFD_R = 3, PLAYER_ANIM_ATRBW = 4, PLAYER_ANIM_ATRBW_R = 5, PLAYER_ANIM_ATRBD = 6, PLAYER_ANIM_ATRBD_R = 7, PLAYER_ANIM_ATRSWL = 8, PLAYER_ANIM_ATRSDL = 9, PLAYER_ANIM_ATRSWR = 10, PLAYER_ANIM_ATRSDR = 11, PLAYER_ANIM_ATSWL = 12, PLAYER_ANIM_ATSDL = 13, PLAYER_ANIM_ATSWR = 14, PLAYER_ANIM_ATSDR = 15, PLAYER_ANIM_ATSWL_RIGHT = 16, PLAYER_ANIM_ATSDL_RIGHT = 17, PLAYER_ANIM_ATL = 18, PLAYER_ANIM_ATR = 19, PLAYER_ANIM_DASHA = 20, PLAYER_ANIM_DASHS = 21, PLAYER_ANIM_ATRBWH = 22, PLAYER_ANIM_ATBW = 23, PLAYER_ANIM_ATBD = 24, PLAYER_ANIM_WALKH = 25, PLAYER_ANIM_WAITS = 26, PLAYER_ANIM_WALKS = 27, PLAYER_ANIM_STEPL = 28, PLAYER_ANIM_STEPR = 29, PLAYER_ANIM_ATSJLST = 30, PLAYER_ANIM_ATSJLED = 31, PLAYER_ANIM_ATSJRST = 32, PLAYER_ANIM_ATSJRED = 33, PLAYER_ANIM_ATSJFST = 34, PLAYER_ANIM_ATSJFED = 35, PLAYER_ANIM_ROLLBST = 36, PLAYER_ANIM_ROLLBED = 37, PLAYER_ANIM_WAITB = 38, PLAYER_ANIM_WAITBTOA = 39, PLAYER_ANIM_SJMPST = 40, PLAYER_ANIM_SJMPED = 41, PLAYER_ANIM_ROLLF = 42, PLAYER_ANIM_ROLLFMIS = 43, PLAYER_ANIM_JUMPST = 44, PLAYER_ANIM_JUMPSED = 45, PLAYER_ANIM_VJMP = 46, PLAYER_ANIM_VJMPCHA = 47, PLAYER_ANIM_VJMPCHB = 48, PLAYER_ANIM_VJMPCL = 49, PLAYER_ANIM_HANGL = 50, PLAYER_ANIM_HANGR = 51, PLAYER_ANIM_HANG = 52, PLAYER_ANIM_CLIMBHANG = 53, PLAYER_ANIM_CLIMBSLIDEL = 54, PLAYER_ANIM_CLIMBSLIDER = 55, PLAYER_ANIM_CLIMBHANGMISS = 56, PLAYER_ANIM_CLIMBSTRUGGLE = 57, PLAYER_ANIM_CLIMBIVYHANG = 58, PLAYER_ANIM_CLIMBIVYL = 59, PLAYER_ANIM_CLIMBIVYR = 60, PLAYER_ANIM_CLIMBIVYL_ST = 61, PLAYER_ANIM_CLIMBIVYR_ST = 62, PLAYER_ANIM_CLIMBIVYSLIDEL = 63, PLAYER_ANIM_CLIMBIVYSLIDER = 64, PLAYER_ANIM_CLIMBIVYSLANTLU_RD = 65, PLAYER_ANIM_CLIMBIVYSLIDERU_LD = 66, PLAYER_ANIM_LADUPST = 67, PLAYER_ANIM_LADUPEDL = 68, PLAYER_ANIM_LADUPEDR = 69, PLAYER_ANIM_LADDWST = 70, PLAYER_ANIM_LADDWEDL = 71, PLAYER_ANIM_LADDWEDR = 72, PLAYER_ANIM_LADRTOL = 73, PLAYER_ANIM_LADLTOR = 74, PLAYER_ANIM_LADJUMPUPST = 75, PLAYER_ANIM_LADJUMPDOWNST = 76, PLAYER_ANIM_LADJUMPUPED = 77, PLAYER_ANIM_LADJUMPDOWNED = 78, PLAYER_ANIM_CUTT = 79, PLAYER_ANIM_CUTTB = 80, PLAYER_ANIM_CUTTL = 81, PLAYER_ANIM_CUTTLB = 82, PLAYER_ANIM_CUTJST = 83, PLAYER_ANIM_CUTJED = 84, PLAYER_ANIM_DAMF = 85, PLAYER_ANIM_DAMB = 86, PLAYER_ANIM_DAML = 87, PLAYER_ANIM_DAMR = 88, PLAYER_ANIM_DAMAGEMFRONT = 89, PLAYER_ANIM_DAMAGEMBACK = 90, PLAYER_ANIM_DAMAGEMLEFT = 91, PLAYER_ANIM_DAMAGEMRIGHT = 92, PLAYER_ANIM_DAMFF = 93, PLAYER_ANIM_DAMFB = 94, PLAYER_ANIM_DAMFL = 95, PLAYER_ANIM_DAMFR = 96, PLAYER_ANIM_DAMFFUP = 97, PLAYER_ANIM_DAMFBUP = 98, PLAYER_ANIM_DAMFLUP = 99, PLAYER_ANIM_DAMFRUP = 100, PLAYER_ANIM_DAMAGELFRONTSLIDE = 101, PLAYER_ANIM_DAMAGELBACKSLIDE = 102, PLAYER_ANIM_DAMAGELLEFTSLIDE = 103, PLAYER_ANIM_DAMAGELRIGHTSLIDE = 104, PLAYER_ANIM_DAM = 105, PLAYER_ANIM_LANDDAMA = 106, PLAYER_ANIM_LANDDAMAST = 107, PLAYER_ANIM_CUTST = 108, PLAYER_ANIM_ATDEFNG = 109, PLAYER_ANIM_DIE = 110, PLAYER_ANIM_DIELARGEDAMAGEFRONT = 111, PLAYER_ANIM_DIELARGEDAMAGEBACK = 112, PLAYER_ANIM_DIELARGEDAMAGELEFT = 113, PLAYER_ANIM_DIELARGEDAMAGERIGHT = 114, PLAYER_ANIM_SWIMWAIT = 115, PLAYER_ANIM_SWIMINGA = 116, PLAYER_ANIM_SWIMP = 117, PLAYER_ANIM_ATSSWL = 118, PLAYER_ANIM_ATSSWR = 119, PLAYER_ANIM_ATBSW = 120, PLAYER_ANIM_SWIMDIVE = 121, PLAYER_ANIM_SWIMINGST = 122, PLAYER_ANIM_SWIMINGB = 123, PLAYER_ANIM_SWIMINGC = 124, PLAYER_ANIM_SWIMATTACKMISS = 125, PLAYER_ANIM_DAMSWF = 126, PLAYER_ANIM_DAMSWB = 127, PLAYER_ANIM_DAMSWL = 128, PLAYER_ANIM_DAMSWR = 129, PLAYER_ANIM_DAMSWW = 130, PLAYER_ANIM_SWIMDIEA = 131, PLAYER_ANIM_SWIMDIEP = 132, PLAYER_ANIM_DIEMAGMA = 133, PLAYER_ANIM_SLIDEF = 134, PLAYER_ANIM_SLIDEB = 135, PLAYER_ANIM_SLIDEFED = 136, PLAYER_ANIM_SLIDEBED = 137, PLAYER_ANIM_HSJMPL = 138, PLAYER_ANIM_HSJMPR = 139, PLAYER_ANIM_HSSHOOT = 140, PLAYER_ANIM_HSHANGEDL = 141, PLAYER_ANIM_HSHANGEDR = 142, PLAYER_ANIM_HSHANGL = 143, PLAYER_ANIM_HSHANGR = 144, PLAYER_ANIM_HSHANGWAITL = 145, PLAYER_ANIM_HSHANGWAITR = 146, PLAYER_ANIM_HSHANGSHOOTL = 147, PLAYER_ANIM_HSHANGSHOOTR = 148, PLAYER_ANIM_HSWALLEDL = 149, PLAYER_ANIM_HSWALLEDR = 150, PLAYER_ANIM_HSWALLL = 151, PLAYER_ANIM_HSWALLR = 152, PLAYER_ANIM_HSWALLWAITL = 153, PLAYER_ANIM_HSWALLWAITR = 154, PLAYER_ANIM_HSWALLSHOOTL = 155, PLAYER_ANIM_HSWALLSHOOTR = 156, PLAYER_ANIM_LIE = 157, PLAYER_ANIM_LIEF = 158, PLAYER_ANIM_WAITST = 159, PLAYER_ANIM_WAITSTRUGGLEDAMAGE = 160, PLAYER_ANIM_WAITPP = 161, PLAYER_ANIM_PUSHW = 162, PLAYER_ANIM_PULLW = 163, PLAYER_ANIM_JUMPBST = 164, PLAYER_ANIM_JUMPB = 165, PLAYER_ANIM_WAITD = 166, PLAYER_ANIM_WAITATOD = 167, PLAYER_ANIM_WAITSERVICEA = 168, PLAYER_ANIM_WAITSERVICEHOTA = 169, PLAYER_ANIM_DASHUPL = 170, PLAYER_ANIM_DASHUPR = 171, PLAYER_ANIM_CLIMBJUMPUST = 172, PLAYER_ANIM_CLIMBJUMPDST = 173, PLAYER_ANIM_CLIMBJUMPLST = 174, PLAYER_ANIM_CLIMBJUMPRST = 175, PLAYER_ANIM_CLIMBJUMPUED = 176, PLAYER_ANIM_CLIMBJUMPDED = 177, PLAYER_ANIM_CLIMBJUMPLED = 178, PLAYER_ANIM_CLIMBJUMPRED = 179, PLAYER_ANIM_HANGJUMPLST = 180, PLAYER_ANIM_HANGJUMPRST = 181, PLAYER_ANIM_HANGJUMPLED = 182, PLAYER_ANIM_HANGJUMPRED = 183, PLAYER_ANIM_DOORKNOBPULL = 184, PLAYER_ANIM_DOORKNOBPUSH = 185, PLAYER_ANIM_DOORKNOBPULLLOCK = 186, PLAYER_ANIM_DOORKNOBPUSHLOCK = 187, PLAYER_ANIM_DOOROPD = 188, PLAYER_ANIM_DASHB = 189, PLAYER_ANIM_MGDIG = 190, PLAYER_ANIM_MPCUTU = 191, PLAYER_ANIM_MPCUTU_RE = 192, PLAYER_ANIM_MPCUTLU = 193, PLAYER_ANIM_MPCUTLU_RE = 194, PLAYER_ANIM_MPCUTL = 195, PLAYER_ANIM_MPCUTL_RE = 196, PLAYER_ANIM_MPCUTLD = 197, PLAYER_ANIM_MPCUTLD_RE = 198, PLAYER_ANIM_MPCUTRD = 199, PLAYER_ANIM_MPCUTRD_RE = 200, PLAYER_ANIM_MPCUTR = 201, PLAYER_ANIM_MPCUTR_RE = 202, PLAYER_ANIM_MPCUTRU = 203, PLAYER_ANIM_MPCUTRU_RE = 204, PLAYER_ANIM_MPCUTD_RIGHT = 205, PLAYER_ANIM_MPCUTD_RIGHT_RE = 206, PLAYER_ANIM_MPCUTD_LEFT = 207, PLAYER_ANIM_MPCUTD_LEFT_RE = 208, PLAYER_ANIM_CUTPUSH = 209, PLAYER_ANIM_CUTPUSH_RE = 210, PLAYER_ANIM_ENEMYGUARDJUST = 211, PLAYER_ANIM_LIFTB_BEFORE = 212, PLAYER_ANIM_LIFTM_BEFORE = 213, PLAYER_ANIM_LIFTB = 214, PLAYER_ANIM_LIFTS = 215, PLAYER_ANIM_LIFTM = 216, PLAYER_ANIM_LIFTL = 217, PLAYER_ANIM_THROWBU = 218, PLAYER_ANIM_THROWSU = 219, PLAYER_ANIM_THROWMU = 220, PLAYER_ANIM_THROWLU = 221, PLAYER_ANIM_THROWBD = 222, PLAYER_ANIM_THROWSD = 223, PLAYER_ANIM_MPGUARDSHIELD = 224, PLAYER_ANIM_MPGUARDSHIELD_IMPACT = 225, PLAYER_ANIM_MPGUARDSHIELD_NORMAL = 226, PLAYER_ANIM_VJMPCHA_2 = 227, PLAYER_ANIM_ROPEHOLDWAIT = 228, PLAYER_ANIM_ROPECLIMBL = 229, PLAYER_ANIM_ROPEHOLDWAIT_2 = 230, PLAYER_ANIM_ROPEPULL = 231, PLAYER_ANIM_ROPETIGHTHOLD = 232, PLAYER_ANIM_ROPEFRONT = 233, PLAYER_ANIM_ROPEBACK = 234, PLAYER_ANIM_ROPESTRUGGLE = 235, PLAYER_ANIM_DIVEST = 236, PLAYER_ANIM_DIVE = 237, PLAYER_ANIM_STOLELAND = 238, PLAYER_ANIM_DIVEDROP = 239, PLAYER_ANIM_FLOAT = 240, PLAYER_ANIM_FLOATAWAY = 241, PLAYER_ANIM_DIVETOFLOAT = 242, PLAYER_ANIM_ROCKETBEETLE_WAIT = 243, PLAYER_ANIM_ROCKETBEETLE_SHOOT = 244, PLAYER_ANIM_ROCKETBEETLE_RESET = 245, PLAYER_ANIM_ROCKETBEETLE_BACK = 246, PLAYER_ANIM_WHIPU = 247, PLAYER_ANIM_WHIPLU = 248, PLAYER_ANIM_WHIPL = 249, PLAYER_ANIM_WHIPLD = 250, PLAYER_ANIM_WHIPRD = 251, PLAYER_ANIM_WHIPR = 252, PLAYER_ANIM_WHIPRU = 253, PLAYER_ANIM_WHIPBACKRD = 254, PLAYER_ANIM_WHIPBACKR = 255, PLAYER_ANIM_WHIPBACKRU = 256, PLAYER_ANIM_WHIPBACKU = 257, PLAYER_ANIM_WHIPBACKLU = 258, PLAYER_ANIM_WHIPBACKL = 259, PLAYER_ANIM_WHIPBACKLD = 260, PLAYER_ANIM_TURNBACK = 261, PLAYER_ANIM_ATLTOR = 262, PLAYER_ANIM_ATRTOL = 263, PLAYER_ANIM_CHUCHUSTRUGGLE = 264, PLAYER_ANIM_CHUCHUSTRUGGLE_BIG = 265, PLAYER_ANIM_CHUCHUSTRUGGLE_ACT = 266, PLAYER_ANIM_CHUCHUSTRUGGLE_ESCAPE = 267, PLAYER_ANIM_SURPRISE = 268, PLAYER_ANIM_DANGER = 269, PLAYER_ANIM_ROCKRIDE = 270, PLAYER_ANIM_NOTICE = 271, PLAYER_ANIM_WAITINSECT = 272, PLAYER_ANIM_NUMBA = 273, PLAYER_ANIM_NUMBB = 274, PLAYER_ANIM_DAMFEF = 275, PLAYER_ANIM_DAMFEB = 276, PLAYER_ANIM_DAMFEL = 277, PLAYER_ANIM_DAMFER = 278, PLAYER_ANIM_GETA = 279, PLAYER_ANIM_GETAWAIT = 280, PLAYER_ANIM_GETBIG = 281, PLAYER_ANIM_GETBIGWAIT = 282, PLAYER_ANIM_BOXOPSMALL = 283, PLAYER_ANIM_BOXOP = 284, PLAYER_ANIM_CUTUST = 285, PLAYER_ANIM_CUTU = 286, PLAYER_ANIM_CUTUED = 287, PLAYER_ANIM_CUTUNG = 288, PLAYER_ANIM_WAITLOOKROUND = 289, PLAYER_ANIM_ENTRANCE = 290, PLAYER_ANIM_MPPOSEPOWER = 291, PLAYER_ANIM_MPPOSEPOWERL = 292, PLAYER_ANIM_BINSWINGS = 293, PLAYER_ANIM_BINSWINGU = 294, PLAYER_ANIM_BINOUT = 295, PLAYER_ANIM_DRIFT = 296, PLAYER_ANIM_SWIMDIEAREVIVE = 297, PLAYER_ANIM_MGLIEFREVIVE = 298, PLAYER_ANIM_CATCHL = 299, PLAYER_ANIM_CATCHR = 300, PLAYER_ANIM_BATTLEREADY = 301, PLAYER_ANIM_ROLLJUMP = 302, PLAYER_ANIM_TANSUOPEN = 303, PLAYER_ANIM_TANSUCLOSE = 304, PLAYER_ANIM_BEDSLEEPL = 305, PLAYER_ANIM_BEDSLEEP = 306, PLAYER_ANIM_BEDAWAKE = 307, PLAYER_ANIM_BIRD_GLIDE = 308, PLAYER_ANIM_BIRD_GLIDEAROUND = 309, PLAYER_ANIM_BIRD_REACH = 310, PLAYER_ANIM_BIRD_GETWAIT = 311, PLAYER_ANIM_BIRD_ACCEL = 312, PLAYER_ANIM_BIRD_DAMAGE = 313, PLAYER_ANIM_BIRD_DAMAGESMALL = 314, PLAYER_ANIM_BIRD_DAMAGETORNADO = 315, PLAYER_ANIM_BIRD_CALL = 316, PLAYER_ANIM_SWORDPULLST = 317, PLAYER_ANIM_SWORDPULLWAIT = 318, PLAYER_ANIM_SWORDPULL = 319, PLAYER_ANIM_SWORDSIRENST = 320, PLAYER_ANIM_SWORDSIRENSTWAIT = 321, PLAYER_ANIM_SWORDSIRENRAISE = 322, PLAYER_ANIM_SWORDSIRENRAISEWAIT = 323, PLAYER_ANIM_SWORDSIRENSTICK = 324, PLAYER_ANIM_SWORDSIRENAFTER = 325, PLAYER_ANIM_SWITCHDIAL_ST = 326, PLAYER_ANIM_SWITCHDIAL_STL = 327, PLAYER_ANIM_SWITCHDIAL_LTOR = 328, PLAYER_ANIM_SWITCHDIAL_PUSH = 329, PLAYER_ANIM_TRUCKLTOR = 330, PLAYER_ANIM_TRUCKFRONTTOBACK = 331, PLAYER_ANIM_TRUCKJUMPST = 332, PLAYER_ANIM_TRUCKJUMP = 333, PLAYER_ANIM_TRUCKJUMPEND = 334, PLAYER_ANIM_TRUCKBRAKE = 335, PLAYER_ANIM_TRUCKIN = 336, PLAYER_ANIM_TRUCKOUT = 337, PLAYER_ANIM_DIETRUCK = 338, PLAYER_ANIM_DIETRUCKREVIVE = 339, PLAYER_ANIM_MGDIGIN = 340, PLAYER_ANIM_MGDIGOUT = 341, PLAYER_ANIM_MGLIEF_L = 342, PLAYER_ANIM_MGLIEF_R = 343, PLAYER_ANIM_MGATTACKL = 344, PLAYER_ANIM_MGATTACKR = 345, PLAYER_ANIM_MGDASHL = 346, PLAYER_ANIM_MGDASHR = 347, PLAYER_ANIM_MGDAMAGE = 348, PLAYER_ANIM_MGWAITBREATH = 349, PLAYER_ANIM_MGLIEUP = 350, PLAYER_ANIM_LIFTREMLY = 351, PLAYER_ANIM_THROWREMLYUP = 352, PLAYER_ANIM_LIFTREMLYUTOM = 353, PLAYER_ANIM_BIRD_FESTIVALSTART = 354, PLAYER_ANIM_GETSURPRISE = 355, PLAYER_ANIM_GIRAHIMGRAPPLE = 356, PLAYER_ANIM_GIRAHIMPULL = 357, PLAYER_ANIM_GIRAHIMPULLUP = 358, PLAYER_ANIM_GIRAHIMCHANGE = 359, PLAYER_ANIM_ROPEWALK = 360, PLAYER_ANIM_ROPEBEND = 361, PLAYER_ANIM_ROPEHANGBEND = 362, PLAYER_ANIM_ROPEHANGUP = 363, PLAYER_ANIM_ROPEBALANCE = 364, PLAYER_ANIM_SETSEKIBANA = 365, PLAYER_ANIM_SETSEKIBANB = 366, PLAYER_ANIM_SETSEKIBANC = 367, PLAYER_ANIM_PUSHTSWST = 368, PLAYER_ANIM_PUSHTSW = 369, PLAYER_ANIM_PUSHLOG = 370, PLAYER_ANIM_ASURACUTRIGHT = 371, PLAYER_ANIM_ASURACUTLEFT = 372, PLAYER_ANIM_ASURACUTUP = 373, PLAYER_ANIM_ASURACUTRIGHTST = 374, PLAYER_ANIM_ASURACUTLEFTST = 375, PLAYER_ANIM_ASURACUTUPST = 376, PLAYER_ANIM_ASURACUTRIGHTED = 377, PLAYER_ANIM_ASURACUTLEFTED = 378, PLAYER_ANIM_ASURACUTUPED = 379, PLAYER_ANIM_ASURASWORDWAIT = 380, PLAYER_ANIM_ASURASWORDLIFT = 381, PLAYER_ANIM_BINSCOOP = 382, PLAYER_ANIM_FIRE = 383, PLAYER_ANIM_CROUCH = 384, PLAYER_ANIM_CANNONWAIT = 385, PLAYER_ANIM_SEAL = 386, PLAYER_ANIM_SEALLOOP = 387, PLAYER_ANIM_SEALFINISH = 388, PLAYER_ANIM_FINISHED = 389, PLAYER_ANIM_SITDOWN = 390, PLAYER_ANIM_SITWAIT = 391, PLAYER_ANIM_SITWAITSERVICEA = 392, PLAYER_ANIM_ROOFWAIT = 393, PLAYER_ANIM_ROOFHANG = 394, PLAYER_ANIM_MGSTRUGGLE = 395, PLAYER_ANIM_MGSTRUGGLE_ACT = 396, PLAYER_ANIM_MGSTRUGGLE_ESCAPE = 397, PLAYER_ANIM_KRAKENAPPEARANCE = 398, PLAYER_ANIM_MGBURY = 399, PLAYER_ANIM_GETFLOWER = 400, PLAYER_ANIM_DOORLARGEOPEN = 401, PLAYER_ANIM_DOORLARGECLOSE = 402, PLAYER_ANIM_HARPPLAYFINISH = 403, PLAYER_ANIM_LIGHTNINGL = 404, PLAYER_ANIM_LIGHTNINGR = 405, PLAYER_ANIM_LASTATTACK = 406, PLAYER_ANIM_AT = 407, PLAYER_ANIM_TAKE = 408, PLAYER_ANIM_TAKEL = 409, PLAYER_ANIM_TAKER = 410, PLAYER_ANIM_TAKE2 = 411, PLAYER_ANIM_WAITATOS = 412, PLAYER_ANIM_DAMD = 413, PLAYER_ANIM_ASHOOTWAIT = 414, PLAYER_ANIM_ARELORD = 415, PLAYER_ANIM_ASHOOT = 416, PLAYER_ANIM_ARELORDTAME = 417, PLAYER_ANIM_ASHOOTWAIT_2 = 418, PLAYER_ANIM_ARELORD_2 = 419, PLAYER_ANIM_ASHOOT_2 = 420, PLAYER_ANIM_DAMSW = 421, PLAYER_ANIM_HSWAIT = 422, PLAYER_ANIM_VACUUMWAIT = 423, PLAYER_ANIM_MPPOSEFRONT = 424, PLAYER_ANIM_MPPOSEAROUND = 425, PLAYER_ANIM_MPPOSEAROUNDBACK = 426, PLAYER_ANIM_MPPOSEDASHFRONT = 427, PLAYER_ANIM_MPPOSEDASHAROUND = 428, PLAYER_ANIM_MPPOSEDASHAROUNDBACK = 429, PLAYER_ANIM_LIFTB_UTOD = 430, PLAYER_ANIM_LIFTS_UTOD = 431, PLAYER_ANIM_LIFTLWALK = 432, PLAYER_ANIM_MPGUARDPOSE = 433, PLAYER_ANIM_ROCKRIDE_2 = 434, PLAYER_ANIM_BINDRINKST = 435, PLAYER_ANIM_BINDRINK = 436, PLAYER_ANIM_BINDRINKED = 437, PLAYER_ANIM_HARPPOSE = 438, PLAYER_ANIM_HARPPLAYGO = 439, PLAYER_ANIM_HARPPLAYCOME = 440, PLAYER_ANIM_BINHOLD = 441, PLAYER_ANIM_BINSHIELD = 442, PLAYER_ANIM_MAX = 443, }; // Alink.arc > g3d > model.brres > 3DModels(NW4R) > al > Bones > ... enum PlayerMainModelNode_e { PLAYER_MAIN_NODE_CENTER = 0, PLAYER_MAIN_NODE_BACKBONE_1 = 1, PLAYER_MAIN_NODE_BACKBONE_2 = 2, PLAYER_MAIN_NODE_HEAD = 4, PLAYER_MAIN_NODE_POD = 5, PLAYER_MAIN_NODE_SHOULDER_L = 6, PLAYER_MAIN_NODE_ARM_L1 = 7, 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, PLAYER_MAIN_NODE_HAND_R = 14, PLAYER_MAIN_NODE_WEAPON_R = 15, PLAYER_MAIN_NODE_WAIST = 16, PLAYER_MAIN_NODE_CLOTCH_L = 17, PLAYER_MAIN_NODE_LEG_L1 = 18, PLAYER_MAIN_NODE_LEG_L2 = 19, PLAYER_MAIN_NODE_FOOT_L = 20, PLAYER_MAIN_NODE_TOE_L = 21, PLAYER_MAIN_NODE_CLOTCH_R = 22, PLAYER_MAIN_NODE_LEG_R1 = 23, PLAYER_MAIN_NODE_LEG_R2 = 24, PLAYER_MAIN_NODE_FOOT_R = 25, PLAYER_MAIN_NODE_TOE_R = 26, PLAYER_MAIN_NODE_FSKIRT_L1 = 27, PLAYER_MAIN_NODE_FSKIRT_L2 = 28, PLAYER_MAIN_NODE_FSKIRT_R1 = 29, PLAYER_MAIN_NODE_FSKIRT_R2 = 30, PLAYER_MAIN_NODE_RSKIRT_L1 = 31, PLAYER_MAIN_NODE_RSKIRT_L2 = 32, PLAYER_MAIN_NODE_RSKIRT_R1 = 33, PLAYER_MAIN_NODE_RSKIRT_R2 = 34, }; // Alink.arc > g3d > model.brres > 3DModels(NW4R) > al_head > Bones > ... enum PlayerHeadModelNode_e { PLAYER_HEAD_NODE_HAIR_L = 1, PLAYER_HEAD_NODE_HAIR_R1 = 2, PLAYER_HEAD_NODE_HAIR_R2 = 3, PLAYER_HEAD_NODE_MOMI_L = 4, PLAYER_HEAD_NODE_MOMI_R = 5, PLAYER_HEAD_NODE_MOMI_Z_CAP_1 = 6, }; // Alink.arc > g3d > model.brres > 3DModels(NW4R) > al_hands > Bones > ... enum PlayerHandsModelNode_e { PLAYER_HANDS_NODE_HAND_L = 1, PLAYER_HANDS_NODE_HAND_R = 2, }; void fn_8005F890(nw4r::math::MTX34 *); void fn_8005FB90(nw4r::math::MTX34 *); bool fn_80061410(); static void freeFrmHeap(mHeapAllocator_c *allocator); static void allocFrmHeap(mHeapAllocator_c *allocator, u32 size, const char *name); void allocExternalDataBuffers(); void initModelHeaps(); void updateSwordShieldModelsIfNeeded(); m3d::anmTexSrt_c *createAnmTexSrt(const char *resName, m3d::bmdl_c &mdl); static bool createGenericMdl(nw4r::g3d::ResMdl resMdl, m3d::mdl_c &mdl, mAllocator_c *alloc, u32 bufferOption); static bool createGenericSmdl(nw4r::g3d::ResMdl resMdl, m3d::smdl_c &mdl, mAllocator_c *alloc, u32 bufferOption); static void setTransformAndCalc(m3d::scnLeaf_c &lf, const mMtx_c *mtx); void setShieldTransform(bool inHand); static nw4r::g3d::ResFile getItemResFile(const char *name, mAllocator_c &allocator); nw4r::g3d::ResFile getExternalCompressedFile(const char *name, const char *extension, void *dest, u32 maxSize); nw4r::g3d::ResAnmChr getExternalAnmChr(const char *name, void *dest, u32 maxSize); nw4r::g3d::ResAnmTexPat getExternalAnmTexPat(const char *name, void *dest, u32 maxSize); nw4r::g3d::ResAnmTexSrt getExternalAnmTexSrt(const char *name, void *dest, u32 maxSize); static bool isBodyAnmPart_0_2_4(s32 part); static u32 getCurrentShieldPouchSlot(); static s32 getShieldType(s32 item); static s32 getCurrentlyEquippedShieldId(); void updateEarringsColor(); void loadBodyModels(); void loadBody(); void loadHandsModels(); void setSwordAnm(const char *name); void initSwordModel(); void updateSwordModel(); void initShieldModel(); void updateShieldModel(); // Own virtual methods /* vt 0x2E0 */ virtual void transformBackbone1(nw4r::g3d::WorldMtxManip *) {} /* vt 0x2E4 */ virtual void transformModelCenter(mMtx_c *) {} /* vt 0x2E8 */ virtual bool vt_0x2E8(nw4r::math::MTX34 *, const u16 *, bool) { return true; } /* vt 0x2EC */ virtual void isOnClawTargetMaybe(s32 arm, mAng &a1, mAng &a2) { a1 = 0; a2 = 0; } /* vt 0x2F0 */ virtual bool isMPPose() { return false; } /* vt 0x2F4 */ virtual bool isOnTightRope() { return false; } /* vt 0x2F8 */ virtual bool isOnVines() { return false; } /* vt 0x2FC */ virtual bool alwaysRet0() { return 0; } /* vt 0x300 */ virtual bool canBlockAttack() { return false; } /* vt 0x304 */ virtual const mVec3_c &vt_0x304() const { return mVec3_c::Zero; } // r = 1, l = 0, backbone = 2 /* vt 0x308 */ virtual mAng getArmZRot(s32 which) { return 0; } /* vt 0x30C */ virtual void vt_0x30C(mVec3_c &res) { res = mVec3_c::Ex; } // Overrides /* vt 0x0E4 */ virtual const mVec3_c &getCenterTranslation() const override { return mCenterTranslation; } /* vt 0x0E8 */ virtual const mVec3_c &vt_0x0E8() const override { return field_0x12F4; } /* vt 0x0EC */ virtual const mVec3_c &getHeadTranslation() const override { return mHeadTranslation; } /* vt 0x0F0 */ virtual const mVec3_c &vt_0x0F0() const override { return mTranslationHand[1]; } /* vt 0x0F4 */ virtual const mVec3_c &vt_0x0F4() const override { return mTranslationHand[0]; } /* vt 0x114 */ virtual void somethingWithCarriedActorFlags() override; /* vt 0x118 */ virtual dAcObjBase_c *getCurrentCarriedActor() override { return mCarriedActorRef.get(); } /* vt 0x18C */ virtual void getBodyMtx(mMtx_c *out_mtx, int boneIdx) override { mMainMdl.getNodeWorldMtx(boneIdx, *out_mtx); } /* vt 0x190 */ virtual void getSheathModelMatrix(mMtx_c *out_mtx) override { mSheathMdl.getLocalMtx(*out_mtx); } /* vt 0x194 */ virtual void getSwordModelMatrix(mMtx_c *out_mtx) override { mSwordMdl.getLocalMtx(*out_mtx); } /* vt 0x198 */ virtual mAng vt_0x198() override { return field_0x1268; } /* vt 0x19C */ virtual mAng vt_0x19C() override { return field_0x126A; } u8 getHandMat(s32 idx) { return field_0x1208[idx]; } inline bool checkSwordAndMoreStates(u32 mask) const { return (mSwordAndMoreStates & mask) != 0; } inline void offSwordAndMoreStates(u32 mask) { mSwordAndMoreStates &= ~mask; } bool canStart(bool force, u16 newIdx, u16 invalidValue, u16 *out1, u16 *out2) const; void setFaceTexPat(s32 faceIdx, bool force); void checkFaceTexPat(); void setFaceTexSrt(s32 faceIdx, bool force); void checkFaceTexSrt(); void setFaceAnmChr(s32 faceIdx, bool force); void checkFaceAnmChr(); 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); void updateModelColliders(); void updateCachedPositions(); // Model callbacks - dropping the mdl argument, apparently void mainModelTimingA(u32 nodeId, nw4r::g3d::ChrAnmResult *result); void adjustMainModelChrAnm(PlayerMainModelNode_e nodeId, nw4r::g3d::ChrAnmResult *result); void mainModelTimingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result); void adjustMainModelWorldMtx(PlayerMainModelNode_e nodeId, nw4r::g3d::WorldMtxManip *result); void mainModelTimingC(nw4r::math::MTX34 *result); void headModelTimingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result); void handsCallbackC(nw4r::math::MTX34 *pMtxArray, nw4r::g3d::ResMdl mdl, nw4r::g3d::FuncObjCalcWorld *pFuncObj); void updateBlendWeights(PlayerMainModelNode_e nodeId); void updateMainBlend1(f32 blend); void updateMainBlend2(f32 blend, bool save); void applyWorldRotationMaybe(nw4r::math::MTX34 *result, mAng x, mAng y, mAng z, mVec3_c *off, bool order); 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; static mColor sGuideColor2; static mColor sGuideColor3; // Really not sure about these - there exist virtual functions for these use cases... const mAng& getField_0x1268() const { return field_0x1268; } const mAng& getField_0x126A() const { return field_0x126A; } void getWeaponLMtx(mMtx_c &mtx) const { mMainMdl.getNodeWorldMtx(PLAYER_MAIN_NODE_WEAPON_L, mtx); } protected: /* 0x370 */ mHeapAllocator_c mModelAllocator; /* 0x38C */ mHeapAllocator_c mSwordAllocator; /* 0x3A8 */ mHeapAllocator_c mShieldAllocator; /* 0x3C4 */ void *mpExternalAnmCharBuffer; /* 0x3C8 */ nw4r::g3d::ResFile mSwordRes; /* 0x3CC */ nw4r::g3d::ResFile mAlinkRes; /* 0x3D0 */ nw4r::g3d::ResFile mPlCommonAnimeRes; /* 0x3D4 */ nw4r::g3d::ResFile mPlCommonSoundRes; /* 0x3D8 */ nw4r::g3d::ResFile mCurrentRes; /* 0x3DC */ nw4r::g3d::ResFile mAlink2Res; /* 0x3E0 */ daPlBaseMdl_c mMainMdl; /* 0x440 */ daPlBaseMainCallback_c mMainBodyCallback; /* 0x448 */ m3d::mdl_c mHeadMdl; /* 0x46C */ daPlBaseHeadCallback_c mHeadCallback; /* 0x474 */ m3d::smdl_c mFaceMdl; /* 0x490 */ m3d::anmChr_c mFaceAnmChr; /* 0x4C8 */ void *mpAnmCharBuffer; /* 0x4CC */ m3d::anmTexPat_c mFaceTexPat; /* 0x4F8 */ void *mpTexPatBuffer; /* 0x4FC */ m3d::anmTexSrt_c mFaceTexSrt; /* 0x528 */ void *mpTexSrtBuffer; /* 0x52C */ m3d::anmChr_c mHeadAnmChr; /* 0x564 */ m3d::smdl_c mHandsMdl; /* 0x580 */ daPlBaseHandsCallback_c mCalcWorldCallback; /* 0x588 */ daPlBaseScnObjCallback_c mScnObjCallback; /* 0x598 */ m3d::smdl_c mSwordMdl; /* 0x5B4 */ m3d::anmMatClr_c mSwordAnmMatClr; /* 0x5E0 */ m3d::smdl_c mShieldMdl; /* 0x5FC */ m3d::anmTexPat_c mShieldAnmTexPat1; /* 0x628 */ m3d::anmTexPat_c mShieldAnmTexPat2; /* 0x654 */ m3d::smdl_c mSheathMdl; /* 0x670 */ m3d::smdl_c mUnkMdl1; /* 0x68C */ m3d::anmChr_c mAnmChr; /* 0x6C4 */ m3d::anmChrBlend_c mAnmChrBlend; /* 0x6EC */ dScnCallback_c mScnCallback1; /* 0x6F8 */ dScnCallback_c mScnCallback2; /* 0x704 */ dScnCallback_c mScnCallback3; /* 0x710 */ dScnCallback_c mScnCallback4; /* 0x71C */ dScnCallback_c mScnCallback5; /* 0x728 */ daPlBaseAnmChr_c mAnmChrs[6]; /* 0x878 */ dCcD_Cyl mCcCyls[3]; /* 0xC68 */ dCcD_Cps mCcCpss[3]; /* 0x10B8 */ dCcD_Cyl mCcCyl; /* 0x1208 */ u8 field_0x1208[2]; /* 0x120A */ u8 field_0x120A; /* 0x120B */ u8 mTunicType; /* 0x120C */ u8 mCurrentAnmChrIdx; /* 0x120D */ u8 mShieldPouchSlot; /* 0x120E */ s8 mPouchMatId; /* 0x120F */ s8 mBeltMatId; /* 0x1210 */ s8 mLowbodyMapId; /* 0x1211 */ s8 mLowotherMapId; /* 0x1212 */ s8 mPouch2MatId; /* 0x1213 */ s8 mUpbodyMatId; /* 0x1214 */ s8 mUpotherMatId; /* 0x1215 */ s8 mBelt2MatId; /* 0x1216 */ s8 mCapMatId; /* 0x1217 */ s8 mSkinMatId; /* 0x1218 */ u8 mSkywardStrikeChargeDuration; /* 0x1219 */ u8 field_0x1219; /* 0x121A */ u16 mAnimations[6]; /* 0x1226 */ u16 mFaceAnmChrIdx1; /* 0x1228 */ u16 mFaceAnmChrIdx2; /* 0x122A */ u16 mFaceAnmTexPatIdx1; /* 0x122C */ u16 mFaceAnmTexPatIdx2; /* 0x122E */ u16 mFaceAnmTexSrtIdx1; /* 0x1230 */ u16 mFaceAnmTexSrtIdx2; /* 0x1232 */ u16 mBreakingEffect; /* 0x1234 */ mAng mWaistZRot; /* 0x1236 */ mAng mWaistYRot; /* 0x1238 */ mAng field_0x1238[5]; /* 0x1242 */ mAng field_0x1242[5]; /* 0x124C */ u8 _0x124C[0x1256 - 0x124C]; /* 0x1256 */ mAng field_0x1256; /* 0x1258 */ mAng field_0x1258; /* 0x125A */ mAng field_0x125A; /* 0x125C */ mAng mRSkirtR1Rot; /* 0x125E */ mAng mRSkirtL1Rot; /* 0x1260 */ mAng mRightHandRotation; /* 0x1262 */ mAng mHeadZRot; /* 0x1264 */ mAng mHeadYRot; /* 0x1266 */ mAng mHeadXRot; /* 0x1268 */ mAng field_0x1268; /* 0x126A */ mAng field_0x126A; /* 0x126C */ mAng field_0x126C; /* 0x1270 */ f32 field_0x1270; /* 0x1274 */ f32 field_0x1274; /* 0x1278 */ f32 field_0x1278; /* 0x127C */ mVec3_c field_0x127C; /* 0x1288 */ mVec3_c mCenterTranslation; /* 0x1294 */ mVec3_c mHeadTranslation; /* 0x12A0 */ mVec3_c mPositionAboveLink; /* 0x12AC */ mVec3_c mTranslationHand[2]; /* 0x12C4 */ mVec3_c mTranslationWeapon[2]; /* 0x12DC */ mVec3_c mToeTranslation[2]; /* 0x12F4 */ mVec3_c field_0x12F4; /* 0x1300 */ mQuat_c field_0x1300[4]; /* 0x1340 */ mQuat_c mQuat1; /* 0x1350 */ mQuat_c mQuat2; /* 0x1360 */ dAcRef_c mCarriedActorRef; // not sure about the class /* 0x136C */ mAng *field_0x136C; /* 0x1370 */ mAng *field_0x1370; /* 0x1374 */ mAng *field_0x1374; // x3 /* 0x1378 */ mAng *field_0x1378; // x3 }; #endif