From ddc1c166e77179110c9a1d8094027c12ecf24cbc Mon Sep 17 00:00:00 2001 From: Caroline Madsen <69010899+randomsalience@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:20:22 -0500 Subject: [PATCH] d_a_midna mostly done (#2237) --- include/JSystem/J3DGraphBase/J3DMatBlock.h | 2 +- include/Z2AudioLib/Z2SoundObjMgr.h | 67 +- include/d/actor/d_a_alink.h | 53 +- include/d/actor/d_a_kago.h | 5 +- include/d/actor/d_a_midna.h | 500 ++- include/d/actor/d_a_player.h | 20 +- include/d/d_com_inf_game.h | 12 +- include/d/d_event.h | 11 +- include/m_Do/m_Do_ext.h | 2 + src/Z2AudioLib/Z2Creature.cpp | 39 +- src/Z2AudioLib/Z2SoundObjMgr.cpp | 38 +- src/d/actor/d_a_alink.cpp | 16 +- src/d/actor/d_a_alink_damage.inc | 20 +- src/d/actor/d_a_alink_link.inc | 10 +- src/d/actor/d_a_alink_wolf.inc | 10 +- src/d/actor/d_a_door_shutter.cpp | 2 +- src/d/actor/d_a_midna.cpp | 4602 ++++++++++++++------ src/d/d_event.cpp | 2 +- 18 files changed, 3737 insertions(+), 1674 deletions(-) diff --git a/include/JSystem/J3DGraphBase/J3DMatBlock.h b/include/JSystem/J3DGraphBase/J3DMatBlock.h index 0a35d27caa..d3aa128de6 100644 --- a/include/JSystem/J3DGraphBase/J3DMatBlock.h +++ b/include/JSystem/J3DGraphBase/J3DMatBlock.h @@ -31,7 +31,7 @@ struct J3DGXColor : public GXColor { /* 8000E538 */ J3DGXColor() {} J3DGXColor(J3DGXColor const& other) { __memcpy(this, &other, sizeof(J3DGXColor)); } J3DGXColor(GXColor const& color) : GXColor(color) {} - J3DGXColor& operator=(GXColor color) { + J3DGXColor& operator=(const GXColor& color) { *(GXColor*)this = color; return *this; } diff --git a/include/Z2AudioLib/Z2SoundObjMgr.h b/include/Z2AudioLib/Z2SoundObjMgr.h index 3085332f38..ef084604ec 100644 --- a/include/Z2AudioLib/Z2SoundObjMgr.h +++ b/include/Z2AudioLib/Z2SoundObjMgr.h @@ -14,9 +14,72 @@ struct Z2EnemyArea { }; enum Z2EnemyID { - Z2_ENEMY_ID_0, + /* 0x00 */ Z2_ENEMY_NULL, + /* 0x01 */ Z2_ENEMY_S1, + /* 0x02 */ Z2_ENEMY_YK, + /* 0x03 */ Z2_ENEMY_YR, + /* 0x04 */ Z2_ENEMY_YG, + /* 0x05 */ Z2_ENEMY_YC, + /* 0x06 */ Z2_ENEMY_YD, + /* 0x07 */ Z2_ENEMY_RDY, + /* 0x08 */ Z2_ENEMY_YMB, + /* 0x09 */ Z2_ENEMY_UNK, + /* 0x0A */ Z2_ENEMY_WB, + /* 0x0B */ Z2_ENEMY_RD, + /* 0x0C */ Z2_ENEMY_DN, + /* 0x0D */ Z2_ENEMY_KR, + /* 0x0E */ Z2_ENEMY_ST, + /* 0x0F */ Z2_ENEMY_TK, + /* 0x10 */ Z2_ENEMY_TK2, + /* 0x11 */ Z2_ENEMY_CR, + /* 0x12 */ Z2_ENEMY_DF, + /* 0x13 */ Z2_ENEMY_FS, + /* 0x14 */ Z2_ENEMY_SB, + /* 0x15 */ Z2_ENEMY_PM, + /* 0x16 */ Z2_ENEMY_DB, + /* 0x17 */ Z2_ENEMY_KG, + /* 0x18 */ Z2_ENEMY_SH, + /* 0x19 */ Z2_ENEMY_SF, + /* 0x1A */ Z2_ENEMY_BS, + /* 0x1B */ Z2_ENEMY_SM, + /* 0x1C */ Z2_ENEMY_BA, + /* 0x1D */ Z2_ENEMY_BU, + /* 0x1E */ Z2_ENEMY_HM, + /* 0x1F */ Z2_ENEMY_GE, + /* 0x20 */ Z2_ENEMY_HZ, + /* 0x21 */ Z2_ENEMY_WS, + /* 0x22 */ Z2_ENEMY_OC, + /* 0x23 */ Z2_ENEMY_FZ, + /* 0x24 */ Z2_ENEMY_FB, + /* 0x25 */ Z2_ENEMY_BG, + /* 0x26 */ Z2_ENEMY_MM, + /* 0x27 */ Z2_ENEMY_NZ, + /* 0x28 */ Z2_ENEMY_PO, + /* 0x29 */ Z2_ENEMY_RB, + /* 0x2A */ Z2_ENEMY_SG, + /* 0x2B */ Z2_ENEMY_HB, + /* 0x2C */ Z2_ENEMY_GB, + /* 0x2D */ Z2_ENEMY_MS, + /* 0x2E */ Z2_ENEMY_DD, + /* 0x2F */ Z2_ENEMY_BI, + /* 0x30 */ Z2_ENEMY_TT, + /* 0x31 */ Z2_ENEMY_AI, + /* 0x32 */ Z2_ENEMY_DK, + /* 0x33 */ Z2_ENEMY_WW, + /* 0x34 */ Z2_ENEMY_GI, + /* 0x35 */ Z2_ENEMY_SM2, + /* 0x36 */ Z2_ENEMY_SW, + /* 0x37 */ Z2_ENEMY_RDB, + /* 0x38 */ Z2_ENEMY_KK, + /* 0x39 */ Z2_ENEMY_HP, + /* 0x3A */ Z2_ENEMY_ZH, + /* 0x3B */ Z2_ENEMY_GM, + /* 0x3C */ Z2_ENEMY_GG, + /* 0x3D */ Z2_ENEMY_MF, + /* 0x3E */ Z2_ENEMY_ZM, + /* 0x3F */ Z2_ENEMY_TN, }; - + class Z2SoundObjMgr : public JASGlobalInstance, protected JSUList { public: Z2SoundObjMgr(); diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index 6cbd7d1d52..e7e38c8b9c 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -3284,6 +3284,46 @@ public: u32 getStartEvent() { return fopAcM_GetParam(this) >> 0x18; } BOOL checkClimbFall() { return checkLadderFall(); } + bool checkMidnaWolfDashAnime() { return checkNoResetFlg1(FLG1_DASH_MODE); } + bool checkMidnaClingAnime() { return mMidnaAnm == 1; } + bool checkMidnaLowClingAnime() { return mMidnaAnm == 2; } + bool checkMidnaLookAroundAnime() { return mMidnaAnm == 3; } + bool checkMidnaPanicAnime() { return mMidnaAnm == 5; } + bool checkMidnaWolfDeadAnime() { return mMidnaAnm == 6; } + bool checkMidnaWolfSwimDeadAnime() { return mMidnaAnm == 7; } + bool checkMidnaRopeWaitStaggerAnime() { return mMidnaAnm == 8; } + bool checkMidnaRopeMoveStaggerAnime() { return mMidnaAnm == 9; } + bool checkMidnaGanonCatchAnm() { return mMidnaAnm == 10; } + bool checkMidnaGanonThrowLeftAnm() { return mMidnaAnm == 11; } + bool checkMidnaGanonThrowRightAnm() { return mMidnaAnm == 12; } + bool checkMidnaDigInAnime() { return mMidnaAnm == 13; } + + void clearMidnaMsgNum() { + mMidnaMsgNum = 0xffff; + mMidnaMsg = NULL; + } + + void setEndGanonThrow() { mProcVar3.field_0x300e = 1; } + + s16 getProcNeckX() { return field_0x30a0; } + s16 getMidnaProcNeckY() { return field_0x30d4; } + f32 getEyeMoveRateY() { return field_0x33f4; } + f32 getMidnaEyeMoveRateX() { return field_0x33f8; } + + J3DModel* getMidnaModel() { + if (mClothesChangeWaitTimer != 0) { + return NULL; + } else { + return mpWlMidnaModel; + } + } + + J3DModel* getMidnaMaskModel() { return mpWlMidnaMaskModel; } + J3DModel* getMidnaHandModel() { return mpWlMidnaHandModel; } + J3DModel* getMidnaHairHandModel() { return mpWlMidnaHairModel; } + + cXyz* getMidnaHairAtnPos() { return &mMidnaHairAtnPos; } + const daAlink_AnmData* getAnmData(daAlink_ANM anmID) const { return &m_anmDataTable[anmID]; } const daAlink_FaceTexData* getFaceTexData(daAlink_FTANM i_anmID) const { return &m_faceTexDataTable[i_anmID]; } @@ -3428,6 +3468,9 @@ public: BOOL checkCrawlWaterIn() { return mWaterY > current.pos.y + 15.5f; } + MtxP getWolfMidnaMatrix() { return mpLinkModel->getAnmMtx(0x19); } + s16 getIceDamageWaitTimer() const { return mIceDamageWaitTimer; } + const cXyz& getWindSpeed() const { return mWindSpeed; } const cXyz& getHsChainTopPos() const { return mHookshotTopPos; } const cXyz& getHsChainRootPos() const { return mHeldItemRootPos; } @@ -3693,7 +3736,7 @@ public: /* 0x02F98 */ u8 field_0x2f98; /* 0x02F99 */ u8 field_0x2f99; /* 0x02F9A */ s8 mVoiceReverbIntensity; - /* 0x02F9B */ u8 field_0x2f9b; + /* 0x02F9B */ u8 mMidnaAnm; /* 0x02F9C */ u8 mSelectItemId; /* 0x02F9D */ u8 field_0x2f9d; /* 0x02F9E */ u8 mEffProc; @@ -3777,7 +3820,7 @@ public: /* 0x03000 */ s16 field_0x3000; /* 0x03002 */ s16 field_0x3002; /* 0x03004 */ s16 field_0x3004; - /* 0x03006 */ s16 field_0x3006; + /* 0x03006 */ s16 mIceDamageWaitTimer; // `mProcVar`'s are variables that are context dependent for each `PROC` action. // (The exact setup may need to be simplified later) union { @@ -3879,7 +3922,7 @@ public: /* 0x030CE */ u16 mKeepItem; /* 0x030D0 */ s16 field_0x30d0; /* 0x030D2 */ s16 field_0x30d2; - /* 0x030D4 */ u16 field_0x30d4; + /* 0x030D4 */ s16 field_0x30d4; /* 0x030D6 */ s16 field_0x30d6; /* 0x030D8 */ u8 field_0x30d8[0x14]; /* 0x030EC */ s16 field_0x30ec; @@ -4059,14 +4102,14 @@ public: /* 0x03588 */ cXyz field_0x3588; /* 0x03594 */ cXyz field_0x3594; /* 0x035A0 */ cXyz field_0x35a0; - /* 0x035AC */ cXyz field_0x35ac; + /* 0x035AC */ cXyz mWindSpeed; /* 0x035B8 */ cXyz field_0x35b8; /* 0x035C4 */ cXyz field_0x35c4; /* 0x035D0 */ cXyz field_0x35d0; /* 0x035DC */ cXyz field_0x35dc; /* 0x035E8 */ cXyz field_0x35e8; /* 0x035F4 */ cXyz mMidnaAtnPos; - /* 0x03600 */ cXyz field_0x3600; + /* 0x03600 */ cXyz mMidnaHairAtnPos; /* 0x0360C */ cXyz mKandelaarFlamePos; /* 0x03618 */ cXyz field_0x3618; /* 0x03624 */ cXyz field_0x3624; diff --git a/include/d/actor/d_a_kago.h b/include/d/actor/d_a_kago.h index b8ae4f15df..2f1850217b 100644 --- a/include/d/actor/d_a_kago.h +++ b/include/d/actor/d_a_kago.h @@ -100,9 +100,12 @@ public: } MtxP getLegR3Mtx() { return mLegR3Mtx; } + MtxP getMidnaLocaterMtx() { return mpMorf->getModel()->getAnmMtx(4); } private: - /* 0x568 */ u8 field_0x568[0x620 - 0x568]; + /* 0x568 */ u8 field_0x568[8]; + /* 0x570 */ mDoExt_McaMorfSO* mpMorf; + /* 0x574 */ u8 field_0x574[0x620 - 0x574]; /* 0x620 */ Mtx mLegR3Mtx; /* 0x650 */ u8 field_0x650[0x6E1 - 0x650]; /* 0x6E1 */ u8 field_0x6e1; diff --git a/include/d/actor/d_a_midna.h b/include/d/actor/d_a_midna.h index 47752a9ac4..2268e77782 100644 --- a/include/d/actor/d_a_midna.h +++ b/include/d/actor/d_a_midna.h @@ -2,11 +2,82 @@ #define D_A_MIDNA_H #include "JSystem/J3DGraphBase/J3DMatBlock.h" +#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h" #include "Z2AudioLib/Z2Creature.h" +#include "f_op/f_op_actor.h" +#include "d/d_bg_s_lin_chk.h" #include "d/d_com_inf_game.h" -#include "d/actor/d_a_player.h" #include "d/d_msg_flow.h" -#include "dolphin/types.h" +#include "d/actor/d_a_player.h" + +class daKago_c; + +class daMidna_matAnm_c : public J3DMaterialAnm { +public: + /* 804BC218 */ void init(); + /* 804BC248 */ void calc(J3DMaterial*) const; + /* 804C63E0 */ ~daMidna_matAnm_c() {} + + daMidna_matAnm_c() { init(); } + + f32* getNowOffsetXP() { return &mNowOffsetX; } + f32* getNowOffsetYP() { return &mNowOffsetY; } + void setNowOffsetX(f32 offsetX) { mNowOffsetX = offsetX; } + void setNowOffsetY(f32 offsetY) { mNowOffsetY = offsetY; } + + static bool getEyeMoveFlg() { return sEyeMoveFlg; } + static void offEyeMoveFlg() { sEyeMoveFlg = false; } + static void onEyeMoveFlg() { sEyeMoveFlg = true; } + static void setMorfFrame(u8 frame) { sMorfFrame = frame; } + static void decMorfFrame() { cLib_calcTimer(&sMorfFrame); } + static u8 getMorfFrame() { return sMorfFrame; } + + /* 0x0F4 */ f32 mOldTransX; + /* 0x0F8 */ f32 mOldTransY; + /* 0x0FC */ f32 mNowOffsetX; + /* 0x100 */ f32 mNowOffsetY; + + static bool sEyeMoveFlg; + static u8 sMorfFrame; +}; + +STATIC_ASSERT(sizeof(daMidna_matAnm_c) == 0x104); + +class daMidna_hio_c0 { +public: + struct param { + /* 0x00 */ u8 field_0x00[0x14]; + /* 0x14 */ f32 mScale; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1c; + }; + + static param const m; +}; + +STATIC_ASSERT(sizeof(daMidna_hio_c0::param) == 0x20); + +class daMidna_McaMorfCB1_c : public mDoExt_McaMorfCallBack1_c { +public: + /* 804BC36C */ int execute(u16, J3DTransformInfo*); + /* 804C6398 */ virtual ~daMidna_McaMorfCB1_c() {} + + void setScale(cXyz* i_scale) { mpScale = i_scale; } + + /* 0x4 */ cXyz* mpScale; +}; + +struct daMidna_anmData_s { + /* 0x0 */ u16 mResID; + /* 0x2 */ u16 mTexID; + /* 0x4 */ f32 mSoundFrame; + /* 0x8 */ u32 mSoundID; +}; + +struct daMidna_texData_s { + /* 0x0 */ u16 mBtpID; + /* 0x2 */ u16 mBtkID; +}; class daMidna_c; typedef int (daMidna_c::*daMidna_func)(); @@ -22,35 +93,124 @@ typedef int (daMidna_c::*daMidna_func)(); class daMidna_c : public fopAc_ac_c { public: enum daMidna_ERFLG0 { + ERFLG0_UNK_100 = 0x100, ERFLG0_NO_SERVICE_WAIT = 0x80, + ERFLG0_UNK_40 = 0x40, + ERFLG0_UNK_20 = 0x20, ERFLG0_FORCE_MORF_CANCEL = 0x10, ERFLG0_FORCE_PANIC = 8, ERFLG0_UNK_2 = 2, + ERFLG0_UNK_1 = 1, }; enum daMidna_FLG0 { - FLG0_UNK_80000000 = 0x80000000, + FLG0_NO_HAIR_LEAD = 0x80000000, + FLG0_UNK_40000000 = 0x40000000, + FLG0_NO_HAIR_SCALE = 0x20000000, + FLG0_UNK_10000000 = 0x10000000, FLG0_PORTAL_OBJ_CALL = 0x8000000, + FLG0_UNK_4000000 = 0x4000000, + FLG0_UNK_2000000 = 0x2000000, + FLG0_UNK_1000000 = 0x1000000, + FLG0_UNK_800000 = 0x800000, + FLG0_UNK_400000 = 0x400000, + FLG0_UNK_200000 = 0x200000, FLG0_NPC_NEAR = 0x100000, + FLG0_UNK_80000 = 0x80000, FLG0_NPC_FAR = 0x40000, - FLG0_UNK_20000 = 0x20000, + FLG0_FORCE_NECK_AIM = 0x20000, + FLG0_UNK_10000 = 0x10000, + FLG0_UNK_8000 = 0x8000, FLG0_NO_INPUT = 0x4000, FLG0_NO_DRAW = 0x2000, - FLG0_UNK_400 = 0x400, - FLG0_UNK_800 = 0x800, + FLG0_UNK_1000 = 0x1000, + FLG0_WOLF_NO_POS = 0x800, + FLG0_TAG_WAIT = 0x400, FLG0_UNK_200 = 0x200, + FLG0_UNK_100 = 0x100, + FLG0_UNK_80 = 0x80, + FLG0_UNK_40 = 0x40, + FLG0_UNK_20 = 0x20, + FLG0_UNK_10 = 0x10, + FLG0_UNK_8 = 8, + FLG0_UNK_4 = 4, + FLG0_UNK_2 = 2, + FLG0_UNK_1 = 1, }; enum daMidna_FLG1 { FLG1_SHADOW_NO_DRAW = 0x1000, - FLG1_UNK_100 = 0x100, + FLG1_UNK_800 = 0x800, + FLG1_UNK_400 = 0x400, + FLG1_UNK_200 = 0x200, + FLG1_SIDE_WARP = 0x100, FLG1_NO_MASK_DRAW = 0x80, + FLG1_UNK_40 = 0x40, + FLG1_UNK_20 = 0x20, + FLG1_UNK_10 = 0x10, FLG1_FORCE_NORMAL_COL = 8, FLG1_FORCE_TIRED_COL = 4, FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE = 2, + FLG1_UNK_1 = 1, }; - enum daMidna_ANM {}; + enum daMidna_ANM { + /* 0x00 */ ANM_WAITA, + /* 0x01 */ ANM_CLING, + /* 0x02 */ ANM_CLINGB, + /* 0x03 */ ANM_WAITB, + /* 0x04 */ ANM_PANIC, + /* 0x05 */ ANM_TALKA, + /* 0x06 */ ANM_LEADST, + /* 0x07 */ ANM_LEADED, + /* 0x08 */ ANM_LEADWAIT, + /* 0x09 */ ANM_LEADTOWAITA, + /* 0x0A */ ANM_LEADSWAIT, + /* 0x0B */ ANM_CLINGST, + /* 0x0C */ ANM_SWAITB, + /* 0x0D */ ANM_SWAITC, + /* 0x0E */ ANM_WLDIEA, + /* 0x0F */ ANM_WLSWIMDIE, + /* 0x10 */ ANM_S_APPEAR, + /* 0x11 */ ANM_S_APPEARBL, + /* 0x12 */ ANM_S_RETURN, + /* 0x13 */ ANM_S_HOLE, + /* 0x14 */ ANM_WARPIN, + /* 0x15 */ ANM_WAITTP, + /* 0x16 */ ANM_ENTRANCE, + /* 0x17 */ ANM_SWAITD, + /* 0x18 */ ANM_HIT, + /* 0x19 */ ANM_LOOKABOUT, + /* 0x1A */ ANM_SWAITA, + /* 0x1B */ ANM_S_MOVE, + /* 0x1C */ ANM_RETURN, + /* 0x1D */ ANM_WAITD, + /* 0x1E */ ANM_CLINGD, + /* 0x1F */ ANM_ROPEWAIT, + /* 0x20 */ ANM_ROPEFALTER, + /* 0x21 */ ANM_DIGIN, + /* 0x22 */ ANM_DOOROPC, + /* 0x23 */ ANM_DOOROPD, + /* 0x24 */ ANM_GRAB, + /* 0x25 */ ANM_GRABED, + /* 0x26 */ ANM_MGNCATCHST, + /* 0x27 */ ANM_MGNCATCHED, + /* 0x28 */ ANM_MGNTHROWLST, + /* 0x29 */ ANM_MGNTHROWLED, + /* 0x2A */ ANM_MGNTHROWRST, + /* 0x2B */ ANM_MGNTHROWRED, + /* 0x2C */ ANM_FTALKA, + /* 0x2D */ ANM_FTALKB, + /* 0x2E */ ANM_FTALKC, + /* 0x2F */ ANM_FTALKC2, + /* 0x30 */ ANM_HAIR, + /* 0x31 */ ANM_S_TAKES, + /* 0x32 */ ANM_S_WAITS, + /* 0x33 */ ANM_S_PACKAWAY, + /* 0x34 */ ANM_GRABST, + /* 0x35 */ ANM_MAX, + /* 0x00 */ ANM_NONE = 0, + }; void onForcePanic(); u32 checkForceNormalColor() const; @@ -58,57 +218,60 @@ public: static bool checkMidnaTired(); void onNoServiceWait(); - /* 804BC3E0 */ void modelCallBack(int); - /* 804BC5C4 */ void changeUpperBck(); - /* 804BC614 */ void changeFaceBck(); - /* 804BC670 */ void baseModelCallBack(int); - /* 804BC740 */ void initInvModel(u16, J3DModel**, mDoExt_invisibleModel*, u32); - /* 804BC7D4 */ void initDemoModel(J3DModel**, char const*, u32); - /* 804BC868 */ void createHeap(); - /* 804BD274 */ void create(); + /* 804BC3E0 */ int modelCallBack(int); + /* 804BC5C4 */ int changeUpperBck(); + /* 804BC614 */ int changeFaceBck(); + /* 804BC670 */ int baseModelCallBack(int); + /* 804BC740 */ int initInvModel(u16, J3DModel**, mDoExt_invisibleModel*, u32); + /* 804BC7D4 */ int initDemoModel(J3DModel**, char const*, u32); + /* 804BC868 */ int createHeap(); + /* 804BD274 */ cPhs__Step create(); /* 804BD93C */ void allAnimePlay(); /* 804BDE04 */ void setMatrix(); /* 804BE470 */ void setBodyPartMatrix(); /* 804BED1C */ void setRoomInfo(); /* 804BEDB8 */ void setBodyPartPos(); - /* 804BEFA0 */ void checkAppear(); + /* 804BEFA0 */ BOOL checkAppear(); /* 804BF070 */ void checkMidnaPosState(); - /* 804BFF80 */ void setUpperAnime(u16, u16); - /* 804C0020 */ void setUpperAnimeAndSe(daMidna_c::daMidna_ANM); - /* 804C0094 */ void setFaceAnime(u16, u16); + /* 804BFF80 */ BOOL setUpperAnime(u16, u16); + /* 804C0020 */ BOOL setUpperAnimeAndSe(daMidna_ANM); + /* 804C0094 */ BOOL setFaceAnime(u16, u16); /* 804C0134 */ void endHighModel(); - /* 804C0238 */ void setDemoAnm(); + /* 804C0238 */ BOOL setDemoAnm(); /* 804C0BAC */ void setFaceBtp(u16, int); /* 804C0C6C */ void setFaceBtk(u16, int); /* 804C0D2C */ void setLeftHandShape(u16); /* 804C0E18 */ void setRightHandShape(u16); - /* 804C0F04 */ void checkHairOnlyAnime(int) const; + /* 804C0F04 */ BOOL checkHairOnlyAnime(int) const; /* 804C0F24 */ void setBckAnime(J3DAnmTransform*, int, f32); /* 804C103C */ void setAnm(); - /* 804C287C */ void getNeckAimAngle(cXyz const*, s16*, s16*, s16*, s16*); + /* 804C287C */ s16 getNeckAimAngle(cXyz const*, s16*, s16*, s16*, s16*); /* 804C2A68 */ void clearEyeMove(); /* 804C2AB8 */ void setEyeMove(cXyz const*, s16, s16); /* 804C2EBC */ void setNeckAngle(); /* 804C3168 */ void initHairAngle(); /* 804C3298 */ void setHairAngle(); /* 804C3F04 */ void setDemoData(); - /* 804C4394 */ void setSimpleBrk(J3DModelData*, u16); - /* 804C4444 */ void setSimpleBtk(J3DModelData*, u16); + /* 804C4394 */ J3DAnmTevRegKey* setSimpleBrk(J3DModelData*, u16); + /* 804C4444 */ J3DAnmTextureSRTKey* setSimpleBtk(J3DModelData*, u16); /* 804C44CC */ void initMidnaModel(); /* 804C49B8 */ void setMidnaNoDrawFlg(); - /* 804C4AE8 */ void checkMetamorphoseEnableBase(); - /* 804C4B68 */ void checkNoDrawState(); + /* 804C4AE8 */ int checkMetamorphoseEnableBase(); + /* 804C4B68 */ BOOL checkNoDrawState(); /* 804C4BC0 */ void setSound(); - /* 804C4FDC */ void execute(); - /* 804C5A08 */ void draw(); + /* 804C4FDC */ int execute(); + /* 804C5A08 */ int draw(); /* 804C61A4 */ ~daMidna_c(); + daMidna_c() : mBtpHeap(0x400), mBtkHeap(0x400) {} + void onEndResetStateFlg0(daMidna_ERFLG0 pFlg) { mEndResetStateFlg0 |= pFlg; } void onStateFlg0(daMidna_FLG0 i_flag) { mStateFlg0 |= i_flag; } void offStateFlg0(daMidna_FLG0 i_flag) { mStateFlg0 &= ~i_flag; } void onStateFlg1(daMidna_FLG1 i_flag) { mStateFlg1 |= i_flag; } void offStateFlg1(daMidna_FLG1 i_flag) { mStateFlg1 &= ~i_flag; } - BOOL checkStateFlg0(daMidna_FLG0 flag) const { return mStateFlg0 & flag; } + u32 checkEndResetStateFlg0(daMidna_ERFLG0 flag) const { return mEndResetStateFlg0 & flag; } + u32 checkStateFlg0(daMidna_FLG0 flag) const { return mStateFlg0 & flag; } u32 checkStateFlg1(daMidna_FLG1 flag) const { return mStateFlg1 & flag; } void setFaceNum(int num) { mFaceNum = num; } void setMotionNum(int num) { mMotionNum = num; } @@ -116,48 +279,46 @@ public: void changeOriginalDemo() { mDemoType = 3; } void changeDemoMode(u32 mode) { mDemoMode = mode; } BOOL checkPortalObjCall() { return checkStateFlg0(FLG0_PORTAL_OBJ_CALL); } + BOOL checkNoHairScale() const { return checkStateFlg0(FLG0_NO_HAIR_SCALE); } BOOL checkNpcNear() { return checkStateFlg0(FLG0_NPC_NEAR); } BOOL checkNpcFar() { return checkStateFlg0(FLG0_NPC_FAR); } BOOL checkNoDraw() const { return checkStateFlg0(FLG0_NO_DRAW); } BOOL checkNoInput() const { return checkStateFlg0(FLG0_NO_INPUT); } - BOOL checkWolfNoPos() const { return checkStateFlg0(FLG0_UNK_800); } + BOOL checkWolfNoPos() const { return checkStateFlg0(FLG0_WOLF_NO_POS); } int checkMetamorphoseEnable() { return (this->*mpFunc)(); } u32 checkShadowModelDrawDemoForce() const { return checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE); } void setForceNeckAimPos(const cXyz& i_pos) { - onStateFlg0(FLG0_UNK_20000); - field_0x9c4 = i_pos; + onStateFlg0(FLG0_FORCE_NECK_AIM); + mForceNeckAimPos = i_pos; } void onTagWaitPosWarp(const cXyz* param_0) { - field_0x9ac = *param_0; - onStateFlg0(FLG0_UNK_400); + mTagWaitPos = *param_0; + onStateFlg0(FLG0_TAG_WAIT); onEndResetStateFlg0(ERFLG0_UNK_2); } void onTagWaitPos(const cXyz* param_0) { - field_0x9ac = *param_0; - onStateFlg0(FLG0_UNK_400); + mTagWaitPos = *param_0; + onStateFlg0(FLG0_TAG_WAIT); } void offTagWaitPos() { - offStateFlg0((daMidna_FLG0)(FLG0_UNK_80000000 | FLG0_PORTAL_OBJ_CALL | FLG0_UNK_400)); + offStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_LEAD | FLG0_PORTAL_OBJ_CALL | FLG0_TAG_WAIT)); } - void onTagNoHairLead() { - onStateFlg0(FLG0_UNK_80000000); - } + void onTagNoHairLead() { onStateFlg0(FLG0_NO_HAIR_LEAD); } + void onSideWarp() { onStateFlg1(FLG1_SIDE_WARP); } - void onSideWarp() { - onStateFlg1(FLG1_UNK_100); - } + MtxP getMtxHairTop() { return mpShadowModel->getAnmMtx(10); } - MtxP getMtxHairTop() { - return field_0x574->getAnmMtx(10); + bool checkSetAnime(int param_0, daMidna_ANM i_anm) { + return mBckHeap[param_0].getIdx() == m_anmDataTable[i_anm].mResID; } bool checkReturnAnime() const { - return field_0x5e4[0].getIdx() == 0x1CA; + return mBckHeap[0].getIdx() == 0x1CA; } bool checkShadowModelDrawSmode() const { @@ -169,7 +330,7 @@ public: } bool checkShadowReturnEnd() const { - return field_0x5e4[0].getIdx() == 0x21C && field_0x578->isStop(); + return mBckHeap[0].getIdx() == 0x21C && mpMorf->isStop(); } bool checkShadowModeTalkWait() const { @@ -178,7 +339,6 @@ public: void setShadowReturn() { field_0x84e = 4; } - bool checkPortalObjRide() const { return checkStateFlg0(FLG0_PORTAL_OBJ_CALL) && checkStateFlg0(FLG0_UNK_200); } @@ -193,10 +353,8 @@ public: BOOL checkDemoPortalWarpWait() const { return mDemoMode == 11; } - inline static BOOL checkMidnaRealBody(); - - inline static BOOL i_checkMidnaRealBody() { - return dKy_darkworld_check() == 1 || dComIfGs_isTransformLV(3); + static BOOL checkMidnaRealBody() { + return dKy_darkworld_check() == true || dComIfGs_isTransformLV(3); } static bool i_checkMidnaTired() { @@ -206,132 +364,130 @@ public: void resetRatBody() {} bool checkFlyWaitAnime() { - return field_0x5e4[0].getIdx() == 0x1CB || field_0x5e4[0].getIdx() == 0x1C7 - || field_0x5e4[0].getIdx() == 0x1C8 || field_0x5e4[0].getIdx() == 0x1C9; + return mBckHeap[0].getIdx() == 0x1CB || mBckHeap[0].getIdx() == 0x1C7 + || mBckHeap[0].getIdx() == 0x1C8 || mBckHeap[0].getIdx() == 0x1C9; } void onForceMorfCancel() { onEndResetStateFlg0(ERFLG0_FORCE_MORF_CANCEL); } - static u8 const m_texDataTable[84]; - static u8 const m_anmDataTable[636]; + static daMidna_texData_s const m_texDataTable[21]; + static daMidna_anmData_s const m_anmDataTable[53]; private: - /* 0x0568 */ request_of_phase_process_class mPhase; - /* 0x0570 */ J3DModel* field_0x570; - /* 0x0574 */ J3DModel* field_0x574; - /* 0x0578 */ mDoExt_McaMorfSO* field_0x578; - /* 0x057C */ mDoExt_McaMorfCallBack1_c* field_0x57c; // this is really daMidna_McaMorfCB1_c. fix later - /* 0x0580 */ cXyz* field_0x580; - /* 0x0584 */ mDoExt_bckAnm field_0x584; - /* 0x05A0 */ mDoExt_bckAnm field_0x5a0; - /* 0x05BC */ J3DAnmTexPattern* field_0x5bc; - /* 0x05C0 */ J3DAnmTextureSRTKey* field_0x5c0; - /* 0x05C4 */ mDoExt_invisibleModel field_0x5c4; - /* 0x05CC */ mDoExt_invisibleModel mInvMaskBmd; - /* 0x05D4 */ mDoExt_invisibleModel mInvHandsBmd; - /* 0x05DC */ mDoExt_invisibleModel mInvHairhandBmd; - /* 0x05E4 */ daPy_anmHeap_c field_0x5e4[3]; - /* 0x0620 */ daPy_anmHeap_c field_0x620; - /* 0x0634 */ daPy_anmHeap_c field_0x634; - /* 0x0648 */ J3DAnmTextureSRTKey* field_0x648; - /* 0x064C */ J3DAnmTextureSRTKey* field_0x64c; - /* 0x0650 */ J3DAnmTextureSRTKey* field_0x650; - /* 0x0654 */ J3DAnmTextureSRTKey* field_0x654; - /* 0x0658 */ J3DAnmTevRegKey* field_0x658; - /* 0x065C */ J3DAnmTevRegKey* field_0x65c; - /* 0x0660 */ J3DAnmTevRegKey* field_0x660; - /* 0x0664 */ J3DAnmTevRegKey* field_0x664; - /* 0x0668 */ J3DAnmTevRegKey* field_0x668; - /* 0x066C */ J3DAnmTevRegKey* field_0x66c; - /* 0x0670 */ J3DModel* field_0x670; - /* 0x0674 */ J3DModel* mpMaskBmd; - /* 0x0678 */ J3DModel* field_0x678; - /* 0x067C */ J3DModel* mpHandsBmd; - /* 0x0680 */ J3DModel* field_0x680; - /* 0x0684 */ J3DModel* mpHairhandBmd; - /* 0x0688 */ J3DModel* mpDemoBDTmpBmd; - /* 0x068C */ J3DModel* mpDemoBDMaskBmd; - /* 0x0690 */ J3DModel* mpDemoBDHandsBmd; - /* 0x0694 */ J3DModel* mpDemoBDHairhandBmd; - /* 0x0698 */ J3DModel* mpGokouBmd; - /* 0x069C */ J3DShape* field_0x69c; - /* 0x06A0 */ J3DShape* field_0x6a0; - /* 0x06A4 */ J3DShape* field_0x6a4; - /* 0x06A8 */ J3DShape* field_0x6a8; - /* 0x06AC */ J3DModel* mpDemoFCBlendBmd; - /* 0x06B0 */ J3DModel* mpDemoFCTongueBmd; - /* 0x06B4 */ J3DAnmTextureSRTKey* field_0x6b4; - /* 0x06B8 */ mDoExt_bckAnm* mpDemoFCTmpBck; - /* 0x06BC */ J3DDeformData* mpDemoFCTmpBls; - /* 0x06C0 */ J3DAnmCluster* field_0x6c0; - /* 0x06C4 */ mDoExt_blkAnm* field_0x6c4; - /* 0x06C8 */ J3DModel* mpDemoHLTmpBmd; - /* 0x06CC */ mDoExt_bckAnm* mpDemoHLTmpBck; - /* 0x06D0 */ J3DModel* mpDemoHRTmpBmd; - /* 0x06D4 */ mDoExt_bckAnm* mpDemoHRTmpBck; - /* 0x06D8 */ J3DModel* mpDemoHDTmpBmd; - /* 0x06DC */ mDoExt_bckAnm* mpDemoHDTmpBck; - /* 0x06E0 */ J3DGXColorS10 field_0x6e0; - /* 0x06E8 */ J3DGXColor field_0x6e8; - /* 0x06EC */ u8 field_0x6ec; // this is probably J3DGXColor. fix later - /* 0x06ED */ u8 field_0x6ed; - /* 0x06EE */ u8 field_0x6ee; - /* 0x06EF */ u8 field_0x6ef; - /* 0x06F0 */ void* field_0x6f0; - /* 0x06F4 */ void* field_0x6f4; - /* 0x06F8 */ void* field_0x6f8; - /* 0x06FC */ Z2Creature field_0x6fc; - /* 0x078C */ dMsgFlow_c mMsgFlow; - /* 0x07D8 */ dBgS_LinkLinChk mLinChk; - /* 0x0848 */ u8 mMotionNum; - /* 0x0849 */ u8 mFaceNum; - /* 0x084A */ u8 field_0x84a[4]; - /* 0x084E */ u8 field_0x84e; - /* 0x084F */ u8 mDemoType; - /* 0x0850 */ u8 field_0x850[0xA]; - /* 0x085A */ s16 field_0x85a; - /* 0x085C */ u8 field_0x85c[0x22]; - /* 0x087E */ s16 field_0x87e; - /* 0x0880 */ u8 field_0x880[0xC]; // csXyz in here, fix later - /* 0x088C */ int mStaffID; - /* 0x0890 */ u32 mStateFlg0; - /* 0x0894 */ u32 mStateFlg1; - /* 0x0898 */ u32 mEndResetStateFlg0; - /* 0x089C */ u8 field_0x89c[0x24]; - /* 0x08C0 */ u32 mDemoMode; - /* 0x08C4 */ u8 field_0x8c4[4]; - /* 0x08C8 */ f32 field_0x8c8; - /* 0x08CC */ u8 field_0x8cc[0x14]; - /* 0x08E0 */ cXyz field_0x8e0[5]; - /* 0x091C */ cXyz field_0x91c[5]; - /* 0x0958 */ u8 field_0x958[0xC]; // cXyz here, fix later - /* 0x0964 */ cXyz field_0x964[5]; - /* 0x09A0 */ u8 field_0x9a0[0xC]; - /* 0x09AC */ cXyz field_0x9ac; - /* 0x09B8 */ u8 field_0x9b8[0x9C4 - 0x9B8]; - /* 0x09C4 */ cXyz field_0x9c4; - /* 0x09D0 */ u8 field_0x9d0[4]; - /* 0x09D4 */ daMidna_func mpFunc; + /* 0x568 */ request_of_phase_process_class mPhase; + /* 0x570 */ J3DModel* mpModel; + /* 0x574 */ J3DModel* mpShadowModel; + /* 0x578 */ mDoExt_McaMorfSO* mpMorf; + /* 0x57C */ daMidna_McaMorfCB1_c mMorfCB; + /* 0x584 */ mDoExt_bckAnm mUpperBck; + /* 0x5A0 */ mDoExt_bckAnm mFaceBck; + /* 0x5BC */ J3DAnmTexPattern* mpFaceBtp; + /* 0x5C0 */ J3DAnmTextureSRTKey* mpFaceBtk; + /* 0x5C4 */ mDoExt_invisibleModel mInvModel; + /* 0x5CC */ mDoExt_invisibleModel mMaskInvModel; + /* 0x5D4 */ mDoExt_invisibleModel mHandsInvModel; + /* 0x5DC */ mDoExt_invisibleModel mHairhandInvModel; + /* 0x5E4 */ daPy_anmHeap_c mBckHeap[3]; + /* 0x620 */ daPy_anmHeap_c mBtpHeap; + /* 0x634 */ daPy_anmHeap_c mBtkHeap; + /* 0x648 */ J3DAnmTextureSRTKey* mpMoyaBtk; + /* 0x64C */ J3DAnmTextureSRTKey* mpMaskMoyaBtk; + /* 0x650 */ J3DAnmTextureSRTKey* mpHandsMoyaBtk; + /* 0x654 */ J3DAnmTextureSRTKey* mpHairhandMoyaBtk; + /* 0x658 */ J3DAnmTevRegKey* mpAppearBrk; + /* 0x65C */ J3DAnmTevRegKey* mpMaskAppearBrk; + /* 0x660 */ J3DAnmTevRegKey* mpHairhandAppearBrk; + /* 0x664 */ J3DAnmTevRegKey* mpGokouAppearBrk; + /* 0x668 */ J3DAnmTevRegKey* field_0x668; + /* 0x66C */ J3DAnmTevRegKey* mpDemoFCBlendBrk; + /* 0x670 */ J3DModel* mpMaskBmd; + /* 0x674 */ J3DModel* mpShadowMaskBmd; + /* 0x678 */ J3DModel* mpHandsBmd; + /* 0x67C */ J3DModel* mpShadowHandsBmd; + /* 0x680 */ J3DModel* mpHairhandBmd; + /* 0x684 */ J3DModel* mpShadowHairhandBmd; + /* 0x688 */ J3DModel* mpDemoBDTmpBmd; + /* 0x68C */ J3DModel* mpDemoBDMaskBmd; + /* 0x690 */ J3DModel* mpDemoBDHandsBmd; + /* 0x694 */ J3DModel* mpDemoBDHairhandBmd; + /* 0x698 */ J3DModel* mpGokouBmd; + /* 0x69C */ J3DShape* mpLeftHandShape; + /* 0x6A0 */ J3DShape* mpRightHandShape; + /* 0x6A4 */ J3DShape* mpShadowLeftHandShape; + /* 0x6A8 */ J3DShape* mpShadowRightHandShape; + /* 0x6AC */ J3DModel* mpDemoFCBlendBmd; + /* 0x6B0 */ J3DModel* mpDemoFCTongueBmd; + /* 0x6B4 */ J3DAnmTextureSRTKey* mpDemoFCTongueBtk; + /* 0x6B8 */ mDoExt_bckAnm* mpDemoFCTmpBck; + /* 0x6BC */ J3DDeformData* mpDemoFCTmpBls; + /* 0x6C0 */ J3DAnmCluster* mpDemoFCTmpCluster; + /* 0x6C4 */ mDoExt_blkAnm* mpDemoFCTmpBlk; + /* 0x6C8 */ J3DModel* mpDemoHLTmpBmd; + /* 0x6CC */ mDoExt_bckAnm* mpDemoHLTmpBck; + /* 0x6D0 */ J3DModel* mpDemoHRTmpBmd; + /* 0x6D4 */ mDoExt_bckAnm* mpDemoHRTmpBck; + /* 0x6D8 */ J3DModel* mpDemoHDTmpBmd; + /* 0x6DC */ mDoExt_bckAnm* mpDemoHDTmpBck; + /* 0x6E0 */ J3DGXColorS10 field_0x6e0; + /* 0x6E8 */ J3DGXColor field_0x6e8; + /* 0x6EC */ J3DGXColor field_0x6ec; + /* 0x6F0 */ daMidna_matAnm_c* mpEyeMatAnm[2]; + /* 0x6F8 */ daMidna_hio_c0* mpHIO; + /* 0x6FC */ Z2Creature mSound; + /* 0x78C */ dMsgFlow_c mMsgFlow; + /* 0x7D8 */ dBgS_LinkLinChk mLinChk; + /* 0x848 */ u8 mMotionNum; + /* 0x849 */ u8 mFaceNum; + /* 0x84A */ u8 field_0x84a; + /* 0x84B */ u8 mFaceBckTimer; + /* 0x84C */ u8 mEyeMoveTimer; + /* 0x84D */ s8 mReverb; + /* 0x84E */ u8 field_0x84e; + /* 0x84F */ u8 mDemoType; + /* 0x850 */ u8 field_0x850; + /* 0x851 */ u8 field_0x851; + /* 0x852 */ u8 field_0x852[8]; + /* 0x85A */ s16 field_0x85a; + /* 0x85C */ s16 mHairAngleZ[5]; + /* 0x866 */ s16 mHairAngleY[5]; + /* 0x870 */ u8 field_0x870[2]; + /* 0x872 */ s16 field_0x872; + /* 0x874 */ s16 mBackboneAngleZ; + /* 0x876 */ s16 field_0x876; + /* 0x878 */ u16 mLeftHandShapeIdx; + /* 0x87A */ u16 mRightHandShapeIdx; + /* 0x87C */ s16 mDemoAngle; + /* 0x87E */ s16 field_0x87e; + /* 0x880 */ csXyz mNeckAngle; + /* 0x886 */ u8 field_0x886[6]; + /* 0x88C */ int mStaffID; + /* 0x890 */ u32 mStateFlg0; + /* 0x894 */ u32 mStateFlg1; + /* 0x898 */ u32 mEndResetStateFlg0; + /* 0x89C */ u32 mShadowKey; + /* 0x8A0 */ u32 mParticleKey1; + /* 0x8A4 */ u32 mParticleKey2; + /* 0x8A8 */ u32 mThroughEffectKey[6]; + /* 0x8C0 */ u32 mDemoMode; + /* 0x8C4 */ u32 mSoundID; + /* 0x8C8 */ f32 mVoiceFrame; + /* 0x8CC */ f32 mEyeMoveX; + /* 0x8D0 */ f32 mEyeMoveY; + /* 0x8D4 */ f32 field_0x8d4; + /* 0x8D8 */ f32 mDemoSpeed; + /* 0x8DC */ f32 field_0x8dc; + /* 0x8E0 */ cXyz mHairPos[5]; + /* 0x91C */ cXyz mHairDir[5]; + /* 0x958 */ cXyz mHeadCenterPos; + /* 0x964 */ cXyz mHairScale[5]; + /* 0x9A0 */ cXyz field_0x9a0; + /* 0x9AC */ cXyz mTagWaitPos; + /* 0x9B8 */ cXyz mDemoPos; + /* 0x9C4 */ cXyz mForceNeckAimPos; + /* 0x9D0 */ daKago_c* mpKago; + /* 0x9D4 */ daMidna_func mpFunc; }; -STATIC_ASSERT(sizeof(daMidna_c) == 0x9e0); - -class daMidna_matAnm_c : public fopAc_ac_c { -public: - /* 804BC218 */ void init(); - /* 804BC248 */ void calc(J3DMaterial*) const; - /* 804C63E0 */ ~daMidna_matAnm_c(); -}; - -class daMidna_hio_c0 { -public: - static u8 const m[32]; -}; - -class daMidna_McaMorfCB1_c { -public: - /* 804BC36C */ void execute(u16, J3DTransformInfo*); - /* 804C6398 */ ~daMidna_McaMorfCB1_c(); -}; +STATIC_ASSERT(sizeof(daMidna_c) == 0x9E0); #endif /* D_A_MIDNA_H */ diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index c6712245fa..69b20617f3 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -57,8 +57,6 @@ public: HEAP_TYPE_5, }; - /* 80140DCC */ void __defctor(); // compiler generated due to ctor with default param - daPy_anmHeap_c(u32 param_0 = 0); ~daPy_anmHeap_c(); void initData(); @@ -77,6 +75,7 @@ public: bool checkNoSetArcNo() const { return mArcNo == 0xFFFF; } void setBufferSize(u32 size) { mBufferSize = size; } void setBuffer(u8* buf) { mBuffer = buf; } + u32 getBufferSize() { return mBufferSize; } u8* getBuffer() { return mBuffer; } bool checkNoSetIdx() const { return mIdx == 0xFFFF; } bool checkNoSetPriIdx() const { return mPriIdx == 0xFFFF; } @@ -263,6 +262,7 @@ public: FLG1_DASH_MODE = 0x400000, FLG1_UNK_200000 = 0x200000, FLG1_UNK_100000 = 0x100000, + FLG1_MIDNA_ATN_POS = 0x80000, FLG1_UNK_40000 = 0x40000, FLG1_UNK_10000 = 0x10000, FLG1_UNK_8000 = 0x8000, @@ -271,6 +271,7 @@ public: FLG1_UNK_1000 = 0x1000, FLG1_UNK_800 = 0x800, FLG1_UNK_200 = 0x200, + FLG1_MIDNA_HAIR_ATN_POS = 0x100, FLG1_UNK_80 = 0x80, FLG1_UNK_40 = 0x40, FLG1_UNK_20 = 0x20, @@ -338,7 +339,7 @@ public: FLG3_UNK_100000 = 0x100000, FLG3_UNK_80000 = 0x80000, FLG3_COPY_ROD_THROW_AFTER = 0x40000, - FLG3_UNK_10000 = 0x10000, + FLG3_MIDNA_TALK_POLY_SPEED = 0x10000, FLG3_UNK_8000 = 0x8000, FLG3_UNK_4000 = 0x4000, FLG3_UNK_2000 = 0x2000, @@ -413,7 +414,7 @@ public: ERFLG1_WOLF_EYE_KEEP = 0x200, ERFLG1_UNK_100 = 0x100, ERFLG1_UNK_80 = 0x80, - ERFLG1_UNK_40 = 0x40, + ERFLG1_MIDNA_RIDE_SHOCK = 0x40, ERFLG1_UNK_20 = 0x20, ERFLG1_UNK_10 = 0x10, ERFLG1_UNK_8 = 8, @@ -424,6 +425,7 @@ public: enum daPy_ERFLG2 { ERFLG2_UNK_100 = 0x100, + ERFLG2_PORTAL_WARP_MIDNA_ATN_KEEP = 0x80, ERFLG2_UNK_40 = 0x40, ERFLG2_UNK_20 = 0x20, ERFLG2_UNK_10 = 0x10, @@ -806,6 +808,8 @@ public: BOOL checkSpecialHorseRide() { return checkNoResetFlg2(daPy_FLG2(FLG2_HORSE_ZELDA | FLG2_UNK_1000000 | FLG2_BOAR_SINGLE_BATTLE)); } BOOL checkBoardNoFootAngle() const { return checkResetFlg1(RFLG1_UNK_40); } bool checkGrabThrow() const { return checkResetFlg0(RFLG0_GRAB_THROW); } + bool checkMidnaAtnPos() const { return checkNoResetFlg1(FLG1_MIDNA_ATN_POS); } + bool checkMidnaHairAtnPos() const { return checkNoResetFlg1(FLG1_MIDNA_HAIR_ATN_POS); } void onBossRoomWait() { onEndResetFlg0(ERFLG0_BOSS_ROOM_WAIT); } void onBeeFollow() { onEndResetFlg0(ERFLG0_BEE_FOLLOW); } @@ -814,6 +818,7 @@ public: void onNotHang() { onEndResetFlg0(ERFLG0_NOT_HANG); } void onShieldBackBone() { onEndResetFlg1(ERFLG1_GANON_FINISH); } void onWolfEyeKeep() { onEndResetFlg1(ERFLG1_WOLF_EYE_KEEP); } + void onPortalWarpMidnaAtnKeep() { onEndResetFlg2(ERFLG2_PORTAL_WARP_MIDNA_ATN_KEEP); } void onFogFade() { onNoResetFlg2(FLG2_UNK_4000); } BOOL checkStickArrowReset() const { return checkResetFlg0(RFLG0_UNK_1); } u32 getCutAtFlg() const { return checkNoResetFlg0(FLG0_UNK_40); } @@ -829,6 +834,7 @@ public: mSpecialMode = 0; } } + void onMidnaTalkPolySpeed() { onNoResetFlg3(FLG3_MIDNA_TALK_POLY_SPEED); } void offCargoCarry() { if (checkCargoCarry()) { @@ -903,6 +909,9 @@ public: void offPlayerNoDraw() { offNoResetFlg0(FLG0_PLAYER_NO_DRAW); } void onPushPullKeep() { onNoResetFlg0(FLG0_PUSH_PULL_KEEP); } void offPushPullKeep() { offNoResetFlg0(FLG0_PUSH_PULL_KEEP); } + void onMidnaRide() { onNoResetFlg0(FLG0_MIDNA_RIDE); } + void offMidnaRide() { offNoResetFlg0(FLG0_MIDNA_RIDE); } + void onMidnaRideShock() { onEndResetFlg1(ERFLG1_MIDNA_RIDE_SHOCK); } void onPlayerShadowNoDraw() { onNoResetFlg2(FLG2_PLAYER_SHADOW); } void offPlayerShadowNoDraw() { offNoResetFlg2(FLG2_PLAYER_SHADOW); } void onLightSwordGetEffect() { onEndResetFlg2(ERFLG2_UNK_10); } @@ -935,6 +944,8 @@ public: void changeDemoMoveAngle(s16 i_angle) { mDemo.setMoveAngle(i_angle); } + void setItemPos(cXyz* i_itemPos) { mItemPos = *i_itemPos; } + static bool checkPeepEndSceneChange() { return getLastSceneMode() == 7; } static int getLastSceneDamage() { return (dComIfGs_getLastSceneMode() >> 4) & 0x7F; } @@ -954,6 +965,7 @@ public: static int checkNowWolfPowerUp() { return checkNowWolfEyeUp(); } static daMidna_c* getMidnaActor() { return m_midnaActor; } + static void setMidnaActor(fopAc_ac_c* actor) { m_midnaActor = (daMidna_c*)actor; } // not sure how to define this properly // static void onWolfEnemyCatch(fopAc_ac_c* i_actorP) { onWolfEnemyBiteAll(i_actorP,8);} diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 313f9ce838..e839029c52 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -3381,23 +3381,19 @@ inline void dComIfGp_event_setTalkPartner(fopAc_ac_c* i_actor) { } inline fopAc_ac_c* dComIfGp_event_getTalkPartner() { - u32 t = g_dComIfG_gameInfo.play.getEvent().mPtT; - return g_dComIfG_gameInfo.play.getEvent().convPId(t); + return g_dComIfG_gameInfo.play.getEvent().getPtT(); } inline fopAc_ac_c* dComIfGp_event_getItemPartner() { - u32 i = g_dComIfG_gameInfo.play.getEvent().mPtI; - return g_dComIfG_gameInfo.play.getEvent().convPId(i); + return g_dComIfG_gameInfo.play.getEvent().getPtI(); } inline fopAc_ac_c* dComIfGp_event_getPt1() { - u32 pt1 = g_dComIfG_gameInfo.play.getEvent().mPt1; - return g_dComIfG_gameInfo.play.getEvent().convPId(pt1); + return g_dComIfG_gameInfo.play.getEvent().getPt1(); } inline fopAc_ac_c* dComIfGp_event_getPt2() { - u32 pt2 = g_dComIfG_gameInfo.play.getEvent().mPt2; - return g_dComIfG_gameInfo.play.getEvent().convPId(pt2); + return g_dComIfG_gameInfo.play.getEvent().getPt2(); } inline BOOL dComIfGp_event_runCheck() { diff --git a/include/d/d_event.h b/include/d/d_event.h index 4f1c92504a..aa679237b2 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -159,6 +159,7 @@ public: fopAc_ac_c* getPt1() { return convPId(mPt1); } fopAc_ac_c* getPt2() { return convPId(mPt2); } fopAc_ac_c* getPtT() { return convPId(mPtT); } + fopAc_ac_c* getPtI() { return convPId(mPtI); } fopAc_ac_c* getPtD() { return convPId(mPtd); } bool isChangeOK(void* param_0) { return mChangeOK == param_0; } u8 getPreItemNo() { return mPreItemNo; } @@ -169,11 +170,11 @@ public: public: /* 0x000 */ u8 field_0x0[4]; /* 0x004 */ dEvt_order_c mOrder[8]; - /* 0x0C4 */ u32 mPt1; - /* 0x0C8 */ u32 mPt2; - /* 0x0CC */ u32 mPtT; - /* 0x0D0 */ u32 mPtI; - /* 0x0D4 */ u32 mPtd; + /* 0x0C4 */ fpc_ProcID mPt1; + /* 0x0C8 */ fpc_ProcID mPt2; + /* 0x0CC */ fpc_ProcID mPtT; + /* 0x0D0 */ fpc_ProcID mPtI; + /* 0x0D4 */ fpc_ProcID mPtd; /* 0x0D8 */ u16 mEventFlag; /* 0x0DA */ u16 mFlag2; /* 0x0DC */ u16 mHindFlag; diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 5197702f5f..2ccc09ee01 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -328,6 +328,8 @@ public: J3DModel* getModel() { return mpModel; } void offMorfNone() { mMorfNone = false; } void onMorfNone() { mMorfNone = true; } + J3DTransformInfo* getOldTransInfo() { return mpTransformInfo; } + Quaternion* getOldQuaternion() { return mpQuat; } private: /* 0x38 */ mDoExt_McaMorfCallBack1_c* mpCallback1; diff --git a/src/Z2AudioLib/Z2Creature.cpp b/src/Z2AudioLib/Z2Creature.cpp index a49079b28d..ef20c36192 100644 --- a/src/Z2AudioLib/Z2Creature.cpp +++ b/src/Z2AudioLib/Z2Creature.cpp @@ -260,7 +260,7 @@ Z2SoundHandlePool* Z2Creature::startCreatureVoice(JAISoundID i_soundID, s8 param /* 802C0AF8-802C0B70 2BB438 0078+00 3/0 2/0 0/0 .text * startCreatureVoiceLevel__10Z2CreatureF10JAISoundIDSc */ Z2SoundHandlePool* Z2Creature::startCreatureVoiceLevel(JAISoundID i_soundID, s8 param_1) { - if (i_soundID == 0x501f0) { + if (i_soundID == Z2SE_MDN_V_WAITD) { if (Z2GetStatusMgr()->getDemoStatus() == 2 || !Z2GetSceneMgr()->isInGame()) { return NULL; } @@ -420,7 +420,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSound(JAISoundID i_soundID, u32 Z2SoundHandlePool* handle = mSoundObjAnime.startSound(i_soundID, param_1, param_2); switch (mEnemyID) { - case 0x19: + case Z2_ENEMY_SF: if (i_soundID == Z2SE_EN_SF_BREAK_DOWN) { field_0xa3 = 1; Z2GetSoundObjMgr()->getEnemyList()->remove(this); @@ -429,7 +429,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSound(JAISoundID i_soundID, u32 Z2GetSoundObjMgr()->getEnemyList()->append(this); } break; - case 0x23: + case Z2_ENEMY_FZ: if (handle != NULL && handle->isSoundAttached() && i_soundID == Z2SE_EN_FZ_BOUND) { f32 volume = Z2Calc::linearTransform(param_1, 10.0f, 50.0f, 0.1f, 1.0f, false); f32 pitch = Z2Calc::linearTransform(param_1, 10.0f, 50.0f, 0.8f, 1.2f, false); @@ -437,16 +437,16 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSound(JAISoundID i_soundID, u32 (*handle)->getAuxiliary().movePitch(pitch, 0); } break; - case 0x2d: + case Z2_ENEMY_MS: Z2_E_ms_modVol(handle, mSoundObjAnime.field_0x1c); break; - case 0x36: + case Z2_ENEMY_SW: Z2_E_sw_modPitch(handle, param_1); break; - case 0x26: + case Z2_ENEMY_MM: Z2_E_mm_modPitch(handle, mSoundObjAnime.field_0x1c); break; - case 0x35: + case Z2_ENEMY_SM2: if (i_soundID == Z2SE_EN_SM_HIT) { field_0xa3 = 1; Z2GetSeqMgr()->setBattleLastHit(struct_80450869); @@ -485,17 +485,17 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureSoundLevel(JAISoundID i_soundID Z2SoundHandlePool* handle = mSoundObjAnime.startLevelSound(i_soundID, param_1, param_2); switch (mEnemyID) { - case 0x23: + case Z2_ENEMY_FZ: if (handle != NULL && *handle != NULL && i_soundID == Z2SE_EN_FZ_MOVE) { f32 volume = Z2Calc::getParamByExp(param_1, 1.0f, 50.0f, 0.4f, 0.1f, 1.1f, Z2Calc::CURVE_SIGN_1); (*handle)->getAuxiliary().moveVolume(volume, 0); } break; - case 0x36: + case Z2_ENEMY_SW: Z2_E_sw_modPitch(handle, param_1); break; - case 0x29: + case Z2_ENEMY_RB: if (handle != NULL && *handle != NULL && i_soundID == Z2SE_EN_RB_MOVE) { f32 volume = Z2Calc::getParamByExp(param_1, 4.0f, 35.0f, 0.6f, 0.7f, 1.0f, Z2Calc::CURVE_SIGN_1); @@ -588,25 +588,25 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureVoice(JAISoundID i_soundID, s8 Z2SoundHandlePool* handle = mSoundObjSimple1.startSound(i_soundID, var1, param_1); switch (mEnemyID) { - case 0x18: + case Z2_ENEMY_SH: if (i_soundID == Z2SE_EN_SH_V_DEAD) { field_0xa3 = 1; Z2GetSeqMgr()->setBattleLastHit(struct_80450869); } break; - case 0x1a: + case Z2_ENEMY_BS: if (i_soundID == Z2SE_EN_BS_V_DEAD) { field_0xa3 = 1; Z2GetSeqMgr()->setBattleLastHit(struct_80450869); } break; - case 0x2d: + case Z2_ENEMY_MS: Z2_E_ms_modVol(handle, mSoundObjSimple1.field_0x1c); break; - case 0x36: + case Z2_ENEMY_SW: Z2_E_sw_modPitch(handle, mSoundObjSimple1.field_0x1c); break; - case 0x26: + case Z2_ENEMY_MM: Z2_E_mm_modPitch(handle, mSoundObjSimple1.field_0x1c); break; } @@ -622,7 +622,7 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureVoice(JAISoundID i_soundID, s8 * startCreatureVoiceLevel__15Z2CreatureEnemyF10JAISoundIDSc */ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureVoiceLevel(JAISoundID i_soundID, s8 param_1) { u32 var1 = 0; - if (mEnemyID == 7) { + if (mEnemyID == Z2_ENEMY_RDY) { var1 = 1; } return mSoundObjSimple1.startLevelSound(i_soundID, var1, param_1); @@ -646,11 +646,11 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCreatureExtraSoundLevel(JAISoundID i_so Z2SoundHandlePool* Z2CreatureEnemy::startCollisionSE(u32 param_0, u32 param_1) { u8 var1; switch (mEnemyID) { - case 0x21: + case Z2_ENEMY_WS: field_0xa3 = 1; Z2GetSeqMgr()->setBattleLastHit(struct_80450869); return mSoundObjAnime.startCollisionSE(param_0, param_1, NULL); - case 0x2f: + case Z2_ENEMY_BI: if (getSupervisor() != NULL) { Z2GetSoundObjMgr()->removeEnemy(this); } @@ -673,7 +673,8 @@ Z2SoundHandlePool* Z2CreatureEnemy::startCollisionSE(u32 param_0, u32 param_1) { case 0x24: field_0xa3 = 1; var1 = struct_80450869; - if (param_0 - 0x40000 <= 1 || param_0 - 0x40000 == 3) { + if (param_0 == Z2SE_HIT_SWORD || param_0 == Z2SE_HIT_SWORD_STAB + || param_0 == Z2SE_HIT_WOLFBITE) { var1 = 0x14; } Z2GetSeqMgr()->setBattleLastHit(var1); diff --git a/src/Z2AudioLib/Z2SoundObjMgr.cpp b/src/Z2AudioLib/Z2SoundObjMgr.cpp index a4bfb2bc9c..45023dccd7 100644 --- a/src/Z2AudioLib/Z2SoundObjMgr.cpp +++ b/src/Z2AudioLib/Z2SoundObjMgr.cpp @@ -165,36 +165,36 @@ void Z2SoundObjMgr::searchEnemy() { bool bVar6 = false; u8 enemyId = this_00->mEnemyID; switch (enemyId) { - case 0x36: + case Z2_ENEMY_SW: if (Z2GetSceneMgr()->getCurrentSceneNum() == 0x1c) continue; break; - case 0x11: + case Z2_ENEMY_CR: if (Z2GetSceneMgr()->getCurrentSceneNum() == 0x1e) continue; break; - case 0x27: - case 0x28: - case 0x39: + case Z2_ENEMY_NZ: + case Z2_ENEMY_PO: + case Z2_ENEMY_HP: bVar6 = true; break; - case 0x37: + case Z2_ENEMY_RDB: if (iVar16 == 0) continue; break; - case 0xa: - case 0xb: + case Z2_ENEMY_WB: + case Z2_ENEMY_RD: if (iVar16 != 0) continue; - case 0xc: - case 0x16: - case 0x1f: - case 0x22: - case 0x26: - case 0x29: - case 0x2b: - case 0x30: - case 0x35: + case Z2_ENEMY_DN: + case Z2_ENEMY_DB: + case Z2_ENEMY_GE: + case Z2_ENEMY_OC: + case Z2_ENEMY_MM: + case Z2_ENEMY_RB: + case Z2_ENEMY_HB: + case Z2_ENEMY_TT: + case Z2_ENEMY_SM2: if (!Z2GetLink()->isRiding()) break; if (Z2GetLink()->getMoveSpeed() <= 0x26) @@ -339,14 +339,14 @@ void Z2SoundObjMgr::setGhostEnemyState(u8 p1) { * getEnemyID__13Z2SoundObjMgrFPCcP26JSULink<15Z2CreatureEnemy> */ u8 Z2SoundObjMgr::getEnemyID(char const* param_0, JSULink* param_1) { if (param_0 != NULL) { - for (u8 uVar2 = 0; uVar2 < 0x40; uVar2++) { + for (u8 uVar2 = 0; uVar2 < ARRAY_SIZE(mEnemyInfo); uVar2++) { if (strcmp(param_0, mEnemyInfo[(u32)uVar2].mName) == 0) { append(param_1); return uVar2; } } } - return Z2_ENEMY_ID_0; + return Z2_ENEMY_NULL; } /* 802C0100-802C0120 2BAA40 0020+00 1/1 1/1 0/0 .text setBattleInit__13Z2SoundObjMgrFv */ diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index 17f5483383..2d4106e69d 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -4725,8 +4725,8 @@ void daAlink_c::setPolygonSpeed() { offNoResetFlg3(daPy_FLG3(FLG3_UNK_1000 | FLG3_UNK_2000)); if ((!checkEventRun() || checkNoResetFlg0(FLG0_UNK_14000)) && !checkMagneBootsOn()) { cM3dGPla sp24; - if (checkNoResetFlg3(FLG3_UNK_10000)) { - offNoResetFlg3(FLG3_UNK_10000); + if (checkNoResetFlg3(FLG3_MIDNA_TALK_POLY_SPEED)) { + offNoResetFlg3(FLG3_MIDNA_TALK_POLY_SPEED); field_0x3594 = field_0x35a0; field_0x35a0 = cXyz::Zero; } @@ -7742,8 +7742,8 @@ BOOL daAlink_c::checkAutoJumpAction() { resetUpperAnime(UPPER_2, -1.0f); } - f32 var_f31 = field_0x35c4.x + (field_0x35ac.x + (speed.x + field_0x3594.x)); - f32 var_f30 = field_0x35c4.z + (field_0x35ac.z + (speed.z + field_0x3594.z)); + f32 var_f31 = field_0x35c4.x + (mWindSpeed.x + (speed.x + field_0x3594.x)); + f32 var_f30 = field_0x35c4.z + (mWindSpeed.z + (speed.z + field_0x3594.z)); BOOL var_r28 = true; f32 var_f29 = JMAFastSqrt((var_f31 * var_f31) + (var_f30 * var_f30)); @@ -7889,7 +7889,7 @@ BOOL daAlink_c::checkAutoJumpAction() { return procFallInit(1, sp24); } } - } else if (checkGrabGlide() && field_0x35ac.y > 10.0f) { + } else if (checkGrabGlide() && mWindSpeed.y > 10.0f) { mLinkAcch.i_ClrGroundHit(); return procAutoJumpInit(1); } else if (checkEndResetFlg0(ERFLG0_UNK_100) && mLinkAcch.i_ChkGroundHit() && !checkWolf()) { @@ -9931,10 +9931,10 @@ void daAlink_c::posMove() { current.pos += field_0x3594; if (checkModeFlg(2)) { - current.pos += field_0x35ac; + current.pos += mWindSpeed; } else { - current.pos.x += field_0x35ac.x; - current.pos.z += field_0x35ac.z; + current.pos.x += mWindSpeed.x; + current.pos.z += mWindSpeed.z; } } else if (checkNoResetFlg0(FLG0_UNK_14000)) { current.pos += field_0x3594; diff --git a/src/d/actor/d_a_alink_damage.inc b/src/d/actor/d_a_alink_damage.inc index 06bed0b62b..4f22e4a941 100644 --- a/src/d/actor/d_a_alink_damage.inc +++ b/src/d/actor/d_a_alink_damage.inc @@ -208,7 +208,7 @@ int daAlink_c::setDamagePoint(int i_dmgAmount, int i_checkZoraMag, int i_setDmgT setDamageColorTime(); } - field_0x3006 = 0; + mIceDamageWaitTimer = 0; return 0; } @@ -391,8 +391,8 @@ bool daAlink_c::checkLargeAttack(int param_0) const { /* 800D7C40-800D8F3C 0D2580 12FC+00 1/1 0/0 0/0 .text checkDamageAction__9daAlink_cFv */ BOOL daAlink_c::checkDamageAction() { - s16 spE = field_0x3006; - field_0x3006 = 0; + s16 spE = mIceDamageWaitTimer; + mIceDamageWaitTimer = 0; u8 spA = field_0x2fca; field_0x2fca = 0; @@ -513,17 +513,17 @@ BOOL daAlink_c::checkDamageAction() { field_0x2fca = spA; int sp2C = checkPolyDamage(); field_0x2fca = 0; - field_0x3006 = spE; + mIceDamageWaitTimer = spE; if (sp2C & 0x80) { - field_0x3006++; - if (field_0x3006 < daAlinkHIO_damage_c0::m.mFreezeTime) { + mIceDamageWaitTimer++; + if (mIceDamageWaitTimer < daAlinkHIO_damage_c0::m.mFreezeTime) { sp2C = 0; } - } else if (field_0x3006 > 3) { - field_0x3006 -= 3; + } else if (mIceDamageWaitTimer > 3) { + mIceDamageWaitTimer -= 3; } else { - field_0x3006 = 0; + mIceDamageWaitTimer = 0; } if (sp2C != 0) { @@ -2068,7 +2068,7 @@ int daAlink_c::procCoSwimFreezeReturnInit() { mUnderFrameCtrl[0].setEnd(3); mUnderFrameCtrl[0].setAttribute(0); setFaceBasicTexture(FTANM_UNK_90); - field_0x2f9b = 1; + mMidnaAnm = 1; var_f31 = daAlinkHIO_wlSwim_c0::m.field_0x48; } else { setSingleAnime(ANM_SWIM_DMG_FREEZE, daAlinkHIO_damNormal_c0::m.field_0x60, diff --git a/src/d/actor/d_a_alink_link.inc b/src/d/actor/d_a_alink_link.inc index a9b76298f5..ce0c03aaf9 100644 --- a/src/d/actor/d_a_alink_link.inc +++ b/src/d/actor/d_a_alink_link.inc @@ -1548,7 +1548,7 @@ int daAlink_c::procAutoJump() { field_0x3198 = 0x32; } - if (checkGrabGlide() && field_0x35ac.y > 0.0f) { + if (checkGrabGlide() && mWindSpeed.y > 0.0f) { speed.y = 0.0f; } @@ -2009,10 +2009,6 @@ int daAlink_c::procCrouch() { return 1; } -BOOL daMidna_c::checkMidnaRealBody() { - return dKy_darkworld_check() == 1 || dComIfGs_isTransformLV(3); -} - /* 800C77F4-800C7C64 0C2134 0470+00 4/2 0/0 0/0 .text procCoMetamorphoseInit__9daAlink_cFv */ int daAlink_c::procCoMetamorphoseInit() { int var_r29 = 0; @@ -4010,8 +4006,8 @@ int daAlink_c::draw() { tevStr.field_0x362 = b * var_f2; var_r31 = 0; } - } else if (field_0x3006 != 0) { - f32 temp_f4 = 1.0f - (field_0x3006 * (1.0f / daAlinkHIO_damage_c0::m.mFreezeTime)); + } else if (mIceDamageWaitTimer != 0) { + f32 temp_f4 = 1.0f - (mIceDamageWaitTimer * (1.0f / daAlinkHIO_damage_c0::m.mFreezeTime)); f32 temp_f3 = 1.0f - temp_f4; tevStr.mFogColor.r = (temp_f4 * daAlinkHIO_damage_c0::m.mFreezeInitR) + diff --git a/src/d/actor/d_a_alink_wolf.inc b/src/d/actor/d_a_alink_wolf.inc index 2d0bb4d746..9e24c6dffd 100644 --- a/src/d/actor/d_a_alink_wolf.inc +++ b/src/d/actor/d_a_alink_wolf.inc @@ -1222,9 +1222,9 @@ int daAlink_c::setDoubleAnimeWolf(f32 param_0, f32 param_1, f32 param_2, setFaceBasicTexture(FTANM_UNK_8B); if (checkWolfLieCode()) { - field_0x2f9b = 2; + mMidnaAnm = 2; } else { - field_0x2f9b = m_wlAnmDataTable[param_3].field_0x2; + mMidnaAnm = m_wlAnmDataTable[param_3].field_0x2; } daAlink_WANM var_r27; @@ -1284,9 +1284,9 @@ int daAlink_c::setSingleAnimeWolf(daAlink_c::daAlink_WANM i_anmID, f32 i_speed, setFaceBasicTexture(FTANM_UNK_8B); if (checkWolfLieCode()) { - field_0x2f9b = 2; + mMidnaAnm = 2; } else { - field_0x2f9b = m_wlAnmDataTable[i_anmID].field_0x2; + mMidnaAnm = m_wlAnmDataTable[i_anmID].field_0x2; } field_0x215c = mUnderFrameCtrl; @@ -1385,7 +1385,7 @@ int daAlink_c::checkNextActionWolf(int param_0) { return 1; } - if (checkEndResetFlg1(ERFLG1_UNK_40) && + if (checkEndResetFlg1(ERFLG1_MIDNA_RIDE_SHOCK) && (mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_SERVICE_WAIT || mProcID == PROC_WOLF_TIRED_WAIT || (!checkInputOnR() && mProcID == PROC_WOLF_MOVE) || mProcID == PROC_WOLF_LIE_START || mProcID == PROC_WOLF_LIE_MOVE || diff --git a/src/d/actor/d_a_door_shutter.cpp b/src/d/actor/d_a_door_shutter.cpp index 95953478e8..c615328901 100644 --- a/src/d/actor/d_a_door_shutter.cpp +++ b/src/d/actor/d_a_door_shutter.cpp @@ -257,7 +257,7 @@ void daDoor20_c::setEventPrm() { } } else { if (daPy_py_c::i_checkNowWolf()) { - if (!player->checkMidnaRide() || !daMidna_c::i_checkMidnaRealBody()) { + if (!player->checkMidnaRide() || !daMidna_c::checkMidnaRealBody()) { return; } } diff --git a/src/d/actor/d_a_midna.cpp b/src/d/actor/d_a_midna.cpp index 9007056ed2..15b26a356b 100644 --- a/src/d/actor/d_a_midna.cpp +++ b/src/d/actor/d_a_midna.cpp @@ -4,1641 +4,3431 @@ */ #include "d/actor/d_a_midna.h" -#include "dol2asm.h" +#include "SSystem/SComponent/c_math.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "JSystem/J3DGraphLoader/J3DAnmLoader.h" +#include "d/d_meter2_info.h" +#include "f_op/f_op_actor_mng.h" +#include "d/actor/d_a_alink.h" +#include "d/actor/d_a_kago.h" +#include "d/d_demo.h" +#include "d/d_msg_object.h" +#include "d/d_procname.h" +#include "d/d_stage.h" - -// -// Forward References: -// - -extern "C" void init__16daMidna_matAnm_cFv(); -extern "C" void calc__16daMidna_matAnm_cCFP11J3DMaterial(); -extern "C" void execute__20daMidna_McaMorfCB1_cFUsP16J3DTransformInfo(); -extern "C" void modelCallBack__9daMidna_cFi(); -extern "C" void changeUpperBck__9daMidna_cFv(); -extern "C" void changeFaceBck__9daMidna_cFv(); -extern "C" void baseModelCallBack__9daMidna_cFi(); -extern "C" static void daMidna_modelCallBack__FP8J3DJointi(); -extern "C" void initInvModel__9daMidna_cFUsPP8J3DModelP21mDoExt_invisibleModelUl(); -extern "C" void initDemoModel__9daMidna_cFPP8J3DModelPCcUl(); -extern "C" void createHeap__9daMidna_cFv(); -extern "C" void __dt__12J3DFrameCtrlFv(); -extern "C" void __dt__15J3DTevKColorAnmFv(); -extern "C" void __ct__15J3DTevKColorAnmFv(); -extern "C" void __dt__14J3DTevColorAnmFv(); -extern "C" void __ct__14J3DTevColorAnmFv(); -extern "C" void __dt__11J3DTexNoAnmFv(); -extern "C" void __ct__11J3DTexNoAnmFv(); -extern "C" void __dt__12J3DTexMtxAnmFv(); -extern "C" void __ct__12J3DTexMtxAnmFv(); -extern "C" void __dt__14J3DMatColorAnmFv(); -extern "C" void __ct__14J3DMatColorAnmFv(); -extern "C" static void daMidna_createHeap__FP10fopAc_ac_c(); -extern "C" void create__9daMidna_cFv(); -extern "C" void __dt__4cXyzFv(); -extern "C" void __ct__4cXyzFv(); -extern "C" void __defctor__14daPy_anmHeap_cFv(); -extern "C" static void daMidna_Create__FP10fopAc_ac_c(); -extern "C" void allAnimePlay__9daMidna_cFv(); -extern "C" void setMatrix__9daMidna_cFv(); -extern "C" void setBodyPartMatrix__9daMidna_cFv(); -extern "C" void setRoomInfo__9daMidna_cFv(); -extern "C" void setBodyPartPos__9daMidna_cFv(); -extern "C" void checkAppear__9daMidna_cFv(); -extern "C" void checkMidnaPosState__9daMidna_cFv(); -extern "C" void setUpperAnime__9daMidna_cFUsUs(); -extern "C" void setUpperAnimeAndSe__9daMidna_cFQ29daMidna_c11daMidna_ANM(); -extern "C" void setFaceAnime__9daMidna_cFUsUs(); -extern "C" void endHighModel__9daMidna_cFv(); -extern "C" void setDemoAnm__9daMidna_cFv(); -extern "C" void setFaceBtp__9daMidna_cFUsi(); -extern "C" void setFaceBtk__9daMidna_cFUsi(); -extern "C" void setLeftHandShape__9daMidna_cFUs(); -extern "C" void setRightHandShape__9daMidna_cFUs(); -extern "C" void checkHairOnlyAnime__9daMidna_cCFi(); -extern "C" void setBckAnime__9daMidna_cFP15J3DAnmTransformif(); -extern "C" void setAnm__9daMidna_cFv(); -extern "C" void getNeckAimAngle__9daMidna_cFPC4cXyzPsPsPsPs(); -extern "C" void clearEyeMove__9daMidna_cFv(); -extern "C" void setEyeMove__9daMidna_cFPC4cXyzss(); -extern "C" void setNeckAngle__9daMidna_cFv(); -extern "C" void initHairAngle__9daMidna_cFv(); -extern "C" void setHairAngle__9daMidna_cFv(); -extern "C" void setDemoData__9daMidna_cFv(); -extern "C" void setSimpleBrk__9daMidna_cFP12J3DModelDataUs(); -extern "C" void setSimpleBtk__9daMidna_cFP12J3DModelDataUs(); -extern "C" void initMidnaModel__9daMidna_cFv(); -extern "C" static void daMidna_searchNpc__FP10fopAc_ac_cPv(); -extern "C" void setMidnaNoDrawFlg__9daMidna_cFv(); -extern "C" void checkMetamorphoseEnableBase__9daMidna_cFv(); -extern "C" void checkNoDrawState__9daMidna_cFv(); -extern "C" void setSound__9daMidna_cFv(); -extern "C" void execute__9daMidna_cFv(); -extern "C" static void daMidna_Execute__FP9daMidna_c(); -extern "C" void draw__9daMidna_cFv(); -extern "C" static void daMidna_Draw__FP9daMidna_c(); -extern "C" void __dt__9daMidna_cFv(); -extern "C" static void daMidna_Delete__FP9daMidna_c(); -extern "C" void calc__11J3DTexNoAnmCFPUs(); -extern "C" void func_804C637C(void* _this, u8*); -extern "C" void __dt__20daMidna_McaMorfCB1_cFv(); -extern "C" void __dt__16daMidna_matAnm_cFv(); -extern "C" u8 const m__14daMidna_hio_c0[32]; -extern "C" u8 const m_texDataTable__9daMidna_c[84]; -extern "C" u8 const m_anmDataTable__9daMidna_c[636]; -extern "C" extern char const* const d_a_midna__stringBase0; - -// -// External References: -// - -extern "C" void mDoMtx_XYZrotM__FPA4_fsss(); -extern "C" void mDoMtx_ZXYrotM__FPA4_fsss(); -extern "C" void mDoMtx_XrotM__FPA4_fs(); -extern "C" void mDoMtx_YrotS__FPA4_fs(); -extern "C" void mDoMtx_YrotM__FPA4_fs(); -extern "C" void mDoMtx_ZrotM__FPA4_fs(); -extern "C" void mDoMtx_QuatConcat__FPC10QuaternionPC10QuaternionP10Quaternion(); -extern "C" void mDoMtx_MtxToRot__FPA4_CfP5csXyz(); -extern "C" void transS__14mDoMtx_stack_cFRC4cXyz(); -extern "C" void transM__14mDoMtx_stack_cFfff(); -extern "C" void scaleM__14mDoMtx_stack_cFfff(); -extern "C" void scaleM__14mDoMtx_stack_cFRC4cXyz(); -extern "C" void ZXYrotM__14mDoMtx_stack_cFRC5csXyz(); -extern "C" void play__14mDoExt_baseAnmFv(); -extern "C" void init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb(); -extern "C" void changeBckOnly__13mDoExt_bckAnmFP15J3DAnmTransform(); -extern "C" void entry__13mDoExt_bckAnmFP12J3DModelDataf(); -extern "C" void init__13mDoExt_blkAnmFP13J3DDeformDataP13J3DAnmClusteriifss(); -extern "C" void mDoExt_modelEntryDL__FP8J3DModel(); -extern "C" void create__21mDoExt_invisibleModelFP8J3DModelUc(); -extern "C" void entryDL__21mDoExt_invisibleModelFP4cXyz(); -extern "C" void setMorf__13mDoExt_morf_cFf(); -extern "C" void -__ct__16mDoExt_McaMorfSOFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiP10Z2CreatureUlUl(); -extern "C" void setAnm__16mDoExt_McaMorfSOFP15J3DAnmTransformiffff(); -extern "C" void play__16mDoExt_McaMorfSOFUlSc(); -extern "C" void modelCalc__16mDoExt_McaMorfSOFv(); -extern "C" void getTransform__16mDoExt_McaMorfSOFUsP16J3DTransformInfo(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void __dt__10fopAc_ac_cFv(); -extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); -extern "C" void fopAcM_setStageLayer__FPv(); -extern "C" void fopAcM_entrySolidHeap__FP10fopAc_ac_cPFP10fopAc_ac_c_iUl(); -extern "C" void fopAcM_searchActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_seenActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_orderPotentialEvent__FP10fopAc_ac_cUsUsUs(); -extern "C" void fopAcM_getTalkEventPartner__FPC10fopAc_ac_c(); -extern "C" void lineCheck__11fopAcM_lc_cFPC4cXyzPC4cXyzPC10fopAc_ac_c(); -extern "C" void gndCheck__11fopAcM_gc_cFPC4cXyz(); -extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfGp_getReverb__Fi(); -extern "C" void -dComIfGd_setShadow__FUlScP8J3DModelP4cXyzffffR13cBgS_PolyInfoP12dKy_tevstr_csfP9_GXTexObj(); -extern "C" void isTransformLV__21dSv_player_status_b_cCFi(); -extern "C" void isEventBit__11dSv_event_cCFUs(); -extern "C" void getPrm_Morf__13dDemo_actor_cFv(); -extern "C" void getDemoIDData__13dDemo_actor_cFPiPiPiPUsPUc(); -extern "C" void getActor__14dDemo_object_cFUc(); -extern "C" void syncRes__14dRes_control_cFPCcP11dRes_info_ci(); -extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void getRes__14dRes_control_cFPCcPCcP11dRes_info_ci(); -extern "C" void getIDRes__14dRes_control_cFPCcUsP11dRes_info_ci(); -extern "C" void reset__14dEvt_control_cFPv(); -extern "C" void convPId__14dEvt_control_cFUi(); -extern "C" void getMyStaffId__16dEvent_manager_cFPCcP10fopAc_ac_ci(); -extern "C" void getMyNowCutName__16dEvent_manager_cFi(); -extern "C" void getMySubstanceP__16dEvent_manager_cFiPCci(); -extern "C" void cutEnd__16dEvent_manager_cFi(); -extern "C" void checkStartDemo__16dEvent_manager_cFv(); -extern "C" void getEmitter__Q213dPa_control_c7level_cFUl(); -extern "C" void -set__13dPa_control_cFUlUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void addReal__21dDlst_shadowControl_cFUlP8J3DModel(); -extern "C" void StartShock__12dVibration_cFii4cXyz(); -extern "C" void LineCross__4cBgSFP11cBgS_LinChk(); -extern "C" void GetPolyColor__4dBgSFRC13cBgS_PolyInfo(); -extern "C" void GetRoomId__4dBgSFRC13cBgS_PolyInfo(); -extern "C" void Set__11dBgS_LinChkFPC4cXyzPC4cXyzPC10fopAc_ac_c(); -extern "C" void __ct__15dBgS_LinkLinChkFv(); -extern "C" void __dt__15dBgS_LinkLinChkFv(); -extern "C" void initDemoBck__9daAlink_cFPP13mDoExt_bckAnmPCc(); -extern "C" void simpleAnmPlay__9daAlink_cFP10J3DAnmBase(); -extern "C" void getMetamorphoseNearDis__9daAlink_cCFv(); -extern "C" void getMetamorphoseFarDis__9daAlink_cCFv(); -extern "C" void getMetamorphoseFarAngle__9daAlink_cCFv(); -extern "C" void checkCloudSea__9daAlink_cFv(); -extern "C" void initShadowScaleLight__9daAlink_cFv(); -extern "C" void moveShadowScaleLight__9daAlink_cFv(); -extern "C" void checkMidnaUseAbility__9daAlink_cCFv(); -extern "C" void getWolfTagJumpTime__9daAlink_cCFv(); -extern "C" void checkMidnaLockJumpPoint__9daAlink_cCFv(); -extern "C" void checkMidnaDisappearMode__9daAlink_cCFv(); -extern "C" void getWolfLockActorEnd__9daAlink_cFv(); -extern "C" void __ct__14daPy_anmHeap_cFUl(); -extern "C" void __dt__14daPy_anmHeap_cFv(); -extern "C" void initData__14daPy_anmHeap_cFv(); -extern "C" void mallocBuffer__14daPy_anmHeap_cFv(); -extern "C" void createHeap__14daPy_anmHeap_cFQ214daPy_anmHeap_c16daAlinkHEAP_TYPE(); -extern "C" void loadDataIdx__14daPy_anmHeap_cFUs(); -extern "C" void loadDataDemoRID__14daPy_anmHeap_cFUsUs(); -extern "C" void daPy_addCalcShort__FPsssss(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void dKy_darkworld_check__Fv(); -extern "C" void isMouthCheck__12dMsgObject_cFv(); -extern "C" void __ct__10dMsgFlow_cFv(); -extern "C" void __dt__10dMsgFlow_cFv(); -extern "C" void init__10dMsgFlow_cFP10fopAc_ac_ciiPP10fopAc_ac_c(); -extern "C" void doFlow__10dMsgFlow_cFP10fopAc_ac_cPP10fopAc_ac_ci(); -extern "C" void getEventId__10dMsgFlow_cFPi(); -extern "C" void __pl__4cXyzCFRC3Vec(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void __ml__4cXyzCFf(); -extern "C" void atan2sX_Z__4cXyzCFv(); -extern "C" void atan2sY_XZ__4cXyzCFv(); -extern "C" void cM_atan2s__Fff(); -extern "C" void cM_rnd__Fv(); -extern "C" void cM_rndF__Ff(); -extern "C" void cM_rndFX__Ff(); -extern "C" void cLib_addCalc__FPfffff(); -extern "C" void cLib_addCalcPos__FP4cXyzRC4cXyzfff(); -extern "C" void cLib_addCalcAngleS__FPsssss(); -extern "C" void cLib_chaseUC__FPUcUcUc(); -extern "C" void cLib_chaseS__FPsss(); -extern "C" void cLib_chasePos__FP4cXyzRC4cXyzf(); -extern "C" void __ct__10Z2CreatureFv(); -extern "C" void __dt__10Z2CreatureFv(); -extern "C" void init__10Z2CreatureFP3VecP3VecUcUc(); -extern "C" void initAnime__10Z2CreatureFPvbff(); -extern "C" void updateAnime__10Z2CreatureFff(); -extern "C" void* __nw__FUl(); -extern "C" void __dl__FPv(); -extern "C" void readIdxResource__10JKRArchiveFPvUlUl(); -extern "C" void setDeformData__8J3DModelFP13J3DDeformDataUl(); -extern "C" void calcWeightEnvelopeMtx__8J3DModelFv(); -extern "C" void init__12J3DFrameCtrlFs(); -extern "C" void checkPass__12J3DFrameCtrlFf(); -extern "C" void getTexNo__16J3DAnmTexPatternCFUsPUs(); -extern "C" void searchUpdateMaterialID__16J3DAnmTexPatternFP12J3DModelData(); -extern "C" void searchUpdateMaterialID__19J3DAnmTextureSRTKeyFP12J3DModelData(); -extern "C" void getTevColorReg__15J3DAnmTevRegKeyCFUsP11_GXColorS10(); -extern "C" void getTevKonstReg__15J3DAnmTevRegKeyCFUsP8_GXColor(); -extern "C" void searchUpdateMaterialID__15J3DAnmTevRegKeyFP12J3DModelData(); -extern "C" void initialize__14J3DMaterialAnmFv(); -extern "C" void calc__14J3DMaterialAnmCFP11J3DMaterial(); -extern "C" void removeTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey(); -extern "C" void removeTevRegAnimator__16J3DMaterialTableFP15J3DAnmTevRegKey(); -extern "C" void entryTexNoAnimator__16J3DMaterialTableFP16J3DAnmTexPattern(); -extern "C" void entryTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey(); -extern "C" void entryTevRegAnimator__16J3DMaterialTableFP15J3DAnmTevRegKey(); -extern "C" void load__20J3DAnmLoaderDataBaseFPCv24J3DAnmLoaderDataBaseFlag(); -extern "C" void JMAEulerToQuat__FsssP10Quaternion(); -extern "C" void __destroy_arr(); -extern "C" void __construct_array(); -extern "C" void _savegpr_14(); -extern "C" void _savegpr_20(); -extern "C" void _savegpr_23(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_26(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_14(); -extern "C" void _restgpr_20(); -extern "C" void _restgpr_23(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_26(); -extern "C" void _restgpr_27(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" extern void* __vt__14J3DMaterialAnm[4]; -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" u8 mGndCheck__11fopAcM_gc_c[84]; -extern "C" u8 mDemoArcName__20dStage_roomControl_c[10 + 2 /* padding */]; -extern "C" u8 mSimpleTexObj__21dDlst_shadowControl_c[32]; -extern "C" extern u8 g_meter2_info[248]; -extern "C" f32 Zero__4cXyz[3]; -extern "C" u8 BaseX__4cXyz[12]; -extern "C" u8 mCurrentMtx__6J3DSys[48]; -extern "C" u8 sincosTable___5JMath[65536]; -extern "C" f32 mGroundY__11fopAcM_gc_c; -extern "C" u8 m_object__7dDemo_c[4]; -extern "C" u8 m_midnaActor__9daPy_py_c[4]; -extern "C" extern u8 struct_804C6CD8[4]; - -// -// Declarations: -// - -/* ############################################################################################## */ /* 804C64C8-804C64D4 000000 000C+00 15/15 0/0 0/0 .rodata @3777 */ -SECTION_RODATA static u8 const lit_3777[12] = { +static u8 const lit_3777[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -COMPILER_STRIP_GATE(0x804C64C8, &lit_3777); /* 804C64D4-804C64DC 00000C 0006+02 5/6 0/0 0/0 .rodata l_arcName */ -SECTION_RODATA static u8 const l_arcName[6 + 2 /* padding */] = { - 0x4D, - 0x69, - 0x64, - 0x6E, - 0x61, - 0x00, - /* padding */ - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x804C64D4, &l_arcName); +static char const l_arcName[6] = "Midna"; /* 804C64DC-804C64E8 000014 000C+00 0/1 0/0 0/0 .rodata l_eyeOffset */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_eyeOffset[12] = { - 0x41, 0x80, 0x00, 0x00, 0xC1, 0x26, 0x66, 0x67, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C64DC, &l_eyeOffset); -#pragma pop +static Vec const l_eyeOffset = { 16.0f, -10.400001f, 0.0f }; /* 804C64E8-804C64F4 000020 000C+00 0/1 0/0 0/0 .rodata l_headCenterOffset */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_headCenterOffset[12] = { - 0x00, 0x00, 0x00, 0x00, 0xC1, 0x26, 0x66, 0x67, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C64E8, &l_headCenterOffset); -#pragma pop +static Vec const l_headCenterOffset = { 0.0f, -10.400001f, 0.0f }; /* 804C64F4-804C64FC 00002C 0008+00 0/2 0/0 0/0 .rodata l_normalColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_normalColor[8] = { - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C64F4, &l_normalColor); -#pragma pop +static GXColorS10 const l_normalColor = { 0x50, 0x00, 0x00, 0x00 }; /* 804C64FC-804C6500 000034 0004+00 0/3 0/0 0/0 .rodata l_normalKColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_normalKColor = 0xB4870000; -COMPILER_STRIP_GATE(0x804C64FC, &l_normalKColor); -#pragma pop +static GXColor const l_normalKColor = { 0xB4, 0x87, 0x00, 0x00 }; /* 804C6500-804C6504 000038 0004+00 0/3 0/0 0/0 .rodata l_normalKColor2 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_normalKColor2 = 0x00C3C300; -COMPILER_STRIP_GATE(0x804C6500, &l_normalKColor2); -#pragma pop +static GXColor const l_normalKColor2 = { 0x00, 0xC3, 0xC3, 0x00 }; /* 804C6504-804C650C 00003C 0008+00 0/1 0/0 0/0 .rodata l_bigColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_bigColor[8] = { - 0x00, 0xFF, 0x00, 0x64, 0x00, 0x78, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6504, &l_bigColor); -#pragma pop +static GXColorS10 const l_bigColor = { 0xFF, 0x64, 0x78, 0x00 }; /* 804C650C-804C6510 000044 0004+00 0/1 0/0 0/0 .rodata l_bigKColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_bigKColor = 0x1E000000; -COMPILER_STRIP_GATE(0x804C650C, &l_bigKColor); -#pragma pop +static GXColor const l_bigKColor = { 0x1E, 0x00, 0x00, 0x00 }; /* 804C6510-804C6514 000048 0004+00 0/3 0/0 0/0 .rodata l_lNormalKColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_lNormalKColor = 0xFFDC0000; -COMPILER_STRIP_GATE(0x804C6510, &l_lNormalKColor); -#pragma pop +static GXColor const l_lNormalKColor = { 0xFF, 0xDC, 0x00, 0x00 }; /* 804C6514-804C6518 00004C 0004+00 0/3 0/0 0/0 .rodata l_lNormalKColor2 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_lNormalKColor2 = 0x00C3EB00; -COMPILER_STRIP_GATE(0x804C6514, &l_lNormalKColor2); -#pragma pop +static GXColor const l_lNormalKColor2 = { 0x00, 0xC3, 0xEB, 0x00 }; /* 804C6518-804C6520 000050 0008+00 0/1 0/0 0/0 .rodata l_lBigColor */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_lBigColor[8] = { - 0x00, 0xFF, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6518, &l_lBigColor); -#pragma pop +static GXColorS10 const l_lBigColor = { 0xFF, 0x78, 0x00, 0x00 }; /* 804C6520-804C6524 000058 0004+00 0/1 0/0 0/0 .rodata l_lBigKColor2 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const l_lBigKColor2 = 0xAAFFC300; -COMPILER_STRIP_GATE(0x804C6520, &l_lBigKColor2); -#pragma pop +static GXColor const l_lBigKColor2 = { 0xAA, 0xFF, 0xC3, 0x00 }; /* 804C6524-804C6560 00005C 003C+00 0/2 0/0 0/0 .rodata l_hairScale */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const l_hairScale[60] = { - 0x3E, 0x99, 0x99, 0x9A, 0x3F, 0x4C, 0xCC, 0xCD, 0x3F, 0x33, 0x33, 0x33, 0x3E, 0x4C, 0xCC, - 0xCD, 0x3F, 0x4C, 0xCC, 0xCD, 0x3E, 0xCC, 0xCC, 0xCD, 0x3E, 0x19, 0x99, 0x9A, 0x3F, 0x40, - 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3D, 0xCC, 0xCC, 0xCD, 0x3F, 0x33, 0x33, 0x33, 0x3F, - 0x33, 0x33, 0x33, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, +static Vec const l_hairScale[5] = { + {0.3f, 0.8f, 0.7f}, + {0.2f, 0.8f, 0.4f}, + {0.15f, 0.75f, 0.5f}, + {0.1f, 0.7f, 0.7f}, + {1.0f, 1.0f, 1.0f}, +}; + +enum Joint { + /* 0x00 */ JNT_WORLD_ROOT, + /* 0x01 */ JNT_BACKBONE1, + /* 0x02 */ JNT_BACKBONE2, + /* 0x03 */ JNT_NECK, + /* 0x04 */ JNT_HEAD, + /* 0x05 */ JNT_CHIN, + /* 0x06 */ JNT_HAIR_1, + /* 0x07 */ JNT_HAIR_2, + /* 0x08 */ JNT_HAIR_3, + /* 0x09 */ JNT_HAIR_4, + /* 0x0A */ JNT_HAIR_5, + /* 0x0B */ JNT_MOUTH, + /* 0x0C */ JNT_SHOULDER_L, + /* 0x0D */ JNT_ARM_L1, + /* 0x0E */ JNT_ARM_L2, + /* 0x0F */ JNT_HAND_L, + /* 0x10 */ JNT_SHOULDER_R, + /* 0x11 */ JNT_ARM_R1, + /* 0x12 */ JNT_ARM_R2, + /* 0x13 */ JNT_HAND_R, + /* 0x14 */ JNT_WAIST, + /* 0x15 */ JNT_CLOTCHL, + /* 0x16 */ JNT_LEG_L1, + /* 0x17 */ JNT_LEG_L2, + /* 0x18 */ JNT_FOOT_L, + /* 0x19 */ JNT_CLOTCHR, + /* 0x1A */ JNT_LEG_R1, + /* 0x1B */ JNT_LEG_R2, + /* 0x1C */ JNT_FOOT_R, + /* 0x1D */ JNT_MAX, }; -COMPILER_STRIP_GATE(0x804C6524, &l_hairScale); -#pragma pop /* 804C6560-804C6580 000098 0020+00 1/3 0/0 0/0 .rodata m__14daMidna_hio_c0 */ -SECTION_RODATA u8 const daMidna_hio_c0::m[32] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xC2, 0xAE, 0x00, 0x00, 0x41, 0xC8, 0x00, 0x00, +daMidna_hio_c0::param const daMidna_hio_c0::m = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + 1.0f, + -87.0f, + 25.0f, }; -COMPILER_STRIP_GATE(0x804C6560, &daMidna_hio_c0::m); -/* 804C6580-804C6584 0000B8 0004+00 6/18 0/0 0/0 .rodata @4278 */ -SECTION_RODATA static u8 const lit_4278[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x804C6580, &lit_4278); +bool daMidna_matAnm_c::sEyeMoveFlg; +u8 daMidna_matAnm_c::sMorfFrame; /* 804BC218-804BC248 000078 0030+00 2/2 0/0 0/0 .text init__16daMidna_matAnm_cFv */ void daMidna_matAnm_c::init() { - // NONMATCHING + mOldTransX = 0.0f; + mOldTransY = 0.0f; + mNowOffsetX = 0.0f; + mNowOffsetY = 0.0f; + sEyeMoveFlg = false; + sMorfFrame = 0; } -/* ############################################################################################## */ -/* 804C6584-804C6588 0000BC 0004+00 5/14 0/0 0/0 .rodata @4303 */ -SECTION_RODATA static f32 const lit_4303 = 1.0f; -COMPILER_STRIP_GATE(0x804C6584, &lit_4303); - -/* 804C6588-804C6590 0000C0 0008+00 3/9 0/0 0/0 .rodata @4305 */ -SECTION_RODATA static u8 const lit_4305[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6588, &lit_4305); - /* 804BC248-804BC36C 0000A8 0124+00 1/0 0/0 0/0 .text calc__16daMidna_matAnm_cCFP11J3DMaterial */ -void daMidna_matAnm_c::calc(J3DMaterial* param_0) const { - // NONMATCHING +void daMidna_matAnm_c::calc(J3DMaterial* i_material) const { + J3DMaterialAnm::calc(i_material); + for (u32 i = 0; i < 8; i++) { + if (getTexMtxAnm(i).getAnmFlag()) { + J3DTexMtxInfo& tex_mtx = i_material->getTexGenBlock()->getTexMtx(i)->getTexMtxInfo(); + if (sMorfFrame != 0) { + f32 t = 1.0f / (sMorfFrame + 1); + tex_mtx.mSRT.mTranslationX = + mOldTransX * (1.0f - t) + tex_mtx.mSRT.mTranslationX * t; + tex_mtx.mSRT.mTranslationY = + mOldTransY * (1.0f - t) + tex_mtx.mSRT.mTranslationY * t; + } else if (sEyeMoveFlg != 0) { + tex_mtx.mSRT.mTranslationX = mNowOffsetX; + tex_mtx.mSRT.mTranslationY = mNowOffsetY; + } + const_cast(this)->mOldTransX = tex_mtx.mSRT.mTranslationX; + const_cast(this)->mOldTransY = tex_mtx.mSRT.mTranslationY; + } + } } /* 804BC36C-804BC3E0 0001CC 0074+00 1/0 0/0 0/0 .text * execute__20daMidna_McaMorfCB1_cFUsP16J3DTransformInfo */ -void daMidna_McaMorfCB1_c::execute(u16 param_0, J3DTransformInfo* param_1) { - // NONMATCHING +int daMidna_McaMorfCB1_c::execute(u16 i_jointNo, J3DTransformInfo* transform) { + if (!daPy_py_c::m_midnaActor->checkNoHairScale()) { + if (i_jointNo >= JNT_HAIR_1 && i_jointNo <= JNT_HAIR_5) { + cXyz* scale = &mpScale[i_jointNo - JNT_HAIR_1]; + transform->mScale.x *= scale->x; + transform->mScale.y *= scale->y; + transform->mScale.z *= scale->z; + } + } + return 1; } +/* 804C6590-804C65E4 0000C8 0054+00 0/1 0/0 0/0 .rodata m_texDataTable__9daMidna_c */ +daMidna_texData_s const daMidna_c::m_texDataTable[21] = { + 0x0405, 0x03A4, + 0x03F5, 0x0399, + 0x03F6, 0x0399, + 0x0407, 0x0399, + 0x0406, 0x03A5, + 0x0405, 0x03A0, + 0x03FA, 0x0399, + 0x0401, 0x039E, + 0x03F7, 0x039F, + 0x0403, 0x03A2, + 0x0404, 0x03A3, + 0x03F7, 0x03A1, + 0x03FC, 0x039A, + 0x0402, 0x0399, + 0x03FE, 0x039B, + 0x03FF, 0x039C, + 0x03F8, 0x0399, + 0x03F9, 0x0399, + 0x0400, 0x039D, + 0x03FB, 0x0399, + 0x03FD, 0x0399, +}; + +/* 804C65E4-804C6860 00011C 027C+00 3/12 0/0 0/0 .rodata m_anmDataTable__9daMidna_c */ +daMidna_anmData_s const daMidna_c::m_anmDataTable[53] = { + 0x01DC, 0x00, -1.0f, 0, + 0x01B7, 0x01, -1.0f, 0, + 0x01B8, 0x02, -1.0f, 0, + 0x01DD, 0x03, -1.0f, 0, + 0x01D3, 0x04, 1.0f, Z2SE_MDN_V_LV_PANIC, + 0x01DB, 0x00, -1.0f, 0, + 0x01C8, 0x05, 1.0f, Z2SE_MDN_V_FLY_OUT, + 0x01C7, 0x00, -1.0f, 0, + 0x01CB, 0x10, -1.0f, 0, + 0x01CA, 0x00, 2.0f, Z2SE_MDN_V_HIP, + 0x01C9, 0x00, 0.1f, Z2SE_MDN_V_LEADSWAIT, + 0x01BA, 0x06, 3.0f, Z2SE_MDN_V_CLINGST, + 0x01D8, 0x07, 3.0f, Z2SE_MDN_V_SWAITB_1, + 0x01D9, 0x08, 1.0f, Z2SE_MDN_V_SWAITC, + 0x01E1, 0x09, 1.0f, Z2SE_MDN_V_WLDIEA, + 0x01E2, 0x0A, 1.0f, Z2SE_MDN_V_WLSWIMDIE, + 0x0217, 0x00, -1.0f, 0, + 0x0218, 0x00, -1.0f, 0, + 0x021C, 0x00, -1.0f, 0, + 0x0219, 0x00, -1.0f, 0, + 0x01E0, 0x0B, -1.0f, 0, + 0x01DF, 0x10, 7.0f, Z2SE_MDN_V_WAITTP, + 0x01BE, 0x0C, 1.0f, Z2SE_MDN_V_ENTRANCE, + 0x01DA, 0x0D, 28.0f, Z2SE_MDN_V_SWAITD, + 0x01C6, 0x0E, 10.0f, Z2SE_MDN_V_HIT, + 0x01CC, 0x0F, 11.0f, Z2SE_MDN_V_LOOKABOUT_1, + 0x01D7, 0x12, 8.0f, Z2SE_MDN_V_SWAITA, + 0x021A, 0x00, -1.0f, 0, + 0x01D4, 0x00, -1.0f, 0, + 0x01DE, 0x11, -1.0f, 0, + 0x01B9, 0x11, -1.0f, 0, + 0x01D6, 0x00, 27.0f, Z2SE_MDN_V_ROPEWAIT_1, + 0x01D5, 0x00, 48.0f, Z2SE_MDN_V_ROPEFALTER, + 0x01BB, 0x00, -1.0f, 0, + 0x01BC, 0x00, 17.0f, Z2SE_MDN_V_DOOROP, + 0x01BD, 0x00, 20.0f, Z2SE_MDN_V_DOOROP, + 0x01C2, 0x13, -1.0f, 0, + 0x01C3, 0x14, 0.1f, Z2SE_MDN_V_WARP_LIFTUP, + 0x01CE, 0x10, 1.0f, Z2SE_MDN_V_MGN_CATCH, + 0x01CD, 0x10, -1.0f, 0, + 0x01D0, 0x10, 1.0f, Z2SE_MDN_V_MGN_TAME, + 0x01CF, 0x10, 1.0f, Z2SE_MDN_V_MGN_THROW, + 0x01D2, 0x10, 1.0f, Z2SE_MDN_V_MGN_TAME, + 0x01D1, 0x10, 1.0f, Z2SE_MDN_V_MGN_THROW, + 0x01BF, 0x00, -1.0f, 0, + 0x01C0, 0x10, -1.0f, 0, + 0x01C1, 0x00, -1.0f, 0, + 0x01C1, 0x11, -1.0f, 0, + 0x01C5, 0x00, -1.0f, 0, + 0x021D, 0x00, -1.0f, 0, + 0x021E, 0x00, -1.0f, 0, + 0x021B, 0x00, -1.0f, 0, + 0x01C4, 0x00, -1.0f, 0, +}; + /* 804BC3E0-804BC5C4 000240 01E4+00 1/1 0/0 0/0 .text modelCallBack__9daMidna_cFi */ -void daMidna_c::modelCallBack(int param_0) { - // NONMATCHING +int daMidna_c::modelCallBack(int i_jointNo) { + mDoMtx_stack_c::copy(J3DSys::mCurrentMtx); + if ((i_jointNo == JNT_BACKBONE1 || i_jointNo == JNT_WAIST) && mDemoMode == 0x200) { + mDoMtx_stack_c::get()[0][3] = current.pos.x; + mDoMtx_stack_c::get()[2][3] = current.pos.z; + } + if (i_jointNo == JNT_HEAD) { + mDoMtx_stack_c::YrotM(-mNeckAngle.y); + mDoMtx_stack_c::ZrotM(mNeckAngle.x); + } else if (i_jointNo == JNT_BACKBONE1 || i_jointNo == JNT_BACKBONE2) { + mDoMtx_stack_c::ZrotM(mBackboneAngleZ); + } else { + int hair_joint_no = i_jointNo - JNT_HAIR_1; + if (checkStateFlg0(FLG0_UNK_10000000)) { + if (i_jointNo != JNT_HAIR_1) { + mDoMtx_stack_c::YrotM(-mHairAngleY[hair_joint_no - 1]); + mDoMtx_stack_c::ZrotM(-mHairAngleZ[hair_joint_no - 1]); + } else { + mDoMtx_stack_c::transS(J3DSys::mCurrentMtx[0][3], J3DSys::mCurrentMtx[1][3], + J3DSys::mCurrentMtx[2][3]); + mDoMtx_stack_c::YrotM(shape_angle.y + 0x4000); + mDoMtx_stack_c::XrotM(0x8000); + mDoMtx_stack_c::scaleM(daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale, + daMidna_hio_c0::m.mScale); + } + mDoMtx_stack_c::XYZrotM(0, mHairAngleY[hair_joint_no], mHairAngleZ[hair_joint_no]); + } + } + mpShadowModel->setAnmMtx(i_jointNo, mDoMtx_stack_c::get()); + PSMTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + return 1; } /* 804BC5C4-804BC614 000424 0050+00 1/1 0/0 0/0 .text changeUpperBck__9daMidna_cFv */ -void daMidna_c::changeUpperBck() { - // NONMATCHING +int daMidna_c::changeUpperBck() { + J3DAnmTransform* anm = mUpperBck.getBckAnm(); + mUpperBck.changeBckOnly(mpMorf->getAnm()); + mpMorf->changeAnm(anm); + return 1; } /* 804BC614-804BC670 000474 005C+00 1/1 0/0 0/0 .text changeFaceBck__9daMidna_cFv */ -void daMidna_c::changeFaceBck() { - // NONMATCHING +int daMidna_c::changeFaceBck() { + if (checkStateFlg0(FLG0_UNK_800000)) { + J3DAnmTransform* anm = mFaceBck.getBckAnm(); + mFaceBck.changeBckOnly(mpMorf->getAnm()); + mpMorf->changeAnm(anm); + } + return 1; } /* 804BC670-804BC6FC 0004D0 008C+00 1/1 0/0 0/0 .text baseModelCallBack__9daMidna_cFi */ -void daMidna_c::baseModelCallBack(int param_0) { - // NONMATCHING +int daMidna_c::baseModelCallBack(int i_jointNo) { + if (i_jointNo == field_0x87e) { + changeFaceBck(); + } + if (i_jointNo == JNT_WORLD_ROOT || i_jointNo == JNT_HAND_R) { + changeUpperBck(); + } else if (i_jointNo == JNT_MOUTH) { + changeFaceBck(); + } else if (i_jointNo != JNT_CHIN) { + modelCallBack(i_jointNo); + } + return 1; } /* 804BC6FC-804BC740 00055C 0044+00 1/1 0/0 0/0 .text daMidna_modelCallBack__FP8J3DJointi */ -static void daMidna_modelCallBack(J3DJoint* param_0, int param_1) { - // NONMATCHING +static int daMidna_modelCallBack(J3DJoint* i_joint, int param_2) { + int jnt_no = i_joint->getJntNo(); + daMidna_c* _this = (daMidna_c*)j3dSys.getModel()->getUserArea(); + if (param_2 == 0) { + _this->baseModelCallBack(jnt_no); + } + return 1; } /* 804BC740-804BC7D4 0005A0 0094+00 1/1 0/0 0/0 .text * initInvModel__9daMidna_cFUsPP8J3DModelP21mDoExt_invisibleModelUl */ -void daMidna_c::initInvModel(u16 param_0, J3DModel** param_1, mDoExt_invisibleModel* param_2, - u32 param_3) { - // NONMATCHING +int daMidna_c::initInvModel(u16 i_resNo, J3DModel** i_modelP, mDoExt_invisibleModel* i_invModel, + u32 flag) { + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, i_resNo); + *i_modelP = mDoExt_J3DModel__create(model_data, 0, flag); + if (*i_modelP == NULL) { + return 0; + } + if (!i_invModel->create(*i_modelP, 1)) { + return 0; + } + return 1; } /* 804BC7D4-804BC868 000634 0094+00 1/1 0/0 0/0 .text initDemoModel__9daMidna_cFPP8J3DModelPCcUl */ -void daMidna_c::initDemoModel(J3DModel** param_0, char const* param_1, u32 param_2) { - // NONMATCHING +int daMidna_c::initDemoModel(J3DModel** i_modelP, char const* i_bmdName, u32 flag) { + *i_modelP = NULL; + J3DModelData* model_data = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), i_bmdName); + if (model_data != NULL) { + *i_modelP = mDoExt_J3DModel__create(model_data, 0x80000, flag | 0x11000084); + if (*i_modelP == NULL) { + return 0; + } + } + return 1; } -/* ############################################################################################## */ -/* 804C6A60-804C6A60 000598 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_804C6A60 = "demo00_Midna_cut00_HL_tmp.bmd"; -SECTION_DEAD static char const* const stringBase_804C6A7E = "demo00_Midna_cut00_HL_tmp.bck"; -SECTION_DEAD static char const* const stringBase_804C6A9C = "demo00_Midna_cut00_HR_tmp.bmd"; -SECTION_DEAD static char const* const stringBase_804C6ABA = "demo00_Midna_cut00_HR_tmp.bck"; -SECTION_DEAD static char const* const stringBase_804C6AD8 = "demo00_Midna_cut00_HD_tmp.bmd"; -SECTION_DEAD static char const* const stringBase_804C6AF6 = "demo00_Midna_cut00_HD_tmp.bck"; -SECTION_DEAD static char const* const stringBase_804C6B14 = "demo00_Midna_cut00_FC_blend.bmd"; -SECTION_DEAD static char const* const stringBase_804C6B34 = "demo00_Midna_cut00_FC_tongue.bmd"; -SECTION_DEAD static char const* const stringBase_804C6B55 = "demo00_Midna_cut00_FC_tmp.bck"; -SECTION_DEAD static char const* const stringBase_804C6B73 = "demo00_Midna_cut00_BD_tmp.bmd"; -SECTION_DEAD static char const* const stringBase_804C6B91 = "demo00_Midna_cut00_BD_mask.bmd"; -SECTION_DEAD static char const* const stringBase_804C6BB0 = "demo00_Midna_cut00_BD_hands.bmd"; -SECTION_DEAD static char const* const stringBase_804C6BD0 = "demo00_Midna_cut00_BD_hairhand.bmd"; -SECTION_DEAD static char const* const stringBase_804C6BF3 = "demo00_Midna_cut00_FC_tmp.bls"; -#pragma pop - -/* 804C6C34-804C6C40 -00001 000C+00 1/1 0/0 0/0 .data @4662 */ -SECTION_DATA static void* lit_4662[3] = { - (void*)NULL, - (void*)0xFFFFFFFF, - (void*)checkMetamorphoseEnableBase__9daMidna_cFv, -}; - -/* 804C6C40-804C6C60 -00001 0020+00 1/0 0/0 0/0 .data l_daMidna_Method */ -static actor_method_class l_daMidna_Method = { - (process_method_func)daMidna_Create__FP10fopAc_ac_c, - (process_method_func)daMidna_Delete__FP9daMidna_c, - (process_method_func)daMidna_Execute__FP9daMidna_c, - 0, - (process_method_func)daMidna_Draw__FP9daMidna_c, -}; - -/* 804C6C60-804C6C90 -00001 0030+00 0/0 0/0 1/0 .data g_profile_MIDNA */ -extern actor_process_profile_definition g_profile_MIDNA = { - fpcLy_CURRENT_e, // mLayerID - 6, // mListID - fpcPi_CURRENT_e, // mListPrio - PROC_MIDNA, // mProcName - &g_fpcLf_Method.mBase, // sub_method - sizeof(daMidna_c), // mSize - 0, // mSizeOther - 0, // mParameters - &g_fopAc_Method.base, // sub_method - 92, // mPriority - &l_daMidna_Method, // sub_method - 0x00060000, // mStatus - fopAc_ENV_e, // mActorType - fopAc_CULLBOX_0_e, // cullType -}; - -/* 804C6C90-804C6C9C 00005C 000C+00 1/1 0/0 0/0 .data __vt__25mDoExt_McaMorfCallBack1_c - */ -SECTION_DATA extern void* __vt__25mDoExt_McaMorfCallBack1_c[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)NULL, -}; - -/* 804C6C9C-804C6CA8 000068 000C+00 2/2 0/0 0/0 .data __vt__11J3DTexNoAnm */ -SECTION_DATA extern void* __vt__11J3DTexNoAnm[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)calc__11J3DTexNoAnmCFPUs, -}; - -/* 804C6CA8-804C6CB4 000074 000C+00 4/4 0/0 0/0 .data __vt__12J3DFrameCtrl */ -SECTION_DATA extern void* __vt__12J3DFrameCtrl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12J3DFrameCtrlFv, -}; - -/* 804C6CB4-804C6CC4 000080 0010+00 3/3 0/0 0/0 .data __vt__20daMidna_McaMorfCB1_c */ -SECTION_DATA extern void* __vt__20daMidna_McaMorfCB1_c[4] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)execute__20daMidna_McaMorfCB1_cFUsP16J3DTransformInfo, - (void*)__dt__20daMidna_McaMorfCB1_cFv, -}; - -/* 804C6CC4-804C6CD4 000090 0010+00 2/2 0/0 0/0 .data __vt__16daMidna_matAnm_c */ -SECTION_DATA extern void* __vt__16daMidna_matAnm_c[4] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__16daMidna_matAnm_cFv, - (void*)calc__16daMidna_matAnm_cCFP11J3DMaterial, -}; - /* 804BC868-804BD050 0006C8 07E8+00 1/1 0/0 0/0 .text createHeap__9daMidna_cFv */ -void daMidna_c::createHeap() { - // NONMATCHING -} - -/* 804BD050-804BD098 000EB0 0048+00 1/0 0/0 0/0 .text __dt__12J3DFrameCtrlFv */ -// J3DFrameCtrl::~J3DFrameCtrl() { -extern "C" void __dt__12J3DFrameCtrlFv() { - // NONMATCHING -} - -/* 804BD098-804BD0D4 000EF8 003C+00 2/2 0/0 0/0 .text __dt__15J3DTevKColorAnmFv */ -// J3DTevKColorAnm::~J3DTevKColorAnm() { -extern "C" void __dt__15J3DTevKColorAnmFv() { - // NONMATCHING -} - -/* 804BD0D4-804BD0EC 000F34 0018+00 1/1 0/0 0/0 .text __ct__15J3DTevKColorAnmFv */ -// J3DTevKColorAnm::J3DTevKColorAnm() { -extern "C" void __ct__15J3DTevKColorAnmFv() { - // NONMATCHING -} - -/* 804BD0EC-804BD128 000F4C 003C+00 2/2 0/0 0/0 .text __dt__14J3DTevColorAnmFv */ -// J3DTevColorAnm::~J3DTevColorAnm() { -extern "C" void __dt__14J3DTevColorAnmFv() { - // NONMATCHING -} - -/* 804BD128-804BD140 000F88 0018+00 1/1 0/0 0/0 .text __ct__14J3DTevColorAnmFv */ -// J3DTevColorAnm::J3DTevColorAnm() { -extern "C" void __ct__14J3DTevColorAnmFv() { - // NONMATCHING -} - -/* 804BD140-804BD188 000FA0 0048+00 2/2 0/0 0/0 .text __dt__11J3DTexNoAnmFv */ -// J3DTexNoAnm::~J3DTexNoAnm() { -extern "C" void __dt__11J3DTexNoAnmFv() { - // NONMATCHING -} - -/* 804BD188-804BD1AC 000FE8 0024+00 1/1 0/0 0/0 .text __ct__11J3DTexNoAnmFv */ -// J3DTexNoAnm::J3DTexNoAnm() { -extern "C" void __ct__11J3DTexNoAnmFv() { - // NONMATCHING -} - -/* 804BD1AC-804BD1E8 00100C 003C+00 2/2 0/0 0/0 .text __dt__12J3DTexMtxAnmFv */ -// J3DTexMtxAnm::~J3DTexMtxAnm() { -extern "C" void __dt__12J3DTexMtxAnmFv() { - // NONMATCHING -} - -/* 804BD1E8-804BD200 001048 0018+00 1/1 0/0 0/0 .text __ct__12J3DTexMtxAnmFv */ -// J3DTexMtxAnm::J3DTexMtxAnm() { -extern "C" void __ct__12J3DTexMtxAnmFv() { - // NONMATCHING -} - -/* 804BD200-804BD23C 001060 003C+00 2/2 0/0 0/0 .text __dt__14J3DMatColorAnmFv */ -// J3DMatColorAnm::~J3DMatColorAnm() { -extern "C" void __dt__14J3DMatColorAnmFv() { - // NONMATCHING -} - -/* 804BD23C-804BD254 00109C 0018+00 1/1 0/0 0/0 .text __ct__14J3DMatColorAnmFv */ -// J3DMatColorAnm::J3DMatColorAnm() { -extern "C" void __ct__14J3DMatColorAnmFv() { - // NONMATCHING +int daMidna_c::createHeap() { + for (int i = 0; i < 3; i++) { + if (i == 2) { + mBckHeap[i].setBufferSize(0x1000); + } else { + mBckHeap[i].setBufferSize(0x3800); + } + if (!mBckHeap[i].mallocBuffer()) { + return 0; + } + } + for (int i = 0; i < 2; i++) { + mpEyeMatAnm[i] = new daMidna_matAnm_c(); + if (mpEyeMatAnm[i] == NULL) { + return 0; + } + } + if (dStage_roomControl_c::getDemoArcName()[0] != '\0') { + if (!initDemoModel(&mpDemoHLTmpBmd, "demo00_Midna_cut00_HL_tmp.bmd", 0)) { + return 0; + } + if (mpDemoHLTmpBmd != NULL && !daAlink_c::initDemoBck(&mpDemoHLTmpBck, + "demo00_Midna_cut00_HL_tmp.bck")) { + return 0; + } + if (!initDemoModel(&mpDemoHRTmpBmd, "demo00_Midna_cut00_HR_tmp.bmd", 0)) { + return 0; + } + if (mpDemoHRTmpBmd != NULL && !daAlink_c::initDemoBck(&mpDemoHRTmpBck, + "demo00_Midna_cut00_HR_tmp.bck")) { + return 0; + } + J3DModelData* hd_bmd = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), + "demo00_Midna_cut00_HD_tmp.bmd"); + if (hd_bmd != NULL) { + mpDemoHDTmpBmd = mDoExt_J3DModel__create(hd_bmd, 0, 0x11000084); + if (mpDemoHDTmpBmd == NULL) { + return 0; + } + if (!daAlink_c::initDemoBck(&mpDemoHDTmpBck, "demo00_Midna_cut00_HD_tmp.bck")) { + return 0; + } + } + if (!initDemoModel(&mpDemoFCBlendBmd, "demo00_Midna_cut00_FC_blend.bmd", 0x1000000)) { + return 0; + } + if (!initDemoModel(&mpDemoFCTongueBmd, "demo00_Midna_cut00_FC_tongue.bmd", 0x200)) { + return 0; + } + if (mpDemoFCTongueBmd != NULL && !daAlink_c::initDemoBck(&mpDemoFCTmpBck, + "demo00_Midna_cut00_FC_tmp.bck")) { + return 0; + } + J3DModelData* bd_bmd = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), + "demo00_Midna_cut00_BD_tmp.bmd"); + if (bd_bmd != NULL) { + mpDemoBDTmpBmd = mDoExt_J3DModel__create(bd_bmd, 0, 0x11020284); + if (mpDemoBDTmpBmd == NULL) { + return 0; + } + bd_bmd->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]); + bd_bmd->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]); + } + if (!initDemoModel(&mpDemoBDMaskBmd, "demo00_Midna_cut00_BD_mask.bmd", 0)) { + return 0; + } + if (!initDemoModel(&mpDemoBDHandsBmd, "demo00_Midna_cut00_BD_hands.bmd", 0)) { + return 0; + } + if (mpDemoBDHandsBmd != NULL) { + J3DModelData* hands_bmd = mpDemoBDHandsBmd->getModelData(); + for (u16 i = 0; i < 4; i++) { + hands_bmd->getMaterialNodePointer(i)->getShape()->hide(); + } + } + J3DModelData* hairhand_bmd = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), + "demo00_Midna_cut00_BD_hairhand.bmd"); + if (hairhand_bmd != NULL) { + mpDemoBDHairhandBmd = mDoExt_J3DModel__create(hairhand_bmd, 0, 0x11000084); + if (mpDemoBDHairhandBmd == NULL) { + return 0; + } + } + } + JKRReadIdxResource(mBckHeap[0].getBuffer(), mBckHeap[0].getBufferSize(), + 0x1DC, dComIfGp_getAnmArchive()); + J3DAnmTransform* md_anm = + (J3DAnmTransform*)J3DAnmLoaderDataBase::load(mBckHeap[0].getBuffer(), + J3DLOADER_UNK_FLAG0); + J3DModelData* md_bmd = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 14); + mpMorf = new mDoExt_McaMorfSO(md_bmd, &mMorfCB, NULL, md_anm, + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, NULL, 0, 0x11000284); + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return 0; + } + mMorfCB.setScale(mHairScale); + if (!mInvModel.create(mpMorf->getModel(), 1)) { + return 0; + } + if (!mUpperBck.init(mpMorf->getAnm(), TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false)) { + return 0; + } + if (!mFaceBck.init(mpMorf->getAnm(), TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false)) { + return 0; + } + if (!mBtpHeap.mallocBuffer()) { + return 0; + } + if (!mBtkHeap.mallocBuffer()) { + return 0; + } + if (!initInvModel(8, &mpShadowMaskBmd, &mMaskInvModel, 0x11000284)) { + return 0; + } + if (!initInvModel(7, &mpShadowHandsBmd, &mHandsInvModel, 0x11000284)) { + return 0; + } + if (!initInvModel(15, &mpShadowHairhandBmd, &mHairhandInvModel, 0x11000284)) { + return 0; + } + J3DModelData* gokou_bmd = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 11); + mpGokouBmd = mDoExt_J3DModel__create(gokou_bmd, 0x80000, 0x11000084); + if (mpGokouBmd == NULL) { + return 0; + } + mpHIO = new daMidna_hio_c0(); + if (mpHIO == NULL) { + return 0; + } + if (mpDemoFCBlendBmd != NULL) { + mpDemoFCTmpBlk = new mDoExt_blkAnm(); + if (mpDemoFCTmpBlk == NULL) { + return 0; + } + mpDemoFCTmpBls = + (J3DDeformData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), + "demo00_Midna_cut00_FC_tmp.bls"); + if (mpDemoFCTmpBls != NULL && mpDemoFCBlendBmd->setDeformData(mpDemoFCTmpBls, 1)) { + return 0; + } + } + return 1; } /* 804BD254-804BD274 0010B4 0020+00 1/1 0/0 0/0 .text daMidna_createHeap__FP10fopAc_ac_c */ -static void daMidna_createHeap(fopAc_ac_c* param_0) { - // NONMATCHING +static int daMidna_createHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } -/* ############################################################################################## */ -/* 804C6590-804C65E4 0000C8 0054+00 0/1 0/0 0/0 .rodata m_texDataTable__9daMidna_c */ -#pragma push -#pragma force_active on -SECTION_RODATA u8 const daMidna_c::m_texDataTable[84] = { - 0x04, 0x05, 0x03, 0xA4, 0x03, 0xF5, 0x03, 0x99, 0x03, 0xF6, 0x03, 0x99, 0x04, 0x07, - 0x03, 0x99, 0x04, 0x06, 0x03, 0xA5, 0x04, 0x05, 0x03, 0xA0, 0x03, 0xFA, 0x03, 0x99, - 0x04, 0x01, 0x03, 0x9E, 0x03, 0xF7, 0x03, 0x9F, 0x04, 0x03, 0x03, 0xA2, 0x04, 0x04, - 0x03, 0xA3, 0x03, 0xF7, 0x03, 0xA1, 0x03, 0xFC, 0x03, 0x9A, 0x04, 0x02, 0x03, 0x99, - 0x03, 0xFE, 0x03, 0x9B, 0x03, 0xFF, 0x03, 0x9C, 0x03, 0xF8, 0x03, 0x99, 0x03, 0xF9, - 0x03, 0x99, 0x04, 0x00, 0x03, 0x9D, 0x03, 0xFB, 0x03, 0x99, 0x03, 0xFD, 0x03, 0x99, -}; -COMPILER_STRIP_GATE(0x804C6590, &daMidna_c::m_texDataTable); -#pragma pop - -/* 804C65E4-804C6860 00011C 027C+00 3/12 0/0 0/0 .rodata m_anmDataTable__9daMidna_c */ -SECTION_RODATA u8 const daMidna_c::m_anmDataTable[636] = { - 0x01, 0xDC, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB7, 0x00, 0x01, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB8, 0x00, 0x02, 0xBF, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xDD, 0x00, 0x03, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xD3, 0x00, 0x04, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x01, 0xEC, 0x01, 0xDB, 0x00, 0x00, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC8, 0x00, 0x05, 0x3F, 0x80, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xE9, 0x01, 0xC7, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xCB, 0x00, 0x10, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCA, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0xF8, 0x01, 0xC9, 0x00, 0x00, 0x3D, 0xCC, 0xCC, 0xCD, - 0x00, 0x05, 0x01, 0xF7, 0x01, 0xBA, 0x00, 0x06, 0x40, 0x40, 0x00, 0x00, 0x00, 0x05, 0x01, 0xEB, - 0x01, 0xD8, 0x00, 0x07, 0x40, 0x40, 0x00, 0x00, 0x00, 0x05, 0x01, 0xF2, 0x01, 0xD9, 0x00, 0x08, - 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x01, 0xF5, 0x01, 0xE1, 0x00, 0x09, 0x3F, 0x80, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xF9, 0x01, 0xE2, 0x00, 0x0A, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x01, 0xEF, - 0x02, 0x17, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x19, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xE0, 0x00, 0x0B, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0x00, 0x10, - 0x40, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x01, 0xFF, 0x01, 0xBE, 0x00, 0x0C, 0x3F, 0x80, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xFA, 0x01, 0xDA, 0x00, 0x0D, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x01, 0xF6, - 0x01, 0xC6, 0x00, 0x0E, 0x41, 0x20, 0x00, 0x00, 0x00, 0x05, 0x01, 0xED, 0x01, 0xCC, 0x00, 0x0F, - 0x41, 0x30, 0x00, 0x00, 0x00, 0x05, 0x01, 0xEE, 0x01, 0xD7, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xF1, 0x02, 0x1A, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xD4, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDE, 0x00, 0x11, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB9, 0x00, 0x11, 0xBF, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xD6, 0x00, 0x00, 0x41, 0xD8, 0x00, 0x00, 0x00, 0x05, 0x01, 0xFC, - 0x01, 0xD5, 0x00, 0x00, 0x42, 0x40, 0x00, 0x00, 0x00, 0x05, 0x01, 0xFE, 0x01, 0xBB, 0x00, 0x00, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBC, 0x00, 0x00, 0x41, 0x88, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xFB, 0x01, 0xBD, 0x00, 0x00, 0x41, 0xA0, 0x00, 0x00, 0x00, 0x05, 0x01, 0xFB, - 0x01, 0xC2, 0x00, 0x13, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC3, 0x00, 0x14, - 0x3D, 0xCC, 0xCC, 0xCD, 0x00, 0x05, 0x00, 0x74, 0x01, 0xCE, 0x00, 0x10, 0x3F, 0x80, 0x00, 0x00, - 0x00, 0x05, 0x02, 0x00, 0x01, 0xCD, 0x00, 0x10, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xD0, 0x00, 0x10, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x01, 0xEA, 0x01, 0xCF, 0x00, 0x10, - 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0x01, 0xD2, 0x00, 0x10, 0x3F, 0x80, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xEA, 0x01, 0xD1, 0x00, 0x10, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, - 0x01, 0xBF, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x10, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xC1, 0x00, 0x11, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xC5, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1D, 0x00, 0x00, - 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1E, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x1B, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xC4, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C65E4, &daMidna_c::m_anmDataTable); - -/* 804C6860-804C6864 000398 0004+00 1/5 0/0 0/0 .rodata @4838 */ -SECTION_RODATA static f32 const lit_4838 = -1.0f; -COMPILER_STRIP_GATE(0x804C6860, &lit_4838); - /* 804BD274-804BD8B8 0010D4 0644+00 1/1 0/0 0/0 .text create__9daMidna_cFv */ -void daMidna_c::create() { - // NONMATCHING -} +cPhs__Step daMidna_c::create() { + fopAcM_SetupActor(this, daMidna_c); + cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase, l_arcName); -/* 804BD8B8-804BD8F4 001718 003C+00 2/2 0/0 0/0 .text __dt__4cXyzFv */ -// cXyz::~cXyz() { -extern "C" void __dt__4cXyzFv() { - // NONMATCHING -} + if (step == cPhs_COMPLEATE_e) { + if (dStage_roomControl_c::getDemoArcName()[0] != '\0' && + dComIfG_syncObjectRes(dStage_roomControl_c::getDemoArcName()) > 0) { + return cPhs_INIT_e; + } -/* 804BD8F4-804BD8F8 001754 0004+00 1/1 0/0 0/0 .text __ct__4cXyzFv */ -// cXyz::cXyz() { -extern "C" void __ct__4cXyzFv() { - /* empty function */ -} + u32 heap_size = 0x15b60; + if (dStage_roomControl_c::getDemoArcName()[0] != '\0') { + heap_size = 0x4d740; + heap_size |= 0x80000000; + } -/* 804BD8F8-804BD91C 001758 0024+00 1/1 0/0 0/0 .text __defctor__14daPy_anmHeap_cFv */ -void daPy_anmHeap_c::__defctor() { - // NONMATCHING + if (!fopAcM_entrySolidHeap(this, daMidna_createHeap, heap_size)) { + return cPhs_ERROR_e; + } + + mpFunc = &checkMetamorphoseEnableBase; + + for (u16 i = 0; i < 3; i++) { + mBckHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + } + mBtpHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_1); + mBtkHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_2); + + mSound.init(¤t.pos, &eyePos, 3, 1); + mpShadowModel = mpMorf->getModel(); + mpShadowModel->setUserArea((u32)this); + J3DModelData* model_data = mpShadowModel->getModelData(); + + model_data->getJointNodePointer(JNT_WORLD_ROOT)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_HAND_R)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_HEAD)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_BACKBONE1)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_BACKBONE2)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_MOUTH)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_CHIN)->setCallBack(&daMidna_modelCallBack); + model_data->getJointNodePointer(JNT_WAIST)->setCallBack(&daMidna_modelCallBack); + for (u16 i = JNT_HAIR_1; i < JNT_HAIR_5 + 1; i++) { + model_data->getJointNodePointer(i)->setCallBack(&daMidna_modelCallBack); + } + + mpShadowLeftHandShape = model_data->getMaterialNodePointer(1)->getShape(); + mpShadowRightHandShape = model_data->getMaterialNodePointer(2)->getShape(); + + mpMoyaBtk = setSimpleBtk(model_data, 27); + mpAppearBrk = setSimpleBrk(model_data, 18); + model_data = mpShadowMaskBmd->getModelData(); + mpMaskMoyaBtk = setSimpleBtk(model_data, 26); + mpMaskAppearBrk = setSimpleBrk(model_data, 21); + model_data = mpShadowHandsBmd->getModelData(); + mpHandsMoyaBtk = setSimpleBtk(model_data, 25); + for (u16 i = 0; i < 4; i++) { + model_data->getMaterialNodePointer(i)->getShape()->hide(); + } + model_data = mpShadowHairhandBmd->getModelData(); + mpHairhandMoyaBtk = setSimpleBtk(model_data, 24); + mpHairhandAppearBrk = setSimpleBrk(model_data, 20); + model_data = mpGokouBmd->getModelData(); + mpGokouAppearBrk = setSimpleBrk(model_data, 19); + mpGokouAppearBrk->setFrame(0.0f); + + fopAcM_setStageLayer(this); + fopAcM_SetMtx(this, mpShadowModel->getBaseTRMtx()); + mVoiceFrame = -1.0f; + setMatrix(); + setRoomInfo(); + daPy_py_c::setMidnaActor(this); + mpMorf->setMorf(1.0f); + + if (fopAcM_GetParam(this) == 1 && checkMidnaRealBody() && !i_checkMidnaTired()) { + changeOriginalDemo(); + changeDemoMode(11); + } + + setHairAngle(); + offStateFlg0(FLG0_UNK_8); + setAnm(); + mpMorf->setMorf(0.0f); + allAnimePlay(); + mpMorf->modelCalc(); + setBodyPartMatrix(); + + field_0x6e0.r = l_normalColor.r; + field_0x6e0.g = l_normalColor.g; + field_0x6e0.b = l_normalColor.b; + field_0x6e0.a = l_normalColor.a; + if (dKy_darkworld_check()) { + field_0x6e8.r = l_normalKColor.r; + field_0x6e8.g = l_normalKColor.g; + field_0x6e8.b = l_normalKColor.b; + field_0x6e8.a = l_normalKColor.a; + field_0x6ec.r = l_normalKColor2.r; + field_0x6ec.g = l_normalKColor2.g; + field_0x6ec.b = l_normalKColor2.b; + field_0x6ec.a = l_normalKColor2.a; + } else { + field_0x6e8.r = l_lNormalKColor.r; + field_0x6e8.g = l_lNormalKColor.g; + field_0x6e8.b = l_lNormalKColor.b; + field_0x6e8.a = l_lNormalKColor.a; + field_0x6ec.r = l_lNormalKColor2.r; + field_0x6ec.g = l_lNormalKColor2.g; + field_0x6ec.b = l_lNormalKColor2.b; + field_0x6ec.a = l_lNormalKColor2.a; + } + + model = mpShadowModel; + setMidnaNoDrawFlg(); + } + + return step; } /* 804BD91C-804BD93C 00177C 0020+00 1/0 0/0 0/0 .text daMidna_Create__FP10fopAc_ac_c */ -static void daMidna_Create(fopAc_ac_c* param_0) { - // NONMATCHING +static cPhs__Step daMidna_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->create(); } -/* ############################################################################################## */ -/* 804C6864-804C6868 00039C 0004+00 0/1 0/0 0/0 .rodata @5078 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_5078 = 0x3C449BA6; -COMPILER_STRIP_GATE(0x804C6864, &lit_5078); -#pragma pop - -/* 804C6868-804C686C 0003A0 0004+00 1/2 0/0 0/0 .rodata @5079 */ -SECTION_RODATA static u32 const lit_5079 = 0x3A83126F; -COMPILER_STRIP_GATE(0x804C6868, &lit_5079); - -/* 804C686C-804C6870 0003A4 0004+00 0/6 0/0 0/0 .rodata @5080 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5080 = 2.0f; -COMPILER_STRIP_GATE(0x804C686C, &lit_5080); -#pragma pop - /* 804BD93C-804BDE04 00179C 04C8+00 2/2 0/0 0/0 .text allAnimePlay__9daMidna_cFv */ void daMidna_c::allAnimePlay() { - // NONMATCHING + daAlink_c::simpleAnmPlay(mpMoyaBtk); + daAlink_c::simpleAnmPlay(mpHandsMoyaBtk); + daAlink_c::simpleAnmPlay(mpMaskMoyaBtk); + daAlink_c::simpleAnmPlay(mpHairhandMoyaBtk); + daAlink_c::simpleAnmPlay(field_0x668); + daAlink_c::simpleAnmPlay(mpDemoFCBlendBrk); + + mUpperBck.play(); + if (mDemoMode == 0xc) { + mUpperBck.setFrame(0.0f); + } + mUpperBck.getBckAnm()->setFrame(mUpperBck.getFrame()); + + if (checkStateFlg0(FLG0_UNK_800000)) { + if (dMsgObject_c::isMouthCheck()) { + mFaceBckTimer = 20; + } else { + if (mFaceBckTimer != 0) { + mFaceBckTimer--; + } + } + if (mFaceBckTimer == 0 && mFaceBck.checkFrame(0.0f)) { + mFaceBck.setFrame(0.0f); + mFaceBck.getBckAnm()->setFrame(0.0f); + } else { + mFaceBck.play(); + mFaceBck.getBckAnm()->setFrame(mFaceBck.getFrame()); + } + } + + if (mpModel != NULL && mpFaceBtp != NULL && mpFaceBtk != NULL) { + s16 uvar6, uvar7; + if (checkStateFlg0(FLG0_UNK_40)) { + if (field_0x84a != 0) { + field_0x84a++; + if (field_0x84a > mpFaceBtp->getFrameMax()) { + field_0x84a = 0; + } + } else { + if (cM_rnd() < 0.012f) { + field_0x84a++; + } + } + uvar7 = uvar6 = field_0x84a; + } else if (checkStateFlg0(FLG0_UNK_800000)) { + uvar7 = uvar6 = mFaceBck.getFrame(); + } else { + uvar7 = uvar6 = mUpperBck.getFrame(); + } + if (uvar6 > mpFaceBtp->getFrameMax()) { + uvar6 = mpFaceBtp->getFrameMax(); + } + if (uvar7 > mpFaceBtk->getFrameMax()) { + uvar7 = mpFaceBtk->getFrameMax(); + } + mpFaceBtp->setFrame(uvar6); + mpFaceBtk->setFrame(uvar7); + } + + mpMorf->play(0, mReverb); + if (mDemoMode == 0xc) { + mpMorf->setFrame(0.0f); + } + + if (checkSetAnime(0, ANM_S_APPEAR) || checkSetAnime(0, ANM_S_APPEARBL)) { + mpAppearBrk->setFrame(mpMorf->getFrame()); + mpMaskAppearBrk->setFrame(mpMorf->getFrame()); + mpHairhandAppearBrk->setFrame(mpMorf->getFrame()); + mpGokouAppearBrk->setFrame(mpMorf->getFrame()); + } else if (field_0x84e == 1 || field_0x84e == 2) { + mpAppearBrk->setFrame(0.0f); + mpMaskAppearBrk->setFrame(0.0f); + mpHairhandAppearBrk->setFrame(0.0f); + mpGokouAppearBrk->setFrame(0.0f); + } else { + mpAppearBrk->setFrame(mpAppearBrk->getFrameMax() - 0.001f); + mpMaskAppearBrk->setFrame(mpMaskAppearBrk->getFrameMax() - 0.001f); + mpHairhandAppearBrk->setFrame(mpHairhandAppearBrk->getFrameMax() - 0.001f); + if (checkSetAnime(0, ANM_S_RETURN)) { + mpGokouAppearBrk->setFrame(mpMorf->getEndFrame() - mpMorf->getFrame()); + } else if (checkSetAnime(0, ANM_RETURN)) { + f32 fvar8 = mpGokouAppearBrk->getFrame() - 2.0f; + if (fvar8 < 0.0f) { + fvar8 = 0.0f; + } + mpGokouAppearBrk->setFrame(fvar8); + } else { + mpGokouAppearBrk->setFrame(mpGokouAppearBrk->getFrameMax() - 0.001f); + } + } + + if (mLeftHandShapeIdx == 0xfd && mpDemoHLTmpBck != NULL) { + mpDemoHLTmpBck->play(); + } + if (mRightHandShapeIdx == 0xfd && mpDemoHRTmpBck != NULL) { + mpDemoHRTmpBck->play(); + } + if (checkStateFlg1(FLG1_UNK_10) && mpDemoHDTmpBck != NULL) { + mpDemoHDTmpBck->play(); + } + if (checkStateFlg0(FLG0_UNK_10)) { + if (mpDemoFCTmpBlk != NULL && mpDemoFCTmpBlk->getBlkAnm() != NULL) { + daAlink_c::simpleAnmPlay(mpDemoFCTmpBlk->getBlkAnm()); + } + if (mpDemoFCTongueBtk != NULL) { + daAlink_c::simpleAnmPlay(mpDemoFCTongueBtk); + } + if (mpDemoFCTmpBck != NULL) { + mpDemoFCTmpBck->play(); + } + } } -/* ############################################################################################## */ -/* 804C6870-804C687C 0003A8 000C+00 0/1 0/0 0/0 .rodata @5087 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_5087[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6870, &lit_5087); -#pragma pop - -/* 804C687C-804C6888 0003B4 000C+00 0/1 0/0 0/0 .rodata @5088 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_5088[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C687C, &lit_5088); -#pragma pop - -/* 804C6888-804C6894 0003C0 000C+00 0/1 0/0 0/0 .rodata @5093 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_5093[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6888, &lit_5093); -#pragma pop - -/* 804C6894-804C6898 0003CC 0004+00 0/1 0/0 0/0 .rodata @5309 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5309 = -98.0f; -COMPILER_STRIP_GATE(0x804C6894, &lit_5309); -#pragma pop - -/* 804C6898-804C689C 0003D0 0004+00 0/2 0/0 0/0 .rodata @5310 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5310 = 17.0f; -COMPILER_STRIP_GATE(0x804C6898, &lit_5310); -#pragma pop - -/* 804C689C-804C68A0 0003D4 0004+00 0/1 0/0 0/0 .rodata @5311 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5311 = -30.0f; -COMPILER_STRIP_GATE(0x804C689C, &lit_5311); -#pragma pop - -/* 804C68A0-804C68A4 0003D8 0004+00 0/1 0/0 0/0 .rodata @5312 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5312 = 65.0f; -COMPILER_STRIP_GATE(0x804C68A0, &lit_5312); -#pragma pop - -/* 804C68A4-804C68A8 0003DC 0004+00 0/2 0/0 0/0 .rodata @5313 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5313 = 90.0f; -COMPILER_STRIP_GATE(0x804C68A4, &lit_5313); -#pragma pop - -/* 804C68A8-804C68AC 0003E0 0004+00 0/1 0/0 0/0 .rodata @5314 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5314 = 80.0f; -COMPILER_STRIP_GATE(0x804C68A8, &lit_5314); -#pragma pop - -/* 804C68AC-804C68B0 0003E4 0004+00 0/3 0/0 0/0 .rodata @5315 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5315 = 100.0f; -COMPILER_STRIP_GATE(0x804C68AC, &lit_5315); -#pragma pop - -/* 804C68B0-804C68B4 0003E8 0004+00 0/1 0/0 0/0 .rodata @5316 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5316 = 150.0f; -COMPILER_STRIP_GATE(0x804C68B0, &lit_5316); -#pragma pop - -/* 804C68B4-804C68B8 0003EC 0004+00 0/1 0/0 0/0 .rodata @5317 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5317 = -8.0f / 5.0f; -COMPILER_STRIP_GATE(0x804C68B4, &lit_5317); -#pragma pop - -/* 804C68B8-804C68BC 0003F0 0004+00 0/1 0/0 0/0 .rodata @5318 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5318 = -39.0f / 25.0f; -COMPILER_STRIP_GATE(0x804C68B8, &lit_5318); -#pragma pop - -/* 804C68BC-804C68C0 0003F4 0004+00 0/1 0/0 0/0 .rodata @5319 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5319 = -33.0f / 5.0f; -COMPILER_STRIP_GATE(0x804C68BC, &lit_5319); -#pragma pop - -/* 804C68C0-804C68C4 0003F8 0004+00 0/2 0/0 0/0 .rodata @5320 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5320 = 1.0f / 20.0f; -COMPILER_STRIP_GATE(0x804C68C0, &lit_5320); -#pragma pop - -/* 804C68C4-804C68C8 0003FC 0004+00 0/2 0/0 0/0 .rodata @5321 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5321 = 24.0f; -COMPILER_STRIP_GATE(0x804C68C4, &lit_5321); -#pragma pop - -/* 804C68C8-804C68CC 000400 0004+00 0/2 0/0 0/0 .rodata @5322 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5322 = 16384.0f; -COMPILER_STRIP_GATE(0x804C68C8, &lit_5322); -#pragma pop - -/* 804C68CC-804C68D0 000404 0004+00 0/1 0/0 0/0 .rodata @5323 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5323 = -150.0f; -COMPILER_STRIP_GATE(0x804C68CC, &lit_5323); -#pragma pop - /* 804BDE04-804BE470 001C64 066C+00 2/2 0/0 0/0 .text setMatrix__9daMidna_cFv */ +// NONMATCHING regalloc / instruction ordering void daMidna_c::setMatrix() { - // NONMATCHING + Vec vec1 = {0.0f, daMidna_hio_c0::m.field_0x18, daMidna_hio_c0::m.field_0x1c}; + Vec scale = {daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale}; + if (mpModel != NULL) { + mpModel->setBaseScale(scale); + } + mpShadowModel->setBaseScale(scale); + daAlink_c* link = daAlink_getAlinkActorClass(); + if (mDemoMode == 0x200) { + J3DTransformInfo transform; + mpMorf->getTransform(1, &transform); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + Vec vec2 = {transform.mTranslate.x, 0.0f, transform.mTranslate.z}; + mDoMtx_stack_c::multVec(&vec2, ¤t.pos); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else if (mpKago != NULL) { + mDoMtx_multVecZero(mpKago->getMidnaLocaterMtx(), ¤t.pos); + shape_angle.y = mpKago->shape_angle.y; + mDoMtx_MtxToRot(mpKago->getMidnaLocaterMtx(), &shape_angle); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(0.0f, -98.0f, 17.0f); + mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else if (!checkStateFlg0(FLG0_WOLF_NO_POS) && + (!daPy_py_c::i_checkNowWolf() || checkShadowModelDrawSmode())) { + if (field_0x84e != 4) { + f32 sin_link_y = cM_ssin(link->shape_angle.y); + f32 cos_link_y = cM_scos(link->shape_angle.y); + if (field_0x84e == 2) { + current.pos = link->current.pos; + shape_angle.y = link->shape_angle.y; + } else if (checkStateFlg0(FLG0_UNK_80000)) { + current.pos.set( + link->current.pos.x + -30.0f * sin_link_y + 65.0f * cos_link_y, + link->current.pos.y, + link->current.pos.z + -30.0f * cos_link_y - 65.0f * sin_link_y + ); + shape_angle.y = link->shape_angle.y - cM_deg2s(50.0f); + field_0x85a = shape_angle.y; + } else { + current.pos.set( + link->current.pos.x + 90.0f * sin_link_y, + link->current.pos.y, + link->current.pos.z + 90.0f * cos_link_y + ); + shape_angle.y = link->shape_angle.y + 0x8000; + field_0x85a = shape_angle.y; + } + if (!checkStateFlg0(FLG0_UNK_80000) && checkStateFlg0(FLG0_UNK_40000000)) { + current.pos.x += 80.0f * sin_link_y; + current.pos.z += 80.0f * cos_link_y; + } + if (link->checkHorseRide() || link->checkBoarRide()) { + current.pos.y -= 100.0f; + } else if (dComIfGp_checkPlayerStatus0(0, 0x100000)) { + current.pos.y -= 150.0f; + } + if (mDemoMode == 2) { + current.pos.x += field_0x8dc * sin_link_y; + current.pos.z += field_0x8dc * cos_link_y; + } + } + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } else { + if (!checkStateFlg0(FLG0_WOLF_NO_POS) && mDemoMode != 9) { + mDoMtx_stack_c::copy(link->getWolfMidnaMatrix()); + mDoMtx_stack_c::ZXYrotM(-0x4000, -0x4000, 0); + mDoMtx_stack_c::transM(-1.6f, -1.56f, -6.6f); + if (checkSetAnime(0, ANM_WLSWIMDIE) && !checkStateFlg0(FLG0_NO_DRAW)) { + mDoMtx_stack_c::multVecZero(¤t.pos); + } else { + mDoMtx_stack_c::multVec(&vec1, ¤t.pos); + } + shape_angle = link->shape_angle; + mDoMtx_stack_c::get()[0][3] = current.pos.x; + mDoMtx_stack_c::get()[1][3] = current.pos.y; + mDoMtx_stack_c::get()[2][3] = current.pos.z; + } else { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + if (checkSetAnime(0, ANM_WARPIN) && checkStateFlg1(FLG1_SIDE_WARP)) { + f32 fvar7 = (mpMorf->getFrame() - 24.0f) * 0.05f; + if (fvar7 < 0.0f) { + fvar7 = 0.0f; + } else if (fvar7 > 1.0f) { + fvar7 = 1.0f; + } + mDoMtx_stack_c::transM(0.0f, 150.0f, 0.0f); + mDoMtx_stack_c::XrotM(fvar7 * 16384.0f); + mDoMtx_stack_c::transM(0.0f, -150.0f, 0.0f); + } + } + mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get()); + speedF = link->speedF; + current.angle = shape_angle; + s16 target_backbone_angle; + if (checkStateFlg0(FLG0_UNK_4)) { + target_backbone_angle = -(shape_angle.x >> 1); + } else { + target_backbone_angle = 0; + } + cLib_addCalcAngleS(&mBackboneAngleZ, target_backbone_angle, 3, 0x800, 0x100); + } } -/* ############################################################################################## */ -/* 804C68D0-804C68D4 000408 0004+00 0/1 0/0 0/0 .rodata @5780 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5780 = 6.5f; -COMPILER_STRIP_GATE(0x804C68D0, &lit_5780); -#pragma pop - -/* 804C68D4-804C68D8 00040C 0004+00 0/1 0/0 0/0 .rodata @5781 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5781 = 20.0f; -COMPILER_STRIP_GATE(0x804C68D4, &lit_5781); -#pragma pop - /* 804BE470-804BED1C 0022D0 08AC+00 2/2 0/0 0/0 .text setBodyPartMatrix__9daMidna_cFv */ void daMidna_c::setBodyPartMatrix() { - // NONMATCHING + if (mpHandsBmd != NULL) { + mpHandsBmd->setBaseTRMtx(mpShadowModel->getBaseTRMtx()); + mpHandsBmd->calc(); + mpHandsBmd->setAnmMtx(1, mpShadowModel->getAnmMtx(JNT_HAND_L)); + mpHandsBmd->setAnmMtx(2, mpShadowModel->getAnmMtx(JNT_HAND_R)); + } + + mpShadowHandsBmd->setBaseTRMtx(mpShadowModel->getBaseTRMtx()); + mpShadowHandsBmd->calc(); + mpShadowHandsBmd->setAnmMtx(1, mpShadowModel->getAnmMtx(JNT_HAND_L)); + mpShadowHandsBmd->setAnmMtx(2, mpShadowModel->getAnmMtx(JNT_HAND_R)); + + if (mpMaskBmd != NULL) { + mpMaskBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD)); + mpMaskBmd->calc(); + } + + mpShadowMaskBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD)); + mpShadowMaskBmd->calc(); + + mDoMtx_stack_c::copy(mpShadowModel->getAnmMtx(JNT_HAIR_5)); + mDoMtx_stack_c::transM(6.5f, 0.0f, 0.0f); + + if (checkStateFlg1(FLG1_UNK_10)) { + mpDemoHDTmpBmd->setBaseTRMtx(mDoMtx_stack_c::get()); + if (mpDemoHDTmpBck != NULL) { + J3DModelData* model_data = mpDemoHDTmpBmd->getModelData(); + mpDemoHDTmpBck->entry(model_data, mpDemoHDTmpBck->getFrame()); + } + mpDemoHDTmpBmd->calc(); + } + + BOOL bvar8 = false; + + if (!checkStateFlg0((daMidna_FLG0)(FLG0_UNK_10000000 | FLG0_UNK_200000))) { + cXyz vec1, vec2; + mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_1), &vec1); + mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_5), &vec2); + vec2 -= vec1; + mDoMtx_stack_c::XYZrotM(0, mHairAngleY[4], mHairAngleZ[4] - vec2.atan2sY_XZ()); + } else if (daAlink_getAlinkActorClass()->getWolfLockActorEnd() != NULL) { + cXyz vec; + mDoMtx_stack_c::multVecZero(&vec); + vec = daAlink_getAlinkActorClass()->getWolfLockActorEnd()->eyePos - vec; + mDoMtx_stack_c::XrotM(vec.atan2sX_Z() - shape_angle.y); + bvar8 = true; + } + + if (mDemoMode == 0x13 || mDemoMode == 0x14 || mDemoMode == 0x15) { + bvar8 = true; + } + + mpShadowHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get()); + mpShadowHairhandBmd->calc(); + J3DModelData* hairhand_model_data = mpShadowHairhandBmd->getModelData(); + for (u16 i = 0; i < 3; i++) { + hairhand_model_data->getMaterialNodePointer(i)->getShape()->hide(); + } + + BOOL bvar2; + if (checkStateFlg0(FLG0_UNK_10000000) || checkSetAnime(2, ANM_HAIR) + || checkSetAnime(2, ANM_S_TAKES) || checkSetAnime(2, ANM_S_WAITS) + || checkSetAnime(2, ANM_S_PACKAWAY) || checkSetAnime(2, ANM_GRABST) + || checkEndResetStateFlg0(ERFLG0_UNK_40) || dComIfGp_checkPlayerStatus1(0, 0x800000)) + { + if (bvar8) { + hairhand_model_data->getMaterialNodePointer(2)->getShape()->show(); + } else { + hairhand_model_data->getMaterialNodePointer(1)->getShape()->show(); + } + bvar2 = true; + } else { + hairhand_model_data->getMaterialNodePointer(0)->getShape()->show(); + bvar2 = false; + } + + if (mpHairhandBmd != NULL) { + mpHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get()); + mpHairhandBmd->calc(); + + J3DModelData* model_data = mpHairhandBmd->getModelData(); + for (u16 i = 0; i < 3; i++) { + model_data->getMaterialNodePointer(i)->getShape()->hide(); + } + + const GXColorS10* color; + const GXColor* kcolor1; + const GXColor* kcolor2; + + if (bvar2) { + if (bvar8) { + model_data->getMaterialNodePointer(2)->getShape()->show(); + } else { + model_data->getMaterialNodePointer(1)->getShape()->show(); + } + + kcolor1 = &l_bigKColor; + if (dKy_darkworld_check()) { + color = &l_bigColor; + kcolor2 = &l_normalKColor2; + } else { + color = &l_lBigColor; + kcolor2 = &l_lBigKColor2; + } + } else { + model_data->getMaterialNodePointer(0)->getShape()->show(); + + color = &l_normalColor; + if (dKy_darkworld_check()) { + kcolor1 = &l_normalKColor; + kcolor2 = &l_normalKColor2; + } else { + kcolor1 = &l_lNormalKColor; + kcolor2 = &l_lNormalKColor2; + } + } + + cLib_chaseS(&field_0x6e0.r, color->r, 10); + cLib_chaseS(&field_0x6e0.g, color->g, 10); + cLib_chaseS(&field_0x6e0.b, color->b, 10); + cLib_chaseUC(&field_0x6e8.r, kcolor1->r, 10); + cLib_chaseUC(&field_0x6e8.g, kcolor1->g, 10); + cLib_chaseUC(&field_0x6e8.b, kcolor1->b, 10); + cLib_chaseUC(&field_0x6ec.r, kcolor2->r, 10); + cLib_chaseUC(&field_0x6ec.g, kcolor2->g, 10); + cLib_chaseUC(&field_0x6ec.b, kcolor2->b, 10); + } + + if (mpModel != NULL) { + mpModel->setBaseTRMtx(mpShadowModel->getBaseTRMtx()); + for (int i = 0; i < JNT_MAX; i++) { + mpModel->setAnmMtx(i, mpShadowModel->getAnmMtx(i)); + } + mpModel->calcWeightEnvelopeMtx(); + } + + mDoMtx_stack_c::transS(mpShadowModel->getAnmMtx(JNT_BACKBONE1)[0][3], + mpShadowModel->getAnmMtx(JNT_BACKBONE1)[1][3] + 20.0f, + mpShadowModel->getAnmMtx(JNT_BACKBONE1)[2][3]); + mpGokouBmd->setBaseTRMtx(mDoMtx_stack_c::get()); + mpGokouBmd->calc(); + + if (mLeftHandShapeIdx == 0xfd) { + mpDemoHLTmpBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HAND_L)); + if (mpDemoHLTmpBck != NULL) { + mpDemoHLTmpBck->entry(mpDemoHLTmpBmd->getModelData()); + } + mpDemoHLTmpBmd->calc(); + mpShadowLeftHandShape->hide(); + if (mpLeftHandShape != NULL) { + mpLeftHandShape->hide(); + } + } else { + mpShadowLeftHandShape->show(); + if (mpLeftHandShape != NULL) { + mpLeftHandShape->show(); + } + } + + if (mRightHandShapeIdx == 0xfd) { + mpDemoHRTmpBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HAND_R)); + if (mpDemoHRTmpBck != NULL) { + mpDemoHRTmpBck->entry(mpDemoHRTmpBmd->getModelData()); + } + mpDemoHRTmpBmd->calc(); + mpShadowRightHandShape->hide(); + if (mpRightHandShape != NULL) { + mpRightHandShape->hide(); + } + } else { + mpShadowRightHandShape->show(); + if (mpRightHandShape != NULL) { + mpRightHandShape->show(); + } + } + + if (checkStateFlg0(FLG0_UNK_10)) { + mpDemoFCBlendBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD)); + mpDemoFCBlendBmd->calc(); + mpDemoFCTongueBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD)); + if (mpDemoFCTmpBck != NULL) { + mpDemoFCTmpBck->entry(mpDemoFCTongueBmd->getModelData()); + } + mpDemoFCTongueBmd->calc(); + } } /* 804BED1C-804BEDB8 002B7C 009C+00 2/2 0/0 0/0 .text setRoomInfo__9daMidna_cFv */ void daMidna_c::setRoomInfo() { - // NONMATCHING + int room_no; + if (fopAcM_gc_c::gndCheck(¤t.pos)) { + room_no = fopAcM_gc_c::getRoomId(); + tevStr.mEnvrIdxOverride = fopAcM_gc_c::getPolyColor(); + } else { + room_no = dComIfGp_roomControl_getStayNo(); + } + tevStr.mRoomNo = room_no; + mReverb = dComIfGp_getReverb(room_no); + fopAcM_SetRoomNo(this, room_no); } -/* ############################################################################################## */ -/* 804C68D8-804C68E4 000410 000C+00 0/1 0/0 0/0 .rodata localItemPos$5798 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const localItemPos[12] = { - 0x00, 0x00, 0x00, 0x00, 0xC2, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C68D8, &localItemPos); -#pragma pop - -/* 804C68E4-804C68E8 00041C 0004+00 0/1 0/0 0/0 .rodata @5883 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5883 = 14.0f; -COMPILER_STRIP_GATE(0x804C68E4, &lit_5883); -#pragma pop - -/* 804C68E8-804C68EC 000420 0004+00 0/4 0/0 0/0 .rodata @5884 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5884 = 3.0f; -COMPILER_STRIP_GATE(0x804C68E8, &lit_5884); -#pragma pop - -/* 804C68EC-804C68F0 000424 0004+00 0/1 0/0 0/0 .rodata @5885 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5885 = 250.0f; -COMPILER_STRIP_GATE(0x804C68EC, &lit_5885); -#pragma pop - -/* 804C68F0-804C68F4 000428 0004+00 0/2 0/0 0/0 .rodata @5886 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5886 = 50.0f; -COMPILER_STRIP_GATE(0x804C68F0, &lit_5886); -#pragma pop - -/* 804C68F4-804C68F8 00042C 0004+00 0/3 0/0 0/0 .rodata @5887 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5887 = 30.0f; -COMPILER_STRIP_GATE(0x804C68F4, &lit_5887); -#pragma pop - -/* 804C68F8-804C68FC 000430 0004+00 0/1 0/0 0/0 .rodata @5888 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5888 = 120.0f; -COMPILER_STRIP_GATE(0x804C68F8, &lit_5888); -#pragma pop - /* 804BEDB8-804BEFA0 002C18 01E8+00 1/1 0/0 0/0 .text setBodyPartPos__9daMidna_cFv */ void daMidna_c::setBodyPartPos() { - // NONMATCHING + if (!(checkSetAnime(0, ANM_S_RETURN) && mpMorf->getFrame() > 14.0f)) { + mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &l_eyeOffset, &eyePos); + } + if (field_0x84e == 1 || (checkSetAnime(0, ANM_S_APPEAR) && mpMorf->getFrame() < 3.0f)) { + daAlink_c* link = daAlink_getAlinkActorClass(); + f32 fvar1 = daPy_py_c::i_checkNowWolf() ? 250.0f : 50.0f; + attention_info.position.set( + link->current.pos.x + fvar1 * cM_ssin(link->shape_angle.y), + link->current.pos.y - 30.0f, + link->current.pos.z + fvar1 * cM_scos(link->shape_angle.y) + ); + eyePos = attention_info.position; + } else if (field_0x84e == 2) { + attention_info.position = eyePos; + } else { + attention_info.position.set(current.pos.x, current.pos.y + 120.0f, current.pos.z); + } + mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &l_headCenterOffset, &mHeadCenterPos); + if (!checkStateFlg0(FLG0_NO_DRAW)) { + cXyz item_pos; + static Vec const localItemPos = { 0.0f, -68.0f, 0.0f }; + mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &localItemPos, &item_pos); + daAlink_getAlinkActorClass()->setItemPos(&item_pos); + } } /* 804BEFA0-804BF070 002E00 00D0+00 1/1 0/0 0/0 .text checkAppear__9daMidna_cFv */ -void daMidna_c::checkAppear() { - // NONMATCHING +BOOL daMidna_c::checkAppear() { + if (daPy_py_c::i_checkNowWolf() && daPy_py_c::i_checkFirstMidnaDemo() && + (!daAlink_getAlinkActorClass()->checkMidnaDisappearMode() + || checkStateFlg0(FLG0_WOLF_NO_POS) + || (checkSetAnime(0, ANM_RETURN) && !mpMorf->isStop()))) + { + return TRUE; + } + return FALSE; } -/* ############################################################################################## */ -/* 804C68FC-804C6908 000434 000C+00 0/1 0/0 0/0 .rodata @5997 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_5997[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C68FC, &lit_5997); -#pragma pop - -/* 804C6908-804C690C 000440 0004+00 0/1 0/0 0/0 .rodata @6386 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6386 = 72.0f; -COMPILER_STRIP_GATE(0x804C6908, &lit_6386); -#pragma pop - -/* 804C690C-804C6910 000444 0004+00 0/1 0/0 0/0 .rodata @6387 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6387 = 40000.0f; -COMPILER_STRIP_GATE(0x804C690C, &lit_6387); -#pragma pop - -/* 804C6910-804C6918 000448 0008+00 0/4 0/0 0/0 .rodata @6388 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_6388[8] = { - 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6910, &lit_6388); -#pragma pop - -/* 804C6918-804C6920 000450 0008+00 0/4 0/0 0/0 .rodata @6389 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_6389[8] = { - 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6918, &lit_6389); -#pragma pop - -/* 804C6920-804C6928 000458 0008+00 0/4 0/0 0/0 .rodata @6390 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_6390[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6920, &lit_6390); -#pragma pop - -/* 804C6928-804C692C 000460 0004+00 0/2 0/0 0/0 .rodata @6391 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6391 = 10.0f; -COMPILER_STRIP_GATE(0x804C6928, &lit_6391); -#pragma pop - -/* 804C692C-804C6930 000464 0004+00 0/4 0/0 0/0 .rodata @6392 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6392 = 0.5f; -COMPILER_STRIP_GATE(0x804C692C, &lit_6392); -#pragma pop - -/* 804C6930-804C6934 000468 0004+00 0/1 0/0 0/0 .rodata @6393 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6393 = 26.0f; -COMPILER_STRIP_GATE(0x804C6930, &lit_6393); -#pragma pop - -/* 804C6934-804C6938 00046C 0004+00 0/1 0/0 0/0 .rodata @6394 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6394 = 13.0f; -COMPILER_STRIP_GATE(0x804C6934, &lit_6394); -#pragma pop - -/* 804C6938-804C6940 000470 0004+04 0/2 0/0 0/0 .rodata @6395 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_6395[1 + 1 /* padding */] = { - 4.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x804C6938, &lit_6395); -#pragma pop - /* 804BF070-804BFF80 002ED0 0F10+00 1/1 0/0 0/0 .text checkMidnaPosState__9daMidna_cFv */ +// NONMATCHING needs to load g_dComIfG_gameInfo twice for two calls to dComIfGp_event_getPt2 void daMidna_c::checkMidnaPosState() { - // NONMATCHING + daAlink_c* link = daAlink_getAlinkActorClass(); + + const cXyz* jump_point = link->checkMidnaLockJumpPoint(); + if (checkStateFlg1(FLG1_UNK_200) || checkSetAnime(0, ANM_LEADTOWAITA)) { + jump_point = NULL; + } + offStateFlg1(FLG1_UNK_200); + const cXyz* pos = NULL; + if (jump_point == NULL) { + offStateFlg1(FLG1_UNK_400); + field_0x850 = 0; + } + + if (mDemoMode == 0x200) { + dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID); + if (demo_actor != NULL) { + int tmp1, tmp2, tmp3; + u16 tmp4; + while (demo_actor->getDemoIDData(&tmp1, &tmp2, &tmp3, &tmp4, NULL)) { + if (tmp1 == 0 && tmp2 == 0 && tmp3 == 1) { + if (tmp4 != 0) { + offStateFlg0(FLG0_WOLF_NO_POS); + } else { + onStateFlg0(FLG0_WOLF_NO_POS); + } + } + } + } + offStateFlg0(FLG0_UNK_20); + return; + } + + if (checkStateFlg0(FLG0_TAG_WAIT)) { + if (!checkEndResetStateFlg0(ERFLG0_UNK_2)) { + onStateFlg0(FLG0_NO_INPUT); + } + onStateFlg0(FLG0_WOLF_NO_POS); + pos = &mTagWaitPos; + field_0x8d4 = 30.0f; + offStateFlg0(FLG0_UNK_20); + } else if (link->checkMidnaWolfDeadAnime()) { + offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_200 | FLG0_UNK_20)); + if (checkSetAnime(0, ANM_WLDIEA) && !checkStateFlg0(FLG0_NO_DRAW) + && mpMorf->getFrame() >= 72.0f) { + onStateFlg0(FLG0_WOLF_NO_POS); + } else { + offStateFlg0(FLG0_WOLF_NO_POS); + } + } else if (link->checkMidnaWolfSwimDeadAnime()) { + offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_200 | FLG0_UNK_20)); + if (checkSetAnime(0, ANM_WLSWIMDIE) && !checkStateFlg0(FLG0_NO_DRAW) + && mpMorf->getFrame() >= 2.0f) { + onStateFlg0(FLG0_WOLF_NO_POS); + } else { + offStateFlg0(FLG0_WOLF_NO_POS); + } + } else if (jump_point != NULL) { + if (checkStateFlg0(FLG0_UNK_100) && !link->checkWolfTagLockJump() + && field_0x9a0.abs2(*jump_point) > 100.0f) { + offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_UNK_200 | FLG0_UNK_100)); + field_0x850 = 0; + field_0x851 = 0; + jump_point = pos; + } else { + onStateFlg0(FLG0_WOLF_NO_POS); + if (!checkStateFlg0(FLG0_UNK_100) || (field_0x9a0.abs2(*jump_point) > 100.0f + && link->current.pos.abs2(field_0x9a0) < 40000.0f)) { + field_0x9a0 = *jump_point; + field_0x8d4 = jump_point->abs(current.pos) / link->getWolfTagJumpTime(); + if (field_0x8d4 < 10.0f) { + field_0x8d4 = 10.0f; + } + onStateFlg0(FLG0_UNK_100); + offStateFlg0(FLG0_UNK_200); + pos = jump_point; + mSound.startCreatureSound(Z2SE_MIDNA_JUMP, field_0x850++, -1); + field_0x851 = field_0x850; + } else { + pos = &field_0x9a0; + } + + if (!link->checkWolfTagLockJump() && !checkStateFlg1(FLG1_UNK_400) + && (!checkStateFlg0(FLG0_UNK_200) || checkSetAnime(0, ANM_LEADED))) { + onStateFlg0(FLG0_NO_INPUT); + } else { + onStateFlg1(FLG1_UNK_400); + } + } + offStateFlg0(FLG0_UNK_20); + } else if (link->checkWolfTagLockJump() || checkStateFlg0(FLG0_UNK_100)) { + onStateFlg0(FLG0_WOLF_NO_POS); + if (!link->checkWolfTagLockJump()) { + onStateFlg1(FLG1_UNK_200); + } else { + onStateFlg0(FLG0_UNK_20); + } + offStateFlg0(FLG0_UNK_100); + } else { + if (checkStateFlg0(FLG0_WOLF_NO_POS)) { + offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_UNK_200)); + onStateFlg0(FLG0_UNK_1000); + if (checkStateFlg0(FLG0_UNK_20)) { + offStateFlg0(FLG0_UNK_20); + mSound.startCreatureSound(Z2SE_MIDNA_JUMP_FINISH, field_0x851, -1); + } + } else { + offStateFlg0(FLG0_UNK_20); + } + } + + if (mDemoMode == 12) { + if (daPy_py_c::i_checkNowWolf()) { + onStateFlg0(FLG0_WOLF_NO_POS); + Vec vec1 = {0.0f, daMidna_hio_c0::m.field_0x18, daMidna_hio_c0::m.field_0x1c}; + cXyz vec2; + mDoMtx_stack_c::copy(link->getWolfMidnaMatrix()); + mDoMtx_stack_c::ZXYrotM(-0x4000, -0x4000, 0); + mDoMtx_stack_c::multVec(&vec1, &vec2); + if (cLib_chasePos(¤t.pos, vec2, 50.0f)) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } else { + offStateFlg0(FLG0_WOLF_NO_POS); + dComIfGp_evmng_cutEnd(mStaffID); + } + offStateFlg0(FLG0_UNK_400000); + } else if (mDemoMode == 13) { + if (mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(mStaffID); + } + offStateFlg0(FLG0_UNK_400000); + } else if (mDemoMode == 17 || mDemoMode == 18) { + if (mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } else if (mDemoMode == 3 || mDemoMode == 6 || mDemoMode == 4 || mDemoMode == 19 + || mDemoMode == 20 || mDemoMode == 21 || mDemoMode == 7 || mDemoMode == 14 + || mDemoMode == 5 || mDemoMode == 16 || mDemoMode == 11 || mDemoMode == 8) + { + onStateFlg0(FLG0_WOLF_NO_POS); + offStateFlg0((daMidna_FLG0)(FLG0_UNK_400000 | FLG0_UNK_1000)); + if (mDemoMode == 16) { + current.pos = mDemoPos; + shape_angle.y = mDemoAngle; + current.angle.y = shape_angle.y; + dComIfGp_evmng_cutEnd(mStaffID); + } else if (mDemoMode == 3 || mDemoMode == 6) { + if (cLib_addCalcPos(¤t.pos, mDemoPos, 0.5f, mDemoSpeed, 1.0f) < 1.0f) { + dComIfGp_evmng_cutEnd(mStaffID); + } else { + cXyz vec = mDemoPos - current.pos; + cLib_addCalcAngleS(&shape_angle.y, vec.atan2sX_Z(), 2, 0x1000, 0x400); + current.angle.y = shape_angle.y; + onEndResetStateFlg0(ERFLG0_UNK_1); + } + } else if (mDemoMode == 4) { + if (cLib_addCalcAngleS(&shape_angle.y, mDemoAngle, 2, 0x1000, 0x400) == 0) { + dComIfGp_evmng_cutEnd(mStaffID); + } + current.angle.y = shape_angle.y; + } else if (mDemoMode == 8) { + if (checkSetAnime(0, ANM_S_HOLE)) { + cLib_addCalcAngleS(&shape_angle.y, mDemoAngle, 2, 0x2000, 0x800); + current.angle.y = shape_angle.y; + if (mpMorf->getFrame() >= 26.0f) { + setRightHandShape(3); + } else if (mpMorf->getFrame() >= 13.0f) { + setRightHandShape(2); + } + if (mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } + } else if (mDemoMode == 7) { + if (checkSetAnime(2, ANM_S_TAKES) && mFaceBck.isStop()) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } else if (mDemoMode == 14) { + if (checkSetAnime(2, ANM_S_PACKAWAY) && mFaceBck.isStop()) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } else if (mDemoMode == 5) { + if ((checkSetAnime(0, ANM_S_RETURN) || checkSetAnime(0, ANM_RETURN)) && mpMorf->isStop()) + { + offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_TAG_WAIT)); + dComIfGp_evmng_cutEnd(mStaffID); + } + } else if (mDemoMode == 19 || mDemoMode == 21 || mDemoMode == 20) { + if (dComIfGp_event_getPt2() != NULL) { + s16 angle = fopAcM_searchActorAngleY(this, dComIfGp_event_getPt2()); + cLib_addCalcAngleS(&shape_angle.y, angle, 2, 0x2000, 0x800); + current.angle.y = shape_angle.y; + } + if (mDemoMode == 20 || (mDemoMode == 21 && mpMorf->isStop()) + || (mDemoMode == 19 && mFaceBck.isStop())) { + dComIfGp_evmng_cutEnd(mStaffID); + } + } + } else if (pos != NULL) { + if (checkEndResetStateFlg0(ERFLG0_UNK_2)) { + onStateFlg0(FLG0_UNK_200); + current.pos = *pos; + shape_angle.y = fopAcM_searchPlayerAngleY(this); + current.angle.y = shape_angle.y; + field_0x85a = shape_angle.y; + onEndResetStateFlg0(ERFLG0_UNK_100); + } else if (cLib_chasePos(¤t.pos, *pos, field_0x8d4)) { + if (!checkStateFlg0(FLG0_UNK_200)) { + field_0x876 = fopAcM_searchPlayerAngleY(this); + } + onStateFlg0(FLG0_UNK_200); + } else { + cXyz start(current.pos.x, current.pos.y + 100.0f, current.pos.z); + cXyz end = current.pos * 2.0f - old.pos; + end.y += 100.0f; + mLinChk.Set(&start, &end, this); + if (dComIfG_Bgsp().LineCross(&mLinChk)) { + onStateFlg0(FLG0_UNK_400000); + } + } + + s16 angle = shape_angle.y; + if (checkSetAnime(0, ANM_LEADED)) { + if (mpMorf->getFrame() >= 4.0f && mpMorf->getFrame() < 17.0f) { + if ((s16)(field_0x876 - shape_angle.y) < 0) { + angle = shape_angle.y + 0x7fff; + } else { + angle = field_0x876; + } + } + } else if (checkSetAnime(0, ANM_LEADST)) { + if (!checkStateFlg0(FLG0_UNK_200)) { + angle = cM_atan2s(pos->x - current.pos.x, pos->z - current.pos.z); + } + } else { + angle = fopAcM_searchPlayerAngleY(this); + onEndResetStateFlg0(ERFLG0_UNK_100); + } + cLib_addCalcAngleS(&shape_angle.y, angle, 2, 0x2000, 0x800); + } else { + offStateFlg0(FLG0_UNK_400000); + } } /* 804BFF80-804C0020 003DE0 00A0+00 3/3 0/0 0/0 .text setUpperAnime__9daMidna_cFUsUs */ -void daMidna_c::setUpperAnime(u16 param_0, u16 param_1) { - // NONMATCHING +BOOL daMidna_c::setUpperAnime(u16 i_resID, u16 param_1) { + J3DAnmTransform* bck; + if (param_1 == 0xffff) { + bck = (J3DAnmTransform*)mBckHeap[1].loadDataIdx(i_resID); + } else { + bck = (J3DAnmTransform*)mBckHeap[1].loadDataDemoRID(i_resID, 0); + } + + if (bck == NULL) { + return FALSE; + } + + mUpperBck.init(bck, TRUE, -1, 1.0f, 0, -1, true); + mSoundID = 0; + mVoiceFrame = -1.0f; + return TRUE; } /* 804C0020-804C0094 003E80 0074+00 1/1 0/0 0/0 .text * setUpperAnimeAndSe__9daMidna_cFQ29daMidna_c11daMidna_ANM */ -void daMidna_c::setUpperAnimeAndSe(daMidna_c::daMidna_ANM param_0) { - // NONMATCHING +BOOL daMidna_c::setUpperAnimeAndSe(daMidna_c::daMidna_ANM i_anm) { + const daMidna_anmData_s* anm_data = &m_anmDataTable[i_anm]; + if (setUpperAnime(anm_data->mResID, 0xffff)) { + mSoundID = anm_data->mSoundID; + mVoiceFrame = anm_data->mSoundFrame; + return TRUE; + } + return FALSE; } /* 804C0094-804C0134 003EF4 00A0+00 1/1 0/0 0/0 .text setFaceAnime__9daMidna_cFUsUs */ -void daMidna_c::setFaceAnime(u16 param_0, u16 param_1) { - // NONMATCHING +BOOL daMidna_c::setFaceAnime(u16 i_resID, u16 param_1) { + J3DAnmTransform* bck; + if (param_1 == 0xffff) { + bck = (J3DAnmTransform*)mBckHeap[2].loadDataIdx(i_resID); + } else { + bck = (J3DAnmTransform*)mBckHeap[2].loadDataDemoRID(i_resID, 0); + } + + onStateFlg0(FLG0_UNK_800000); + + if (bck == NULL) { + return FALSE; + } + + mFaceBck.init(bck, TRUE, -1, 1.0f, 0, -1, true); + mFaceBckTimer = 20; + return TRUE; } /* 804C0134-804C0238 003F94 0104+00 2/2 0/0 0/0 .text endHighModel__9daMidna_cFv */ void daMidna_c::endHighModel() { - // NONMATCHING + if (mpDemoFCTongueBtk != NULL) { + mpDemoFCTongueBmd->getModelData()->removeTexMtxAnimator(mpDemoFCTongueBtk); + } + + offStateFlg0(FLG0_UNK_10); + mpDemoFCTmpCluster = NULL; + mpDemoFCTongueBtk = NULL; + + if (mpModel != NULL) { + mpModel->getModelData()->getMaterialNodePointer(9)->getShape()->show(); + mpModel->getModelData()->getMaterialNodePointer(1)->getShape()->show(); + mpModel->getModelData()->getMaterialNodePointer(2)->getShape()->show(); + mpModel->getModelData()->getMaterialNodePointer(3)->getShape()->show(); + mpModel->getModelData()->getMaterialNodePointer(8)->getShape()->show(); + } } /* 804C0238-804C0BAC 004098 0974+00 1/1 0/0 0/0 .text setDemoAnm__9daMidna_cFv */ -void daMidna_c::setDemoAnm() { - // NONMATCHING +BOOL daMidna_c::setDemoAnm() { + dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID); + if (demo_actor == NULL) { + return FALSE; + } + + BOOL ret = FALSE; + BOOL bVar1 = FALSE; + int var1, var2, var3; + u16 var4; + + while (demo_actor->getDemoIDData(&var1, &var2, &var3, &var4, NULL)) { + if (var1 == 0) { + if (var2 == 0) { + if (var3 == 2) { + offStateFlg1((daMidna_FLG1)(FLG1_UNK_20 | FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)); + if (var4 == 3) { + onStateFlg1(FLG1_UNK_20); + } else if (var4 == 2) { + onStateFlg1(FLG1_UNK_1); + } else if (var4 == 1) { + field_0x84e = 3; + onStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE); + } else { + field_0x84e = 0; + } + } else if (var3 == 3) { + if (var4 == 2) { + onStateFlg1(FLG1_FORCE_NORMAL_COL); + offStateFlg1(FLG1_FORCE_TIRED_COL); + } else if (var4 == 1) { + offStateFlg1(FLG1_FORCE_NORMAL_COL); + onStateFlg1(FLG1_FORCE_TIRED_COL); + } else { + offStateFlg1((daMidna_FLG1)(FLG1_FORCE_NORMAL_COL | FLG1_FORCE_TIRED_COL)); + } + } else if (var3 == 4) { + if (var4 == 1) { + onEndResetStateFlg0(ERFLG0_UNK_20); + } + } else if (var3 == 5) { + if (var4 == 1) { + onStateFlg1(FLG1_NO_MASK_DRAW); + } else { + offStateFlg1(FLG1_NO_MASK_DRAW); + } + } else if (var3 == 6) { + if (var4 == 1) { + onStateFlg1(FLG1_SHADOW_NO_DRAW); + } else { + offStateFlg1(FLG1_SHADOW_NO_DRAW); + } + } + } else if (var2 == 5) { + if (var4 < 2) { + var4 += 2; + } else if (var4 == 0xfd && mpDemoHRTmpBmd == NULL) { + var4 = 0xfe; + } + setRightHandShape(var4); + } else if (var2 == 6) { + if (var4 == 0xfd && mpDemoHLTmpBmd == NULL) { + var4 = 0xfe; + } + setLeftHandShape(var4); + } else if (var2 == 9) { + if (var4 == 1 && mpDemoFCBlendBmd != NULL && mpDemoFCTongueBmd != NULL) { + onStateFlg0(FLG0_UNK_10); + bVar1 = TRUE; + if (mpModel != NULL) { + mpModel->getModelData()->getMaterialNodePointer(9)->getShape()->hide(); + mpModel->getModelData()->getMaterialNodePointer(1)->getShape()->hide(); + mpModel->getModelData()->getMaterialNodePointer(2)->getShape()->hide(); + mpModel->getModelData()->getMaterialNodePointer(3)->getShape()->hide(); + mpModel->getModelData()->getMaterialNodePointer(8)->getShape()->hide(); + } + } else { + endHighModel(); + } + } else if (var2 == 4) { + if (var3 == 1) { + if (var4 == 1) { + onStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000)); + } + } else if (var4 == 2) { + onStateFlg1(FLG1_UNK_40); + } else if (var4 != 0 && mpDemoHDTmpBmd != NULL) { + onStateFlg1(FLG1_UNK_10); + } else { + offStateFlg1((daMidna_FLG1)(FLG1_UNK_40 | FLG1_UNK_10)); + } + } + } else if (var1 == 2) { + if (var2 == 1) { + if (var3 == 2) { + J3DAnmTransform* bck = static_cast( + mBckHeap[0].loadDataDemoRID(var4, 0)); + if (bck != NULL) { + f32 morf; + if (demo_actor->checkEnable(0x80)) { + morf = demo_actor->getPrm_Morf(); + } else { + morf = 0.0f; + } + setBckAnime(bck, -1, morf); + setUpperAnime(var4, 0); + offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1)); + demo_actor->setAnmFrameMax(mpMorf->getEndFrame()); + } + ret = TRUE; + } + } else if (var2 == 6) { + if (var3 == 2) { + if (mpDemoHLTmpBck != NULL) { + J3DAnmTransform* bck = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (bck != NULL && mpDemoHLTmpBck->getBckAnm() != bck) { + mpDemoHLTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true); + } + } + ret = TRUE; + } + } else if (var2 == 5) { + if (var3 == 2) { + if (mpDemoHRTmpBck != NULL) { + J3DAnmTransform* bck = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (bck != NULL && mpDemoHRTmpBck->getBckAnm() != bck) { + mpDemoHRTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true); + } + } + ret = TRUE; + } + } else if (var2 == 9) { + if (var3 == 5) { + setFaceBtp(var4, TRUE); + ret = TRUE; + } else if (var3 == 3) { + if (checkStateFlg0(FLG0_UNK_10)) { + J3DAnmTextureSRTKey* btk = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (btk != NULL && mpDemoFCTongueBtk != btk) { + btk->searchUpdateMaterialID(mpDemoFCTongueBmd->getModelData()); + mpDemoFCTongueBmd->getModelData()->entryTexMtxAnimator(btk); + btk->setFrame(0.0f); + mpDemoFCTongueBtk = btk; + } + } else { + setFaceBtk(var4, TRUE); + } + ret = TRUE; + } else if (var3 == 7) { + J3DAnmCluster* cluster = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (mpDemoFCTmpCluster != cluster) { + mpDemoFCTmpCluster = cluster; + mpDemoFCTmpBlk->init(mpDemoFCTmpBls, mpDemoFCTmpCluster, FALSE, + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1); + mpDemoFCTmpBlk->getBlkAnm()->setFrame(0.0f); + } + ret = TRUE; + } else if (var3 == 2) { + if (mpDemoFCTmpBck != NULL) { + J3DAnmTransform* bck = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (bck != NULL && mpDemoFCTmpBck->getBckAnm() != bck) { + mpDemoFCTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true); + } + } + ret = TRUE; + } else if (var3 == 4) { + J3DAnmTevRegKey* brk = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (brk != NULL && mpDemoFCBlendBrk != brk) { + brk->setFrame(0.0f); + mpDemoFCBlendBrk = brk; + if (mpDemoFCBlendBmd != NULL) { + mpDemoFCBlendBrk->searchUpdateMaterialID(mpDemoFCBlendBmd->getModelData()); + } + } + } + } else if (var2 == 4) { + if (var3 == 2) { + if (mpDemoHDTmpBck != NULL) { + J3DAnmTransform* bck = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (bck != NULL && mpDemoHDTmpBck->getBckAnm() != bck) { + mpDemoHDTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true); + } + } + ret = TRUE; + } else if (var3 == 4) { + J3DAnmTevRegKey* brk = static_cast( + dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4)); + if (brk != NULL && field_0x668 != brk) { + brk->setFrame(0.0f); + field_0x668 = brk; + } + } + } + } + } + + if (demo_actor->checkEnable(0x40)) { + mpMorf->setFrameF(demo_actor->getAnmFrame()); + mUpperBck.setFrame(demo_actor->getAnmFrame()); + mFaceBck.setFrame(demo_actor->getAnmFrame()); + if (mpFaceBtp != NULL && !mBtpHeap.checkNoSetArcNo()) { + mpFaceBtp->setFrame(demo_actor->getAnmFrame()); + } + if (mpFaceBtk != NULL && !mBtkHeap.checkNoSetArcNo()) { + mpFaceBtk->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoFCTmpBck != NULL) { + mpDemoFCTmpBck->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoHLTmpBck != NULL) { + mpDemoHLTmpBck->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoHRTmpBck != NULL) { + mpDemoHRTmpBck->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoHDTmpBck != NULL) { + mpDemoHDTmpBck->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoFCTongueBtk != NULL) { + mpDemoFCTongueBtk->setFrame(demo_actor->getAnmFrame()); + } + if (mpDemoFCTmpBlk != NULL && mpDemoFCTmpBlk->getBlkAnm() != NULL) { + mpDemoFCTmpBlk->getBlkAnm()->setFrame(demo_actor->getAnmFrame()); + } + } + + if (!bVar1) { + endHighModel(); + } + + return ret; } -/* ############################################################################################## */ -/* 804C6940-804C6948 000478 0008+00 2/2 0/0 0/0 .rodata @6968 */ -SECTION_RODATA static u8 const lit_6968[8] = { - 0x43, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C6940, &lit_6968); - /* 804C0BAC-804C0C6C 004A0C 00C0+00 2/2 0/0 0/0 .text setFaceBtp__9daMidna_cFUsi */ -void daMidna_c::setFaceBtp(u16 param_0, int param_1) { - // NONMATCHING +void daMidna_c::setFaceBtp(u16 i_index, BOOL i_isDemo) { + J3DAnmTexPattern* btp; + if (i_isDemo) { + btp = static_cast(mBtpHeap.loadDataDemoRID(i_index, 0)); + } else { + btp = static_cast(mBtpHeap.loadDataIdx(i_index)); + } + + if (btp != NULL && mpModel != NULL) { + mpFaceBtp = btp; + mpFaceBtp->searchUpdateMaterialID(mpModel->getModelData()); + mpModel->getModelData()->entryTexNoAnimator(mpFaceBtp); + field_0x84a = 0; + mpFaceBtp->setFrame(field_0x84a); + offStateFlg0(FLG0_UNK_40); + } } /* 804C0C6C-804C0D2C 004ACC 00C0+00 2/2 0/0 0/0 .text setFaceBtk__9daMidna_cFUsi */ -void daMidna_c::setFaceBtk(u16 param_0, int param_1) { - // NONMATCHING +void daMidna_c::setFaceBtk(u16 i_index, BOOL i_isDemo) { + J3DAnmTextureSRTKey* btk; + if (i_isDemo) { + btk = static_cast(mBtkHeap.loadDataDemoRID(i_index, 0)); + } else { + btk = static_cast(mBtkHeap.loadDataIdx(i_index)); + } + + if (btk != NULL && mpModel != NULL) { + mpFaceBtk = btk; + mpFaceBtk->searchUpdateMaterialID(mpModel->getModelData()); + mpModel->getModelData()->entryTexMtxAnimator(mpFaceBtk); + field_0x84a = 0; + mpFaceBtk->setFrame(field_0x84a); + offStateFlg0(FLG0_UNK_40); + } } /* 804C0D2C-804C0E18 004B8C 00EC+00 2/2 0/0 0/0 .text setLeftHandShape__9daMidna_cFUs */ -void daMidna_c::setLeftHandShape(u16 param_0) { - // NONMATCHING +void daMidna_c::setLeftHandShape(u16 i_idx) { + mLeftHandShapeIdx = i_idx; + if (mpLeftHandShape != NULL) { + mpLeftHandShape->hide(); + } + mpShadowLeftHandShape->hide(); + + if (i_idx == 0xfe || i_idx == 0xfd) { + mpShadowLeftHandShape = mpShadowModel->getModelData()->getMaterialNodePointer(1)->getShape(); + if (mpLeftHandShape != NULL) { + mpLeftHandShape = mpModel->getModelData()->getMaterialNodePointer(6)->getShape(); + } + } else { + mpShadowLeftHandShape = mpShadowHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape(); + if (mpLeftHandShape != NULL) { + mpLeftHandShape = mpHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape(); + } + } + + mpShadowLeftHandShape->show(); + if (mpLeftHandShape != NULL) { + mpLeftHandShape->show(); + } } /* 804C0E18-804C0F04 004C78 00EC+00 3/3 0/0 0/0 .text setRightHandShape__9daMidna_cFUs */ -void daMidna_c::setRightHandShape(u16 param_0) { - // NONMATCHING +void daMidna_c::setRightHandShape(u16 i_idx) { + mRightHandShapeIdx = i_idx; + if (mpRightHandShape != NULL) { + mpRightHandShape->hide(); + } + mpShadowRightHandShape->hide(); + + if (i_idx == 0xfe || i_idx == 0xfd) { + mpShadowRightHandShape = mpShadowModel->getModelData()->getMaterialNodePointer(2)->getShape(); + if (mpRightHandShape != NULL) { + mpRightHandShape = mpModel->getModelData()->getMaterialNodePointer(7)->getShape(); + } + } else { + mpShadowRightHandShape = mpShadowHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape(); + if (mpRightHandShape != NULL) { + mpRightHandShape = mpHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape(); + } + } + + mpShadowRightHandShape->show(); + if (mpRightHandShape != NULL) { + mpRightHandShape->show(); + } } /* 804C0F04-804C0F24 004D64 0020+00 1/1 0/0 0/0 .text checkHairOnlyAnime__9daMidna_cCFi */ -void daMidna_c::checkHairOnlyAnime(int param_0) const { - // NONMATCHING +BOOL daMidna_c::checkHairOnlyAnime(int i_anm) const { + return i_anm >= ANM_HAIR && i_anm < ANM_MAX; } /* 804C0F24-804C103C 004D84 0118+00 2/2 0/0 0/0 .text setBckAnime__9daMidna_cFP15J3DAnmTransformif */ -void daMidna_c::setBckAnime(J3DAnmTransform* param_0, int param_1, f32 param_2) { - // NONMATCHING +void daMidna_c::setBckAnime(J3DAnmTransform* i_bck, int i_attr, f32 i_morf) { + mpMorf->setAnm(i_bck, i_attr, i_morf, 1.0f, 0.0f, -1.0f); + void* bas; + + if (!mBckHeap[0].checkNoSetArcNo()) { + bas = static_cast(i_bck)->getBas(); + if (bas == NULL) { + offStateFlg1(FLG1_UNK_800); + } else { + onStateFlg1(FLG1_UNK_800); + } + } else { + u8* buf = mBckHeap[0].getBuffer(); + if (*(u32*)(buf + 0x1c) == 0xffffffff) { + offStateFlg1(FLG1_UNK_800); + bas = NULL; + } else { + onStateFlg1(FLG1_UNK_800); + bas = mBckHeap[0].getBuffer() + *(u32*)(buf + 0x1c); + } + } + + if (bas != NULL) { + mSound.initAnime(bas, mpMorf->getPlaySpeed() >= 0.0f, mpMorf->getLoopFrame(), 0.0f); + } } -/* ############################################################################################## */ -/* 804C6948-804C696C 000480 0024+00 0/1 0/0 0/0 .rodata motionTable$7191 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const motionTable[36] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x17, -}; -COMPILER_STRIP_GATE(0x804C6948, &motionTable); -#pragma pop - -/* 804C696C-804C6970 0004A4 0004+00 1/2 0/0 0/0 .rodata @7990 */ -SECTION_RODATA static f32 const lit_7990 = 5.0f; -COMPILER_STRIP_GATE(0x804C696C, &lit_7990); - -/* 804C6970-804C6974 0004A8 0004+00 0/2 0/0 0/0 .rodata @7991 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7991 = 19.0f; -COMPILER_STRIP_GATE(0x804C6970, &lit_7991); -#pragma pop - -/* 804C6974-804C6978 0004AC 0004+00 0/1 0/0 0/0 .rodata @7992 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7992 = 9.0f / 10.0f; -COMPILER_STRIP_GATE(0x804C6974, &lit_7992); -#pragma pop - -/* 804C6978-804C697C 0004B0 0004+00 0/1 0/0 0/0 .rodata @7993 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_7993 = 0x42103D92; -COMPILER_STRIP_GATE(0x804C6978, &lit_7993); -#pragma pop - -/* 804C697C-804C6980 0004B4 0004+00 0/1 0/0 0/0 .rodata @7994 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_7994 = 0xC168408A; -COMPILER_STRIP_GATE(0x804C697C, &lit_7994); -#pragma pop - -/* 804C6980-804C6984 0004B8 0004+00 0/1 0/0 0/0 .rodata @7995 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7995 = 1000.0f; -COMPILER_STRIP_GATE(0x804C6980, &lit_7995); -#pragma pop - -/* 804C6984-804C6988 0004BC 0004+00 0/2 0/0 0/0 .rodata @7996 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7996 = 9.0f; -COMPILER_STRIP_GATE(0x804C6984, &lit_7996); -#pragma pop - -/* 804C6988-804C698C 0004C0 0004+00 0/2 0/0 0/0 .rodata @7997 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7997 = 12.0f; -COMPILER_STRIP_GATE(0x804C6988, &lit_7997); -#pragma pop - -/* 804C698C-804C6990 0004C4 0004+00 0/3 0/0 0/0 .rodata @7998 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7998 = 1.0f / 10.0f; -COMPILER_STRIP_GATE(0x804C698C, &lit_7998); -#pragma pop - -/* 804C6990-804C6994 0004C8 0004+00 0/1 0/0 0/0 .rodata @7999 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_7999 = 95.0f; -COMPILER_STRIP_GATE(0x804C6990, &lit_7999); -#pragma pop - -/* 804C6994-804C6998 0004CC 0004+00 0/2 0/0 0/0 .rodata @8000 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8000 = 1.0f / 100.0f; -COMPILER_STRIP_GATE(0x804C6994, &lit_8000); -#pragma pop - -/* 804C6998-804C699C 0004D0 0004+00 0/1 0/0 0/0 .rodata @8001 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8001 = 1.0f / 80.0f; -COMPILER_STRIP_GATE(0x804C6998, &lit_8001); -#pragma pop - -/* 804C699C-804C69A0 0004D4 0004+00 0/1 0/0 0/0 .rodata @8002 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8002 = 110.0f; -COMPILER_STRIP_GATE(0x804C699C, &lit_8002); -#pragma pop - -/* 804C69A0-804C69A4 0004D8 0004+00 0/1 0/0 0/0 .rodata @8003 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8003 = 15.0f; -COMPILER_STRIP_GATE(0x804C69A0, &lit_8003); -#pragma pop - -/* 804C69A4-804C69A8 0004DC 0004+00 0/1 0/0 0/0 .rodata @8004 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8004 = 53.0f; -COMPILER_STRIP_GATE(0x804C69A4, &lit_8004); -#pragma pop - /* 804C103C-804C287C 004E9C 1840+00 2/2 0/0 0/0 .text setAnm__9daMidna_cFv */ +// NONMATCHING regalloc void daMidna_c::setAnm() { - // NONMATCHING + offStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000)); + + if (setDemoAnm()) { + return; + } + + daAlink_c* link = daAlink_getAlinkActorClass(); + + BOOL bVar1; + if (dComIfGp_event_runCheck() || checkEndResetStateFlg0(ERFLG0_NO_SERVICE_WAIT)) { + bVar1 = TRUE; + } else { + bVar1 = FALSE; + } + BOOL bVar2 = FALSE; + BOOL bVar3 = TRUE; + bool tired = i_checkMidnaTired(); + daMidna_ANM anm; + + if (link->checkMidnaWolfDeadAnime() && !checkStateFlg0(FLG0_TAG_WAIT)) { + if (tired) { + anm = ANM_CLINGD; + } else { + anm = ANM_WLDIEA; + } + offStateFlg0(FLG0_UNK_1000); + } else if (link->checkMidnaWolfSwimDeadAnime() && !checkStateFlg0(FLG0_TAG_WAIT)) { + if (tired) { + anm = ANM_CLINGD; + } else { + anm = ANM_WLSWIMDIE; + bVar2 = TRUE; + } + offStateFlg0(FLG0_UNK_1000); + } else if (link->checkMidnaGanonCatchAnm()) { + bVar2 = TRUE; + if (checkSetAnime(0, ANM_MGNCATCHED) + || (mpMorf->isStop() && checkSetAnime(0, ANM_MGNCATCHST))) + { + anm = ANM_MGNCATCHED; + } else { + anm = ANM_MGNCATCHST; + } + } else if (link->checkMidnaGanonThrowLeftAnm()) { + if (checkSetAnime(0, ANM_MGNTHROWLED) + || (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLST))) + { + bVar2 = TRUE; + anm = ANM_MGNTHROWLED; + if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLED)) { + link->setEndGanonThrow(); + } + } else { + anm = ANM_MGNTHROWLST; + } + } else if (link->checkMidnaGanonThrowRightAnm()) { + if (checkSetAnime(0, ANM_MGNTHROWRED) + || (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRST))) + { + bVar2 = TRUE; + anm = ANM_MGNTHROWRED; + if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRED)) { + link->setEndGanonThrow(); + } + } else { + anm = ANM_MGNTHROWRST; + } + } else if (mDemoMode == 9) { + anm = ANM_WARPIN; + offStateFlg0(FLG0_UNK_1000); + } else if (mDemoMode == 0x15) { + anm = ANM_GRABED; + offStateFlg0(FLG0_UNK_1000); + } else if (mDemoMode == 0xd || mDemoMode == 0xc) { + anm = ANM_LEADTOWAITA; + bVar2 = TRUE; + offStateFlg0(FLG0_UNK_1000); + } else if (mDemoMode == 0x11) { + anm = ANM_DOOROPC; + offStateFlg0(FLG0_UNK_1000); + } else if (mDemoMode == 0x12) { + anm = ANM_DOOROPD; + offStateFlg0(FLG0_UNK_1000); + } else if (mDemoMode == 8) { + anm = ANM_S_HOLE; + } else if (mDemoMode == 7 || mDemoMode == 6 || mDemoMode == 0x13 + || mDemoMode == 0x14 || mDemoMode == 0xe) { + anm = ANM_LEADWAIT; + bVar1 = TRUE; + offStateFlg0(FLG0_UNK_1); + } else if (mDemoMode == 5) { + if (field_0x8dc > 0.5f) { + anm = ANM_RETURN; + } else { + anm = ANM_S_RETURN; + } + } else if (mDemoMode == 0xf) { + anm = ANM_RETURN; + bVar2 = TRUE; + } else if ((checkShadowModelDrawSmode() && !checkStateFlg0(FLG0_WOLF_NO_POS)) + || mDemoMode == 6 || mDemoMode == 3 || mDemoMode == 0x10 || mDemoMode == 4) + { + if (field_0x84e == 4) { + anm = ANM_S_RETURN; + } else if (field_0x84e == 2) { + if (checkStateFlg0(FLG0_UNK_80000)) { + anm = ANM_S_APPEARBL; + } else { + anm = ANM_S_APPEAR; + } + } else { + if (checkEndResetStateFlg0(ERFLG0_UNK_1)) { + anm = ANM_S_MOVE; + } else { + anm = ANM_LEADWAIT; + } + } + offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1)); + bVar1 = TRUE; + bVar2 = TRUE; + } else if (checkStateFlg0(FLG0_UNK_1000)) { + bVar2 = TRUE; + anm = ANM_LEADTOWAITA; + if (mpMorf->isStop() && checkSetAnime(0, ANM_LEADTOWAITA)) { + offStateFlg0(FLG0_UNK_1000); + } + } else if (checkStateFlg0(FLG0_UNK_200)) { + if ((mpMorf->isStop() && checkSetAnime(0, ANM_LEADED)) || checkSetAnime(0, ANM_LEADSWAIT) + || checkSetAnime(0, ANM_LEADWAIT)) { + anm = ANM_LEADWAIT; + offStateFlg0(FLG0_NO_INPUT); + } else { + anm = ANM_LEADED; + } + } else if (checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))) { + anm = ANM_LEADST; + } else if (mpKago != NULL) { + if (dComIfGp_evmng_checkStartDemo()) { + anm = ANM_CLING; + onStateFlg0(FLG0_UNK_4000000); + } else if (checkStateFlg0(FLG0_UNK_4000000)) { + if (mpMorf->isStop() || checkSetAnime(0, ANM_CLING)) { + anm = ANM_CLING; + } else { + anm = ANM_LEADTOWAITA; + } + } else { + anm = ANM_LEADTOWAITA; + onStateFlg0(FLG0_UNK_4000000); + } + } else { + bVar3 = FALSE; + offStateFlg0(FLG0_UNK_4000000); + if (!tired && mMotionNum >= 31 && mMotionNum < 40 && !checkStateFlg0(FLG0_NO_DRAW)) { + static daMidna_ANM const motionTable[9] = { + ANM_WAITA, + ANM_CLING, + ANM_CLINGB, + ANM_WAITB, + ANM_TALKA, + ANM_HIT, + ANM_LOOKABOUT, + ANM_SWAITA, + ANM_SWAITD, + }; + anm = motionTable[mMotionNum - 31]; + offStateFlg0(FLG0_UNK_1000); + } else if (link->checkMidnaWolfDashAnime() && !tired) { + if ((mpMorf->isStop() && checkSetAnime(0, ANM_CLINGST)) || checkSetAnime(0, ANM_CLING)) + { + anm = ANM_CLING; + } else { + anm = ANM_CLINGST; + } + } else if ((link->checkMidnaDisappearMode() || (link->checkMidnaDigInAnime() && !tired)) + && checkMidnaRealBody()) { + anm = ANM_RETURN; + if (!checkSetAnime(0, ANM_RETURN)) { + offStateFlg0(FLG0_NO_DRAW); + } + bVar2 = TRUE; + } else if (dComIfGp_checkPlayerStatus1(0, 0x800000)) { + anm = ANM_WAITA; + offStateFlg0(FLG0_UNK_1); + } else if (tired) { + if (link->checkMidnaDigInAnime()) { + anm = ANM_DIGIN; + } else if (link->checkMidnaClingAnime() || link->checkMidnaLowClingAnime()) { + anm = ANM_CLINGD; + } else { + anm = ANM_WAITD; + } + } else if (link->checkMidnaLookAroundAnime()) { + if ((mpMorf->isStop() && checkSetAnime(0, ANM_ENTRANCE)) + || checkSetAnime(0, ANM_SWAITB)) + { + anm = ANM_SWAITB; + bVar2 = TRUE; + } else { + anm = ANM_ENTRANCE; + } + } else if (link->checkMidnaRopeWaitStaggerAnime()) { + anm = ANM_ROPEWAIT; + } else if (link->checkMidnaRopeMoveStaggerAnime()) { + anm = ANM_ROPEFALTER; + } else if (link->checkMidnaClingAnime()) { + anm = ANM_CLING; + } else if (link->checkMidnaLowClingAnime()) { + anm = ANM_CLINGB; + } else if (link->checkMidnaPanicAnime() || checkEndResetStateFlg0(ERFLG0_FORCE_PANIC)) { + anm = ANM_PANIC; + offStateFlg0(FLG0_UNK_1); + } else if (!checkStateFlg0(FLG0_UNK_1) && checkSetAnime(0, ANM_SWAITB) + && !mpMorf->isStop()) { + anm = ANM_SWAITB; + } else { + anm = ANM_WAITA; + } + } + + if (anm != ANM_WAITA && anm != ANM_LEADWAIT && anm != ANM_PANIC) { + offStateFlg0(FLG0_UNK_1); + } + if (anm == ANM_WAITA || anm == ANM_WAITB || anm == ANM_TALKA) { + onStateFlg0(FLG0_UNK_4); + } else { + offStateFlg0(FLG0_UNK_4); + } + + u16 sVar4 = mBckHeap[1].getIdx(); + u16 res_id = m_anmDataTable[anm].mResID; + + if (!mBckHeap[0].checkNoSetArcNo() || (!checkSetAnime(0, anm) && + (mMotionNum != 0 || !checkStateFlg0(FLG0_UNK_1) + || ((anm != ANM_WAITA || dComIfGp_event_runCheck()) && anm != ANM_LEADWAIT)))) + { + if (!mBckHeap[0].checkNoSetArcNo()) { + mBckHeap[0].resetArcNo(); + mBckHeap[0].resetIdx(); + mBckHeap[1].resetArcNo(); + mBckHeap[1].resetIdx(); + } + + if (anm == ANM_S_APPEAR || anm == ANM_S_APPEARBL) { + mSound.startCreatureSound(Z2SE_MIDNA_APPEAR, 0, -1); + } else if (anm == ANM_S_RETURN || anm == ANM_RETURN) { + mSound.startCreatureSound(Z2SE_MIDNA_DISAPPEAR, 0, -1); + } + + if (checkStateFlg0(FLG0_UNK_2)) { + offStateFlg0(FLG0_UNK_2); + } + + f32 morf; + if (bVar2 || checkEndResetStateFlg0(ERFLG0_FORCE_MORF_CANCEL)) { + morf = 0.0f; + } else { + morf = 5.0f; + } + J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id); + setBckAnime(bck, -1, morf); + + offStateFlg0(FLG0_UNK_1); + + if (checkStateFlg0(FLG0_UNK_2)) { + setUpperAnime(mBckHeap[0].getIdx(), 0xffff); + offStateFlg0(FLG0_UNK_2); + } + + if (anm == ANM_WARPIN) { + if (daPy_py_c::i_checkNowWolf()) { + u32 sound_id; + if (checkStateFlg1(FLG1_SIDE_WARP)) { + sound_id = Z2SE_MDN_WARP_IN_YOKO; + } else { + sound_id = Z2SE_MDN_WARP_IN_TATE; + } + mSound.startCreatureSound(sound_id, 0, -1); + } + + if (!checkStateFlg0(FLG0_PORTAL_OBJ_CALL)) { + cXyz pos; + mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_BACKBONE1), &pos); + f32 dist = pos.abs(current.pos); + f32 tmp = 19.0f * cM_scos(shape_angle.x); + current.pos.set(pos.x + tmp * cM_ssin(shape_angle.y), + pos.y - dist, + pos.z + tmp * cM_scos(shape_angle.y)); + } + } else if (anm == ANM_S_RETURN) { + current.pos.x += 90.0f * cM_ssin(shape_angle.y); + current.pos.z += 90.0f * cM_scos(shape_angle.y); + shape_angle.y += 0x8000; + field_0x85a = shape_angle.y; + current.angle.y = shape_angle.y; + mpMorf->getOldTransInfo()[JNT_BACKBONE1].mTranslate.z += 90.0f; + mpMorf->getOldTransInfo()[JNT_WAIST].mTranslate.z += 90.0f; + Quaternion* quat_backbone_ptr = &mpMorf->getOldQuaternion()[JNT_BACKBONE1]; + Quaternion quat1, quat2; + JMAEulerToQuat(0, 0x8000, 0, &quat1); + quat2 = *quat_backbone_ptr; + mDoMtx_QuatConcat(&quat1, &quat2, quat_backbone_ptr); + Quaternion* quat_waist_ptr = &mpMorf->getOldQuaternion()[JNT_WAIST]; + quat2 = *quat_waist_ptr; + mDoMtx_QuatConcat(&quat1, &quat2, quat_waist_ptr); + } else if (anm == ANM_WLSWIMDIE) { + J3DTransformInfo* trans_backbone = &mpMorf->getOldTransInfo()[JNT_BACKBONE1]; + J3DTransformInfo* trans_waist = &mpMorf->getOldTransInfo()[JNT_WAIST]; + trans_backbone->mTranslate.x = trans_waist->mTranslate.x = 0.9f; + trans_backbone->mTranslate.y = trans_waist->mTranslate.y = 36.060127f; + trans_backbone->mTranslate.z = trans_waist->mTranslate.z = -14.515757f; + } else if (anm == ANM_LEADTOWAITA && mDemoMode != 0xd && mDemoMode != 0xc) { + if (link->checkMidnaRide()) { + link->onMidnaRideShock(); + } + } else if (mDemoMode == 0xc) { + current.pos.y += 1000.0f; + } + + setUpperAnimeAndSe(anm); + + } else if (mMotionNum == 0 + && ((anm == ANM_WAITA && !dComIfGp_event_runCheck()) || anm == ANM_LEADWAIT)) + { + if (dComIfGp_checkPlayerStatus1(0, 0x800000)) { + onStateFlg0(FLG0_UNK_2); + offStateFlg0(FLG0_UNK_1); + if (setUpperAnimeAndSe(ANM_WAITTP)) { + mUpperBck.setLoopFrame(15.0); + mpMorf->setMorf(5.0f); + offStateFlg0(FLG0_UNK_80); + if (mpModel != NULL) { + setFaceBtp(0x3F8, FALSE); + } + } else if (mUpperBck.checkFrame(9.0f)) { + setRightHandShape(2); + } else if (mUpperBck.checkFrame(12.0f)) { + setLeftHandShape(0); + } + } else if (mDemoMode == 0x14) { + if (setUpperAnimeAndSe(ANM_GRAB)) { + mpMorf->setMorf(5.0f); + } + } else if (checkStateFlg0(FLG0_UNK_2)) { + offStateFlg0(FLG0_UNK_2); + setUpperAnime(mBckHeap[0].getIdx(), 0xffff); + mpMorf->setMorf(5.0f); + } else if (checkStateFlg0(FLG0_UNK_1)) { + if (mUpperBck.isStop() || mUpperBck.checkFrame(0.0f) + || mNeckAngle.x != 0 || mNeckAngle.y != 0 || bVar1 + || (checkSetAnime(0, ANM_SWAITC) && fabsf(speedF) > 0.1f)) + { + offStateFlg0(FLG0_UNK_1); + u16 res_id = m_anmDataTable[anm].mResID; + J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id); + setBckAnime(bck, J3DFrameCtrl::LOOP_REPEAT_e, 5.0f); + setUpperAnime(mBckHeap[0].getIdx(), 0xffff); + } else if (checkSetAnime(0, ANM_SWAITB) && mUpperBck.checkFrame(95.0f) + && fabsf(speedF) < 0.1f && cM_rnd() < 0.5f) + { + anm = ANM_SWAITC; + setUpperAnimeAndSe(ANM_SWAITC); + u16 res_id = m_anmDataTable[anm].mResID; + J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id); + setBckAnime(bck, J3DFrameCtrl::LOOP_ONCE_e, 0.0f); + } + } else if (daPy_py_c::i_checkNowWolf() && !bVar1 + && ((mNeckAngle.y == 0 && mNeckAngle.x == 0 && anm != ANM_LEADWAIT && cM_rnd() < 0.01f) + || (anm == ANM_LEADWAIT && !checkStateFlg0(FLG0_NO_HAIR_LEAD) && cM_rnd() < 0.0125f))) + { + onStateFlg0(FLG0_UNK_1); + if (anm == ANM_LEADWAIT) { + anm = ANM_LEADSWAIT; + } else { + f32 rnd; + if (fabsf(link->speedF) < 0.1f) { + rnd = cM_rndF(5.0f); + } else { + rnd = cM_rndF(4.0f); + } + if (rnd < 1.0f) { + anm = ANM_WAITB; + } else if (rnd < 2.0f) { + anm = ANM_SWAITB; + } else if (rnd < 3.0f) { + anm = ANM_SWAITD; + } else if (rnd < 4.0f) { + anm = ANM_LOOKABOUT; + } else { + anm = ANM_HIT; + } + } + u16 res_id = m_anmDataTable[anm].mResID; + setUpperAnimeAndSe(anm); + J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id); + setBckAnime(bck, J3DFrameCtrl::LOOP_ONCE_e, 5.0f); + } + + } else if (checkStateFlg0(FLG0_UNK_2)) { + offStateFlg0(FLG0_UNK_2); + setUpperAnime(mBckHeap[0].getIdx(), 0xffff); + mpMorf->setMorf(5.0f); + } + + if (sVar4 != mBckHeap[1].getIdx()) { + if (checkSetAnime(1, ANM_CLINGB) || checkSetAnime(1, ANM_CLING) + || checkSetAnime(1, ANM_GRAB) || checkSetAnime(1, ANM_GRABED) + || checkSetAnime(1, ANM_WAITB)) + { + setLeftHandShape(0); + setRightHandShape(2); + } else { + setLeftHandShape(0xFE); + setRightHandShape(0xFE); + } + } + + if (checkSetAnime(1, ANM_SWAITD)) { + if (mUpperBck.checkFrame(110.0f)) { + setLeftHandShape(0xFE); + setRightHandShape(0xFE); + } else if (mUpperBck.checkFrame(15.0f)) { + setLeftHandShape(0); + setRightHandShape(2); + } + } else if (checkSetAnime(1, ANM_GRABED) && mUpperBck.checkFrame(53.0f)) { + setLeftHandShape(0xFE); + setRightHandShape(0xFE); + } + + daMidna_ANM face_anm; + if (mDemoMode == 0x13) { + face_anm = ANM_GRABST; + } else if (mDemoMode == 0x14) { + face_anm = ANM_NONE; + } else if ((anm == ANM_LEADWAIT || anm == ANM_LEADSWAIT) && !checkStateFlg0(FLG0_NO_HAIR_LEAD) + && checkStateFlg0(FLG0_UNK_200)) { + face_anm = ANM_HAIR; + } else if (mDemoMode == 6) { + face_anm = ANM_S_WAITS; + } else if (mDemoMode == 7) { + face_anm = ANM_S_TAKES; + } else if (mDemoMode == 0xe) { + face_anm = ANM_S_PACKAWAY; + } else if (bVar3 || mFaceNum == 100) { + face_anm = ANM_NONE; + } else if (mFaceNum == 0x1f) { + face_anm = ANM_FTALKA; + } else if (mFaceNum == 0x20) { + face_anm = ANM_FTALKB; + } else if (mFaceNum == 0x21) { + face_anm = ANM_FTALKC; + } else if (mFaceNum == 0x22) { + face_anm = ANM_FTALKC2; + } else { + face_anm = ANM_NONE; + } + + if (checkHairOnlyAnime(face_anm) + || (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW) + && (sVar4 != mBckHeap[1].getIdx() || face_anm != ANM_NONE + || (face_anm == ANM_NONE && checkStateFlg0(FLG0_UNK_800000))))) { + if (face_anm == ANM_NONE) { + offStateFlg0(FLG0_UNK_800000); + mBckHeap[2].resetIdx(); + field_0x87e = JNT_HEAD; + } else { + setFaceAnime(m_anmDataTable[face_anm].mResID, 0xffff); + if (checkHairOnlyAnime(face_anm)) { + field_0x87e = JNT_CHIN; + mFaceBckTimer = 20; + } else { + field_0x87e = JNT_HEAD; + } + } + } else { + offStateFlg0(FLG0_UNK_800000); + mBckHeap[2].resetIdx(); + field_0x87e = JNT_HEAD; + } + + if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW) + && (!checkStateFlg0(FLG0_UNK_1) || anm != ANM_WAITA)) { + if (!mBtpHeap.checkNoSetArcNo()) { + mBtpHeap.resetArcNo(); + mBtpHeap.resetIdx(); + } + + u16 tex_id; + if (face_anm != ANM_NONE) { + tex_id = m_anmDataTable[face_anm].mTexID; + } else if (dComIfGp_checkPlayerStatus1(0, 0x800000)) { + tex_id = 0x10; + } else if (checkSetAnime(1, ANM_GRAB)) { + tex_id = 0x13; + } else { + tex_id = m_anmDataTable[anm].mTexID; + } + + setFaceBtp(m_texDataTable[tex_id].mBtpID, FALSE); + + if (!mBtkHeap.checkNoSetArcNo()) { + mBtkHeap.resetArcNo(); + mBtkHeap.resetIdx(); + } + + setFaceBtk(m_texDataTable[tex_id].mBtkID, FALSE); + + if (m_texDataTable[tex_id].mBtpID == 0x405) { + onStateFlg0(FLG0_UNK_40); + } else { + offStateFlg0(FLG0_UNK_40); + } + } + + BOOL local_c0 = mDemoMode == 0x14 || (anm >= ANM_DOOROPC && anm < ANM_FTALKA); + if (checkStateFlg0(FLG0_UNK_2) || local_c0 || field_0x87e == JNT_CHIN) { + onStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000)); + if (local_c0) { + onEndResetStateFlg0(ERFLG0_UNK_40); + } + } else if (anm == ANM_S_APPEAR || anm == ANM_S_APPEARBL || anm == ANM_RETURN + || (anm == ANM_WARPIN && mpMorf->getFrame() > 2.0f) || anm == ANM_S_RETURN) + { + onStateFlg0(FLG0_NO_HAIR_SCALE); + } } /* 804C287C-804C2A68 0066DC 01EC+00 1/1 0/0 0/0 .text getNeckAimAngle__9daMidna_cFPC4cXyzPsPsPsPs */ -void daMidna_c::getNeckAimAngle(cXyz const* param_0, s16* param_1, s16* param_2, s16* param_3, - s16* param_4) { - // NONMATCHING +s16 daMidna_c::getNeckAimAngle(cXyz const* i_atnPos, s16* o_neckX, s16* o_neckY, s16* o_eyeX, + s16* o_eyeY) { + cXyz eye_vec, atn_vec; + s16 offset_y = field_0x85a; + eye_vec = eyePos - mHeadCenterPos; + s16 eye_angle_x = eye_vec.atan2sY_XZ(); + s16 eye_angle_y = eye_vec.atan2sX_Z(); + s16 sVar1 = eye_angle_x - mNeckAngle.x; + s16 sVar2 = eye_angle_y - offset_y - mNeckAngle.y; + if (i_atnPos != NULL) { + atn_vec = *i_atnPos - mHeadCenterPos; + s16 atn_angle_x = atn_vec.atan2sY_XZ(); + s16 atn_angle_y = atn_vec.atan2sX_Z() - offset_y; + if ((atn_angle_y > 0x7000 && mNeckAngle.y < 0) || (atn_angle_y < -0x7000 && mNeckAngle.y > 0)) { + atn_angle_y *= -1; + } + s16 sVar7 = cLib_minMaxLimit((s16)atn_angle_x, -10000, 8000); + s16 sVar8 = cLib_minMaxLimit((s16)atn_angle_y, -20000, 20000); + *o_eyeX = (s16)(sVar7 - sVar1) >> 1; + *o_eyeY = (s16)(sVar8 - sVar2) >> 1; + *o_neckX = *o_eyeX; + *o_neckY = *o_eyeY; + *o_eyeX += (s16)(atn_angle_x - sVar7); + *o_eyeY += (s16)(atn_angle_y - sVar8); + } else { + *o_neckX = daAlink_getAlinkActorClass()->getProcNeckX(); + *o_neckY = daAlink_getAlinkActorClass()->getMidnaProcNeckY(); + } + return sVar2; } /* 804C2A68-804C2AB8 0068C8 0050+00 2/2 0/0 0/0 .text clearEyeMove__9daMidna_cFv */ void daMidna_c::clearEyeMove() { - // NONMATCHING + mpEyeMatAnm[0]->setNowOffsetX(0.0f); + mpEyeMatAnm[1]->setNowOffsetX(0.0f); + mpEyeMatAnm[0]->setNowOffsetY(0.0f); + mpEyeMatAnm[1]->setNowOffsetY(0.0f); + if (daMidna_matAnm_c::getEyeMoveFlg()) { + daMidna_matAnm_c::offEyeMoveFlg(); + daMidna_matAnm_c::setMorfFrame(3); + } } -/* ############################################################################################## */ -/* 804C69A8-804C69AC 0004E0 0004+00 0/1 0/0 0/0 .rodata @8185 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8185 = 75.0f; -COMPILER_STRIP_GATE(0x804C69A8, &lit_8185); -#pragma pop - -/* 804C69AC-804C69B0 0004E4 0004+00 0/1 0/0 0/0 .rodata @8186 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_8186 = 0x39000000; -COMPILER_STRIP_GATE(0x804C69AC, &lit_8186); -#pragma pop - -/* 804C69B0-804C69B4 0004E8 0004+00 0/1 0/0 0/0 .rodata @8187 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8187 = 8.0f; -COMPILER_STRIP_GATE(0x804C69B0, &lit_8187); -#pragma pop - -/* 804C69B4-804C69B8 0004EC 0004+00 0/1 0/0 0/0 .rodata @8188 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8188 = -1.0f / 5.0f; -COMPILER_STRIP_GATE(0x804C69B4, &lit_8188); -#pragma pop - -/* 804C69B8-804C69BC 0004F0 0004+00 0/1 0/0 0/0 .rodata @8189 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8189 = 1.0f / 5.0f; -COMPILER_STRIP_GATE(0x804C69B8, &lit_8189); -#pragma pop - -/* 804C69BC-804C69C0 0004F4 0004+00 0/1 0/0 0/0 .rodata @8190 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8190 = 3.0f / 100.0f; -COMPILER_STRIP_GATE(0x804C69BC, &lit_8190); -#pragma pop - /* 804C2AB8-804C2EBC 006918 0404+00 1/1 0/0 0/0 .text setEyeMove__9daMidna_cFPC4cXyzss */ -void daMidna_c::setEyeMove(cXyz const* param_0, s16 param_1, s16 param_2) { - // NONMATCHING +void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { + daAlink_c* link = daAlink_getAlinkActorClass(); + u8 timer = mEyeMoveTimer; + f32 move_x = mEyeMoveX; + f32 move_y = mEyeMoveY; + mEyeMoveTimer = cM_rndF(30.0f) + 75.0f; + mEyeMoveX = 0.0f; + mEyeMoveY = 0.0f; + + f32 tmp_y, tmp_x; + if (i_atnPos != NULL) { + tmp_y = i_angleX * (1.0f / 0x2000); + tmp_x = i_angleY * (1.0f / 0x2000); + } else if (link->getEyeMoveRateY() != 0.0f || link->getMidnaEyeMoveRateX() != 0.0f) { + tmp_y = link->getEyeMoveRateY(); + tmp_x = link->getMidnaEyeMoveRateX(); + } else if (!dComIfGp_event_runCheck() && checkStateFlg0(FLG0_UNK_40) + && !dComIfGp_checkPlayerStatus1(0, 0x800000) && fabsf(speedF) < 0.01f) + { + if (timer != 0) { + mEyeMoveTimer = timer - 1; + mEyeMoveX = move_x; + mEyeMoveY = move_y; + } else if (move_x != 0 || move_y != 0) { + if (cM_rnd() < 0.5f) { + mEyeMoveX = 0.0f; + mEyeMoveY = 0.0f; + } else { + s16 angle = cM_atan2s(mEyeMoveX, mEyeMoveY); + s16 angle2 = angle + (s16)((int)cM_rndF(3.0f) * 0x2000 + 0x6000); + mEyeMoveX = cM_ssin(angle2); + mEyeMoveY = cM_scos(angle2); + } + } else { + s16 angle = (s16)cM_rndF(8.0f) * 0x2000; + mEyeMoveX = cM_ssin(angle); + mEyeMoveY = cM_scos(angle); + } + tmp_x = mEyeMoveX; + tmp_y = mEyeMoveY; + } else { + clearEyeMove(); + return; + } + + if (daMidna_matAnm_c::getMorfFrame() == 0) { + if (tmp_x > 1.0f) { + tmp_x = 1.0f; + } else if (tmp_x < -1.0f) { + tmp_x = -1.0f; + } + if (tmp_y > 1.0f) { + tmp_y = 1.0f; + } else if (tmp_y < -1.0f) { + tmp_y = -1.0f; + } + + f32 target_lx, target_rx, target_ly, target_ry; + if (tmp_x > 0.0f) { + target_lx = tmp_x * -0.2f; + target_rx = tmp_x * 0.2f; + } else { + target_lx = tmp_x * -0.2f; + target_rx = tmp_x * 0.2f; + } + if (tmp_y > 0.0f) { + target_ly = tmp_y * 0.2f; + } else { + target_ly = tmp_y * 0.2f; + } + target_ry = target_ly; + + f32 fVar7 = JMAFastSqrt(tmp_x * tmp_x + tmp_y * tmp_y); + if (fVar7 > 1.0f) { + if (tmp_x * tmp_y < 0.0f) { + target_rx *= fabsf(tmp_x) / fVar7; + target_ry *= fabsf(tmp_y) / fVar7; + } else { + target_lx *= fabsf(tmp_x) / fVar7; + target_ly *= fabsf(tmp_y) / fVar7; + } + } + + daMidna_matAnm_c::onEyeMoveFlg(); + cLib_addCalc(mpEyeMatAnm[0]->getNowOffsetXP(), target_lx, 0.5f, 0.1f, 0.03f); + cLib_addCalc(mpEyeMatAnm[1]->getNowOffsetXP(), target_rx, 0.5f, 0.1f, 0.03f); + cLib_addCalc(mpEyeMatAnm[0]->getNowOffsetYP(), target_ly, 0.5f, 0.1f, 0.03f); + cLib_addCalc(mpEyeMatAnm[1]->getNowOffsetYP(), target_ry, 0.5f, 0.1f, 0.03f); + } } /* 804C2EBC-804C3168 006D1C 02AC+00 1/1 0/0 0/0 .text setNeckAngle__9daMidna_cFv */ void daMidna_c::setNeckAngle() { - // NONMATCHING + daAlink_c* link = daAlink_getAlinkActorClass(); + BOOL clear_eye_move = mBtkHeap.getIdx() != 0x3A4 && !mBtkHeap.checkNoSetIdx() + && mBtkHeap.getIdx() != 0x399; + s16 neck_x = 0; + s16 neck_y = 0; + s16 eye_x = 0; + s16 eye_y = 0; + cXyz* pos; + + if (field_0x84e == 2 || i_checkMidnaTired() || checkSetAnime(0, ANM_CLINGB) + || (checkStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000)) + && !checkEndResetStateFlg0(ERFLG0_UNK_100)) + || (clear_eye_move && !checkStateFlg0(FLG0_NO_DRAW)) + || (!checkStateFlg0(FLG0_UNK_1) && checkSetAnime(0, ANM_SWAITB))) + { + pos = NULL; + offStateFlg0(FLG0_FORCE_NECK_AIM); + } else if (checkStateFlg0(FLG0_FORCE_NECK_AIM)) { + pos = &mForceNeckAimPos; + offStateFlg0(FLG0_FORCE_NECK_AIM); + } else if (checkEndResetStateFlg0(ERFLG0_UNK_100)) { + pos = &link->eyePos; + } else if (checkShadowModelDrawSmode() && mDemoMode != 4 && mDemoMode != 7 && mDemoMode != 8 + && mDemoMode != 0x10 && mDemoMode != 3 && !checkStateFlg0(FLG0_WOLF_NO_POS)) { + pos = &link->eyePos; + } else if (link->checkMidnaAtnPos() && !checkSetAnime(0, ANM_LEADST) + && !checkSetAnime(0, ANM_LEADED)) { + if (checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))) { + pos = &link->eyePos; + } else { + pos = link->getMidnaAtnPos(); + } + } else { + pos = NULL; + } + + getNeckAimAngle(pos, &neck_x, &neck_y, &eye_x, &eye_y); + daPy_addCalcShort(&mNeckAngle.x, neck_x, 3, 0x1000, 0x100); + daPy_addCalcShort(&mNeckAngle.y, neck_y, 3, 0x1000, 0x100); + + if (clear_eye_move) { + clearEyeMove(); + } else { + setEyeMove(pos, eye_x, eye_y); + } } -/* ############################################################################################## */ -/* 804C69C0-804C69CC 0004F8 000C+00 0/1 0/0 0/0 .rodata localOffset$8274 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const localOffset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, 0xC0, 0x19, 0x99, 0x9A, -}; -COMPILER_STRIP_GATE(0x804C69C0, &localOffset); -#pragma pop - -/* 804C69CC-804C69D0 000504 0004+00 0/2 0/0 0/0 .rodata @8304 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8304 = 28.0f; -COMPILER_STRIP_GATE(0x804C69CC, &lit_8304); -#pragma pop - /* 804C3168-804C3298 006FC8 0130+00 1/1 0/0 0/0 .text initHairAngle__9daMidna_cFv */ void daMidna_c::initHairAngle() { - // NONMATCHING + static Vec const localOffset = {0.0f, 136.0f, -2.4f}; + MTXMultVec(mpShadowModel->getBaseTRMtx(), &localOffset, &mHairPos[0]); + mHairDir[0] = cXyz::Zero; + mHairAngleZ[0] = 0; + mHairAngleY[0] = 0; + mHairScale[0] = l_hairScale[0]; + for (int i = 1; i < 5; i++) { + mHairPos[i] = mHairPos[i - 1]; + mHairPos[i].y -= 28.0f; + mHairDir[i] = cXyz::Zero; + mHairAngleZ[i] = 0; + mHairAngleY[i] = 0; + mHairScale[i] = l_hairScale[i]; + } + onStateFlg0(FLG0_UNK_8); } -/* ############################################################################################## */ -/* 804C69D0-804C69DC 000508 000C+00 0/1 0/0 0/0 .rodata hairOffset$8310 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const hairOffset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xE0, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x804C69D0, &hairOffset); -#pragma pop - -/* 804C69DC-804C69E0 000514 0004+00 0/1 0/0 0/0 .rodata @8646 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8646 = 0.75f; -COMPILER_STRIP_GATE(0x804C69DC, &lit_8646); -#pragma pop - -/* 804C69E0-804C69E4 000518 0004+00 0/1 0/0 0/0 .rodata @8647 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8647 = 1.0f / 25.0f; -COMPILER_STRIP_GATE(0x804C69E0, &lit_8647); -#pragma pop - -/* 804C69E4-804C69E8 00051C 0004+00 0/1 0/0 0/0 .rodata @8648 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8648 = 2048.0f; -COMPILER_STRIP_GATE(0x804C69E4, &lit_8648); -#pragma pop - -/* 804C69E8-804C69EC 000520 0004+00 0/1 0/0 0/0 .rodata @8649 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8649 = 4096.0f; -COMPILER_STRIP_GATE(0x804C69E8, &lit_8649); -#pragma pop - -/* 804C69EC-804C69F0 000524 0004+00 0/1 0/0 0/0 .rodata @8650 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_8650 = 3.0f / 10.0f; -COMPILER_STRIP_GATE(0x804C69EC, &lit_8650); -#pragma pop - -/* 804C69F0-804C69F4 000528 0004+00 0/1 0/0 0/0 .rodata @8651 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_8651 = 0xBFDDB22D; -COMPILER_STRIP_GATE(0x804C69F0, &lit_8651); -#pragma pop - -/* 804C69F4-804C69F8 00052C 0004+00 0/1 0/0 0/0 .rodata @8652 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_8652 = 0xBF13CE53; -COMPILER_STRIP_GATE(0x804C69F4, &lit_8652); -#pragma pop - /* 804C3298-804C3F04 0070F8 0C6C+00 2/2 0/0 0/0 .text setHairAngle__9daMidna_cFv */ +// NONMATCHING regalloc void daMidna_c::setHairAngle() { - // NONMATCHING -} + if (!checkStateFlg0(FLG0_UNK_8)) { + initHairAngle(); + return; + } -/* ############################################################################################## */ -/* 804C6A60-804C6A60 000598 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_804C6C11 = "Midna"; -SECTION_DEAD static char const* const stringBase_804C6C17 = "pos"; -SECTION_DEAD static char const* const stringBase_804C6C1B = "speed"; -SECTION_DEAD static char const* const stringBase_804C6C21 = "angle"; -SECTION_DEAD static char const* const stringBase_804C6C27 = "npos"; -SECTION_DEAD static char const* const stringBase_804C6C2C = "fprm0"; -#pragma pop + cXyz prev_pos, head_dir; + mDoMtx_multVecSR(mpShadowModel->getAnmMtx(JNT_HEAD), &cXyz::BaseX, &head_dir); + mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_1), &prev_pos); + s16 head_angle = head_dir.atan2sX_Z(); + s16 inv_head_angle = head_angle + 0x8000; + + int i; + cXyz* pos = mHairPos; + cXyz* dir = mHairDir; + cXyz* scale = mHairScale; + s16* angle_z = mHairAngleZ; + s16* angle_y = mHairAngleY; + + f32 fVar4 = 0.75f; + f32 fVar1 = 0.05f; + BOOL bVar5 = false; + f32 fVar2 = fabsf(speedF) * 0.04f; + if (fVar2 > 1.0f) { + fVar2 = 1.0f; + } + s16 iVar16 = field_0x872; + BOOL bVar4 = false; + field_0x872 += fVar2 * 0x1000 + 0x800; + + cXyz* atn_pos = NULL; + daAlink_c* link = daAlink_getAlinkActorClass(); + if (link->checkMidnaHairAtnPos() && !i_checkMidnaTired() && !checkStateFlg0((daMidna_FLG0) + (FLG0_NO_HAIR_SCALE | FLG0_UNK_200000 | FLG0_TAG_WAIT | FLG0_UNK_100))) { + atn_pos = link->getMidnaHairAtnPos(); + onStateFlg0(FLG0_UNK_10000000); + } else { + offStateFlg0(FLG0_UNK_10000000); + } + + for (i = 0; i < 5; i++, pos++, dir++, angle_z++, angle_y++, scale++) { + cXyz vec, old_pos; + + if (checkStateFlg0(FLG0_UNK_10000000)) { + cXyz target = l_hairScale[4]; + cLib_chasePos(scale, target, 0.1f); + } else { + cXyz target = l_hairScale[i]; + cLib_chasePos(scale, target, 0.1f); + } + + old_pos = *pos; + + if (checkStateFlg0(FLG0_UNK_200000)) { + if (i == 4) { + mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HAIR_5), &cXyz::BaseX, pos); + } else { + mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_2 + i), pos); + } + old_pos = *pos; + vec = *pos - prev_pos; + *angle_z = cM_atan2s(-vec.y, -vec.z); + *angle_y = cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z)); + prev_pos = *pos; + } else if (atn_pos != NULL) { + vec = *atn_pos - prev_pos; + mDoMtx_stack_c::YrotS(-shape_angle.y); + mDoMtx_stack_c::multVec(&vec, &vec); + s16 target_angle_y = fVar1 * cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z)); + if (i == 0 && (vec.z < 0.0f || vec.y >= 0.0f)) { + bVar4 = true; + } + s16 target_angle_z; + if (bVar4) { + if (vec.y < 1.0f && i < 4) { + vec.y = 1.0f; + } + target_angle_z = fVar1 * cM_atan2s(-vec.y, -vec.z) - (1.0f - fVar1) * 0x4000; + } else { + target_angle_z = fVar1 * (cM_atan2s(-vec.y, -vec.z) - 0x10000) - (1.0f - fVar1) * 0x4000; + } + cLib_addCalcAngleS(angle_z, target_angle_z, 5, 0x1800, 0x100); + cLib_addCalcAngleS(angle_y, target_angle_y, 5, 0x1800, 0x100); + fVar1 += 0.3f; + if (fVar1 > 1.0f) { + fVar1 = 1.0f; + } + } else { + vec = *pos - prev_pos + *dir; + vec += daAlink_getAlinkActorClass()->getWindSpeed(); + if (checkEndResetStateFlg0(ERFLG0_UNK_20)) { + vec = cXyz::Zero; + } + vec.y -= 2.0f; + vec.y += fVar2 * (cM_rndFX(3.0f) + 3.0f) * cM_ssin(iVar16); + mDoMtx_stack_c::YrotS(-head_angle); + mDoMtx_stack_c::multVec(&vec, &vec); + if (vec.abs() < 1.0f) { + if (i == 0) { + cLib_addCalcAngleS(angle_z, 0, 5, 0x1800, 0x100); + cLib_addCalcAngleS(angle_y, 0, 5, 0x1800, 0x100); + } else { + cLib_addCalcAngleS(angle_z, 0, 5, 0x1800, 0x100); + cLib_addCalcAngleS(angle_y, 0, 5, 0x1800, 0x100); + } + } else { + if (i == 0) { + if (vec.z > 0.0f) { + vec.z *= -1.0f; + } + f32 fVar21 = vec.absXZ(); + if (fVar21 < vec.y * -1.732f) { + if (fVar21 < 1.0f) { + vec.x = 0.0f; + vec.z = -1.0f; + vec.y = -0.577367f; + } else { + if (fabsf(speedF) < 0.1f) { + vec.x *= 0.5f; + fVar21 = vec.absXZ(); + } + vec.y = fVar21 * -0.577367f; + } + bVar5 = true; + } + } + *angle_y = cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z)); + if (i == 4) { + *angle_z = cM_atan2s(-vec.y, -vec.z); + } else { + *angle_z = 0; + } + } + iVar16 -= (fVar2 * 0x1000 + 0x800); + } + + static Vec const hairOffset = {0.0f, 0.0f, 28.0f}; + if (!checkStateFlg0(FLG0_UNK_200000)) { + mDoMtx_stack_c::transS(prev_pos); + mDoMtx_stack_c::YrotM(inv_head_angle); + mDoMtx_stack_c::XrotM(*angle_z); + mDoMtx_stack_c::YrotM(-*angle_y); + mDoMtx_stack_c::scaleM(*scale); + mDoMtx_stack_c::multVec(&hairOffset, pos); + } + + if (checkEndResetStateFlg0(ERFLG0_UNK_20)) { + *dir = cXyz::Zero; + } else { + *dir = (*pos - old_pos) * fVar4; + if (bVar5) { + *dir *= 0.5f; + } + } + + prev_pos = *pos; + fVar4 -= 0.1f; + } +} /* 804C3F04-804C4394 007D64 0490+00 1/1 0/0 0/0 .text setDemoData__9daMidna_cFv */ void daMidna_c::setDemoData() { - // NONMATCHING + if (!dComIfGp_event_runCheck()) { + mStaffID = -1; + } else { + mStaffID = dComIfGp_evmng_getMyStaffId("Midna", this, 0); + } + + if (dComIfGp_getEvent().isOrderOK()) { + if (mDemoType != 0) { + mDemoType = 0; + mDemoMode = 0; + field_0x8dc = 0.0f; + endHighModel(); + if (mLeftHandShapeIdx == 0xfd) { + mLeftHandShapeIdx = 0xfe; + } + if (mRightHandShapeIdx == 0xfd) { + mRightHandShapeIdx = 0xfe; + } + offStateFlg1((daMidna_FLG1)(FLG1_SHADOW_NO_DRAW | FLG1_NO_MASK_DRAW | FLG1_UNK_40 + | FLG1_UNK_20 | FLG1_UNK_10 | FLG1_FORCE_NORMAL_COL + | FLG1_FORCE_TIRED_COL | FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE + | FLG1_UNK_1)); + } + + offStateFlg0((daMidna_FLG0)(FLG0_UNK_2000000 | FLG0_UNK_1000000)); + + if (mpDemoFCBlendBrk != NULL) { + if (mpDemoFCBlendBmd != NULL) { + mpDemoFCBlendBmd->getModelData()->removeTevRegAnimator(mpDemoFCBlendBrk); + } + mpDemoFCBlendBrk = NULL; + } + field_0x668 = NULL; + + } else { + dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID); + if (demo_actor != NULL) { + demo_actor->setModel(mpShadowModel); + + if (mDemoType != 1) { + mDemoType = 1; + onStateFlg0(FLG0_WOLF_NO_POS); + } + + if (demo_actor->checkEnable(0x20)) { + mDemoMode = demo_actor->getAnmId(); + } + + if (demo_actor->checkEnable(2)) { + current.pos = demo_actor->getTrans(); + } + + if (demo_actor->checkEnable(8)) { + shape_angle.x = 0; + shape_angle.y = demo_actor->getRatate().y; + shape_angle.z = 0; + } + + } else if (mStaffID != -1) { + if (mDemoType != 2) { + mDemoType = 2; + } + + char* cut_name = dComIfGp_getPEvtManager()->getMyNowCutName(mStaffID); + if (cut_name != NULL) { + mDemoMode = (cut_name[0] - 0x30) * 10 + (cut_name[1] - 0x30); + + cXyz* pos = dComIfGp_evmng_getMyXyzP(mStaffID, "pos"); + if (pos != NULL) { + mDemoPos = *pos; + } else { + mDemoPos = current.pos; + } + + f32* speed = dComIfGp_evmng_getMyFloatP(mStaffID, "speed"); + if (speed != NULL) { + mDemoSpeed = *speed; + } else { + mDemoSpeed = 5.0f; + } + + int* angle = dComIfGp_evmng_getMyIntegerP(mStaffID, "angle"); + if (angle != NULL) { + mDemoAngle = *angle; + } else { + mDemoAngle = shape_angle.y; + } + + cXyz* npos = dComIfGp_evmng_getMyXyzP(mStaffID, "npos"); + if (npos != NULL) { + setForceNeckAimPos(*npos); + } + + f32* fprm0 = dComIfGp_evmng_getMyFloatP(mStaffID, "fprm0"); + if (fprm0 != NULL) { + field_0x8dc = *fprm0; + } else { + field_0x8dc = 0.0f; + } + + } else { + mDemoMode = 1; + } + + if (!checkMidnaRealBody() && !checkShadowModelDrawSmode() + && (mDemoMode == 9 || mDemoMode == 0xb || mDemoMode == 0xd || mDemoMode == 0xc)) + { + mDemoMode = 1; + } else if (mDemoMode == 0xd) { + offStateFlg0(FLG0_WOLF_NO_POS); + } + + if ((mDemoMode == 1 || mDemoMode == 0xb || (mDemoMode == 2 && field_0x84e == 3))) { + dComIfGp_evmng_cutEnd(mStaffID); + if (mDemoMode == 1) { + offStateFlg0(FLG0_WOLF_NO_POS); + } + } + } + } } /* 804C4394-804C4444 0081F4 00B0+00 1/1 0/0 0/0 .text setSimpleBrk__9daMidna_cFP12J3DModelDataUs */ -void daMidna_c::setSimpleBrk(J3DModelData* param_0, u16 param_1) { - // NONMATCHING +J3DAnmTevRegKey* daMidna_c::setSimpleBrk(J3DModelData* i_modelData, u16 i_idx) { + J3DAnmTevRegKey* brk = static_cast(dComIfG_getObjectRes(l_arcName, i_idx)); + if (brk == NULL) { + return NULL; + } + brk->searchUpdateMaterialID(i_modelData); + i_modelData->entryTevRegAnimator(brk); + brk->setFrame(brk->getFrameMax() - 0.001f); + return brk; } /* 804C4444-804C44CC 0082A4 0088+00 1/1 0/0 0/0 .text setSimpleBtk__9daMidna_cFP12J3DModelDataUs */ -void daMidna_c::setSimpleBtk(J3DModelData* param_0, u16 param_1) { - // NONMATCHING +J3DAnmTextureSRTKey* daMidna_c::setSimpleBtk(J3DModelData* i_modelData, u16 i_idx) { + J3DAnmTextureSRTKey* btk = + static_cast(dComIfG_getObjectRes(l_arcName, i_idx)); + if (btk == NULL) { + return NULL; + } + btk->searchUpdateMaterialID(i_modelData); + i_modelData->entryTexMtxAnimator(btk); + btk->setFrame(0.0f); + return btk; } /* 804C44CC-804C4750 00832C 0284+00 1/1 0/0 0/0 .text initMidnaModel__9daMidna_cFv */ void daMidna_c::initMidnaModel() { - // NONMATCHING + daAlink_c* link = daAlink_getAlinkActorClass(); + if (checkStateFlg1(FLG1_UNK_1)) { + if (mpDemoBDTmpBmd != NULL && mpModel != mpDemoBDTmpBmd) { + mpModel = mpDemoBDTmpBmd; + mpMaskBmd = mpDemoBDMaskBmd; + mpHandsBmd = mpDemoBDHandsBmd; + mpHairhandBmd = mpDemoBDHairhandBmd; + if (mpLeftHandShape != NULL) { + mpLeftHandShape->hide(); + } + mpLeftHandShape = mpModel->getModelData()->getMaterialNodePointer(6)->getShape(); + if (mpRightHandShape != NULL) { + mpRightHandShape->hide(); + } + mpRightHandShape = mpModel->getModelData()->getMaterialNodePointer(7)->getShape(); + mBtpHeap.initData(); + mBtkHeap.initData(); + } + } else { + if (mpDemoBDTmpBmd != NULL && mpModel == mpDemoBDTmpBmd) { + if (mpLeftHandShape != NULL) { + mpLeftHandShape->hide(); + } + if (mpRightHandShape != NULL) { + mpRightHandShape->hide(); + } + mpModel = NULL; + mpMaskBmd = NULL; + mpHandsBmd = NULL; + mpHairhandBmd = NULL; + mpLeftHandShape = NULL; + mpRightHandShape = NULL; + mBtpHeap.initData(); + mBtkHeap.initData(); + } + + J3DModel* midna_model = link->getMidnaModel(); + if (mpModel != NULL) { + if (midna_model == NULL && !checkStateFlg1(FLG1_UNK_1)) { + mpModel = NULL; + mpMaskBmd = NULL; + mpHandsBmd = NULL; + mpHairhandBmd = NULL; + mpLeftHandShape = NULL; + mpRightHandShape = NULL; + } + } else if (midna_model != NULL) { + mpModel = midna_model; + mpMaskBmd = link->getMidnaMaskModel(); + mpHandsBmd = link->getMidnaHandModel(); + mpHairhandBmd = link->getMidnaHairHandModel(); + J3DModelData* model_data = mpModel->getModelData(); + mpLeftHandShape = model_data->getMaterialNodePointer(6)->getShape(); + mpRightHandShape = model_data->getMaterialNodePointer(7)->getShape(); + model_data->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]); + model_data->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]); + mpEyeMatAnm[0]->init(); + mpEyeMatAnm[1]->init(); + J3DModelData* hand_model_data = mpHandsBmd->getModelData(); + for (u16 i = 0; i < 4; i++) { + hand_model_data->getMaterialNodePointer(i)->getShape()->hide(); + } + mBtpHeap.initData(); + mBtkHeap.initData(); + } + } } -/* ############################################################################################## */ -/* 804C69F8-804C69FC 000530 0004+00 0/1 0/0 0/0 .rodata @9021 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9021 = 700.0f; -COMPILER_STRIP_GATE(0x804C69F8, &lit_9021); -#pragma pop - /* 804C4750-804C49B8 0085B0 0268+00 2/2 0/0 0/0 .text daMidna_searchNpc__FP10fopAc_ac_cPv */ -static void daMidna_searchNpc(fopAc_ac_c* param_0, void* param_1) { - // NONMATCHING +static void* daMidna_searchNpc(fopAc_ac_c* i_actor, void* o_far) { + daAlink_c* link = daAlink_getAlinkActorClass(); + cXyz link_pos = link->current.pos; + link_pos.y += 100.0f; + if (fopAcM_GetGroup(i_actor) == fopAc_NPC_e && !fopAcM_checkStatus(i_actor, 0x8000000) + && fabsf(link_pos.y - i_actor->eyePos.y) <= 700.0f) + { + f32 dist = i_actor->eyePos.absXZ(link_pos); + if (dist <= link->getMetamorphoseNearDis()) { + *(BOOL*)o_far = FALSE; + } else { + if (dist <= link->getMetamorphoseFarDis() + && fopAcM_seenPlayerAngleY(i_actor) <= link->getMetamorphoseFarAngle()) + { + *(BOOL*)o_far = TRUE; + } else { + return NULL; + } + } + if (!fopAcM_lc_c::lineCheck(&i_actor->eyePos, &link_pos, i_actor)) { + return i_actor; + } + } + return NULL; } /* 804C49B8-804C4AE8 008818 0130+00 2/2 0/0 0/0 .text setMidnaNoDrawFlg__9daMidna_cFv */ void daMidna_c::setMidnaNoDrawFlg() { - // NONMATCHING + if ((!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)) + && (!checkAppear() || !checkMidnaRealBody())) || daAlink_c::checkCloudSea()) + { + onStateFlg0(FLG0_NO_DRAW); + } else if (!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)) + && daAlink_getAlinkActorClass()->checkPlayerNoDraw() + && !checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))) + { + onStateFlg0((daMidna_FLG0)(FLG0_UNK_10000 | FLG0_NO_DRAW)); + } else { + if (checkStateFlg0(FLG0_NO_DRAW) + && !checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)) + && !checkStateFlg0(FLG0_UNK_10000)) + { + onStateFlg0(FLG0_UNK_1000); + } + offStateFlg0((daMidna_FLG0)(FLG0_UNK_10000 | FLG0_NO_DRAW)); + } } /* 804C4AE8-804C4B68 008948 0080+00 1/0 0/0 0/0 .text checkMetamorphoseEnableBase__9daMidna_cFv */ -void daMidna_c::checkMetamorphoseEnableBase() { - // NONMATCHING +BOOL daMidna_c::checkMetamorphoseEnableBase() { + BOOL tmp; + if (!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) + || !dComIfGs_isEventBit(0xd04) || fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp)) + { + return FALSE; + } + return TRUE; } /* 804C4B68-804C4BC0 0089C8 0058+00 1/1 0/0 0/0 .text checkNoDrawState__9daMidna_cFv */ -void daMidna_c::checkNoDrawState() { - // NONMATCHING +BOOL daMidna_c::checkNoDrawState() { + return mDemoMode == 0xb || checkStateFlg0(FLG0_UNK_400000) || checkStateFlg1(FLG1_UNK_20) + || (checkStateFlg0(FLG0_NO_DRAW) && !checkShadowModelDrawSmode()); } -/* ############################################################################################## */ -/* 804C69FC-804C6A1C 000534 0020+00 0/1 0/0 0/0 .rodata anmSoundLabel$9101 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const anmSoundLabel[32] = { - 0x00, 0x06, 0x00, 0xDE, 0x00, 0x06, 0x00, 0xDF, 0x00, 0x06, 0x00, 0xE9, 0x00, 0x06, 0x00, 0xEA, - 0x00, 0x06, 0x00, 0xEB, 0x00, 0x06, 0x00, 0xEC, 0x00, 0x06, 0x00, 0xE0, 0x00, 0x06, 0x00, 0xE1, -}; -COMPILER_STRIP_GATE(0x804C69FC, &anmSoundLabel); -#pragma pop - -/* 804C6A1C-804C6A20 000554 0004+00 0/1 0/0 0/0 .rodata @9219 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9219 = 83.0f; -COMPILER_STRIP_GATE(0x804C6A1C, &lit_9219); -#pragma pop - -/* 804C6A20-804C6A24 000558 0004+00 0/1 0/0 0/0 .rodata @9220 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9220 = 99.0f; -COMPILER_STRIP_GATE(0x804C6A20, &lit_9220); -#pragma pop - -/* 804C6A24-804C6A28 00055C 0004+00 0/1 0/0 0/0 .rodata @9221 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9221 = 66.0f; -COMPILER_STRIP_GATE(0x804C6A24, &lit_9221); -#pragma pop - -/* 804C6A28-804C6A2C 000560 0004+00 0/1 0/0 0/0 .rodata @9222 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9222 = 11.0f; -COMPILER_STRIP_GATE(0x804C6A28, &lit_9222); -#pragma pop - -/* 804C6A2C-804C6A30 000564 0004+00 0/1 0/0 0/0 .rodata @9223 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9223 = 35.0f; -COMPILER_STRIP_GATE(0x804C6A2C, &lit_9223); -#pragma pop - -/* 804C6A30-804C6A34 000568 0004+00 0/1 0/0 0/0 .rodata @9224 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9224 = 67.0f; -COMPILER_STRIP_GATE(0x804C6A30, &lit_9224); -#pragma pop - -/* 804C6A34-804C6A38 00056C 0004+00 0/1 0/0 0/0 .rodata @9225 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9225 = 34.0f; -COMPILER_STRIP_GATE(0x804C6A34, &lit_9225); -#pragma pop - /* 804C4BC0-804C4FDC 008A20 041C+00 1/1 0/0 0/0 .text setSound__9daMidna_cFv */ void daMidna_c::setSound() { - // NONMATCHING + static u32 const anmSoundLabel[4][2] = { + Z2SE_MDN_HIP, Z2SE_MDN_HIP_WTR, + Z2SE_MDN_HAND, Z2SE_MDN_HAND_WTR, + Z2SE_MDN_LEG, Z2SE_MDN_LEG_WTR, + Z2SE_MDN_LAND, Z2SE_MDN_LAND_WTR, + }; + + int idx = 4; + if (mDemoMode == 0xb || checkStateFlg1(FLG1_UNK_20) + || (checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg0(FLG0_UNK_10000) + && !checkShadowModelDrawSmode())) + { + return; + } + + if (mUpperBck.checkFrame(mVoiceFrame)) { + mSound.startCreatureVoice(mSoundID, -1); + } + + if (checkSetAnime(1, ANM_SWAITB)) { + if (mUpperBck.checkFrame(83.0f)) { + mSound.startCreatureVoice(Z2SE_MDN_V_SWAITB_3, -1); + } else if (mUpperBck.checkFrame(24.0f) || mUpperBck.checkFrame(99.0f)) { + idx = 0; + } + } else if (checkSetAnime(1, ANM_ROPEWAIT)) { + if (mUpperBck.checkFrame(66.0f)) { + mSound.startCreatureVoice(Z2SE_MDN_V_ROPEWAIT_2, -1); + } + } else if (checkSetAnime(1, ANM_CLINGST)) { + if (mUpperBck.checkFrame(11.0f)) { + idx = 0; + } + } else if (checkSetAnime(1, ANM_LEADTOWAITA)) { + if (mUpperBck.checkFrame(2.0f)) { + idx = 0; + } + } else if (checkSetAnime(1, ANM_HIT)) { + if (mUpperBck.checkFrame(10.0f) || mUpperBck.checkFrame(11.0f)) { + idx = 1; + } else if (mUpperBck.checkFrame(28.0f) || mUpperBck.checkFrame(35.0f)) { + idx = 2; + } + } else if (checkSetAnime(1, ANM_SWAITC)) { + if (mUpperBck.checkFrame(2.0f)) { + idx = 3; + } else if (mUpperBck.checkFrame(67.0f)) { + idx = 0; + } + } else if (checkSetAnime(1, ANM_DIGIN)) { + if (mUpperBck.checkFrame(19.0f) || mUpperBck.checkFrame(24.0f) + || mUpperBck.checkFrame(34.0f)) { + idx = 1; + } + } else if (checkSetAnime(1, ANM_WAITTP)) { + if (mUpperBck.checkFrame(9.0f) || mUpperBck.checkFrame(12.0f)) { + idx = 1; + } + } + + if (idx != 4) { + u32 sound_id = anmSoundLabel[idx][dComIfGp_checkPlayerStatus0(0, 0x100000) ? 1 : 0]; + mSound.startCreatureSound(sound_id, 0, -1); + } + + if (checkStateFlg1(FLG1_UNK_800)) { + mSound.updateAnime(mpMorf->getFrame(), mpMorf->getPlaySpeed()); + } + + if (i_checkMidnaTired() && !dComIfGp_checkPlayerStatus0(0, 0x20000000)) { + mSound.startCreatureVoiceLevel(Z2SE_MDN_V_WAITD, -1); + } } -/* ############################################################################################## */ -/* 804C6A38-804C6A44 000570 000C+00 0/1 0/0 0/0 .rodata throughEffectJoint$9352 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const throughEffectJoint[12] = { - 0x00, 0x04, 0x00, 0x02, 0x00, 0x14, 0x00, 0x04, 0x00, 0x02, 0x00, 0x14, -}; -COMPILER_STRIP_GATE(0x804C6A38, &throughEffectJoint); -#pragma pop - -/* 804C6A44-804C6A50 00057C 000C+00 0/1 0/0 0/0 .rodata throughEffectName$9353 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const throughEffectName[12] = { - 0x84, 0xDA, 0x84, 0xD9, 0x84, 0xDB, 0x84, 0xDD, 0x84, 0xDC, 0x84, 0xDE, -}; -COMPILER_STRIP_GATE(0x804C6A44, &throughEffectName); -#pragma pop - /* 804C4FDC-804C59E8 008E3C 0A0C+00 1/1 0/0 0/0 .text execute__9daMidna_cFv */ -void daMidna_c::execute() { - // NONMATCHING +int daMidna_c::execute() { + daAlink_c* link = daAlink_getAlinkActorClass(); + if (!link->checkMetamorphose()) { + if (daPy_py_c::i_checkNowWolf()) { + onStateFlg0(FLG0_UNK_40000000); + } else { + offStateFlg0(FLG0_UNK_40000000); + } + } + initMidnaModel(); + field_0x85a = shape_angle.y; + setDemoData(); + offStateFlg0(FLG0_NO_INPUT); + if (checkStateFlg0(FLG0_TAG_WAIT) && (link->checkMidnaUseAbility() + || checkSetAnime(0, ANM_LEADTOWAITA) + || eventInfo.checkCommandTalk())) { + offStateFlg0((daMidna_FLG0)(FLG0_PORTAL_OBJ_CALL | FLG0_TAG_WAIT | FLG0_UNK_200)); + } + daMidna_matAnm_c::decMorfFrame(); + checkMidnaPosState(); + if (daPy_py_c::i_checkFirstMidnaDemo() && !checkStateFlg0(FLG0_WOLF_NO_POS)) { + link->onMidnaRide(); + } else { + link->offMidnaRide(); + } + setMidnaNoDrawFlg(); + + fopAc_ac_c* talk_partner = fopAcM_getTalkEventPartner(link); + if (checkStateFlg0(FLG0_NO_DRAW) + && (eventInfo.checkCommandTalk() + || checkStateFlg0(FLG0_WOLF_NO_POS) + || mDemoMode == 2 + || (dComIfGp_event_runCheck() + && talk_partner != NULL + && (checkStateFlg0(FLG0_UNK_2000000) + || fopAcM_GetName(talk_partner) == PROC_Tag_Mhint + || fopAcM_GetName(talk_partner) == PROC_Tag_Mstop + || fopAcM_GetName(talk_partner) == PROC_Tag_Mwait)))) { + if (mDemoMode == 3 || mDemoMode == 0x10 || mDemoMode == 4 || mDemoMode == 6 || + mDemoMode == 7 || mDemoMode == 0xe || mDemoMode == 0x13 || mDemoMode == 8) + { + field_0x84e = 3; + } else if (field_0x84e == 0) { + if (checkStateFlg0(FLG0_WOLF_NO_POS)) { + field_0x84e = 3; + } else { + field_0x84e = 1; + if (link->initShadowScaleLight()) { + onStateFlg0(FLG0_UNK_80000); + } else { + offStateFlg0(FLG0_UNK_80000); + } + } + } else if (field_0x84e == 1) { + if (link->moveShadowScaleLight()) { + field_0x84e = 2; + } + } else if (field_0x84e == 2) { + link->moveShadowScaleLight(); + if (mpMorf->isStop()) { + field_0x84e = 3; + } + } else if (field_0x84e == 3 && checkStateFlg0(FLG0_UNK_1000000)) { + offStateFlg0(FLG0_UNK_1000000); + field_0x84e = 4; + } else if (field_0x84e == 4) { + if (mpMorf->isStop()) { + field_0x84e = 5; + } + } else if (field_0x84e == 5 && checkStateFlg0(FLG0_WOLF_NO_POS)) { + field_0x84e = 3; + } + } else { + field_0x84e = 0; + } + + if (checkSetAnime(0, ANM_LEADTOWAITA) && mpMorf->checkFrame(2.0f) && daPy_py_c::i_checkNowWolf() + && mpKago == NULL) { + dComIfGp_getVibration().StartShock(2, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + } + allAnimePlay(); + setAnm(); + setHairAngle(); + setMatrix(); + mpMorf->modelCalc(); + setRoomInfo(); + setNeckAngle(); + if (checkEndResetStateFlg0(ERFLG0_UNK_20)) { + setHairAngle(); + } + setBodyPartMatrix(); + setBodyPartPos(); + mSound.framework(0, mReverb); + + if (eventInfo.checkCommandTalk()) { + if (!checkShadowModeTalkWait() || fopAcM_getTalkEventPartner(link) == this) { + if (!checkStateFlg0(FLG0_UNK_8000)) { + offStateFlg0((daMidna_FLG0)(FLG0_NPC_NEAR | FLG0_NPC_FAR)); + BOOL far; + if (fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &far)) { + if (!far) { + onStateFlg0(FLG0_NPC_NEAR); + } else { + onStateFlg0(FLG0_NPC_FAR); + } + } + onStateFlg0(FLG0_UNK_8000); + mMsgFlow.init(this, 0xbb9, 0, NULL); + } else if (mMsgFlow.doFlow(this, NULL, 0)) { + int item_id; + u16 event_id = mMsgFlow.getEventId(&item_id); + if (checkStateFlg0(FLG0_NO_DRAW)) { + if (field_0x84e == 3) { + field_0x84e = 4; + } else { + onStateFlg0(FLG0_UNK_1000000); + } + } + if (event_id == 4 || event_id == 5) { + dComIfGp_getEvent().reset(this); + offStateFlg0(FLG0_UNK_8000); + fopAcM_orderPotentialEvent(this, 0x400, 0xffff, 1); + link->changeOriginalDemo(); + if (event_id == 4) { + link->changeDemoMode(0x3a, 0, 0, 0); + if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)) { + changeOriginalDemo(); + changeDemoMode(0xf); + } + } else { + link->changeDemoMode(0x39, 0, 0, 0); + } + if (checkStateFlg0(FLG0_NO_DRAW)) { + onStateFlg0(FLG0_UNK_2000000); + } + } else if (!checkStateFlg0(FLG0_NO_DRAW) + || (checkSetAnime(0, ANM_S_RETURN) && mpMorf->isStop())) { + if (event_id == 0xb) { + dMeter2Info_setPauseStatus(6); + link->onPortalWarpMidnaAtnKeep(); + } else { + link->onMidnaTalkPolySpeed(); + } + dComIfGp_getEvent().reset(this); + offStateFlg0(FLG0_UNK_8000); + } + } + } + } else if (eventInfo.i_checkCommandDemoAccrpt() && !link->checkMetamorphose()) { + dComIfGp_getEvent().reset(this); + } + + if (link->checkMidnaRide()) { + eventInfo.i_onCondition(1); + } + + if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)) { + cXyz pos; + if (checkSetAnime(0, ANM_LEADST)) { + mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_BACKBONE1), &pos); + mParticleKey1 = dComIfGp_particle_set(mParticleKey1, 0x8397, &pos, &tevStr, &shape_angle, + NULL, 0xff, NULL, -1, NULL, NULL, 0); + mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_HAIR_1), &pos); + mParticleKey2 = dComIfGp_particle_set(mParticleKey2, 0x8398, &pos, &tevStr, &shape_angle, + NULL, 0xff, NULL, -1, NULL, NULL, 0); + } + if (checkStateFlg0(FLG0_UNK_400000)) { + static s16 const throughEffectJoint[6] = + { JNT_HEAD, JNT_BACKBONE2, JNT_WAIST, JNT_HEAD, JNT_BACKBONE2, JNT_WAIST }; + static u16 const throughEffectName[6] = + { 0x84da, 0x84d9, 0x84db, 0x84dd, 0x84dc, 0x84de }; + int i; + u32* particle_key = mThroughEffectKey; + for (i = 0; i < 6; i++, particle_key++) { + mDoMtx_multVecZero(mpModel->getAnmMtx(throughEffectJoint[i]), &pos); + *particle_key = dComIfGp_particle_set(*particle_key, throughEffectName[i], &pos, + &tevStr, &shape_angle, NULL, 0xff, NULL, -1, + NULL, NULL, 0); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(*particle_key); + if (emitter != NULL && emitter->isEnableDeleteEmitter()) { + offStateFlg0(FLG0_UNK_400000); + } + } + } else { + for (int i = 0; i < 6; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mThroughEffectKey[i]); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + } + } + } else { + offStateFlg0(FLG0_UNK_400000); + } + + mEndResetStateFlg0 = 0; + link->clearMidnaMsgNum(); + setSound(); + return 1; } /* 804C59E8-804C5A08 009848 0020+00 1/0 0/0 0/0 .text daMidna_Execute__FP9daMidna_c */ -static void daMidna_Execute(daMidna_c* param_0) { - // NONMATCHING +static int daMidna_Execute(daMidna_c* i_this) { + return i_this->execute(); } -/* ############################################################################################## */ -/* 804C6A50-804C6A54 000588 0004+00 0/1 0/0 0/0 .rodata @9812 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9812 = -32.0f; -COMPILER_STRIP_GATE(0x804C6A50, &lit_9812); -#pragma pop - -/* 804C6A54-804C6A58 00058C 0004+00 0/1 0/0 0/0 .rodata @9813 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9813 = 200.0f; -COMPILER_STRIP_GATE(0x804C6A54, &lit_9813); -#pragma pop - -/* 804C6A58-804C6A5C 000590 0004+00 0/1 0/0 0/0 .rodata @9814 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9814 = 600.0f; -COMPILER_STRIP_GATE(0x804C6A58, &lit_9814); -#pragma pop - -/* 804C6A5C-804C6A60 000594 0004+00 0/1 0/0 0/0 .rodata @9815 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_9815 = 40.0f; -COMPILER_STRIP_GATE(0x804C6A5C, &lit_9815); -#pragma pop - /* 804C5A08-804C6184 009868 077C+00 1/1 0/0 0/0 .text draw__9daMidna_cFv */ -void daMidna_c::draw() { - // NONMATCHING +int daMidna_c::draw() { + daAlink_c* link = daAlink_getAlinkActorClass(); + + if (checkNoDrawState() || + (!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)) + && daAlink_getAlinkActorClass()->checkPlayerNoDraw() + && !checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100)))) + { + return 1; + } + + int bvar1 = false; + dComIfGd_setListDark(); + + if (!checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE) + && mpModel != NULL) { + g_env_light.settingTevStruct(3, ¤t.pos, &tevStr); + if (checkSetAnime(0, ANM_RETURN)) { + f32 end_frame = mpMorf->getEndFrame(); + f32 frame = mpMorf->getFrame(); + tevStr.mFogColor.r = (frame / end_frame) * -32.0f; + tevStr.mFogColor.g = tevStr.mFogColor.r; + tevStr.mFogColor.b = tevStr.mFogColor.r; + } else if (link->getIceDamageWaitTimer() != 0 || link->checkFreezeDamage() != 0) { + tevStr.mFogColor = link->tevStr.mFogColor; + field_0x6e0 = link->tevStr.mFogColor; + if (dKy_darkworld_check()) { + field_0x6e8 = (J3DGXColor)l_normalKColor; + field_0x6ec = (J3DGXColor)l_normalKColor2; + } else { + field_0x6e8 = (J3DGXColor)l_lNormalKColor; + field_0x6ec = (J3DGXColor)l_lNormalKColor2; + } + } + g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); + J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(4); + if (field_0x668 != NULL) { + field_0x668->getTevColorReg(0, &field_0x6e0); + field_0x668->getTevKonstReg(0, &field_0x6e8); + } + material->setTevColor(1, &field_0x6e0); + material->setTevKColor(1, &field_0x6e8); + mDoExt_modelEntryDL(mpModel); + g_env_light.setLightTevColorType_MAJI(mpHandsBmd, &tevStr); + mDoExt_modelEntryDL(mpHandsBmd); + if (mpHairhandBmd != NULL && !checkStateFlg1((daMidna_FLG1)(FLG1_UNK_40 | FLG1_UNK_10))) { + for (u16 i = 0; i < 3; i++) { + J3DMaterial* material = mpHairhandBmd->getModelData()->getMaterialNodePointer(i); + material->setTevColor(1, &field_0x6e0); + material->setTevKColor(1, &field_0x6e8); + material->setTevKColor(2, &field_0x6ec); + } + g_env_light.setLightTevColorType_MAJI(mpHairhandBmd, &tevStr); + mDoExt_modelEntryDL(mpHairhandBmd); + } + if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) { + g_env_light.setLightTevColorType_MAJI(mpMaskBmd, &tevStr); + mDoExt_modelEntryDL(mpMaskBmd); + } + if (!link->checkMidnaRide()) { + bvar1 = true; + } + } else { + g_env_light.settingTevStruct(1, ¤t.pos, &tevStr); + if (field_0x668 != NULL) { + field_0x668->getTevColorReg(0, &tevStr.mFogColor); + } + g_env_light.setLightTevColorType_MAJI(mpGokouBmd, &tevStr); + mDoExt_modelEntryDL(mpGokouBmd); + MtxP mtx = mpShadowModel->getAnmMtx(JNT_WORLD_ROOT); + cXyz vec(mtx[0][3], mtx[1][3], mtx[2][3]); + MTXMultVec(dComIfGd_getViewMtx(), &vec, &vec); + vec.z -= 200.0f; + MTXMultVec(dComIfGd_getInvViewMtx(), &vec, &vec); + g_env_light.setLightTevColorType_MAJI(mpShadowModel, &tevStr); + mInvModel.entryDL(&vec); + if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) { + g_env_light.setLightTevColorType_MAJI(mpShadowMaskBmd, &tevStr); + mMaskInvModel.entryDL(&vec); + } + g_env_light.setLightTevColorType_MAJI(mpShadowHandsBmd, &tevStr); + mHandsInvModel.entryDL(&vec); + if (!checkStateFlg1(FLG1_UNK_40)) { + g_env_light.setLightTevColorType_MAJI(mpShadowHairhandBmd, &tevStr); + mHairhandInvModel.entryDL(&vec); + } + } + + if (mLeftHandShapeIdx == 0xfd) { + g_env_light.setLightTevColorType_MAJI(mpDemoHLTmpBmd, &tevStr); + mDoExt_modelEntryDL(mpDemoHLTmpBmd); + } + + if (mRightHandShapeIdx == 0xfd) { + g_env_light.setLightTevColorType_MAJI(mpDemoHRTmpBmd, &tevStr); + mDoExt_modelEntryDL(mpDemoHRTmpBmd); + } + + if (checkStateFlg0(FLG0_UNK_10)) { + g_env_light.setLightTevColorType_MAJI(mpDemoFCBlendBmd, &tevStr); + if (mpDemoFCBlendBrk != NULL) { + mpDemoFCBlendBmd->getModelData()->entryTevRegAnimator(mpDemoFCBlendBrk); + } + mDoExt_modelEntryDL(mpDemoFCBlendBmd); + g_env_light.setLightTevColorType_MAJI(mpDemoFCTongueBmd, &tevStr); + mDoExt_modelEntryDL(mpDemoFCTongueBmd); + } + + if (!checkStateFlg1(FLG1_UNK_40) && checkStateFlg1(FLG1_UNK_10)) { + g_env_light.setLightTevColorType_MAJI(mpDemoHDTmpBmd, &tevStr); + mDoExt_modelEntryDL(mpDemoHDTmpBmd); + } + + tevStr.mFogColor.r = 0; + tevStr.mFogColor.g = 0; + tevStr.mFogColor.b = 0; + dComIfGd_setList(); + + if (bvar1 && !checkStateFlg1(FLG1_SHADOW_NO_DRAW)) { + cXyz vec; + mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_BACKBONE1), &vec); + if (fopAcM_gc_c::gndCheck(&vec)) { + mShadowKey = + dComIfGd_setShadow(mShadowKey, 0, mpModel, &vec, 600.0f, 0.0f, vec.y - 40.0f, + fopAcM_gc_c::getGroundY(), *fopAcM_gc_c::getGroundCheck(), + &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) { + dComIfGd_addRealShadow(mShadowKey, mpMaskBmd); + } + if (!checkStateFlg1(FLG1_UNK_40)) { + if (checkStateFlg1(FLG1_UNK_10)) { + dComIfGd_addRealShadow(mShadowKey, mpDemoHDTmpBmd); + } else { + dComIfGd_addRealShadow(mShadowKey, mpHairhandBmd); + } + } + } + } + + return 1; } /* 804C6184-804C61A4 009FE4 0020+00 1/0 0/0 0/0 .text daMidna_Draw__FP9daMidna_c */ -static void daMidna_Draw(daMidna_c* param_0) { - // NONMATCHING +static int daMidna_Draw(daMidna_c* i_this) { + return i_this->draw(); } /* 804C61A4-804C6324 00A004 0180+00 1/1 0/0 0/0 .text __dt__9daMidna_cFv */ daMidna_c::~daMidna_c() { - // NONMATCHING + dComIfG_resDelete(&mPhase, l_arcName); + daPy_py_c::m_midnaActor = NULL; + mSound.deleteObject(); } /* 804C6324-804C634C 00A184 0028+00 1/0 0/0 0/0 .text daMidna_Delete__FP9daMidna_c */ -static void daMidna_Delete(daMidna_c* param_0) { - // NONMATCHING +static int daMidna_Delete(daMidna_c* i_this) { + i_this->~daMidna_c(); + return 1; } -/* 804C634C-804C637C 00A1AC 0030+00 1/0 0/0 0/0 .text calc__11J3DTexNoAnmCFPUs */ -// void J3DTexNoAnm::calc(u16* param_0) const { -extern "C" void calc__11J3DTexNoAnmCFPUs() { - // NONMATCHING -} +/* 804C6C40-804C6C60 -00001 0020+00 1/0 0/0 0/0 .data l_daMidna_Method */ +static actor_method_class l_daMidna_Method = { + (process_method_func)daMidna_Create, + (process_method_func)daMidna_Delete, + (process_method_func)daMidna_Execute, + (process_method_func)NULL, + (process_method_func)daMidna_Draw, +}; -/* 804C637C-804C6398 00A1DC 001C+00 1/1 0/0 0/0 .text cLib_calcTimer__FPUc */ -extern "C" void func_804C637C(void* _this, u8* param_0) { - // NONMATCHING -} - -/* 804C6398-804C63E0 00A1F8 0048+00 1/0 0/0 0/0 .text __dt__20daMidna_McaMorfCB1_cFv */ -daMidna_McaMorfCB1_c::~daMidna_McaMorfCB1_c() { - // NONMATCHING -} - -/* 804C63E0-804C64C0 00A240 00E0+00 1/0 0/0 0/0 .text __dt__16daMidna_matAnm_cFv */ -daMidna_matAnm_c::~daMidna_matAnm_c() { - // NONMATCHING -} - -/* 804C6A60-804C6A60 000598 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ \ No newline at end of file +/* 804C6C60-804C6C90 -00001 0030+00 0/0 0/0 1/0 .data g_profile_MIDNA */ +extern actor_process_profile_definition g_profile_MIDNA = { + fpcLy_CURRENT_e, + 6, + fpcPi_CURRENT_e, + PROC_MIDNA, + &g_fpcLf_Method.mBase, + sizeof(daMidna_c), + 0, + 0, + &g_fopAc_Method.base, + 0x5C, + &l_daMidna_Method, + 0x60000, + fopAc_ENV_e, + fopAc_CULLBOX_0_e, +}; diff --git a/src/d/d_event.cpp b/src/d/d_event.cpp index 1b1980b9f5..2b19f0af13 100644 --- a/src/d/d_event.cpp +++ b/src/d/d_event.cpp @@ -1079,7 +1079,7 @@ u32 dEvt_control_c::getPId(void* actor) { /* 800432EC-8004331C 03DC2C 0030+00 7/7 13/13 16/16 .text convPId__14dEvt_control_cFUi */ fopAc_ac_c* dEvt_control_c::convPId(fpc_ProcID id) { - return (fopAc_ac_c*)fopAcIt_Judge(fpcSch_JudgeByID, &id); + return fopAcM_SearchByID(id); } /* 8004331C-800433F0 03DC5C 00D4+00 0/0 1/1 0/0 .text getStbDemoData__14dEvt_control_cFPc