From 1c473f796d34c7314b1947129a93b9cafa4a9aae Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Mon, 27 Nov 2023 16:08:31 -0500 Subject: [PATCH] d_a_npc_md progress --- include/d/actor/d_a_npc_md.h | 213 ++++++++------- include/d/d_attention.h | 22 +- include/d/d_npc.h | 8 +- include/f_op/f_op_msg_mng.h | 1 + include/m_Do/m_Do_ext.h | 25 ++ src/d/actor/d_a_npc_kamome.cpp | 4 +- src/d/actor/d_a_npc_md.cpp | 468 ++++++++++++++++++++++++++------- src/f_op/f_op_msg_mng.cpp | 2 +- 8 files changed, 548 insertions(+), 195 deletions(-) diff --git a/include/d/actor/d_a_npc_md.h b/include/d/actor/d_a_npc_md.h index ada73db73..7f7bfe9bb 100644 --- a/include/d/actor/d_a_npc_md.h +++ b/include/d/actor/d_a_npc_md.h @@ -206,21 +206,50 @@ public: ACTION_ENDING = -1, }; - typedef int (daNpc_Md_c::*ActionFunc)(void*); + typedef BOOL (daNpc_Md_c::*ActionFunc)(void*); - bool chkPlayerAction(ActionFunc func) { return mCurrPlayerActionFunc == func; } - bool chkNpcAction(ActionFunc func) { return mCurrNpcActionFunc == func; } + BOOL chkPlayerAction(ActionFunc func) { return mCurrPlayerActionFunc == func; } + BOOL chkNpcAction(ActionFunc func) { return mCurrNpcActionFunc == func; } - bool isOldLightBodyHit() { return cLib_checkBit(m30F0, 0x00008000UL); } - void onDefaultTalkXY() { cLib_onBit(m30F0, 0x00010000UL); } - void offDefaultTalkXY() { cLib_offBit(m30F0, 0x00010000UL); } - bool isDefaultTalkXY() { return cLib_checkBit(m30F0, 0x00010000UL); } + void onXYTalk() { cLib_onBit(m30F0, 0x100UL); } + void offXYTalk() { cLib_offBit(m30F0, 0x100UL); } + bool isXYTalk() { return cLib_checkBit(m30F0, 0x100UL); } + bool isOldLightBodyHit() { return cLib_checkBit(m30F0, 0x8000UL); } + void onDefaultTalkXY() { cLib_onBit(m30F0, 0x10000UL); } + void offDefaultTalkXY() { cLib_offBit(m30F0, 0x10000UL); } + bool isDefaultTalkXY() { return cLib_checkBit(m30F0, 0x10000UL); } void setTypeEdaichi() { m3138 = 4; } void setTypeM_Dai() { m3138 = 5; } void setTypeM_DaiB() { m3138 = 6; } void setTypeShipRide() { m3138 = 7; } + s16 getHead_x() { return mJntCtrl.getHead_x(); } + s16 getHead_y() { return mJntCtrl.getHead_y(); } + s16 getBackbone_x() { return mJntCtrl.getBackbone_x(); } + s16 getBackbone_y() { return mJntCtrl.getBackbone_y(); } + s16 getWaistRotX() { return m3114; } + s16 getWaistRotY() { return m3116; } + + s8 getArmRJntNum() { return m_armR_jnt_num; } + s8 getArmRlocJntNum() { return m_armRloc_jnt_num; } + s8 getArmLJntNum() { return m_armL_jnt_num; } + s8 getArmLlocJntNum() { return m_armLloc_jnt_num; } + + J3DModel* getModel() { return mpMorf->getModel(); } + cXyz& getAttentionBasePos() { return m3094; } + cXyz& getEyePos() { return m3088; } + void getPHairDist(int) {} + void getPHairPos(int) {} + void getPHairVec(int) {} + cXyz* getPHairWall() { return m3234; } + + void incAttnSetCount() { + if (m312B != 0xFF) { + m312B++; + } + } + void calcFlyingTimer() {} void checkBitEffectStatus(u8) {} void checkBitHairMode(u8) {} @@ -231,28 +260,10 @@ public: void clearStatus() {} void clearStatus(u32) {} void countPiyo2TalkCNT() {} - void getArmLJntNum() {} - void getArmLlocJntNum() {} - void getArmRJntNum() {} - void getArmRlocJntNum() {} - void getAttentionBasePos() {} - void getBackbone_x() {} - void getBackbone_y() {} - void getEyePos() {} void getFlyingTimer() {} void getHairJntNum(int) {} - void getHead_x() {} - void getHead_y() {} - void getModel() {} - void getPHairDist(int) {} - void getPHairPos(int) {} - void getPHairVec(int) {} - void getPHairWall() {} void getPiyo2TalkCNT() {} void getTalkType() {} - void getWaistRotX() {} - void getWaistRotY() {} - void incAttnSetCount() {} void isLightBodyHit() {} void isLightHit() {} void isMirror() {} @@ -267,7 +278,6 @@ public: void isTypeM_Dra09() {} void isTypeSea() {} void isTypeShipRide() {} - void isXYTalk() {} void noCarryAction() {} void offBitCamTagIn() {} void offFlying() {} @@ -278,7 +288,6 @@ public: void offPlayerRoom() {} void offSeaTalk() {} void offShipRide() {} - void offXYTalk() {} void onBitCamTagIn() {} void onFlying() {} void onLightBodyHit() {} @@ -287,7 +296,6 @@ public: void onPlayerRoom() {} void onSeaTalk() {} void onShipRide() {} - void onXYTalk() {} void setBitEffectStatus(u8) {} void setBitHairMode(u8) {} void setBitStatus(u32) {} @@ -311,8 +319,8 @@ public: void setNpcAction(ActionFunc, void*); void playerAction(void*); void setPlayerAction(ActionFunc, void*); - void getStickAngY(int); - void calcStickPos(s16, cXyz*); + s16 getStickAngY(int); + int calcStickPos(s16, cXyz*); BOOL flyCheck(); bool mirrorCancelCheck(); void setWingEmitter(); @@ -322,113 +330,113 @@ public: void deleteHane03Emitter(); void returnLinkPlayer(); void shipRideCheck(); - void isFallAction(); + BOOL isFallAction(); void returnLinkCheck(); void lightHitCheck(); - void wallHitCheck(); + int wallHitCheck(); void NpcCall(int*); void checkCollision(int); void restartPoint(s16); void setMessageAnimation(u8); void waitGroundCheck(); void chkAdanmaeDemoOrder(); - int waitNpcAction(void*); - int harpWaitNpcAction(void*); - void XYTalkCheck(); - int talkNpcAction(void*); - int shipTalkNpcAction(void*); - int kyohiNpcAction(void*); - int shipNpcAction(void*); - int mwaitNpcAction(void*); - int squatdownNpcAction(void*); - int sqwait01NpcAction(void*); + BOOL waitNpcAction(void*); + BOOL harpWaitNpcAction(void*); + BOOL XYTalkCheck(); + BOOL talkNpcAction(void*); + BOOL shipTalkNpcAction(void*); + BOOL kyohiNpcAction(void*); + BOOL shipNpcAction(void*); + BOOL mwaitNpcAction(void*); + BOOL squatdownNpcAction(void*); + BOOL sqwait01NpcAction(void*); void changeCaught02(); - int carryNpcAction(void*); - int throwNpcAction(void*); - int glidingNpcAction(void*); + BOOL carryNpcAction(void*); + BOOL throwNpcAction(void*); + BOOL glidingNpcAction(void*); void windProc(); - int fallNpcAction(void*); - int fall02NpcAction(void*); - int wallHitNpcAction(void*); - int land01NpcAction(void*); - int land02NpcAction(void*); - int land03NpcAction(void*); - int piyo2NpcAction(void*); - int deleteNpcAction(void*); - int demoFlyNpcAction(void*); + BOOL fallNpcAction(void*); + BOOL fall02NpcAction(void*); + BOOL wallHitNpcAction(void*); + BOOL land01NpcAction(void*); + BOOL land02NpcAction(void*); + BOOL land03NpcAction(void*); + BOOL piyo2NpcAction(void*); + BOOL deleteNpcAction(void*); + BOOL demoFlyNpcAction(void*); void routeAngCheck(cXyz&, s16*); void routeWallCheck(cXyz&, cXyz&, s16*); void checkForwardGroundY(s16); void checkWallJump(s16); void routeCheck(f32, s16*); - int searchNpcAction(void*); - int hitNpcAction(void*); + BOOL searchNpcAction(void*); + BOOL hitNpcAction(void*); void setNormalSpeedF(f32, f32, f32, f32, f32); void setSpeedAndAngleNormal(f32, s16); void walkProc(f32, s16); - int jumpNpcAction(void*); - int escapeNpcAction(void*); - int waitPlayerAction(void*); - int walkPlayerAction(void*); - int hitPlayerAction(void*); - int jumpPlayerAction(void*); - int flyPlayerAction(void*); - int landPlayerAction(void*); - int mkamaePlayerAction(void*); - int carryPlayerAction(void*); + BOOL jumpNpcAction(void*); + BOOL escapeNpcAction(void*); + BOOL waitPlayerAction(void*); + BOOL walkPlayerAction(void*); + BOOL hitPlayerAction(void*); + BOOL jumpPlayerAction(void*); + BOOL flyPlayerAction(void*); + BOOL landPlayerAction(void*); + BOOL mkamaePlayerAction(void*); + BOOL carryPlayerAction(void*); void eventProc(); void initialDefault(int); - void actionDefault(int); + bool actionDefault(int); void initialWaitEvent(int); - void actionWaitEvent(int); + bool actionWaitEvent(int); void initialLetterEvent(int); void initialMsgSetEvent(int); - void actionMsgSetEvent(int); - void actionMsgEndEvent(int); + bool actionMsgSetEvent(int); + BOOL actionMsgEndEvent(int); void initialMovePosEvent(int); void initialFlyEvent(int); - void actionFlyEvent(int); + bool actionFlyEvent(int); void initialGlidingEvent(int); - void actionGlidingEvent(int); + bool actionGlidingEvent(int); void initialLandingEvent(int); - void actionLandingEvent(int); + bool actionLandingEvent(int); void initialWalkEvent(int); - void actionWalkEvent(int); - void actionDashEvent(int); + bool actionWalkEvent(int); + bool actionDashEvent(int); void initialEndEvent(int); - void actionTactEvent(int); + bool actionTactEvent(int); void initialTakeOffEvent(int); - void actionTakeOffEvent(int); + bool actionTakeOffEvent(int); void initialOnetimeEvent(int); - void actionOnetimeEvent(int); + bool actionOnetimeEvent(int); void initialQuake(int); void setHarpPlayNum(int); void initialHarpPlayEvent(int); - void actionHarpPlayEvent(int); + bool actionHarpPlayEvent(int); void initialOffLinkEvent(int); void initialOnLinkEvent(int); void initialTurnEvent(int); - void actionTurnEvent(int); + bool actionTurnEvent(int); void initialSetAnmEvent(int); void initialLookDown(int); void initialLookUp(int); - void actionLookDown(int); - void talk_init(); - void talk(int); + bool actionLookDown(int); + bool talk_init(); + BOOL talk(int); void getAnmType(u8); BOOL initTexPatternAnm(u8, bool); void playTexPatternAnm(); BOOL initLightBtkAnm(bool); void playLightBtkAnm(); - void setAnm(int); - void dNpc_Md_setAnm(mDoExt_McaMorf2*, f32, int, f32, f32, char*, char*, const char*); - void dNpc_Md_setAnm(mDoExt_McaMorf*, int, f32, f32, char*, const char*); + 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*); void chkAttention(cXyz, s16, int); void chkArea(cXyz*); void carryCheck(); void eventOrder(); void checkOrder(); - void checkCommandTalk(); + bool checkCommandTalk(); void next_msgStatus(u32*); void getMsg(); void setCollision(); @@ -487,18 +495,28 @@ public: /* 0x304C */ daPy_mtxFollowEcallBack_c m304C; /* 0x3058 */ daNpc_Md_followEcallBack_c m3058; /* 0x3074 */ dPa_rippleEcallBack m3074; - /* 0x3088 */ u8 m3088[0x30A0 - 0x3088]; + /* 0x3088 */ cXyz m3088; + /* 0x3094 */ cXyz m3094; /* 0x30A0 */ cXyz m30A0; - /* 0x30AC */ u8 m30AC[0x30D4 - 0x30AC]; + /* 0x30AC */ u8 m30AC[0x30D0 - 0x30AC]; + /* 0x30D0 */ f32 m30D0; /* 0x30D4 */ ActionFunc mCurrPlayerActionFunc; /* 0x30E0 */ ActionFunc mCurrNpcActionFunc; - /* 0x30EC */ int mMsgId; + /* 0x30EC */ u32 mMsgId; /* 0x30F0 */ u32 m30F0; /* 0x30F4 */ u8 m30F4[0x30F8 - 0x30F4]; /* 0x30F8 */ f32 m30F8; - /* 0x30FC */ u8 m30FC[0x3104 - 0x30FC]; + /* 0x30FC */ f32 m30FC; + /* 0x3100 */ u8 m3100[0x3104 - 0x3100]; /* 0x3104 */ int m3104; - /* 0x3108 */ u8 m3108[0x311C - 0x3108]; + /* 0x3108 */ f32 m3108; + /* 0x310C */ f32 m310C; + /* 0x3110 */ s16 m3110; + /* 0x3112 */ s16 m3112; + /* 0x3114 */ s16 m3114; + /* 0x3116 */ s16 m3116; + /* 0x3118 */ s16 m3118; + /* 0x311A */ s16 m311A; /* 0x311C */ s8 m_backbone1_jnt_num; /* 0x311D */ s8 m_backbone2_jnt_num; /* 0x311E */ s8 m_armR_jnt_num; @@ -513,15 +531,16 @@ public: /* 0x3127 */ s8 m_wingR3_jnt_num; /* 0x3128 */ s8 m_wingL3_jnt_num; /* 0x3129 */ s8 m_handL_jnt_num; - /* 0x312A */ u8 m312A; - /* 0x312B */ u8 m312B[0x312C - 0x312B]; + /* 0x312A */ s8 m312A; + /* 0x312B */ u8 m312B; /* 0x312C */ u8 m312C; - /* 0x312D */ u8 m312D[0x312E - 0x312D]; - /* 0x312E */ u8 mCurEventMode; + /* 0x312D */ s8 m312D; + /* 0x312E */ s8 mCurEventMode; /* 0x312F */ u8 m312F[0x3131 - 0x312F]; /* 0x3131 */ u8 m3131; /* 0x3132 */ s8 mActionStatus; - /* 0x3133 */ u8 m3133[0x3138 - 0x3133]; + /* 0x3133 */ u8 m3133[0x3137 - 0x3133]; + /* 0x3137 */ u8 m3137; /* 0x3138 */ u8 m3138; /* 0x3139 */ u8 mCurEvent; /* 0x313A */ u8 m313A; diff --git a/include/d/d_attention.h b/include/d/d_attention.h index 0c66ecc35..24f3a83bf 100644 --- a/include/d/d_attention.h +++ b/include/d/d_attention.h @@ -163,11 +163,31 @@ public: fopAc_ac_c* Owner() { return (fopAc_ac_c*)mpPlayer; } + BOOL chkFlag(u32 flag) { return (mFlags & flag) ? TRUE : FALSE; } + void setFlag(u32 flag) { mFlags |= flag; } + void clrFlag(u32 flag) { mFlags &= ~flag; } + bool Lockon() { return LockonTruth() || chkFlag(0x20000000); } void CatchRequest(fopAc_ac_c* param_0, u8 param_1, f32 param_2, f32 param_3, - f32 param_4, s16 param_5, s32 param_6) { + f32 param_4, s16 param_5, int param_6) { mCatch.request(param_0, param_1, param_2, param_3, param_4, param_5, param_6); } + // TODO: + void GetLockonCount() {} + void LockEdge() {} + void changeOwner() {} + void chkEnemySound() {} + void getCatchChgItem() {} + void getCatghTarget() {} + void getLookTarget() {} + void getLook2Target() {} + void getZHintTarget() {} + void offAleart() {} + void revivalAleart() {} + void LookRequest(fopAc_ac_c*, f32, f32, f32, s16, int) {} + void Look2RequestF(fopAc_ac_c*, s16, int) {} + void ZHintRequest(fopAc_ac_c*, int) {} + public: /* 0x000 */ daPy_lk_c* mpPlayer; /* 0x004 */ int mLockOnTargetBsPcID; diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 116eb1a30..5a1387cbf 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -73,10 +73,10 @@ public: s8 getBackboneJntNum() { return mBackboneJntNum; } void setHeadJntNum(s8 jnt) { mHeadJntNum = jnt; } void setBackboneJntNum(s8 jnt) { mBackboneJntNum = jnt; } - int getHead_x() { return mAngles[0][0]; } - int getHead_y() { return mAngles[0][1]; } - int getBackbone_x() { return mAngles[1][0]; } - int getBackbone_y() { return mAngles[1][1]; } + s16 getHead_x() { return mAngles[0][0]; } + s16 getHead_y() { return mAngles[0][1]; } + s16 getBackbone_x() { return mAngles[1][0]; } + s16 getBackbone_y() { return mAngles[1][1]; } void setHead_x(s16 angle) { mAngles[0][0] = angle; } void setHead_y(s16 angle) { mAngles[0][1] = angle; } void setBackBone_x(s16 angle) { mAngles[1][0] = angle; } diff --git a/include/f_op/f_op_msg_mng.h b/include/f_op/f_op_msg_mng.h index 470795e30..c6e21e543 100644 --- a/include/f_op/f_op_msg_mng.h +++ b/include/f_op/f_op_msg_mng.h @@ -90,5 +90,6 @@ void fopMsgM_cposMove(fopMsgM_pane_class*); u32 fopMsgM_searchMessageNumber(u32); void fopMsgM_messageSendOn(); +u32 fopMsgM_tactMessageSet(); #endif diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index b414a5fc8..13ca30b17 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -374,6 +374,7 @@ public: BOOL checkFrame(f32 frame) { return mFrameCtrl.checkPass(frame); } + void isMorf() {} // TODO /* 0x50 */ J3DModel* mpModel; /* 0x54 */ J3DAnmTransform* mpAnm; @@ -407,6 +408,30 @@ public: void stopZelAnime(); J3DModel* getModel() { return mpModel; } + u8 getPlayMode() { return mFrameCtrl.getAttribute(); } + void setPlayMode(int mode) { mFrameCtrl.setAttribute(mode); } + f32 getStartFrame() { return mFrameCtrl.getStart(); } + void setStartFrame(f32 frame) { mFrameCtrl.setStart(frame); } + f32 getEndFrame() { return mFrameCtrl.getEnd(); } + void setEndFrame(f32 frame) { mFrameCtrl.setEnd(frame); } + f32 getLoopFrame() { return mFrameCtrl.getLoop(); } + void setLoopFrame(f32 frame) { mFrameCtrl.setLoop(frame); } + f32 getPlaySpeed() { return mFrameCtrl.getRate(); } + void setPlaySpeed(f32 speed) { mFrameCtrl.setRate(speed); } + f32 getFrame() { return mFrameCtrl.getFrame(); } + void setFrame(f32 frame) { mFrameCtrl.setFrame((s16)frame); } + BOOL isStop() { //regswap somewhere here + bool stopped = true; + if (!mFrameCtrl.checkState(J3DFrameCtrl::STATE_STOP_E) && mFrameCtrl.getRate() != 0.0f) { + stopped = false; + } + return stopped; + } + BOOL checkFrame(f32 frame) { + return mFrameCtrl.checkPass(frame); + } + BOOL isMorf() { return field_0x78 < 1.0f; } + void setAnmRate(f32) {} // TODO /* 0x50 */ J3DModel* mpModel; /* 0x54 */ J3DAnmTransform* field_0x54; diff --git a/src/d/actor/d_a_npc_kamome.cpp b/src/d/actor/d_a_npc_kamome.cpp index dcf901abd..13793607c 100644 --- a/src/d/actor/d_a_npc_kamome.cpp +++ b/src/d/actor/d_a_npc_kamome.cpp @@ -27,8 +27,8 @@ static char* l_staff_name = "HyoiKam"; static u8 temp[0x4C]; // TODO static daNpc_kam_HIO_c l_HIO; static int l_hio_counter; -static int l_msgId; -static int l_msg; +static u32 l_msgId; +static msg_class* l_msg; static daNpc_kam_c* l_act; static s16 l_demo_start_chk_cnt; static s16 l_demo_start_chk_flag; diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index 2f1e21d57..d66db06a9 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -10,6 +10,7 @@ #include "d/d_item_data.h" #include "m_Do/m_Do_controller_pad.h" #include "m_Do/m_Do_mtx.h" +#include "d/actor/d_a_player_main.h" // Needed for the .data section to match. static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; @@ -17,8 +18,13 @@ static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; static f64 dummy4[2] = {3.0, 0.5}; +static u8 temp[0x4C]; // TODO + static daNpc_Md_HIO_c l_HIO; +static cXyz l_ms_light_local_vec; +static cXyz l_ms_light_local_start; + static char* l_arc_name = "Md"; static char* l_arc_name_ship = "Md_ship"; static char* l_staff_name = "Md1"; @@ -467,17 +473,81 @@ s32 daNpc_Md_c::create() { /* 000012C0-00001444 .text nodeCallBack__FP7J3DNodei */ static BOOL nodeCallBack(J3DNode* node, int param_1) { - /* Nonmatching */ + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Md_c* i_this = (daNpc_Md_c*)model->getUserArea(); + 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()); + mDoMtx_stack_c::XrotM(i_this->getHead_y()); + mDoMtx_stack_c::ZrotM(-i_this->getHead_x()); + mDoMtx_stack_c::multVec(&l_offsetEyePos, &i_this->getEyePos()); + i_this->incAttnSetCount(); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + } + } + return TRUE; } +static Vec waistVecDat[4] = { + {40.0f, -10.0f, -30.0f}, + {40.0f, -10.0f, 30.0f}, + {-30.0f, -10.0f, -30.0f}, + {-30.0f, -10.0f, 30.0f}, +}; + /* 00001444-0000154C .text waistNodeCallBack__FP7J3DNodei */ static BOOL waistNodeCallBack(J3DNode* node, int param_1) { - /* Nonmatching */ + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + 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)); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + if (cLib_checkBit(i_this->m30F0, 0x4000UL)) { + mDoMtx_stack_c::XrotM(i_this->getWaistRotY()); + mDoMtx_stack_c::ZrotM(i_this->getWaistRotX()); + } else { + mDoMtx_stack_c::XrotM(i_this->getBackbone_y()); + mDoMtx_stack_c::ZrotM(-i_this->getBackbone_x()); + } + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + } + } + return TRUE; } /* 0000154C-0000160C .text armNodeCallBack__FP7J3DNodei */ static BOOL armNodeCallBack(J3DNode* node, int param_1) { - /* Nonmatching */ + // This handles copying the matrices of Medli's arms and wings from the body model to the + // separate arm/wing models. + if (!param_1) { + J3DModel* armModel = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Md_c* i_this = (daNpc_Md_c*)armModel->getUserArea(); + if (i_this) { + s32 armJntNo = joint->getJntNo(); + s32 bodyJntNo; + if (armJntNo == i_this->getArmRlocJntNum()) { + bodyJntNo = i_this->getArmRJntNum(); + } else if (armJntNo == i_this->getArmLlocJntNum()) { + bodyJntNo = i_this->getArmLJntNum(); + } + J3DModel* bodyModel = i_this->getModel(); + cMtx_copy(bodyModel->getAnmMtx(bodyJntNo), J3DSys::mCurrentMtx); + armModel->setAnmMtx(armJntNo, bodyModel->getAnmMtx(bodyJntNo)); + } + } + return TRUE; } /* 0000160C-00001C60 .text hairCross__FP4cXyzP4cXyzP4cXyz */ @@ -562,9 +632,9 @@ BOOL daNpc_Md_c::createHeap() { m_neck_jnt_num = modelData->getJointName()->getIndex("neck"); JUT_ASSERT(2025, m_neck_jnt_num >= 0); - s16 neck_jnt_num = modelData->getJointName()->getIndex("neck"); - if (neck_jnt_num >= 0) { - modelData->getJointNodePointer(neck_jnt_num)->setCallBack(nodeCallBack); + 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]); @@ -580,7 +650,7 @@ BOOL daNpc_Md_c::createHeap() { mpMorf->getModel()->setUserArea((u32)this); - modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "md.bdl"); + modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "mdarm.bdl"); JUT_ASSERT(2051, modelData != 0); mpArmMorf = new mDoExt_McaMorf2( @@ -645,7 +715,7 @@ BOOL daNpc_Md_c::createHeap() { mpWingMorf->getModel()->setUserArea((u32)this); } - modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "mdharp.bdl"); + modelData = (J3DModelData*)dComIfG_getObjectRes(mModelArcName, "md_harp.bdl"); mpHarpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); if (!mpHarpModel) { return FALSE; @@ -756,12 +826,12 @@ void daNpc_Md_c::setPlayerAction(ActionFunc actionFunc, void* arg) { } /* 000033C4-00003430 .text getStickAngY__10daNpc_Md_cFi */ -void daNpc_Md_c::getStickAngY(int) { +s16 daNpc_Md_c::getStickAngY(int) { /* Nonmatching */ } /* 00003430-00003588 .text calcStickPos__10daNpc_Md_cFsP4cXyz */ -void daNpc_Md_c::calcStickPos(s16, cXyz*) { +int daNpc_Md_c::calcStickPos(s16, cXyz*) { /* Nonmatching */ } @@ -819,8 +889,8 @@ void daNpc_Md_c::shipRideCheck() { } /* 00003824-00003908 .text isFallAction__10daNpc_Md_cFv */ -void daNpc_Md_c::isFallAction() { - /* Nonmatching */ +BOOL daNpc_Md_c::isFallAction() { + return chkPlayerAction(jumpPlayerAction) || chkNpcAction(fallNpcAction) || chkNpcAction(fall02NpcAction); } /* 00003908-00003958 .text returnLinkCheck__10daNpc_Md_cFv */ @@ -834,8 +904,15 @@ void daNpc_Md_c::lightHitCheck() { } /* 00003D20-00003D68 .text wallHitCheck__10daNpc_Md_cFv */ -void daNpc_Md_c::wallHitCheck() { - /* Nonmatching */ +int daNpc_Md_c::wallHitCheck() { + if (mAcch.ChkWallHit()) { + for (int i = 0; i < ARRAY_SIZE(mAcchCir); i++) { + if (mAcchCir[i].ChkWallHit()) { + return i; + } + } + } + return -1; } /* 00003D68-00003E74 .text NpcCall__10daNpc_Md_cFPi */ @@ -874,72 +951,80 @@ void daNpc_Md_c::chkAdanmaeDemoOrder() { } /* 000043D4-00004B04 .text waitNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::waitNpcAction(void*) { +BOOL daNpc_Md_c::waitNpcAction(void*) { /* Nonmatching */ } /* 00004B04-00004CFC .text harpWaitNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::harpWaitNpcAction(void*) { +BOOL daNpc_Md_c::harpWaitNpcAction(void*) { /* Nonmatching */ } +static u32 l_msgId; +static msg_class* l_msg; + /* 00004CFC-00004D40 .text XYTalkCheck__10daNpc_Md_cFv */ -void daNpc_Md_c::XYTalkCheck() { - /* Nonmatching */ +BOOL daNpc_Md_c::XYTalkCheck() { + BOOL ret = TRUE; + if (isXYTalk()) { + ret = dComIfGp_evmng_ChkPresentEnd(); + } + return ret; } /* 00004D40-0000504C .text talkNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::talkNpcAction(void*) { +BOOL daNpc_Md_c::talkNpcAction(void*) { /* Nonmatching */ } /* 0000504C-000051FC .text shipTalkNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::shipTalkNpcAction(void*) { +BOOL daNpc_Md_c::shipTalkNpcAction(void*) { /* Nonmatching */ } /* 000051FC-00005308 .text kyohiNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::kyohiNpcAction(void*) { +BOOL daNpc_Md_c::kyohiNpcAction(void*) { /* Nonmatching */ } /* 00005308-00005534 .text shipNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::shipNpcAction(void*) { +BOOL daNpc_Md_c::shipNpcAction(void*) { /* Nonmatching */ } /* 00005534-000057B0 .text mwaitNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::mwaitNpcAction(void*) { +BOOL daNpc_Md_c::mwaitNpcAction(void*) { /* Nonmatching */ } /* 000057B0-000058E0 .text squatdownNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::squatdownNpcAction(void*) { +BOOL daNpc_Md_c::squatdownNpcAction(void*) { /* Nonmatching */ } /* 000058E0-00005A74 .text sqwait01NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::sqwait01NpcAction(void*) { +BOOL daNpc_Md_c::sqwait01NpcAction(void*) { /* Nonmatching */ } /* 00005A74-00005AB0 .text changeCaught02__10daNpc_Md_cFv */ void daNpc_Md_c::changeCaught02() { - /* Nonmatching */ + setAnm(0x25); + cLib_onBit(m30F0, 0x01UL); } /* 00005AB0-000061A8 .text carryNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::carryNpcAction(void*) { +BOOL daNpc_Md_c::carryNpcAction(void*) { /* Nonmatching */ } /* 000061A8-00006450 .text throwNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::throwNpcAction(void*) { +BOOL daNpc_Md_c::throwNpcAction(void*) { /* Nonmatching */ } /* 00006450-00006764 .text glidingNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::glidingNpcAction(void*) { +BOOL daNpc_Md_c::glidingNpcAction(void*) { /* Nonmatching */ } @@ -949,42 +1034,42 @@ void daNpc_Md_c::windProc() { } /* 00006B24-00006C80 .text fallNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::fallNpcAction(void*) { +BOOL daNpc_Md_c::fallNpcAction(void*) { /* Nonmatching */ } /* 00006C80-00006F70 .text fall02NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::fall02NpcAction(void*) { +BOOL daNpc_Md_c::fall02NpcAction(void*) { /* Nonmatching */ } /* 00006F70-000071E4 .text wallHitNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::wallHitNpcAction(void*) { +BOOL daNpc_Md_c::wallHitNpcAction(void*) { /* Nonmatching */ } /* 000071E4-000073BC .text land01NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::land01NpcAction(void*) { +BOOL daNpc_Md_c::land01NpcAction(void*) { /* Nonmatching */ } /* 000073BC-000074C0 .text land02NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::land02NpcAction(void*) { +BOOL daNpc_Md_c::land02NpcAction(void*) { /* Nonmatching */ } /* 000074C0-000075C4 .text land03NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::land03NpcAction(void*) { +BOOL daNpc_Md_c::land03NpcAction(void*) { /* Nonmatching */ } /* 000075C4-00007824 .text piyo2NpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::piyo2NpcAction(void*) { +BOOL daNpc_Md_c::piyo2NpcAction(void*) { /* Nonmatching */ } /* 00007824-0000786C .text deleteNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::deleteNpcAction(void*) { +BOOL daNpc_Md_c::deleteNpcAction(void*) { if (mActionStatus == ACTION_STARTING) { mActionStatus++; // ACTION_ONGOING } else if (mActionStatus != ACTION_ENDING) { @@ -994,7 +1079,7 @@ int daNpc_Md_c::deleteNpcAction(void*) { } /* 0000786C-00007A98 .text demoFlyNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::demoFlyNpcAction(void*) { +BOOL daNpc_Md_c::demoFlyNpcAction(void*) { /* Nonmatching */ } @@ -1024,12 +1109,12 @@ void daNpc_Md_c::routeCheck(f32, s16*) { } /* 00008858-00008CEC .text searchNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::searchNpcAction(void*) { +BOOL daNpc_Md_c::searchNpcAction(void*) { /* Nonmatching */ } /* 00008CEC-00008E54 .text hitNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::hitNpcAction(void*) { +BOOL daNpc_Md_c::hitNpcAction(void*) { /* Nonmatching */ } @@ -1049,52 +1134,96 @@ void daNpc_Md_c::walkProc(f32, s16) { } /* 00009180-000092E0 .text jumpNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::jumpNpcAction(void*) { +BOOL daNpc_Md_c::jumpNpcAction(void*) { /* Nonmatching */ } /* 000092E0-000095C8 .text escapeNpcAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::escapeNpcAction(void*) { +BOOL daNpc_Md_c::escapeNpcAction(void*) { /* Nonmatching */ } /* 000095C8-00009894 .text waitPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::waitPlayerAction(void*) { - /* Nonmatching */ +BOOL daNpc_Md_c::waitPlayerAction(void*) { + if (mActionStatus == ACTION_STARTING) { + cLib_offBit(m30F0, 0x10UL | 0x02UL | 0x01UL); // TODO + cLib_onBit(m30F0, 0x04UL); // TODO + setAnm(0); + speedF = 0.0f; + mAcchCir[1].SetWall(60.0f, 20.0f); + m311A = 0; + m310C = 0.0f; + m3114 = 0; + m3116 = 0; + mActionStatus += 1; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING && !flyCheck()) { + dAttention_c& attention = dComIfGp_getAttention(); + if (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.m104 || attention.Lockon()) { + s16 stickAngle = getStickAngY(0); + cLib_addCalcAngleS(¤t.angle.y, stickAngle, l_HIO.m008.m26, l_HIO.m008.m28, l_HIO.m008.m2A); + cXyz stickPos; + int temp = calcStickPos(stickAngle, &stickPos); + if (temp == 0) { + shape_angle.y = current.angle.y; + } else if (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.m108) { + shape_angle.y = current.angle.y; + } + s16 tempAngle = shape_angle.y; + mJntCtrl.lookAtTarget(&tempAngle, &stickPos, current.pos, shape_angle.y, l_HIO.mNpc.m18, false); + if (temp > 0) { + shape_angle.y = tempAngle; + } + current.angle.y = shape_angle.y; + if (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.m108) { + if (temp == 0) { + current.angle.y = stickAngle; + setPlayerAction(walkPlayerAction, NULL); + } + } + } else { + mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false); + waitGroundCheck(); + current.angle.y = shape_angle.y; + } + + setAttention(mpMorf->isMorf()); + } + + return TRUE; } /* 00009894-00009B08 .text walkPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::walkPlayerAction(void*) { +BOOL daNpc_Md_c::walkPlayerAction(void*) { /* Nonmatching */ } /* 00009B08-00009CCC .text hitPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::hitPlayerAction(void*) { +BOOL daNpc_Md_c::hitPlayerAction(void*) { /* Nonmatching */ } /* 00009CCC-00009E7C .text jumpPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::jumpPlayerAction(void*) { +BOOL daNpc_Md_c::jumpPlayerAction(void*) { /* Nonmatching */ } /* 00009E7C-0000A534 .text flyPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::flyPlayerAction(void*) { +BOOL daNpc_Md_c::flyPlayerAction(void*) { /* Nonmatching */ } /* 0000A534-0000A698 .text landPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::landPlayerAction(void*) { +BOOL daNpc_Md_c::landPlayerAction(void*) { /* Nonmatching */ } /* 0000A698-0000A8D0 .text mkamaePlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::mkamaePlayerAction(void*) { +BOOL daNpc_Md_c::mkamaePlayerAction(void*) { /* Nonmatching */ } /* 0000A8D0-0000A9BC .text carryPlayerAction__10daNpc_Md_cFPv */ -int daNpc_Md_c::carryPlayerAction(void*) { +BOOL daNpc_Md_c::carryPlayerAction(void*) { /* Nonmatching */ } @@ -1108,8 +1237,9 @@ void daNpc_Md_c::initialDefault(int) { } /* 0000AC84-0000ACB4 .text actionDefault__10daNpc_Md_cFi */ -void daNpc_Md_c::actionDefault(int) { - /* Nonmatching */ +bool daNpc_Md_c::actionDefault(int) { + lookBack(0, 0, 1); + return TRUE; } /* 0000ACB4-0000AD9C .text initialWaitEvent__10daNpc_Md_cFi */ @@ -1118,8 +1248,8 @@ void daNpc_Md_c::initialWaitEvent(int) { } /* 0000AD9C-0000ADCC .text actionWaitEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionWaitEvent(int) { - /* Nonmatching */ +bool daNpc_Md_c::actionWaitEvent(int) { + return cLib_calcTimer(&m3118) == 0; } /* 0000ADCC-0000AEB8 .text initialLetterEvent__10daNpc_Md_cFi */ @@ -1133,13 +1263,21 @@ void daNpc_Md_c::initialMsgSetEvent(int) { } /* 0000AFB0-0000AFFC .text actionMsgSetEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionMsgSetEvent(int) { - /* Nonmatching */ +bool daNpc_Md_c::actionMsgSetEvent(int) { + lookBack(1, 0, 0); + setAttention(true); + return talk_init(); } /* 0000AFFC-0000B070 .text actionMsgEndEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionMsgEndEvent(int) { - /* Nonmatching */ +BOOL daNpc_Md_c::actionMsgEndEvent(int param_1) { + BOOL ret = talk(0); + if (ret) { + initialEndEvent(param_1); + } + lookBack(1, 0, 0); + setAttention(true); + return ret; } /* 0000B070-0000B728 .text initialMovePosEvent__10daNpc_Md_cFi */ @@ -1153,7 +1291,7 @@ void daNpc_Md_c::initialFlyEvent(int) { } /* 0000B79C-0000B870 .text actionFlyEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionFlyEvent(int) { +bool daNpc_Md_c::actionFlyEvent(int) { /* Nonmatching */ } @@ -1163,7 +1301,7 @@ void daNpc_Md_c::initialGlidingEvent(int) { } /* 0000B890-0000B934 .text actionGlidingEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionGlidingEvent(int) { +bool daNpc_Md_c::actionGlidingEvent(int) { /* Nonmatching */ } @@ -1173,22 +1311,23 @@ void daNpc_Md_c::initialLandingEvent(int) { } /* 0000B99C-0000B9E0 .text actionLandingEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionLandingEvent(int) { +bool daNpc_Md_c::actionLandingEvent(int) { /* Nonmatching */ } /* 0000B9E0-0000B9F8 .text initialWalkEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialWalkEvent(int) { - /* Nonmatching */ + speedF = 0.0f; + m3118 = 20*30; } /* 0000B9F8-0000BCC4 .text actionWalkEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionWalkEvent(int) { +bool daNpc_Md_c::actionWalkEvent(int) { /* Nonmatching */ } /* 0000BCC4-0000BF1C .text actionDashEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionDashEvent(int) { +bool daNpc_Md_c::actionDashEvent(int) { /* Nonmatching */ } @@ -1198,18 +1337,23 @@ void daNpc_Md_c::initialEndEvent(int) { } /* 0000C12C-0000C250 .text actionTactEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionTactEvent(int) { +bool daNpc_Md_c::actionTactEvent(int) { /* Nonmatching */ } /* 0000C250-0000C288 .text initialTakeOffEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialTakeOffEvent(int) { - /* Nonmatching */ + setAnm(0x18); + m312A = 0; } /* 0000C288-0000C2C4 .text actionTakeOffEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionTakeOffEvent(int) { - /* Nonmatching */ +bool daNpc_Md_c::actionTakeOffEvent(int) { + if (m312A != 0) { + return TRUE; + } + setAttention(true); + return FALSE; } /* 0000C2C4-0000C360 .text initialOnetimeEvent__10daNpc_Md_cFi */ @@ -1218,7 +1362,7 @@ void daNpc_Md_c::initialOnetimeEvent(int) { } /* 0000C360-0000C3C4 .text actionOnetimeEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionOnetimeEvent(int) { +bool daNpc_Md_c::actionOnetimeEvent(int) { /* Nonmatching */ } @@ -1234,22 +1378,28 @@ void daNpc_Md_c::setHarpPlayNum(int) { /* 0000C4DC-0000C500 .text initialHarpPlayEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialHarpPlayEvent(int) { - /* Nonmatching */ + setHarpPlayNum(0); } /* 0000C500-0000C554 .text actionHarpPlayEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionHarpPlayEvent(int) { - /* Nonmatching */ +bool daNpc_Md_c::actionHarpPlayEvent(int) { + if (m312A != 0) { + setHarpPlayNum(0); + } + if (daPy_getPlayerLinkActorClass()->checkEndTactMusic()) { + return true; + } + return false; } /* 0000C554-0000C570 .text initialOffLinkEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialOffLinkEvent(int) { - /* Nonmatching */ + daPy_getPlayerLinkActorClass()->onPlayerNoDraw(); } /* 0000C570-0000C58C .text initialOnLinkEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialOnLinkEvent(int) { - /* Nonmatching */ + daPy_getPlayerLinkActorClass()->offPlayerNoDraw(); } /* 0000C58C-0000C654 .text initialTurnEvent__10daNpc_Md_cFi */ @@ -1258,7 +1408,7 @@ void daNpc_Md_c::initialTurnEvent(int) { } /* 0000C654-0000C7CC .text actionTurnEvent__10daNpc_Md_cFi */ -void daNpc_Md_c::actionTurnEvent(int) { +bool daNpc_Md_c::actionTurnEvent(int) { /* Nonmatching */ } @@ -1269,26 +1419,38 @@ void daNpc_Md_c::initialSetAnmEvent(int) { /* 0000CA5C-0000CA80 .text initialLookDown__10daNpc_Md_cFi */ void daNpc_Md_c::initialLookDown(int) { - /* Nonmatching */ + setAnm(0x2F); } /* 0000CA80-0000CAA4 .text initialLookUp__10daNpc_Md_cFi */ void daNpc_Md_c::initialLookUp(int) { - /* Nonmatching */ + setAnm(5); } /* 0000CAA4-0000CB8C .text actionLookDown__10daNpc_Md_cFi */ -void daNpc_Md_c::actionLookDown(int) { +bool daNpc_Md_c::actionLookDown(int) { /* Nonmatching */ } /* 0000CB8C-0000CC10 .text talk_init__10daNpc_Md_cFv */ -void daNpc_Md_c::talk_init() { - /* Nonmatching */ +bool daNpc_Md_c::talk_init() { + if (l_msgId == fpcM_ERROR_PROCESS_ID_e) { + if (mMsgId == 0x5AC) { + l_msgId = fopMsgM_tactMessageSet(); + } else { + l_msgId = fopMsgM_messageSet(mMsgId, this); + } + } else { + l_msg = fopMsgM_SearchByID(l_msgId); + if (l_msg) { + return true; + } + } + return false; } /* 0000CC10-0000CDCC .text talk__10daNpc_Md_cFi */ -void daNpc_Md_c::talk(int) { +BOOL daNpc_Md_c::talk(int) { /* Nonmatching */ } @@ -1318,18 +1480,128 @@ void daNpc_Md_c::playLightBtkAnm() { } /* 0000D0DC-0000D4CC .text setAnm__10daNpc_Md_cFi */ -void daNpc_Md_c::setAnm(int) { - /* Nonmatching */ +bool daNpc_Md_c::setAnm(int anmIdx) { + struct anm_tbl { + /* 0x00 */ char m00[0x20]; + /* 0x20 */ char m20[0x20]; + }; + struct anm_prm { + /* 0x00 */ s8 m00; + /* 0x01 */ u8 m01; + /* 0x02 */ u8 m02; + /* 0x04 */ int loopMode; + /* 0x08 */ f32 morf; + /* 0x0C */ f32 speed; + }; + + static anm_tbl l_anmTbl[0x27] = { + // TODO + }; + static anm_prm l_anmPrm[0x32] = { + // TODO + }; + static anm_tbl armAnmTbl[0x20] = { + // TODO + }; + static anm_tbl wingAnmTbl[8] = { + // TODO + }; + + bool ret = false; + + m3104 = anmIdx; + anm_prm* prm = &l_anmPrm[anmIdx]; + + f32 speed = prm->speed; + f32 morf = prm->morf; + if (anmIdx == 6) { + speed = l_HIO.m118; + } else if (anmIdx == 9 || anmIdx == 0xA) { + speed = l_HIO.m11C; + } else if (anmIdx == 0x2E) { + speed = l_HIO.m124; + } else if (anmIdx == 0x28) { + morf = l_HIO.m068.m4; + speed = l_HIO.m068.m8; + } + if (anmIdx == 7 || anmIdx == 8) { + morf = l_HIO.m1A8; + } + + if (prm->m00 != m312D || mpMorf->getPlaySpeed() != prm->speed) { + m312D = prm->m00; + anm_tbl* bodyAnm = &l_anmTbl[m312D]; + m312A = 0; + dNpc_Md_setAnm(mpMorf, m30FC, prm->loopMode, morf, speed, bodyAnm->m00, bodyAnm->m20, mModelArcName); + m30D0 = mpMorf->getFrame(); + + if (prm->m01 < 0x80) { + anm_tbl* armAnm = &armAnmTbl[prm->m01]; + dNpc_Md_setAnm(mpArmMorf, m30FC, prm->loopMode, morf, speed, armAnm->m00, armAnm->m20, mModelArcName); + ret = false; + } else { + if (m3138 != 7) { + dNpc_Md_setAnm(mpWingMorf, prm->loopMode, morf, speed, wingAnmTbl[prm->m01 - 0x80].m00, mModelArcName); + } + ret = true; + } + + if (m3104 == 0x12 || m3104 == 0x1F) { + fopAcM_seStartCurrent(this, JA_SE_CM_MD_HARP_SET_UP, 0); + } else if (m3104 == 0x13 || m3104 == 0x21) { + fopAcM_seStartCurrent(this, JA_SE_CM_MD_HARP_TAKE_OFF, 0); + } + } + + if (prm->m02 != m3137) { + initTexPatternAnm(prm->m02, true); + } + + if (m312D == 0x0E || m312D == 0x12 || m312D == 0x13 || m312D == 0x1A || m312D == 0x1C || m312D == 0x25) { + cLib_onBit(m30F0, 0x80UL); // TODO inline + } else if (m312D != 0x0F && m312D != 0x1B) { + cLib_offBit(m30F0, 0x80UL); // TODO inline + } + + if (m312D == 0x1B || m312D == 0x1C) { + cLib_onBit(m30F0, 0x4000UL); // TODO inline + } else { + cLib_offBit(m30F0, 0x4000UL); // TODO inline + } + + if (m312D == 0x10) { + if (m0508[1] == NULL) { + m0508[1] = dComIfGp_particle_set(0x819D, ¤t.pos, NULL, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0, &mTevStr.mColorK0); + if (m0508[1]) { + m0508[1]->becomeImmortalEmitter(); + } + } + } else { + deletePiyoPiyo(); + } + + return ret; } /* 0000D4CC-0000D5E4 .text dNpc_Md_setAnm__10daNpc_Md_cFP15mDoExt_McaMorf2fiffPcPcPCc */ -void daNpc_Md_c::dNpc_Md_setAnm(mDoExt_McaMorf2*, f32, int, f32, f32, char*, char*, const char*) { - /* Nonmatching */ +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; + if (pMorf) { + bck1 = (J3DAnmTransform*)dComIfG_getObjectRes(arcName, fileName1); + if (strcmp(filename2, "") != 0) { + bck2 = (J3DAnmTransform*)dComIfG_getObjectRes(arcName, filename2); + } + pMorf->setAnm(bck1, bck2, param_f1, loopMode, morf, speed, 0.0f, -1.0f, NULL); + ret = true; + } + return ret; } /* 0000D5E4-0000D614 .text dNpc_Md_setAnm__10daNpc_Md_cFP14mDoExt_McaMorfiffPcPCc */ -void daNpc_Md_c::dNpc_Md_setAnm(mDoExt_McaMorf*, int, f32, f32, char*, const char*) { - /* Nonmatching */ +bool daNpc_Md_c::dNpc_Md_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, const char* arcName) { + return dNpc_setAnmFNDirect(pMorf, loopMode, morf, speed, animFilename, NULL, arcName); } /* 0000D614-0000D82C .text chkAttention__10daNpc_Md_cF4cXyzsi */ @@ -1358,8 +1630,24 @@ void daNpc_Md_c::checkOrder() { } /* 0000DC14-0000DCB0 .text checkCommandTalk__10daNpc_Md_cFv */ -void daNpc_Md_c::checkCommandTalk() { - /* Nonmatching */ +bool daNpc_Md_c::checkCommandTalk() { + if (mEvtInfo.checkCommandTalk()) { + if (dComIfGp_event_chkTalkXY()) { + onXYTalk(); + if (!isDefaultTalkXY()) { + if (mCurEventMode == 3) { + mCurEventMode = 0; + } + return false; + } + } else { + offXYTalk(); + } + return true; + } else { + offXYTalk(); + return false; + } } /* 0000DCB0-0000E410 .text next_msgStatus__10daNpc_Md_cFPUl */ diff --git a/src/f_op/f_op_msg_mng.cpp b/src/f_op/f_op_msg_mng.cpp index bcf99ecdb..7d3137f75 100644 --- a/src/f_op/f_op_msg_mng.cpp +++ b/src/f_op/f_op_msg_mng.cpp @@ -164,7 +164,7 @@ void fopMsgM_scopeMessageSet(u32) { } /* 8002BA4C-8002BB78 .text fopMsgM_tactMessageSet__Fv */ -void fopMsgM_tactMessageSet() { +u32 fopMsgM_tactMessageSet() { /* Nonmatching */ }