summaryrefslogtreecommitdiff
path: root/src/d
diff options
context:
space:
mode:
authorTeddy Heidmann <ateddy42@users.noreply.github.com>2026-10-30 15:12:10 -0700
committerGitHub <noreply@github.com>2026-10-30 18:12:10 -0400
commit9cbb155cb805ec0546a167926ef71542c485cf0a (patch)
treede14ee953051045338e6345782dcdbee10e3eaf8 /src/d
parent729d48a1c2c4bd09d54b75163788946a22f501ca (diff)
d_a_npc_sv (#1250)HEADmain
* _create * member fields * fixed padding usages * phase_1, phase_2 * data progress * l_npc_dat * small methods * eventMove * tables, callback, isTalkOK * setAnm, setAnmTbl, setCollision * getTalkNo * setAnmFromMsgTag, playAnm * eventMesSet * create fns * more fns * getMsg * execute * executeWait * privateCut * attention, talk * lookBack * GZLE01 * debug maps * enums, fix locals * GZLJ01, GZLP01 * D44J01 * fix typo * mckIdx enum
Diffstat (limited to 'src/d')
-rw-r--r--src/d/actor/d_a_npc_sv.cpp1173
-rw-r--r--src/d/actor/d_a_obj_ikada.cpp18
2 files changed, 1106 insertions, 85 deletions
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, &current.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(&current.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(&current.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());
}