From 02b81a670b1ee28c1fbb172fc2d43bfb659e06b7 Mon Sep 17 00:00:00 2001 From: 123456789758 <205478182+123456789758@users.noreply.github.com> Date: Fri, 22 May 2026 00:21:27 -0400 Subject: [PATCH] d_a_npc_md - 99% matching (#896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ‎ ‎ ‎ <‎ ‎ ‎> --- include/d/actor/d_a_npc_md.h | 91 +- src/d/actor/d_a_npc_md.cpp | 4467 +++++++++++++++++++++++++++------- 2 files changed, 3641 insertions(+), 917 deletions(-) diff --git a/include/d/actor/d_a_npc_md.h b/include/d/actor/d_a_npc_md.h index 2bc6cda85..015880a08 100644 --- a/include/d/actor/d_a_npc_md.h +++ b/include/d/actor/d_a_npc_md.h @@ -169,12 +169,12 @@ public: /* 0x1AC */ f32 m1AC; /* 0x1B0 */ f32 m1B0; /* 0x1B4 */ s16 m1B4; - /* 0x1B6 */ u16 m1B6; + /* 0x1B6 */ s16 m1B6; /* 0x1B8 */ u16 m1B8; - /* 0x1BA */ u16 m1BA; - /* 0x1BC */ u16 m1BC; - /* 0x1BE */ u16 m1BE; - /* 0x1C0 */ u16 m1C0; + /* 0x1BA */ s16 m1BA; + /* 0x1BC */ s16 m1BC; + /* 0x1BE */ s16 m1BE; + /* 0x1C0 */ s16 m1C0; /* 0x1C2 */ u16 m1C2; /* 0x1C4 */ s16 m1C4; /* 0x1C6 */ u8 m1C6; @@ -214,6 +214,7 @@ public: daMdStts_UNK1 = 0x00000001, daMdStts_UNK2 = 0x00000002, daMdStts_UNK4 = 0x00000004, + daMdStts_UNK8 = 0x00000008, daMdStts_FLY = 0x00000010, daMdStts_CAM_TAG_IN = 0x00000020, daMdStts_UNK40 = 0x00000040, @@ -264,20 +265,20 @@ public: void offDefaultTalkXY() { cLib_offBit(m30F0, daMdStts_DEFAULT_TALK_XY); } bool isDefaultTalkXY() { return cLib_checkBit(m30F0, daMdStts_DEFAULT_TALK_XY); } - void setOldLightBodyHit() {} // 0x20000? + void setOldLightBodyHit() { m3140 = isLightBodyHit(); } void setTypeEdaichi() { mType = 4; } void setTypeM_Dai() { mType = 5; } void setTypeM_DaiB() { mType = 6; } void setTypeShipRide() { mType = 7; } - bool isTypeAtorizk() { return mType == 0; } - bool isTypeAdanmae() { return mType == 1; } - bool isTypeM_Dra09() { return mType == 2; } - bool isTypeSea() { return mType == 3; } - bool isTypeEdaichi() { return mType == 4; } - bool isTypeM_Dai() { return mType == 5; } - bool isTypeM_DaiB() { return mType == 6; } - bool isTypeShipRide() { return mType == 7; } + BOOL isTypeAtorizk() { return mType == 0; } + BOOL isTypeAdanmae() { return mType == 1; } + BOOL isTypeM_Dra09() { return mType == 2; } + BOOL isTypeSea() { return mType == 3; } + BOOL isTypeEdaichi() { return mType == 4; } + BOOL isTypeM_Dai() { return mType == 5; } + BOOL isTypeM_DaiB() { return mType == 6; } + BOOL isTypeShipRide() { return mType == 7; } s16 getHead_x() { return mJntCtrl.getHead_x(); } s16 getHead_y() { return mJntCtrl.getHead_y(); } @@ -323,18 +324,23 @@ public: mpArmMorf->setAnmRate(mRunRate); } - void setStatus(u32) {} - void getFlyingTimer() {} - void setFlyingTimer(s16) {} - void calcFlyingTimer() {} - void checkBitEffectStatus(u8) {} - void clearJntAng() {} - void clearStatus() {} - void getTalkType() {} - void setTalkType(u8) {} - void setBitEffectStatus(u8) {} - void setEffectStatus(u8) {} - void setPiyo2TalkCNT(u8) {} + void setStatus(u32 status) { m30F0 = status; } + s16 getFlyingTimer() { return m_flyingTimer; } + void setFlyingTimer(s16 value) { m_flyingTimer = value; } + void calcFlyingTimer() { cLib_calcTimer(&m_flyingTimer); } + u8 checkBitEffectStatus(u8 bit) { return m3135 & bit; } + void clearJntAng() { + mJntCtrl.setHead_y(0); + mJntCtrl.setHead_x(0); + mJntCtrl.setBackBone_y(0); + mJntCtrl.setBackBone_x(0); + } + void clearStatus() { setStatus(0); } + u8 getTalkType() { return mType; } + void setTalkType(u8 type) { mType = type; } + void setBitEffectStatus(u8 bit) { cLib_onBit(m3135, bit); } + void setEffectStatus(u8 status) { m3135 = status; } + void setPiyo2TalkCNT(u8 cnt) { m313C = cnt; } daNpc_Md_c() {} ~daNpc_Md_c(); @@ -383,7 +389,7 @@ public: BOOL carryNpcAction(void*); BOOL throwNpcAction(void*); BOOL glidingNpcAction(void*); - void windProc(); + s16 windProc(); BOOL fallNpcAction(void*); BOOL fall02NpcAction(void*); BOOL wallHitNpcAction(void*); @@ -395,9 +401,9 @@ public: BOOL demoFlyNpcAction(void*); void routeAngCheck(cXyz&, s16*); void routeWallCheck(cXyz&, cXyz&, s16*); - void checkForwardGroundY(s16); - void checkWallJump(s16); - void routeCheck(f32, s16*); + f32 checkForwardGroundY(s16); + f32 checkWallJump(s16); + BOOL routeCheck(f32, s16*); BOOL searchNpcAction(void*); BOOL hitNpcAction(void*); void setNormalSpeedF(f32, f32, f32, f32, f32); @@ -460,7 +466,7 @@ public: BOOL setAnm(int); bool dNpc_Md_setAnm(mDoExt_McaMorf2*, f32, int, f32, f32, char*, char*, const char*); bool dNpc_Md_setAnm(mDoExt_McaMorf*, int, f32, f32, char*, const char*); - u8 chkAttention(cXyz, s16, int); + bool chkAttention(cXyz, s16, int); bool chkArea(cXyz*); void carryCheck(); void eventOrder(); @@ -472,7 +478,7 @@ public: void setAttention(bool); void lookBack(int, int, int); void lookBack(cXyz*, int, int); - void lookBackWaist(s16, f32); + s32 lookBackWaist(s16, f32); void setBaseMtx(); void deletePiyoPiyo(); BOOL init(); @@ -537,13 +543,15 @@ public: /* 0x3088 */ cXyz m3088; /* 0x3094 */ cXyz m3094; /* 0x30A0 */ cXyz m30A0; - /* 0x30AC */ u8 m30AC[0x30D0 - 0x30AC]; + /* 0x30AC */ cXyz m30AC; + /* 0x30B8 */ cXyz m30B8; + /* 0x30C4 */ cXyz m30C4; /* 0x30D0 */ f32 m30D0; /* 0x30D4 */ ActionFunc mCurrPlayerActionFunc; /* 0x30E0 */ ActionFunc mCurrNpcActionFunc; /* 0x30EC */ u32 mMsgNo; /* 0x30F0 */ u32 m30F0; - /* 0x30F4 */ u8 m30F4[0x30F8 - 0x30F4]; + /* 0x30F4 */ u32 m30F4; /* 0x30F8 */ f32 m30F8; /* 0x30FC */ f32 mRunRate; /* 0x3100 */ int m3100; @@ -575,12 +583,13 @@ public: /* 0x312C */ u8 m312C; /* 0x312D */ s8 m312D; /* 0x312E */ s8 mCurEventMode; - /* 0x312F */ u8 m312F[0x3131 - 0x312F]; + /* 0x312F */ u8 m312F; + /* 0x3130 */ u8 m3130; /* 0x3131 */ u8 m3131; /* 0x3132 */ s8 mActionStatus; /* 0x3133 */ u8 m3133; /* 0x3134 */ u8 m3134; - /* 0x3135 */ u8 m3135[0x3136 - 0x3135]; + /* 0x3135 */ u8 m3135; /* 0x3136 */ u8 m3136; /* 0x3137 */ u8 m3137; /* 0x3138 */ u8 mType; @@ -589,7 +598,8 @@ public: /* 0x313B */ u8 m313B[0x313C - 0x313B]; /* 0x313C */ u8 m313C; /* 0x313D */ u8 m313D; - /* 0x313E */ u8 m313E[0x3140 - 0x313E]; + /* 0x313E */ u8 m313E; + /* 0x313F */ s8 m313F; /* 0x3140 */ bool m3140; /* 0x3141 */ u8 m3141[0x3144 - 0x3141]; /* 0x3144 */ s16 m3144; @@ -597,9 +607,9 @@ public: /* 0x3148 */ s16 m3148; /* 0x314A */ s16 m314A; /* 0x314C */ s16 m314C; - /* 0x314E */ u8 m314E[0x3150 - 0x314E]; + /* 0x314E */ s16 m314E; /* 0x3150 */ f32 m3150; - /* 0x3154 */ u8 m3154[0x3158 - 0x3154]; + /* 0x3154 */ f32 m3154; /* 0x3158 */ s16 mEventIdxTable[10]; /* 0x316C */ s8 m_hair_jnt_nums[8]; /* 0x3174 */ cXyz m3174[8]; @@ -607,7 +617,8 @@ public: /* 0x3234 */ cXyz m3234[4]; /* 0x3264 */ f32 m3264[8]; /* 0x3284 */ char mModelArcName[3]; - /* 0x3287 */ u8 m3287[0x32A4 - 0x3287]; + /* 0x3287 */ u8 m3287[0x3298 - 0x3287]; + /* 0x3298 */ cXyz m3298; /* 0x32A4 */ cXyz m32A4; /* 0x32B0 */ cBgS_PolyInfo mPolyInfo; }; diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index be79909fc..b13479112 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -1,6 +1,6 @@ /** * d_a_npc_md.cpp - * Player - Medli + * Player - Medli / リト族(メドリ) ("Rito (Medli)" (Ritozoku (Medli))) */ #include "d/dolzel_rel.h" // IWYU pragma: keep @@ -13,6 +13,7 @@ #include "m_Do/m_Do_mtx.h" #include "d/actor/d_a_player_main.h" #include "d/d_snap.h" +#include "f_op/f_op_camera.h" #include "d/actor/d_a_ship.h" #include "d/d_kankyo_wether.h" #include "d/d_camera.h" @@ -160,7 +161,6 @@ static dCcD_SrcCyl l_wind_cyl_src = { }}, }; - /* 000000EC-0000013C .text __ct__15daNpc_Md_HIO6_cFv */ daNpc_Md_HIO6_c::daNpc_Md_HIO6_c() { m04 = 500.0f; @@ -182,14 +182,13 @@ daNpc_Md_HIO5_c::daNpc_Md_HIO5_c() { /* 00000164-00000188 .text __ct__15daNpc_Md_HIO4_cFv */ daNpc_Md_HIO4_c::daNpc_Md_HIO4_c() { - /* Nonmatching */ m4 = 86.0f; m8 = 0; } /* 00000188-000001F4 .text __ct__15daNpc_Md_HIO3_cFv */ daNpc_Md_HIO3_c::daNpc_Md_HIO3_c() { - m04 = 0.8f; + m04 = DEMO_SELECT(1.0f, 0.8f); m08 = 0.2f; m0C = -5.0f; m10 = -5.0f; @@ -197,10 +196,10 @@ daNpc_Md_HIO3_c::daNpc_Md_HIO3_c() { m18 = 0; m1A = 0; m1C = 0; - m1E = 3800; - m20 = 5800; + m1E = DEMO_SELECT(3000, 3800); + m20 = DEMO_SELECT(6000, 5800); m22 = 0x7FFF; - m24 = -0x7FFF; + m24 = DEMO_SELECT(5800, -0x7FFF); } /* 000001F4-00000274 .text __ct__15daNpc_Md_HIO2_cFv */ @@ -331,7 +330,7 @@ s16 daNpc_Md_c::XyCheckCB(int i_itemBtn) { return TRUE; } if (selectItemNo == dItem_GOLDEN_FEATHER_e) { - if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E40) || (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E40) && m_seaTalk)) { + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E40) || (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E40) && isSeaTalk())) { return TRUE; } } @@ -373,11 +372,11 @@ cPhs_State daNpc_Md_c::create() { m313D = 0; strcpy(mModelArcName, l_arc_name); int heapSizeIdx = 0; - + fopAcM_ct_Retail(this, daNpc_Md_c); - - mType = fopAcM_GetParam(this) >> 0x08; - if ((int)mType == -2) { // Bug: Comparing unsigned value with -2 is always false. + + setTalkType(fopAcM_GetParam(this) >> 0x08); + if ((int)getTalkType() == -2) { // !@bug: Comparing unsigned value with -2 is always false. dComIfGs_onEventBit(dSv_event_flag_c::UNK_1620); } else { if (dComIfGs_isCollect(0, 2)) { @@ -418,22 +417,22 @@ cPhs_State daNpc_Md_c::create() { return cPhs_ERROR_e; } } - + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E04) && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1608)) { setTypeShipRide(); strcpy(mModelArcName, l_arc_name_ship); heapSizeIdx = 1; } - + cPhs_State phase_state = dComIfG_resLoad(&mPhase, mModelArcName); m313D = 1; if (phase_state == cPhs_COMPLEATE_e) { fopAcM_ct_Demo(this, daNpc_Md_c); - + if (dComIfGp_getCb1Player() != NULL) { return cPhs_ERROR_e; } - + static int l_heep_size[] = { 0x7660, 0x61C0, @@ -446,35 +445,30 @@ cPhs_State daNpc_Md_c::create() { #endif return cPhs_ERROR_e; } - + if (isTypeM_Dai()) { u8 flag = dComIfGs_getPlayerPriestFlag(); if (flag == 2) { - dComIfGs_setRestartOption( - &dComIfGs_getPlayerPriestPos(), - dComIfGs_getPlayerPriestRotate(), - dComIfGs_getPlayerPriestRoomNo(), - 2 - ); + dComIfGs_setRestartOption(&dComIfGs_getPlayerPriestPos(), dComIfGs_getPlayerPriestRotate(), dComIfGs_getPlayerPriestRoomNo(), 2); } checkRestart(2); } - - fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); - + + fopAcM_SetMtx(this, getModel()->getBaseTRMtx()); + if (l_HIO.mNo < 0) { l_HIO.mNo = mDoHIO_createChild("リト族(メドリ)", &l_HIO); // "Rito (Medli)" (Ritozoku (Medli)) l_HIO.mpActor = this; } - + if (!init()) { return cPhs_ERROR_e; } - + setBaseMtx(); fopAcM_setStageLayer(this); } - + return phase_state; } @@ -487,7 +481,7 @@ static BOOL nodeCallBack(J3DNode* node, int calcTiming) { if (i_this) { static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f); static cXyz l_offsetEyePos(15.0f, 0.0f, 0.0f); - + s32 jntNo = joint->getJntNo(); mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); mDoMtx_stack_c::multVec(&l_offsetAttPos, &i_this->getAttentionBasePos()); @@ -517,7 +511,8 @@ static BOOL waistNodeCallBack(J3DNode* node, int calcTiming) { daNpc_Md_c* i_this = (daNpc_Md_c*)model->getUserArea(); if (i_this) { s32 jntNo = joint->getJntNo(); - mDoMtx_multVecArray(model->getAnmMtx(jntNo), waistVecDat, i_this->getPHairWall(), ARRAY_SIZE(waistVecDat)); + MtxP r3 = model->getAnmMtx(jntNo); + mDoMtx_multVecArray(r3, waistVecDat, i_this->getPHairWall(), ARRAY_SIZE(waistVecDat)); mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); if (i_this->checkStatus(daNpc_Md_c::daMdStts_UNK4000)) { mDoMtx_stack_c::XrotM(i_this->getWaistRotY()); @@ -561,10 +556,10 @@ static BOOL armNodeCallBack(J3DNode* node, int calcTiming) { static BOOL hairCross(cXyz* i_r3, cXyz* i_r4, cXyz* i_r5) { cM3dGTri r1_198(&i_r3[0], &i_r3[1], &i_r3[2]); cM3dGTri r1_160(&i_r3[1], &i_r3[3], &i_r3[2]); - + cM3dGLin r1_144; r1_144.SetStartEnd(*i_r4, *i_r5); - + cXyz r1_138; if (r1_198.cross(&r1_144, &r1_138, true, false)) { r1_198.Up(2.0f); @@ -595,7 +590,7 @@ static BOOL hairCross(cXyz* i_r3, cXyz* i_r4, cXyz* i_r5) { return TRUE; } } - + return FALSE; } @@ -667,7 +662,7 @@ static BOOL hairNodeCallBack(J3DNode* node, int calcTiming) { if (i_this->getHairJntNum(i) != jntNo) { continue; } - + MtxP mtx = model->getAnmMtx(jntNo); if (!i_this->checkBitHairMode(HairModeMaskData[i])) { i_this->setBitHairMode(HairModeMaskData[i]); @@ -675,12 +670,12 @@ static BOOL hairNodeCallBack(J3DNode* node, int calcTiming) { hairPos->set(mtx[0][3], mtx[1][3], mtx[2][3]); f32* hairDist = i_this->getPHairDist(i); cXyz* r29 = i_this->getPHairVec(i); - *r29 = (*hairPos - *i_this->getPHairPos(i-1)); + *r29 = (*hairPos - *i_this->getPHairPos(i - 1)); *hairDist = r29->abs(); break; } - - cXyz* r25 = i_this->getPHairPos(i-1); + + cXyz* r25 = i_this->getPHairPos(i - 1); cXyz* r28 = i_this->getPHairPos(i); cXyz* r24 = i_this->getPHairVec(i); if (i <= 1) { @@ -690,9 +685,9 @@ static BOOL hairNodeCallBack(J3DNode* node, int calcTiming) { *r24 = (*r28 - *r25); break; } - + f32* hairDist = i_this->getPHairDist(i); - cXyz* r22 = i_this->getPHairVec(i-1); + cXyz* r22 = i_this->getPHairVec(i - 1); cXyz r1_e8; cXyz r1_dc; cXyz r1_d0 = *r28; @@ -713,8 +708,8 @@ static BOOL hairNodeCallBack(J3DNode* node, int calcTiming) { r1_c4 = *r24; *r28 = r1_c4 * *hairDist + *r25; } - - s16 prevHaitJntNo = i_this->getHairJntNum(i-1); + + s16 prevHaitJntNo = i_this->getHairJntNum(i - 1); cXyz r1_b8 = r22->normZP(); Mtx r1_124; cM3d_UpMtx_Base(r1_b8, r1_c4, r1_124); @@ -759,62 +754,73 @@ BOOL daNpc_Md_c::createHeap() { strcpy(wait_anim_name, "md_wait01.bck"); strcpy(arm_wait_anim_name, "mdarm_wait01.bck"); } - + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "md.bdl"); - JUT_ASSERT(1995, modelData != NULL); - + JUT_ASSERT(DEMO_SELECT(1960, 1995), modelData != NULL); + mpMorf = new mDoExt_McaMorf2( modelData, - NULL, NULL, + NULL, + NULL, (J3DAnmTransformKey*)dComIfG_getObjectRes(mModelArcName, wait_anim_name), NULL, - J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + J3DFrameCtrl::EMode_LOOP, + 1.0f, + 0, + -1, + 1, NULL, 0x00080000, 0x11020022 ); - if (!mpMorf || !mpMorf->getModel()) { + if (!mpMorf || !getModel()) { return FALSE; } - + m_backbone1_jnt_num = modelData->getJointName()->getIndex("backbone1"); - JUT_ASSERT(2013, m_backbone1_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(1978, 2013), m_backbone1_jnt_num >= 0); m_backbone2_jnt_num = modelData->getJointName()->getIndex("backbone2"); - JUT_ASSERT(2016, m_backbone2_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(1981, 2016), m_backbone2_jnt_num >= 0); m_armR_jnt_num = modelData->getJointName()->getIndex("armR"); - JUT_ASSERT(2019, m_armR_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(1984, 2019), m_armR_jnt_num >= 0); m_armL_jnt_num = modelData->getJointName()->getIndex("armL"); - JUT_ASSERT(2022, m_armL_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(1987, 2022), m_armL_jnt_num >= 0); m_neck_jnt_num = modelData->getJointName()->getIndex("neck"); - JUT_ASSERT(2025, m_neck_jnt_num >= 0); - + JUT_ASSERT(DEMO_SELECT(1990, 2025), m_neck_jnt_num >= 0); + s16 head_jnt_num = modelData->getJointName()->getIndex("head"); if (head_jnt_num >= 0) { modelData->getJointNodePointer(head_jnt_num)->setCallBack(nodeCallBack); } modelData->getJointNodePointer(m_backbone1_jnt_num)->setCallBack(waistNodeCallBack); - m_hair_jnt_nums[0] = modelData->getJointName()->getIndex(hairName[0]); - if (m_hair_jnt_nums[0] >= 0) { - modelData->getJointNodePointer(m_hair_jnt_nums[0])->setCallBack(hairTopNodeCallBack); + int i = 0; + m_hair_jnt_nums[i] = modelData->getJointName()->getIndex(hairName[i]); + if (m_hair_jnt_nums[i] >= 0) { + modelData->getJointNodePointer(m_hair_jnt_nums[i])->setCallBack(hairTopNodeCallBack); } - for (int i = 1; i < (int)ARRAY_SIZE(hairName); i++) { + for (i = 1; i < (int)ARRAY_SIZE(hairName); i++) { m_hair_jnt_nums[i] = modelData->getJointName()->getIndex(hairName[i]); if (m_hair_jnt_nums[i] >= 0) { modelData->getJointNodePointer(m_hair_jnt_nums[i])->setCallBack(hairNodeCallBack); } } - - mpMorf->getModel()->setUserArea((u32)this); - + + getModel()->setUserArea((u32)this); + modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "mdarm.bdl"); - JUT_ASSERT(2051, modelData != NULL); - + JUT_ASSERT(DEMO_SELECT(2016, 2051), modelData != NULL); + mpArmMorf = new mDoExt_McaMorf2( modelData, - NULL, NULL, + NULL, + NULL, (J3DAnmTransformKey*)dComIfG_getObjectRes(mModelArcName, arm_wait_anim_name), NULL, - J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 0, + J3DFrameCtrl::EMode_LOOP, + 1.0f, + 0, + -1, + 0, NULL, 0x00000000, 0x11020203 @@ -822,28 +828,33 @@ BOOL daNpc_Md_c::createHeap() { if (!mpArmMorf || !mpArmMorf->getModel()) { return FALSE; } - + m_armRloc_jnt_num = modelData->getJointName()->getIndex("armRloc"); - JUT_ASSERT(2065, m_armRloc_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2028, 2065), m_armRloc_jnt_num >= 0); m_armLloc_jnt_num = modelData->getJointName()->getIndex("armLloc"); - JUT_ASSERT(2068, m_armLloc_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2031, 2068), m_armLloc_jnt_num >= 0); m_handL_jnt_num = modelData->getJointName()->getIndex("handL"); - JUT_ASSERT(2071, m_handL_jnt_num >= 0); - + JUT_ASSERT(DEMO_SELECT(2034, 2071), m_handL_jnt_num >= 0); + modelData->getJointNodePointer(m_armRloc_jnt_num)->setCallBack(armNodeCallBack); modelData->getJointNodePointer(m_armLloc_jnt_num)->setCallBack(armNodeCallBack); - + mpArmMorf->getModel()->setUserArea((u32)this); - + if (!isTypeShipRide()) { modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "mdwing.bdl"); - JUT_ASSERT(2083, modelData != NULL); - + JUT_ASSERT(DEMO_SELECT(2046, 2083), modelData != NULL); + mpWingMorf = new mDoExt_McaMorf( modelData, - NULL, NULL, + NULL, + NULL, (J3DAnmTransformKey*)dComIfG_getObjectRes(mModelArcName, "mdwing_wait01.bck"), - J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 0, + J3DFrameCtrl::EMode_LOOP, + 1.0f, + 0, + -1, + 0, NULL, 0x00000000, 0x11020203 @@ -851,53 +862,53 @@ BOOL daNpc_Md_c::createHeap() { if (!mpWingMorf || !mpWingMorf->getModel()) { return FALSE; } - + m_wingRloc_jnt_num = modelData->getJointName()->getIndex("wingRloc"); - JUT_ASSERT(2097, m_wingRloc_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2058, 2097), m_wingRloc_jnt_num >= 0); m_wingLloc_jnt_num = modelData->getJointName()->getIndex("wingLloc"); - JUT_ASSERT(2100, m_wingLloc_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2061, 2100), m_wingLloc_jnt_num >= 0); m_wingR2_jnt_num = modelData->getJointName()->getIndex("wingR2"); - JUT_ASSERT(2103, m_wingR2_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2064, 2103), m_wingR2_jnt_num >= 0); m_wingL2_jnt_num = modelData->getJointName()->getIndex("wingL2"); - JUT_ASSERT(2106, m_wingL2_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2067, 2106), m_wingL2_jnt_num >= 0); m_wingR3_jnt_num = modelData->getJointName()->getIndex("wingR3"); - JUT_ASSERT(2109, m_wingR3_jnt_num >= 0); + JUT_ASSERT(DEMO_SELECT(2070, 2109), m_wingR3_jnt_num >= 0); m_wingL3_jnt_num = modelData->getJointName()->getIndex("wingL3"); - JUT_ASSERT(2112, m_wingL3_jnt_num >= 0); - + JUT_ASSERT(DEMO_SELECT(2073, 2112), m_wingL3_jnt_num >= 0); + modelData->getJointNodePointer(m_wingRloc_jnt_num)->setCallBack(armNodeCallBack); modelData->getJointNodePointer(m_wingLloc_jnt_num)->setCallBack(armNodeCallBack); - + mpWingMorf->getModel()->setUserArea((u32)this); } - + modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "md_harp.bdl"); mpHarpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); if (!mpHarpModel) { return FALSE; } - + modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "ymdhp00.bdl"); mpHarpLightModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); if (!mpHarpLightModel) { return FALSE; } - + if (!initLightBtkAnm(false)) { return FALSE; } if (!initTexPatternAnm(0, 0)) { return FALSE; } - + mAcchCir[0].SetWall(20.0f, 20.0f); mAcchCir[1].SetWall(60.0f, 20.0f); - mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, ARRAY_SIZE(mAcchCir), mAcchCir, fopAcM_GetSpeed_p(this)); + mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, ARRAY_SIZE(mAcchCir), mAcchCir, fopAcM_GetSpeed_p(this)); mAcch.ClrRoofNone(); mAcch.SetRoofCrrHeight(120.0f); mAcch.OnLineCheck(); mAcch.ClrWaterNone(); - + return TRUE; } @@ -930,14 +941,14 @@ void daNpc_Md_c::npcAction(void* arg) { setNpcAction(&daNpc_Md_c::waitNpcAction); } } - + (this->*mCurrNpcActionFunc)(arg); } /* 00003124-00003194 .text setNpcAction__10daNpc_Md_cFM10daNpc_Md_cFPCvPvPv_iPv */ void daNpc_Md_c::setNpcAction(ActionFunc actionFunc, void* arg) { #if VERSION > VERSION_DEMO - m_flying = false; + offFlying(); #endif mCurrPlayerActionFunc = NULL; setAction(&mCurrNpcActionFunc, actionFunc, arg); @@ -949,8 +960,13 @@ void daNpc_Md_c::playerAction(void* arg) { speedF = 0.0f; setPlayerAction(&daNpc_Md_c::waitPlayerAction); } - - if (mAcch.ChkGroundHit() && isOldLightBodyHit()) { + +#if VERSION == VERSION_DEMO + if (isOldLightBodyHit()) +#else + if (mAcch.ChkGroundHit() && isOldLightBodyHit()) +#endif + { dComIfGp_setRStatusForce(dActStts_RETURN_e); if (chkPlayerAction(&daNpc_Md_c::mkamaePlayerAction)) { dComIfGp_setDoStatus(dActStts_BLANK_e); @@ -972,7 +988,7 @@ void daNpc_Md_c::playerAction(void* arg) { dComIfGp_setAStatus(dActStts_HIDDEN_e); } } - + (this->*mCurrPlayerActionFunc)(arg); } @@ -997,12 +1013,11 @@ int daNpc_Md_c::calcStickPos(s16 param_1, cXyz* param_2) { // This temp variable for attention is probably a fakematch, but it fixes a regswap in dAttention_c::Lockon. dAttention_c& attention = dComIfGp_getAttention(); dAttList_c* attList = attention.GetLockonList(0); - + bool r26 = attention.Lockon(); - - int r31 = !r26 ? 0 : - attention.LockonTruth() ? 1 : -1; - + + int r31 = !r26 ? 0 : attention.LockonTruth() ? 1 : -1; + if (attList == NULL) { attList = attention.GetActionList(0); } @@ -1010,17 +1025,13 @@ int daNpc_Md_c::calcStickPos(s16 param_1, cXyz* param_2) { *param_2 = attList->getActor()->eyePos; return r31; } - + if (r26) { param_1 = shape_angle.y; } - - param_2->set( - current.pos.x + 100.0f * cM_ssin(param_1), - current.pos.y, - current.pos.z + 100.0f * cM_scos(param_1) - ); - + + param_2->set(current.pos.x + 100.0f * cM_ssin(param_1), current.pos.y, current.pos.z + 100.0f * cM_scos(param_1)); + return r31; } @@ -1074,8 +1085,8 @@ void daNpc_Md_c::deleteHane03Emitter() { /* 00003784-000037C4 .text returnLinkPlayer__10daNpc_Md_cFv */ void daNpc_Md_c::returnLinkPlayer() { changePlayer(dComIfGp_getLinkPlayer()); - m_flying = false; - m_mirror = false; + offFlying(); + offMirror(); } /* 000037C4-00003824 .text shipRideCheck__10daNpc_Md_cFv */ @@ -1089,9 +1100,7 @@ BOOL daNpc_Md_c::shipRideCheck() { /* 00003824-00003908 .text isFallAction__10daNpc_Md_cFv */ BOOL daNpc_Md_c::isFallAction() { - return chkPlayerAction(&daNpc_Md_c::jumpPlayerAction) || - chkNpcAction(&daNpc_Md_c::fallNpcAction) || - chkNpcAction(&daNpc_Md_c::fall02NpcAction); + return chkPlayerAction(&daNpc_Md_c::jumpPlayerAction) || chkNpcAction(&daNpc_Md_c::fallNpcAction) || chkNpcAction(&daNpc_Md_c::fall02NpcAction); } /* 00003908-00003958 .text returnLinkCheck__10daNpc_Md_cFv */ @@ -1112,7 +1121,7 @@ BOOL daNpc_Md_c::lightHitCheck() { cXyz lightVec; cMtx_multVecSR(mpHarpModel->getBaseTRMtx(), &l_ms_light_local_vec, &lightVec); offLightBodyHit(); - + if (dComIfGp_getDetect().chk_light(¤t.pos)) { onLightBodyHit(); lightHit = TRUE; @@ -1125,10 +1134,10 @@ BOOL daNpc_Md_c::lightHitCheck() { } } } - + if (lightHit) { onLightHit(); - + if (mCps.ChkAtHit()) { fopAc_ac_c* hitActor = mCps.GetAtHitAc(); if (fopAcM_CheckStatus(this, fopAcStts_CARRY_e) && !isNoCarryAction()) { @@ -1138,7 +1147,7 @@ BOOL daNpc_Md_c::lightHitCheck() { } else if (m3058.getEmitter() == NULL) { dComIfGp_particle_set(dPa_name::ID_AK_SN_HITSHIELDLIGHT00, ¤t.pos, NULL, NULL, 0xFF, &m3058); } - + cM3d_lineVsPosSuisenCross(mCps.GetStart(), mCps.GetEnd(), *mCps.GetAtHitPosP(), &m3058.getPos()); s16 angleY = cM_atan2s(lightVec.x, lightVec.z); s16 angleX = cM_atan2s(-lightVec.y, lightVec.absXZ()); @@ -1146,18 +1155,18 @@ BOOL daNpc_Md_c::lightHitCheck() { } else { m3058.end(); } - + if (!mCps.ChkAtSet()) { fopAcM_seStartCurrent(this, JA_SE_OBJ_MIRROR_REFLECT, 0); } else { fopAcM_seStartCurrent(this, JA_SE_OBJ_MIRROR_LIGHT, 0); } - + if (m304C.getEmitter() == NULL) { m304C.makeEmitter(dPa_name::ID_AK_SN_MIRRORSHIELD00, mpHarpLightModel->getBaseTRMtx(), ¤t.pos, NULL); - JPABaseEmitter* emitter = m304C.getEmitter(); JGeometry::TVec3 temp; temp.set(1.0f, 1.0f, 1.0f); + JPABaseEmitter* emitter = m304C.getEmitter(); emitter->setEmitterScale(temp); temp.set(0.0f, 4.0f, 0.0f); emitter->setEmitterTranslation(temp); @@ -1170,7 +1179,7 @@ BOOL daNpc_Md_c::lightHitCheck() { m304C.end(); } } - + return lightHit; } @@ -1198,8 +1207,8 @@ void daNpc_Md_c::NpcCall(int* r31) { *r31 = 1; } } else { - f32 temp = 2.0f*l_HIO.m0C4; - if (dist_sq >= temp*temp) { + f32 temp = 2.0f * l_HIO.m0C4; + if (dist_sq >= temp * temp) { setNpcAction(&daNpc_Md_c::searchNpcAction); } *r31 = 1; @@ -1269,7 +1278,21 @@ void daNpc_Md_c::setMessageAnimation(u8 msgAnmAtr) { /* 00004230-0000433C .text waitGroundCheck__10daNpc_Md_cFv */ void daNpc_Md_c::waitGroundCheck() { - /* Nonmatching */ + if (mAcch.ChkGroundHit()) { + if (!isTypeM_Dra09()) { + if (dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) == 1) { + cLib_addCalcAngleS(&shape_angle.y, cM_atan2s(m32A4.x, m32A4.z), 8, 0x2000, 0x400); + speedF += 0.5f; + speedF = cLib_maxLimit(speedF, l_HIO.m008.m08); + } else { + speedF = 0.0f; + } + } + } else { + if (daPy_getPlayerActorClass() != this) { + setNpcAction(&daNpc_Md_c::fallNpcAction); + } + } } /* 0000433C-000043D4 .text chkAdanmaeDemoOrder__10daNpc_Md_cFv */ @@ -1342,14 +1365,14 @@ BOOL daNpc_Md_c::waitNpcAction(void*) { setHarpPlayNum(1); } } - + if (isTypeAdanmae() && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1102)) { fopAcM_delete(this); return TRUE; } - + int sp08 = 0; - + if (isTypeSea() && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1402)) { daPy_lk_c* link = daPy_getPlayerLinkActorClass(); f32 playerDistXZ2 = fopAcM_searchPlayerDistanceXZ2(this); @@ -1360,8 +1383,8 @@ BOOL daNpc_Md_c::waitNpcAction(void*) { mCurEventMode = 0xB; } } else { - s16 headAngle = shape_angle.y + mJntCtrl.getHead_y() + mJntCtrl.getBackbone_y(); - cLib_offBit(attention_info.flags, (fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e)); + s16 headAngle = shape_angle.y + getHead_y() + getBackbone_y(); + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); m312C = chkAttention(current.pos, headAngle, 1); sp08 = m312C; if (sp08 != 0) { @@ -1399,11 +1422,11 @@ BOOL daNpc_Md_c::waitNpcAction(void*) { } NpcCall(&sp08); } - + if (isTypeM_Dra09() && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1101) && dComIfGs_isSwitch(m3100, fopAcM_GetRoomNo(this))) { setNpcAction(&daNpc_Md_c::demoFlyNpcAction); } - + if (isTypeM_Dai() || isTypeEdaichi()) { if (m3104 == 0) { if (cLib_calcTimer(&m3144) == 0) { @@ -1414,7 +1437,7 @@ BOOL daNpc_Md_c::waitNpcAction(void*) { m3144 = (s16)cM_rndF(180.0f) + 60; } } - + if (isTypeAtorizk()) { if (chkArea(¤t.pos)) { lookBack(sp08, 0, 1); @@ -1451,7 +1474,64 @@ BOOL daNpc_Md_c::waitNpcAction(void*) { /* 00004B04-00004CFC .text harpWaitNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::harpWaitNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + setHarpPlayNum(1); + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + clearStatus(); + setBitStatus(daMdStts_UNK80); + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 0.0f; + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; +#if VERSION > VERSION_DEMO + m3144 = 0; + m3146 = 0xc; +#endif + } else if (mActionStatus != ACTION_ENDING) { +#if VERSION == VERSION_DEMO + if (m312A != 0) { + setHarpPlayNum(1); + } +#else + if (mActionStatus == ACTION_ONGOING_1) { + if (m312A != 0) { + m3146--; + if (m3146 != 0) { + setHarpPlayNum(1); + } else { + setAnm(0x11); + m3146 = 0x78; + mActionStatus++; + } + } + } else { + m3146--; + if (m3146 == 0) { + setHarpPlayNum(1); + m3146 = 0xc; + mActionStatus = ACTION_ONGOING_1; + } + } + if ((isTypeM_DaiB()) && (m3146 == 0xc)) { + BOOL bVar2 = false; + if (m3104 == 0x16) { + if (mpMorf->checkFrame(11.0f)) { + bVar2 = true; + } + } else if ((m3104 == 0x17) && (mpMorf->checkFrame(11.0f))) { + bVar2 = true; + } + if (bVar2) { + mDoAud_bgmStart(JA_BGM_MEDORI_TAKT_8); + } + } +#endif + setAttention(true); + } + return TRUE; } static fpc_ProcID l_msgId; @@ -1468,37 +1548,262 @@ BOOL daNpc_Md_c::XYTalkCheck() { /* 00004D40-0000504C .text talkNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::talkNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + l_msgId = fpcM_ERROR_PROCESS_ID_e; + mMsgNo = getMsg(); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + m312B = 0; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + m312C = chkAttention(current.pos, angle, 0); + if (mActionStatus == ACTION_ONGOING_1) { + if (XYTalkCheck()) { + mActionStatus = ACTION_ONGOING_2; + } + } else if (mActionStatus == ACTION_ONGOING_2) { + if (talk_init()) { + mActionStatus = ACTION_ONGOING_3; + } + } else if (mActionStatus == ACTION_ONGOING_3) { + if (talk(0)) { + if ((isTypeAtorizk()) || (isTypeM_Dra09())) { + mActionStatus = 4; + } else if (isTypeAdanmae()) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1104)) { + setNpcAction(&daNpc_Md_c::squatdownNpcAction); + } + } else { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + dComIfGp_event_reset(); + } + } else if (isTypeAtorizk()) { + if (dComIfGs_isEventBit(dSv_event_flag_c::MEDLI_GAVE_FATHERS_LETTER)) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + } else if ((isTypeM_Dra09()) && (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1101))) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + mJntCtrl.setTrn(); + lookBack(1, 0, 0); + current.angle.y = shape_angle.y; + setAttention(mpMorf->isMorf()); + } + return TRUE; } /* 0000504C-000051FC .text shipTalkNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::shipTalkNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + onNpcNotChange(); + onShipRide(); + l_msgId = fpcM_ERROR_PROCESS_ID_e; + mMsgNo = getMsg(); + setAnm(0x2b); + m312B = 0; + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { + offShipRide(); + } else { + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + m312C = chkAttention(current.pos, angle, 0); + if (mActionStatus == ACTION_ONGOING_1) { + if (talk_init()) { + mActionStatus = ACTION_ONGOING_2; + } + } else { + if (talk(0)) { + dComIfGp_event_reset(); + setNpcAction(&daNpc_Md_c::shipNpcAction); + } + } + lookBack(1, 0, 1); + current.angle.y = shape_angle.y; + setAttention(mpMorf->isMorf()); + } + return TRUE; } /* 000051FC-00005308 .text kyohiNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::kyohiNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + setAnm(0x27); + speedF = 0.0f; + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + m3144 = 2; + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (m312A != 0) { + m3144--; + if (m3144 == 0) { + setNpcAction(&::daNpc_Md_c::waitNpcAction); + } + } + setAttention(true); + } + return TRUE; } /* 00005308-00005534 .text shipNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::shipNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + onNpcNotChange(); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + setAnm(0x23); + speedF = 0.0f; + m30F8 = 120.0f; + if (dComIfGp_getShipActor() != NULL) { + onShipRide(); + } + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { + offShipRide(); + } else { + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + daShip_c* ship = dComIfGp_getShipActor(); + if (ship != NULL) { + onShipRide(); + if (std::fabsf(ship->speedF) < 0.001f) { + setAnm(0x2a); + if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + m312C = chkAttention(current.pos, angle, 0); + s32 r0 = m312C; + if (r0 != 0) { + cLib_onBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + mCurEventMode = 2; + } + } + } else { + setAnm(0x23); + } + } + if (m3104 == 0x23) { + mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false); + } else { + lookBack(1, 0, 1); + } + current.angle.y = shape_angle.y; + setAttention(true); + } + return TRUE; } /* 00005534-000057B0 .text mwaitNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::mwaitNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + offNpcCallCommand(); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + setAnm(0x20); + shape_angle.x = 0; + shape_angle.z = 0; + gravity = l_HIO.m0F4; + maxFallSpeed = -100.0f; + speedF = 0.0f; + speed.y = 0.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (!isLightBodyHit()) { + mActionStatus = ACTION_ONGOING_3; + } else { + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + f32 dVar3 = fopAcM_searchPlayerDistance2(this); + if (!checkNpcCallCommand()) { + if (dVar3 < (l_HIO.m0C8 * l_HIO.m0C8)) { + daPy_getPlayerLinkActorClass()->onNpcCallCommand(); + } + } else { + mActionStatus++; + if (dVar3 < ((l_HIO.m0C4 * 2.0f) * (l_HIO.m0C4 * 2.0f))) { + mActionStatus++; + } + } + } + if (mActionStatus != ACTION_ONGOING_1) { + m311A = 0; + m310C = 0.0f; + m3114 = 0; + m3116 = 0; + setAnm(0x21); + m312A = 0; + } + } else { + if ((lookBackWaist(m311A, m310C)) && (m312A != 0)) { + m3114 = 0; + m3116 = 0; + if (mActionStatus == ACTION_ONGOING_2) { + setNpcAction(&daNpc_Md_c::searchNpcAction); + } else { + setAnm(0); + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + } + } + setAttention(true); + } + return TRUE; } /* 000057B0-000058E0 .text squatdownNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::squatdownNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + setAnm(3); + speedF = 0.0f; + m30F8 = 75.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + m312C = chkAttention(current.pos, angle, 0); + if (m312A != 0) { + setNpcAction(&daNpc_Md_c::sqwait01NpcAction); + } + setAttention(true); + } + return TRUE; } /* 000058E0-00005A74 .text sqwait01NpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::sqwait01NpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + if (dComIfGs_isEventBit(dSv_event_flag_c::MEDLI_GAVE_FATHERS_LETTER)) { + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + } + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + setAnm(4); + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + speedF = 0.0f; + m30F8 = 75.0f; + shape_angle.x = 0; + shape_angle.z = 0; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + m312C = chkAttention(current.pos, angle, 0); + if ((s8)getTalkType() >= 4) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + setAttention(true); + } + return TRUE; } /* 00005A74-00005AB0 .text changeCaught02__10daNpc_Md_cFv */ @@ -1509,57 +1814,566 @@ void daNpc_Md_c::changeCaught02() { /* 00005AB0-000061A8 .text carryNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::carryNpcAction(void*) { - /* Nonmatching */ + BOOL bVar1; + u32 sfxID; + f32 dVar9; + + if (mActionStatus == ACTION_STARTING) { +#if VERSION > VERSION_DEMO + onNpcNotChange(); +#endif + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + offNpcCallCommand(); + m3144 = shape_angle.y - dComIfGp_getPlayer(0)->shape_angle.y; + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + if (isNoCarryAction()) { + setAnm(0x24); + setBitStatus(daMdStts_UNK1); + setHane02Emitter(); + sfxID = JA_SE_CV_MD_CRASH; + } else { + if (m3104 == 4) { + setAnm(5); + } else { + setAnm(3); + m312A = 0; + } + sfxID = JA_SE_CV_MD_LIFT_UP; + } + fopAcM_monsSeStart(this, sfxID, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + m30F8 = 75.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { +#if VERSION > VERSION_DEMO + offNpcNotChange(); +#endif + m3298.y = 0.0f; + m3298.z = 0.0f; + offNoCarryAction(); + deleteHane02Emitter(); + deleteHane03Emitter(); + emitterDelete(m0508); + } else { + m3131 = 0; + bVar1 = false; + if (fopAcM_CheckStatus(this, fopAcStts_CARRY_e)) { + setRestart(2); + } + if (!isNoCarryAction()) { + int iVar3 = daPy_getPlayerLinkActorClass()->checkAutoJumpFlying(); + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + if (mActionStatus == ACTION_ONGOING_1) { + if (iVar3 > 0) { + mActionStatus = ACTION_ONGOING_2; + setAnm(9); + setBitStatus(daMdStts_UNK1); + setWingEmitter(); + setHane03Emitter(); + m312A = 0; + fopAcM_monsSeStart(this, JA_SE_CV_MD_FLY_WITH_LINK, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); +#if VERSION > VERSION_DEMO + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4001)) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_4180); + } +#endif + } else if (m3104 == 5) { + dVar9 = mpMorf->getPlaySpeed(); + if ((fopAcM_GetSpeedF(player) == 0.0f) && (player->getBaseAnimeFrame() <= mpMorf->getEndFrame())) { + mpMorf->setFrame(player->getBaseAnimeFrame()); + mpMorf->setPlaySpeed(0.0f); + mpArmMorf->setFrame(player->getBaseAnimeFrame()); + mpArmMorf->setPlaySpeed(0.0f); + } else { + mpMorf->setPlaySpeed(1.0f); + mpArmMorf->setPlaySpeed(1.0f); + } + if (dVar9 != mpMorf->getPlaySpeed()) { + mpMorf->setMorf(4.0f); + mpArmMorf->setMorf(4.0f); + } + cLib_chaseF(&m3298.x, l_HIO.m0F8, 1.0f); + cLib_chaseF(&m3298.y, l_HIO.m0FC, 1.0f); + cLib_chaseF(&m3298.z, l_HIO.m100, 1.0f); + } else if (m312A != 0) { + setAnm(5); + } + } else if (mActionStatus == ACTION_ONGOING_2) { + if (iVar3 < 0x1e) { + mActionStatus = ACTION_ONGOING_3; + mpMorf->setPlaySpeed(l_HIO.m120); + mpWingMorf->setPlaySpeed(l_HIO.m120); + } + } else if (iVar3 <= 0) { + mActionStatus = ACTION_ONGOING_1; + setBitEffectStatus(1); + deleteHane03Emitter(); + setAnm(5); + clearStatus(daMdStts_UNK1); + bVar1 = true; + fopAcM_monsSeStart(this, JA_SE_CV_MD_FLY_END, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + } + if (!fopAcM_CheckStatus(this, fopAcStts_CARRY_e)) { + if (isNoCarryAction()) { + if (speedF > 0.0f) { + setNpcAction(&daNpc_Md_c::throwNpcAction); + } else { + setNpcAction(&daNpc_Md_c::land03NpcAction); + } + } else if ((checkStatus(daMdStts_UNK1)) || (bVar1)) { +#if VERSION == VERSION_DEMO + if (current.pos.y - mAcch.GetGroundH() >= l_HIO.m1AC) +#else + f32 f1 = mAcch.GetGroundH(); + f32 f0 = current.pos.y; + if (f0 - f1 >= l_HIO.m1AC) +#endif + { + setNpcAction(&daNpc_Md_c::fall02NpcAction); + } else { + setNpcAction(&daNpc_Md_c::fallNpcAction); + } + } else if (speedF > 0.0f) { + setNpcAction(&daNpc_Md_c::throwNpcAction); + } else { + setNpcAction(&daNpc_Md_c::sqwait01NpcAction); + } + } + mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, m3110, false); + current.angle.y = shape_angle.y; + } + return TRUE; } /* 000061A8-00006450 .text throwNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::throwNpcAction(void*) { - /* Nonmatching */ + f32 fVar1; + s16 sVar3; + + if (mActionStatus == ACTION_STARTING) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_THROW, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + m314C = 1; + m314E = l_HIO.m1B4; + m3148 = 0; + m3154 = 0.0f; + speedF = l_HIO.m0E8; + speed.y = l_HIO.m0EC; + maxFallSpeed = l_HIO.m110; + gravity = l_HIO.m114; + m30A0 = current.pos; + clearStatus(daMdStts_UNK4); + setBitStatus(daMdStts_UNK1 | daMdStts_FLY); + setAnm(6); + setWingEmitter(); + mAcchCir[1].SetWall(60.0f, 60.0f); + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { + emitterDelete(m0508); + } else { + fVar1 = mpWingMorf->getFrame(); + if ((fVar1 == 23.0f) && (speed.y < l_HIO.m0F0)) { + speed.y = l_HIO.m0F0; + } + if (fVar1 > l_HIO.m154) { + sVar3 = windProc(); + if (sVar3 == 0) { + m314C = sVar3; + } + } + if (mAcch.ChkGroundHit()) { + setNpcAction(&daNpc_Md_c::land01NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (mAcch.ChkWallHit()) { + setNpcAction(&daNpc_Md_c::wallHitNpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (m312A != 0) { + setNpcAction(&daNpc_Md_c::glidingNpcAction); + } + setAttention(true); + } + return TRUE; } /* 00006450-00006764 .text glidingNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::glidingNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + if (m314C == 1) { + m3148 = 0; + setAnm(0xb); + } else { + m3148 = 1; + setAnm(10); + } + m314A = 2; + clearStatus(daMdStts_UNK4); + setBitStatus(daMdStts_UNK1 | daMdStts_FLY); + mAcchCir[1].SetWall(60.0f, 60.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (!chkAdanmaeDemoOrder()) { + if (mAcch.ChkGroundHit()) { + if (isTypeAdanmae()) { + setNpcAction(&daNpc_Md_c::land01NpcAction, &m3144); + } else { + setNpcAction(&daNpc_Md_c::land01NpcAction); + } + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (mAcch.ChkWallHit()) { + if (isTypeAdanmae()) { + setNpcAction(&daNpc_Md_c::wallHitNpcAction, &m3144); + } else { + setNpcAction(&daNpc_Md_c::wallHitNpcAction); + } + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else { + if (m3148 == 0) { + s16 sVar3 = windProc(); + if (m314C != sVar3) { + if (sVar3 == 0) { + setAnm(10); + m3148 = 1; + } else { + setAnm(0xb); + } + } + m314C = sVar3; + } else if (m312A != 0) { + m314A--; + if (m314A != 0) { + setAnm(10); + } else { + if (isTypeAdanmae()) { + setNpcAction(&daNpc_Md_c::fall02NpcAction, &m3144); + } else { + setNpcAction(&daNpc_Md_c::fall02NpcAction); + } + return TRUE; + } + } + // Required to match. + cXyz cStack_68(current.pos - m30A0); + } + } + setAttention(true); + } + return TRUE; +} + +static void unused_7570_7575_7612() { + daNpc_Md_c md; + md.setNpcAction(&daNpc_Md_c::land01NpcAction); + md.setNpcAction(&daNpc_Md_c::wallHitNpcAction); + md.setNpcAction(&daNpc_Md_c::fall02NpcAction); } /* 00006764-00006B24 .text windProc__10daNpc_Md_cFv */ -void daNpc_Md_c::windProc() { +s16 daNpc_Md_c::windProc() { /* Nonmatching */ + f32 fVar1; + cCcD_Obj* pcVar3; + s16 sVar4; + s16 sVar5; + f32 dVar6; + f32 local_a4; + cXyz local_34; + cXyz cStack_64; + cXyz cStack_70; + cXyz local_88; + + sVar5 = 1; + if (checkStatus(daMdStts_UNK8)) { + dKyw_get_AllWind_vec(¤t.pos, &local_34, &local_a4); + } else { + local_34.setall(0.0f); + local_a4 = 0.0f; + } + if ((l_HIO.m1C6 != 0) && (mCyl2.ChkTgHit())) { + pcVar3 = mCyl2.GetTgHitObj(); + if ((pcVar3 != NULL) && (pcVar3->ChkAtType(AT_TYPE_WIND))) { + local_34.set(*mCyl2.GetTgRVecP()); + local_34.normalizeZP(); + local_a4 = l_HIO.m148; + } + } + cStack_64.set(local_34.x, 0.0f, local_34.z); + //f32 cos = cM_scos(shape_angle.y); + //f32 sin = cM_ssin(shape_angle.y); + cStack_70.set(cM_ssin(shape_angle.y), 0.0f, cM_scos(shape_angle.y)); + dVar6 = l_HIO.m134; + if (!(std::fabsf(cStack_70.abs2XZ()) < G_CM3D_F_ABS_MIN)) { + cStack_64.normalizeZP(); + if (!(cStack_70.inprodXZ(cStack_64) > 0.7071f)) { + sVar5 = 0; + dVar6 = l_HIO.m130; + } + } + if (sVar5 == 0) { + fVar1 = (local_a4 * dVar6); + m3154 += l_HIO.m138; + if (m3154 > fVar1) { + m3154 = fVar1; + } + local_a4 = m3154; + } else { + local_a4 *= dVar6; + } + local_88 = speed + (local_34 * local_a4); + current.angle.y = cM_atan2s(local_88.x, local_88.z); + speedF = local_88.absXZ(); + speedF = cLib_maxLimit(speedF, l_HIO.m13C); + speed.y = local_88.y; + if (m3148 == 0) { + maxFallSpeed = l_HIO.m110; + gravity = l_HIO.m114; + } + if (!(std::fabsf(local_a4) < G_CM3D_F_ABS_MIN)) { + sVar4 = cLib_calcTimer(&m314E); + s16 sVar6 = l_HIO.m1B4 - l_HIO.m1B6; + if ((sVar5 == 1) && (sVar4 > 0) && (sVar4 < sVar6) && (l_HIO.m1C7 != 0 || (m3148 == 0))) { + maxFallSpeed = l_HIO.m140; + gravity = l_HIO.m144; + } + } + return sVar5; } /* 00006B24-00006C80 .text fallNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::fallNpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK4); + setBitStatus(daMdStts_FLY); + setAnm(0xc); + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (mAcch.ChkGroundHit()) { + setNpcAction(&daNpc_Md_c::land01NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (mAcch.ChkWallHit()) { + setNpcAction(&daNpc_Md_c::wallHitNpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } + setAttention(true); + } + return TRUE; } /* 00006C80-00006F70 .text fall02NpcAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::fall02NpcAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::fall02NpcAction(void* param_1) { + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK4); + setBitStatus(daMdStts_FLY); + maxFallSpeed = l_HIO.m110; + gravity = l_HIO.m114; + m30F8 = 120.0f; + setAnm(0xd); + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + if (param_1 != NULL) { + m3144 = 1; + } else { + m3144 = 0; + } + m3150 = current.pos.y; + } else if (mActionStatus != ACTION_ENDING) { + if ((isTypeM_Dai()) && (mAcch.ChkGroundHit())) { + if (m3150 - current.pos.y >= l_HIO.m1B0) { + dComIfGp_getVibration().StartShock(6, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + } + } + if (m3144 != 0) { + if (!chkAdanmaeDemoOrder()) { + if (mAcch.ChkGroundHit()) { + setNpcAction(&daNpc_Md_c::land03NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (mAcch.ChkWallHit()) { + setNpcAction(&daNpc_Md_c::wallHitNpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } + } + } else { + if (mAcch.ChkGroundHit()) { + setNpcAction(&daNpc_Md_c::land03NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } else if (mAcch.ChkWallHit()) { + setNpcAction(&daNpc_Md_c::wallHitNpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } + } + setAttention(true); + } + return TRUE; } /* 00006F70-000071E4 .text wallHitNpcAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::wallHitNpcAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::wallHitNpcAction(void* param_1) { + int iVar1; + + if (mActionStatus == ACTION_STARTING) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_CRASH, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + setAnm(0xd); + shape_angle.x = 0; + shape_angle.z = 0; + iVar1 = wallHitCheck(); + if (iVar1 >= 0) { + current.angle.y = mAcchCir[iVar1].GetWallAngleY(); + } + speedF = l_HIO.m150; + clearStatus(daMdStts_UNK1 | daMdStts_UNK4); + setBitStatus(daMdStts_UNK2 | daMdStts_FLY); + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + dComIfGp_getVibration().StartShock(5, -0x11, cXyz(0.0f, 1.0f, 0.0f)); + if (param_1 != NULL) { + m3144 = 1; + } else { + m3144 = 0; + } + } else if (mActionStatus != ACTION_ENDING) { + if (m3144 != 0) { + if ((!chkAdanmaeDemoOrder()) && (mAcch.ChkGroundHit())) { + setNpcAction(&daNpc_Md_c::land02NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } + } else if (mAcch.ChkGroundHit()) { + setNpcAction(&daNpc_Md_c::land02NpcAction); + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); + } + setAttention(true); + } + return TRUE; } /* 000071E4-000073BC .text land01NpcAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::land01NpcAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::land01NpcAction(void* param_1) { + if (mActionStatus == ACTION_STARTING) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_LANDING, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (checkStatus(daMdStts_UNK1)) { + setBitEffectStatus(1); + } + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + setAnm(0xe); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 0.0f; + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + if (param_1 != NULL) { + m3144 = 1; + } else { + m3144 = 0; + } + } else if (mActionStatus != ACTION_ENDING) { + if (m3144 != 0) { + if ((!chkAdanmaeDemoOrder()) && (m312A != 0)) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + } else if (m312A != 0) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + setAttention(true); + } + return TRUE; } /* 000073BC-000074C0 .text land02NpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::land02NpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + setAnm(0xf); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 0.0f; + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (m312A != 0) { + setNpcAction(&daNpc_Md_c::piyo2NpcAction); + } + setAttention(true); + } + return TRUE; } /* 000074C0-000075C4 .text land03NpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::land03NpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + setAnm(0xf); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 0.0f; + m30F8 = 120.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (m312A != 0) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + setAttention(true); + } + return TRUE; +} + +static void unused_7903() { + daNpc_Md_c md; + md.setNpcAction(&daNpc_Md_c::piyo2NpcAction); } /* 000075C4-00007824 .text piyo2NpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::piyo2NpcAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + cLib_onBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + setAnm(0x14); + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 0.0f; + m30F8 = 120.0f; + m3144 = l_HIO.m1BA; + if ((isTypeEdaichi()) || (isTypeM_Dai())) { + m3144 = m3144 >> 1; + } + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + fopAcM_seStart(this, JA_SE_CM_MD_PIYO, 0); + s16 angle = shape_angle.y + getHead_y() + getBackbone_y(); + if (cLib_calcTimer(&m3144) == 0) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + m312C = chkAttention(current.pos, angle, 0); + int local_28 = m312C; + if (local_28 != 0) { + if ((((isTypeAtorizk()) || (isTypeAdanmae())) || (isTypeM_Dra09())) || (isTypeSea())) { + cLib_onBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + } else { + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e); + } + if (isTypeAdanmae()) { + mCurEventMode = 2; + } + } + NpcCall(&local_28); + lookBack(1, 1, 0); + current.angle.y = shape_angle.y; + setAttention(true); + } + return TRUE; } /* 00007824-0000786C .text deleteNpcAction__10daNpc_Md_cFPv */ @@ -1574,46 +2388,249 @@ BOOL daNpc_Md_c::deleteNpcAction(void*) { /* 0000786C-00007A98 .text demoFlyNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::demoFlyNpcAction(void*) { - /* Nonmatching */ + cXyz local_1c; + + if (mActionStatus == ACTION_STARTING) { + attention_info.flags = 0; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + current.angle.y = 0x5700; + } else if (mActionStatus == ACTION_ENDING) { + emitterDelete(m0508); + } else { + attention_info.flags = 0; + if (mActionStatus == ACTION_ONGOING_1) { + if (mJntCtrl.trnChk()) { + cLib_addCalcAngleS2(&m3110, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800); + } else { + m3110 = 0; + setAnm(0x18); + mActionStatus++; + } + local_1c.x = -1511.0f; + local_1c.y = 14500.0f; + local_1c.z = 150.0f; + mJntCtrl.lookAtTarget(&shape_angle.y, &local_1c, current.pos, current.angle.y, m3110, false); + } else if (mActionStatus == ACTION_ONGOING_2) { + if (m312A != 0) { + setAnm(0x19); + setBitStatus(daMdStts_UNK1); + setWingEmitter(); + speed.y = 0.0f; + gravity = 1.0f; + maxFallSpeed = 100.0f; + mActionStatus++; + } + } else if (mActionStatus == ACTION_ONGOING_3) { + if (m312A != 0) { + setAnm(10); + } + if (current.pos.y > 14500.0f) { + setAnm(0xb); + speed.y = 0.0f; + gravity = 0.0f; + maxFallSpeed = 0.0f; + speedF = 17.0f; + m3144 = 0x3c; + mActionStatus++; + } + } else if ((mActionStatus == 4) && (cLib_calcTimer(&m3144) == 0)) { + fopAcM_delete(this); + } + setAttention(true); + } + return TRUE; } /* 00007A98-00007B64 .text routeAngCheck__10daNpc_Md_cFR4cXyzPs */ -void daNpc_Md_c::routeAngCheck(cXyz&, s16*) { - /* Nonmatching */ +void daNpc_Md_c::routeAngCheck(cXyz& param_1, s16* param_2) { + cXyz temp = m32A4.outprod(param_1); + s16 angle = cM_atan2s(temp.x, temp.z); + if ((m32A4.y >= 1.0f && cLib_distanceAngleS(angle, *param_2) > 0x4000) || fopAcM_searchPlayerDistanceY(this) * temp.y < 0.0f) { + angle += 0x8000; + } + *param_2 = angle; } /* 00007B64-00007DC8 .text routeWallCheck__10daNpc_Md_cFR4cXyzR4cXyzPs */ -void daNpc_Md_c::routeWallCheck(cXyz&, cXyz&, s16*) { - /* Nonmatching */ +void daNpc_Md_c::routeWallCheck(cXyz& param_1, cXyz& param_2, s16* param_3) { + dBgS_LinChk lin_chk; + lin_chk.Set(¶m_1, ¶m_2, NULL); + if (dComIfG_Bgsp()->LineCross(&lin_chk)) { + cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk); + if (pla) { + routeAngCheck(pla->mNormal, param_3); + } + } } /* 00007DC8-00008054 .text checkForwardGroundY__10daNpc_Md_cFs */ -void daNpc_Md_c::checkForwardGroundY(s16) { - /* Nonmatching */ +f32 daNpc_Md_c::checkForwardGroundY(s16 param_1) { + if (mAcchCir[0].ChkWallHit()) { + cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(mAcchCir[0]); + if (pla && cLib_distanceAngleS(param_1, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) { + dBgS_GndChk gnd_chk; + gnd_chk.OffWall(); + cXyz pos(current.pos.x + cM_ssin(param_1) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(param_1) * 80.0f); + gnd_chk.SetPos(&pos); + return dComIfG_Bgsp()->GroundCross(&gnd_chk); + } + } + //! @bug(?): is this supposed to be -G_CM3D_F_INF? + return -10000000.0f; } /* 000081EC-000082C0 .text checkWallJump__10daNpc_Md_cFs */ -void daNpc_Md_c::checkWallJump(s16) { - /* Nonmatching */ +f32 daNpc_Md_c::checkWallJump(s16 param_1) { + f32 temp = checkForwardGroundY(param_1) - current.pos.y; + if (0.0f < temp && temp < 80.0f) { + return std::sqrtf(temp) * 3.6f; + } + return -1.0f; } /* 000082C0-00008858 .text routeCheck__10daNpc_Md_cFfPs */ -void daNpc_Md_c::routeCheck(f32, s16*) { - /* Nonmatching */ +BOOL daNpc_Md_c::routeCheck(f32 param_1, s16* param_2) { + f32 temp2; + if (!mAcch.ChkGroundHit()) { + cXyz temp = current.pos; + current.pos = old.pos; + speedF = 0.0f; + m3131 = 1; + dBgS_LinChk lin_chk; + lin_chk.Set(&temp, ¤t.pos, NULL); + if (dComIfG_Bgsp()->LineCross(&lin_chk)) { + cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk); + if (pla && cLib_distanceAngleS(*param_2, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) { + return TRUE; + } + } + if (mAcch.GetGroundH() - temp.y < -100.0f) { + return FALSE; + } + temp2 = 20.0f; + setNpcAction(&daNpc_Md_c::jumpNpcAction, &temp2); + } else { + if (mAcch.ChkWallHit()) { + temp2 = checkWallJump(*param_2); + if (temp2 >= 0.0f) { + setNpcAction(&daNpc_Md_c::jumpNpcAction, &temp2); + return TRUE; + } + if (param_1 > SQUARE(600.0f)) { + return FALSE; + } + } + cXyz temp(current.pos.x, current.pos.y + 80.0f, current.pos.z); + cXyz temp2(cM_ssin(*param_2) * 80.0f + current.pos.x, current.pos.y + 80.0f, cM_scos(*param_2) * 80.0f + current.pos.z); + routeWallCheck(temp, temp2, param_2); + } + + return TRUE; } /* 00008858-00008CEC .text searchNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::searchNpcAction(void*) { - /* Nonmatching */ + f32 fVar2; + cXyz vec2; + cXyz vec; + + if (mActionStatus == ACTION_STARTING) { + setBitStatus(daMdStts_UNK4); + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + mAcchCir[1].SetWall(60.0f, 20.0f); + if (((m3104 == 0x11) || (m3104 == 0x16)) || (m3104 == 0x17)) { + setAnm(0x13); + mActionStatus++; + } else if (m3104 == 0x20) { + setAnm(0x21); + m312A = 0; + mActionStatus++; + } else { + setAnm(2); + mActionStatus += 2; + } + if (!mAcch.ChkGroundHit()) { + f32 gndY = mAcch.GetGroundH(); + f32 delta = gndY - current.pos.y; + if (delta < 0.0f && delta >= -30.1f) { + current.pos.y = gndY; + mAcch.SetGroundHit(); + speed.y = 0.0f; + } + } + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (m312A != 0) { + setAnm(2); + mActionStatus++; + } + } else { + m312C = 1; + daPy_py_c* player = daPy_getPlayerActorClass(); + BOOL door = player->eventInfo.checkCommandDoor(); + f32 dist_sq = fopAcM_searchPlayerDistanceXZ2(this); + f32 temp; + if (dist_sq < SQUARE(l_HIO.m0C4)) { + temp = 0.0f; + } else { + fVar2 = dist_sq - SQUARE(l_HIO.m0C4); + if (fVar2 > 90000.0f) { + fVar2 = 90000.0f; + } + temp = (fVar2 / 90000.0f); + if (temp < 0.5f) { + temp = 0.5f; + } + } + s16 angle, adjustedAngle; + angle = adjustedAngle = fopAcM_searchPlayerAngleY(this); + BOOL temp3 = routeCheck(dist_sq, &adjustedAngle) && cLib_distanceAngleS(angle, adjustedAngle) <= 0x2000; + if (door || !temp3 || + (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000000_e | daPyStts0_HANG_e | daPyStts0_UNK1_e) || player->checkAttentionLock())) + { + temp = 0.0f; + offNpcCallCommand(); + fopAcM_monsSeStart(this, JA_SE_CV_MD_LEFT_ALONE, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (!temp3) { + setNpcAction(&daNpc_Md_c::kyohiNpcAction); + return TRUE; + } + } else { + setRestart(2); + if (!door) { + if (cLib_calcTimer(&m3130) == 0) { + m312F ^= 1; + m3130 = cLib_getRndValue(8, 20); + } + } + } + walkProc(temp, adjustedAngle); + cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.m008.m24, l_HIO.m008.m20 * 2, l_HIO.m008.m22 * 2); + s16 temp4 = shape_angle.y; + vec2 = dNpc_playerEyePos(l_HIO.mNpc.m04); + vec = current.pos; + vec.y = eyePos.y; + mJntCtrl.lookAtTarget(&temp4, &vec2, vec, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false); + if (speedF < 0.001f) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } else { + shape_angle.y = temp4; + } + lookBack(1, 0, 0); + setAttention(true); + } + } + return TRUE; } /* 00008CEC-00008E54 .text hitNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::hitNpcAction(void* r29) { if (mActionStatus == ACTION_STARTING) { - setDamageFogTimer(5*30); + setDamageFogTimer(5 * 30); #if VERSION > VERSION_DEMO - // Bug: Reverb is being passed to JAIZelBasic::monsSeStart as argument r7 when it should be argument r8. - // The fopAcM_monsSeStart inline does not support passing reverb, but the programmer didn't realize this. + //! @bug: Reverb is being passed to JAIZelBasic::monsSeStart as argument r7 when it should be argument r8. + //! The fopAcM_monsSeStart inline does not support passing reverb, but the programmer didn't realize this. fopAcM_monsSeStart(this, JA_SE_CV_MD_CRASH, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); #endif s16 angle = 0; @@ -1707,13 +2724,105 @@ void daNpc_Md_c::walkProc(f32 f1, s16 r3) { } /* 00009180-000092E0 .text jumpNpcAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::jumpNpcAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::jumpNpcAction(void* param_1) { + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + if (param_1 != NULL) { + speed.y = *(f32*)param_1; + } + shape_angle.x = 0; + shape_angle.z = 0; + speedF = 4.0f; + gravity = l_HIO.m0F4; + maxFallSpeed = -100.0f; + setAnm(0xc); + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (mAcch.ChkGroundHit()) { + speedF = 0.0f; + setAnm(0xe); + m312A = 0; + mActionStatus++; + } + } else if (m312A != 0) { + speedF = 0.0f; + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + setAttention(true); + } + return TRUE; } /* 000092E0-000095C8 .text escapeNpcAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::escapeNpcAction(void*) { - /* Nonmatching */ + s16 sVar5; + s16 local_38; + + if (mActionStatus == ACTION_STARTING) { + setBitStatus(daMdStts_UNK4); + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + mAcchCir[1].SetWall(60.0f, 20.0f); + if (((m3104 == 0x11) || (m3104 == 0x16)) || (m3104 == 0x17)) { + setAnm(0x13); + mActionStatus++; + } else if (m3104 == 0x20) { + setAnm(0x21); + m312A = 0; + mActionStatus++; + } else { + setAnm(2); + mActionStatus += 2; + } + if (!mAcch.ChkGroundHit()) { + f32 gndY = mAcch.GetGroundH(); + f32 delta = gndY - current.pos.y; + if (delta < 0.0f && delta >= -30.1f) { + current.pos.y = gndY; + mAcch.SetGroundHit(); + speed.y = 0.0f; + } + } + m3144 = 0; + m3146 = 0x1e; + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (m312A != 0) { + setAnm(2); + mActionStatus++; + } + } else { + m312C = 1; + cLib_calcTimer(&m3146); + f32 f31 = 250000.0f; + f32 f30 = 1.0f; + if (m313F != 0) { + sVar5 = (m313F < 0) ? DEMO_SELECT(-0x4000, (s16)-0x4000) : DEMO_SELECT(0x4000, (s16)0x4000); + m3144 = DEMO_SELECT(sVar5, (s16)sVar5) + cM_atan2s(m30C4.x, m30C4.z); + } else if (m3146 == 0) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + return TRUE; + } + local_38 = m3144; + sVar5 = local_38; + if (routeCheck(f31, &local_38)) { + cLib_distanceAngleS(sVar5, local_38); + } + walkProc(f30, local_38); + cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.m008.m24, l_HIO.m008.m20 * 2, l_HIO.m008.m22 * 2); + s16 temp4 = shape_angle.y; + if (speedF < 0.001f) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } else { + shape_angle.y = temp4; + } + lookBack(0, 0, 0); + setAttention(true); + } + } + return TRUE; } /* 000095C8-00009894 .text waitPlayerAction__10daNpc_Md_cFPv */ @@ -1764,36 +2873,305 @@ BOOL daNpc_Md_c::waitPlayerAction(void*) { waitGroundCheck(); current.angle.y = shape_angle.y; } - + setAttention(mpMorf->isMorf()); } - + return TRUE; } /* 00009894-00009B08 .text walkPlayerAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::walkPlayerAction(void*) { - /* Nonmatching */ + int iVar1; + s16 sVar3; + f32 dVar4; + f32 local_64; + cXyz cStack_30; + + if (mActionStatus == ACTION_STARTING) { + setBitStatus(daMdStts_UNK4); + setAnm(2); + mMaxNormalSpeed = l_HIO.m008.m08; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if ((mActionStatus != ACTION_ENDING) && (!flyCheck())) { + dVar4 = g_mDoCPd_cpadInfo[0].mMainStickValue; + sVar3 = getStickAngY(0); + walkProc(dVar4, sVar3); + iVar1 = calcStickPos(sVar3, &cStack_30); + if (iVar1 == 0) { + cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.m008.m24, l_HIO.m008.m20 * 2, l_HIO.m008.m22 * 2); + } + s16 tempAngle = shape_angle.y; + mJntCtrl.lookAtTarget(&tempAngle, &cStack_30, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false); + if (iVar1 > 0) { + shape_angle.y = tempAngle; + } + if ((speedF < 0.001f) || (iVar1 != 0)) { + setPlayerAction(&daNpc_Md_c::waitPlayerAction); + } else if (!mAcch.ChkGroundHit()) { + local_64 = 10.0f; + setPlayerAction(&daNpc_Md_c::jumpPlayerAction, &local_64); + } else if (mAcch.ChkWallHit()) { + local_64 = checkWallJump(current.angle.y); + if (local_64 >= 0.0f) { + setPlayerAction(&daNpc_Md_c::jumpPlayerAction, &local_64); + return TRUE; + } + } + setAttention(true); + } + return TRUE; } /* 00009B08-00009CCC .text hitPlayerAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::hitPlayerAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::hitPlayerAction(void* param_1) { + s16 sVar2; + + if (mActionStatus == ACTION_STARTING) { + dComIfGp_getVibration().StartShock(5, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + setDamageFogTimer(5 * 30); +#if VERSION > VERSION_DEMO + fopAcM_monsSeStart(this, JA_SE_CV_MD_CRASH, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); +#endif + sVar2 = 0; + if (param_1 != NULL) { + sVar2 = *(s16*)param_1; + } + current.angle.y = sVar2; + speedF = 10.0f; + speed.y = 20.0f; + maxFallSpeed = -100.0f; + gravity = l_HIO.m0F4; + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + mAcchCir[1].SetWall(60.0f, 20.0f); + clearStatus(daMdStts_UNK1 | daMdStts_UNK4); + setBitStatus(daMdStts_UNK2); + m30F8 = 120.0f; + setAnm(0xd); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (mAcch.ChkGroundHit()) { + speedF = 0.0f; + setAnm(0xf); + m312A = 0; + mActionStatus++; + } + } else if (m312A != 0) { + returnLink(); + } + setAttention(true); + } + return TRUE; } /* 00009CCC-00009E7C .text jumpPlayerAction__10daNpc_Md_cFPv */ -BOOL daNpc_Md_c::jumpPlayerAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::jumpPlayerAction(void* param_1) { + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + if (param_1 != NULL) { + speed.y = *(f32*)param_1; + } + shape_angle.x = 0; + shape_angle.z = 0; + gravity = l_HIO.m0F4; + maxFallSpeed = -100.0f; + setAnm(0xc); + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + m3150 = current.pos.y; + } else if (mActionStatus != ACTION_ENDING) { + if (mActionStatus == ACTION_ONGOING_1) { + if (mAcch.ChkGroundHit()) { + if (m3150 - current.pos.y >= l_HIO.m1B0) { + dComIfGp_getVibration().StartShock(6, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + } + speedF = 0.0f; + setAnm(0xe); + m312A = 0; + mActionStatus++; + } + } else if (m312A != 0) { + setPlayerAction(&daNpc_Md_c::waitPlayerAction); + } + setAttention(true); + } + return TRUE; } /* 00009E7C-0000A534 .text flyPlayerAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::flyPlayerAction(void*) { - /* Nonmatching */ + s16 sVar2; + int iVar3; + f32 dVar8; + f32 dVar7; + cXyz cStack_44; + + if (mActionStatus == ACTION_STARTING) { + setAnm(0x18); + m3150 = current.pos.y + 1500.0f; + m3144 = l_HIO.m1BE; + m3146 = l_HIO.m1C0; + setFlyingTimer(getMaxFlyingTimer()); + speedF = 0.0f; + mAcchCir[1].SetWall(60.0f, 60.0f); + onFlying(); + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { + emitterDelete(m0508); + deleteHane03Emitter(); + offFlying(); + } else { + if (CPad_CHECK_TRIG_A(0)) { + m3146 = l_HIO.m1C0; + } else { + cLib_calcTimer(&m3146); + } + if (CPad_CHECK_TRIG_A(0)) { + m3144 = l_HIO.m1BE; + } else { + cLib_calcTimer(&m3144); + } + if (mActionStatus == ACTION_ONGOING_1) { + if (m312A != 0) { + setBitStatus(daMdStts_UNK1); + setWingEmitter(); + setAnm(0x19); + speedF = 0.0f; + speed.y = 20.0f; + gravity = l_HIO.m188; + maxFallSpeed = l_HIO.m18C; + m3144 = l_HIO.m1BE; + m3146 = l_HIO.m1C0; + mActionStatus++; + } + } else { + calcFlyingTimer(); +#if VERSION > VERSION_DEMO + if ((dComIfGs_isEventBit(dSv_event_flag_c::UNK_3320)) && (getFlyingTimer() < 300)) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3310); + } +#endif + if (((getFlyingTimer() == 0) || (m3144 == 0)) || (CPad_CHECK_TRIG_B(0))) { + if (checkStatus(daMdStts_UNK1)) { + setBitEffectStatus(1); + } + setPlayerAction(&daNpc_Md_c::jumpPlayerAction); + if (getFlyingTimer() == 0) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_FLY_END, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + return TRUE; + } + if ((m3104 != 0x2e) && (m312A != 0)) { + setAnm(7); + } + if ((getFlyingTimer() < l_HIO.m1C4) && (m3104 == 7)) { + setAnm(0x2e); + setHane03Emitter(); + } + dAttention_c& attention = dComIfGp_getAttention(); + if ((g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.m104) || attention.Lockon()) { + dVar8 = (g_mDoCPd_cpadInfo[0].mMainStickValue * l_HIO.m10C); + if ((0.0f < dVar8) && (dVar8 < l_HIO.m0D8)) { + dVar8 = l_HIO.m0D8; + } + sVar2 = getStickAngY(0); + cLib_distanceAngleS(sVar2, current.angle.y); + dVar7 = l_HIO.m0DC; + if (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.m104) { + cLib_addCalcAngleS(¤t.angle.y, sVar2, 8, 0x2000, 0x400); + } + iVar3 = calcStickPos(sVar2, &cStack_44); + if (iVar3 == 0) { + cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 8, 0x2000, 0x400); + } + s16 tempAngle = shape_angle.y; + mJntCtrl.lookAtTarget(&tempAngle, &cStack_44, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false); + if (iVar3 > 0) { + shape_angle.y = tempAngle; + } else { + if (g_mDoCPd_cpadInfo[0].mMainStickValue < l_HIO.m104) { + cLib_addCalcAngleS(¤t.angle.y, shape_angle.y, 8, 0x2000, 0x400); + } + } + f32 temp = dVar8; + if (temp > l_HIO.m0D4) { + dVar8 = l_HIO.m0D4; + } else { + dVar8 = temp; + } + cLib_chaseF(&speedF, dVar8, dVar7); + } else { + mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false); + current.angle.y = shape_angle.y; + } + gravity = l_HIO.m188; + if (m3146 != 0) { + maxFallSpeed = 10.0f; + } else { + maxFallSpeed = l_HIO.m18C; + } + if (current.pos.y >= m3150) { + current.pos.y = m3150; + } + if (mAcch.ChkGroundHit()) { + setFlyingTimer(0); + setPlayerAction(&daNpc_Md_c::landPlayerAction); + } + } + if (!checkStatus(daMdStts_UNK2)) { + if (checkStatus(daMdStts_UNK1)) { + sVar2 = shape_angle.y - current.angle.y; + if ((sVar2 < 0x6000) && (sVar2 > -0x6000)) { + if (sVar2 > 0x2000) { + sVar2 = 0x2000; + } else if (sVar2 < -0x2000) { + sVar2 = -0x2000; + } + cLib_addCalcAngleS(&shape_angle.z, sVar2, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.x, 0, 8, 0x2000, 0x400); + } else { + cLib_addCalcAngleS(&shape_angle.z, 0, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.x, -0x2000, 8, 0x2000, 0x400); + } + } else { + current.angle.y = shape_angle.y; + shape_angle.x = 0; + shape_angle.z = 0; + } + } + setAttention(true); + } + return TRUE; } /* 0000A534-0000A698 .text landPlayerAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::landPlayerAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_LANDING, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (checkStatus(daMdStts_UNK1)) { + setBitEffectStatus(1); + } + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + setAnm(0xe); + shape_angle.x = 0; + shape_angle.z = 0; + gravity = l_HIO.m0F4; + maxFallSpeed = -100.0f; + speedF = 0.0f; + speed.y = 0.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus != ACTION_ENDING) { + if (m312A != 0) { + speedF = 0.0f; + setPlayerAction(&daNpc_Md_c::waitPlayerAction); + } + setAttention(true); + } + return TRUE; } /* 0000A698-0000A8D0 .text mkamaePlayerAction__10daNpc_Md_cFPv */ @@ -1839,172 +3217,51 @@ BOOL daNpc_Md_c::mkamaePlayerAction(void*) { } else if (m312A != 0) { setPlayerAction(&daNpc_Md_c::waitPlayerAction); } - + setAttention(true); } - + return TRUE; } /* 0000A8D0-0000A9BC .text carryPlayerAction__10daNpc_Md_cFPv */ BOOL daNpc_Md_c::carryPlayerAction(void*) { - /* Nonmatching */ + if (mActionStatus == ACTION_STARTING) { + clearStatus(daMdStts_UNK2 | daMdStts_UNK4 | daMdStts_FLY); + setAnm(0x24); + setBitStatus(daMdStts_UNK1); + setHane02Emitter(); + fopAcM_monsSeStart(this, JA_SE_CV_MD_LIFT_UP, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + m30F8 = 75.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + mActionStatus++; + } else if (mActionStatus == ACTION_ENDING) { + deleteHane02Emitter(); + } + return TRUE; } -daNpc_Md_c::ActionFunc dummy_5931 = &daNpc_Md_c::mwaitNpcAction; -daNpc_Md_c::ActionFunc dummy_5934 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_5955 = &daNpc_Md_c::waitPlayerAction; -daNpc_Md_c::ActionFunc dummy_5960 = &daNpc_Md_c::mkamaePlayerAction; -daNpc_Md_c::ActionFunc dummy_5968 = &daNpc_Md_c::flyPlayerAction; -daNpc_Md_c::ActionFunc dummy_6061 = &daNpc_Md_c::mkamaePlayerAction; -daNpc_Md_c::ActionFunc dummy_6064 = &daNpc_Md_c::flyPlayerAction; -daNpc_Md_c::ActionFunc dummy_6110 = &daNpc_Md_c::shipNpcAction; -daNpc_Md_c::ActionFunc dummy_6118 = &daNpc_Md_c::jumpPlayerAction; -daNpc_Md_c::ActionFunc dummy_6120 = &daNpc_Md_c::fallNpcAction; -daNpc_Md_c::ActionFunc dummy_6122 = &daNpc_Md_c::fall02NpcAction; -daNpc_Md_c::ActionFunc dummy_6301 = &daNpc_Md_c::searchNpcAction; -daNpc_Md_c::ActionFunc dummy_6331 = &daNpc_Md_c::hitPlayerAction; -daNpc_Md_c::ActionFunc dummy_6334 = &daNpc_Md_c::hitNpcAction; -daNpc_Md_c::ActionFunc dummy_6367 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6375 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6377 = &daNpc_Md_c::searchNpcAction; -daNpc_Md_c::ActionFunc dummy_6379 = &daNpc_Md_c::searchNpcAction; -daNpc_Md_c::ActionFunc dummy_6386 = &daNpc_Md_c::carryNpcAction; -daNpc_Md_c::ActionFunc dummy_6440 = &daNpc_Md_c::fallNpcAction; -daNpc_Md_c::ActionFunc dummy_6587 = &daNpc_Md_c::demoFlyNpcAction; -daNpc_Md_c::ActionFunc dummy_6766 = &daNpc_Md_c::squatdownNpcAction; -daNpc_Md_c::ActionFunc dummy_6769 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6776 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6783 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6836 = &daNpc_Md_c::shipNpcAction; -daNpc_Md_c::ActionFunc dummy_6874 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_6969 = &daNpc_Md_c::searchNpcAction; -daNpc_Md_c::ActionFunc dummy_6972 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_7006 = &daNpc_Md_c::sqwait01NpcAction; -daNpc_Md_c::ActionFunc dummy_7036 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_7114 = &daNpc_Md_c::throwNpcAction; -daNpc_Md_c::ActionFunc dummy_7117 = &daNpc_Md_c::land03NpcAction; -daNpc_Md_c::ActionFunc dummy_7125 = &daNpc_Md_c::fall02NpcAction; -daNpc_Md_c::ActionFunc dummy_7128 = &daNpc_Md_c::fallNpcAction; -daNpc_Md_c::ActionFunc dummy_7133 = &daNpc_Md_c::throwNpcAction; -daNpc_Md_c::ActionFunc dummy_7136 = &daNpc_Md_c::sqwait01NpcAction; -daNpc_Md_c::ActionFunc dummy_7292 = &daNpc_Md_c::land01NpcAction; -daNpc_Md_c::ActionFunc dummy_7297 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7302 = &daNpc_Md_c::glidingNpcAction; -daNpc_Md_c::ActionFunc dummy_7362 = &daNpc_Md_c::land01NpcAction; -daNpc_Md_c::ActionFunc dummy_7365 = &daNpc_Md_c::land01NpcAction; -daNpc_Md_c::ActionFunc dummy_7372 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7375 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7393 = &daNpc_Md_c::fall02NpcAction; -daNpc_Md_c::ActionFunc dummy_7396 = &daNpc_Md_c::fall02NpcAction; -daNpc_Md_c::ActionFunc dummy_7570 = &daNpc_Md_c::land01NpcAction; -daNpc_Md_c::ActionFunc dummy_7575 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7612 = &daNpc_Md_c::fall02NpcAction; -daNpc_Md_c::ActionFunc dummy_7633 = &daNpc_Md_c::land01NpcAction; -daNpc_Md_c::ActionFunc dummy_7638 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7685 = &daNpc_Md_c::land03NpcAction; -daNpc_Md_c::ActionFunc dummy_7690 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7695 = &daNpc_Md_c::land03NpcAction; -daNpc_Md_c::ActionFunc dummy_7700 = &daNpc_Md_c::wallHitNpcAction; -daNpc_Md_c::ActionFunc dummy_7763 = &daNpc_Md_c::land02NpcAction; -daNpc_Md_c::ActionFunc dummy_7768 = &daNpc_Md_c::land02NpcAction; -daNpc_Md_c::ActionFunc dummy_7826 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_7831 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_7865 = &daNpc_Md_c::piyo2NpcAction; -daNpc_Md_c::ActionFunc dummy_7884 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_7903 = &daNpc_Md_c::piyo2NpcAction; -daNpc_Md_c::ActionFunc dummy_7925 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_8240 = &daNpc_Md_c::jumpNpcAction; -daNpc_Md_c::ActionFunc dummy_8247 = &daNpc_Md_c::jumpNpcAction; -daNpc_Md_c::ActionFunc dummy_8446 = &daNpc_Md_c::kyohiNpcAction; -daNpc_Md_c::ActionFunc dummy_8455 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_8525 = &daNpc_Md_c::land03NpcAction; -daNpc_Md_c::ActionFunc dummy_8625 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_8667 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_8671 = &daNpc_Md_c::waitNpcAction; -daNpc_Md_c::ActionFunc dummy_8720 = &daNpc_Md_c::walkPlayerAction; -daNpc_Md_c::ActionFunc dummy_8771 = &daNpc_Md_c::waitPlayerAction; -daNpc_Md_c::ActionFunc dummy_8776 = &daNpc_Md_c::jumpPlayerAction; -daNpc_Md_c::ActionFunc dummy_8783 = &daNpc_Md_c::jumpPlayerAction; -daNpc_Md_c::ActionFunc dummy_8869 = &daNpc_Md_c::waitPlayerAction; -daNpc_Md_c::ActionFunc dummy_8914 = &daNpc_Md_c::jumpPlayerAction; -daNpc_Md_c::ActionFunc dummy_8949 = &daNpc_Md_c::landPlayerAction; -daNpc_Md_c::ActionFunc dummy_9045 = &daNpc_Md_c::waitPlayerAction; -daNpc_Md_c::ActionFunc dummy_9093 = &daNpc_Md_c::waitPlayerAction; - static daNpc_Md_c::EventActionInitFunc event_init_tbl[] = { - &daNpc_Md_c::initialWaitEvent, - &daNpc_Md_c::initialLetterEvent, - &daNpc_Md_c::initialMsgSetEvent, - &daNpc_Md_c::initialDefault, - &daNpc_Md_c::initialMovePosEvent, - &daNpc_Md_c::initialFlyEvent, - &daNpc_Md_c::initialGlidingEvent, - &daNpc_Md_c::initialLandingEvent, - &daNpc_Md_c::initialWalkEvent, - &daNpc_Md_c::initialWalkEvent, - &daNpc_Md_c::initialEndEvent, - &daNpc_Md_c::initialDefault, - &daNpc_Md_c::initialTakeOffEvent, - &daNpc_Md_c::initialOnetimeEvent, - &daNpc_Md_c::initialQuake, - &daNpc_Md_c::initialHarpPlayEvent, - &daNpc_Md_c::initialOffLinkEvent, - &daNpc_Md_c::initialOnLinkEvent, - &daNpc_Md_c::initialTurnEvent, - &daNpc_Md_c::initialSetAnmEvent, - &daNpc_Md_c::initialLookDown, - &daNpc_Md_c::initialLookUp, + &daNpc_Md_c::initialWaitEvent, &daNpc_Md_c::initialLetterEvent, &daNpc_Md_c::initialMsgSetEvent, &daNpc_Md_c::initialDefault, + &daNpc_Md_c::initialMovePosEvent, &daNpc_Md_c::initialFlyEvent, &daNpc_Md_c::initialGlidingEvent, &daNpc_Md_c::initialLandingEvent, + &daNpc_Md_c::initialWalkEvent, &daNpc_Md_c::initialWalkEvent, &daNpc_Md_c::initialEndEvent, &daNpc_Md_c::initialDefault, + &daNpc_Md_c::initialTakeOffEvent, &daNpc_Md_c::initialOnetimeEvent, &daNpc_Md_c::initialQuake, &daNpc_Md_c::initialHarpPlayEvent, + &daNpc_Md_c::initialOffLinkEvent, &daNpc_Md_c::initialOnLinkEvent, &daNpc_Md_c::initialTurnEvent, &daNpc_Md_c::initialSetAnmEvent, + &daNpc_Md_c::initialLookDown, &daNpc_Md_c::initialLookUp, }; static daNpc_Md_c::EventActionFunc event_action_tbl[] = { - &daNpc_Md_c::actionWaitEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionMsgSetEvent, - &daNpc_Md_c::actionMsgEndEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionFlyEvent, - &daNpc_Md_c::actionGlidingEvent, - &daNpc_Md_c::actionLandingEvent, - &daNpc_Md_c::actionWalkEvent, - &daNpc_Md_c::actionDashEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionTactEvent, - &daNpc_Md_c::actionTakeOffEvent, - &daNpc_Md_c::actionOnetimeEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionHarpPlayEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionTurnEvent, - &daNpc_Md_c::actionDefault, - &daNpc_Md_c::actionLookDown, - &daNpc_Md_c::actionLookDown, + &daNpc_Md_c::actionWaitEvent, &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionMsgSetEvent, &daNpc_Md_c::actionMsgEndEvent, + &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionFlyEvent, &daNpc_Md_c::actionGlidingEvent, &daNpc_Md_c::actionLandingEvent, + &daNpc_Md_c::actionWalkEvent, &daNpc_Md_c::actionDashEvent, &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionTactEvent, + &daNpc_Md_c::actionTakeOffEvent, &daNpc_Md_c::actionOnetimeEvent, &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionHarpPlayEvent, + &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionDefault, &daNpc_Md_c::actionTurnEvent, &daNpc_Md_c::actionDefault, + &daNpc_Md_c::actionLookDown, &daNpc_Md_c::actionLookDown, }; static char* cut_name_tbl[] = { - "WAIT", - "CREATEITEM", - "MSG_SET", - "MSG_END", - "POS_MOV", - "FLY", - "GLIDING", - "LANDING", - "WALK", - "DASH", - "END", - "TACT", - "TAKEOFF", - "Onetime", - "QUAKE", - "HARPPLAY", - "OFF_PLAYER", - "ON_PLAYER", - "TURN", - "SET_ANM", - "LOOK_DOWN", - "LOOK_UP", + "WAIT", "CREATEITEM", "MSG_SET", "MSG_END", "POS_MOV", "FLY", "GLIDING", "LANDING", "WALK", "DASH", "END", + "TACT", "TAKEOFF", "Onetime", "QUAKE", "HARPPLAY", "OFF_PLAYER", "ON_PLAYER", "TURN", "SET_ANM", "LOOK_DOWN", "LOOK_UP", }; /* 0000A9BC-0000AC80 .text eventProc__10daNpc_Md_cFv */ @@ -2062,6 +3319,7 @@ BOOL daNpc_Md_c::eventProc() { /* 0000AC80-0000AC84 .text initialDefault__10daNpc_Md_cFi */ void daNpc_Md_c::initialDefault(int) { + /* Empty function */ } /* 0000AC84-0000ACB4 .text actionDefault__10daNpc_Md_cFi */ @@ -2071,8 +3329,24 @@ BOOL daNpc_Md_c::actionDefault(int) { } /* 0000ACB4-0000AD9C .text initialWaitEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialWaitEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialWaitEvent(int staffIdx) { + int* pDisp = dComIfGp_evmng_getMyIntegerP(staffIdx, "Disp"); + if (pDisp) { + if (*pDisp) { + fopAcM_onDraw(this); + } else { + fopDwTg_DrawQTo(&draw_tag); + } + } else { + fopAcM_onDraw(this); + } + int* pTimer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + if (pTimer) { + m3118 = *pTimer; + } else { + m3118 = 0; + } + speedF = 0.0f; } /* 0000AD9C-0000ADCC .text actionWaitEvent__10daNpc_Md_cFi */ @@ -2081,13 +3355,45 @@ BOOL daNpc_Md_c::actionWaitEvent(int) { } /* 0000ADCC-0000AEB8 .text initialLetterEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialLetterEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialLetterEvent(int staffIdx) { + u8 itemNo; + + clearStatus(daMdStts_UNK1 | daMdStts_UNK2 | daMdStts_FLY); + setBitStatus(daMdStts_UNK4); + speedF = 0.0f; + m30F8 = 75.0f; + if (mCurEvent == 0) { + itemNo = 0x98; + } else if (mCurEvent == 1) { + itemNo = 0x25; + } else if (mCurEvent == 2) { + itemNo = 0x50; + } else { + itemNo = 0x98; + } + fpc_ProcID itemID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, fopAcM_GetRoomNo(this)); + if (itemID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemID); + } + dComIfGp_evmng_cutEnd(staffIdx); } /* 0000AEB8-0000AFB0 .text initialMsgSetEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialMsgSetEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialMsgSetEvent(int staffIdx) { + if (mMsgNo == 0x19DD) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1620); + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1608); + dComIfGp_setNextStage("sea", 0xE3, 13, 8); + } else { + l_msgId = fpcM_ERROR_PROCESS_ID_e; + int* pMsgNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo"); + if (pMsgNo != NULL) { + mMsgNo = *pMsgNo; + if ((mMsgNo == 0x19D6) && (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1504))) { + mMsgNo = 0x19D9; + } + } + } } /* 0000AFB0-0000AFFC .text actionMsgSetEvent__10daNpc_Md_cFi */ @@ -2109,8 +3415,114 @@ BOOL daNpc_Md_c::actionMsgEndEvent(int param_1) { } /* 0000B070-0000B728 .text initialMovePosEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialMovePosEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialMovePosEvent(int staffIdx) { + static char* cut_anm_tbl[] = { + "WAIT", + }; + static const s32 cut_anm_idx_tbl[] = { + 0, + }; + + s16 uVar9; + daPy_lk_c* link; + char acStack_ac[12]; + + link = NULL; + const char* target = dComIfGp_evmng_getMyStringP(staffIdx, "Target"); + if (target != NULL) { + strcpy(acStack_ac, target); + if (!strcmp(acStack_ac, "@PLAYER")) { + link = daPy_getPlayerLinkActorClass(); + } + if (link != NULL) { + const char* type = dComIfGp_evmng_getMyStringP(staffIdx, "Type"); + if (type != NULL) { + strcpy(acStack_ac, type); + } + if (!strcmp(acStack_ac, "LINK_DIST")) { + uVar9 = fopAcM_searchActorAngleY(this, link); + f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist"); + if (pDist != NULL) { + f32 sin = *pDist * cM_ssin(uVar9); + f32 cos = *pDist * cM_scos(uVar9); + cXyz pos(current.pos.x + sin, current.pos.y + 50.0f, current.pos.z + cos); + dBgS_GndChk local_a0; + local_a0.SetPos(&pos); + f32 temp_f1 = dComIfG_Bgsp()->GroundCross(&local_a0); + if (temp_f1 != -G_CM3D_F_INF) { + pos.y = temp_f1; + } else { + pos.y = current.pos.y; + } + link->setPlayerPosAndAngle(&pos, link->shape_angle.y); + } + f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); + if (pAngle != NULL) { + link->setPlayerPosAndAngle(0, cM_deg2s(*pAngle) + (-0x8000 + uVar9)); + } + } else { + if (!strcmp(acStack_ac, "DIST")) { + f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist"); + if (pDist != NULL) { + f32 sin = *pDist * cM_ssin(link->shape_angle.y); + f32 cos = *pDist * cM_scos(link->shape_angle.y); + current.pos.set(link->current.pos.x + sin, link->current.pos.y, link->current.pos.z + cos); + } + f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); + if (pAngle != NULL) { + s16 angle = cM_deg2s(*pAngle) + (-0x8000 + link->shape_angle.y); + current.angle.y = angle; + shape_angle.y = angle; + } + } else { + f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); + if (pAngle != NULL) { + s16 angle = cM_deg2s(*pAngle) + link->shape_angle.y; + current.angle.y = angle; + shape_angle.y = angle; + } + cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); + if (pPos != NULL) { + current.pos.set(link->current.pos.x + pPos->x, link->current.pos.y + pPos->y, link->current.pos.z + pPos->z); + } + } + } + } + } else { + f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); + if (pAngle != NULL) { + s16 angle = cM_deg2s(*pAngle); + current.angle.y = angle; + shape_angle.y = angle; + } + cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); + if (pPos != NULL) { + current.pos = *pPos; + } + } + gravity = l_HIO.m0F4; + maxFallSpeed = -100.0f; + speedF = 0.0f; + speed.y = 0.0f; + const char* pName = dComIfGp_evmng_getMyStringP(staffIdx, "Name"); + if (pName != NULL) { + strcpy(acStack_ac, pName); + for (s32 i = 0; i < 1; i++) { + if (!strcmp(acStack_ac, cut_anm_tbl[i])) { + setAnm(cut_anm_idx_tbl[i]); + break; + } + } + } + const char* pShipRide = dComIfGp_evmng_getMyStringP(staffIdx, "ShipRide"); + if (pShipRide != NULL) { + strcpy(acStack_ac, pShipRide); + if (!strcmp(acStack_ac, "on")) { + onShipRide(); + } else if (!strcmp(acStack_ac, "off")) { + offShipRide(); + } + } } /* 0000B728-0000B79C .text initialFlyEvent__10daNpc_Md_cFi */ @@ -2121,12 +3533,35 @@ void daNpc_Md_c::initialFlyEvent(int) { speed.y = 20.0f; gravity = l_HIO.m188; maxFallSpeed = 10.0f; - m3118 = 60*30; + m3118 = 60 * 30; } /* 0000B79C-0000B870 .text actionFlyEvent__10daNpc_Md_cFi */ -BOOL daNpc_Md_c::actionFlyEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionFlyEvent(int staffIdx) { + f32 fVar1; + f32* pfVar2; + + pfVar2 = dComIfGp_evmng_getMyFloatP(staffIdx, "HIGH"); + fVar1 = 0.0f; + if (pfVar2 != NULL) { + fVar1 = *pfVar2; + } + if (current.pos.y > fVar1) { + emitterDelete(m0508); + return TRUE; + } else { + if (m3104 == 0x19) { + if (m312A != 0) { + setAnm(9); + } + } + setAttention(true); + if (mAcch.ChkRoofHit()) { + return TRUE; + } else { + return cLib_calcTimer(&m3118) == 0 ? TRUE : FALSE; + } + } } /* 0000B870-0000B890 .text initialGlidingEvent__10daNpc_Md_cFi */ @@ -2137,12 +3572,27 @@ void daNpc_Md_c::initialGlidingEvent(int) { /* 0000B890-0000B934 .text actionGlidingEvent__10daNpc_Md_cFi */ BOOL daNpc_Md_c::actionGlidingEvent(int) { - /* Nonmatching */ + if (mAcch.ChkGroundHit()) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_LANDING, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + return TRUE; + } else { + if (!checkStatusCamTagIn()) { + speedF = 0.0f; + } + setAttention(true); + return FALSE; + } } /* 0000B934-0000B99C .text initialLandingEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialLandingEvent(int) { - /* Nonmatching */ + maxFallSpeed = -100.0f; + speedF = 0.0f; + shape_angle.x = 0; + shape_angle.z = 0; + clearStatus(daMdStts_UNK1); + setAnm(0x10); + m312A = 0; } /* 0000B99C-0000B9E0 .text actionLandingEvent__10daNpc_Md_cFi */ @@ -2158,27 +3608,193 @@ BOOL daNpc_Md_c::actionLandingEvent(int) { /* 0000B9E0-0000B9F8 .text initialWalkEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialWalkEvent(int) { speedF = 0.0f; - m3118 = 20*30; + m3118 = DEMO_SELECT(1800, 20 * 30); } /* 0000B9F8-0000BCC4 .text actionWalkEvent__10daNpc_Md_cFi */ -BOOL daNpc_Md_c::actionWalkEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionWalkEvent(int staffIdx) { + cXyz local_24; + cXyz local_3c; + + cXyz* pfVar2 = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); + f32* pfVar3 = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed"); + f32* pfVar4 = dComIfGp_evmng_getMyFloatP(staffIdx, "RunRate"); + if (pfVar2 != NULL) { + local_24 = *pfVar2; + local_3c = local_24 - current.pos; + if (local_3c.absXZ() < 10.0f) { + speedF = 0.0f; + return TRUE; + } + current.angle.y = cM_atan2s(local_3c.x, local_3c.z); + if (mJntCtrl.trnChk()) { + cLib_addCalcAngleS2(&m3110, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800); + } else { + m3110 = 0; + if (pfVar3 != NULL) { + speedF = *pfVar3; + } else { + speedF = 5.0f; + } + if (pfVar4 != NULL) { + mRunRate = *pfVar4; + } else { + mRunRate = 0.0f; + } + setAnm(2); + } + mJntCtrl.setTrn(); + mJntCtrl.lookAtTarget(&shape_angle.y, &local_24, current.pos, current.angle.y, m3110, false); + setAttention(true); +#if VERSION < VERSION_USA + if (wallHitCheck() > 0) +#else + if (wallHitCheck() >= 0) +#endif + { +#if VERSION >= VERSION_USA + speedF = 0.0f; +#endif + current.pos = local_24; + return TRUE; + } + if (cLib_calcTimer(&m3118) != 0) { + return FALSE; + } +#if VERSION >= VERSION_USA + speedF = 0.0f; + current.pos = local_24; +#endif + } + return TRUE; } /* 0000BCC4-0000BF1C .text actionDashEvent__10daNpc_Md_cFi */ -BOOL daNpc_Md_c::actionDashEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionDashEvent(int staffIdx) { + cXyz local_24; + cXyz local_3c; + + cXyz* pfVar2 = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); + if (pfVar2 != NULL) { + local_24 = *pfVar2; + local_3c = local_24 - current.pos; + if (local_3c.absXZ() < 10.0f) { + speedF = 0.0f; + return TRUE; + } + current.angle.y = cM_atan2s(local_3c.x, local_3c.z); + if (mJntCtrl.trnChk()) { + cLib_addCalcAngleS2(&m3110, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800); + } else { + m3110 = 0; + speedF = 17.0f; + mRunRate = 1.0f; + setAnm(2); + } + mJntCtrl.setTrn(); + mJntCtrl.lookAtTarget(&shape_angle.y, &local_24, current.pos, current.angle.y, m3110, false); +#if VERSION < VERSION_USA + if (wallHitCheck() > 0) +#else + if (wallHitCheck() >= 0) +#endif + { +#if VERSION >= VERSION_USA + speedF = 0.0f; +#endif + current.pos = local_24; + return TRUE; + } + setAttention(true); + if (cLib_calcTimer(&m3118) != 0) { + return FALSE; + } +#if VERSION >= VERSION_USA + speedF = 0.0f; + current.pos = local_24; +#endif + } + return TRUE; } /* 0000BF1C-0000C12C .text initialEndEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialEndEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialEndEvent(int staffIdx) { + int iVar1; + int* piVar2; + + piVar2 = dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMode"); + if (piVar2 == NULL) { + iVar1 = 0; + } else { + iVar1 = *piVar2; + } + switch (iVar1) { + case -2: + if (mMsgNo == 0x19de) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1620); + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1608); + dComIfGp_setNextStage("sea", 0xE3, 13, 8); + } + // Fall-through + case -1: + dComIfGp_event_reset(); + if (checkStatus(daMdStts_UNK80)) { + setHarpPlayNum(0); + } + setNpcAction(&daNpc_Md_c::waitNpcAction); + break; + case 3: + setNpcAction(&daNpc_Md_c::deleteNpcAction); + break; + case 2: + clearStatus(daMdStts_UNK1); + setNpcAction(&daNpc_Md_c::squatdownNpcAction); + break; + default: + case 0: + clearStatus(daMdStts_UNK1); + if (checkStatus(daMdStts_UNK80)) { + setHarpPlayNum(0); + } else { + setAnm(0); + } + setNpcAction(&daNpc_Md_c::waitNpcAction); + break; + } } /* 0000C12C-0000C250 .text actionTactEvent__10daNpc_Md_cFi */ -BOOL daNpc_Md_c::actionTactEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionTactEvent(int staffIdx) { + int* pPrm0 = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm0"); + s32 prm = 0; + + if (pPrm0 != NULL) { + prm = *pPrm0; + } + s32 song = daPy_getPlayerActorClass()->getTactMusic(); + if (song >= 0) { + setBitStatus(daMdStts_UNK400); + } + BOOL result = talk(1); + if (result) { + if (checkStatus(daMdStts_UNK400)) { + clearStatus(daMdStts_UNK400); + if (song == prm) { + mMsgNo = 0x19dd; + } else { + mMsgNo = 0x19da; + } + } else { + mCurEventMode = 10; + if (checkStatus(daMdStts_UNK200)) { + mMsgNo = 0x19dc; + clearStatus(daMdStts_UNK200); + } + fopAcM_onDraw(this); + dComIfGp_event_reset(); + } + } + return result; } /* 0000C250-0000C288 .text initialTakeOffEvent__10daNpc_Md_cFi */ @@ -2197,8 +3813,28 @@ BOOL daNpc_Md_c::actionTakeOffEvent(int) { } /* 0000C2C4-0000C360 .text initialOnetimeEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialOnetimeEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialOnetimeEvent(int staffIdx) { + static char* cut_anm_tbl[] = { + "WATASU", + }; + static const s32 cut_anm_idx_tbl[] = { + 0x1A, + }; + char acStack_18[16]; + + s32 var_r31 = 0x1A; + const char* pName = dComIfGp_evmng_getMyStringP(staffIdx, "Name"); + if (pName != NULL) { + strcpy(acStack_18, pName); + for (s32 i = 0; i < 1; i++) { + if (!strcmp(acStack_18, cut_anm_tbl[i])) { + var_r31 = cut_anm_idx_tbl[i]; + break; + } + } + } + setAnm(var_r31); + m312A = 0; } /* 0000C360-0000C3C4 .text actionOnetimeEvent__10daNpc_Md_cFi */ @@ -2215,13 +3851,28 @@ BOOL daNpc_Md_c::actionOnetimeEvent(int) { } /* 0000C3C4-0000C48C .text initialQuake__10daNpc_Md_cFi */ -void daNpc_Md_c::initialQuake(int) { - /* Nonmatching */ +void daNpc_Md_c::initialQuake(int staffIdx) { + char* __src; + char acStack_1c[12]; + + __src = dComIfGp_evmng_getMyStringP(staffIdx, "Mode"); + if (__src != NULL) { + strcpy(acStack_1c, __src); + if (!strcmp(acStack_1c, "Start")) { + dComIfGp_getVibration().StartQuake(7, 1, cXyz(0.0f, 1.0f, 0.0f)); + } + if (!strcmp(acStack_1c, "Stop")) { + dComIfGp_getVibration().StopQuake(1); + } + } } /* 0000C48C-0000C4DC .text setHarpPlayNum__10daNpc_Md_cFi */ void daNpc_Md_c::setHarpPlayNum(int) { - /* Nonmatching */ + static const s32 l_harp_play_anm[] = {0x16, 0x17, 0x16, 0x17, 0x16, 0x17}; + + int iVar1 = cLib_getRndValue(0, 4); + setAnm(l_harp_play_anm[iVar1]); } /* 0000C4DC-0000C500 .text initialHarpPlayEvent__10daNpc_Md_cFi */ @@ -2251,18 +3902,99 @@ void daNpc_Md_c::initialOnLinkEvent(int) { } /* 0000C58C-0000C654 .text initialTurnEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialTurnEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialTurnEvent(int staffIdx) { + int* puVar1 = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + if (puVar1 != NULL) { + m3118 = (s16)*puVar1; + } else { + m3118 = 0; + } + cXyz* pfVar2 = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); + if (pfVar2 != NULL) { + m30B8 = *pfVar2; + } else { + m30B8.setall(0.0f); + } } /* 0000C654-0000C7CC .text actionTurnEvent__10daNpc_Md_cFi */ -BOOL daNpc_Md_c::actionTurnEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionTurnEvent(int staffIdx) { + int iVar4; + + setAttention(true); + char local_20[10] = { + "@PLAYER", + }; + const char* target = dComIfGp_evmng_getMyStringP(staffIdx, "Target"); + if (target != NULL) { + strcpy(local_20, target); + } + const int* type = dComIfGp_evmng_getMyIntegerP(staffIdx, "Type"); + if (type == NULL) { + iVar4 = 0; + } else { + iVar4 = *type; + } + mJntCtrl.setParam( + l_HIO.mNpc.mMaxBackboneX, + l_HIO.mNpc.mMaxBackboneY, + l_HIO.mNpc.mMinBackboneX, + l_HIO.mNpc.mMinBackboneY, + l_HIO.mNpc.mMaxHeadX, + l_HIO.mNpc.mMaxHeadY, + -500, + l_HIO.mNpc.mMinHeadY, + l_HIO.mNpc.mMaxTurnStep + ); + if (iVar4 == 2) { + mJntCtrl.setTrn(); + iVar4 = 0; + } + if (!strcmp(local_20, "@PLAYER")) { + lookBack(1, 0, iVar4); + } else { + lookBack(&m30B8, 1, iVar4); + } + if (cLib_calcTimer(&m3118) != 0) { + return FALSE; + } + return TRUE; } /* 0000C7CC-0000CA5C .text initialSetAnmEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::initialSetAnmEvent(int) { - /* Nonmatching */ +void daNpc_Md_c::initialSetAnmEvent(int staffIdx) { + int* puVar1 = dComIfGp_evmng_getMyIntegerP(staffIdx, "Number"); + if (puVar1 != NULL) { + int iVar1 = setAnm(getAnmType(*puVar1)); + if (iVar1 != 0) { + setBitStatus(daMdStts_UNK1); + } else { + clearStatus(daMdStts_UNK1); + } + } + speedF = 0.0f; + f32* pfVar2 = dComIfGp_evmng_getMyFloatP(staffIdx, "PlaySpeed"); + if (pfVar2 != NULL) { + mpMorf->setPlaySpeed(*pfVar2); + mpArmMorf->setPlaySpeed(*pfVar2); + mpWingMorf->setPlaySpeed(*pfVar2); + if (*pfVar2 < 0.0f) { + mpMorf->setFrame(mpMorf->getEndFrame()); + mpArmMorf->setFrame(mpArmMorf->getEndFrame()); + mpWingMorf->setFrame(mpWingMorf->getEndFrame()); + } + mpMorf->setLoopFrame(mpMorf->getFrame()); + mpArmMorf->setLoopFrame(mpArmMorf->getFrame()); + mpWingMorf->setLoopFrame(mpWingMorf->getFrame()); + m30D0 = mpMorf->getFrame(); + } + pfVar2 = dComIfGp_evmng_getMyFloatP(staffIdx, "MorfFrame"); + if (pfVar2 != NULL) { + mpMorf->setMorf(*pfVar2); + mpArmMorf->setMorf(*pfVar2); + mpWingMorf->setMorf(*pfVar2); + } + clearJntAng(); } /* 0000CA5C-0000CA80 .text initialLookDown__10daNpc_Md_cFi */ @@ -2277,7 +4009,20 @@ void daNpc_Md_c::initialLookUp(int) { /* 0000CAA4-0000CB8C .text actionLookDown__10daNpc_Md_cFi */ BOOL daNpc_Md_c::actionLookDown(int) { - /* Nonmatching */ + s16 desiredYRot; + cXyz local_14; + cXyz cStack_20; + + m30AC.y = -50.0f; + cXyz local_38(0.0f, 0.0f, 0.0f); + desiredYRot = shape_angle.y; + local_38.set(current.pos.x, eyePos.y, current.pos.z); + local_14 = local_38; + mDoMtx_stack_c::YrotS(desiredYRot); + mDoMtx_stack_c::multVec(&m30AC, &cStack_20); + local_14 += cStack_20; + mJntCtrl.lookAtTarget(&shape_angle.y, &local_14, local_38, desiredYRot, m3110, false); + return TRUE; } /* 0000CB8C-0000CC10 .text talk_init__10daNpc_Md_cFv */ @@ -2331,66 +4076,26 @@ BOOL daNpc_Md_c::talk(int r4) { offXYTalk(); return TRUE; } - + if (!fopAcM_checkCarryNow(this) && !isShipRide() && mMsgNo != 0x05AC) { if (m313A == 1 && msgAnmAtr == 0x14 && m312A != 0) { setAnm(0x1B); m313A = 1; } } - + return FALSE; } /* 0000CDCC-0000CDF4 .text getAnmType__10daNpc_Md_cFUc */ int daNpc_Md_c::getAnmType(u8 r4) { static const int anmTypeData_Talk[] = { - 0x00000000, - 0x00000002, - 0x00000002, - 0x00000003, - 0x00000004, - 0x00000005, - 0x00000006, - 0x0000000B, - 0x00000007, - 0x00000009, - 0x0000000C, - 0x0000000D, - 0x0000000E, - 0x0000000F, - 0x00000011, - 0x00000014, - 0x00000012, - 0x0000001B, - 0x0000001C, - 0x00000015, - 0x00000015, - 0x00000016, - 0x00000017, - 0x00000018, - 0x00000019, - 0x0000001D, - 0x0000001A, - 0x00000010, - 0x0000001F, - 0x00000020, - 0x00000022, - 0x0000001E, - 0x00000023, - 0x00000024, - 0x00000025, - 0x00000026, - 0x00000027, - 0x00000028, - 0x00000029, - 0x0000002A, - 0x0000002B, - 0x0000002C, - 0x0000002D, - 0x00000031, + 0x00000000, 0x00000002, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x0000000B, 0x00000007, 0x00000009, 0x0000000C, + 0x0000000D, 0x0000000E, 0x0000000F, 0x00000011, 0x00000014, 0x00000012, 0x0000001B, 0x0000001C, 0x00000015, 0x00000015, 0x00000016, + 0x00000017, 0x00000018, 0x00000019, 0x0000001D, 0x0000001A, 0x00000010, 0x0000001F, 0x00000020, 0x00000022, 0x0000001E, 0x00000023, + 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x00000031, }; - + if (r4 < ARRAY_SIZE(anmTypeData_Talk)) { return anmTypeData_Talk[r4]; } else { @@ -2422,11 +4127,11 @@ BOOL daNpc_Md_c::initTexPatternAnm(u8 btpAnmTblIdx, bool param_2) { {"md_kyoro2.btp", 1}, {"md_unazuki.btp", 1}, }; - - J3DModelData* modelData = mpMorf->getModel()->getModelData(); + + J3DModelData* modelData = getModel()->getModelData(); bool ret = false; J3DAnmTexPattern* eyeTexPtrn = (J3DAnmTexPattern*)dComIfG_getObjectRes(mModelArcName, btpAnmTbl[btpAnmTblIdx].m00); - JUT_ASSERT(7502, eyeTexPtrn != NULL); + JUT_ASSERT(VERSION_SELECT(7355, 7487, 7502, 7502), eyeTexPtrn != NULL); if (m0520.init(modelData, eyeTexPtrn, TRUE, J3DFrameCtrl::EMode_RESET, 1.0f, 0, -1, param_2, FALSE)) { m3112 = eyeTexPtrn->getFrameMax(); m3133 = 0; @@ -2434,7 +4139,7 @@ BOOL daNpc_Md_c::initTexPatternAnm(u8 btpAnmTblIdx, bool param_2) { m3137 = btpAnmTblIdx; ret = true; } - + return ret; } @@ -2453,8 +4158,15 @@ void daNpc_Md_c::playTexPatternAnm() { } /* 0000CFCC-0000D0B8 .text initLightBtkAnm__10daNpc_Md_cFb */ -BOOL daNpc_Md_c::initLightBtkAnm(bool) { - /* Nonmatching */ +BOOL daNpc_Md_c::initLightBtkAnm(bool param_1) { + J3DModelData* pModelData = mpHarpLightModel->getModelData(); + bool ret = false; + J3DAnmTextureSRTKey* a_lightBtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(mModelArcName, "ymdhp00.btk"); + JUT_ASSERT(VERSION_SELECT(7412, 7544, 7559, 7559), a_lightBtk != NULL); + if (mLightBtkAnm.init(pModelData, a_lightBtk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, param_1, 0)) { + ret = true; + } + return ret; } /* 0000D0B8-0000D0DC .text playLightBtkAnm__10daNpc_Md_cFv */ @@ -2478,131 +4190,436 @@ BOOL daNpc_Md_c::setAnm(int anmIdx) { }; static anm_tbl l_anmTbl[] = { - {"md_wait01.bck", ""}, - {"md_walk.bck", "md_run.bck"}, - {"md_squatdown.bck", ""}, - {"md_sqwait01.bck", ""}, - {"md_sqwait02.bck", ""}, - {"md_firing.bck", ""}, - {"md_fly01.bck", ""}, - {"md_fly02.bck", ""}, - {"md_gliding.bck", ""}, - {"md_fall.bck", ""}, - {"md_fall02.bck", ""}, - {"md_land.bck", ""}, - {"md_land02.bck", ""}, - {"md_land03.bck", ""}, - {"md_kamaewait.bck", ""}, - {"md_kamae.bck", ""}, - {"md_piyo2.bck", ""}, - {"md_ojigi.bck", ""}, - {"md_harpplay01.bck", ""}, - {"md_harpplay02.bck", ""}, - {"md_takeoff01.bck", ""}, - {"md_takeoff02.bck", ""}, - {"md_watasu.bck", ""}, - {"md_talk01.bck", ""}, - {"md_talk02.bck", ""}, - {"md_talk03.bck", ""}, - {"md_talk04.bck", ""}, - {"md_mkamae.bck", ""}, - {"md_mwait.bck", ""}, - {"md_oriwait.bck", ""}, - {"md_shipwait.bck", ""}, - {"md_caught01.bck", ""}, - {"md_caught02.bck", ""}, - {"md_kyohi.bck", ""}, - {"md_kyoro2.bck", ""}, - {"md_shipwait02.bck", ""}, - {"md_shiptalk01.bck", ""}, - {"md_talk05.bck", ""}, - {"md_unazuki.bck", ""}, + {"md_wait01.bck", ""}, {"md_walk.bck", "md_run.bck"}, {"md_squatdown.bck", ""}, {"md_sqwait01.bck", ""}, {"md_sqwait02.bck", ""}, + {"md_firing.bck", ""}, {"md_fly01.bck", ""}, {"md_fly02.bck", ""}, {"md_gliding.bck", ""}, {"md_fall.bck", ""}, + {"md_fall02.bck", ""}, {"md_land.bck", ""}, {"md_land02.bck", ""}, {"md_land03.bck", ""}, {"md_kamaewait.bck", ""}, + {"md_kamae.bck", ""}, {"md_piyo2.bck", ""}, {"md_ojigi.bck", ""}, {"md_harpplay01.bck", ""}, {"md_harpplay02.bck", ""}, + {"md_takeoff01.bck", ""}, {"md_takeoff02.bck", ""}, {"md_watasu.bck", ""}, {"md_talk01.bck", ""}, {"md_talk02.bck", ""}, + {"md_talk03.bck", ""}, {"md_talk04.bck", ""}, {"md_mkamae.bck", ""}, {"md_mwait.bck", ""}, {"md_oriwait.bck", ""}, + {"md_shipwait.bck", ""}, {"md_caught01.bck", ""}, {"md_caught02.bck", ""}, {"md_kyohi.bck", ""}, {"md_kyoro2.bck", ""}, + {"md_shipwait02.bck", ""}, {"md_shiptalk01.bck", ""}, {"md_talk05.bck", ""}, {"md_unazuki.bck", ""}, }; + static anm_prm l_anmPrm[] = { - {0x00, 0x00, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x00, 0x00, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x01, 0x01, 0x00, J3DFrameCtrl::EMode_LOOP, 4.0f, 1.0f}, - {0x02, 0x02, 0x00, J3DFrameCtrl::EMode_NONE, 4.0f, 1.0f}, - {0x03, 0x03, 0x00, J3DFrameCtrl::EMode_LOOP, 4.0f, 1.0f}, - {0x04, 0x04, 0x00, J3DFrameCtrl::EMode_LOOP, 4.0f, 1.0f}, - {0x05, 0x81, 0x00, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f}, - {0x06, 0x82, 0x00, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f}, - {0x06, 0x82, 0x00, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f}, - {0x07, 0x83, 0x03, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x07, 0x83, 0x03, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x08, 0x84, 0x00, J3DFrameCtrl::EMode_LOOP, 4.0f, 1.0f}, - {0x09, 0x05, 0x01, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x0A, 0x06, 0x02, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x0B, 0x07, 0x06, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f}, - {0x0C, 0x08, 0x07, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f}, - {0x0D, 0x09, 0x06, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f}, - {0x0E, 0x0A, 0x05, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x0F, 0x0B, 0x04, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x0F, 0x0B, 0x04, J3DFrameCtrl::EMode_NONE, 8.0f, -1.0f}, - {0x10, 0x0C, 0x08, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x11, 0x0D, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x12, 0x0E, 0x09, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x13, 0x0F, 0x09, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x14, 0x10, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x15, 0x85, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x16, 0x11, 0x0A, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x17, 0x12, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x18, 0x13, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x19, 0x14, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x1A, 0x15, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x1B, 0x16, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.4f}, - {0x1C, 0x17, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 0.0f}, - {0x1B, 0x16, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, -1.4f}, - {0x1D, 0x18, 0x0B, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x1E, 0x19, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x1F, 0x86, 0x0C, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x20, 0x87, 0x0C, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x17, 0x12, 0x05, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x21, 0x1A, 0x0D, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x22, 0x1B, 0x00, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x1A, 0x15, 0x05, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, - {0x23, 0x1C, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x24, 0x1D, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x25, 0x1E, 0x00, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x25, 0x1E, 0x05, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x07, 0x83, 0x03, J3DFrameCtrl::EMode_LOOP, 8.0f, 1.0f}, - {0x04, 0x04, 0x05, J3DFrameCtrl::EMode_LOOP, 4.0f, 1.0f}, - {0x00, 0x00, 0x00, J3DFrameCtrl::EMode_LOOP, 0.0f, 1.0f}, - {0x26, 0x1F, 0x0F, J3DFrameCtrl::EMode_NONE, 8.0f, 1.0f}, + { + /* anmTblIdx */ 0x00, + /* armAnmTblIdx */ 0x00, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x00, + /* armAnmTblIdx */ 0x00, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x01, + /* armAnmTblIdx */ 0x01, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x02, + /* armAnmTblIdx */ 0x02, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x03, + /* armAnmTblIdx */ 0x03, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x04, + /* armAnmTblIdx */ 0x04, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x05, + /* armAnmTblIdx */ 0x81, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 0.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x06, + /* armAnmTblIdx */ 0x82, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 3.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x06, + /* armAnmTblIdx */ 0x82, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 3.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x07, + /* armAnmTblIdx */ 0x83, + /* btpAnmTblIdx */ 0x03, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x07, + /* armAnmTblIdx */ 0x83, + /* btpAnmTblIdx */ 0x03, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x08, + /* armAnmTblIdx */ 0x84, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x09, + /* armAnmTblIdx */ 0x05, + /* btpAnmTblIdx */ 0x01, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0A, + /* armAnmTblIdx */ 0x06, + /* btpAnmTblIdx */ 0x02, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0B, + /* armAnmTblIdx */ 0x07, + /* btpAnmTblIdx */ 0x06, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 0.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0C, + /* armAnmTblIdx */ 0x08, + /* btpAnmTblIdx */ 0x07, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 0.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0D, + /* armAnmTblIdx */ 0x09, + /* btpAnmTblIdx */ 0x06, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 0.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0E, + /* armAnmTblIdx */ 0x0A, + /* btpAnmTblIdx */ 0x05, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0F, + /* armAnmTblIdx */ 0x0B, + /* btpAnmTblIdx */ 0x04, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x0F, + /* armAnmTblIdx */ 0x0B, + /* btpAnmTblIdx */ 0x04, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ -1.0f, + }, + { + /* anmTblIdx */ 0x10, + /* armAnmTblIdx */ 0x0C, + /* btpAnmTblIdx */ 0x08, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x11, + /* armAnmTblIdx */ 0x0D, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x12, + /* armAnmTblIdx */ 0x0E, + /* btpAnmTblIdx */ 0x09, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x13, + /* armAnmTblIdx */ 0x0F, + /* btpAnmTblIdx */ 0x09, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x14, + /* armAnmTblIdx */ 0x10, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x15, + /* armAnmTblIdx */ 0x85, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x16, + /* armAnmTblIdx */ 0x11, + /* btpAnmTblIdx */ 0x0A, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x17, + /* armAnmTblIdx */ 0x12, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x18, + /* armAnmTblIdx */ 0x13, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x19, + /* armAnmTblIdx */ 0x14, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x1A, + /* armAnmTblIdx */ 0x15, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x1B, + /* armAnmTblIdx */ 0x16, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ DEMO_SELECT(1.0f, 1.4f), + }, + { + /* anmTblIdx */ 0x1C, + /* armAnmTblIdx */ 0x17, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 0.0f, + }, + { + /* anmTblIdx */ 0x1B, + /* armAnmTblIdx */ 0x16, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ DEMO_SELECT(-1.0f, -1.4f), + }, + { + /* anmTblIdx */ 0x1D, + /* armAnmTblIdx */ 0x18, + /* btpAnmTblIdx */ 0x0B, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x1E, + /* armAnmTblIdx */ 0x19, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x1F, + /* armAnmTblIdx */ 0x86, + /* btpAnmTblIdx */ 0x0C, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x20, + /* armAnmTblIdx */ 0x87, + /* btpAnmTblIdx */ 0x0C, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x17, + /* armAnmTblIdx */ 0x12, + /* btpAnmTblIdx */ 0x05, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x21, + /* armAnmTblIdx */ 0x1A, + /* btpAnmTblIdx */ 0x0D, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x22, + /* armAnmTblIdx */ 0x1B, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x1A, + /* armAnmTblIdx */ 0x15, + /* btpAnmTblIdx */ 0x05, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x23, + /* armAnmTblIdx */ 0x1C, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x24, + /* armAnmTblIdx */ 0x1D, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x25, + /* armAnmTblIdx */ 0x1E, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x25, + /* armAnmTblIdx */ 0x1E, + /* btpAnmTblIdx */ 0x05, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x07, + /* armAnmTblIdx */ 0x83, + /* btpAnmTblIdx */ 0x03, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x04, + /* armAnmTblIdx */ 0x04, + /* btpAnmTblIdx */ 0x05, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 4.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x00, + /* armAnmTblIdx */ 0x00, + /* btpAnmTblIdx */ 0x00, + /* loopMode */ J3DFrameCtrl::EMode_LOOP, + /* morf */ 0.0f, + /* speed */ 1.0f, + }, + { + /* anmTblIdx */ 0x26, + /* armAnmTblIdx */ 0x1F, + /* btpAnmTblIdx */ 0x0F, + /* loopMode */ J3DFrameCtrl::EMode_NONE, + /* morf */ 8.0f, + /* speed */ 1.0f, + }, }; + static anm_tbl armAnmTbl[] = { - {"mdarm_wait01.bck", ""}, - {"mdarm_walk.bck", "mdarm_run.bck"}, - {"mdarm_squatdown.bck", ""}, - {"mdarm_sqwait01.bck", ""}, - {"mdarm_sqwait02.bck", ""}, - {"mdarm_fall.bck", ""}, - {"mdarm_fall02.bck", ""}, - {"mdarm_land.bck", ""}, - {"mdarm_land02.bck", ""}, - {"mdarm_land03.bck", ""}, - {"mdarm_kamaewait.bck", ""}, - {"mdarm_kamae.bck", ""}, - {"mdarm_piyo2.bck", ""}, - {"mdarm_ojigi.bck", ""}, - {"mdarm_harpplay01.bck", ""}, - {"mdarm_harpplay02.bck", ""}, - {"mdarm_takeoff01.bck", ""}, - {"mdarm_watasu.bck", ""}, - {"mdarm_talk01.bck", ""}, - {"mdarm_talk02.bck", ""}, - {"mdarm_talk03.bck", ""}, - {"mdarm_talk04.bck", ""}, - {"mdarm_mkamae.bck", ""}, - {"mdarm_mwait.bck", ""}, - {"mdarm_oriwait.bck", ""}, - {"mdarm_shipwait.bck", ""}, - {"mdarm_kyohi.bck", ""}, - {"mdarm_kyoro2.bck", ""}, - {"mdarm_shipwait02.bck", ""}, - {"mdarm_shiptalk01.bck", ""}, - {"mdarm_talk05.bck", ""}, - {"mdarm_unazuki.bck", ""}, + {"mdarm_wait01.bck", ""}, {"mdarm_walk.bck", "mdarm_run.bck"}, + {"mdarm_squatdown.bck", ""}, {"mdarm_sqwait01.bck", ""}, + {"mdarm_sqwait02.bck", ""}, {"mdarm_fall.bck", ""}, + {"mdarm_fall02.bck", ""}, {"mdarm_land.bck", ""}, + {"mdarm_land02.bck", ""}, {"mdarm_land03.bck", ""}, + {"mdarm_kamaewait.bck", ""}, {"mdarm_kamae.bck", ""}, + {"mdarm_piyo2.bck", ""}, {"mdarm_ojigi.bck", ""}, + {"mdarm_harpplay01.bck", ""}, {"mdarm_harpplay02.bck", ""}, + {"mdarm_takeoff01.bck", ""}, {"mdarm_watasu.bck", ""}, + {"mdarm_talk01.bck", ""}, {"mdarm_talk02.bck", ""}, + {"mdarm_talk03.bck", ""}, {"mdarm_talk04.bck", ""}, + {"mdarm_mkamae.bck", ""}, {"mdarm_mwait.bck", ""}, + {"mdarm_oriwait.bck", ""}, {"mdarm_shipwait.bck", ""}, + {"mdarm_kyohi.bck", ""}, {"mdarm_kyoro2.bck", ""}, + {"mdarm_shipwait02.bck", ""}, {"mdarm_shiptalk01.bck", ""}, + {"mdarm_talk05.bck", ""}, {"mdarm_unazuki.bck", ""}, }; static anm_tbl wingAnmTbl[] = { {"mdwing_wait01.bck", ""}, @@ -2614,12 +4631,12 @@ BOOL daNpc_Md_c::setAnm(int anmIdx) { {"mdwing_caught01.bck", ""}, {"mdwing_caught02.bck", ""}, }; - + BOOL ret = FALSE; - + m3104 = anmIdx; anm_prm* prm = &l_anmPrm[anmIdx]; - + f32 speed = prm->speed; f32 morf = prm->morf; if (anmIdx == 6) { @@ -2635,25 +4652,26 @@ BOOL daNpc_Md_c::setAnm(int anmIdx) { if (anmIdx == 7 || anmIdx == 8) { morf = l_HIO.m1A8; } - + if (prm->anmTblIdx != m312D || mpMorf->getPlaySpeed() != prm->speed) { m312D = prm->anmTblIdx; anm_tbl* bodyAnm = &l_anmTbl[m312D]; m312A = 0; dNpc_Md_setAnm(mpMorf, mRunRate, prm->loopMode, morf, speed, bodyAnm->m00, bodyAnm->m20, mModelArcName); m30D0 = mpMorf->getFrame(); - + if (prm->armAnmTblIdx < 0x80) { anm_tbl* armAnm = &armAnmTbl[prm->armAnmTblIdx]; dNpc_Md_setAnm(mpArmMorf, mRunRate, prm->loopMode, morf, speed, armAnm->m00, armAnm->m20, mModelArcName); ret = FALSE; } else { if (!isTypeShipRide()) { - dNpc_Md_setAnm(mpWingMorf, prm->loopMode, morf, speed, wingAnmTbl[prm->armAnmTblIdx - 0x80].m00, mModelArcName); + char* tmp = wingAnmTbl[prm->armAnmTblIdx - 0x80].m00; + dNpc_Md_setAnm(mpWingMorf, prm->loopMode, morf, speed, tmp, mModelArcName); } ret = TRUE; } - + #if VERSION > VERSION_DEMO if (m3104 == 0x12 || m3104 == 0x1F) { fopAcM_seStartCurrent(this, JA_SE_CM_MD_HARP_SET_UP, 0); @@ -2662,26 +4680,43 @@ BOOL daNpc_Md_c::setAnm(int anmIdx) { } #endif } - + if (prm->btpAnmTblIdx != m3137) { initTexPatternAnm(prm->btpAnmTblIdx, true); } - +#if VERSION == VERSION_DEMO + if (m312D == 0x0E || m312D == 0x0F || m312D == 0x12 || m312D == 0x13 || m312D == 0x1A || m312D == 0x1B || m312D == 0x1C || m312D == 0x25) { + setBitStatus(daMdStts_UNK80); + } else { + clearStatus(daMdStts_UNK80); + } +#else if (m312D == 0x0E || m312D == 0x12 || m312D == 0x13 || m312D == 0x1A || m312D == 0x1C || m312D == 0x25) { setBitStatus(daMdStts_UNK80); } else if (m312D != 0x0F && m312D != 0x1B) { clearStatus(daMdStts_UNK80); } - +#endif + if (m312D == 0x1B || m312D == 0x1C) { setBitStatus(daMdStts_UNK4000); } else { clearStatus(daMdStts_UNK4000); } - + if (m312D == 0x10) { if (m0508[1] == NULL) { - m0508[1] = dComIfGp_particle_set(dPa_name::ID_IT_SN_MD_PIYOPIYO00, ¤t.pos, NULL, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), &tevStr.mColorK0, &tevStr.mColorK0); + m0508[1] = dComIfGp_particle_set( + dPa_name::ID_IT_SN_MD_PIYOPIYO00, + ¤t.pos, + NULL, + NULL, + 0xFF, + NULL, + fopAcM_GetRoomNo(this), + &tevStr.mColorK0, + &tevStr.mColorK0 + ); if (m0508[1]) { m0508[1]->becomeImmortalEmitter(); } @@ -2689,12 +4724,14 @@ BOOL daNpc_Md_c::setAnm(int anmIdx) { } else { deletePiyoPiyo(); } - + return ret; } /* 0000D4CC-0000D5E4 .text dNpc_Md_setAnm__10daNpc_Md_cFP15mDoExt_McaMorf2fiffPcPcPCc */ -bool daNpc_Md_c::dNpc_Md_setAnm(mDoExt_McaMorf2* pMorf, f32 param_f1, int loopMode, f32 morf, f32 speed, char* fileName1, char* filename2, const char* arcName) { +bool daNpc_Md_c::dNpc_Md_setAnm( + mDoExt_McaMorf2* pMorf, f32 param_f1, int loopMode, f32 morf, f32 speed, char* fileName1, char* filename2, const char* arcName +) { bool ret = false; J3DAnmTransform* bck1 = NULL; J3DAnmTransform* bck2 = NULL; @@ -2715,13 +4752,47 @@ bool daNpc_Md_c::dNpc_Md_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f } /* 0000D614-0000D82C .text chkAttention__10daNpc_Md_cF4cXyzsi */ -u8 daNpc_Md_c::chkAttention(cXyz, s16, int) { - /* Nonmatching */ +bool daNpc_Md_c::chkAttention(cXyz pos, s16 angle, int param_3) { + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + f32 maxAttnDistXZ = l_HIO.mNpc.mMaxAttnDistXZ; + f32 dVar9 = l_HIO.m0BC; + f32 dVar8 = l_HIO.m0C0; + int maxAttnAngleY = l_HIO.mNpc.mMaxAttnAngleY; + if (isShipRide()) { + maxAttnDistXZ = l_HIO.m074.m04; + } else if ((isTypeM_Dra09()) && (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1101))) { + maxAttnDistXZ = l_HIO.m0B8; + } + cXyz delta; + delta.x = link->current.pos.x - pos.x; + delta.z = link->current.pos.z - pos.z; + f32 distXZ = std::sqrtf(SQUARE(delta.x) + SQUARE(delta.z)); + s16 targetAngleY = cM_atan2s(delta.x, delta.z); + delta.y = link->current.pos.y - pos.y; + if (m312C != 0) { + maxAttnDistXZ += 40.0f; + maxAttnAngleY += 0x71c; + } + targetAngleY -= angle; + if (param_3 != 0) { + return (maxAttnDistXZ > distXZ) && (delta.y < dVar9) && (delta.y > dVar8); + } else { + return (maxAttnAngleY > abs(targetAngleY)) && (maxAttnDistXZ > distXZ) && (delta.y < dVar9) && (delta.y > dVar8); + } } /* 0000D82C-0000D8FC .text chkArea__10daNpc_Md_cFP4cXyz */ -bool daNpc_Md_c::chkArea(cXyz*) { - /* Nonmatching */ +bool daNpc_Md_c::chkArea(cXyz* param_1) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + f32 maxDist = l_HIO.mNpc.mMaxAttnDistXZ; + + cXyz delta; + delta.x = player->current.pos.x - param_1->x; + delta.z = player->current.pos.z - param_1->z; + f32 dist = std::sqrtf(delta.x * delta.x + delta.z * delta.z); + + maxDist += 40.0f; + return maxDist > dist; } /* 0000D8FC-0000D950 .text carryCheck__10daNpc_Md_cFv */ @@ -2743,34 +4814,34 @@ void daNpc_Md_c::eventOrder() { eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); } else if (mCurEventMode >= 4) { switch (mCurEventMode) { - case 4: - mCurEvent = 0; - break; - case 5: - mCurEvent = 1; - break; - case 6: - mCurEvent = 2; - break; - case 7: - mCurEvent = 3; - break; - case 8: - mCurEvent = 4; - break; - case 9: - mCurEvent = 5; - break; - case 10: - mCurEvent = 6; - dComIfGp_event_order(dEvtType_OTHER_e, 0xFF, dEvtFlag_NOPARTNER_e, 0xFFFF, dComIfGp_getPlayer(0), this, mEventIdxTable[mCurEvent]); - return; - case 11: - mCurEvent = 7; - break; - case 12: - mCurEvent = 8; - break; + case 4: + mCurEvent = 0; + break; + case 5: + mCurEvent = 1; + break; + case 6: + mCurEvent = 2; + break; + case 7: + mCurEvent = 3; + break; + case 8: + mCurEvent = 4; + break; + case 9: + mCurEvent = 5; + break; + case 10: + mCurEvent = 6; + dComIfGp_event_order(dEvtType_OTHER_e, 0xFF, dEvtFlag_NOPARTNER_e, 0xFFFF, dComIfGp_getPlayer(0), this, mEventIdxTable[mCurEvent]); + return; + case 11: + mCurEvent = 7; + break; + case 12: + mCurEvent = 8; + break; } fopAcM_orderOtherEventId(this, mEventIdxTable[mCurEvent]); } @@ -2778,7 +4849,20 @@ void daNpc_Md_c::eventOrder() { /* 0000DAD4-0000DC14 .text checkOrder__10daNpc_Md_cFv */ void daNpc_Md_c::checkOrder() { - /* Nonmatching */ + if ((eventInfo.checkCommandTalk()) && ((mCurEventMode == 1 || (mCurEventMode == 2)) || (mCurEventMode == 3))) { + mCurEventMode = 0; + if (dComIfGp_event_chkTalkXY()) { + onXYTalk(); + if (isDefaultTalkXY()) { + setNpcAction(&daNpc_Md_c::talkNpcAction); + } + } else if (isShipRide()) { + setNpcAction(&daNpc_Md_c::shipTalkNpcAction); + } else { + setNpcAction(&daNpc_Md_c::talkNpcAction); + } + fopAcM_cancelCarryNow(this); + } } /* 0000DC14-0000DCB0 .text checkCommandTalk__10daNpc_Md_cFv */ @@ -2806,255 +4890,255 @@ BOOL daNpc_Md_c::checkCommandTalk() { u16 daNpc_Md_c::next_msgStatus(u32* pCurrMsgNo) { u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; switch (*pCurrMsgNo) { - case 0x5AC: - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17D5: - case 0x1805: - *pCurrMsgNo = 0x17D6; - break; - case 0x17D6: - *pCurrMsgNo = 0x17D7; - break; - case 0x17D7: - *pCurrMsgNo = 0x17D8; - break; - case 0x17D8: - mCurEventMode = 4; - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17D9: - *pCurrMsgNo = 0x1802; - break; - case 0x1802: - *pCurrMsgNo = 0x17DA; - break; - case 0x17DA: - *pCurrMsgNo = 0x17DB; - break; - case 0x17DB: - dComIfGs_onEventBit(dSv_event_flag_c::MEDLI_GAVE_FATHERS_LETTER); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17DD: - *pCurrMsgNo = 0x17DE; - break; - case 0x17DE: - mCurEventMode = 5; - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17DF: - *pCurrMsgNo = 0x17E0; - break; - case 0x17E0: - *pCurrMsgNo = 0x17E1; - break; - case 0x17E1: - *pCurrMsgNo = 0x17E2; - break; - case 0x17E2: - *pCurrMsgNo = 0x17E3; - break; - case 0x17E4: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1101); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17E5: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1280); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17E6: - *pCurrMsgNo = 0x17E7; - break; - case 0x17E7: - *pCurrMsgNo = 0x17E8; - break; - case 0x17E8: - *pCurrMsgNo = 0x17E9; - break; - case 0x17E9: - *pCurrMsgNo = 0x17EA; - break; - case 0x17EA: - *pCurrMsgNo = 0x17EB; - break; - case 0x17EB: - *pCurrMsgNo = 0x17EC; - break; - case 0x17EC: - *pCurrMsgNo = 0x17ED; - break; - case 0x17ED: - *pCurrMsgNo = 0x17EE; - break; - case 0x17EE: - if (l_msg->mSelectNum == 1) { - *pCurrMsgNo = 0x17EF; - } else { - *pCurrMsgNo = 0x17F0; - } - break; - case 0x17EF: - *pCurrMsgNo = 0x17ED; - break; - case 0x17F0: - *pCurrMsgNo = 0x17F1; - break; - case 0x17F1: - mCurEventMode = 7; - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17F3: - *pCurrMsgNo = 0x17F4; - break; - case 0x17F4: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1104); - // Fall-through - case 0x17F8: - setBitStatus(daMdStts_UNK40); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x17F7: - *pCurrMsgNo = 0x17F8; - break; - case 0x17FA: - *pCurrMsgNo = 0x17FB; - break; - case 0x17FB: - *pCurrMsgNo = 0x17FC; - break; - case 0x17FC: - *pCurrMsgNo = 0x17FD; - break; - case 0x17FD: - *pCurrMsgNo = 0x17FE; - break; - case 0x17FE: - *pCurrMsgNo = 0x17FF; - break; - case 0x1800: - *pCurrMsgNo = 0x1801; - break; - case 0x1801: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1102); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x19C9: - *pCurrMsgNo = 0x19CA; - break; - case 0x19CA: - *pCurrMsgNo = 0x19CB; - break; - case 0x19CB: - *pCurrMsgNo = 0x19CC; - break; - case 0x19CC: - *pCurrMsgNo = 0x19CD; - break; - case 0x19CD: - *pCurrMsgNo = 0x19CE; - break; - case 0x19CE: - *pCurrMsgNo = 0x19CF; - break; - case 0x19CF: - *pCurrMsgNo = 0x19D0; - break; - case 0x19D0: - *pCurrMsgNo = 0x19D1; - break; - case 0x19D1: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1402); - onSeaTalk(); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x19D2: - *pCurrMsgNo = 0x19D3; - break; - case 0x19D3: - *pCurrMsgNo = 0x19D4; - break; - case 0x19D4: - *pCurrMsgNo = 0x19D5; - break; - case 0x19D6: - *pCurrMsgNo = 0x19D7; - break; - case 0x19D7: - *pCurrMsgNo = 0x19D8; - break; - case 0x19D8: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_1504); - case 0x19D9: - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x19DA: - *pCurrMsgNo = 0x19DB; - break; - case 0x19DD: - *pCurrMsgNo = 0x19DE; - break; - case 0x19E0: - *pCurrMsgNo = 0x19E1; - break; - case 0x19E1: - *pCurrMsgNo = 0x19E2; - break; - case 0x19E2: - *pCurrMsgNo = 0x19E3; - break; - case 0x19E3: - *pCurrMsgNo = 0x19E4; - break; - case 0x19E5: - *pCurrMsgNo = 0x19E6; - break; - case 0x19E7: - *pCurrMsgNo = 0x19E8; - break; - case 0x19F6: - *pCurrMsgNo = 0x19F7; - break; - case 0x19F7: - *pCurrMsgNo = 0x19D2; - break; - case 0x19F8: - *pCurrMsgNo = 0x19F9; - break; - case 0x19F9: - *pCurrMsgNo = 0x19FA; - break; - case 0x19FA: - *pCurrMsgNo = 0x19FB; - break; - case 0x19FB: - case 0x19FF: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_2E40); - onSeaTalk(); - // Fall-through - case 0x1A01: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_2C08); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - case 0x19FC: - *pCurrMsgNo = 0x19FD; - break; - case 0x19FD: - *pCurrMsgNo = 0x19FE; - break; - case 0x19FE: - *pCurrMsgNo = 0x19FF; - break; - case 0x1A00: - *pCurrMsgNo = 0x1A01; - break; - case 0x1A02: - dComIfGs_onEventBit(dSv_event_flag_c::UNK_3B80); - msgStatus = fopMsgStts_MSG_ENDS_e; - break; - default: - msgStatus = fopMsgStts_MSG_ENDS_e; - break; + case 0x5AC: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17D5: + case 0x1805: + *pCurrMsgNo = 0x17D6; + break; + case 0x17D6: + *pCurrMsgNo = 0x17D7; + break; + case 0x17D7: + *pCurrMsgNo = 0x17D8; + break; + case 0x17D8: + mCurEventMode = 4; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17D9: + *pCurrMsgNo = 0x1802; + break; + case 0x1802: + *pCurrMsgNo = 0x17DA; + break; + case 0x17DA: + *pCurrMsgNo = 0x17DB; + break; + case 0x17DB: + dComIfGs_onEventBit(dSv_event_flag_c::MEDLI_GAVE_FATHERS_LETTER); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17DD: + *pCurrMsgNo = 0x17DE; + break; + case 0x17DE: + mCurEventMode = 5; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17DF: + *pCurrMsgNo = 0x17E0; + break; + case 0x17E0: + *pCurrMsgNo = 0x17E1; + break; + case 0x17E1: + *pCurrMsgNo = 0x17E2; + break; + case 0x17E2: + *pCurrMsgNo = 0x17E3; + break; + case 0x17E4: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1101); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17E5: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1280); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17E6: + *pCurrMsgNo = 0x17E7; + break; + case 0x17E7: + *pCurrMsgNo = 0x17E8; + break; + case 0x17E8: + *pCurrMsgNo = 0x17E9; + break; + case 0x17E9: + *pCurrMsgNo = 0x17EA; + break; + case 0x17EA: + *pCurrMsgNo = 0x17EB; + break; + case 0x17EB: + *pCurrMsgNo = 0x17EC; + break; + case 0x17EC: + *pCurrMsgNo = 0x17ED; + break; + case 0x17ED: + *pCurrMsgNo = 0x17EE; + break; + case 0x17EE: + if (l_msg->mSelectNum == 1) { + *pCurrMsgNo = 0x17EF; + } else { + *pCurrMsgNo = 0x17F0; + } + break; + case 0x17EF: + *pCurrMsgNo = 0x17ED; + break; + case 0x17F0: + *pCurrMsgNo = 0x17F1; + break; + case 0x17F1: + mCurEventMode = 7; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17F3: + *pCurrMsgNo = 0x17F4; + break; + case 0x17F4: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1104); + // Fall-through + case 0x17F8: + setBitStatus(daMdStts_UNK40); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x17F7: + *pCurrMsgNo = 0x17F8; + break; + case 0x17FA: + *pCurrMsgNo = 0x17FB; + break; + case 0x17FB: + *pCurrMsgNo = 0x17FC; + break; + case 0x17FC: + *pCurrMsgNo = 0x17FD; + break; + case 0x17FD: + *pCurrMsgNo = 0x17FE; + break; + case 0x17FE: + *pCurrMsgNo = 0x17FF; + break; + case 0x1800: + *pCurrMsgNo = 0x1801; + break; + case 0x1801: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1102); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x19C9: + *pCurrMsgNo = 0x19CA; + break; + case 0x19CA: + *pCurrMsgNo = 0x19CB; + break; + case 0x19CB: + *pCurrMsgNo = 0x19CC; + break; + case 0x19CC: + *pCurrMsgNo = 0x19CD; + break; + case 0x19CD: + *pCurrMsgNo = 0x19CE; + break; + case 0x19CE: + *pCurrMsgNo = 0x19CF; + break; + case 0x19CF: + *pCurrMsgNo = 0x19D0; + break; + case 0x19D0: + *pCurrMsgNo = 0x19D1; + break; + case 0x19D1: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1402); + onSeaTalk(); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x19D2: + *pCurrMsgNo = 0x19D3; + break; + case 0x19D3: + *pCurrMsgNo = 0x19D4; + break; + case 0x19D4: + *pCurrMsgNo = 0x19D5; + break; + case 0x19D6: + *pCurrMsgNo = 0x19D7; + break; + case 0x19D7: + *pCurrMsgNo = 0x19D8; + break; + case 0x19D8: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_1504); + case 0x19D9: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x19DA: + *pCurrMsgNo = 0x19DB; + break; + case 0x19DD: + *pCurrMsgNo = 0x19DE; + break; + case 0x19E0: + *pCurrMsgNo = 0x19E1; + break; + case 0x19E1: + *pCurrMsgNo = 0x19E2; + break; + case 0x19E2: + *pCurrMsgNo = 0x19E3; + break; + case 0x19E3: + *pCurrMsgNo = 0x19E4; + break; + case 0x19E5: + *pCurrMsgNo = 0x19E6; + break; + case 0x19E7: + *pCurrMsgNo = 0x19E8; + break; + case 0x19F6: + *pCurrMsgNo = 0x19F7; + break; + case 0x19F7: + *pCurrMsgNo = 0x19D2; + break; + case 0x19F8: + *pCurrMsgNo = 0x19F9; + break; + case 0x19F9: + *pCurrMsgNo = 0x19FA; + break; + case 0x19FA: + *pCurrMsgNo = 0x19FB; + break; + case 0x19FB: + case 0x19FF: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_2E40); + onSeaTalk(); + // Fall-through + case 0x1A01: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_2C08); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0x19FC: + *pCurrMsgNo = 0x19FD; + break; + case 0x19FD: + *pCurrMsgNo = 0x19FE; + break; + case 0x19FE: + *pCurrMsgNo = 0x19FF; + break; + case 0x1A00: + *pCurrMsgNo = 0x1A01; + break; + case 0x1A02: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3B80); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; } return msgStatus; } @@ -3133,42 +5217,308 @@ u32 daNpc_Md_c::getMsg() { /* 0000E64C-0000E95C .text setCollision__10daNpc_Md_cFv */ void daNpc_Md_c::setCollision() { - /* Nonmatching */ + cXyz local_20; + cXyz local_2c; + cXyz local_38; + cXyz local_44; + cXyz local_50; + + local_20.setall(0.0f); + local_2c = current.pos; + if ((!isShipRide()) && (!fopAcM_CheckStatus(this, fopAcStts_CARRY_e))) { + mCyl1.SetC(local_2c); + mCyl1.SetR(30.0f); + mCyl1.SetH(m30F8); + dComIfG_Ccsp()->Set(&mCyl1); + } else { + mCyl1.ClrCoHit(); + mCyl1.ClrTgHit(); + } + mCyl2.SetC(local_2c); + mCyl2.SetR(30.0f); + mCyl2.SetH(m30F8); + dComIfG_Ccsp()->Set(&mCyl2); + mCyl3.SetC(local_2c); + mCyl3.SetR(30.0f); + mCyl3.SetH(m30F8); + dComIfG_Ccsp()->Set(&mCyl3); + if (isLightHit()) { + cMtx_copy(mpHarpModel->getBaseTRMtx(), mDoMtx_stack_c::now); + mDoMtx_stack_c::transM(l_HIO.m034.m0C, l_HIO.m034.m10, l_HIO.m034.m14); + mDoMtx_stack_c::XYZrotM(l_HIO.m034.m18, l_HIO.m034.m1A, l_HIO.m034.m1C); + mDoMtx_stack_c::multVec(&l_ms_light_local_start, &local_44); + mDoMtx_stack_c::multVecSR(&l_ms_light_local_vec, &local_38); + local_50 = local_44 + local_38; + mLinChk.Set(&local_44, &local_50, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + local_50 = *mLinChk.GetCrossP(); + local_38 = local_50 - local_44; + } + mCps.SetStartEnd(local_44, local_50); + mCps.SetAtVec(local_38); + mCps.OnAtSetBit(); + dComIfG_Ccsp()->Set(&mCps); + dComIfG_Ccsp()->SetMass(&mCps, 1); + fopAcM_OffStatus(this, fopAcStts_CULL_e); + } else { + mCps.ResetAtHit(); + mCps.OffAtSetBit(); + fopAcM_OnStatus(this, fopAcStts_CULL_e); + } } /* 0000E95C-0000E9F0 .text setAttention__10daNpc_Md_cFb */ -void daNpc_Md_c::setAttention(bool) { - /* Nonmatching */ +void daNpc_Md_c::setAttention(bool param_1) { + if ((!param_1) && (m312B >= 2)) { + return; + } + eyePos.set(getEyePos().x, getEyePos().y, getEyePos().z); + f32 fVar1; + if (isFlying()) { + fVar1 = 70.0f; + } else if (daPy_getPlayerActorClass() == this) { + fVar1 = 110.0f; + } else { + fVar1 = l_HIO.mNpc.mAttnYOffset; + } + attention_info.position.set(current.pos.x, current.pos.y + fVar1, current.pos.z); } /* 0000E9F0-0000EB28 .text lookBack__10daNpc_Md_cFiii */ -void daNpc_Md_c::lookBack(int, int, int) { - /* Nonmatching */ +void daNpc_Md_c::lookBack(int param_1, int param_2, int param_3) { + cXyz local_30; + cXyz local_3c; + + cXyz* dstPos = NULL; + local_3c.setall(0.0f); + s16 desiredYRot = shape_angle.y; + s16 target; + if (mJntCtrl.trnChk()) { + if (param_2 != 0) { + target = l_HIO.m1BC; + } else { + target = l_HIO.mNpc.mMaxHeadTurnVel; + } + cLib_addCalcAngleS2(&m3110, target, 4, 0x800); + } else { + m3110 = 0; + } + if (param_1 != 0) { + local_30 = dNpc_playerEyePos(l_HIO.mNpc.m04); + dstPos = &local_30; + local_3c = current.pos; + local_3c.y = eyePos.y; + } + mJntCtrl.lookAtTarget(&shape_angle.y, dstPos, local_3c, desiredYRot, m3110, param_3); } /* 0000EB28-0000EC38 .text lookBack__10daNpc_Md_cFP4cXyzii */ -void daNpc_Md_c::lookBack(cXyz*, int, int) { - /* Nonmatching */ +void daNpc_Md_c::lookBack(cXyz* param_1, int param_2, int param_3) { + cXyz local_30; + cXyz local_3c; + + cXyz* dstPos = NULL; + local_3c.setall(0.0f); + s16 desiredYRot = shape_angle.y; + if (mJntCtrl.trnChk()) { + s16 r4 = l_HIO.mNpc.mMaxHeadTurnVel; + cLib_addCalcAngleS2(&m3110, r4, 4, 0x800); + } else { + m3110 = 0; + } + if (param_2 != 0) { + local_30 = *param_1; + dstPos = &local_30; + local_3c = current.pos; + local_3c.y = eyePos.y; + } + mJntCtrl.lookAtTarget(&shape_angle.y, dstPos, local_3c, desiredYRot, m3110, param_3); } /* 0000EC38-0000EDD0 .text lookBackWaist__10daNpc_Md_cFsf */ -void daNpc_Md_c::lookBackWaist(s16, f32) { - /* Nonmatching */ +s32 daNpc_Md_c::lookBackWaist(s16 param_1, f32 param_2) { + f32 fVar1; + s16 iVar2; + s16 sVar3; + s16 sVar4; + bool uVar5; + f32 dVar6; + + iVar2 = (param_1 - shape_angle.y); + fVar1 = l_HIO.m034.m04 * (param_2 * cM_scos(iVar2)); + dVar6 = l_HIO.m034.m08 * (param_2 * cM_ssin(iVar2)); + if (fVar1 < 0.0f) { + sVar3 = l_HIO.m034.m20 * fVar1; + } else { + sVar3 = l_HIO.m034.m1E * fVar1; + } + sVar3 = cLib_addCalcAngleS(&m3114, sVar3, 4, 0xc00, 0x180); + sVar4 = cLib_addCalcAngleS(&m3116, l_HIO.m034.m22 * dVar6, 4, 0xc00, 0x180); + uVar5 = false; + if ((sVar3 == 0) && (sVar4 == 0)) { + uVar5 = true; + } + return uVar5; } /* 0000EDD0-0000F100 .text setBaseMtx__10daNpc_Md_cFv */ void daNpc_Md_c::setBaseMtx() { - /* Nonmatching */ + s16 sVar4; + J3DModel* model; + + model = getModel(); + if (fopAcM_CheckStatus(this, fopAcStts_CARRY_e)) { + if (isNoCarryAction()) { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::transM(0.0f, -l_HIO.m05C.m4, 0.0f); + } else { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::transM(m3298.x, m3298.y, m3298.z); + mDoMtx_stack_c::XrotM(shape_angle.x); + mDoMtx_stack_c::ZrotM(shape_angle.z); + } + } else if (isShipRide()) { + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + daShip_c* ship = dComIfGp_getShipActor(); + cMtx_copy(ship->getBodyMtx(), mDoMtx_stack_c::now); + mDoMtx_stack_c::transM(43.0f, 14.65f, 13.99f); + mDoMtx_stack_c::XYZrotM(0, -0x45b0, 0); + current.pos.set(mDoMtx_stack_c::now[0][3], mDoMtx_stack_c::now[1][3], mDoMtx_stack_c::now[2][3]); + sVar4 = ship->shape_angle.y + -0x4000; + shape_angle.y = sVar4; + current.angle.y = sVar4; + setAttention(true); + tevStr.mRoomNo = ship->tevStr.mRoomNo; + tevStr.mEnvrIdxOverride = ship->tevStr.mEnvrIdxOverride; + } else { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 95.0f, current.pos.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::transM(m3298.x, m3298.y, m3298.z); + mDoMtx_stack_c::XrotM(shape_angle.x); + mDoMtx_stack_c::ZrotM(shape_angle.z); + mDoMtx_stack_c::transM(0.0f, -95.0f, 0.0f); + } + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->calc(); + if (!isTypeShipRide()) { + mpWingMorf->calc(); + } + mpArmMorf->calc(); + if (checkStatus(daMdStts_UNK80)) { + cMtx_copy(mpArmMorf->getModel()->getAnmMtx(m_handL_jnt_num), mDoMtx_stack_c::now); + mDoMtx_stack_c::transM(0.37f, 3.81f, -11.13f); + mDoMtx_stack_c::XYZrotM(0x1b24, -0x2913, -0x1982); + } else { + cMtx_copy(getModel()->getAnmMtx(m_backbone2_jnt_num), mDoMtx_stack_c::now); + mDoMtx_stack_c::transM(2.2f, -11.681f, 1.3f); + mDoMtx_stack_c::XYZrotM(0x3f11, 0x2894, 0x7f7e); + } + mpHarpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpHarpLightModel->setBaseTRMtx(mpHarpModel->getBaseTRMtx()); } /* 0000F100-0000F160 .text deletePiyoPiyo__10daNpc_Md_cFv */ void daNpc_Md_c::deletePiyoPiyo() { - /* Nonmatching */ + JPABaseEmitter* emitter = m0508[1]; + if (emitter == NULL) { + return; + } + emitter->quitImmortalEmitter(); + m0508[1]->becomeInvalidEmitter(); + JSUPtrLink* link = emitter->getParticleList()->getFirstLink(); + while (link != 0) { + JPABaseParticle* ptcl = (JPABaseParticle*)link->getObjectPtr(); + ptcl->setDeleteParticleFlag(); + link = link->getNext(); + } + m0508[1] = NULL; } /* 0000F160-0000F4E0 .text init__10daNpc_Md_cFv */ BOOL daNpc_Md_c::init() { /* Nonmatching */ + cXyz local_30; + + local_30.setall(0.0f); + u8 uVar1 = (fopAcM_GetParam(this) >> 0x10) & 0xFF; + m3100 = uVar1; + m313E = 0; + m30F4 = JA_SE_CM_MD_HARP_CN4; + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0x21; + attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0x21; + attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 0x27; + mCurEventMode = 0; + mCurEvent = 0; + m0508[0] = NULL; + m0508[1] = NULL; + m0508[2] = NULL; + m0508[3] = NULL; + m0508[4] = NULL; + m0508[5] = NULL; + m30AC.x = 0.0f; + m30AC.y = 0.0f; + m30AC.z = 50.0f; + setPiyo2TalkCNT(0); + clearStatus(); + gravity = l_HIO.m0F4; + if (isTypeM_DaiB()) { + setNpcAction(&daNpc_Md_c::harpWaitNpcAction); + } else { + setNpcAction(&daNpc_Md_c::waitNpcAction); + } + m3094 = current.pos; + m3088 = current.pos; + for (s32 i = 0; i < 4; i++) { + m3234[i].setall(0.0f); + } + if ((uVar1 & 1) != 0) { + setStatus(daMdStts_UNK8); + } + setEffectStatus(0); + mCurEvent = -1; + offFlying(); + offMirror(); + m30F8 = 120.0f; + mRunRate = 0.0f; + mpMorf->setAnmRate(mRunRate); + mpArmMorf->setAnmRate(mRunRate); + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1620)) { + onNpcNotChange(); + } else if (shipRideCheck()) { +#if VERSION > VERSION_DEMO // ??? + mpMorf->setMorf(0.0f); + mpArmMorf->setMorf(0.0f); +#endif + } + if ((isTypeM_Dai()) || (isTypeEdaichi())) { + mStts.Init(0xFE, 0xFF, this); + } else { + mStts.Init(0xFF, 0xFF, this); + } + mCyl1.Set(l_cyl_src); + mCyl1.SetStts(&mStts); + mCyl2.Set(l_wind_cyl_src); + mCyl2.SetStts(&mStts); + mCyl3.Set(l_light_cyl_src); + mCyl3.SetStts(&mStts); + mCps.Set(l_fan_light_cps_src); + mCps.SetStts(&mStts); + mCps.SetAtType(AT_TYPE_LIGHT); + mCps.SetR(20.0f); + ResTIMG* pBti = (ResTIMG*)dComIfG_getObjectRes(mModelArcName, "md_spot.bti"); + m0B70.init(pBti); + if (isTypeEdaichi()) { + onNpcCallCommand(); + } + for (s32 i = 0; i < 10; i++) { + mEventIdxTable[i] = dComIfGp_evmng_getEventIdx(event_name_tbl[i], 0xFF); + } + eventInfo.mpCheckCB = daNpc_Md_XyCheckCB; + eventInfo.mpEventCB = daNpc_Md_XyEventCB; + return TRUE; } /* 0000F4E0-0000F8EC .text draw__10daNpc_Md_cFv */ @@ -3185,17 +5535,17 @@ BOOL daNpc_Md_c::draw() { return TRUE; } } - - J3DModel* model = mpMorf->getModel(); + + J3DModel* model = getModel(); J3DModelData* modelData = model->getModelData(); - + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); drawDamageFog(); g_env_light.setLightTevColorType(model, &tevStr); m0520.entry(modelData); mpMorf->entryDL(); m0520.remove(modelData); - + if (!isTypeShipRide()) { if (checkStatus(daMdStts_UNK1)) { model = mpWingMorf->getModel(); @@ -3211,15 +5561,15 @@ BOOL daNpc_Md_c::draw() { g_env_light.setLightTevColorType(model, &tevStr); mpArmMorf->entryDL(); } - + g_env_light.setLightTevColorType(mpHarpModel, &tevStr); mDoExt_modelUpdateDL(mpHarpModel); - + if (isLightHit()) { mLightBtkAnm.entry(mpHarpLightModel->getModelData()); mDoExt_modelUpdateDL(mpHarpLightModel); mLightBtkAnm.remove(mpHarpLightModel->getModelData()); - + mDoMtx_stack_c::copy(mpHarpModel->getBaseTRMtx()); mDoMtx_stack_c::transM(l_HIO.m034.m0C, l_HIO.m034.m10, l_HIO.m034.m14); Mtx mtx; @@ -3227,51 +5577,406 @@ BOOL daNpc_Md_c::draw() { mDoMtx_stack_c::transS(l_ms_light_local_start); mDoMtx_stack_c::YrotM(0x8000); f32 temp = mCps.GetAtVecP()->abs(); - mDoMtx_stack_c::scaleM(0.1f, 0.1f, temp * (1.0f/9600.0f)); + mDoMtx_stack_c::scaleM(0.1f, 0.1f, temp * (1.0f / 9600.0f)); mDoMtx_stack_c::revConcat(mtx); #if VERSION == VERSION_DEMO m0B70.update(mDoMtx_stack_c::get(), 0xFF); #else m0B70.update(mDoMtx_stack_c::get(), 0xFF, 90.0f); #endif - dComIfGd_getXluList()->entryImm(&m0B70, 0x1F); + dComIfGd_getXluList()->entryImm(&m0B70, DEMO_SELECT(0, 0x1F)); } - - if (!isShipRide() && !fopAcM_CheckStatus(this, fopAcStts_CARRY_e) && checkStatus(daMdStts_UNK20000)) { + +#if VERSION == VERSION_DEMO + if (!isShipRide() && !fopAcM_CheckStatus(this, fopAcStts_CARRY_e)) +#else + if (!isShipRide() && !fopAcM_CheckStatus(this, fopAcStts_CARRY_e) && checkStatus(daMdStts_UNK20000)) +#endif + { cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z); - mShadowId = dComIfGd_setShadow( - mShadowId, 0, mpMorf->getModel(), &shadowPos, 800.0f, 20.0f, - current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr - ); - + mShadowId = dComIfGd_setShadow(mShadowId, 0, getModel(), &shadowPos, 800.0f, 20.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr); + if (mShadowId != 0) { dComIfGd_addRealShadow(mShadowId, model); dComIfGd_addRealShadow(mShadowId, mpHarpModel); } } - + dSnap_RegistFig(DSNAP_TYPE_MD, this, 1.0f, 1.0f, 1.0f); - + return TRUE; } /* 0000F8EC-0000FC18 .text animationPlay__10daNpc_Md_cFv */ void daNpc_Md_c::animationPlay() { - /* Nonmatching */ + static const u32 l_harp_play_se[] = { + JA_SE_CM_MD_HARP_CN4, + JA_SE_CM_MD_HARP_DN4, + JA_SE_CM_MD_HARP_EN4, + JA_SE_CM_MD_HARP_FS4, + JA_SE_CM_MD_HARP_GN4, + JA_SE_CM_MD_HARP_CN4, + JA_SE_CM_MD_HARP_DN4, + JA_SE_CM_MD_HARP_EN4, + JA_SE_CM_MD_HARP_FS4, + JA_SE_CM_MD_HARP_GN4, + JA_SE_CM_MD_HARP_GN4, + JA_SE_CM_MD_HARP_GN4 + }; + + u32 mtrlSndId = 0; +#if VERSION == VERSION_DEMO + if ((mAcch.ChkGroundHit()) && (dComIfG_Bgsp()->ChkPolySafe(mAcch.m_gnd))) +#else + if (((checkStatus(daMdStts_UNK20000)) && (mAcch.ChkGroundHit())) && (dComIfG_Bgsp()->ChkPolySafe(mAcch.m_gnd))) +#endif + { + mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd); + } + s8 sVar5 = mpMorf->play(&eyePos, mtrlSndId, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + m312A = sVar5; + BOOL bVar3 = true; + if ((dComIfGp_event_runCheck()) && (dComIfGp_evmng_startCheck(event_name_tbl[5]) != 0 || (dComIfGp_evmng_endCheck(event_name_tbl[5])))) { + bVar3 = false; + } + if (((isTypeSea()) && (bVar3)) && (m3104 == 0x16 || (m3104 == 0x17))) { + BOOL bVar2 = false; + if (m3104 == 0x16) { + if ((mpMorf->checkFrame(11.0f)) || (mpMorf->checkFrame(38.0f))) { + bVar2 = true; + } + } else { + if ((mpMorf->checkFrame(11.0f)) || (mpMorf->checkFrame(35.0f))) { + bVar2 = true; + } + } + if (bVar2) { + if (m313E == 0) { + int iVar1 = cLib_getRndValue(0, 10); + m30F4 = l_harp_play_se[iVar1]; + m313E = 2; + } else { + m313E = m313E - 1; + } + fopAcM_monsSeStart(this, m30F4, ¤t.pos, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + } else { + m313E = 0; + } + if (!isTypeShipRide()) { + if (checkStatus(daMdStts_UNK1)) { + mpWingMorf->play(NULL, 0, 0); + } else { + mpArmMorf->play(NULL, 0, 0); + } + } else { + mpArmMorf->play(NULL, 0, 0); + } + if (mpMorf->getPlaySpeed() < 0.0f) { + if (m30D0 < mpMorf->getFrame()) { + m312A = 1; + } + } else if (m30D0 > mpMorf->getFrame()) { + m312A = 1; + } + m30D0 = mpMorf->getFrame(); +#if VERSION > VERSION_DEMO + if ((m312D == 0x1B) || (m312D == 0xF)) { + if (m30D0 < 10.0f) { + clearStatus(daMdStts_UNK80); + } else { + setBitStatus(daMdStts_UNK80); + } + } +#endif + playTexPatternAnm(); + playLightBtkAnm(); } /* 0000FC18-0000FC58 .text checkPlayerRoom__10daNpc_Md_cFv */ void daNpc_Md_c::checkPlayerRoom() { - m_playerRoom = false; + offPlayerRoom(); fopAc_ac_c* link = dComIfGp_getLinkPlayer(); - if (current.roomNo == link->current.roomNo) { - m_playerRoom = true; + if (fopAcM_GetRoomNo(this) == fopAcM_GetRoomNo(link)) { + onPlayerRoom(); } } /* 0000FC58-000108B0 .text execute__10daNpc_Md_cFv */ BOOL daNpc_Md_c::execute() { - /* Nonmatching */ + f32 fVar1; + f32 fVar2; + s16 target; + cM3dGPla* triPla; + J3DModel* model; + int iStack_88; + cXyz local_30; + cXyz local_3c; + +#if VERSION > VERSION_DEMO + clearStatus(daMdStts_UNK20000); +#endif + setOldLightBodyHit(); + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); + checkPlayerRoom(); + executeDamageFog(); + if (isShipRide()) { + mJntCtrl.setParam( + l_HIO.m074.m10, + l_HIO.m074.m12, + l_HIO.m074.m14, + l_HIO.m074.m16, + l_HIO.m074.m08, + l_HIO.m074.m0A, + l_HIO.m074.m0C, + l_HIO.m074.m0E, + l_HIO.mNpc.mMaxTurnStep + ); + } else if (!isTypeM_DaiB()) { + if (!check_initialRoom()) { + if (dComIfGp_getCb1Player() == this) { + dComIfGp_setCb1Player(NULL); + } + return TRUE; + } + initialRestartOption(2, isTypeM_Dai()); + if ((dComIfGp_getCb1Player() == this) && ((!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1620) || (isTypeShipRide())) || (isTypeM_DaiB()))) { + dComIfGp_setCb1Player(NULL); + } + fopAcM_setStageLayer(this); + if (check_moveStop()) { + if (!isTypeShipRide()) { + setNpcAction(&daNpc_Md_c::waitNpcAction); + setAnm(0x30); + animationPlay(); + setBaseMtx(); + } + m312B = 0; + return TRUE; + } + if (((m3131 != 0) && (dComIfG_Bgsp()->ChkPolySafe(mPolyInfo))) && (dComIfG_Bgsp()->ChkMoveBG(mPolyInfo))) { + local_30 = old.pos; + dComIfG_Bgsp()->MoveBgCrrPos(mPolyInfo, true, &old.pos, NULL, NULL); + } + mJntCtrl.setParam( + l_HIO.mNpc.mMaxBackboneX, + l_HIO.mNpc.mMaxBackboneY, + l_HIO.mNpc.mMinBackboneX, + l_HIO.mNpc.mMinBackboneY, + l_HIO.mNpc.mMaxHeadX, + l_HIO.mNpc.mMaxHeadY, + l_HIO.mNpc.mMinHeadX, + l_HIO.mNpc.mMinHeadY, + l_HIO.mNpc.mMaxTurnStep + ); + } + if (isTypeM_DaiB()) { + mAcch.CrrPos(*dComIfG_Bgsp()); +#if VERSION > VERSION_DEMO + setBitStatus(daMdStts_UNK20000); +#endif + if (mAcch.GetGroundH() != -G_CM3D_F_INF) { + triPla = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + if (triPla != NULL) { + m32A4 = *triPla->GetNP(); + } + s8 roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + fopAcM_SetRoomNo(this, roomNo); + tevStr.mRoomNo = roomNo; + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + mStts.SetRoomId(roomNo); + mPolyInfo.SetPolyInfo(mAcch.m_gnd); + } + } else if (((!isShipRide()) && (!isReturnLink())) && (!fopAcM_CheckStatus(this, fopAcStts_CARRY_e))) { + if (checkNowPosMove(l_staff_name)) { + fVar1 = maxFallSpeed; + fVar2 = speed.y; + if (fVar1 < fVar2) { + speed.y = fVar2 - gravity; + if (speed.y < maxFallSpeed) { + speed.y = maxFallSpeed; + } + } else { + if (fVar1 > fVar2) { + speed.y = fVar2 + gravity; + if (speed.y > maxFallSpeed) { + speed.y = maxFallSpeed; + } + } + } + speed.x = speedF * cM_ssin(current.angle.y); + speed.z = speedF * cM_scos(current.angle.y); + fopAcM_posMove(this, mStts.GetCCMoveP()); + } + if (checkStatus(daMdStts_UNK4)) { + objWindHitCheck(&mCyl2); + } + mAcch.CrrPos(*dComIfG_Bgsp()); +#if VERSION > VERSION_DEMO + setBitStatus(daMdStts_UNK20000); +#endif + BOOL bVar10 = false; + if ((mAcch.ChkWaterIn()) && (mAcch.m_wtr.GetHeight() > current.pos.y + 5.0f)) { + if (m3074.getEmitter() == NULL) { + dComIfGp_particle_setShipTail(dPa_name::ID_AK_JN_HAMON00, ¤t.pos, NULL, NULL, 0xFF, &m3074); + } + m3074.setRate(0.0f); + bVar10 = true; + } + if ((!bVar10) && (m3074.getEmitter() != NULL)) { + m3074.remove(); + } + if (!(mAcch.ChkGroundHit())) { + if (chkPlayerAction(&daNpc_Md_c::walkPlayerAction) || (chkNpcAction(&daNpc_Md_c::searchNpcAction) || (chkNpcAction(&daNpc_Md_c::waitNpcAction)))) { + f32 gndY = mAcch.GetGroundH(); + f32 delta = gndY - current.pos.y; + if (((delta < 0.001f) && (delta >= -30.1f)) && (speed.y < 0.001f)) { + current.pos.y = gndY; + mAcch.SetGroundHit(); + speed.y = 0.0f; + } + } + } + if (mAcch.GetGroundH() != -G_CM3D_F_INF) { + triPla = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + if (triPla != NULL) { + m32A4 = *triPla->GetNP(); + } + s8 roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + current.roomNo = roomNo; + tevStr.mRoomNo = roomNo; + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + mStts.SetRoomId(roomNo); + mPolyInfo.SetPolyInfo(mAcch.m_gnd); + } + if ((mAcch.ChkGroundHit()) && (m3131 == 0)) { + dComIfGp_particle_setSimpleLand(mAcch.m_gnd, ¤t.pos, &shape_angle, 1.25f, 1.5f, 1.0f, &tevStr, &iStack_88, 7); + } +#if VERSION == VERSION_DEMO + m3131 = mAcch.ChkGroundHit(); +#else + m3131 = (mAcch.ChkGroundHit()) ? TRUE : FALSE; +#endif + if ((mAcch.GetGroundH() == -G_CM3D_F_INF) || (dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4)) { + if (!isFallAction()) { + m4E8 = 0; + } else if (m4E8 < 30) { + m4E8++; + } else if (!(dComIfGp_roomControl_checkStatusFlag(fopAcM_GetHomeRoomNo(this), 0x10))) { + current.pos = home.pos; + current.angle = home.angle; + current.roomNo = home.roomNo; + current.field_0x13 = home.field_0x13; + shape_angle = home.angle; + speedF = 0.0f; + m4E8 = 0; + } else { + daPy_getPlayerLinkActorClass()->npcStartRestartRoom(); + } + } else { + m4E8 = 0; + } + } + lightHitCheck(); + setCollision(); + if (checkNowPosMove(l_staff_name)) { + animationPlay(); + } + if (!eventProc()) { + if (daPy_getPlayerActorClass() == this) { + fopAcM_SetStatusMap(this, 0x11); + if (isReturnLink()) { + mCurEventMode = 0xc; + } else { + if (isNoCarryAction()) { + setPlayerAction(&daNpc_Md_c::carryPlayerAction); + returnLink(); + } + playerAction(NULL); + if (returnLinkCheck()) { + returnLink(); + } else { + checkCollision(1); + } + } + } else { + m313F = chkMoveBlock(&m30C4); + if (m313F != 0) { + setNpcAction(&daNpc_Md_c::escapeNpcAction); + } + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1620)) { + fopAcM_SetStatusMap(this, 0xC); + } else { + fopAcM_SetStatusMap(this, 0x8); + } + carryCheck(); + checkOrder(); + npcAction(NULL); + checkCollision(0); + if (!checkStatus(daMdStts_UNK2)) { + if (checkStatus(daMdStts_UNK1)) { + target = shape_angle.y - current.angle.y; + if ((target < 0x6000) && (target > -0x6000)) { + if (target > 0x2000) { + target = 0x2000; + } else if (target < -0x2000) { + target = -0x2000; + } + cLib_addCalcAngleS(&shape_angle.z, target, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.x, 0, 8, 0x2000, 0x400); + } else { + cLib_addCalcAngleS(&shape_angle.z, 0, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.x, -0x2000, 8, 0x2000, 0x400); + } + } else { + current.angle.y = shape_angle.y; + } + } + } + } + eventOrder(); + setBaseMtx(); + model = getModel(); + emitterTrace(m0508[0], model->getAnmMtx(m_neck_jnt_num), ¤t.angle); + emitterTrace(m0508[1], model->getAnmMtx(m_neck_jnt_num), NULL); + if (!isTypeShipRide()) { + model = mpWingMorf->getModel(); + emitterTrace(m0508[2], model->getAnmMtx(m_wingR3_jnt_num), NULL); + emitterTrace(m0508[3], model->getAnmMtx(m_wingL3_jnt_num), NULL); + emitterTrace(m0508[4], model->getAnmMtx(m_wingR3_jnt_num), NULL); + emitterTrace(m0508[5], model->getAnmMtx(m_wingL3_jnt_num), NULL); + if (checkBitEffectStatus(1)) { + model = mpWingMorf->getModel(); + local_3c.set(model->getAnmMtx(m_wingR2_jnt_num)[0][3], model->getAnmMtx(m_wingR2_jnt_num)[1][3], model->getAnmMtx(m_wingR2_jnt_num)[2][3]); + dComIfGp_particle_set( + dPa_name::ID_IT_SN_MD_HANE01, + &local_3c, + NULL, + NULL, + 0xFF, + NULL, + fopAcM_GetRoomNo(this), + &tevStr.mColorK0, + &tevStr.mColorK0, + NULL + ); + local_3c.set(model->getAnmMtx(m_wingL2_jnt_num)[0][3], model->getAnmMtx(m_wingL2_jnt_num)[1][3], model->getAnmMtx(m_wingL2_jnt_num)[2][3]); + dComIfGp_particle_set( + dPa_name::ID_IT_SN_MD_HANE01, + &local_3c, + NULL, + NULL, + 0xFF, + NULL, + fopAcM_GetRoomNo(this), + &tevStr.mColorK0, + &tevStr.mColorK0, + NULL + ); + } + } + setEffectStatus(0); + return TRUE; } /* 000108B0-00010948 .text particle_set__10daNpc_Md_cFPP14JPABaseEmitterUs */ @@ -3293,7 +5998,10 @@ void daNpc_Md_c::emitterTrace(JPABaseEmitter* emitter, MtxP mtx, csXyz* angle) { JGeometry::TVec3 pos(mtx[0][3], mtx[1][3], mtx[2][3]); emitter->setGlobalTranslation(pos); if (angle) { - JGeometry::TVec3 rot(angle->x, angle->y, angle->z); + JGeometry::TVec3 rot; + rot.z = angle->z; + rot.y = angle->y; + rot.x = angle->x; emitter->setGlobalRotation(rot); } } @@ -3311,13 +6019,15 @@ void daNpc_Md_c::emitterDelete(JPABaseEmitter** pEmitter) { /* 000109DC-000110BC .text __dt__10daNpc_Md_cFv */ daNpc_Md_c::~daNpc_Md_c() { dComIfG_resDelete(&mPhase, mModelArcName); - if (heap) { + if (DEMO_SELECT(mpMorf, heap)) { mpMorf->stopZelAnime(); } deletePiyoPiyo(); +#if VERSION > VERSION_DEMO emitterDelete(&m0508[0]); deleteHane02Emitter(); deleteHane03Emitter(); +#endif m3058.end(); m304C.end(); m3074.remove(); @@ -3325,9 +6035,9 @@ daNpc_Md_c::~daNpc_Md_c() { mDoHIO_deleteChild(l_HIO.mNo); l_HIO.mNo = -1; } - m_flying = false; - m_mirror = false; - m_playerRoom = false; + offFlying(); + offMirror(); + offPlayerRoom(); } /* 000110BC-000110DC .text daNpc_Md_Create__FP10fopAc_ac_c */ @@ -3359,7 +6069,10 @@ static BOOL daNpc_Md_IsDelete(daNpc_Md_c* i_this) { /* 0001114C-0001119C .text execute__26daNpc_Md_followEcallBack_cFP14JPABaseEmitter */ void daNpc_Md_followEcallBack_c::execute(JPABaseEmitter* emitter) { emitter->setGlobalTranslation(mPos.x, mPos.y, mPos.z); - JGeometry::TVec3 rot(mAngle.x, mAngle.y, mAngle.z); + JGeometry::TVec3 rot; + rot.z = mAngle.z; + rot.y = mAngle.y; + rot.x = mAngle.x; emitter->setGlobalRotation(rot); }