diff options
| -rwxr-xr-x | configure.py | 2 | ||||
| -rw-r--r-- | include/d/actor/d_a_npc_sv.h | 173 | ||||
| -rw-r--r-- | include/d/actor/d_a_obj_ikada.h | 20 | ||||
| -rw-r--r-- | src/d/actor/d_a_npc_sv.cpp | 1173 | ||||
| -rw-r--r-- | src/d/actor/d_a_obj_ikada.cpp | 18 |
5 files changed, 1262 insertions, 124 deletions
diff --git a/configure.py b/configure.py index 40d545a3..cbc97ea0 100755 --- a/configure.py +++ b/configure.py @@ -1738,7 +1738,7 @@ config.libs = [ ActorRel(Matching, "d_a_npc_roten"), ActorRel(Matching, "d_a_npc_rsh1"), ActorRel(NonMatching, "d_a_npc_sarace"), - ActorRel(NonMatching, "d_a_npc_sv"), + ActorRel(Matching, "d_a_npc_sv"), ActorRel(Matching, "d_a_npc_tc"), ActorRel(Matching, "d_a_npc_tt"), ActorRel(NonMatching, "d_a_npc_uk"), diff --git a/include/d/actor/d_a_npc_sv.h b/include/d/actor/d_a_npc_sv.h index 9a36c2cf..c5532e21 100644 --- a/include/d/actor/d_a_npc_sv.h +++ b/include/d/actor/d_a_npc_sv.h @@ -1,63 +1,176 @@ #ifndef D_A_NPC_SV_H #define D_A_NPC_SV_H -#include "f_op/f_op_actor.h" #include "d/d_cc_d.h" +#include "d/d_npc.h" struct sSvAnmDat { - -}; + /* 0x00 */ u8 mBckIdx; + /* 0x01 */ u8 mMorf; + /* 0x02 */ s8 mLoopCount; +}; // Size: 0x03 -class daNpcSv_c : public fopAc_ac_c { +struct NpcDatStruct { + /* 0x00 */ s16 mMax_head_x; + /* 0x02 */ s16 mMax_head_y; + /* 0x04 */ s16 mMax_backbone_x; + /* 0x06 */ s16 mMax_backbone_y; + /* 0x08 */ s16 mMin_head_x; + /* 0x0A */ s16 mMin_head_y; + /* 0x0C */ s16 mMin_backbone_x; + /* 0x0E */ s16 mMin_backbone_y; + /* 0x10 */ s16 mMax_turn_step; + /* 0x12 */ s16 field_0x12; + /* 0x14 */ f32 mModelOfsX; + /* 0x18 */ f32 mModelOfsY; + /* 0x1C */ f32 mModelOfsZ; + /* 0x20 */ f32 mPlayerEyeOfsY; + /* 0x24 */ f32 mAttnPosOfsY; + /* 0x28 */ f32 mEyePosOfsY; + /* 0x2C */ f32 mAttnDist; + /* 0x30 */ f32 mNearDist; + /* 0x34 */ s16 mAttnAngle; + /* 0x36 */ s16 mLookAtMaxVel; + /* 0x38 */ f32 mCylRadius; + /* 0x3C */ f32 mCylHeight; + /* 0x40 */ s16 mLookResetTimer; + /* 0x42 */ u8 mbAllowBodyTurn; + /* 0x43 */ u8 mbLookOnly; +}; // size 0x44; + +class daNpcSv_c : public fopNpc_npc_c { public: - void getMsgPtn() {} - void getNpcNo() {} - void getPhaseP() {} - void setResFlag(unsigned char) {} + enum MoveProcIdx { + MOVE_PROC_WAIT = 0, + MOVE_PROC_TALK = 1, + }; + + enum LookMode { + LOOK_MODE_NONE = 0, + LOOK_MODE_ATTN = 1, + LOOK_MODE_TURN = 2, + }; + + enum CutAct { + CUT_MES_SET = 0, + CUT_GET_ITEM = 1, + CUT_SET_ANGLE = 2, + CUT_ATTENTION = 3, + CUT_TURN_OK = 4, + }; + + enum BckIdx { + BCK_IDX_0 = 0, + BCK_IDX_1 = 1, + BCK_IDX_2 = 2, + BCK_IDX_3 = 3, + BCK_IDX_4 = 4, + BCK_IDX_5 = 5, + BCK_NULL = 0xFF, + }; + + u8 getMsgPtn() { return mMsgPtn; } + u8 getNpcNo() { + return mNpcNo; + } + request_of_phase_process_class* getPhaseP() { + return &mPhase; + } + void setResFlag(u8 flag) { + mResFlag = flag; + } daNpcSv_c(); cPhs_State _create(); - void createHeap(); - void createInit(); + BOOL createHeap(); + cPhs_State createInit(); bool _delete(); bool _draw(); bool _execute(); - void executeCommon(); - void executeSetMode(unsigned char); - void executeWaitInit(); + BOOL executeCommon(); + void executeSetMode(u8); + BOOL executeWaitInit(); void executeWait(); - void executeTalkInit(); + BOOL executeTalkInit(); void executeTalk(); void checkOrder(); void eventOrder(); void eventMove(); void privateCut(); void eventMesSetInit(int); - void eventMesSet(); + bool eventMesSet(); void eventGetItemInit(int); - void eventGetItem(); + bool eventGetItem(); void eventSetAngleInit(); void eventAttentionInit(int); - void eventAttention(); + bool eventAttention(); void eventTurnOkInit(); - void talk2(int, fopAc_ac_c*); - void next_msgStatus(unsigned long*); - void getMsg(); - void setMessage(unsigned long); + u16 talk2(int, fopAc_ac_c*); + virtual u16 next_msgStatus(u32*); + virtual u32 getMsg(); + void setMessage(u32); void setAnmFromMsgTag(); - void getPrmNpcNo(); + u8 getPrmNpcNo(); void setMtx(); void chkAttention(); void lookBack(); void playAnm(); - void setAnm(unsigned char, int, float); - void setAnmTbl(sSvAnmDat*); - void setCollision(dCcD_Cyl*, cXyz, float, float); - void getTalkNo(); - void isTalkOK(); + void setAnm(u8, int, f32); + bool setAnmTbl(sSvAnmDat*); + void setCollision(dCcD_Cyl*, cXyz, f32, f32); + u8 getTalkNo(); + BOOL isTalkOK(); -public: - /* Place member variables here */ -}; + static const char m_arcname[]; + +private: + /* 0x6C4 */ request_of_phase_process_class mPhase; + /* 0x6CC */ request_of_phase_process_class mPhaseCreate; + /* 0x6D4 */ u32 mShadowId; + /* 0x6D8 */ u32 field_0x6D8; + /* 0x6DC */ u8 padding_0x6DC[0x6EC - 0x6DC]; + /* 0x6EC */ cXyz mLookAtPos; + /* 0x6F8 */ u8 padding_0x6F8[0x704 - 0x6F8]; + /* 0x704 */ sSvAnmDat* mpAnmDat; + /* 0x708 */ u32* mpMsgNo; + /* 0x70C */ f32 mAnmMorfOverride; + /* 0x710 */ f32 mAttnDist; + /* 0x714 */ u32 mItemNo; + /* 0x718 */ s32 mIkadaFrame; + /* 0x71C */ bool mHeadOnlyFollow; + /* 0x71D */ u8 field_0x71D; + /* 0x71E */ s16 mEventIdx[3]; + /* 0x724 */ s16 mLookResetTimer; + /* 0x726 */ s16 mAttnAngle; + /* 0x728 */ s16 mHomeYRot; + /* 0x72A */ s16 mAttnTimer; + /* 0x72C */ s16 mTargetAngleY; + /* 0x72E */ s16 mLookAtMaxVel; + /* 0x730 */ s16 mTurnVel; + /* 0x732 */ s16 mLookAngleY; + /* 0x734 */ u16 mTalkFlags; + /* 0x736 */ u8 mTalkOrder; + /* 0x737 */ u8 mbPlayerAttention; + /* 0x738 */ u8 mEvtOrderType; + /* 0x739 */ u8 mMoveState; + /* 0x73A */ u8 mResFlag; + /* 0x73B */ u8 mNpcNo; + /* 0x73C */ u8 mCutFlags; + /* 0x73D */ u8 mBckIdx; + /* 0x73E */ u8 mAnmFlag; + /* 0x73F */ s8 mAnmLoopCnt; + /* 0x740 */ s8 mActIdx; + /* 0x741 */ s8 mLookMode; + /* 0x742 */ u8 field_0x742; + /* 0x743 */ u8 mbAllowBodyTurn; + /* 0x744 */ u8 mbLookOnly; + /* 0x745 */ bool mbNearPlayer; + /* 0x746 */ u8 mTalkNo; + /* 0x747 */ u8 mMsgPtn; + /* 0x748 */ u8 mKyoroFlag; + /* 0x749 */ u8 mbStopMawasi; + /* 0x74A */ bool mbWasNearPlayer; + /* 0x74B */ u8 padding_0x74B[0x74C - 0x74B]; +}; // Size: 0x74C #endif /* D_A_NPC_SV_H */ diff --git a/include/d/actor/d_a_obj_ikada.h b/include/d/actor/d_a_obj_ikada.h index 5a4cc600..bfcf439b 100644 --- a/include/d/actor/d_a_obj_ikada.h +++ b/include/d/actor/d_a_obj_ikada.h @@ -18,18 +18,22 @@ public: PROC_EXEC_e = 1, }; - void getCranePos() {} - void getFrame() {} - void getMode() {} - void getSvDirection() {} + cXyz getCranePos() { + return mCranePos; + } + s32 getFrame() { + return mFrame; + } + s32 getMode() { return mCurMode; } + s32 getSvDirection() { return m1168; } bool isBonbori() { return mType == 3 || mType == 1; } bool isCrane() {return mType == 4; } bool isFlag() { return mType == 0 || mType == 4; } bool isWave() { return mType == 4 || mType == 3 || mType == 1; } void modeProcInit(int idx) { modeProc(PROC_INIT_e, idx); } void setInitPos() {} - void setStart() {} - void setStop() {} + void setStart() { m1166 = 1; } + void setStop() { m1166 = 0; } void _nodeControl(J3DNode*, J3DModel*); BOOL _pathMove(cXyz*, cXyz*, cXyz*); @@ -123,7 +127,7 @@ public: /* 0x0462 */ u8 m0462[0x0464 - 0x0462]; /* 0x0464 */ f32 mSplashScaleTimer; /* 0x0468 */ cXyz mTrackPos; - /* 0x0474 */ cXyz m0474; + /* 0x0474 */ cXyz mCranePos; /* 0x0480 */ dPa_followEcallBack mBombSmokeEasterEgg; /* 0x0494 */ csXyz mBombSmokeRot; /* 0x049A */ u8 m049A[0x049C - 0x049A]; @@ -161,7 +165,7 @@ public: /* 0x07D8 */ s32 m07D8; /* 0x07DC */ cXyz m07DC[200]; /* 0x113C */ csXyz mJointRot[4]; - /* 0x1154 */ s32 m1154; + /* 0x1154 */ s32 mFrame; /* 0x1158 */ s16 m1158; /* 0x115A */ s16 m115A; /* 0x115C */ s16 m115C; diff --git a/src/d/actor/d_a_npc_sv.cpp b/src/d/actor/d_a_npc_sv.cpp index a61f2e53..aace18b0 100644 --- a/src/d/actor/d_a_npc_sv.cpp +++ b/src/d/actor/d_a_npc_sv.cpp @@ -5,227 +5,1251 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_sv.h" -#include "m_Do/m_Do_ext.h" #include "d/actor/d_a_obj_ikada.h" +#include "d/d_com_lib_game.h" +#include "res/Object/Sv.h" + +enum { + TALK_FLAG_1ST = 0x01, + TALK_FLAG_2ND = 0x02, + TALK_FLAG_P2 = 0x04, + TALK_FLAG_P3 = 0x08, + TALK_FLAG_P4 = 0x10, + TALK_FLAG_GOT_CHART = 0x20, +}; + +static char* l_npc_staff_id[] = { "Sv0", "Sv1", "Sv2", "Sv3" }; + +static const char* l_arcname_tbl[] = { "Sv", "Sv", "Sv", "Sv" }; + +const char daNpcSv_c::m_arcname[] = "Sv"; + +static const int l_bmd_ix_tbl[] = { + dRes_ID_SV_BDL_SV_e, + dRes_ID_SV_BDL_SV_e, + dRes_ID_SV_BDL_SV_e, + dRes_ID_SV_BDL_SV_e, +}; + +static const int l_bck_ix_tbl[][6] = { { dRes_ID_SV_BCK_SV_WAIT01_e, + dRes_ID_SV_BCK_SV_TALK01_e, + dRes_ID_SV_BCK_SV_TALK02_e, + dRes_ID_SV_BCK_SV_TALK03_e, + dRes_ID_SV_BCK_SV_YA_e, + dRes_ID_SV_BCK_SV_MAWASI_e }, + { dRes_ID_SV_BCK_SV_WAIT02_e, + dRes_ID_SV_BCK_SV_KYORO_e, + dRes_ID_SV_BCK_SV_UNAZUKU_e, + dRes_ID_SV_BCK_SV_HARAU_e, + dRes_ID_SV_BCK_SV_BYE_e, + dRes_ID_SV_BCK_SV_SHI_e }, + { dRes_ID_SV_BCK_SV_WAIT02_e, + dRes_ID_SV_BCK_SV_KYORO_e, + dRes_ID_SV_BCK_SV_UNAZUKU_e, + dRes_ID_SV_BCK_SV_HARAU_e, + dRes_ID_SV_BCK_SV_BYE_e, + dRes_ID_SV_BCK_SV_SHI_e }, + { dRes_ID_SV_BCK_SV_WAIT02_e, + dRes_ID_SV_BCK_SV_KYORO_e, + dRes_ID_SV_BCK_SV_UNAZUKU_e, + dRes_ID_SV_BCK_SV_HARAU_e, + dRes_ID_SV_BCK_SV_BYE_e, + dRes_ID_SV_BCK_SV_SHI_e } }; + +static sSvAnmDat l_npc_anm_wait = { daNpcSv_c::BCK_IDX_0, 0x08, 0xFF }; + +static sSvAnmDat l_npc_anm_talk = { + daNpcSv_c::BCK_IDX_1, + 0x08, + 0xFF, +}; + +static sSvAnmDat l_npc_anm_talk2 = { + daNpcSv_c::BCK_IDX_2, + 0x08, + 0xFF, +}; + +static sSvAnmDat l_npc_anm_talk3 = { + daNpcSv_c::BCK_IDX_3, + 0x08, + 0xFF, +}; + +static sSvAnmDat l_npc_anm_ya1[] = { + { + daNpcSv_c::BCK_IDX_4, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_IDX_0, + 0x08, + 0xFF, + }, +}; + +static sSvAnmDat l_npc_anm_ya2[] = { + { + daNpcSv_c::BCK_IDX_4, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_IDX_1, + 0x08, + 0xFF, + }, +}; + +static sSvAnmDat l_npc_anm_mawasi = { + daNpcSv_c::BCK_IDX_5, + 0x00, + 0xFF, +}; + +static sSvAnmDat l_npc_anm_kyoro = { + daNpcSv_c::BCK_IDX_1, + 0x08, + 0xFF, +}; + +static sSvAnmDat l_npc_anm_unun[] = { + { + daNpcSv_c::BCK_IDX_2, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_NULL, + 0x08, + 0, + }, +}; + +static sSvAnmDat l_npc_anm_sisi[] = { + { + daNpcSv_c::BCK_IDX_3, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_NULL, + 0x08, + 0, + }, +}; + +static sSvAnmDat l_npc_anm_byebye[] = { + { + daNpcSv_c::BCK_IDX_4, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_NULL, + 0x08, + 0, + }, +}; + +static sSvAnmDat l_npc_anm_shi[] = { + { + daNpcSv_c::BCK_IDX_5, + 0x08, + 1, + }, + { + daNpcSv_c::BCK_NULL, + 0x08, + 0, + }, +}; + +static sSvAnmDat* l_npc_anm_sv1_tbl[] = { + &l_npc_anm_wait, &l_npc_anm_kyoro, l_npc_anm_unun, l_npc_anm_sisi, l_npc_anm_byebye, l_npc_anm_shi, +}; + +static u32 l_npc_se_sv1_tbl[] = { 0, 0, JA_SE_CV_SALV_CRUE_AGREE, JA_SE_CV_SALV_CRUE_SI, JA_SE_CV_SALV_CRUE_BYE, 0 }; + +static NpcDatStruct l_npc_dat[] = { + { + 0x0FA0, 0x1770, 0x0000, 0x1F40, 0x0000, 0xE890, 0xF448, 0xE0C0, 0x03E8, 0x0000, 0.0f, -5.0f, 0.0f, + 0.0f, 185.0f, 150.0f, 600.0f, 1500.0f, 0x7FFF, 0x03E8, 60.0f, 150.0f, 0x001E, 0x01, 0x01, + }, + { + 0x1000, 0x0000, 0x0000, 0x0000, 0xF000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0.0f, 0.0f, 0.0f, + 0.0f, 180.0f, 150.0f, 0.0f, 0.0f, 0x7FFF, 0x0800, 60.0f, 150.0f, 0x001E, 0x00, 0x01, + }, + { + 0x1000, 0x0000, 0x0000, 0x0000, 0xF000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0.0f, 0.0f, 0.0f, + 0.0f, 180.0f, 150.0f, 0.0f, 0.0f, 0x7FFF, 0x0800, 60.0f, 150.0f, 0x001E, 0x00, 0x01, + }, + { + 0x1000, 0x0000, 0x0000, 0x0000, 0xF000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0.0f, 0.0f, 0.0f, + 0.0f, 180.0f, 150.0f, 0.0f, 0.0f, 0x4000, 0x0800, 60.0f, 150.0f, 0x001E, 0x00, 0x01, + }, +}; + +static u32 l_msg_sv_p1_1st_talk1[] = { 0x34BD, 0x34BE, 0x34BF, 0x34C0, 0x0002, 0x34C1, 0x34C2, 0x34C3, 0x0001, 0x34C4, 0x34E8, 0x0002, 0x34C5, 0x0004, 0x0000 }; +static u32 l_msg_sv_p1_1st_talk2[] = { 0x34BD, 0x34BE, 0x34BF, 0x34C0, 0x0002, 0x34C1, 0x34C2, 0x34C3, 0x0001, 0x34C6, 0x34E9, 0x0002, 0x34C7, 0x0004, 0x0000 }; + +static u32 l_msg_sv_p1_2nd_talk1[] = { 0x34C8, 0x34C9, 0x34EA, 0x0002, 0x34CA, 0x0004, 0x0000 }; +static u32 l_msg_sv_p1_2nd_talk2[] = { 0x34C8, 0x34CB, 0x0002, 0x34CC, 0x0004, 0x0000 }; + +static u32 l_msg_sv_p1_3rd_talk1[] = { 0x34CD, 0x34D0, 0x0002, 0x34D1, 0x0003, 0x0000 }; +static u32 l_msg_sv_p1_3rd_talk2[] = { 0x34CD, 0x34CE, 0x0002, 0x34CF, 0x0003, 0x0000 }; + +static u32 l_msg_sv_p2_1st_talk[] = { 0x34D9, 0x34DA, 0x34DB, 0x0002, 0x34DC, 0x0004, 0x0000 }; +static u32 l_msg_sv_p2_2nd_talk[] = { 0x34DD, 0x34DE, 0x0002, 0x34DF, 0x0003, 0x0000 }; + +static u32 l_msg_sv_p3_1st_talk[] = { 0x34D2, 0x34D3, 0x34D4, 0x0002, 0x34D5, 0x0004, 0x0000 }; +static u32 l_msg_sv_p3_2nd_talk[] = { 0x34D6, 0x34D7, 0x0002, 0x34D8, 0x0003, 0x0000 }; + +static u32 l_msg_sv_p4_1st_talk[] = { 0x34E0, 0x34E1, 0x34E2, 0x34E3, 0x34E4, 0x0005, 0x0000 }; +static u32 l_msg_sv_p4_2nd_talk[] = { 0x34E5, 0x34E6, 0x34E7, 0x0005, 0x0000 }; + +static u32* l_msg_sv_talk_tbl[] = { l_msg_sv_p1_1st_talk1, l_msg_sv_p1_1st_talk2, l_msg_sv_p1_2nd_talk1, l_msg_sv_p1_2nd_talk2, + l_msg_sv_p1_3rd_talk1, l_msg_sv_p1_3rd_talk2, l_msg_sv_p2_1st_talk, l_msg_sv_p2_2nd_talk, + l_msg_sv_p3_1st_talk, l_msg_sv_p3_2nd_talk, l_msg_sv_p4_1st_talk, l_msg_sv_p4_2nd_talk }; + +static u16 l_msg_sv_flag_tbl[] = { + TALK_FLAG_1ST, TALK_FLAG_1ST, TALK_FLAG_2ND, TALK_FLAG_2ND, 0, 0, TALK_FLAG_P2, 0, TALK_FLAG_P3, 0, TALK_FLAG_P4, 0, +}; + +static s16 l_event_id_tbl[] = { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 }; + +static u32 l_get_item_no[] = { dItemNo_COLLECT_MAP_26_e }; /* 00000078-0000021C .text __ct__9daNpcSv_cFv */ daNpcSv_c::daNpcSv_c() { - /* Nonmatching */ + mNpcNo = getPrmNpcNo(); + mResFlag = 0; + mMoveState = MOVE_PROC_WAIT; + mAnmMorfOverride = -1.0f; + mLookMode = LOOK_MODE_NONE; + mHeadOnlyFollow = true; + field_0x742 = 1; + mHomeYRot = home.angle.y; + mBckIdx = BCK_IDX_0; + mTalkFlags = 0; + mIkadaFrame = 0; + + if (dComIfGs_checkGetItem(dItemNo_COLLECT_MAP_26_e)) { + mTalkFlags |= TALK_FLAG_GOT_CHART; + } } /* 00000528-00000640 .text daNpc_People_nodeCallBack__FP7J3DNodei */ -static BOOL daNpc_People_nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL daNpc_People_nodeCallBack(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In) { + J3DJoint* joint = (J3DJoint*)i_node; + J3DModel* model = j3dSys.getModel(); + daNpcSv_c* i_this = (daNpcSv_c*)model->getUserArea(); + + s32 jntNo = joint->getJntNo(); + MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); + + if (jntNo == i_this->m_jnt.getHeadJntNum()) { + cMtx_XrotM(*calc_mtx, (s16)i_this->m_jnt.getHead_y()); + cMtx_ZrotM(*calc_mtx, (s16)-i_this->m_jnt.getHead_x()); + } + if (jntNo == i_this->m_jnt.getBackboneJntNum()) { + cMtx_XrotM(*calc_mtx, (s16)i_this->m_jnt.getBackbone_y()); + cMtx_ZrotM(*calc_mtx, (s16)-i_this->m_jnt.getBackbone_x()); + } + + model->setAnmMtx(jntNo, *calc_mtx); + MTXCopy(*calc_mtx, j3dSys.mCurrentMtx); + } + + return true; } /* 00000640-00000660 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daNpcSv_c*)i_this)->createHeap(); } /* 00000660-000006B8 .text phase_1__FP9daNpcSv_c */ -void phase_1(daNpcSv_c*) { - /* Nonmatching */ +static cPhs_State phase_1(daNpcSv_c* i_this) { + fopAcM_ct(i_this, daNpcSv_c); + i_this->setResFlag(1); + return cPhs_NEXT_e; } /* 000006B8-00000738 .text phase_2__FP9daNpcSv_c */ -void phase_2(daNpcSv_c*) { - /* Nonmatching */ +static cPhs_State phase_2(daNpcSv_c* i_this) { + cPhs_State state = dComIfG_resLoad(i_this->getPhaseP(), l_arcname_tbl[i_this->getNpcNo()]); + + if (state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(i_this, CheckCreateHeap, 0x3800)) { + state = i_this->createInit(); + } else { +#if VERSION > VERSION_DEMO + i_this->mpMorf = NULL; +#endif + return cPhs_ERROR_e; + } + } + return state; } /* 00000738-00000768 .text _create__9daNpcSv_cFv */ cPhs_State daNpcSv_c::_create() { - /* Nonmatching */ + static cPhs__Handler l_method[] = { (cPhs__Handler)&phase_1, (cPhs__Handler)&phase_2, (cPhs__Handler)NULL }; + + return dComLbG_PhaseHandler(&mPhaseCreate, l_method, this); } +typedef int (daNpcSv_c::*ExecuteInit_t)(); +static ExecuteInit_t l_execute_init[] = { + &daNpcSv_c::executeWaitInit, + &daNpcSv_c::executeTalkInit, +}; + +typedef void (daNpcSv_c::*MoveProc_t)(); +static MoveProc_t moveProc[] = { + &daNpcSv_c::executeWait, + &daNpcSv_c::executeTalk, +}; + /* 00000768-00000A04 .text createHeap__9daNpcSv_cFv */ -void daNpcSv_c::createHeap() { - /* Nonmatching */ +BOOL daNpcSv_c::createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bmd_ix_tbl[mNpcNo]); + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, + NULL, + (J3DAnmTransform*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[mNpcNo][mBckIdx]), + J3DFrameCtrl::EMode_LOOP, + 1.0f, + 0, + -1, + 1, + NULL, + 0x80000, + 0x37441422 + ); + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + + m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head")); + JUT_ASSERT(DEMO_SELECT(945, 946), m_jnt.getHeadJntNum() >= 0); + m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone")); + JUT_ASSERT(DEMO_SELECT(949, 950), m_jnt.getBackboneJntNum() >= 0); + + for (u16 jntIdx = 0; jntIdx < modelData->getJointNum(); jntIdx++) { + if (jntIdx == m_jnt.getHeadJntNum() || jntIdx == m_jnt.getBackboneJntNum()) { + modelData->getJointNodePointer(jntIdx)->setCallBack(daNpc_People_nodeCallBack); + } + } + + mpMorf->getModel()->setUserArea((uintptr_t)this); + mAcchCir.SetWall(30.0f, 30.0f); + mObjAcch.Set( + fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, + 1, + &mAcchCir, + fopAcM_GetSpeed_p(this), + fopAcM_GetAngle_p(this), + fopAcM_GetShapeAngle_p(this) + ); + return TRUE; } /* 00000A04-00000C74 .text createInit__9daNpcSv_cFv */ -void daNpcSv_c::createInit() { - /* Nonmatching */ +cPhs_State daNpcSv_c::createInit() { + gravity = -9.0f; + setAnmTbl(&l_npc_anm_wait); + mEventIdx[0] = dComIfGp_evmng_getEventIdx("SV_TALK_P1_1ST", 0xFF); + mEventIdx[1] = dComIfGp_evmng_getEventIdx("SV_TALK_P1_2ND", 0xFF); + mEventIdx[2] = dComIfGp_evmng_getEventIdx("SV_TALK_P4_1ST", 0xFF); + + eventInfo.setEventId(mEventIdx[l_event_id_tbl[getTalkNo() & 0xFF]]); +#if VERSION == VERSION_DEMO + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].mCylRadius, l_npc_dat[mNpcNo].mCylHeight); +#endif + mEventCut.setActorInfo2(l_npc_staff_id[mNpcNo], this); +#if VERSION == VERSION_DEMO + setMtx(); +#endif + + mTurnVel = 0; + mTalkOrder = 0; + mbPlayerAttention = 0; + mbNearPlayer = false; + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -70.0f, 0.0f, -70.0f, 70.0f, 200.0f, 70.0f); + attention_info.distances[1] = 0xB1; + attention_info.distances[3] = 0xB1; + attention_info.flags = fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e; + + m_jnt.setParam( + l_npc_dat[mNpcNo].mMax_backbone_x, + l_npc_dat[mNpcNo].mMax_backbone_y, + l_npc_dat[mNpcNo].mMin_backbone_x, + l_npc_dat[mNpcNo].mMin_backbone_y, + l_npc_dat[mNpcNo].mMax_head_x, + l_npc_dat[mNpcNo].mMax_head_y, + l_npc_dat[mNpcNo].mMin_head_x, + l_npc_dat[mNpcNo].mMin_head_y, + l_npc_dat[mNpcNo].mMax_turn_step + ); + + mbAllowBodyTurn = l_npc_dat[mNpcNo].mbAllowBodyTurn; + mbLookOnly = l_npc_dat[mNpcNo].mbLookOnly; + mAttnDist = l_npc_dat[mNpcNo].mAttnDist; + mAttnAngle = l_npc_dat[mNpcNo].mAttnAngle; +#if VERSION > VERSION_DEMO + setMtx(); + mpMorf->getModel()->calc(); + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].mCylRadius, l_npc_dat[mNpcNo].mCylHeight); +#endif + return cPhs_COMPLEATE_e; } /* 00000C74-00000CD8 .text _delete__9daNpcSv_cFv */ bool daNpcSv_c::_delete() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + if (mResFlag != 0) +#endif + { + dComIfG_resDeleteDemo(&mPhase, l_arcname_tbl[mNpcNo]); + } + +#if VERSION > VERSION_DEMO + if (heap != NULL) +#endif + { + if (mpMorf != NULL) { + mpMorf->stopZelAnime(); + } + } + return true; } /* 00000CD8-00000DAC .text _draw__9daNpcSv_cFv */ bool daNpcSv_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr); + mpMorf->updateDL(); + + cXyz pos(current.pos.x, current.pos.y + 150.0f, current.pos.z); + mShadowId = dComIfGd_setShadow( + mShadowId, + 1, + mpMorf->getModel(), + &pos, + 800.0f, + 20.0f, + current.pos.y, + mObjAcch.GetGroundH(), + mObjAcch.m_gnd, + &tevStr, + 0, + 1.0f, + dDlst_shadowControl_c::getSimpleTex() + ); + return true; } /* 00000DAC-00000F90 .text _execute__9daNpcSv_cFv */ bool daNpcSv_c::_execute() { - /* Nonmatching */ + fopAc_ac_c* parent; + fopAcM_SearchByID(parentActorID, &parent); + chkAttention(); + checkOrder(); + + if (!dComIfGp_event_runCheck()) { + (this->*moveProc[mMoveState])(); + } else { + eventMove(); + } + + eventOrder(); + + if (!mNpcNo && mBckIdx == BCK_IDX_5) { + mpMorf->setFrame(mIkadaFrame); + } else { + playAnm(); + } + + if (parent != NULL) { + mIkadaFrame = static_cast<daObj_Ikada_c*>(parent)->getFrame(); + } + + mObjAcch.CrrPos(*dComIfG_Bgsp()); + setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].mCylRadius, l_npc_dat[mNpcNo].mCylHeight); + attention_info.position.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].mAttnPosOfsY, current.pos.z); + eyePos.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].mEyePosOfsY, current.pos.z); + lookBack(); + setMtx(); + return false; } /* 00000F90-00000FB8 .text executeCommon__9daNpcSv_cFv */ -void daNpcSv_c::executeCommon() { - /* Nonmatching */ +BOOL daNpcSv_c::executeCommon() { + if (mbPlayerAttention) { + mEvtOrderType = 1; + } else { + mEvtOrderType = 0; + } + return FALSE; } /* 00000FB8-00001000 .text executeSetMode__9daNpcSv_cFUc */ -void daNpcSv_c::executeSetMode(unsigned char) { - /* Nonmatching */ +void daNpcSv_c::executeSetMode(u8 i_mode) { + mMoveState = (this->*l_execute_init[i_mode])(); } /* 00001000-00001080 .text executeWaitInit__9daNpcSv_cFv */ -void daNpcSv_c::executeWaitInit() { - /* Nonmatching */ +BOOL daNpcSv_c::executeWaitInit() { + setAnmTbl(&l_npc_anm_wait); + m_jnt.setParam( + l_npc_dat[mNpcNo].mMax_backbone_x, + l_npc_dat[mNpcNo].mMax_backbone_y, + l_npc_dat[mNpcNo].mMin_backbone_x, + l_npc_dat[mNpcNo].mMin_backbone_y, + l_npc_dat[mNpcNo].mMax_head_x, + l_npc_dat[mNpcNo].mMax_head_y, + l_npc_dat[mNpcNo].mMin_head_x, + l_npc_dat[mNpcNo].mMin_head_y, + l_npc_dat[mNpcNo].mMax_turn_step + ); + return FALSE; } /* 00001080-0000131C .text executeWait__9daNpcSv_cFv */ void daNpcSv_c::executeWait() { - /* Nonmatching */ + daObj_Ikada_c* parent; + fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&parent); + + if (parent != NULL) { + if (!mNpcNo) { + if (mbNearPlayer) { + mEvtOrderType = 1; + if (mbNearPlayer != mbWasNearPlayer) { + mbStopMawasi = 1; + } + parent->setStart(); + } else { + mEvtOrderType = 0; + mbStopMawasi = 0; + parent->setStop(); + } + + if (mbStopMawasi) { + setAnmTbl(&l_npc_anm_wait); + } else { + mLookAngleY = parent->shape_angle.y; + current.angle.x = parent->shape_angle.x; + current.angle.z = parent->shape_angle.z; + mLookMode = LOOK_MODE_TURN; + mHeadOnlyFollow = false; + m_jnt.setTrn(); + setAnmTbl(&l_npc_anm_mawasi); + } + mbWasNearPlayer = mbNearPlayer; + } else { + mbAllowBodyTurn = 1; + if (parent->getMode() == 8 || parent->getMode() == 9 || parent->getMode() == 5) { + mLookAngleY = parent->shape_angle.y; + mLookMode = LOOK_MODE_TURN; + mHeadOnlyFollow = false; + m_jnt.setTrn(); + } else if (parent->getMode() == 4 || parent->getMode() == 6) { + if (parent->getSvDirection() == 0) { + mLookAngleY = parent->shape_angle.y + 0x4000; + } else { + mLookAngleY = parent->shape_angle.y - 0x4000; + } + mLookMode = LOOK_MODE_TURN; + mHeadOnlyFollow = false; + m_jnt.setTrn(); + } else { + s16 angle; + if (parent->getSvDirection() == 0) { + angle = parent->shape_angle.y + 0x4000; + } else { + angle = parent->shape_angle.y - 0x4000; + } + + if (current.angle.y == angle) { + mLookAtPos = parent->getCranePos(); + mLookMode = LOOK_MODE_ATTN; + mHeadOnlyFollow = true; + mbAllowBodyTurn = 0; + } else { + mLookAngleY = angle; + mLookMode = LOOK_MODE_TURN; + mHeadOnlyFollow = false; + m_jnt.setTrn(); + } + } + + if (parent->getMode() == 7) { + if (mKyoroFlag == 0) { + mKyoroFlag = 1; + setAnmTbl(l_npc_anm_sv1_tbl[1]); + } + } else if (mKyoroFlag == 1) { + mKyoroFlag = 0; + setAnmTbl(l_npc_anm_sv1_tbl[0]); + } + } + } } /* 0000131C-00001338 .text executeTalkInit__9daNpcSv_cFv */ -void daNpcSv_c::executeTalkInit() { - /* Nonmatching */ +BOOL daNpcSv_c::executeTalkInit() { + if (field_0x742) { + return TRUE; + } + return mMoveState; } /* 00001338-000013B8 .text executeTalk__9daNpcSv_cFv */ void daNpcSv_c::executeTalk() { - /* Nonmatching */ + executeCommon(); + if (talk2(1, this) == fopMsgStts_BOX_CLOSED_e) { + mTalkOrder = 0; + mbStopMawasi = 0; + executeSetMode(MOVE_PROC_WAIT); + dComIfGp_event_reset(); + } else { + setAnmFromMsgTag(); + } } /* 000013B8-000013EC .text checkOrder__9daNpcSv_cFv */ void daNpcSv_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + return; + } + if (!eventInfo.checkCommandTalk()) { + return; + } + if (mEvtOrderType != 2 && mEvtOrderType != 1) { + return; + } + mTalkOrder = 1; } /* 000013EC-00001458 .text eventOrder__9daNpcSv_cFv */ void daNpcSv_c::eventOrder() { - /* Nonmatching */ + if ((mEvtOrderType == 2 || mEvtOrderType == 1) && isTalkOK()) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if (mEvtOrderType == 2) { + fopAcM_orderSpeakEvent(this); + } + } } /* 00001458-00001570 .text eventMove__9daNpcSv_cFv */ void daNpcSv_c::eventMove() { - /* Nonmatching */ + if (dComIfGp_evmng_endCheck(mEventIdx[0]) || dComIfGp_evmng_endCheck(mEventIdx[1]) || dComIfGp_evmng_endCheck(mEventIdx[2])) { + eventInfo.setEventId(mEventIdx[l_event_id_tbl[(getTalkNo() & 0xFF)]]); + dComIfGp_event_reset(); + mCutFlags &= ~2; + mTalkOrder = 0; + mbStopMawasi = 0; + executeSetMode(MOVE_PROC_WAIT); + return; + } + + bool prevAttnFlag = mEventCut.getAttnFlag(); + if (mEventCut.cutProc()) { + if (mEventCut.getAttnFlag()) { + return; + } + mEventCut.setAttnFlag(prevAttnFlag); + } else { + privateCut(); + if (mNpcNo) { + return; + } + setAnmFromMsgTag(); + return; + } } /* 00001570-00001744 .text privateCut__9daNpcSv_cFv */ void daNpcSv_c::privateCut() { - /* Nonmatching */ + static char* cut_name_tbl[] = { + "MES_SET", "GET_ITEM", "SET_ANGLE", "ATTENTION", "TURN_OK", + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId(l_npc_staff_id[mNpcNo]); + if (staffIdx != -1) { + mActIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, 5, TRUE, 0); + + if (mActIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (mActIdx) { + case CUT_MES_SET: + eventMesSetInit(staffIdx); + break; + case CUT_GET_ITEM: + eventGetItemInit(staffIdx); + break; + case CUT_SET_ANGLE: + eventSetAngleInit(); + break; + case CUT_ATTENTION: + eventAttentionInit(staffIdx); + break; + case CUT_TURN_OK: + eventTurnOkInit(); + break; + } + } + + bool endCut; + switch (mActIdx) { + case CUT_MES_SET: + endCut = eventMesSet(); + break; + case CUT_GET_ITEM: + endCut = eventGetItem(); + break; + case CUT_ATTENTION: + endCut = eventAttention(); + break; + default: + endCut = 1; + break; + } + + if (endCut) { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + } + + if ((mCutFlags & 2) != 0) { + mLookAngleY = mTargetAngleY; + mLookMode = LOOK_MODE_TURN; + mHeadOnlyFollow = false; + m_jnt.setTrn(); + } } /* 00001744-00001814 .text eventMesSetInit__9daNpcSv_cFi */ -void daNpcSv_c::eventMesSetInit(int) { - /* Nonmatching */ +void daNpcSv_c::eventMesSetInit(int i_staffIdx) { + int* msgNo = dComIfGp_evmng_getMyIntegerP(i_staffIdx, "MsgNo"); + if (msgNo != NULL) { + mpMsgNo = NULL; + int msg = *msgNo; + switch (msg) { + case 0: + setMessage(getMsg()); + break; + default: + setMessage(msg); + } + } else { + mpMsgNo++; + setMessage(*mpMsgNo); + } + dComIfGp_event_setTalkPartner(this); } /* 00001814-0000184C .text eventMesSet__9daNpcSv_cFv */ -void daNpcSv_c::eventMesSet() { - /* Nonmatching */ +bool daNpcSv_c::eventMesSet() { + return talk2(0, this) == fopMsgStts_BOX_CLOSED_e; } /* 0000184C-000018F0 .text eventGetItemInit__9daNpcSv_cFi */ -void daNpcSv_c::eventGetItemInit(int) { - /* Nonmatching */ +void daNpcSv_c::eventGetItemInit(int i_staffIdx) { + fpc_ProcID pcId; + + int* pItemIdx = dComIfGp_evmng_getMyIntegerP(i_staffIdx, "ItemNo"); + u32 itemNo; + if (pItemIdx != NULL) { + itemNo = l_get_item_no[*pItemIdx]; + } else { + itemNo = mItemNo; + } + pcId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, fopAcM_GetRoomNo(this)); + + if (pcId != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(pcId); + } } /* 000018F0-000018F8 .text eventGetItem__9daNpcSv_cFv */ -void daNpcSv_c::eventGetItem() { - /* Nonmatching */ +bool daNpcSv_c::eventGetItem() { + return true; } /* 000018F8-000019E0 .text eventSetAngleInit__9daNpcSv_cFv */ void daNpcSv_c::eventSetAngleInit() { - /* Nonmatching */ + fopAc_ac_c* parent; + fopAcM_SearchByID(parentActorID, &parent); + + if (parent != NULL) { + s16 angle; + fopAc_ac_c* link = dComIfGp_getLinkPlayer(); + dNpc_calc_DisXZ_AngY(parent->current.pos, link->current.pos, NULL, &angle); + angle -= parent->shape_angle.y; + if (angle > 0) { + mTargetAngleY = parent->shape_angle.y + 0x4000; + } else { + mTargetAngleY = parent->shape_angle.y - 0x4000; + } + mHomeYRot = mTargetAngleY; + } else { + mTargetAngleY = mHomeYRot; + } + mCutFlags |= 2; } /* 000019E0-00001A74 .text eventAttentionInit__9daNpcSv_cFi */ -void daNpcSv_c::eventAttentionInit(int) { - /* Nonmatching */ +void daNpcSv_c::eventAttentionInit(int i_staffIdx) { + int* timer = dComIfGp_evmng_getMyIntegerP(i_staffIdx, "Timer"); + if (timer != NULL) { + mAttnTimer = *timer; + } else { + mAttnTimer = 0xC; + } + mKyoroFlag = 0; + + if (mNpcNo == 2) { + dComIfGp_event_setTalkPartner(this); + } } /* 00001A74-00001BC8 .text eventAttention__9daNpcSv_cFv */ -void daNpcSv_c::eventAttention() { - /* Nonmatching */ +bool daNpcSv_c::eventAttention() { + if (mAttnTimer != 0) { + mAttnTimer--; + if (mAttnTimer == 0) { + daNpcSv_c* pSv0 = (daNpcSv_c*)fopAcM_searchFromName(l_npc_staff_id[0], 0, 0); + if (pSv0 != NULL) { + setAnmTbl(l_npc_anm_sv1_tbl[pSv0->getMsgPtn()]); + if (mNpcNo == 1) { + mDoAud_seStart(l_npc_se_sv1_tbl[pSv0->getMsgPtn()]); + } + } else { + setAnmTbl(l_npc_anm_sv1_tbl[2]); + mDoAud_seStart(l_npc_se_sv1_tbl[2]); + } + } + } else if ((mAnmFlag & 1) != 0) { + setAnmTbl(l_npc_anm_sv1_tbl[0]); + return true; + } + return false; } /* 00001BC8-00001BD4 .text eventTurnOkInit__9daNpcSv_cFv */ void daNpcSv_c::eventTurnOkInit() { - /* Nonmatching */ + mbAllowBodyTurn = 1; } /* 00001BD4-00001CF0 .text talk2__9daNpcSv_cFiP10fopAc_ac_c */ -void daNpcSv_c::talk2(int, fopAc_ac_c*) { - /* Nonmatching */ +u16 daNpcSv_c::talk2(int i_param, fopAc_ac_c* i_partner) { + u16 status = 0xFF; + if (mCurrMsgBsPcId == fpcM_ERROR_PROCESS_ID_e) { + if (i_param == 1) { + mCurrMsgNo = getMsg(); + } + mCurrMsgBsPcId = fopMsgM_messageSet(mCurrMsgNo, i_partner); + mpCurrMsg = NULL; + } else if (mpCurrMsg) { + status = mpCurrMsg->mStatus; + switch (status) { + case fopMsgStts_MSG_DISPLAYED_e: + mpCurrMsg->mStatus = next_msgStatus(&mCurrMsgNo); + if (mpCurrMsg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(mCurrMsgNo); + } + break; + case fopMsgStts_BOX_CLOSED_e: + mpCurrMsg->mStatus = fopMsgStts_MSG_DESTROYED_e; + mCurrMsgBsPcId = fpcM_ERROR_PROCESS_ID_e; + break; + } + anmAtr(status); + } else { + mpCurrMsg = fopMsgM_SearchByID(mCurrMsgBsPcId); + } + return status; } /* 00001CF0-00001DC8 .text next_msgStatus__9daNpcSv_cFPUl */ -void daNpcSv_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpcSv_c::next_msgStatus(u32* i_msgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + switch (*i_msgNo) { + case 0: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + default: + if (mpMsgNo != NULL) { + mpMsgNo++; + switch (*mpMsgNo) { + case 1: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 2: + mMsgPtn = 2; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 3: + mMsgPtn = 3; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 4: + mMsgPtn = 4; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 5: + mMsgPtn = 5; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0: + mpMsgNo = NULL; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + default: + *i_msgNo = *mpMsgNo; + break; + } + } else { + msgStatus = fopMsgStts_MSG_ENDS_e; + } + break; + } + return msgStatus; } /* 00001DC8-00001EB4 .text getMsg__9daNpcSv_cFv */ -void daNpcSv_c::getMsg() { - /* Nonmatching */ +u32 daNpcSv_c::getMsg() { + u32 msgNo = 0; + mpMsgNo = NULL; + if (!dComIfGp_event_chkTalkXY()) { + mpMsgNo = l_msg_sv_talk_tbl[mTalkNo]; + mTalkFlags |= l_msg_sv_flag_tbl[mTalkNo]; + + if (mTalkFlags & TALK_FLAG_P4) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_2F80); + } + } + + if (mpMsgNo != NULL) { + msgNo = *mpMsgNo; + } + if (msgNo == 0) { + setAnmTbl(&l_npc_anm_talk); + } + + return msgNo; } /* 00001EB4-00001EBC .text setMessage__9daNpcSv_cFUl */ -void daNpcSv_c::setMessage(unsigned long) { - /* Nonmatching */ +void daNpcSv_c::setMessage(u32 i_message) { + mCurrMsgNo = i_message; } /* 00001EBC-00001F74 .text setAnmFromMsgTag__9daNpcSv_cFv */ void daNpcSv_c::setAnmFromMsgTag() { - /* Nonmatching */ + switch (dComIfGp_getMesgAnimeAttrInfo()) { + case 0: + setAnmTbl(&l_npc_anm_wait); + break; + case 1: + setAnmTbl(l_npc_anm_ya1); + break; + case 2: + setAnmTbl(&l_npc_anm_talk); + break; + case 3: + setAnmTbl(&l_npc_anm_talk2); + break; + case 4: + setAnmTbl(&l_npc_anm_talk3); + break; + case 5: + setAnmTbl(l_npc_anm_ya2); + break; + } + dComIfGp_setMesgAnimeAttrInfo(0xFF); } /* 00001F74-00001F94 .text getPrmNpcNo__9daNpcSv_cFv */ -void daNpcSv_c::getPrmNpcNo() { - /* Nonmatching */ +u8 daNpcSv_c::getPrmNpcNo() { + if (0 <= argument && argument < 4) { + return argument; + } + return 0; } /* 00001F94-0000209C .text setMtx__9daNpcSv_cFv */ void daNpcSv_c::setMtx() { - /* Nonmatching */ + mpMorf->getModel()->setBaseScale(scale); + + cXyz offset(l_npc_dat[mNpcNo].mModelOfsX, l_npc_dat[mNpcNo].mModelOfsY, l_npc_dat[mNpcNo].mModelOfsZ); + + mDoMtx_stack_c::YrotS(current.angle.y); + cMtx_multVec(mDoMtx_stack_c::get(), &offset, &offset); + mDoMtx_stack_c::transS(current.pos.x + offset.x, current.pos.y + offset.y, current.pos.z + offset.z); + mDoMtx_stack_c::XYZrotM(current.angle.x, 0, current.angle.z); + mDoMtx_stack_c::YrotM(current.angle.y); + + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 0000209C-000023D4 .text chkAttention__9daNpcSv_cFv */ void daNpcSv_c::chkAttention() { - /* Nonmatching */ + mbNearPlayer = false; + if (mEventCut.getAttnFlag()) { + mLookAtPos = mEventCut.getAttnPos(); + mLookMode = LOOK_MODE_ATTN; + if (mbAllowBodyTurn) { + mHeadOnlyFollow = false; + m_jnt.setTrn(); + } else { + mHeadOnlyFollow = true; + } + if (mbPlayerAttention == 0) { + mbPlayerAttention = 1; + } + } else { + fopAc_ac_c* player = dComIfGp_getLinkPlayer(); + f32 maxDist = mAttnDist; + int maxAngle = mAttnAngle; + f32 dist; + s16 angle; + dNpc_calc_DisXZ_AngY(current.pos, player->current.pos, &dist, &angle); + if (mbPlayerAttention != 0) { + maxDist += 100.0f; + maxAngle += 0x71C; + } + angle -= shape_angle.y; + if (maxDist > dist && maxAngle > abs(angle)) { + mLookAtPos = dNpc_playerEyePos(l_npc_dat[mNpcNo].mPlayerEyeOfsY); + mLookMode = LOOK_MODE_ATTN; + if (mbAllowBodyTurn) { + mHeadOnlyFollow = false; + } else { + mHeadOnlyFollow = true; + } + if (mbLookOnly == 0) { + mLookAngleY = mHomeYRot; + mHeadOnlyFollow = false; + mLookMode = LOOK_MODE_TURN; + m_jnt.setTrn(); + } + if (mbPlayerAttention == 0) { + mbPlayerAttention = 1; + } + mbNearPlayer = true; + } else { + if (mbPlayerAttention == 1) { + mbPlayerAttention = 0; + mLookResetTimer = l_npc_dat[mNpcNo].mLookResetTimer; + } + if (l_npc_dat[mNpcNo].mNearDist > dist) { + mLookAtPos = dNpc_playerEyePos(l_npc_dat[mNpcNo].mPlayerEyeOfsY); + mLookMode = LOOK_MODE_ATTN; + if (mbAllowBodyTurn != 0) { + mHeadOnlyFollow = false; + } else { + mHeadOnlyFollow = true; + } + if (mbLookOnly == 0) { + mLookAngleY = mHomeYRot; + mHeadOnlyFollow = false; + mLookMode = LOOK_MODE_TURN; + m_jnt.setTrn(); + } + mbNearPlayer = true; + } else { + mLookMode = LOOK_MODE_NONE; + if (!field_0x6D8) { + if (mLookResetTimer != 0) { + mLookResetTimer--; + } else { + mLookAngleY = mHomeYRot; + mHeadOnlyFollow = false; + mLookMode = LOOK_MODE_TURN; + m_jnt.setTrn(); + } + } + } + } + } + mLookAtMaxVel = l_npc_dat[mNpcNo].mLookAtMaxVel; } /* 000023D4-00002520 .text lookBack__9daNpcSv_cFv */ void daNpcSv_c::lookBack() { - /* Nonmatching */ + s16 maxTurnVel = mLookAtMaxVel; + s16 desiredYRot = current.angle.y; + cXyz* pLookAt = NULL; + cXyz lookAtPos; + cXyz dstPos = eyePos; + bool headOnlyFollow = mHeadOnlyFollow; + + switch (mLookMode) { + case LOOK_MODE_ATTN: + lookAtPos = mLookAtPos; + pLookAt = &lookAtPos; + break; + case LOOK_MODE_TURN: + desiredYRot = mLookAngleY; + break; + case LOOK_MODE_NONE: + default: + break; + } + + if (mTalkOrder && mbAllowBodyTurn) { + headOnlyFollow = false; + m_jnt.setTrn(); + } + + if (m_jnt.trnChk()) { + if (mEventCut.getTurnSpeed() != 0) { + maxTurnVel = mEventCut.getTurnSpeed(); + } + cLib_addCalcAngleS2(&mTurnVel, maxTurnVel, 4, 0x800); + } else { + mTurnVel = 0; + } + + m_jnt.lookAtTarget(¤t.angle.y, pLookAt, dstPos, desiredYRot, mTurnVel, headOnlyFollow); + shape_angle = current.angle; } /* 00002520-000025E8 .text playAnm__9daNpcSv_cFv */ void daNpcSv_c::playAnm() { - /* Nonmatching */ + mAnmFlag &= ~1; + if (mpMorf->play(NULL, 0, 0) && mpAnmDat != NULL && mAnmLoopCnt > 0) { + mAnmLoopCnt--; + if (mAnmLoopCnt == 0) { + mpAnmDat++; + if (setAnmTbl(mpAnmDat)) { + mAnmFlag |= 1; + } + } else { + setAnm(mpAnmDat->mBckIdx, J3DFrameCtrl::EMode_NONE, 0.0f); + } + } } /* 000025E8-000026C8 .text setAnm__9daNpcSv_cFUcif */ -void daNpcSv_c::setAnm(unsigned char, int, float) { - /* Nonmatching */ +void daNpcSv_c::setAnm(u8 i_bckIdx, int i_loopMode, f32 i_morf) { + if (mAnmMorfOverride >= 0.0f) { + i_morf = mAnmMorfOverride; + mAnmMorfOverride = -1.0f; + } + J3DAnmTransformKey* pAnm = (J3DAnmTransformKey*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[mNpcNo][i_bckIdx]); + mpMorf->setAnm(pAnm, i_loopMode, i_morf, 1.0f, 0.0f, -1.0f, NULL); + mBckIdx = i_bckIdx; } /* 000026C8-00002768 .text setAnmTbl__9daNpcSv_cFP9sSvAnmDat */ -void daNpcSv_c::setAnmTbl(sSvAnmDat*) { - /* Nonmatching */ +bool daNpcSv_c::setAnmTbl(sSvAnmDat* i_anmDat) { + if (i_anmDat->mBckIdx == BCK_NULL) { + mpAnmDat = NULL; + return true; + } + mpAnmDat = i_anmDat; + mAnmLoopCnt = mpAnmDat->mLoopCount; + + int loopMode = J3DFrameCtrl::EMode_LOOP; + if (mAnmLoopCnt > 0) { + loopMode = J3DFrameCtrl::EMode_NONE; + } + if (mBckIdx != mpAnmDat->mBckIdx || loopMode == J3DFrameCtrl::EMode_NONE) { + setAnm(mpAnmDat->mBckIdx, loopMode, mpAnmDat->mMorf); + } + return false; } /* 00002768-000027E0 .text setCollision__9daNpcSv_cFP8dCcD_Cyl4cXyzff */ -void daNpcSv_c::setCollision(dCcD_Cyl*, cXyz, float, float) { - /* Nonmatching */ +void daNpcSv_c::setCollision(dCcD_Cyl* i_cyl, cXyz i_center, f32 i_radius, f32 i_height) { + i_cyl->SetC(i_center); + i_cyl->SetR(i_radius); + i_cyl->SetH(i_height); + dComIfG_Ccsp()->Set(i_cyl); } /* 000027E0-0000293C .text getTalkNo__9daNpcSv_cFv */ -void daNpcSv_c::getTalkNo() { - /* Nonmatching */ +u8 daNpcSv_c::getTalkNo() { + int isGrapplingHook; + if (dComIfGs_checkGetItem(dItemNo_GRAPPLING_HOOK_e)) { + isGrapplingHook = 1; + } else { + isGrapplingHook = 0; + } + + mTalkNo = 0; + if (!(mTalkFlags & TALK_FLAG_GOT_CHART)) { + if (!(mTalkFlags & TALK_FLAG_1ST)) { + if (isGrapplingHook) { + mTalkNo = 1; + } else { + mTalkNo = 0; + } + } else if (!(mTalkFlags & TALK_FLAG_2ND)) { + if (isGrapplingHook) { + mTalkNo = 3; + } else { + mTalkNo = 2; + } + } else { + if (isGrapplingHook) { + mTalkNo = 5; + } else { + mTalkNo = 4; + } + } + } else if (!isGrapplingHook) { + if (!(mTalkFlags & TALK_FLAG_P2)) { + mTalkNo = 6; + } else { + mTalkNo = 7; + } + } else +#if VERSION <= VERSION_JPN + if (!dComIfGs_checkGetItem(dItemNo_MASTER_SWORD_1_e)) +#else + if (!dComIfGs_isCollect(0, 1)) +#endif + { + if (!(mTalkFlags & TALK_FLAG_P3)) { + mTalkNo = 8; + } else { + mTalkNo = 9; + } + } else if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2F80)) { + mTalkNo = 10; + } else { + mTalkNo = 11; + } + return mTalkNo; } /* 0000293C-00002958 .text isTalkOK__9daNpcSv_cFv */ -void daNpcSv_c::isTalkOK() { - /* Nonmatching */ +BOOL daNpcSv_c::isTalkOK() { + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e)) { + return FALSE; + } + return TRUE; } /* 00002958-00002978 .text daNpc_PeopleCreate__FPv */ @@ -254,11 +1278,8 @@ static BOOL daNpc_PeopleIsDelete(void*) { } static actor_method_class daNpc_PeopleMethodTable = { - (process_method_func)daNpc_PeopleCreate, - (process_method_func)daNpc_PeopleDelete, - (process_method_func)daNpc_PeopleExecute, - (process_method_func)daNpc_PeopleIsDelete, - (process_method_func)daNpc_PeopleDraw, + (process_method_func)daNpc_PeopleCreate, (process_method_func)daNpc_PeopleDelete, (process_method_func)daNpc_PeopleExecute, + (process_method_func)daNpc_PeopleIsDelete, (process_method_func)daNpc_PeopleDraw, }; actor_process_profile_definition g_profile_NPC_SV = { diff --git a/src/d/actor/d_a_obj_ikada.cpp b/src/d/actor/d_a_obj_ikada.cpp index 6271dd53..6515590c 100644 --- a/src/d/actor/d_a_obj_ikada.cpp +++ b/src/d/actor/d_a_obj_ikada.cpp @@ -355,17 +355,17 @@ void daObj_Ikada_c::pathMove() { /* 00000F04-00000FBC .text HandleRight__13daObj_Ikada_cFv */ void daObj_Ikada_c::HandleRight() { - m1154 += l_HIO.m20; - if (m1154 >= mBckAnm.getEndFrame()) { - m1154 = mBckAnm.getStartFrame(); + mFrame += l_HIO.m20; + if (mFrame >= mBckAnm.getEndFrame()) { + mFrame = mBckAnm.getStartFrame(); } } /* 00000FBC-00001074 .text HandleLeft__13daObj_Ikada_cFv */ void daObj_Ikada_c::HandleLeft() { - m1154 -= l_HIO.m20; - if (m1154 <= mBckAnm.getStartFrame()) { - m1154 = mBckAnm.getEndFrame(); + mFrame -= l_HIO.m20; + if (mFrame <= mBckAnm.getStartFrame()) { + mFrame = mBckAnm.getEndFrame(); } } @@ -580,7 +580,7 @@ void daObj_Ikada_c::setRopePos() { mDoMtx_stack_c::ZXYrotM(cM_atan2s(sp98.z, sp98.y) + iVar3, shape_angle.y, cM_atan2s(-sp98.x, std::sqrtf(sp98.y * sp98.y + sp98.z * sp98.z)) + iVar4); mDoMtx_stack_c::XrotM(-0x4000); - mDoMtx_stack_c::multVecZero(&m0474); + mDoMtx_stack_c::multVecZero(&mCranePos); mpRopeEnd->setBaseTRMtx(mDoMtx_stack_c::get()); f32 fVar9 = pcVar7->y; @@ -1186,7 +1186,7 @@ bool daObj_Ikada_c::_execute() { } if (mType == 4) { - mBckAnm.setFrame(m1154); + mBckAnm.setFrame(mFrame); if (REG12_S(0) != 0) { mJointRot[REG12_S(0)].x = REG12_S(1); mJointRot[REG12_S(0)].y = REG12_S(2); @@ -1467,7 +1467,7 @@ void daObj_Ikada_c::createInit() { mDoMtx_stack_c::transS(pcVar8->x, pcVar8->y, pcVar8->z); mDoMtx_stack_c::ZXYrotM((s16)cM_atan2s(sp68.z, sp68.y), shape_angle.y, (s16)cM_atan2s(-sp68.x, std::sqrtf(sp68.y * sp68.y + sp68.z * sp68.z))); mDoMtx_stack_c::XrotM(-0x4000); - mDoMtx_stack_c::multVecZero(&m0474); + mDoMtx_stack_c::multVecZero(&mCranePos); mpRopeEnd->setBaseTRMtx(mDoMtx_stack_c::get()); } |
