From 248f57b257505ecb9d61cf578a5207fb4fb5a701 Mon Sep 17 00:00:00 2001 From: Carco_21 <144170194+carter-ktb21@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:53:19 -0500 Subject: [PATCH] npc_midna linked (#2835) --- configure.py | 2 +- include/d/actor/d_a_midna.h | 95 ++-- src/d/actor/d_a_midna.cpp | 894 +++++++++++++++++++++++------------- 3 files changed, 635 insertions(+), 356 deletions(-) diff --git a/configure.py b/configure.py index bdc41255a1..855d4aaab2 100755 --- a/configure.py +++ b/configure.py @@ -1612,7 +1612,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_demo00"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_disappear"), ActorRel(NonMatching, "d_a_mg_rod"), - ActorRel(Equivalent, "d_a_midna"), # weak func order + ActorRel(MatchingFor("GZ2E01"), "d_a_midna"), ActorRel(Equivalent, "d_a_nbomb"), # weak func order ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_life_container"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_yousei"), diff --git a/include/d/actor/d_a_midna.h b/include/d/actor/d_a_midna.h index d5a885f629..ea95e24a4a 100644 --- a/include/d/actor/d_a_midna.h +++ b/include/d/actor/d_a_midna.h @@ -12,11 +12,61 @@ class daKago_c; +class daMidna_hio_c1 { +public: + /* 0x00 */ u8 forced_display; + /* 0x01 */ u8 hio_priority; + /* 0x02 */ s16 hair_color_1r; + /* 0x04 */ s16 hair_color_1g; + /* 0x06 */ s16 hair_color_1b; + /* 0x08 */ s16 hair_k_color_1r; + /* 0x0A */ s16 hair_k_color_1g; + /* 0x0C */ s16 hair_k_color_1b; + /* 0x0E */ s16 hair_k_color_2r; + /* 0x10 */ s16 hair_k_color_2g; + /* 0x12 */ s16 hair_k_color_2b; + /* 0x14 */ f32 scale; + /* 0x18 */ f32 y_pos; + /* 0x1C */ f32 z_pos; +}; + +class daMidna_hio_c0 { +public: + static daMidna_hio_c1 const m; +}; + +STATIC_ASSERT(sizeof(daMidna_hio_c0::m) == 0x20); + +#if DEBUG +class daMidna_hio_c : public JORReflexible { +public: + daMidna_hio_c(); + void genMessage(JORMContext*); + virtual ~daMidna_hio_c() {} + + /* 0x4 */ s8 id; + /* 0x8 */ daMidna_hio_c1 m; +}; +#define NPC_MIDNA_HIO_CLASS daMidna_hio_c +#else +#define NPC_MIDNA_HIO_CLASS daMidna_hio_c0 +#endif + +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; +}; + class daMidna_matAnm_c : public J3DMaterialAnm { public: /* 804BC218 */ void init(); /* 804BC248 */ void calc(J3DMaterial*) const; - /* 804C63E0 */ ~daMidna_matAnm_c() {} + /* 804C63E0 */ inline ~daMidna_matAnm_c() {} daMidna_matAnm_c() { init(); } @@ -43,30 +93,6 @@ public: 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; @@ -89,7 +115,8 @@ typedef int (daMidna_c::*daMidna_func)(); * * @details * - */ +*/ + class daMidna_c : public fopAc_ac_c { public: enum daMidna_ERFLG0 { @@ -455,13 +482,13 @@ private: /* 0x6E8 */ J3DGXColor field_0x6e8; /* 0x6EC */ J3DGXColor field_0x6ec; /* 0x6F0 */ daMidna_matAnm_c* mpEyeMatAnm[2]; - /* 0x6F8 */ daMidna_hio_c0* mpHIO; + /* 0x6F8 */ NPC_MIDNA_HIO_CLASS* mpHIO; /* 0x6FC */ Z2Creature mSound; /* 0x78C */ dMsgFlow_c mMsgFlow; /* 0x7D8 */ dBgS_LinkLinChk mLinChk; /* 0x848 */ u8 mMotionNum; /* 0x849 */ u8 mFaceNum; - /* 0x84A */ u8 field_0x84a; + /* 0x84A */ u8 mFrameCounter; /* 0x84B */ u8 mFaceBckTimer; /* 0x84C */ u8 mEyeMoveTimer; /* 0x84D */ s8 mReverb; @@ -469,20 +496,20 @@ private: /* 0x84F */ u8 mDemoType; /* 0x850 */ u8 field_0x850; /* 0x851 */ u8 field_0x851; - /* 0x852 */ u8 field_0x852[8]; - /* 0x85A */ s16 field_0x85a; + /* 0x852 */ u8 field_0x852[0x85a - 0x852]; + /* 0x85A */ s16 mPrevShapeAngleY; /* 0x85C */ s16 mHairAngleZ[5]; /* 0x866 */ s16 mHairAngleY[5]; - /* 0x870 */ u8 field_0x870[2]; + /* 0x870 */ u8 field_0x870[0x872 - 0x870]; /* 0x872 */ s16 field_0x872; /* 0x874 */ s16 mBackboneAngleZ; - /* 0x876 */ s16 field_0x876; + /* 0x876 */ s16 mPlayerAngleY; /* 0x878 */ u16 mLeftHandShapeIdx; /* 0x87A */ u16 mRightHandShapeIdx; /* 0x87C */ s16 mDemoAngle; - /* 0x87E */ s16 field_0x87e; + /* 0x87E */ s16 mJntNo; /* 0x880 */ csXyz mNeckAngle; - /* 0x886 */ u8 field_0x886[6]; + /* 0x886 */ u8 field_0x886[0x88c - 0x886]; /* 0x88C */ int mStaffID; /* 0x890 */ u32 mStateFlg0; /* 0x894 */ u32 mStateFlg1; diff --git a/src/d/actor/d_a_midna.cpp b/src/d/actor/d_a_midna.cpp index efb48eee02..52065e22f8 100644 --- a/src/d/actor/d_a_midna.cpp +++ b/src/d/actor/d_a_midna.cpp @@ -12,6 +12,8 @@ #include "d/actor/d_a_kago.h" #include "d/d_demo.h" #include "d/d_msg_object.h" +#include "d/d_s_play.h" +#include "d/d_debug_viewer.h" static f32 dummy_lit_3777(int idx, u8 foo) { Vec dummy_vec = {0.0f, 0.0f, 0.0f}; @@ -100,9 +102,38 @@ enum Joint { /* 0x1D */ JNT_MAX, }; +#if DEBUG +void daMidna_hio_c::genMessage(JORMContext* ctx) { + ctx->genSlider("スケール", &m.scale, 0.0f, 5.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genCheckBox("強制表示", &m.forced_display, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("Y位置", &m.y_pos, -1000.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("Z位置", &m.z_pos, -1000.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genCheckBox("HIO優先", &m.hio_priority, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪カラー1R", &m.hair_color_1r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪カラー1G", &m.hair_color_1g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪カラー1B", &m.hair_color_1b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー1R", &m.hair_k_color_1r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー1G", &m.hair_k_color_1g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー1B", &m.hair_k_color_1b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー2R", &m.hair_k_color_2r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー2G", &m.hair_k_color_2g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + ctx->genSlider("髪Kカラー2B", &m.hair_k_color_2b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); +} +#endif + /* 804C6560-804C6580 000098 0020+00 1/3 0/0 0/0 .rodata m__14daMidna_hio_c0 */ -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}, +daMidna_hio_c1 const daMidna_hio_c0::m = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 1.0f, -87.0f, 25.0f, @@ -139,16 +170,16 @@ void daMidna_matAnm_c::calc(J3DMaterial* i_material) const { 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 */ +/* 804BC36C-804BC3E0 0001CC 0074+00 1/0 0/0 0/0 .text execute__20daMidna_McaMorfCB1_cFUsP16J3DTransformInfo */ int daMidna_McaMorfCB1_c::execute(u16 i_jointNo, J3DTransformInfo* transform) { - if (!daPy_py_c::m_midnaActor->checkNoHairScale()) { + if (!daPy_py_c::getMidnaActor()->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; @@ -156,6 +187,7 @@ int daMidna_McaMorfCB1_c::execute(u16 i_jointNo, J3DTransformInfo* transform) { transform->mScale.z *= scale->z; } } + return 1; } @@ -248,6 +280,7 @@ int daMidna_c::modelCallBack(int i_jointNo) { 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); @@ -264,14 +297,16 @@ int daMidna_c::modelCallBack(int i_jointNo) { 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::scaleM(mpHIO->m.scale, mpHIO->m.scale, + mpHIO->m.scale); } + 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); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); return 1; } @@ -290,14 +325,16 @@ int daMidna_c::changeFaceBck() { mFaceBck.changeBckOnly(mpMorf->getAnm()); mpMorf->changeAnm(anm); } + return 1; } /* 804BC670-804BC6FC 0004D0 008C+00 1/1 0/0 0/0 .text baseModelCallBack__9daMidna_cFi */ int daMidna_c::baseModelCallBack(int i_jointNo) { - if (i_jointNo == field_0x87e) { + if (i_jointNo == mJntNo) { changeFaceBck(); } + if (i_jointNo == JNT_WORLD_ROOT || i_jointNo == JNT_HAND_R) { changeUpperBck(); } else if (i_jointNo == JNT_MOUTH) { @@ -305,11 +342,11 @@ int daMidna_c::baseModelCallBack(int i_jointNo) { } 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 - */ +/* 804BC6FC-804BC740 00055C 0044+00 1/1 0/0 0/0 .text daMidna_modelCallBack__FP8J3DJointi */ static int daMidna_modelCallBack(J3DJoint* i_joint, int param_2) { int jnt_no = i_joint->getJntNo(); daMidna_c* _this = (daMidna_c*)j3dSys.getModel()->getUserArea(); @@ -319,23 +356,23 @@ static int daMidna_modelCallBack(J3DJoint* i_joint, int param_2) { return 1; } -/* 804BC740-804BC7D4 0005A0 0094+00 1/1 0/0 0/0 .text - * initInvModel__9daMidna_cFUsPP8J3DModelP21mDoExt_invisibleModelUl */ -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); +/* 804BC740-804BC7D4 0005A0 0094+00 1/1 0/0 0/0 .text initInvModel__9daMidna_cFUsPP8J3DModelP21mDoExt_invisibleModelUl */ +int daMidna_c::initInvModel(u16 i_resNo, J3DModel** i_modelP, mDoExt_invisibleModel* i_invModel, u32 flag) { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, i_resNo); + JUT_ASSERT(664, modelData); + *i_modelP = mDoExt_J3DModel__create(modelData, 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 - */ +/* 804BC7D4-804BC868 000634 0094+00 1/1 0/0 0/0 .text initDemoModel__9daMidna_cFPP8J3DModelPCcUl */ int daMidna_c::initDemoModel(J3DModel** i_modelP, char const* i_bmdName, u32 flag) { *i_modelP = NULL; J3DModelData* model_data = @@ -351,158 +388,189 @@ int daMidna_c::initDemoModel(J3DModel** i_modelP, char const* i_bmdName, u32 fla /* 804BC868-804BD050 0006C8 07E8+00 1/1 0/0 0/0 .text createHeap__9daMidna_cFv */ int daMidna_c::createHeap() { + J3DModelData* modelData; + 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")) { + + 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")) { + + 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); + + modelData = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), "demo00_Midna_cut00_HD_tmp.bmd"); + if (modelData != NULL) { + mpDemoHDTmpBmd = mDoExt_J3DModel__create(modelData, 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")) { + + 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); + + modelData = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), "demo00_Midna_cut00_BD_tmp.bmd"); + if (modelData != NULL) { + mpDemoBDTmpBmd = mDoExt_J3DModel__create(modelData, 0, 0x11020284); if (mpDemoBDTmpBmd == NULL) { return 0; } - bd_bmd->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]); - bd_bmd->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]); + + modelData->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]); + modelData->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(); + modelData = mpDemoBDHandsBmd->getModelData(); for (u16 i = 0; i < 4; i++) { - hands_bmd->getMaterialNodePointer(i)->getShape()->hide(); + modelData->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); + + modelData = + (J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), "demo00_Midna_cut00_BD_hairhand.bmd"); + if (modelData != NULL) { + mpDemoBDHairhandBmd = mDoExt_J3DModel__create(modelData, 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::EMode_LOOP, 1.0f, 0, -1, NULL, 0, 0x11000284); + + JKRReadIdxResource(mBckHeap[0].getBuffer(), mBckHeap[0].getBufferSize(), 0x1DC, dComIfGp_getAnmArchive()); + J3DAnmTransform* md_anm = (J3DAnmTransform*)J3DAnmLoaderDataBase::load(mBckHeap[0].getBuffer()); + modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 14); + JUT_ASSERT(852, modelData != NULL); + mpMorf = new mDoExt_McaMorfSO(modelData, &mMorfCB, NULL, md_anm, J3DFrameCtrl::EMode_LOOP, 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::EMode_LOOP, 1.0f, 0, -1, false)) { return 0; } + if (!mFaceBck.init(mpMorf->getAnm(), TRUE, J3DFrameCtrl::EMode_LOOP, 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); + + modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 11); + JUT_ASSERT(911, modelData); + mpGokouBmd = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mpGokouBmd == NULL) { return 0; } - mpHIO = new daMidna_hio_c0(); + + mpHIO = new NPC_MIDNA_HIO_CLASS(); 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; + + mpDemoFCTmpBls = (J3DDeformData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), "demo00_Midna_cut00_FC_tmp.bls"); + if (mpDemoFCTmpBls != NULL) { + s32 deformData = mpDemoFCBlendBmd->setDeformData(mpDemoFCTmpBls, 1); + if (deformData) { + return 0; + } } } + return 1; } -/* 804BD254-804BD274 0010B4 0020+00 1/1 0/0 0/0 .text daMidna_createHeap__FP10fopAc_ac_c - */ +/* 804BD254-804BD274 0010B4 0020+00 1/1 0/0 0/0 .text daMidna_createHeap__FP10fopAc_ac_c */ static int daMidna_createHeap(fopAc_ac_c* i_this) { return static_cast(i_this)->createHeap(); } +#if DEBUG +daMidna_hio_c::daMidna_hio_c() { + m = daMidna_hio_c0::m; +} +#endif + /* 804BD274-804BD8B8 0010D4 0644+00 1/1 0/0 0/0 .text create__9daMidna_cFv */ cPhs__Step daMidna_c::create() { fopAcM_ct(this, daMidna_c); @@ -518,6 +586,7 @@ cPhs__Step daMidna_c::create() { if (dStage_roomControl_c::getDemoArcName()[0] != '\0') { heap_size = 0x4d740; heap_size |= 0x80000000; + OS_REPORT("MIDNA DEMO [%s]\n", dStage_roomControl_c::getDemoArcName()); } if (!fopAcM_entrySolidHeap(this, daMidna_createHeap, heap_size)) { @@ -529,46 +598,50 @@ cPhs__Step daMidna_c::create() { 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((uintptr_t)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); + J3DModelData* modelData = mpShadowModel->getModelData(); + modelData->getJointNodePointer(JNT_WORLD_ROOT)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_HAND_R)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_HEAD)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_BACKBONE1)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_BACKBONE2)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_MOUTH)->setCallBack(daMidna_modelCallBack); + modelData->getJointNodePointer(JNT_CHIN)->setCallBack(daMidna_modelCallBack); + modelData->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); + modelData->getJointNodePointer(i)->setCallBack(daMidna_modelCallBack); } - mpShadowLeftHandShape = model_data->getMaterialNodePointer(1)->getShape(); - mpShadowRightHandShape = model_data->getMaterialNodePointer(2)->getShape(); + mpShadowLeftHandShape = modelData->getMaterialNodePointer(1)->getShape(); + mpShadowRightHandShape = modelData->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); + mpMoyaBtk = setSimpleBtk(modelData, 27); + mpAppearBrk = setSimpleBrk(modelData, 18); + modelData = mpShadowMaskBmd->getModelData(); + mpMaskMoyaBtk = setSimpleBtk(modelData, 26); + mpMaskAppearBrk = setSimpleBrk(modelData, 21); + modelData = mpShadowHandsBmd->getModelData(); + mpHandsMoyaBtk = setSimpleBtk(modelData, 25); for (u16 i = 0; i < 4; i++) { - model_data->getMaterialNodePointer(i)->getShape()->hide(); + modelData->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); + modelData = mpShadowHairhandBmd->getModelData(); + mpHairhandMoyaBtk = setSimpleBtk(modelData, 24); + mpHairhandAppearBrk = setSimpleBrk(modelData, 20); + mpGokouAppearBrk = setSimpleBrk(mpGokouBmd->getModelData(), 19); mpGokouAppearBrk->setFrame(0.0f); + #if DEBUG + mpHIO->id = mDoHIO_CREATE_CHILD("ミドナ", mpHIO); + #endif + fopAcM_setStageLayer(this); fopAcM_SetMtx(this, mpShadowModel->getBaseTRMtx()); mVoiceFrame = -1.0f; @@ -623,7 +696,9 @@ cPhs__Step daMidna_c::create() { /* 804BD91C-804BD93C 00177C 0020+00 1/0 0/0 0/0 .text daMidna_Create__FP10fopAc_ac_c */ static cPhs__Step daMidna_Create(fopAc_ac_c* i_this) { - return static_cast(i_this)->create(); + daMidna_c* actor = (daMidna_c*)i_this; + fpc_ProcID id = fopAcM_GetID(i_this); + return actor->create(); } /* 804BD93C-804BDE04 00179C 04C8+00 2/2 0/0 0/0 .text allAnimePlay__9daMidna_cFv */ @@ -642,7 +717,7 @@ void daMidna_c::allAnimePlay() { mUpperBck.getBckAnm()->setFrame(mUpperBck.getFrame()); if (checkStateFlg0(FLG0_UNK_800000)) { - if (dMsgObject_c::isMouthCheck()) { + if (dMsgObject_isMouthCheck()) { mFaceBckTimer = 20; } else { if (mFaceBckTimer != 0) { @@ -661,33 +736,35 @@ void daMidna_c::allAnimePlay() { 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++; + if (mFrameCounter != 0) { + mFrameCounter++; + if (mFrameCounter > mpFaceBtp->getFrameMax()) { + mFrameCounter = 0; } + } else if (cM_rnd() < 0.012f) { + mFrameCounter++; } - uvar7 = uvar6 = field_0x84a; + uvar7 = uvar6 = mFrameCounter; } 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); } @@ -706,6 +783,7 @@ void daMidna_c::allAnimePlay() { 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)) { @@ -713,6 +791,7 @@ void daMidna_c::allAnimePlay() { if (fvar8 < 0.0f) { fvar8 = 0.0f; } + mpGokouAppearBrk->setFrame(fvar8); } else { mpGokouAppearBrk->setFrame(mpGokouAppearBrk->getFrameMax() - 0.001f); @@ -722,19 +801,24 @@ void daMidna_c::allAnimePlay() { 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(); } @@ -743,13 +827,16 @@ void daMidna_c::allAnimePlay() { /* 804BDE04-804BE470 001C64 066C+00 2/2 0/0 0/0 .text setMatrix__9daMidna_cFv */ void daMidna_c::setMatrix() { - 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}; + Vec vec1 = {0.0f, mpHIO->m.y_pos, mpHIO->m.z_pos}; + Vec scale = {mpHIO->m.scale, mpHIO->m.scale, mpHIO->m.scale}; + if (mpModel != NULL) { mpModel->setBaseScale(scale); } mpShadowModel->setBaseScale(scale); + daAlink_c* link = daAlink_getAlinkActorClass(); + if (mDemoMode == 0x200) { J3DTransformInfo transform; mpMorf->getTransform(1, &transform); @@ -768,8 +855,7 @@ void daMidna_c::setMatrix() { 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::checkNowWolf() || checkShadowModelDrawSmode())) { + } else if (!checkStateFlg0(FLG0_WOLF_NO_POS) && (!daPy_py_c::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); @@ -785,7 +871,7 @@ void daMidna_c::setMatrix() { 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; + mPrevShapeAngleY = shape_angle.y; } else { current.pos.set( link->current.pos.x + 90.0f * sin_link_y, @@ -793,17 +879,20 @@ void daMidna_c::setMatrix() { link->current.pos.z + 90.0f * cos_link_y ); shape_angle.y = link->shape_angle.y + 0x8000; - field_0x85a = shape_angle.y; + mPrevShapeAngleY = 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; @@ -817,11 +906,13 @@ void daMidna_c::setMatrix() { 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; @@ -836,20 +927,24 @@ void daMidna_c::setMatrix() { } 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); } } @@ -882,9 +977,9 @@ void daMidna_c::setBodyPartMatrix() { 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()); + mpDemoHDTmpBck->entry(mpDemoHDTmpBmd->getModelData()); } + mpDemoHDTmpBmd->calc(); } @@ -910,25 +1005,27 @@ void daMidna_c::setBodyPartMatrix() { mpShadowHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get()); mpShadowHairhandBmd->calc(); - J3DModelData* hairhand_model_data = mpShadowHairhandBmd->getModelData(); + J3DModelData* modelData = mpShadowHairhandBmd->getModelData(); for (u16 i = 0; i < 3; i++) { - hairhand_model_data->getMaterialNodePointer(i)->getShape()->hide(); + modelData->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 ( + checkStateFlg0(FLG0_UNK_10000000) || mBckHeap[2].getIdx() == m_anmDataTable[ANM_HAIR].mResID || + mBckHeap[2].getIdx() == m_anmDataTable[ANM_S_TAKES].mResID || mBckHeap[2].getIdx() == m_anmDataTable[ANM_S_WAITS].mResID || + mBckHeap[2].getIdx() == m_anmDataTable[ANM_S_PACKAWAY].mResID || mBckHeap[2].getIdx() == m_anmDataTable[ANM_GRABST].mResID || + checkEndResetStateFlg0(ERFLG0_UNK_40) || dComIfGp_checkPlayerStatus1(0, 0x800000) + ) { if (bvar8) { - hairhand_model_data->getMaterialNodePointer(2)->getShape()->show(); + modelData->getMaterialNodePointer(2)->getShape()->show(); } else { - hairhand_model_data->getMaterialNodePointer(1)->getShape()->show(); + modelData->getMaterialNodePointer(1)->getShape()->show(); } + bvar2 = true; } else { - hairhand_model_data->getMaterialNodePointer(0)->getShape()->show(); + modelData->getMaterialNodePointer(0)->getShape()->show(); bvar2 = false; } @@ -936,9 +1033,9 @@ void daMidna_c::setBodyPartMatrix() { mpHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get()); mpHairhandBmd->calc(); - J3DModelData* model_data = mpHairhandBmd->getModelData(); + modelData = mpHairhandBmd->getModelData(); for (u16 i = 0; i < 3; i++) { - model_data->getMaterialNodePointer(i)->getShape()->hide(); + modelData->getMaterialNodePointer(i)->getShape()->hide(); } const GXColorS10* color; @@ -947,9 +1044,9 @@ void daMidna_c::setBodyPartMatrix() { if (bvar2) { if (bvar8) { - model_data->getMaterialNodePointer(2)->getShape()->show(); + modelData->getMaterialNodePointer(2)->getShape()->show(); } else { - model_data->getMaterialNodePointer(1)->getShape()->show(); + modelData->getMaterialNodePointer(1)->getShape()->show(); } kcolor1 = &l_bigKColor; @@ -961,7 +1058,7 @@ void daMidna_c::setBodyPartMatrix() { kcolor2 = &l_lBigKColor2; } } else { - model_data->getMaterialNodePointer(0)->getShape()->show(); + modelData->getMaterialNodePointer(0)->getShape()->show(); color = &l_normalColor; if (dKy_darkworld_check()) { @@ -1004,6 +1101,7 @@ void daMidna_c::setBodyPartMatrix() { mpDemoHLTmpBck->entry(mpDemoHLTmpBmd->getModelData()); } mpDemoHLTmpBmd->calc(); + mpShadowLeftHandShape->hide(); if (mpLeftHandShape != NULL) { mpLeftHandShape->hide(); @@ -1020,6 +1118,7 @@ void daMidna_c::setBodyPartMatrix() { if (mpDemoHRTmpBck != NULL) { mpDemoHRTmpBck->entry(mpDemoHRTmpBmd->getModelData()); } + mpDemoHRTmpBmd->calc(); mpShadowRightHandShape->hide(); if (mpRightHandShape != NULL) { @@ -1035,6 +1134,7 @@ void daMidna_c::setBodyPartMatrix() { 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()); @@ -1062,6 +1162,7 @@ void daMidna_c::setBodyPartPos() { 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::checkNowWolf() ? 250.0f : 50.0f; @@ -1076,6 +1177,7 @@ void daMidna_c::setBodyPartPos() { } 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; @@ -1087,11 +1189,14 @@ void daMidna_c::setBodyPartPos() { /* 804BEFA0-804BF070 002E00 00D0+00 1/1 0/0 0/0 .text checkAppear__9daMidna_cFv */ BOOL daMidna_c::checkAppear() { - if (daPy_py_c::checkNowWolf() && daPy_py_c::checkFirstMidnaDemo() && - (!daAlink_getAlinkActorClass()->checkMidnaDisappearMode() - || checkStateFlg0(FLG0_WOLF_NO_POS) - || (checkSetAnime(0, ANM_RETURN) && !mpMorf->isStop()))) - { + if ( + daPy_py_c::checkNowWolf() && daPy_py_c::checkFirstMidnaDemo() && + ( + !daAlink_getAlinkActorClass()->checkMidnaDisappearMode() || + checkStateFlg0(FLG0_WOLF_NO_POS) || + (checkSetAnime(0, ANM_RETURN) && !mpMorf->isStop()) + ) + ) { return TRUE; } return FALSE; @@ -1105,6 +1210,7 @@ void daMidna_c::checkMidnaPosState() { if (checkStateFlg1(FLG1_UNK_200) || checkSetAnime(0, ANM_LEADTOWAITA)) { jump_point = NULL; } + offStateFlg1(FLG1_UNK_200); const cXyz* pos = NULL; if (jump_point == NULL) { @@ -1127,6 +1233,7 @@ void daMidna_c::checkMidnaPosState() { } } } + offStateFlg0(FLG0_UNK_20); return; } @@ -1156,16 +1263,19 @@ void daMidna_c::checkMidnaPosState() { offStateFlg0(FLG0_WOLF_NO_POS); } } else if (jump_point != NULL) { - if (checkStateFlg0(FLG0_UNK_100) && !link->checkWolfTagLockJump() - && field_0x9a0.abs2(*jump_point) > 100.0f) { + 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)) { + 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) { @@ -1196,23 +1306,21 @@ void daMidna_c::checkMidnaPosState() { 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 { + } 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::checkNowWolf()) { onStateFlg0(FLG0_WOLF_NO_POS); - Vec vec1 = {0.0f, daMidna_hio_c0::m.field_0x18, daMidna_hio_c0::m.field_0x1c}; + Vec vec1 = {0.0f, mpHIO->m.y_pos, mpHIO->m.z_pos}; cXyz vec2; mDoMtx_stack_c::copy(link->getWolfMidnaMatrix()); mDoMtx_stack_c::ZXYrotM(-0x4000, -0x4000, 0); @@ -1224,20 +1332,23 @@ void daMidna_c::checkMidnaPosState() { 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) - { + } 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) { @@ -1268,6 +1379,7 @@ void daMidna_c::checkMidnaPosState() { } else if (mpMorf->getFrame() >= 13.0f) { setRightHandShape(2); } + if (mpMorf->isStop()) { dComIfGp_evmng_cutEnd(mStaffID); } @@ -1292,6 +1404,7 @@ void daMidna_c::checkMidnaPosState() { 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); @@ -1303,12 +1416,13 @@ void daMidna_c::checkMidnaPosState() { current.pos = *pos; shape_angle.y = fopAcM_searchPlayerAngleY(this); current.angle.y = shape_angle.y; - field_0x85a = shape_angle.y; + mPrevShapeAngleY = 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); + mPlayerAngleY = fopAcM_searchPlayerAngleY(this); } + onStateFlg0(FLG0_UNK_200); } else { cXyz start(current.pos.x, current.pos.y + 100.0f, current.pos.z); @@ -1323,10 +1437,10 @@ void daMidna_c::checkMidnaPosState() { 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; + if ((s16)(mPlayerAngleY - shape_angle.y) < 0) { + angle = shape_angle.y + 0x7FFF; } else { - angle = field_0x876; + angle = mPlayerAngleY; } } } else if (checkSetAnime(0, ANM_LEADST)) { @@ -1362,8 +1476,7 @@ BOOL daMidna_c::setUpperAnime(u16 i_resID, u16 param_1) { return TRUE; } -/* 804C0020-804C0094 003E80 0074+00 1/1 0/0 0/0 .text - * setUpperAnimeAndSe__9daMidna_cFQ29daMidna_c11daMidna_ANM */ +/* 804C0020-804C0094 003E80 0074+00 1/1 0/0 0/0 .text setUpperAnimeAndSe__9daMidna_cFQ29daMidna_c11daMidna_ANM */ 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)) { @@ -1371,13 +1484,14 @@ BOOL daMidna_c::setUpperAnimeAndSe(daMidna_c::daMidna_ANM i_anm) { mVoiceFrame = anm_data->mSoundFrame; return TRUE; } + return FALSE; } /* 804C0094-804C0134 003EF4 00A0+00 1/1 0/0 0/0 .text setFaceAnime__9daMidna_cFUsUs */ BOOL daMidna_c::setFaceAnime(u16 i_resID, u16 param_1) { J3DAnmTransform* bck; - if (param_1 == 0xffff) { + if (param_1 == 0xFFFF) { bck = (J3DAnmTransform*)mBckHeap[2].loadDataIdx(i_resID); } else { bck = (J3DAnmTransform*)mBckHeap[2].loadDataDemoRID(i_resID, 0); @@ -1509,8 +1623,7 @@ BOOL daMidna_c::setDemoAnm() { } else if (var1 == 2) { if (var2 == 1) { if (var3 == 2) { - J3DAnmTransform* bck = static_cast( - mBckHeap[0].loadDataDemoRID(var4, 0)); + J3DAnmTransform* bck = static_cast(mBckHeap[0].loadDataDemoRID(var4, 0)); if (bck != NULL) { f32 morf; if (demo_actor->checkEnable(0x80)) { @@ -1518,6 +1631,7 @@ BOOL daMidna_c::setDemoAnm() { } else { morf = 0.0f; } + setBckAnime(bck, -1, morf); setUpperAnime(var4, 0); offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1)); @@ -1624,24 +1738,31 @@ BOOL daMidna_c::setDemoAnm() { 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()); } @@ -1667,8 +1788,8 @@ void daMidna_c::setFaceBtp(u16 i_index, BOOL i_isDemo) { mpFaceBtp = btp; mpFaceBtp->searchUpdateMaterialID(mpModel->getModelData()); mpModel->getModelData()->entryTexNoAnimator(mpFaceBtp); - field_0x84a = 0; - mpFaceBtp->setFrame(field_0x84a); + mFrameCounter = 0; + mpFaceBtp->setFrame(mFrameCounter); offStateFlg0(FLG0_UNK_40); } } @@ -1686,8 +1807,8 @@ void daMidna_c::setFaceBtk(u16 i_index, BOOL i_isDemo) { mpFaceBtk = btk; mpFaceBtk->searchUpdateMaterialID(mpModel->getModelData()); mpModel->getModelData()->entryTexMtxAnimator(mpFaceBtk); - field_0x84a = 0; - mpFaceBtk->setFrame(field_0x84a); + mFrameCounter = 0; + mpFaceBtk->setFrame(mFrameCounter); offStateFlg0(FLG0_UNK_40); } } @@ -1744,14 +1865,12 @@ void daMidna_c::setRightHandShape(u16 i_idx) { } } -/* 804C0F04-804C0F24 004D64 0020+00 1/1 0/0 0/0 .text checkHairOnlyAnime__9daMidna_cCFi - */ +/* 804C0F04-804C0F24 004D64 0020+00 1/1 0/0 0/0 .text checkHairOnlyAnime__9daMidna_cCFi */ 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 - */ +/* 804C0F24-804C103C 004D84 0118+00 2/2 0/0 0/0 .text setBckAnime__9daMidna_cFP15J3DAnmTransformif */ 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; @@ -1790,7 +1909,6 @@ void daMidna_c::setAnm() { daAlink_c* link = daAlink_getAlinkActorClass(); BOOL bVar1; - if (dComIfGp_event_runCheck() || checkEndResetStateFlg0(ERFLG0_NO_SERVICE_WAIT)) { bVar1 = TRUE; } else { @@ -1826,9 +1944,10 @@ void daMidna_c::setAnm() { anm = ANM_MGNCATCHST; } } else if (link->checkMidnaGanonThrowLeftAnm()) { - if (checkSetAnime(0, ANM_MGNTHROWLED) - || (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLST))) - { + if ( + checkSetAnime(0, ANM_MGNTHROWLED) || + (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLST)) + ) { bVar2 = TRUE; anm = ANM_MGNTHROWLED; if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLED)) { @@ -1838,9 +1957,10 @@ void daMidna_c::setAnm() { anm = ANM_MGNTHROWLST; } } else if (link->checkMidnaGanonThrowRightAnm()) { - if (checkSetAnime(0, ANM_MGNTHROWRED) - || (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRST))) - { + if ( + checkSetAnime(0, ANM_MGNTHROWRED) || + (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRST)) + ) { bVar2 = TRUE; anm = ANM_MGNTHROWRED; if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRED)) { @@ -1867,8 +1987,9 @@ void daMidna_c::setAnm() { offStateFlg0(FLG0_UNK_1000); } else if (mDemoMode == 8) { anm = ANM_S_HOLE; - } else if (mDemoMode == 7 || mDemoMode == 6 || mDemoMode == 0x13 - || mDemoMode == 0x14 || mDemoMode == 0xe) { + } else if ( + mDemoMode == 7 || mDemoMode == 6 || mDemoMode == 0x13 || mDemoMode == 0x14 || mDemoMode == 0xe + ) { anm = ANM_LEADWAIT; bVar1 = TRUE; offStateFlg0(FLG0_UNK_1); @@ -1881,9 +2002,10 @@ void daMidna_c::setAnm() { } 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) - { + } 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) { @@ -1892,13 +2014,12 @@ void daMidna_c::setAnm() { } else { anm = ANM_S_APPEAR; } + } else if (checkEndResetStateFlg0(ERFLG0_UNK_1)) { + anm = ANM_S_MOVE; } else { - if (checkEndResetStateFlg0(ERFLG0_UNK_1)) { - anm = ANM_S_MOVE; - } else { - anm = ANM_LEADWAIT; - } + anm = ANM_LEADWAIT; } + offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1)); bVar1 = TRUE; bVar2 = TRUE; @@ -1909,8 +2030,10 @@ void daMidna_c::setAnm() { 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)) { + if ( + (mpMorf->isStop() && checkSetAnime(0, ANM_LEADED)) || + checkSetAnime(0, ANM_LEADSWAIT) || checkSetAnime(0, ANM_LEADWAIT) + ) { anm = ANM_LEADWAIT; offStateFlg0(FLG0_NO_INPUT); } else { @@ -1950,8 +2073,10 @@ void daMidna_c::setAnm() { anm = motionTable[mMotionNum - 31]; offStateFlg0(FLG0_UNK_1000); } else if (link->checkMidnaWolfDashAnime() && !tired) { - if ((mpMorf->isStop() && checkSetAnime(0, ANM_CLINGST)) || checkSetAnime(0, ANM_CLING)) - { + if ( + (mpMorf->isStop() && checkSetAnime(0, ANM_CLINGST)) || + checkSetAnime(0, ANM_CLING) + ) { anm = ANM_CLING; } else { anm = ANM_CLINGST; @@ -1975,9 +2100,9 @@ void daMidna_c::setAnm() { anm = ANM_WAITD; } } else if (link->checkMidnaLookAroundAnime()) { - if ((mpMorf->isStop() && checkSetAnime(0, ANM_ENTRANCE)) - || checkSetAnime(0, ANM_SWAITB)) - { + if ( + (mpMorf->isStop() && checkSetAnime(0, ANM_ENTRANCE)) || checkSetAnime(0, ANM_SWAITB) + ) { anm = ANM_SWAITB; bVar2 = TRUE; } else { @@ -1994,8 +2119,9 @@ void daMidna_c::setAnm() { } 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()) { + } else if ( + !checkStateFlg0(FLG0_UNK_1) && checkSetAnime(0, ANM_SWAITB) && !mpMorf->isStop() + ) { anm = ANM_SWAITB; } else { anm = ANM_WAITA; @@ -2005,6 +2131,7 @@ void daMidna_c::setAnm() { 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 { @@ -2015,10 +2142,11 @@ void daMidna_c::setAnm() { res_id = m_anmDataTable[anm].mResID; J3DAnmTransform* bck; - 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() || (!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(); @@ -2076,7 +2204,7 @@ void daMidna_c::setAnm() { 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; + mPrevShapeAngleY = 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; @@ -2104,9 +2232,10 @@ void daMidna_c::setAnm() { setUpperAnimeAndSe(anm); - } else if (mMotionNum == 0 - && ((anm == ANM_WAITA && !dComIfGp_event_runCheck()) || anm == ANM_LEADWAIT)) - { + } 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); @@ -2131,10 +2260,11 @@ void daMidna_c::setAnm() { 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)) - { + 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); bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID); setBckAnime(bck, J3DFrameCtrl::EMode_LOOP, 5.0f); @@ -2147,10 +2277,11 @@ void daMidna_c::setAnm() { bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID); setBckAnime(bck, J3DFrameCtrl::EMode_NONE, 0.0f); } - } else if (daPy_py_c::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))) - { + } else if ( + daPy_py_c::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; @@ -2161,6 +2292,7 @@ void daMidna_c::setAnm() { } else { rnd = cM_rndF(4.0f); } + if (rnd < 1.0f) { anm = ANM_WAITB; } else if (rnd < 2.0f) { @@ -2173,6 +2305,7 @@ void daMidna_c::setAnm() { anm = ANM_HIT; } } + res_id = m_anmDataTable[anm].mResID; setUpperAnimeAndSe(anm); bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id); @@ -2186,10 +2319,11 @@ void daMidna_c::setAnm() { } 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)) - { + 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 { @@ -2216,8 +2350,10 @@ void daMidna_c::setAnm() { 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)) { + } 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; @@ -2239,27 +2375,29 @@ void daMidna_c::setAnm() { 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 ( + 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; + mJntNo = JNT_HEAD; } else { setFaceAnime(m_anmDataTable[face_anm].mResID, 0xffff); if (checkHairOnlyAnime(face_anm)) { - field_0x87e = JNT_CHIN; + mJntNo = JNT_CHIN; mFaceBckTimer = 20; } else { - field_0x87e = JNT_HEAD; + mJntNo = JNT_HEAD; } } } else { offStateFlg0(FLG0_UNK_800000); mBckHeap[2].resetIdx(); - field_0x87e = JNT_HEAD; + mJntNo = JNT_HEAD; } if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW) @@ -2297,36 +2435,37 @@ void daMidna_c::setAnm() { } BOOL local_c0 = mDemoMode == 0x14 || (anm >= ANM_DOOROPC && anm < ANM_FTALKA); - if (checkStateFlg0(FLG0_UNK_2) || local_c0 || field_0x87e == JNT_CHIN) { + if (checkStateFlg0(FLG0_UNK_2) || local_c0 || mJntNo == 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) - { + } 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 - */ -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; +/* 804C287C-804C2A68 0066DC 01EC+00 1/1 0/0 0/0 .text getNeckAimAngle__9daMidna_cFPC4cXyzPsPsPsPs */ +s16 daMidna_c::getNeckAimAngle(cXyz const* i_atnPos, s16* o_neckX, s16* o_neckY, s16* o_eyeX, s16* o_eyeY) { + cXyz eye_vec; + s16 offset_y = mPrevShapeAngleY; 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; + cXyz 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; @@ -2348,6 +2487,7 @@ void daMidna_c::clearEyeMove() { 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); @@ -2371,9 +2511,10 @@ void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { } 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) - { + } 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; @@ -2393,6 +2534,7 @@ void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { mEyeMoveX = cM_ssin(angle); mEyeMoveY = cM_scos(angle); } + tmp_x = mEyeMoveX; tmp_y = mEyeMoveY; } else { @@ -2406,6 +2548,7 @@ void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { } 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) { @@ -2420,6 +2563,7 @@ void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { target_lx = tmp_x * -0.2f; target_rx = tmp_x * 0.2f; } + if (tmp_y > 0.0f) { target_ly = tmp_y * 0.2f; } else { @@ -2449,20 +2593,19 @@ void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) { /* 804C2EBC-804C3168 006D1C 02AC+00 1/1 0/0 0/0 .text setNeckAngle__9daMidna_cFv */ void daMidna_c::setNeckAngle() { daAlink_c* link = daAlink_getAlinkActorClass(); - BOOL clear_eye_move = mBtkHeap.getIdx() != 0x3A4 && !mBtkHeap.checkNoSetIdx() - && mBtkHeap.getIdx() != 0x399; + 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 || 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))) - { + if ( + field_0x84e == 2 || 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)) { @@ -2470,11 +2613,14 @@ void daMidna_c::setNeckAngle() { 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)) { + } 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)) { + } 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 { @@ -2484,7 +2630,7 @@ void daMidna_c::setNeckAngle() { pos = NULL; } - getNeckAimAngle(pos, &neck_x, &neck_y, &eye_x, &eye_y); + s16 neckAimAngle = 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); @@ -2511,6 +2657,7 @@ void daMidna_c::initHairAngle() { mHairAngleY[i] = 0; mHairScale[i] = l_hairScale[i]; } + onStateFlg0(FLG0_UNK_8); } @@ -2550,8 +2697,10 @@ void daMidna_c::setHairAngle() { cXyz* atn_pos = NULL; daAlink_c* link = daAlink_getAlinkActorClass(); - if (link->checkMidnaHairAtnPos() && !checkMidnaTired() && !checkStateFlg0((daMidna_FLG0) - (FLG0_NO_HAIR_SCALE | FLG0_UNK_200000 | FLG0_TAG_WAIT | FLG0_UNK_100))) { + if ( + link->checkMidnaHairAtnPos() && !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 { @@ -2559,7 +2708,6 @@ void daMidna_c::setHairAngle() { } for (i = 0; i < 5; i++, pos++, dir++, angle_z++, angle_y++, scale++) { - if (checkStateFlg0(FLG0_UNK_10000000)) { cLib_chasePos(scale, l_hairScale[4], 0.1f); } else { @@ -2574,6 +2722,7 @@ void daMidna_c::setHairAngle() { } 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); @@ -2596,6 +2745,7 @@ void daMidna_c::setHairAngle() { } 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; @@ -2608,6 +2758,7 @@ void daMidna_c::setHairAngle() { 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); @@ -2641,6 +2792,7 @@ void daMidna_c::setHairAngle() { 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); @@ -2648,6 +2800,7 @@ void daMidna_c::setHairAngle() { *angle_z = 0; } } + iVar16 -= (fVar2 * 0x1000 + 0x800); } @@ -2695,6 +2848,7 @@ void daMidna_c::setDemoData() { 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 @@ -2799,27 +2953,26 @@ void daMidna_c::setDemoData() { } } -/* 804C4394-804C4444 0081F4 00B0+00 1/1 0/0 0/0 .text setSimpleBrk__9daMidna_cFP12J3DModelDataUs - */ +/* 804C4394-804C4444 0081F4 00B0+00 1/1 0/0 0/0 .text setSimpleBrk__9daMidna_cFP12J3DModelDataUs */ 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 - */ +/* 804C4444-804C44CC 0082A4 0088+00 1/1 0/0 0/0 .text setSimpleBtk__9daMidna_cFP12J3DModelDataUs */ J3DAnmTextureSRTKey* daMidna_c::setSimpleBtk(J3DModelData* i_modelData, u16 i_idx) { - J3DAnmTextureSRTKey* btk = - static_cast(dComIfG_getObjectRes(l_arcName, 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); @@ -2839,6 +2992,7 @@ void daMidna_c::initMidnaModel() { mpLeftHandShape->hide(); } mpLeftHandShape = mpModel->getModelData()->getMaterialNodePointer(6)->getShape(); + if (mpRightHandShape != NULL) { mpRightHandShape->hide(); } @@ -2851,9 +3005,11 @@ void daMidna_c::initMidnaModel() { if (mpLeftHandShape != NULL) { mpLeftHandShape->hide(); } + if (mpRightHandShape != NULL) { mpRightHandShape->hide(); } + mpModel = NULL; mpMaskBmd = NULL; mpHandsBmd = NULL; @@ -2879,16 +3035,16 @@ void daMidna_c::initMidnaModel() { 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]); + J3DModelData* modelData = mpModel->getModelData(); + mpLeftHandShape = modelData->getMaterialNodePointer(6)->getShape(); + mpRightHandShape = modelData->getMaterialNodePointer(7)->getShape(); + modelData->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]); + modelData->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]); mpEyeMatAnm[0]->init(); mpEyeMatAnm[1]->init(); - J3DModelData* hand_model_data = mpHandsBmd->getModelData(); + modelData = mpHandsBmd->getModelData(); for (u16 i = 0; i < 4; i++) { - hand_model_data->getMaterialNodePointer(i)->getShape()->hide(); + modelData->getMaterialNodePointer(i)->getShape()->hide(); } mBtpHeap.initData(); mBtkHeap.initData(); @@ -2896,27 +3052,28 @@ void daMidna_c::initMidnaModel() { } } -/* 804C4750-804C49B8 0085B0 0268+00 2/2 0/0 0/0 .text daMidna_searchNpc__FP10fopAc_ac_cPv - */ +/* 804C4750-804C49B8 0085B0 0268+00 2/2 0/0 0/0 .text daMidna_searchNpc__FP10fopAc_ac_cPv */ 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) - { + + 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 { - if (dist <= link->getMetamorphoseFarDis() - && fopAcM_seenPlayerAngleY(i_actor) <= link->getMetamorphoseFarAngle()) - { - *(BOOL*)o_far = TRUE; - } else { - return NULL; - } + return NULL; } + if (!fopAcM_lc_c::lineCheck(&i_actor->eyePos, &link_pos, i_actor)) { return i_actor; } @@ -2926,22 +3083,26 @@ static void* daMidna_searchNpc(fopAc_ac_c* i_actor, void* o_far) { /* 804C49B8-804C4AE8 008818 0130+00 2/2 0/0 0/0 .text setMidnaNoDrawFlg__9daMidna_cFv */ void daMidna_c::setMidnaNoDrawFlg() { - if ((!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1)) - && (!checkAppear() || !checkMidnaRealBody())) || daAlink_c::checkCloudSea()) - { + 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))) - { + } 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)) - { + 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)); } } @@ -2949,11 +3110,12 @@ void daMidna_c::setMidnaNoDrawFlg() { /* 804C4AE8-804C4B68 008948 0080+00 1/0 0/0 0/0 .text checkMetamorphoseEnableBase__9daMidna_cFv */ BOOL daMidna_c::checkMetamorphoseEnableBase() { BOOL tmp; - if (!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) - /* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */ - || !dComIfGs_isEventBit(0xD04) - || fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp)) - { + if ( + !daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) || + /* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */ + !dComIfGs_isEventBit(0xD04) || + fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) + ) { return FALSE; } return TRUE; @@ -2961,8 +3123,8 @@ BOOL daMidna_c::checkMetamorphoseEnableBase() { /* 804C4B68-804C4BC0 0089C8 0058+00 1/1 0/0 0/0 .text checkNoDrawState__9daMidna_cFv */ BOOL daMidna_c::checkNoDrawState() { - return mDemoMode == 0xb || checkStateFlg0(FLG0_UNK_400000) || checkStateFlg1(FLG1_UNK_20) - || (checkStateFlg0(FLG0_NO_DRAW) && !checkShadowModelDrawSmode()); + return mDemoMode == 0xB || checkStateFlg0(FLG0_UNK_400000) || + checkStateFlg1(FLG1_UNK_20) || (checkStateFlg0(FLG0_NO_DRAW) && !checkShadowModelDrawSmode()); } /* 804C4BC0-804C4FDC 008A20 041C+00 1/1 0/0 0/0 .text setSound__9daMidna_cFv */ @@ -2975,7 +3137,7 @@ void daMidna_c::setSound() { }; int idx = 4; - if (mDemoMode == 0xb || checkStateFlg1(FLG1_UNK_20) + if (mDemoMode == 0xB || checkStateFlg1(FLG1_UNK_20) || (checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg0(FLG0_UNK_10000) && !checkShadowModelDrawSmode())) { @@ -3051,8 +3213,9 @@ int daMidna_c::execute() { offStateFlg0(FLG0_UNK_40000000); } } + initMidnaModel(); - field_0x85a = shape_angle.y; + mPrevShapeAngleY = shape_angle.y; setDemoData(); offStateFlg0(FLG0_NO_INPUT); if (checkStateFlg0(FLG0_TAG_WAIT) && (link->checkMidnaUseAbility() @@ -3060,6 +3223,7 @@ int daMidna_c::execute() { || eventInfo.checkCommandTalk())) { offStateFlg0((daMidna_FLG0)(FLG0_PORTAL_OBJ_CALL | FLG0_TAG_WAIT | FLG0_UNK_200)); } + daMidna_matAnm_c::decMorfFrame(); checkMidnaPosState(); if (daPy_py_c::checkFirstMidnaDemo() && !checkStateFlg0(FLG0_WOLF_NO_POS)) { @@ -3070,19 +3234,16 @@ int daMidna_c::execute() { 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) - { + 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)) { @@ -3160,6 +3321,7 @@ int daMidna_c::execute() { onStateFlg0(FLG0_UNK_1000000); } } + if (event_id == 4 || event_id == 5) { dComIfGp_getEvent().reset(this); offStateFlg0(FLG0_UNK_8000); @@ -3174,17 +3336,20 @@ int daMidna_c::execute() { } 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) { + } 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); } @@ -3208,6 +3373,7 @@ int daMidna_c::execute() { 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 }; @@ -3263,51 +3429,99 @@ int daMidna_c::draw() { int bvar1 = false; dComIfGd_setListDark(); - if (!checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE) - && mpModel != NULL) { + 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.TevColor.r = (frame / end_frame) * -32.0f; + tevStr.TevColor.r = (mpMorf->getFrame() / mpMorf->getEndFrame()) * -32.0f; tevStr.TevColor.g = tevStr.TevColor.r; tevStr.TevColor.b = tevStr.TevColor.r; } else if (link->getIceDamageWaitTimer() != 0 || link->checkFreezeDamage() != 0) { tevStr.TevColor = link->tevStr.TevColor; field_0x6e0 = link->tevStr.TevColor; if (dKy_darkworld_check()) { - field_0x6e8 = (J3DGXColor)l_normalKColor; - field_0x6ec = (J3DGXColor)l_normalKColor2; + field_0x6e8 = l_normalKColor; + field_0x6ec = l_normalKColor2; } else { - field_0x6e8 = (J3DGXColor)l_lNormalKColor; - field_0x6ec = (J3DGXColor)l_lNormalKColor2; + field_0x6e8 = l_lNormalKColor; + field_0x6ec = l_lNormalKColor2; } } + g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); + + #if DEBUG + J3DGXColorS10 hairColor1; + J3DGXColor hairKColor1; + J3DGXColor hairKColor2; + if (mpHIO->m.hio_priority) { + hairColor1.r = mpHIO->m.hair_color_1r; + hairColor1.g = mpHIO->m.hair_color_1g; + hairColor1.g = mpHIO->m.hair_color_1g; + hairColor1.a = 0; + + hairKColor1.r = mpHIO->m.hair_k_color_1r; + hairKColor1.g = mpHIO->m.hair_k_color_1g; + hairKColor1.b = mpHIO->m.hair_k_color_1b; + hairKColor1.a = 0; + + hairKColor2.r = mpHIO->m.hair_k_color_2r; + hairKColor2.g = mpHIO->m.hair_k_color_2g; + hairKColor2.b = mpHIO->m.hair_k_color_2b; + hairKColor2.a = 0; + } + #endif + J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(4); if (field_0x668 != NULL) { field_0x668->getTevColorReg(0, &field_0x6e0); field_0x668->getTevKonstReg(0, &field_0x6e8); } + + #if DEBUG + if (mpHIO->m.hio_priority) { + material->setTevColor(1, &hairColor1); + material->setTevKColor(1, &hairKColor1); + } else { + material->setTevColor(1, &field_0x6e0); + material->setTevKColor(1, &field_0x6e8); + } + #else material->setTevColor(1, &field_0x6e0); material->setTevKColor(1, &field_0x6e8); + #endif + 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); + + #if DEBUG + if (mpHIO->m.hio_priority) { + material->setTevColor(1, &hairColor1); + material->setTevKColor(1, &hairKColor1); + material->setTevKColor(2, &hairKColor2); + } else { + material->setTevColor(1, &field_0x6e0); + material->setTevKColor(1, &field_0x6e8); + material->setTevKColor(2, &field_0x6ec); + } + #else material->setTevColor(1, &field_0x6e0); material->setTevKColor(1, &field_0x6e8); material->setTevKColor(2, &field_0x6ec); + #endif } 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; } @@ -3316,6 +3530,7 @@ int daMidna_c::draw() { if (field_0x668 != NULL) { field_0x668->getTevColorReg(0, &tevStr.TevColor); } + g_env_light.setLightTevColorType_MAJI(mpGokouBmd, &tevStr); mDoExt_modelEntryDL(mpGokouBmd); MtxP mtx = mpShadowModel->getAnmMtx(JNT_WORLD_ROOT); @@ -3329,6 +3544,7 @@ int daMidna_c::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)) { @@ -3367,17 +3583,40 @@ int daMidna_c::draw() { tevStr.TevColor.b = 0; dComIfGd_setList(); + #if DEBUG + if (UREG_S(2) != 0) { + const Vec src = {UREG_F(1), UREG_F(2), UREG_F(3)}; + cXyz work; + + if (UREG_S(2) == 100) { + cMtx_multVecSR(mpShadowModel->getBaseTRMtx(), &src, &work); + work += current.pos; + } else if (UREG_S(2) == 101) { + work = attention_info.position; + } else if (UREG_S(2) == 102) { + work = eyePos; + } else if (UREG_S(2) >= 200 && UREG_S(2) - 200 < 29) { + cMtx_multVec(mpShadowModel->getAnmMtx(UREG_S(2) - 200), &src, &work); + } else { + work = current.pos; + } + + static GXColor color = {0xFF, 0xFF, 0xFF, 0xFF}; + dDbVw_drawSphereOpa(work, UREG_F(0) + 5.0f, color, 1); + } + #endif + 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, + 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); @@ -3398,17 +3637,30 @@ static int daMidna_Draw(daMidna_c* i_this) { /* 804C61A4-804C6324 00A004 0180+00 1/1 0/0 0/0 .text __dt__9daMidna_cFv */ daMidna_c::~daMidna_c() { + #if DEBUG + if (mpHIO != NULL) { + mDoHIO_DELETE_CHILD(mpHIO->id); + } + #endif + dComIfG_resDelete(&mPhase, l_arcName); - daPy_py_c::m_midnaActor = NULL; + daPy_py_c::setMidnaActor(NULL); mSound.deleteObject(); } /* 804C6324-804C634C 00A184 0028+00 1/0 0/0 0/0 .text daMidna_Delete__FP9daMidna_c */ static int daMidna_Delete(daMidna_c* i_this) { + fpc_ProcID id = fopAcM_GetID(i_this); i_this->~daMidna_c(); return 1; } +// FAKEMATCH to get function ordering matching in retail +static void dummy() { + ((J3DTexNoAnm*)NULL)->calc(NULL); +} +template unsigned char cLib_calcTimer(unsigned char*); + /* 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,