/** * @file d_a_npc_grd.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "Z2AudioLib/Z2Instances.h" #include "d/actor/d_a_npc_grd.h" enum Animation { /* 0x00 */ ANM_UNK_0, /* 0x01 */ ANM_UNK_1, /* 0x02 */ ANM_UNK_2, /* 0x03 */ ANM_UNK_3, /* 0x04 */ ANM_UNK_4, /* 0x05 */ ANM_UNK_5, /* 0x06 */ ANM_UNK_6, /* 0x07 */ ANM_UNK_7, /* 0x08 */ ANM_UNK_8, /* 0x09 */ ANM_UNK_9, /* 0x0A */ ANM_UNK_10, /* 0x0B */ ANM_UNK_11, }; enum Expression { /* 0x0 */ EXPR_UNK_0 = 0, /* 0x3 */ EXPR_UNK_3 = 3, }; enum Expression_BTP { /* 0x0 */ EXPR_BTP_UNK_0, /* 0x1 */ EXPR_BTP_UNK_1, /* 0x2 */ EXPR_BTP_UNK_2, /* 0x3 */ EXPR_BTP_UNK_3, }; enum Motion { /* 0x0 */ MOT_UNK_0 = 0, /* 0x1 */ MOT_UNK_1 = 1, /* 0x3 */ MOT_UNK_4 = 4, }; enum Type { /* 0x0 */ TYPE_0, /* 0x1 */ TYPE_1, /* 0x2 */ TYPE_2, }; /* 809D3EFC-809D3F00 000054 0004+00 1/1 0/0 0/0 .bss l_HIO */ static NPC_GRD_HIO_CLASS l_HIO; /* 809D3C34-809D3C3C 000020 0008+00 1/1 0/0 0/0 .data l_bmdGetParamList */ static daNpc_GetParam1 l_bmdGetParamList[1] = { {11, 0}, }; /* 809D3C3C-809D3C9C 000028 0060+00 1/2 0/0 0/0 .data l_bckGetParamList */ static daNpc_GetParam1 l_bckGetParamList[12] = { {-1, 0}, {6, 0}, {5, 1}, {6, 1}, {4, 1}, {8, 0}, {7, 0}, {10, 1}, {11, 1}, {8, 1}, {7, 1}, {9, 1}, }; /* 809D3C9C-809D3CBC 000088 0020+00 1/1 0/0 0/0 .data l_btpGetParamList */ static daNpc_GetParam1 l_btpGetParamList[4] = { {17, 0}, {15, 1}, {16, 1}, {14, 1}, }; /* 809D3CBC-809D3CC4 0000A8 0008+00 1/2 0/0 0/0 .data l_btkGetParamList */ static daNpc_GetParam1 l_btkGetParamList[1] = { {14, 0}, }; /* 809D3CC4-809D3CCC 0000B0 0008+00 0/1 0/0 0/0 .data l_evtGetParamList */ static daNpc_GetParam1 l_evtGetParamList[1] = { {0, 0}, }; /* 809D3CCC-809D3CD8 0000B8 000C+00 1/0 0/0 0/0 .data l_loadRes_GRD_YELIA */ static int l_loadRes_GRD_YELIA[3] = { 0, 1, -1, }; /* 809D3CD8-809D3CE4 0000C4 000C+00 1/0 0/0 0/0 .data l_loadRes_GRDa */ static int l_loadRes_GRDa[3] = { 0, 1, -1, }; /* 809D3CE4-809D3CF0 0000D0 000C+00 1/0 0/0 0/0 .data l_loadRes_GRD0 */ static int l_loadRes_GRD0[3] = { 0, -1, -1, }; /* 809D3CF0-809D3CFC -00001 000C+00 2/2 0/0 0/0 .data l_loadRes_list */ static int* l_loadRes_list[3] = { l_loadRes_GRD_YELIA, l_loadRes_GRDa, l_loadRes_GRD0, }; /* 809D3CFC-809D3D04 -00001 0008+00 6/8 0/0 0/0 .data l_resNames */ static char* l_resNames[2] = { "grD", "grD1", }; /* 809D3D04-809D3D08 0000F0 0004+00 0/1 0/0 0/0 .data l_evtNames */ static char* l_evtNames[1] = { NULL, }; /* 809D3D08-809D3D0C -00001 0004+00 0/1 0/0 0/0 .data l_myName */ static char* l_myName = "grD"; /* 809D3D0C-809D3D14 -00001 0008+00 0/1 0/0 0/0 .data mEvtCutNameList__11daNpc_Grd_c */ char* daNpc_Grd_c::mEvtCutNameList[2] = { "", "NOD_TO_GRZ", }; /* 809D3D20-809D3D38 00010C 0018+00 1/2 0/0 0/0 .data mEvtCutList__11daNpc_Grd_c */ daNpc_Grd_c::cutFunc daNpc_Grd_c::mEvtCutList[2] = { NULL, &daNpc_Grd_c::ECut_nodToGrz, }; /* 809CFD2C-809CFEB0 0000EC 0184+00 1/1 0/0 0/0 .text __ct__11daNpc_Grd_cFv */ daNpc_Grd_c::daNpc_Grd_c() {} /* 809CFF40-809D0140 000300 0200+00 1/0 0/0 0/0 .text __dt__11daNpc_Grd_cFv */ daNpc_Grd_c::~daNpc_Grd_c() { for (int i = 0; l_loadRes_list[mType][i] >= 0; i++) { dComIfG_resDelete(&mPhase[i], l_resNames[l_loadRes_list[mType][i]]); } if (heap != NULL) { mAnm_p->stopZelAnime(); } } /* 809D3A04-809D3A70 000000 006C+00 13/13 0/0 0/0 .rodata m__17daNpc_Grd_Param_c */ const daNpc_Grd_HIOParam daNpc_Grd_Param_c::m = { 230.0f, // attention_offset -3.0f, // gravity 1.0f, // scale 600.0f, // real_shadow_size 255.0f, // weight 240.0f, // height 35.0f, // knee_length 100.0f, // width 0.0f, // body_angleX_max 0.0f, // body_angleX_min 10.0f, // body_angleY_max -10.0f, // body_angleY_min 30.0f, // head_angleX_max -30.0f, // head_angleX_min 45.0f, // head_angleY_max -45.0f, // head_angleY_min 0.6f, // neck_rotation_ratio 12.0f, // morf_frame 5, // talk_distance 6, // talk_angle 7, // attention_distance 6, // attention_angle 180.0f, // fov 500.0f, // search_distance 300.0f, // search_height -300.0f, // search_depth 60, // attention_time 8, // damage_time 0, // face_expression 0, // motion 0, // look_mode 0, // debug_mode_ON 0, // debug_info_ON }; /* 809D0140-809D0414 000500 02D4+00 1/1 0/0 0/0 .text create__11daNpc_Grd_cFv */ int daNpc_Grd_c::create() { fopAcM_ct(this, daNpc_Grd_c); mType = getTypeFromParam(); if (home.angle.x != 0xffff) { mFlowID = home.angle.x; } else { mFlowID = -1; } if (isDelete()) { return cPhs_ERROR_e; } int phase; int i = 0, j = 0; for (; l_loadRes_list[mType][j] >= 0; j++) { phase = dComIfG_resLoad(&mPhase[j], l_resNames[l_loadRes_list[mType][j]]); if (phase == cPhs_ERROR_e || phase == cPhs_UNK3_e) { return cPhs_ERROR_e; } if (phase == cPhs_COMPLEATE_e) { i++; } } if (i == j) { if (!fopAcM_entrySolidHeap(this, &daNpc_Grd_c::createHeapCallBack, 0x3A50)) { return cPhs_ERROR_e; } fopAcM_SetMtx(this, mAnm_p->getModel()->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -300.0f, -50.0f, -300.0f, 300.0f, 450.0f, 300.0f); mSound.init(¤t.pos, &eyePos, 3, 1); mAcchCir.SetWall(mpHIO->m.common.width, mpHIO->m.common.knee_length); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this)); mCcStts.Init(mpHIO->m.common.weight, 0, this); mCyl.Set(mCcDCyl); mCyl.SetStts(&mCcStts); mCyl.SetTgHitCallback(tgHitCallBack); mAcch.CrrPos(dComIfG_Bgsp()); mGndChk = mAcch.m_gnd; mGroundH = mAcch.GetGroundH(); setEnvTevColor(); setRoomNo(); reset(); Execute(); return cPhs_COMPLEATE_e; } return cPhs_INIT_e; } /* 809D0414-809D069C 0007D4 0288+00 1/1 0/0 0/0 .text CreateHeap__11daNpc_Grd_cFv */ int daNpc_Grd_c::CreateHeap() { J3DModelData* mdlData_p = NULL; if (l_bmdGetParamList[0].fileIdx >= 0) { mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNames[l_bmdGetParamList[0].arcIdx], l_bmdGetParamList[0].fileIdx); } mAnm_p = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, 0x11020284); if (mAnm_p != NULL && mAnm_p->getModel() == NULL) { mAnm_p->stopZelAnime(); mAnm_p = NULL; } if (mAnm_p == NULL) { return 0; } J3DModel* model = mAnm_p->getModel(); for (u16 i = 0; i < mdlData_p->getJointNum(); i++) { mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack); } model->setUserArea((uintptr_t)this); mpMatAnm = new daNpcF_MatAnm_c(); if (mpMatAnm == NULL) { return false; } if (!setExpressionAnm(ANM_UNK_1, false)) { return 0; } setMotionAnm(ANM_UNK_5, 0.0f); return 1; } /* 809D0858-809D088C 000C18 0034+00 1/1 0/0 0/0 .text Delete__11daNpc_Grd_cFv */ int daNpc_Grd_c::Delete() { this->~daNpc_Grd_c(); return 1; } /* 809D088C-809D08AC 000C4C 0020+00 2/2 0/0 0/0 .text Execute__11daNpc_Grd_cFv */ int daNpc_Grd_c::Execute() { return execute(); } /* 809D08AC-809D093C 000C6C 0090+00 1/1 0/0 0/0 .text Draw__11daNpc_Grd_cFv */ int daNpc_Grd_c::Draw() { mAnm_p->getModel()->getModelData()->getMaterialNodePointer(1)->setMaterialAnm(mpMatAnm); return draw(chkAction(&daNpc_Grd_c::test), FALSE, mpHIO->m.common.real_shadow_size, NULL, FALSE); } /* 809D093C-809D0B70 000CFC 0234+00 1/1 0/0 0/0 .text * ctrlJoint__11daNpc_Grd_cFP8J3DJointP8J3DModel */ int daNpc_Grd_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { int joint_no = i_joint->getJntNo(); int lookat_joints[3] = {1, 3, 4}; if (joint_no == 0) { mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(1)); mDoMtx_stack_c::multVecZero(&mLookatPos[0]); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(3)); mDoMtx_stack_c::multVecZero(&mLookatPos[1]); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(4)); mDoMtx_stack_c::multVecZero(&mLookatPos[2]); } mDoMtx_stack_c::copy(i_model->getAnmMtx(joint_no)); switch (joint_no) { case 1: case 3: case 4: setLookatMtx(joint_no, lookat_joints, mpHIO->m.common.neck_rotation_ratio); break; } if (joint_no == 1) { mDoMtx_stack_c::YrotM(-field_0x908[0].z); mDoMtx_stack_c::ZrotM(field_0x908[0].x); } else if (joint_no == 4) { mDoMtx_stack_c::YrotM(-field_0x908[2].z); mDoMtx_stack_c::ZrotM(field_0x908[2].x); } i_model->setAnmMtx(joint_no, mDoMtx_stack_c::get()); cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); if ((joint_no == 4 || joint_no == 7) && (mAnmFlags & ANM_PLAY_BCK)) { J3DAnmTransform* bckAnm = mBckAnm.getBckAnm(); mBckAnm.changeBckOnly(mAnm_p->getAnm()); mAnm_p->changeAnm(bckAnm); } return 1; } /* 809D0B70-809D0B90 000F30 0020+00 1/1 0/0 0/0 .text * createHeapCallBack__11daNpc_Grd_cFP10fopAc_ac_c */ int daNpc_Grd_c::createHeapCallBack(fopAc_ac_c* a_this) { daNpc_Grd_c* i_this = (daNpc_Grd_c*)a_this; return i_this->CreateHeap(); } /* 809D0B90-809D0BDC 000F50 004C+00 2/2 0/0 0/0 .text ctrlJointCallBack__11daNpc_Grd_cFP8J3DJointi */ int daNpc_Grd_c::ctrlJointCallBack(J3DJoint* i_joint, int param_2) { if (param_2 == 0) { J3DModel* model = j3dSys.getModel(); daNpc_Grd_c* i_this = (daNpc_Grd_c*)model->getUserArea(); if (i_this != NULL) { i_this->ctrlJoint(i_joint, model); } } return 1; } /* 809D0BDC-809D0D1C 000F9C 0140+00 1/0 0/0 0/0 .text setParam__11daNpc_Grd_cFv */ void daNpc_Grd_c::setParam() { actionFunc action = mNextAction; u32 uVar1 = (fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e); selectAction(); if (!mTwilight && daPy_py_c::checkNowWolf()) { uVar1 = 0; } if (mNextAction != action) { for (int i = 3; i < 3; i++) { mActorMngr[i].initialize(); } } field_0xe00 = 0; field_0xe04 = 0; s16 talk_distance = mpHIO->m.common.talk_distance; s16 talk_angle = mpHIO->m.common.talk_angle; attention_info.distances[fopAc_attn_LOCK_e] = getDistTableIdx(mpHIO->m.common.attention_distance, mpHIO->m.common.attention_angle); attention_info.distances[fopAc_attn_TALK_e] = attention_info.distances[fopAc_attn_LOCK_e]; attention_info.distances[fopAc_attn_SPEAK_e] = getDistTableIdx(talk_distance, talk_angle); attention_info.flags = uVar1; scale.set(mpHIO->m.common.scale, mpHIO->m.common.scale, mpHIO->m.common.scale); mAcchCir.SetWallR(mpHIO->m.common.width); mAcchCir.SetWallH(mpHIO->m.common.knee_length); gravity = mpHIO->m.common.gravity; } /* 809D0D1C-809D0E9C 0010DC 0180+00 1/0 0/0 0/0 .text main__11daNpc_Grd_cFv */ BOOL daNpc_Grd_c::main() { if (!doEvent()) { doNormalAction(1); } if (checkHide()) { attention_info.flags = 0; } if (!mpHIO->m.common.debug_mode_ON && (!dComIfGp_event_runCheck() || (mOrderNewEvt && dComIfGp_getEvent().isOrderOK()))) { if (mOrderEvtNo != 0) { eventInfo.setArchiveName(l_resNames[l_evtGetParamList[mOrderEvtNo].arcIdx]); } orderEvent(mOrderSpeakEvt, l_evtNames[l_evtGetParamList[mOrderEvtNo].fileIdx], 0xFFFF, 40, 0xFF, 1); } if (field_0x9ee) { mExpressionMorfOverride = 0.0f; mMotionMorfOverride = 0.0f; field_0x9ee = false; } playExpression(); playMotion(); return TRUE; } /* 809D0E9C-809D0F7C 00125C 00E0+00 1/0 0/0 0/0 .text ctrlBtk__11daNpc_Grd_cFv */ BOOL daNpc_Grd_c::ctrlBtk() { if (mpMatAnm != NULL) { J3DAnmTextureSRTKey* btk = NULL; if (l_btkGetParamList[0].fileIdx >= 0) { btk = getTexSRTKeyAnmP(l_resNames[l_btkGetParamList[0].arcIdx], l_btkGetParamList[0].fileIdx); } if (btk == mBtkAnm.getBtkAnm()) { mpMatAnm->setNowOffsetX(cM_ssin(mEyeAngle.y) * 0.02f * -1.0f); mpMatAnm->setNowOffsetY(cM_ssin(mEyeAngle.x) * 0.02f); mpMatAnm->onEyeMoveFlag(); return TRUE; } mpMatAnm->offEyeMoveFlag(); } return FALSE; } /* 809D0F7C-809D14BC 00133C 0540+00 1/0 0/0 0/0 .text setAttnPos__11daNpc_Grd_cFv */ void daNpc_Grd_c::setAttnPos() { static cXyz eyeOffset(20.0f, 30.0f, 0.0f); cXyz* attnPos = NULL; cXyz sp7c, sp88, sp94, spa0; f32 attention_offset = mpHIO->m.common.attention_offset; f32 fVar1 = 0.0f; f32 fVar2 = 0.0f; mDoMtx_stack_c::YrotS(field_0x990); cLib_addCalc2(&field_0x984[0], 0.0f, 0.1f, 125.0f); cLib_addCalc2(&field_0x984[2], 0.0f, 0.1f, 125.0f); for (int i = 0; i < 3; i++) { sp94.set(0.0f, 0.0f, field_0x984[i] * cM_ssin(field_0x992)); mDoMtx_stack_c::multVec(&sp94, &spa0); field_0x908[i].x = -spa0.z; field_0x908[i].z = -spa0.x; } cLib_chaseS(&field_0x992, 0, 0x555); if (mLookMode == LOOK_RESET) { for (int i = 0; i < 3; i++) { mLookatAngle[i].setall(0); } } J3DModelData* modelData = mAnm_p->getModel()->getModelData(); for (u16 i = 0; i < modelData->getJointNum(); i++) { modelData->getJointNodePointer(i)->setCallBack(ctrlJointCallBack); } setMtx(); lookat(); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(4)); mDoMtx_stack_c::multVecZero(&mHeadPos); mDoMtx_stack_c::multVec(&eyeOffset, &eyePos); eyeOffset.x = 0.0f; mDoMtx_stack_c::multVec(&eyeOffset, &sp94); mHeadAngle.x = cLib_targetAngleX(&mHeadPos, &sp94); mHeadAngle.y = cLib_targetAngleY(&mHeadPos, &sp94); attnPos = mLookat.getAttnPos(); if (attnPos != NULL) { sp88 = *attnPos - eyePos; mEyeAngle.y = -mLookatAngle[2].y - mCurAngle.y; mEyeAngle.y += cM_atan2s(sp88.x, sp88.z); mEyeAngle.x = -cM_atan2s(sp88.y, sp88.absXZ()); } else { mEyeAngle.y = 0; mEyeAngle.x = 0; } sp88.set(0.0f, 0.0f, 0.0f); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(mCurAngle.x, mCurAngle.y, mCurAngle.z); mDoMtx_stack_c::multVec(&sp88, &sp7c); attention_info.position.set(sp7c.x, sp7c.y + attention_offset, sp7c.z); if (!mHide && !mTwilight) { if (!mIsDamaged) { mCyl.SetTgType(0xD8FBFDFF); mCyl.SetTgSPrm(0x1F); mCyl.OnTgNoHitMark(); } else { mCyl.SetTgType(0); mCyl.SetTgSPrm(0); } mCyl.SetC(sp7c); mCyl.SetH(mpHIO->m.common.height + fVar1); mCyl.SetR(mpHIO->m.common.width + fVar2); dComIfG_Ccsp()->Set(&mCyl); } mCyl.ClrTgHit(); } /* 809D14BC-809D1670 00187C 01B4+00 1/0 0/0 0/0 .text setExpressionAnm__11daNpc_Grd_cFib */ bool daNpc_Grd_c::setExpressionAnm(int i_idx, bool i_modify) { J3DAnmTransform* anm = NULL; int attr = J3DFrameCtrl::EMode_NONE; mAnmFlags &= ~ANM_EXPRESSION_FLAGS; if (l_bckGetParamList[i_idx].fileIdx >= 0) { anm = getTrnsfrmKeyAnmP(l_resNames[l_bckGetParamList[i_idx].arcIdx], l_bckGetParamList[i_idx].fileIdx); } bool bVar1 = false; switch (i_idx) { case ANM_UNK_0: bVar1 = setExpressionBtp(EXPR_BTP_UNK_0); break; case ANM_UNK_1: bVar1 = setExpressionBtp(EXPR_BTP_UNK_0); break; case ANM_UNK_2: bVar1 = setExpressionBtp(EXPR_BTP_UNK_1); break; case ANM_UNK_3: bVar1 = setExpressionBtp(EXPR_BTP_UNK_2); attr = J3DFrameCtrl::EMode_LOOP; break; case ANM_UNK_4: bVar1 = setExpressionBtp(EXPR_BTP_UNK_3); break; default: anm = NULL; break; } if (!bVar1) { return false; } if (anm == NULL) { return true; } if (setBckAnm(anm, 1.0f, attr, 0, -1, i_modify)) { mAnmFlags |= ANM_PAUSE_BCK | ANM_PLAY_BCK; mExpressionLoops = 0; return true; } return false; } /* 809D1670-809D1794 001A30 0124+00 1/0 0/0 0/0 .text setExpressionBtp__11daNpc_Grd_cFi */ bool daNpc_Grd_c::setExpressionBtp(int i_idx) { J3DAnmTexPattern* anm = NULL; int attr = J3DFrameCtrl::EMode_NONE; mAnmFlags &= ~(ANM_PLAY_BTP | ANM_PAUSE_BTP | ANM_FLAG_800); if (l_btpGetParamList[i_idx].fileIdx >= 0) { anm = getTexPtrnAnmP(l_resNames[l_btpGetParamList[i_idx].arcIdx], l_btpGetParamList[i_idx].fileIdx); } switch (i_idx) { case EXPR_BTP_UNK_0: attr = J3DFrameCtrl::EMode_LOOP; break; case EXPR_BTP_UNK_1: break; case EXPR_BTP_UNK_2: attr = J3DFrameCtrl::EMode_LOOP; break; case EXPR_BTP_UNK_3: break; default: anm = NULL; break; } if (anm == NULL) { return true; } if (setBtpAnm(anm, mAnm_p->getModel()->getModelData(), 1.0f, attr)) { mAnmFlags |= ANM_PAUSE_BTP | ANM_PLAY_BTP; if (i_idx == 0) { mAnmFlags |= ANM_FLAG_800; } return true; } return false; } /* 809D1794-809D17C0 001B54 002C+00 1/0 0/0 0/0 .text setExpression__11daNpc_Grd_cFif */ void daNpc_Grd_c::setExpression(int i_expression, f32 i_morf) { if (i_expression >= 0 && i_expression < 4) { mExpression = i_expression; mExpressionMorfOverride = i_morf; mExpressionPrevPhase = -1; mExpressionPhase = 0; } } /* 809D17C0-809D1940 001B80 0180+00 1/0 0/0 0/0 .text setMotionAnm__11daNpc_Grd_cFif */ void daNpc_Grd_c::setMotionAnm(int i_idx, f32 i_morf) { J3DAnmTransformKey* anm = NULL; J3DAnmTextureSRTKey* btk = NULL; int attr = J3DFrameCtrl::EMode_LOOP; mAnmFlags &= ~ANM_MOTION_FLAGS; if (l_bckGetParamList[i_idx].fileIdx >= 0) { anm = getTrnsfrmKeyAnmP(l_resNames[l_bckGetParamList[i_idx].arcIdx], l_bckGetParamList[i_idx].fileIdx); } switch (i_idx) { case ANM_UNK_5: case ANM_UNK_8: break; case ANM_UNK_6: case ANM_UNK_7: case ANM_UNK_9: case ANM_UNK_10: case ANM_UNK_11: attr = J3DFrameCtrl::EMode_NONE; break; default: anm = NULL; btk = NULL; break; } if (l_btkGetParamList[0].fileIdx >= 0) { btk = getTexSRTKeyAnmP(l_resNames[l_btkGetParamList[0].arcIdx], l_btkGetParamList[0].fileIdx); } if (btk != NULL && setBtkAnm(btk, mAnm_p->getModel()->getModelData(), 1.0f, J3DFrameCtrl::EMode_LOOP)) { mAnmFlags |= ANM_PAUSE_BTK | ANM_PLAY_BTK; } if (anm != NULL && setMcaMorfAnm(anm, 1.0f, i_morf, attr, 0, -1)) { mAnmFlags |= ANM_PLAY_MORF | ANM_PAUSE_MORF; mMotionLoops = 0; } } /* 809D1940-809D1984 001D00 0044+00 1/0 0/0 0/0 .text setMotion__11daNpc_Grd_cFifi */ void daNpc_Grd_c::setMotion(int param_0, f32 param_1, int param_2) { s16 var_r31 = param_0; if ((param_2 != 0 || mMotion != var_r31) && param_0 >= 0 && param_0 < 6) { mMotion = var_r31; mMotionMorfOverride = param_1; mMotionPrevPhase = -1; mMotionPhase = 0; } } /* 809D1984-809D198C 001D44 0008+00 1/0 0/0 0/0 .text drawDbgInfo__11daNpc_Grd_cFv */ BOOL daNpc_Grd_c::drawDbgInfo() { return FALSE; } /* 809D198C-809D1990 001D4C 0004+00 1/0 0/0 0/0 .text drawOtherMdls__11daNpc_Grd_cFv */ void daNpc_Grd_c::drawOtherMdls() { /* empty function */ } /* 809D1990-809D19B0 001D50 0020+00 1/1 0/0 0/0 .text getTypeFromParam__11daNpc_Grd_cFv */ u8 daNpc_Grd_c::getTypeFromParam() { switch (fopAcM_GetParam(this) & 0xFF) { case 0: return TYPE_0; } return TYPE_1; } /* 809D19B0-809D1A1C 001D70 006C+00 1/1 0/0 0/0 .text isDelete__11daNpc_Grd_cFv */ int daNpc_Grd_c::isDelete() { if (mType == TYPE_2 || mType == TYPE_1) { return FALSE; } if (mType == TYPE_0 && /* dSv_event_flag_c::F_0267 - Temple of Time - Temple of Time clear */ daNpcF_chkEvtBit(0x10B) && /* dSv_event_flag_c::F_288 - [cutscene: ] Ilia gets her memories back */ !daNpcF_chkEvtBit(0x120)) { return FALSE; } return TRUE; } /* 809D1A1C-809D1B9C 001DDC 0180+00 1/1 0/0 0/0 .text reset__11daNpc_Grd_cFv */ void daNpc_Grd_c::reset() { initialize(); mpMatAnm->initialize(); mLookat.initialize(); for (int i = 0; i < 3; i++) { mActorMngr[i].initialize(); } mNextAction = NULL; mAction = NULL; field_0xe00 = 0; field_0xe04 = 0; field_0xe08 = 0; field_0xe0c = 0; mLookMode = -1; mMode = 0; current.pos = home.pos; old.pos = current.pos; current.angle.set(0, home.angle.y, 0); old.angle = current.angle; shape_angle = current.angle; mCurAngle = current.angle; mOldAngle = mCurAngle; speedF = 0.0f; speed.setall(0.0f); field_0x9ee = true; } /* 809D1B9C-809D1D00 001F5C 0164+00 1/1 0/0 0/0 .text playExpression__11daNpc_Grd_cFv */ void daNpc_Grd_c::playExpression() { daNpcF_anmPlayData dat0 = {ANM_UNK_1, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1a = {ANM_UNK_2, mpHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat1b = {ANM_UNK_3, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[2] = {&dat1a, &dat1b}; daNpcF_anmPlayData dat2 = {ANM_UNK_4, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat2[1] = {&dat2}; daNpcF_anmPlayData dat3 = {ANM_UNK_0, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat3[1] = {&dat3}; daNpcF_anmPlayData** ppDat[] = { pDat0, pDat1, pDat2, pDat3, }; if (mExpression >= 0 && mExpression < 4) { playExpressionAnm(ppDat); } } /* 809D1D00-809D1F50 0020C0 0250+00 1/1 0/0 0/0 .text playMotion__11daNpc_Grd_cFv */ void daNpc_Grd_c::playMotion() { daNpcF_anmPlayData dat0 = {ANM_UNK_5, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1a = {ANM_UNK_7, mpHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat1b = {ANM_UNK_8, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[2] = {&dat1a, &dat1b}; daNpcF_anmPlayData dat2a = {ANM_UNK_9, mpHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat2b = {ANM_UNK_5, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat2[2] = {&dat2a, &dat2b}; daNpcF_anmPlayData dat3a = {ANM_UNK_10, mpHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat3b = {ANM_UNK_5, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat3[2] = {&dat3a, &dat3b}; daNpcF_anmPlayData dat4a = {ANM_UNK_11, mpHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat4b = {ANM_UNK_5, mpHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat4[2] = {&dat4a, &dat4b}; daNpcF_anmPlayData dat5 = {ANM_UNK_6, 3.0f, 0}; daNpcF_anmPlayData* pDat5[1] = {&dat5}; daNpcF_anmPlayData** ppDat[6] = { pDat0, pDat1, pDat2, pDat3, pDat4, pDat5, }; if (mMotion >= 0 && mMotion < 6) { playMotionAnm(ppDat); } } /* 809D1F50-809D1F7C 002310 002C+00 2/2 0/0 0/0 .text * chkAction__11daNpc_Grd_cFM11daNpc_Grd_cFPCvPvPv_i */ int daNpc_Grd_c::chkAction(actionFunc i_action) { return mAction == i_action; } /* 809D1F7C-809D2024 00233C 00A8+00 2/2 0/0 0/0 .text * setAction__11daNpc_Grd_cFM11daNpc_Grd_cFPCvPvPv_i */ int daNpc_Grd_c::setAction(actionFunc i_action) { mMode = 3; if (mAction) { (this->*mAction)(NULL); } mMode = 0; mAction = i_action; if (mAction) { (this->*mAction)(NULL); } return TRUE; } /* 809D2024-809D20A4 0023E4 0080+00 1/1 0/0 0/0 .text selectAction__11daNpc_Grd_cFv */ int daNpc_Grd_c::selectAction() { mNextAction = NULL; if (mpHIO->m.common.debug_mode_ON) { mNextAction = &daNpc_Grd_c::test; } else { mNextAction = &daNpc_Grd_c::wait; } return TRUE; } /* 809D20A4-809D21B8 002464 0114+00 1/1 0/0 0/0 .text doNormalAction__11daNpc_Grd_cFi */ void daNpc_Grd_c::doNormalAction(int param_1) { if (param_1 != 0 && hitChk2(&mCyl, TRUE, FALSE)) { int timer; if (mCutType == daPy_py_c::CUT_TYPE_TURN_RIGHT) { timer = 20; } else { timer = mpHIO->m.common.damage_time; } setDamage(timer, 3, 0); setLookMode(LOOK_RESET); } else if (mIsDamaged && mDamageTimer == 0) { mMode = 0; mIsDamaged = false; } mOrderEvtNo = 0; if (mNextAction) { if (mAction == mNextAction) { (this->*mAction)(NULL); } else { setAction(mNextAction); } } } /* 809D21B8-809D2470 002578 02B8+00 1/1 0/0 0/0 .text doEvent__11daNpc_Grd_cFv */ BOOL daNpc_Grd_c::doEvent() { BOOL rv = FALSE; if (dComIfGp_event_runCheck() != 0) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); if (eventInfo.mCommand == 1 || eventInfo.mCommand == 2) { mOrderNewEvt = false; } if (eventInfo.checkCommandTalk()) { if (chkAction(&daNpc_Grd_c::talk)) { (this->*mAction)(NULL); } else if (dComIfGp_event_chkTalkXY() == 0 || dComIfGp_evmng_ChkPresentEnd()) { setAction(&daNpc_Grd_c::talk); } rv = TRUE; } else { int staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { mStaffID = staffId; int evtCutNo = eventManager.getMyActIdx(staffId, &mEvtCutNameList[0], 2, 0, 0); if ((this->*mEvtCutList[evtCutNo])(staffId)) { eventManager.cutEnd(staffId); } rv = TRUE; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx) != 0) { dComIfGp_event_reset(); mOrderEvtNo = 0; mEventIdx = -1; } } int msg_timer, expression, motion; msg_timer = mMsgTimer; if (ctrlMsgAnm(expression, motion, this, FALSE) != 0) { if (!field_0x9eb) { setExpression(expression, -1.0f); setMotion(motion, -1.0f, 0); } } else if (msg_timer != 0 && !field_0x9eb) { setExpressionTalkAfter(); } } else { mMsgTimer = 0; if (mStaffID != -1) { mAction = NULL; mStaffID = -1; } } return rv; } /* 809D2470-809D2494 002830 0024+00 5/5 0/0 0/0 .text setLookMode__11daNpc_Grd_cFi */ void daNpc_Grd_c::setLookMode(int i_lookMode) { if (i_lookMode >= 0 && i_lookMode < 6 && i_lookMode != mLookMode) { mLookMode = i_lookMode; } } /* 809D2494-809D2730 002854 029C+00 1/1 0/0 0/0 .text lookat__11daNpc_Grd_cFv */ void daNpc_Grd_c::lookat() { daPy_py_c* player = NULL; J3DModel* model = mAnm_p->getModel(); BOOL snap = FALSE; f32 body_angleX_min = mpHIO->m.common.body_angleX_min; f32 body_angleX_max = mpHIO->m.common.body_angleX_max; f32 body_angleY_min = mpHIO->m.common.body_angleY_min; f32 body_angleY_max = mpHIO->m.common.body_angleY_max; f32 head_angleX_min = mpHIO->m.common.head_angleX_min; f32 head_angleX_max = mpHIO->m.common.head_angleX_max; f32 head_angleY_min = mpHIO->m.common.head_angleY_min; f32 head_angleY_max = mpHIO->m.common.head_angleY_max; s16 angle_delta = mCurAngle.y - mOldAngle.y; cXyz lookatPos[3] = {mLookatPos[0], mLookatPos[1], mLookatPos[2]}; csXyz* lookatAngle[3] = {&mLookatAngle[0], &mLookatAngle[1], &mLookatAngle[2]}; cXyz spe8; switch (mLookMode) { case LOOK_NONE: break; case LOOK_RESET: snap = TRUE; break; case LOOK_PLAYER: case LOOK_PLAYER_TALK: player = daPy_getPlayerActorClass(); if (mLookMode != LOOK_PLAYER_TALK) { break; } head_angleY_min = -80.0f; head_angleY_max = 80.0f; break; case LOOK_ACTOR: player = (daPy_py_c*)mActorMngr[1].getActorP(); break; case LOOK_ATTN: player = (daPy_py_c*)mActorMngr[2].getActorP(); break; } if (player != NULL) { mLookPos = player->attention_info.position; if (mLookMode != LOOK_PLAYER && mLookMode != LOOK_PLAYER_TALK && mLookMode != LOOK_ACTOR) { mLookPos.y -= 40.0f; } mLookat.setAttnPos(&mLookPos); } else { mLookat.setAttnPos(NULL); } mLookat.setParam(body_angleX_min, body_angleX_max, body_angleY_min, body_angleY_max, 0.0f, 0.0f, 0.0f, 0.0f, head_angleX_min, head_angleX_max, head_angleY_min, head_angleY_max, mCurAngle.y, lookatPos); mLookat.calc(this, model->getBaseTRMtx(), lookatAngle, snap, angle_delta, FALSE); } /* 809D2730-809D2768 002AF0 0038+00 1/1 0/0 0/0 .text setExpressionTalkAfter__11daNpc_Grd_cFv */ void daNpc_Grd_c::setExpressionTalkAfter() { setExpression(EXPR_UNK_3, -1.0f); } /* 809D2768-809D2970 002B28 0208+00 1/0 0/0 0/0 .text wait__11daNpc_Grd_cFPv */ int daNpc_Grd_c::wait(void* param_1) { switch (mMode) { case 0: setExpression(EXPR_UNK_3, -1.0f); setMotion(MOT_UNK_0, -1.0f, 0); setLookMode(LOOK_NONE); mTurnMode = 0; mMode = 2; // fallthrough case 2: if (!mIsDamaged) { BOOL bVar1 = mActorMngr[0].getActorP() != NULL; if (chkFindPlayer2(bVar1, shape_angle.y)) { if (!bVar1) { mActorMngr[0].entry(daPy_getPlayerActorClass()); mTurnMode = 0; } } else if (bVar1) { mActorMngr[0].remove(); mTurnMode = 0; } if (mActorMngr[0].getActorP() != NULL) { setLookMode(LOOK_PLAYER); } else { setLookMode(LOOK_NONE); if (home.angle.y != mCurAngle.y && step(home.angle.y, 3, 5, 15)) { mMode = 0; } } if (home.angle.y == mCurAngle.y) { fopAc_ac_c* actor_p = getAttnActorP( NULL != mActorMngr[0].getActorP(), srchAttnActor1, mpHIO->m.common.search_distance, mpHIO->m.common.search_height, mpHIO->m.common.search_depth, mpHIO->m.common.fov, shape_angle.y, 120, 1); if (actor_p != NULL) { mActorMngr[1].entry(actor_p); setLookMode(LOOK_ACTOR); } } else { mAttnChangeTimer = 0; } } break; case 3: break; } return TRUE; } /* 809D2970-809D2B20 002D30 01B0+00 2/0 0/0 0/0 .text talk__11daNpc_Grd_cFPv */ int daNpc_Grd_c::talk(void* param_1) { BOOL rv = FALSE; BOOL bVar1 = FALSE; switch (mMode) { case 0: if (mIsDamaged) { break; } initTalk(mFlowID, NULL); mTurnMode = 0; mMode = 2; // fallthrough case 2: if (field_0x9ea) { bVar1 = TRUE; } else { setLookMode(LOOK_PLAYER_TALK); mActorMngr[0].entry(daPy_getPlayerActorClass()); if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { bVar1 = TRUE; } else if (step(fopAcM_searchPlayerAngleY(this), 3, 5, 15)) { setExpression(EXPR_UNK_3, -1.0f); setMotion(MOT_UNK_0, -1.0f, 0); mTurnMode = 0; } } if (bVar1 && talkProc(NULL, TRUE, NULL)) { rv = TRUE; } if (rv) { mMode = 3; if (!field_0x9ec) { dComIfGp_event_reset(); } field_0x9ec = false; } break; case 3: break; } return rv; } /* 809D2B20-809D2C04 002EE0 00E4+00 2/0 0/0 0/0 .text test__11daNpc_Grd_cFPv */ int daNpc_Grd_c::test(void* param_1) { switch (mMode) { case 0: speedF = 0.0f; speed.setall(0.0f); mMode = 2; // fallthrough case 2: if (mpHIO->m.common.face_expression != mExpression) { setExpression(mpHIO->m.common.face_expression, mpHIO->m.common.morf_frame); } setMotion(mpHIO->m.common.motion, mpHIO->m.common.morf_frame, 0); setLookMode(mpHIO->m.common.look_mode); mOrderEvtNo = 0; attention_info.flags = 0; break; case 3: break; } return TRUE; } /* 809D2C04-809D2C50 002FC4 004C+00 1/1 0/0 0/0 .text s_sub1__FPvPv */ static void* s_sub1(void* i_actor, void* i_data) { if (fopAc_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_NPC_GRZ) { return i_actor; } return NULL; } /* 809D2C50-809D2C9C 003010 004C+00 1/1 0/0 0/0 .text s_sub2__FPvPv */ static void* s_sub2(void* i_actor, void* i_data) { if (fopAc_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_NPC_YELIA) { return i_actor; } return NULL; } /* 809D2C9C-809D3058 00305C 03BC+00 1/0 0/0 0/0 .text ECut_nodToGrz__11daNpc_Grd_cFi */ BOOL daNpc_Grd_c::ECut_nodToGrz(int i_staffId) { fopAc_ac_c* actor_p; dEvent_manager_c& eventManager = dComIfGp_getEventManager(); daPy_py_c* player = daPy_getPlayerActorClass(); int rv = 0; int prm = -1; int timer = 0; int* piVar1 = NULL; piVar1 = dComIfGp_evmng_getMyIntegerP(i_staffId, "prm"); if (piVar1 != NULL) { prm = *piVar1; } piVar1 = dComIfGp_evmng_getMyIntegerP(i_staffId, "timer"); if (piVar1 != NULL) { timer = *piVar1; } if (eventManager.getIsAddvance(i_staffId)) { switch (prm) { case 0: case 20: actor_p = (fopAc_ac_c*)fpcM_Search(s_sub2, this); mActorMngr[2].entry(actor_p); setLookMode(LOOK_NONE); mEventTimer = timer; break; case 10: actor_p = (fopAc_ac_c*)fpcM_Search(s_sub1, this); mActorMngr[2].entry(actor_p); setLookMode(LOOK_ATTN); break; case 11: break; case 30: case 99: setExpression(EXPR_UNK_3, 0.0f); setMotion(MOT_UNK_0, 0.0f, 1); setLookMode(LOOK_RESET); setAngle(home.angle.y); break; } } s16 angleY; switch (prm) { case 0: case 20: if (cLib_calcTimer(&mEventTimer) == 0) { actor_p = mActorMngr[2].getActorP(); if (prm == 20) { actor_p = daPy_getPlayerActorClass(); } setLookMode(LOOK_ATTN); if (prm == 20) { setLookMode(LOOK_PLAYER); } angleY = fopAcM_searchActorAngleY(this, actor_p); if (angleY == mCurAngle.y) { mTurnMode = 0; rv = 1; } else if (step(angleY, 3, 5, 15)) { mTurnMode = 0; setMotion(MOT_UNK_0, -1.0f, 0); setExpression(EXPR_UNK_3, -1.0f); } if (prm == 20) { shape_angle.y = angleY; } } break; case 10: actor_p = mActorMngr[2].getActorP(); angleY = fopAcM_searchActorAngleY(this, actor_p); if (angleY == mCurAngle.y) { mTurnMode = 0; if (mMotion == 4 && mMotionPhase > 0) { rv = 1; } } else if (step(angleY, 3, 5, 15)) { mTurnMode = 0; setExpression(EXPR_UNK_3, -1.0f); setMotion(MOT_UNK_4, -1.0f, 0); } shape_angle.y = angleY; break; case 11: case 30: case 99: rv = 1; break; default: rv = 1; break; } return rv; } /* 809D3058-809D3078 003418 0020+00 1/0 0/0 0/0 .text daNpc_Grd_Create__FPv */ static int daNpc_Grd_Create(void* i_this) { return ((daNpc_Grd_c*)i_this)->create(); } /* 809D3078-809D3098 003438 0020+00 1/0 0/0 0/0 .text daNpc_Grd_Delete__FPv */ static int daNpc_Grd_Delete(void* i_this) { return ((daNpc_Grd_c*)i_this)->Delete(); } /* 809D3098-809D30B8 003458 0020+00 1/0 0/0 0/0 .text daNpc_Grd_Execute__FPv */ static int daNpc_Grd_Execute(void* i_this) { return ((daNpc_Grd_c*)i_this)->Execute(); } /* 809D30B8-809D30D8 003478 0020+00 1/0 0/0 0/0 .text daNpc_Grd_Draw__FPv */ static int daNpc_Grd_Draw(void* i_this) { return ((daNpc_Grd_c*)i_this)->Draw(); } /* 809D30D8-809D30E0 003498 0008+00 1/0 0/0 0/0 .text daNpc_Grd_IsDelete__FPv */ static int daNpc_Grd_IsDelete(void* i_this) { return 1; } /* 809D3D74-809D3D94 -00001 0020+00 1/0 0/0 0/0 .data daNpc_Grd_MethodTable */ static actor_method_class daNpc_Grd_MethodTable = { (process_method_func)daNpc_Grd_Create, (process_method_func)daNpc_Grd_Delete, (process_method_func)daNpc_Grd_Execute, (process_method_func)daNpc_Grd_IsDelete, (process_method_func)daNpc_Grd_Draw, }; /* 809D3D94-809D3DC4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_NPC_GRD */ extern actor_process_profile_definition g_profile_NPC_GRD = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_NPC_GRD, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daNpc_Grd_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 308, // mPriority &daNpc_Grd_MethodTable, // sub_method 0x00044100, // mStatus fopAc_NPC_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; AUDIO_INSTANCES;