diff --git a/include/d/actor/d_a_npc_moir.h b/include/d/actor/d_a_npc_moir.h index 775ab2c83f8..88f7cc5d087 100644 --- a/include/d/actor/d_a_npc_moir.h +++ b/include/d/actor/d_a_npc_moir.h @@ -29,6 +29,7 @@ public: class daNpcMoiR_c : public daNpcF_c { public: typedef bool (daNpcMoiR_c::*ActionFn)(void*); + typedef BOOL (daNpcMoiR_c::*Action2Fn)(void*); typedef BOOL (daNpcMoiR_c::*EventFn)(int); enum Animation { @@ -128,7 +129,7 @@ public: /* 0x2 */ MODE_2, }; - /* 80A7C16C */ daNpcMoiR_c() {} + /* 80A7C16C */ daNpcMoiR_c(); /* 80A7C380 */ ~daNpcMoiR_c(); /* 80A7C580 */ cPhs__Step Create(); /* 80A7C978 */ int CreateHeap(); @@ -138,8 +139,8 @@ public: /* 80A7CEFC */ int ctrlJoint(J3DJoint*, J3DModel*); /* 80A7D0CC */ static int createHeapCallBack(fopAc_ac_c*); /* 80A7D0EC */ static int ctrlJointCallBack(J3DJoint*, int); - /* 80A7D138 */ bool setExpressionAnm(int, bool); - /* 80A7D394 */ bool setExpressionBtp(int); + /* 80A7D138 */ inline bool setExpressionAnm(int, bool); + /* 80A7D394 */ inline bool setExpressionBtp(int); /* 80A7D474 */ void setMotionAnm(int, f32); /* 80A7D5C4 */ void reset(); /* 80A7D73C */ inline void setWaitAction(); @@ -153,18 +154,18 @@ public: /* 80A7F40C */ bool fight(void*); /* 80A7F9AC */ bool demo(void*); /* 80A7FEE8 */ bool leave(void*); - /* 80A802C4 */ BOOL EvCut_Introduction(int); - /* 80A803A0 */ BOOL EvCut_Appear(int); - /* 80A8081C */ BOOL EvCut_Appear2(int); - /* 80A810FC */ void setParam(); - /* 80A81274 */ BOOL main(); - /* 80A815D4 */ void checkHeadGear(); - /* 80A818B4 */ void playMotion(); + /* 80A802C4 */ inline BOOL EvCut_Introduction(int); + /* 80A803A0 */ inline BOOL EvCut_Appear(int); + /* 80A8081C */ inline BOOL EvCut_Appear2(int); + /* 80A810FC */ inline void setParam(); + /* 80A81274 */ inline BOOL main(); + /* 80A815D4 */ inline void checkHeadGear(); + /* 80A818B4 */ inline void playMotion(); /* 80A8210C */ inline BOOL ctrlBtk(); /* 80A821E0 */ inline void setAttnPos(); /* 80A825A0 */ inline void lookat(); - /* 80A82878 */ void drawOtherMdls(); - /* 80A82900 */ BOOL drawDbgInfo(); + /* 80A82878 */ inline void drawOtherMdls(); + /* 80A82900 */ inline BOOL drawDbgInfo(); MtxP getHandRMtx() { return mpMorf->getModel()->getAnmMtx(17); } diff --git a/src/d/actor/d_a_npc_moir.cpp b/src/d/actor/d_a_npc_moir.cpp index ae4e4d22fb7..ffe6be5f775 100644 --- a/src/d/actor/d_a_npc_moir.cpp +++ b/src/d/actor/d_a_npc_moir.cpp @@ -227,6 +227,9 @@ daNpcMoiR_c::EventFn daNpcMoiR_c::mEvtSeqList[4] = { &daNpcMoiR_c::EvCut_Appear2, }; +/* 80A7C16C-80A7C2F0 0000EC 0184+00 1/1 0/0 0/0 .text __ct__11daNpcMoiR_cFv */ +daNpcMoiR_c::daNpcMoiR_c() {} + /* 80A7C380-80A7C580 000300 0200+00 1/0 0/0 0/0 .text __dt__11daNpcMoiR_cFv */ daNpcMoiR_c::~daNpcMoiR_c() { for (int i = 0; l_loadRes_list[mMode][i] >= 0; i++) { @@ -509,7 +512,7 @@ int daNpcMoiR_c::ctrlJointCallBack(J3DJoint* i_joint, int param_2) { return 1; } -inline void daNpcMoiR_c::searchActors() { +void daNpcMoiR_c::searchActors() { if (mActorMngr[1].getActorP() == NULL) { mActorMngr[1].entry(fopAcM_SearchByName(PROC_NPC_ASH)); } @@ -707,7 +710,7 @@ void daNpcMoiR_c::setWaitAction() { } } -inline void daNpcMoiR_c::playExpression() { +void daNpcMoiR_c::playExpression() { daNpcF_anmPlayData dat0 = {ANM_F_TALK_A, daNpcMoiR_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1 = {ANM_F_HOLD_S_LOOP, daNpcMoiR_Param_c::m.common.morf_frame, 1}; @@ -883,7 +886,7 @@ void daNpcMoiR_c::playMotion() { } /* 80A825A0-80A82878 006520 02D8+00 1/1 0/0 0/0 .text lookat__11daNpcMoiR_cFv */ -inline void daNpcMoiR_c::lookat() { +void daNpcMoiR_c::lookat() { daPy_py_c* player = NULL; J3DModel* model = mpMorf->getModel(); BOOL bVar1 = FALSE; @@ -949,7 +952,7 @@ inline void daNpcMoiR_c::lookat() { mLookat.calc(this, model->getBaseTRMtx(), local_dc, bVar1, sVar1, FALSE); } -inline BOOL daNpcMoiR_c::chkFindPlayer() { +BOOL daNpcMoiR_c::chkFindPlayer() { BOOL rv; f32 fVar1 = mMode == MODE_SIT ? 135.0f : daNpcMoiR_Param_c::m.common.fov; @@ -976,13 +979,13 @@ inline BOOL daNpcMoiR_c::chkFindPlayer() { return rv; } -inline void daNpcMoiR_c::setLookMode(int i_lookMode) { +void daNpcMoiR_c::setLookMode(int i_lookMode) { if (i_lookMode >= LOOK_NONE && i_lookMode <= LOOK_PLAYER_TALK && i_lookMode != mLookMode) { mLookMode = i_lookMode; } } -inline BOOL daNpcMoiR_c::step(s16 param_1, int param_2) { +BOOL daNpcMoiR_c::step(s16 param_1, int param_2) { if (mTurnMode == 0) { if (param_2 != 0) { if ((s32)fabsf(cM_sht2d((s16)(param_1 - mCurAngle.y))) > 40) { @@ -1021,6 +1024,10 @@ inline BOOL daNpcMoiR_c::step(s16 param_1, int param_2) { return mTurnMode > 1; } +static daNpcMoiR_c::Action2Fn dummy_4854() { + return &daNpcMoiR_c::multiTalk; +} + /* 80A7D934-80A7DD94 0018B4 0460+00 1/0 0/0 0/0 .text wait_type0__11daNpcMoiR_cFPv */ bool daNpcMoiR_c::wait_type0(void* param_1) { // NONMATCHING @@ -1167,6 +1174,9 @@ bool daNpcMoiR_c::wait_type1(void* param_1) { mOrderEvtNo = 2; } + // This is fake, but it matches on GCN: + Action2Fn dummy_5013 = &daNpcMoiR_c::multiTalk; + if (dComIfGp_event_runCheck()) { if (eventInfo.checkCommandTalk()) { if (!dComIfGp_event_chkTalkXY() || dComIfGp_evmng_ChkPresentEnd()) { @@ -1258,7 +1268,7 @@ bool daNpcMoiR_c::wait_type2(void* param_1) { return true; } -inline void daNpcMoiR_c::setExpressionTalkAfter() { +void daNpcMoiR_c::setExpressionTalkAfter() { switch (mExpression) { case 3: setExpression(EXPR_FH_HOLD_S, -1.0f); @@ -1274,77 +1284,6 @@ inline void daNpcMoiR_c::setExpressionTalkAfter() { } } -/* 80A7EFBC-80A7F40C 002F3C 0450+00 2/0 0/0 0/0 .text multiTalk__11daNpcMoiR_cFPv */ -BOOL daNpcMoiR_c::multiTalk(void* param_1) { - // NONMATCHING - BOOL rv = FALSE; - fopAc_ac_c* speakers[4] = {this, mActorMngr[1].getActorP(), mActorMngr[2].getActorP(), mActorMngr[3].getActorP()}; - - dComIfGp_setMesgCameraInfoActor(speakers[0], speakers[1], speakers[2], speakers[3], NULL, NULL, NULL, NULL, NULL, NULL); - - switch (field_0xe08) { - case 0: - initTalk(mMsgNo, NULL); - mMsgTimer = 0; - - if (mLookMode != LOOK_NONE) { - mLookMode = LOOK_NONE; - } - - field_0xe08 = 2; - break; - - case 2: - if (talkProc(NULL, TRUE, (fopAc_ac_c**)&speakers)) { - switch (mMode) { - case MODE_SIT: - setAction(&daNpcMoiR_c::wait_type0); - break; - - case MODE_STAND: - setAction(&daNpcMoiR_c::wait_type1); - break; - - case MODE_2: - setAction(&daNpcMoiR_c::wait_type2); - break; - } - - rv = TRUE; - } else { - int msgTimer = mMsgTimer; - int i_expression, i_motion; - - if (ctrlMsgAnm(i_expression, i_motion, this, FALSE) != 0) { - setExpression(i_expression, -1.0f); - setMotion(i_motion, -1.0f, 0); - } else if (msgTimer != 0 && mMsgTimer == 0) { - switch (mExpression) { - case 3: - setExpression(EXPR_FH_HOLD_S, -1.0f); - break; - - case 10: - setExpression(EXPR_FH_HOLD_S_LOOP, -1.0f); - break; - - default: - setExpression(EXPR_NONE, -1.0f); - break; - } - } - } - break; - - case 3: - setExpression(EXPR_NONE, -1.0f); - dComIfGp_event_reset(); - break; - } - - return rv; -} - /* 80A7E8C0-80A7EFBC 002840 06FC+00 2/0 0/0 0/0 .text talk__11daNpcMoiR_cFPv */ bool daNpcMoiR_c::talk(void* param_1) { int itemNo, msgTimer, i_expression, i_actionID; @@ -1420,6 +1359,64 @@ bool daNpcMoiR_c::talk(void* param_1) { return rv; } +/* 80A7EFBC-80A7F40C 002F3C 0450+00 2/0 0/0 0/0 .text multiTalk__11daNpcMoiR_cFPv */ +BOOL daNpcMoiR_c::multiTalk(void* param_1) { + // NONMATCHING + BOOL rv = FALSE; + fopAc_ac_c* speakers[4] = {this, mActorMngr[1].getActorP(), mActorMngr[2].getActorP(), mActorMngr[3].getActorP()}; + + dComIfGp_setMesgCameraInfoActor(speakers[0], speakers[1], speakers[2], speakers[3], NULL, NULL, NULL, NULL, NULL, NULL); + + switch (field_0xe08) { + case 0: + initTalk(mMsgNo, NULL); + mMsgTimer = 0; + + if (mLookMode != LOOK_NONE) { + mLookMode = LOOK_NONE; + } + + field_0xe08 = 2; + break; + + case 2: + if (talkProc(NULL, TRUE, (fopAc_ac_c**)&speakers)) { + setWaitAction(); + rv = TRUE; + } else { + int msgTimer = mMsgTimer; + int i_expression, i_motion; + + if (ctrlMsgAnm(i_expression, i_motion, this, FALSE) != 0) { + setExpression(i_expression, -1.0f); + setMotion(i_motion, -1.0f, 0); + } else if (msgTimer != 0 && mMsgTimer == 0) { + switch (mExpression) { + case 3: + setExpression(EXPR_FH_HOLD_S, -1.0f); + break; + + case 10: + setExpression(EXPR_FH_HOLD_S_LOOP, -1.0f); + break; + + default: + setExpression(EXPR_NONE, -1.0f); + break; + } + } + } + break; + + case 3: + setExpression(EXPR_NONE, -1.0f); + dComIfGp_event_reset(); + break; + } + + return rv; +} + /* 80A7F40C-80A7F9AC 00338C 05A0+00 2/0 0/0 0/0 .text fight__11daNpcMoiR_cFPv */ bool daNpcMoiR_c::fight(void* param_1) { // NONMATCHING @@ -1914,7 +1911,7 @@ void daNpcMoiR_c::checkHeadGear() { /* 80A8210C-80A821E0 00608C 00D4+00 1/0 0/0 0/0 .text ctrlBtk__11daNpcMoiR_cFv */ // NONMATCHING inlining issues -inline BOOL daNpcMoiR_c::ctrlBtk() { +BOOL daNpcMoiR_c::ctrlBtk() { if (mpMatAnm != NULL) { J3DAnmTextureSRTKey* anm = NULL; anm = getTexSRTKeyAnmP(l_arcNames[l_btkGetParamList[0].arcIdx], l_btkGetParamList[0].fileIdx); @@ -1933,7 +1930,7 @@ inline BOOL daNpcMoiR_c::ctrlBtk() { } /* 80A821E0-80A825A0 006160 03C0+00 1/0 0/0 0/0 .text setAttnPos__11daNpcMoiR_cFv */ -inline void daNpcMoiR_c::setAttnPos() { +void daNpcMoiR_c::setAttnPos() { if (mLookMode == LOOK_RESET) { for (int i = 0; i < 3; i++) { mLookatAngle[i].setall(0);