/** * @file d_a_npc_tks.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_tks.h" #include "d/d_a_obj.h" #include "d/actor/d_a_npc_tkc.h" #include "d/d_meter2_info.h" #include "f_op/f_op_kankyo_mng.h" enum TKS_RES_File_ID { /* BCK */ /* 0x07 */ BCK_TKS_F_TALK_A = 0x7, /* 0x08 */ BCK_TKS_FALL, /* 0x09 */ BCK_TKS_FLY, /* 0x0A */ BCK_TKS_HIDE, /* 0x0B */ BCK_TKS_IN, /* 0x0C */ BCK_TKS_JUMP_E, /* 0x0D */ BCK_TKS_JUMP_S, /* 0x0E */ BCK_TKS_LAND, /* 0x0F */ BCK_TKS_LOOKAROUND_A, /* 0x10 */ BCK_TKS_LOOKAROUND_B, /* 0x11 */ BCK_TKS_RUN, /* 0x12 */ BCK_TKS_SHAKE, /* 0x13 */ BCK_TKS_SHOW_UP, /* 0x14 */ BCK_TKS_SHOW_UP_WAIT, /* 0x15 */ BCK_TKS_SWIM, /* 0x16 */ BCK_TKS_TUBO_HIDE, /* 0x17 */ BCK_TKS_TUBO_IN, /* 0x18 */ BCK_TKS_TUBO_SHAKE, /* 0x19 */ BCK_TKS_TUBO_SHOW_UP, /* 0x1A */ BCK_TKS_WAIT_A, /* 0x1B */ BCK_TKS_WALK_A, /* BMDR */ /* 0x1E */ BMDR_TKS = 0x1E, /* BTK */ /* 0x21 */ BTK_TKS = 0x21, /* BTP */ /* 0x24 */ BTP_TKS = 0x24, /* EVT */ /* 0x27 */ EVT_TKS_EVENT_LIST = 0x27, }; enum J_tubo_00_RES_File_ID { /* BMDR */ /* 0x3 */ BMDR_J_TUBO_00 = 0x3, }; enum K_tubo02_RES_File_ID { /* BMDR */ /* 0x3 */ BMDR_K_TUBO02 = 0x3, }; enum Animation { /* 0x00 */ ANM_NONE, /* 0x01 */ ANM_F_TALK_A, /* 0x02 */ ANM_WAIT_A, /* 0x03 */ ANM_WALK_A, /* 0x04 */ ANM_HIDE, /* 0x05 */ ANM_SHOW_UP, /* 0x06 */ ANM_SHOW_UP_WAIT, /* 0x07 */ ANM_LOOKAROUND_A, /* 0x08 */ ANM_LOOKAROUND_B, /* 0x09 */ ANM_IN, /* 0x0A */ ANM_SHAKE, /* 0x0B */ ANM_FALL, /* 0x0C */ ANM_LAND, /* 0x0D */ ANM_TUBO_HIDE, /* 0x0E */ ANM_TUBO_SHOW_UP, /* 0x0F */ ANM_TUBO_IN, /* 0x10 */ ANM_TUBO_SHAKE, /* 0x11 */ ANM_JUMP_S, /* 0x12 */ ANM_FLY, /* 0x13 */ ANM_JUMP_E, /* 0x14 */ ANM_RUN, /* 0x15 */ ANM_SWIM, }; enum Motion { /* 0x0 */ MOT_WAIT_A, /* 0x1 */ MOT_SWIM, /* 0x2 */ MOT_RUN, /* 0x3 */ MOT_WALK_A, /* 0x4 */ MOT_JUMP_S, /* 0x5 */ MOT_JUMP_E, /* 0x6 */ MOT_LAND, /* 0x7 */ MOT_WALK_A_LOOP, }; enum Expression { /* 0x0 */ EXPR_TALK_A, /* 0x1 */ EXPR_NONE, }; enum Expression_BTP { /* 0x0 */ EXPR_BTP_TKS, }; enum Joint { /* 0x00 */ JNT_CENTER, /* 0x01 */ JNT_ARML1, /* 0x02 */ JNT_ARML2, /* 0x03 */ JNT_HANDL, /* 0x04 */ JNT_TUBASAL, /* 0x05 */ JNT_ARMR1, /* 0x06 */ JNT_ARMR2, /* 0x07 */ JNT_HANDR, /* 0x08 */ JNT_TUBASAR, /* 0x09 */ JNT_LEGL, /* 0x0A */ JNT_FOOTL1, /* 0x0B */ JNT_FOOTL2, /* 0x0C */ JNT_LEGR, /* 0x0D */ JNT_FOOTR1, /* 0x0E */ JNT_FOOTR2, /* 0x0F */ JNT_NECK1, /* 0x10 */ JNT_NECK2, /* 0x11 */ JNT_HEAD, /* 0x12 */ JNT_CHIN, /* 0x13 */ JNT_MOUTH, }; enum RES_Name { /* 0x0 */ TKS, /* 0x1 */ J_TUBO_00, /* 0x2 */ K_TUBO02, }; /* 80B1E554-80B1E558 000014 0004+00 1/1 0/0 0/0 .bss l_HIO */ static daNpcTks_Param_c l_HIO; /* 80B1E104-80B1E1B4 000020 00B0+00 1/2 0/0 0/0 .data l_bckGetParamList */ static daNpc_GetParam3 l_bckGetParamList[22] = { {-1, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_F_TALK_A, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_WAIT_A, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_WALK_A, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_HIDE, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_SHOW_UP, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_SHOW_UP_WAIT, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_LOOKAROUND_A, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_LOOKAROUND_B, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_IN, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_SHAKE, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_FALL, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_LAND, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_TUBO_HIDE, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_TUBO_SHOW_UP, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_TUBO_IN, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_TUBO_SHAKE, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_JUMP_S, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_FLY, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_JUMP_E, J3DFrameCtrl::EMode_NONE}, {BCK_TKS_RUN, J3DFrameCtrl::EMode_LOOP}, {BCK_TKS_SWIM, J3DFrameCtrl::EMode_LOOP}, }; /* 80B1E1B4-80B1E1BC 0000D0 0008+00 1/1 0/0 0/0 .data l_btpGetParamList */ static daNpc_GetParam3 l_btpGetParamList[1] = { {BTP_TKS, J3DFrameCtrl::EMode_LOOP}, }; /* 80B1E1BC-80B1E1C4 0000D8 0008+00 1/2 0/0 0/0 .data l_btkGetParamList */ static daNpc_GetParam3 l_btkGetParamList[1] = { {BTK_TKS, J3DFrameCtrl::EMode_LOOP}, }; /* 80B1E1C4-80B1E1D0 0000E0 000C+00 1/0 0/0 0/0 .data l_loadRes_TKS0 */ static int l_loadRes_TKS0[3] = { TKS, J_TUBO_00, -1, }; /* 80B1E1D0-80B1E1DC 0000EC 000C+00 1/0 0/0 0/0 .data l_loadRes_TKS1 */ static int l_loadRes_TKS1[3] = { TKS, K_TUBO02, -1, }; /* 80B1E1DC-80B1E1E8 0000F8 000C+00 1/0 0/0 0/0 .data l_loadRes_TKS2 */ static int l_loadRes_TKS2[3] = { TKS, -1, -1, }; /* 80B1E1E8-80B1E1F4 -00001 000C+00 2/2 0/0 0/0 .data l_loadRes_list */ static int* l_loadRes_list[3] = { l_loadRes_TKS0, l_loadRes_TKS1, l_loadRes_TKS2, }; /* 80B1E1F4-80B1E200 -00001 000C+00 3/3 0/0 0/0 .data l_arcNames */ static char* l_arcNames[3] = { "TKS", "J_tubo_00", "K_tubo02", }; /* 80B1E200-80B1E208 -00001 0008+00 0/0 0/0 0/0 .data l_evtNames */ static char* l_evtNames[2] = { NULL, "TKS_ENCOUNTER", }; /* 80B1E208-80B1E20C -00001 0004+00 9/11 0/0 0/0 .data l_arcName */ static char* l_arcName = "TKS"; /* 80B1E20C-80B1E210 -00001 0004+00 8/9 0/0 0/0 .data l_myName */ static char* l_myName = "Tks"; /* 80B1462C-80B14844 0000EC 0218+00 1/1 0/0 0/0 .text __ct__10daNpcTks_cFv */ daNpcTks_c::daNpcTks_c() {} /* 80B14844-80B14AF8 000304 02B4+00 1/0 0/0 0/0 .text __dt__10daNpcTks_cFv */ daNpcTks_c::~daNpcTks_c() { for (int i = 0; l_loadRes_list[mTksTsubo.mTsuboType][i] >= 0; i++) { dComIfG_resDelete(&mPhases[i], l_arcNames[l_loadRes_list[mTksTsubo.mTsuboType][i]]); } if (heap != NULL) { mAnm_p->stopZelAnime(); } if (parentActorID != fpcM_ERROR_PROCESS_ID_e) { fopAcM_delete(parentActorID); } } /* 80B1DD58-80B1DDF0 000000 0098+00 25/25 0/0 0/0 .rodata m__16daNpcTks_Param_c */ daNpcTks_HIOParam const daNpcTks_Param_c::m = { 90.0f, -3.0f, 1.0f, 150.0f, 255.0f, 80.0f, 33.0f, 25.0f, 0.0f, 0.0f, 45.0f, -45.0f, 30.0f, -10.0f, 45.0f, -45.0f, 0.8f, 12.0f, 3, 6, 19, 6, 80.0f, 500.0f, 300.0f, -300.0f, 60, 8, 0, 0, 0, false, false, 0x2D, 0x96, 30, 0x5A, 1000.0f, 500.0f, 35.0f, 25.0f, 7.0f, 2.0f, 5.0f, }; /* 80B14AF8-80B14ED0 0005B8 03D8+00 1/1 0/0 0/0 .text Create__10daNpcTks_cFv */ cPhs__Step daNpcTks_c::Create() { fopAcM_ct(this, daNpcTks_c); if (dComIfGs_isStageBossEnemy()) { return cPhs_ERROR_e; } if (getType() == 0 || getType() == 0xFF || getType() == 6) { if (dComIfGs_isDungeonItemWarp()) { return cPhs_ERROR_e; } } else if (getType() == 3 && /* dSv_event_flag_c::F_0267 - Temple of Time - Temple of Time clear */ (!daNpcF_chkEvtBit(267) || /* dSv_event_flag_c::F_0545 - Sacred Grove - Watched cutscene of Ooccoo Sr. parting (after Temple of Time) */ daNpcF_chkEvtBit(545))) { return cPhs_ERROR_e; } if ((getType() == 0 || getType() == 0xFF) && !fopAcM_isSwitch(this, getSwitchNo())) { mTksTsubo.mTsuboType = getTsuboType(); } else { mTksTsubo.mTsuboType = 2; } mMessageNo = getMessageNo(); cPhs__Step phase = cPhs_ERROR_e; for (int i = 0; l_loadRes_list[mTksTsubo.mTsuboType][i] >= 0; i++) { phase = (cPhs__Step)dComIfG_resLoad(&mPhases[i], l_arcNames[l_loadRes_list[mTksTsubo.mTsuboType][i]]); if (phase != cPhs_COMPLEATE_e) { return phase; } } if (phase == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0x3870)) { return cPhs_ERROR_e; } fopAcM_SetMtx(this, mAnm_p->getModel()->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -80.0f, -30.0f, -80.0f, 80.0f, 10.0f, 80.0f); mSound.init(¤t.pos, &eyePos, 3, 1); mTksTsubo.mSound.init(&mTksTsubo.mPos, &mTksTsubo.mPos, 3, 1); mAcchCir.SetWall(daNpcTks_Param_c::m.common.width, daNpcTks_Param_c::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)); mAcch.SetRoofNone(); mAcch.CrrPos(dComIfG_Bgsp()); mGndChk = mAcch.m_gnd; mGroundH = mAcch.GetGroundH(); mCcStts.Init(daNpcTks_Param_c::m.common.weight, 0, this); mCyl.Set(mCcDCyl); mCyl.SetStts(&mCcStts); mCyl.SetTgType(0); mCyl.SetTgSPrm(0); mCyl.SetH(daNpcTks_Param_c::m.common.height); mCyl.SetR(daNpcTks_Param_c::m.common.width); mTksTsubo.mCyl.Set(mCcDCyl); mTksTsubo.mCyl.SetStts(&mCcStts); mTksTsubo.mCyl.SetTgType(0xD8FBFDFF); mTksTsubo.mCyl.SetTgSPrm(17); mTksTsubo.mCyl.SetH(100.0f); mTksTsubo.mCyl.SetR(30.0f); setEnvTevColor(); setRoomNo(); reset(); Execute(); } return phase; } /* 80B14ED0-80B1521C 000990 034C+00 1/1 0/0 0/0 .text CreateHeap__10daNpcTks_cFv */ int daNpcTks_c::CreateHeap() { // NONMATCHING J3DModelData* mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_arcName, BMDR_TKS); JUT_ASSERT(410, NULL != mdlData_p); 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((u32)this); mpMatAnm = new daNpcF_MatAnm_c(); if (mpMatAnm == NULL) { return 0; } if (!setExpressionAnm(ANM_F_TALK_A, false)) { return 0; } setMotion(MOT_WAIT_A, -1.0f, 0); if (mTksTsubo.mTsuboType < 2) { mdlData_p = static_cast(dComIfG_getObjectRes(mTksTsubo.mTsuboType != 0 ? l_arcNames[2] : l_arcNames[1], 3)); JUT_ASSERT(453, NULL != mdlData_p); mTksTsubo.mpModelMorf = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, getTrnsfrmKeyAnmP(l_arcName, BCK_TKS_TUBO_HIDE), -1, 1.0f, 0, -1, &mTksTsubo.mSound, 0x80000, 0x11000084); if (mTksTsubo.mpModelMorf == NULL) { return 0; } } return 1; } /* 80B153D8-80B1540C 000E98 0034+00 1/1 0/0 0/0 .text Delete__10daNpcTks_cFv */ int daNpcTks_c::Delete() { this->~daNpcTks_c(); return 1; } /* 80B1540C-80B15430 000ECC 0024+00 2/2 0/0 0/0 .text Execute__10daNpcTks_cFv */ int daNpcTks_c::Execute() { execute(); return 1; } /* 80B15430-80B1548C 000EF0 005C+00 1/1 0/0 0/0 .text Draw__10daNpcTks_cFv */ int daNpcTks_c::Draw() { mAnm_p->getModel()->getModelData()->getMaterialNodePointer(2)->setMaterialAnm(mpMatAnm); draw(FALSE, FALSE, daNpcTks_Param_c::m.common.real_shadow_size, NULL, FALSE); return 1; } /* 80B1548C-80B15650 000F4C 01C4+00 1/1 0/0 0/0 .text ctrlJoint__10daNpcTks_cFP8J3DJointP8J3DModel */ int daNpcTks_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { int jntNo = i_joint->getJntNo(); int i_jointList[3] = {JNT_NECK1, JNT_NECK2, JNT_HEAD}; if (jntNo == 0) { mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_NECK1)); mDoMtx_stack_c::multVecZero(&mLookatPos[0]); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_NECK2)); mDoMtx_stack_c::multVecZero(&mLookatPos[1]); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::multVecZero(&mLookatPos[2]); } mDoMtx_stack_c::copy(i_model->getAnmMtx(jntNo)); switch (jntNo) { case JNT_NECK1: case JNT_NECK2: case JNT_HEAD: setLookatMtx(jntNo, i_jointList, daNpcTks_Param_c::m.common.neck_rotation_ratio); break; } i_model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); if ((jntNo == JNT_HEAD || jntNo == JNT_MOUTH) && (mAnmFlags & ANM_PLAY_BCK) != 0) { J3DAnmTransform* anm = mBckAnm.getBckAnm(); mBckAnm.changeBckOnly(mAnm_p->getAnm()); mAnm_p->changeAnm(anm); } return 1; } /* 80B15650-80B15670 001110 0020+00 1/1 0/0 0/0 .text createHeapCallBack__10daNpcTks_cFP10fopAc_ac_c */ int daNpcTks_c::createHeapCallBack(fopAc_ac_c* a_this) { return static_cast(a_this)->CreateHeap(); } /* 80B15670-80B156BC 001130 004C+00 2/2 0/0 0/0 .text ctrlJointCallBack__10daNpcTks_cFP8J3DJointi */ int daNpcTks_c::ctrlJointCallBack(J3DJoint* i_joint, int param_2) { if (param_2 == 0) { J3DModel* model = j3dSys.getModel(); daNpcTks_c* i_this = (daNpcTks_c*)model->getUserArea(); if (i_this != NULL) { i_this->ctrlJoint(i_joint, model); } } return 1; } /* 80B156BC-80B157C0 00117C 0104+00 1/0 0/0 0/0 .text setMtx__10daNpcTks_cFv */ void daNpcTks_c::setMtx() { J3DModel* model = mAnm_p->getModel(); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::scaleM(scale); model->setBaseTRMtx(mDoMtx_stack_c::get()); model->setUserArea((u32)this); if (mTksTsubo.field_0x586 != 0) { if (field_0x138a) { mTksTsubo.mPos = current.pos; } else { mDoMtx_stack_c::transS(mTksTsubo.mPos); mDoMtx_stack_c::ZXYrotM(mTksTsubo.mAngle); } model = mTksTsubo.mpModelMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); mTksTsubo.mpModelMorf->modelCalc(); mTksTsubo.mpModelMorf->getModel()->getModelData()->getJointNodePointer(0)->setMtxCalc(NULL); } if ((mAnmFlags & ANM_PLAY_BCK) != 0) { mBckAnm.getBckAnm()->setFrame(mBckAnm.getFrame()); } mAnm_p->modelCalc(); } /* 80B157C0-80B1590C 001280 014C+00 1/0 0/0 0/0 .text setExpressionAnm__10daNpcTks_cFib */ bool daNpcTks_c::setExpressionAnm(int i_index, bool i_modify) { mAnmFlags &= 0xFFFFE03F; J3DAnmTransform* i_bck = l_bckGetParamList[i_index].fileIdx >= 0 ? getTrnsfrmKeyAnmP(l_arcName, l_bckGetParamList[i_index].fileIdx) : NULL; int i_attr = l_bckGetParamList[i_index].attr; bool bVar1 = FALSE; switch (i_index) { case ANM_NONE: bVar1 = setExpressionBtp(EXPR_BTP_TKS); break; case ANM_F_TALK_A: bVar1 = setExpressionBtp(EXPR_BTP_TKS); break; default: i_bck = NULL; break; } if (!bVar1) { return false; } if (i_bck == NULL) { return true; } if (setBckAnm(i_bck, 1.0f, i_attr, 0, -1, i_modify)) { mAnmFlags |= ANM_PLAY_BCK | ANM_PAUSE_BCK; mExpressionLoops = 0; return true; } OS_REPORT("%s: 表情Bckアニメーションの登録に失敗しました!\n", "d_a_npc_tks.cpp"); return false; } /* 80B1590C-80B159E0 0013CC 00D4+00 1/0 0/0 0/0 .text setExpressionBtp__10daNpcTks_cFi */ bool daNpcTks_c::setExpressionBtp(int i_index) { J3DAnmTexPattern* i_btp = getTexPtrnAnmP(l_arcName, l_btpGetParamList[i_index].fileIdx); int i_attr = l_btpGetParamList[i_index].attr; mAnmFlags &= 0xFFFFF57F; if (i_btp == NULL) { return true; } if (setBtpAnm(i_btp, mAnm_p->getModel()->getModelData(), 1.0f, i_attr)) { mAnmFlags |= ANM_PLAY_BTP | ANM_PAUSE_BTP; if (i_index == 0) { mAnmFlags |= ANM_FLAG_800; } return true; } OS_REPORT("%s: 表情Btpアニメーションの登録に失敗しました!\n", "d_a_npc_tks.cpp"); return false; } /* 80B159E0-80B15A24 0014A0 0044+00 1/0 0/0 0/0 .text setMotion__10daNpcTks_cFifi */ void daNpcTks_c::setMotion(int i_motion, f32 i_morf, int param_3) { s16 motion = i_motion; if ((param_3 != 0 || mMotion != motion) && i_motion >= 0 && i_motion < 8) { mMotion = motion; mMotionMorfOverride = i_morf; mMotionPrevPhase = -1; mMotionPhase = 0; } } /* 80B1C4F8-80B1CB4C 007FB8 0654+00 1/0 0/0 0/0 .text main__10daNpcTks_cFv */ BOOL daNpcTks_c::main() { // NONMATCHING if (field_0x138a && mTksTsubo.mCyl.ChkTgHit()) { if (mTksTsubo.mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_BOOMERANG)) { setAction(&daNpcTks_c::damage); } else { setAction(&daNpcTks_c::broken); } } if (cLib_checkBit(attention_info.flags, fopAc_AttnFlag_CARRY_e) && fopAcM_checkCarryNow(this)) { setAction(&daNpcTks_c::demo_appear); } if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk() && mItemID != fpcM_ERROR_PROCESS_ID_e) { dComIfGp_event_setItemPartnerId(mItemID); mItemID = fpcM_ERROR_PROCESS_ID_e; fopAcM_delete(this); } if (mAction) { (this->*mAction)(); } playExpression(); playMotion(); playTsuboAnm(); mPlayerArea = getPlayerArea(); return TRUE; } /* 80B15A24-80B160A8 0014E4 0684+00 1/1 0/0 0/0 .text reset__10daNpcTks_cFv */ void daNpcTks_c::reset() { initialize(); mpMatAnm->initialize(); mLookat.initialize(); for (int i = 0; i < 1; i++) { mActorMngr[i].initialize(); } attention_info.distances[fopAc_attn_CARRY_e] = 43; attention_info.flags = fopAc_AttnFlag_CARRY_e; field_0x1370 = 0; field_0x1374 = 0; mAction = NULL; mLookMode = -1; mMode = 0; field_0x138a = true; mPlayerArea = -1; scale.setall(daNpcTks_Param_c::m.common.scale); dKy_tevstr_init(&mTksTsubo.mTevStr, fopAcM_GetRoomNo(this), 0xFF); setAngle(shape_angle.y); mTksTsubo.mPos = current.pos; mTksTsubo.mAngle = shape_angle; speedF = 0.0f; speed.setall(0.0f); mItemID = fpcM_ERROR_PROCESS_ID_e; mExpressionMorfOverride = 0.0f; mMotionMorfOverride = 0.0f; switch (getType()) { case 0: case 255: if (fopAcM_isSwitch(this, getSwitchNo())) { cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); field_0x138a = false; mTksTsubo.field_0x586 = 0; setAction(&daNpcTks_c::waitNude); } else { mTksTsubo.field_0x586 = 1; setAction(&daNpcTks_c::hide); } break; case 1: { mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::demo_scannon); cXyz i_pos(current.pos); i_pos.y += 60.0f; parentActorID = fopAcM_createChild(PROC_NPC_TKC, fopAcM_GetID(this), 3, &i_pos, fopAcM_GetRoomNo(this), &mCurAngle, NULL, -1, NULL); break; } case 2: { mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::demo_Lv6Gate); cXyz i_pos(current.pos); i_pos.y += 60.0f; parentActorID = fopAcM_createChild(PROC_NPC_TKC, fopAcM_GetID(this), 3, &i_pos, fopAcM_GetRoomNo(this), &mCurAngle, NULL, -1, NULL); break; } case 3: { mTksTsubo.field_0x586 = 0; field_0x138a = false; field_0x1370 = 10; setAction(&daNpcTks_c::demo_farewell); cXyz i_pos(current.pos); csXyz i_angle(0, fopAcM_searchPlayerAngleY(this), 0); i_pos.y += 60.0f; parentActorID = fopAcM_createChild(PROC_NPC_TKC, fopAcM_GetID(this), 4, &i_pos, fopAcM_GetRoomNo(this), &i_angle, NULL, -1, NULL); break; } case 4: mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::demo_warpBack); break; case 5: mTksTsubo.field_0x586 = 0; field_0x138a = false; if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0) { field_0x1370 = 5; } else if (strcmp(dComIfGp_getStartStageName(), "D_MN07") == 0) { if (fopAcM_GetPosition_p(daPy_getPlayerActorClass())->y < 7500.0f) { field_0x1370 = 5; } else { field_0x1370 = 5; setAction(&daNpcTks_c::demo_Lv3PickUp); break; } } else { field_0x1370 = 0; } setAction(&daNpcTks_c::demo_walkBack); break; case 6: { mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::waitLv6); cXyz i_pos(current.pos); i_pos.y += 60.0f; parentActorID = fopAcM_createChild(PROC_NPC_TKC, fopAcM_GetID(this), 4, &i_pos, fopAcM_GetRoomNo(this), &mCurAngle, NULL, -1, NULL); break; } case 7: mTksTsubo.field_0x586 = 0; field_0x138a = false; gravity = 0.0f; setAction(&daNpcTks_c::demo_Lv7Start); break; case 8: mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::demo_Lv3PickUp); break; case 9: mTksTsubo.field_0x586 = 0; field_0x138a = false; setAction(&daNpcTks_c::demo_Lv6PickUp); break; default: JUT_ASSERT(1298, FALSE); break; } } /* 80B160A8-80B16148 001B68 00A0+00 1/1 0/0 0/0 .text setAction__10daNpcTks_cFM10daNpcTks_cFPCvPv_v */ BOOL daNpcTks_c::setAction(actionFunc action) { mMode = 3; if (mAction) { (this->*mAction)(); } mMode = 0; mAction = action; if (mAction) { (this->*mAction)(); } return TRUE; } int daNpcTks_c::getPlayerArea() { f32 fVar3, fVar2, fVar1; fVar1 = pow(daNpcTks_Param_c::m.area_a_dist, 2.0); fVar2 = pow(daNpcTks_Param_c::m.area_b_dist, 2.0); fVar3 = fopAcM_searchPlayerDistanceXZ2(this); if (fVar3 > 0.0f && fVar3 <= fVar2) { return 1; } if (fVar3 > fVar2 && fVar3 <= fVar1) { return 0; } return -1; }; void daNpcTks_c::playExpression() { daNpcF_anmPlayData dat0 = {ANM_F_TALK_A, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1 = {ANM_NONE, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[1] = {&dat1}; daNpcF_anmPlayData** ppDat[2] = { pDat0, pDat1 }; if (mExpression >= 0 && mExpression < 2) { playExpressionAnm(ppDat); } }; void daNpcTks_c::playMotion() { daNpcF_anmPlayData dat0 = {ANM_WAIT_A, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1 = {ANM_SWIM, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[1] = {&dat1}; daNpcF_anmPlayData dat2 = {ANM_RUN, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat2[1] = {&dat2}; daNpcF_anmPlayData dat3 = {ANM_WALK_A, daNpcTks_Param_c::m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat3[1] = {&dat3}; daNpcF_anmPlayData dat4a = {ANM_JUMP_S, 4.0f, 1}; daNpcF_anmPlayData dat4b = {ANM_FLY, 0.0f, 0}; daNpcF_anmPlayData* pDat4[2] = {&dat4a, &dat4b}; daNpcF_anmPlayData dat5 = {ANM_JUMP_E, 0.0f, 1}; daNpcF_anmPlayData* pDat5[1] = {&dat5}; daNpcF_anmPlayData dat6a = {ANM_LAND, 0.0f, 1}; daNpcF_anmPlayData dat6b = {ANM_WAIT_A, 4.0f, 0}; daNpcF_anmPlayData* pDat6[2] = {&dat6a, &dat6b}; daNpcF_anmPlayData dat7 = {ANM_WALK_A, 4.0f, 1}; daNpcF_anmPlayData* pDat7[1] = {&dat7}; daNpcF_anmPlayData** ppDat[8] = { pDat0, pDat1, pDat2, pDat3, pDat4, pDat5, pDat6, pDat7, }; if (mMotion >= 0 && mMotion < 8) { playMotionAnm(ppDat); } } /* 80B1CFD0-80B1D1FC 008A90 022C+00 1/1 0/0 0/0 .text lookat__10daNpcTks_cFv */ void daNpcTks_c::lookat() { daPy_py_c* player = NULL; J3DModel* model = mAnm_p->getModel(); BOOL i_snap = FALSE; f32 body_angleX_min = daNpcTks_Param_c::m.common.body_angleX_min; f32 body_angleX_max = daNpcTks_Param_c::m.common.body_angleX_max; f32 body_angleY_min = daNpcTks_Param_c::m.common.body_angleY_min; f32 body_angleY_max = daNpcTks_Param_c::m.common.body_angleY_max; f32 head_angleX_min = field_0x138a ? 0.0f : daNpcTks_Param_c::m.common.head_angleX_min; f32 head_angleX_max = field_0x138a ? 0.0f : daNpcTks_Param_c::m.common.head_angleX_max; f32 head_angleY_min = daNpcTks_Param_c::m.common.head_angleY_min; f32 head_angleY_max = daNpcTks_Param_c::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_RESET: i_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*)field_0x1208; break; case LOOK_ATTN: break; } if (player != NULL) { mLookPos = player->attention_info.position; if (mLookMode != LOOK_PLAYER && mLookMode != LOOK_PLAYER_TALK) { mLookPos.y -= 40.0f; } mLookat.setAttnPos(&mLookPos); } else if (mLookMode == LOOK_ATTN) { 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, i_snap, angle_delta, FALSE); } void daNpcTks_c::playTsuboAnm() { if (mTksTsubo.field_0x586 != 0) { if ((mAnmFlags & ANM_PLAY_MORF) != 0) { f32 playSpeed = mTksTsubo.mpModelMorf->getPlaySpeed(); if ((mTksTsubo.mAnmFlags & ANM_PAUSE_MORF) != 0) { mTksTsubo.mpModelMorf->setPlaySpeed(0.0f); mTksTsubo.mpModelMorf->play(0, 0); mTksTsubo.mpModelMorf->setPlaySpeed(playSpeed); } else { mTksTsubo.mpModelMorf->play(0, 0); } } mTksTsubo.mAnmFlags &= 0xFFFFEF38; } }; BOOL daNpcTks_c::checkFindPlayer() { f32 fVar1 = pow(daNpcTks_Param_c::m.area_a_dist, 2.0); f32 fVar2 = fopAcM_searchPlayerDistanceXZ2(this); mActorMngr[0].remove(); if (fVar2 <= fVar1) { mActorMngr[0].entry(daPy_getPlayerActorClass()); return TRUE; } return FALSE; } void daNpcTks_c::setLookMode(int i_lookMode, fopAc_ac_c* actor_p) { if (i_lookMode >= 0 && i_lookMode < 6 && (i_lookMode != mLookMode || actor_p != field_0x1208)) { mLookMode = i_lookMode; field_0x1208 = actor_p; } } /* 80B16148-80B16344 001C08 01FC+00 3/0 0/0 0/0 .text wait__10daNpcTks_cFv */ void daNpcTks_c::wait() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setMotionAnm(ANM_WAIT_A, 0.0f); field_0x138a = false; speedF = 0.0f; mMode = 2; break; case 2: if (mActorMngr[0].getActorP() != NULL) { if (!checkFindPlayer()) { mTurnMode = 0; } } else if (checkFindPlayer()) { mTurnMode = 0; } if (mActorMngr[0].getActorP() != NULL) { setLookMode(LOOK_PLAYER, NULL); } else { setLookMode(LOOK_NONE, NULL); } break; case 3: break; default: JUT_ASSERT(1766, FALSE); break; } } void daNpcTks_c::setTsuboMotionAnm(int i_index, f32 i_morf) { J3DAnmTransform* i_anm = getTrnsfrmKeyAnmP(l_arcName, l_bckGetParamList[i_index].fileIdx); int i_attr = l_bckGetParamList[i_index].attr; mTksTsubo.mAnmFlags &= 0xFFFFFFF6; if (i_anm != NULL) { mTksTsubo.mpModelMorf->setAnm(i_anm, i_attr, i_morf, 1.0f, 0.0f, -1.0f); mTksTsubo.mAnmFlags |= ANM_PLAY_MORF | ANM_PAUSE_MORF; } } /* 80B16344-80B16634 001E04 02F0+00 1/0 0/0 0/0 .text setMotionAnm__10daNpcTks_cFif */ void daNpcTks_c::setMotionAnm(int i_index, f32 i_morf) { if (i_index < 2 || i_index >= 0x16) { return; } J3DAnmTransformKey* i_anm = getTrnsfrmKeyAnmP(l_arcName, l_bckGetParamList[i_index].fileIdx); int i_attr = l_bckGetParamList[i_index].attr; mAnmFlags &= 0xFFFFFFE4; if (i_anm != NULL && setMcaMorfAnm(i_anm, 1.0f, i_morf, i_attr, 0, -1)) { mAnmFlags |= ANM_PLAY_MORF | ANM_PAUSE_MORF; mMotionLoops = 0; if (i_index == ANM_RUN) { mAnm_p->setPlaySpeed(speedF / daNpcTks_Param_c::m.walk_spd); } else { mAnm_p->setPlaySpeed(1.0f); } if (field_0x138a) { switch (i_index) { case ANM_SHOW_UP: setTsuboMotionAnm(ANM_TUBO_SHOW_UP, i_morf); break; case ANM_IN: setTsuboMotionAnm(ANM_TUBO_IN, i_morf); break; case ANM_SHAKE: setTsuboMotionAnm(ANM_TUBO_SHAKE, i_morf); break; default: setTsuboMotionAnm(ANM_TUBO_HIDE, i_morf); break; } } } J3DAnmTextureSRTKey* i_btk = getTexSRTKeyAnmP(l_arcName, l_btkGetParamList[0].fileIdx); i_attr = l_btkGetParamList[0].attr; if (i_btk != NULL) { if (setBtkAnm(i_btk, mAnm_p->getModel()->getModelData(), 1.0f, i_attr)) { mAnmFlags |= ANM_PLAY_BTK | ANM_PAUSE_BTK; } } } /* 80B16634-80B1682C 0020F4 01F8+00 2/0 0/0 0/0 .text waitNude__10daNpcTks_cFv */ void daNpcTks_c::waitNude() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setMotionAnm(ANM_WAIT_A, 0.0f); field_0x138a = false; speedF = 0.0f; mMode = 2; break; case 2: { f32 fVar1 = current.pos.y - fopAcM_GetPosition_p(daPy_getPlayerActorClass())->y; if (fVar1 > -200.0f && fVar1 < 150.0f && fopAcM_searchPlayerDistanceXZ(this) <= 300.0f) { if (!fopAcM_otherBgCheck(this, daPy_getPlayerActorClass())) { eventInfo.onCondition(dEvtCmd_INTALK_e); fopAcM_orderSpeakEvent(this, 0, 0); } } if (dComIfGp_event_runCheck() && eventInfo.checkCommandTalk()) { dComIfGs_onDungeonItemWarp(); if (getTBoxNo() != 0xFF) { dComIfGs_onTbox(getTBoxNo()); } Z2GetAudioMgr()->subBgmStart(Z2BGM_OBACHAN); setAction(&daNpcTks_c::talk); } break; } case 3: break; default: JUT_ASSERT(1805, FALSE); break; } } /* 80B1682C-80B16B74 0022EC 0348+00 1/0 0/0 0/0 .text waitLv6__10daNpcTks_cFv */ void daNpcTks_c::waitLv6() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setMotionAnm(ANM_WAIT_A, 0.0f); field_0x138a = false; speedF = 0.0f; mMode = 2; break; case 2: if (mActorMngr[0].getActorP() != NULL) { if (!checkFindPlayer()) { mTurnMode = 0; } } else if (checkFindPlayer()) { mTurnMode = 0; } if (mActorMngr[0].getActorP() != NULL) { setLookMode(LOOK_PLAYER, NULL); } else { setLookMode(LOOK_NONE, NULL); } if (current.pos.y - fopAcM_GetPosition_p(daPy_getPlayerActorClass())->y < 100.0f && fopAcM_searchPlayerDistanceXZ(this) <= 400.0f) { attention_info.flags = fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e; eventInfo.onCondition(dEvtCmd_INTALK_e); fopAcM_orderSpeakEvent(this, 0, 0); } if (dComIfGp_event_runCheck() && eventInfo.checkCommandTalk()) { dComIfGs_onDungeonItemWarp(); if (getTBoxNo() != 0xFF) { dComIfGs_onTbox(getTBoxNo()); } Z2GetAudioMgr()->subBgmStart(Z2BGM_OBACHAN); setAction(&daNpcTks_c::talk); } break; case 3: break; default: JUT_ASSERT(1858, FALSE); break; } } void daNpcTks_c::setExpressionTalkAfter() { setExpression(EXPR_NONE, -1.0f); } BOOL daNpcTks_c::step(s16 i_turnTargetAngle, int param_2) { if (mTurnMode == 0) { if (param_2 != 0) { if ((int)fabsf(cM_sht2d((s16)(i_turnTargetAngle - mCurAngle.y))) > 40) { setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WALK_A_LOOP, -1.0f, 0); } } mTurnTargetAngle = i_turnTargetAngle; mTurnAmount = 0; if (mCurAngle.y == mTurnTargetAngle) { mTurnMode++; } current.angle.y = mCurAngle.y; shape_angle.y = current.angle.y; mTurnMode++; } else if (mTurnMode == 1) { if (turn(mTurnTargetAngle, 15.0f, 0)) { shape_angle.y = current.angle.y; mCurAngle.y = current.angle.y; mOldAngle.y = current.angle.y; mTurnMode++; } else { shape_angle.y = current.angle.y; mCurAngle.y = current.angle.y; } } return mTurnMode > 1; }; /* 80B16B74-80B16FDC 002634 0468+00 2/0 0/0 0/0 .text talk__10daNpcTks_cFv */ void daNpcTks_c::talk() { switch (mMode) { case 0: setMotion(MOT_WAIT_A, -1.0f, 0); initTalk(mMessageNo, NULL); mMsgTimer = 0; mTurnMode = 0; setLookMode(LOOK_PLAYER_TALK, NULL); mMode = 2; break; case 2: { if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { mActorMngr[0].entry(daPy_getPlayerActorClass()); int itemNo = 0; OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", mFlow.getEventId(&itemNo), itemNo); if (mFlow.getEventId(&itemNo) == 1) { mItemID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); if (mItemID != fpcM_ERROR_PROCESS_ID_e) { const char* eventName = daPy_py_c::checkNowWolf() ? "WOLF_GET_TKS" : "DEFAULT_GETITEM"; s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, eventName, 0xFF); dComIfGp_getEvent().reset(this); fopAcM_orderChangeEventId(this, eventIdx, 1, 0xFFFF); } } setAction(&daNpcTks_c::wait); } else { int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, FALSE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } } } else if (step(fopAcM_searchPlayerAngleY(this), 1)) { setMotion(MOT_WAIT_A, -1.0f, 0); mTurnMode = 0; } break; } case 3: break; default: JUT_ASSERT(1920, FALSE); break; } } /* 80B16FDC-80B17008 002A9C 002C+00 1/0 0/0 0/0 .text setExpression__10daNpcTks_cFif */ void daNpcTks_c::setExpression(int i_expression, f32 i_morf) { if (i_expression >= 0 && i_expression < 2) { mExpression = i_expression; mExpressionMorfOverride = i_morf; mExpressionPrevPhase = -1; mExpressionPhase = 0; } } /* 80B17008-80B17420 002AC8 0418+00 4/0 0/0 0/0 .text hide__10daNpcTks_cFv */ void daNpcTks_c::hide() { switch (mMode) { case 0: setMotionAnm(ANM_HIDE, 0.0f); field_0x138a = true; field_0x1370 = cLib_getRndValue(daNpcTks_Param_c::m.hide_time_1, daNpcTks_Param_c::m.hide_time_2 - daNpcTks_Param_c::m.hide_time_1); speedF = 0.0f; mMode = 2; break; case 2: { int iVar1 = --field_0x1370; if (iVar1 <= 0) { if (mPlayerArea == 1) { setAction(&daNpcTks_c::shake); } else if (mPlayerArea == 0) { if (cLib_getRndValue(0, 2) == 0) { setAction(&daNpcTks_c::shake); } else { setAction(&daNpcTks_c::showUp); } } else { if (cLib_getRndValue(0, 2) == 0) { setAction(&daNpcTks_c::shake); } else { setAction(&daNpcTks_c::showUp); } } } if (mPlayerArea == 0) { setAction(&daNpcTks_c::showUp); } break; } case 3: break; default: JUT_ASSERT(1960, FALSE); break; } } /* 80B17420-80B175F4 002EE0 01D4+00 3/0 0/0 0/0 .text shake__10daNpcTks_cFv */ void daNpcTks_c::shake() { switch (mMode) { case 0: setMotionAnm(ANM_SHAKE, 0.0f); field_0x138a = true; speedF = 0.0f; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::hide); } if (mPlayerArea == 0) { setAction(&daNpcTks_c::showUp); } break; case 3: break; default: JUT_ASSERT(1986, FALSE); break; } } /* 80B175F4-80B17734 0030B4 0140+00 4/0 0/0 0/0 .text showUp__10daNpcTks_cFv */ void daNpcTks_c::showUp() { switch (mMode) { case 0: setMotionAnm(ANM_SHOW_UP, 0.0f); field_0x138a = true; speedF = 0.0f; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::showUpWait); } break; case 3: break; default: JUT_ASSERT(2011, FALSE); break; } } /* 80B17734-80B17B70 0031F4 043C+00 3/0 0/0 0/0 .text showUpWait__10daNpcTks_cFv */ void daNpcTks_c::showUpWait() { switch (mMode) { case 0: setMotionAnm(ANM_SHOW_UP_WAIT, 0.0f); field_0x138a = true; field_0x1370 = cLib_getRndValue(daNpcTks_Param_c::m.show_up_wait_time_1, daNpcTks_Param_c::m.show_up_wait_time_2 - daNpcTks_Param_c::m.show_up_wait_time_1); speedF = 0.0f; mMode = 2; break; case 2: { int iVar1 = --field_0x1370; if (iVar1 <= 0) { if (mPlayerArea == 0) { switch (cLib_getRndValue(0, 2)) { case 0: setAction(&daNpcTks_c::lookAroundA); break; case 1: setAction(&daNpcTks_c::lookAroundB); break; } } else { switch (cLib_getRndValue(0, 3)) { case 0: setAction(&daNpcTks_c::lookAroundA); break; case 1: setAction(&daNpcTks_c::lookAroundB); break; case 2: setAction(&daNpcTks_c::in); break; } } } if (mPlayerArea == 1) { setAction(&daNpcTks_c::in); } break; } case 3: break; default: JUT_ASSERT(2056, FALSE); break; } } /* 80B17B70-80B17D44 003630 01D4+00 2/0 0/0 0/0 .text lookAroundA__10daNpcTks_cFv */ void daNpcTks_c::lookAroundA() { switch (mMode) { case 0: setMotionAnm(ANM_LOOKAROUND_A, 0.0f); field_0x138a = true; speedF = 0.0f; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::showUpWait); } if (mPlayerArea == 1) { setAction(&daNpcTks_c::in); } break; case 3: break; default: JUT_ASSERT(2082, FALSE); break; } } /* 80B17D44-80B17F18 003804 01D4+00 2/0 0/0 0/0 .text lookAroundB__10daNpcTks_cFv */ void daNpcTks_c::lookAroundB() { switch (mMode) { case 0: setMotionAnm(ANM_LOOKAROUND_B, 0.0f); field_0x138a = true; speedF = 0.0f; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::showUpWait); } if (mPlayerArea == 1) { setAction(&daNpcTks_c::in); } break; case 3: break; default: JUT_ASSERT(2082, FALSE); break; } } /* 80B17F18-80B18070 0039D8 0158+00 4/0 0/0 0/0 .text in__10daNpcTks_cFv */ void daNpcTks_c::in() { switch (mMode) { case 0: setMotionAnm(ANM_IN, 0.0f); setLookMode(LOOK_NONE, NULL); field_0x138a = true; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::hide); } break; case 3: break; default: JUT_ASSERT(2133, FALSE); break; } } /* 80B18070-80B181EC 003B30 017C+00 1/0 0/0 0/0 .text damage__10daNpcTks_cFv */ void daNpcTks_c::damage() { switch (mMode) { case 0: setMotionAnm(ANM_SHAKE, 0.0f); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); field_0x138a = true; speedF = 0.0f; mMode = 2; break; case 2: if (mAnm_p->isStop()) { setAction(&daNpcTks_c::hide); } if (mTksTsubo.mCyl.ChkTgHit()) { mMode = 0; } break; case 3: cLib_onBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); break; default: JUT_ASSERT(2162, FALSE); break; } } /* 80B181EC-80B183E8 003CAC 01FC+00 1/0 0/0 0/0 .text broken__10daNpcTks_cFv */ void daNpcTks_c::broken() { switch (mMode) { case 0: setMotionAnm(ANM_FALL, 0); if (mTksTsubo.mTsuboType != 0) { daObj::make_eff_break_kotubo2(this); } else { daObj::make_eff_break_kotubo(this); } mTksTsubo.mSound.startCreatureSound(Z2SE_TKS_V_OUT_OF_POT, 0, -1); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); field_0x138a = false; mTksTsubo.field_0x586 = 0; fopAcM_onSwitch(this, getSwitchNo()); speedF = 0.0f; speed.y = daNpcTks_Param_c::m.launch_spd; mMode = 2; break; case 2: if (mAcch.ChkGroundLanding()) { setMotion(MOT_LAND, -1.0f, 0); } else if (mAcch.ChkGroundHit() && mAnm_p->isStop()) { setAction(&daNpcTks_c::waitNude); } break; case 3: break; default: JUT_ASSERT(2199, FALSE); } } /* 80B183E8-80B18D44 003EA8 095C+00 1/0 0/0 0/0 .text demo_appear__10daNpcTks_cFv */ void daNpcTks_c::demo_appear() { switch (mMode) { case 0: eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_ENCOUNTER", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotionAnm(ANM_HIDE, 0.0f); mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { if (!dComIfGs_isDungeonItemWarp()) { dComIfGs_onDungeonItemWarp(); if (getTBoxNo() != 0xFF) { dComIfGs_onTbox(getTBoxNo()); } Z2GetAudioMgr()->bgmAllMute(60, 0.0f); } int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': break; case '0002': setMotionAnm(ANM_SHAKE, 0.0f); break; case '0003': setMotionAnm(ANM_FALL, 0.0f); setLookMode(LOOK_NONE, NULL); if (mTksTsubo.mTsuboType != 0) { daObj::make_eff_break_kotubo2(this); } else { daObj::make_eff_break_kotubo(this); } dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); mTksTsubo.mSound.startCreatureSound(Z2SE_TKS_V_OUT_OF_POT, 0, -1); fopAcM_cancelCarryNow(this); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); field_0x138a = false; mTksTsubo.field_0x586 = 0; speedF = daNpcTks_Param_c::m.movement_spd; speed.y = daNpcTks_Param_c::m.launch_spd; break; case '0004': setLookMode(LOOK_PLAYER, NULL); mTurnMode = 0; Z2GetAudioMgr()->subBgmStart(Z2BGM_OBACHAN); Z2GetAudioMgr()->bgmAllUnMute(0); break; case '0005': initTalk(mMessageNo, NULL); mMsgTimer = 0; setLookMode(LOOK_PLAYER_TALK, NULL); break; default: JUT_ASSERT(2277, FALSE); break; } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': if (mAnm_p->isStop()) { eventManager.cutEnd(staffId); } break; case '0003': setAngle(shape_angle.y); mTksTsubo.mAngle = shape_angle; if (mAcch.ChkGroundLanding()) { speedF = 0.0f; setMotion(MOT_LAND, -1.0f, 0); } else if (mAcch.ChkGroundHit() && mMotionPhase > 0) { setMotionAnm(ANM_WAIT_A, 0.0f); eventManager.cutEnd(staffId); } break; case '0004': if (step(fopAcM_searchPlayerAngleY(this), 1)) { setMotionAnm(ANM_WAIT_A, 0.0f); eventManager.cutEnd(staffId); } break; case '0005': if (talkProc(NULL, TRUE, NULL)) { mActorMngr[0].entry(daPy_getPlayerActorClass()); int itemNo = 0; OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", mFlow.getEventId(&itemNo), itemNo); if (mFlow.getEventId(&itemNo) == 1) { mItemID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); if (mItemID != fpcM_ERROR_PROCESS_ID_e) { s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xFF); dComIfGp_getEvent().reset(this); fopAcM_orderChangeEventId(this, eventIdx, 1, 0xFFFF); field_0x9ec = true; } } setAction(&daNpcTks_c::wait); eventManager.cutEnd(staffId); } break; default: JUT_ASSERT(2339, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx) != 0) { if (!field_0x9ec) { dComIfGp_event_reset(); } mEventIdx = -1; setAction(&daNpcTks_c::wait); } } } break; case 3: break; default: JUT_ASSERT(2356, FALSE); } } /* 80B18D44-80B1926C 004804 0528+00 1/0 0/0 0/0 .text demo_scannon__10daNpcTks_cFv */ void daNpcTks_c::demo_scannon() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); field_0x138a = false; mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': break; case '0002': old.pos.set(-98491.23f, -18346.793f, 52057.156f); current.pos = old.pos; setAngle(-0x2CA2); speedF = 25.0f; setMotion(MOT_RUN, -1.0f, 0); break; case '0003': setMotion(MOT_JUMP_S, 0.0f, 0); mAnm_p->setPlaySpeed(1.0f); setAngle(0); speedF = 0.0f; speed.y = 0.0f; break; default: JUT_ASSERT(2405, FALSE); break; } } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': { cXyz sp1c(-102070.93f, -18470.0f, 53544.613f); setAngle(cLib_targetAngleY(¤t.pos, &sp1c)); fopAcM_effSmokeSet2(&field_0x137c[0], &field_0x137c[1], ¤t.pos, &mCurAngle, 1.0f, &tevStr); for (int i = 0; i < 2; i++) { JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x137c[i]); if (emitter != NULL) { emitter->setRate(1.0f); emitter->setLifeTime(30); emitter->setGlobalAlpha(0x80); emitter->setGlobalParticleScale(2.5f, 2.5f); } } mSound.startCreatureVoiceLevel(Z2SE_TKS_V_RUNNING_LOOP, -1); if (current.pos.absXZ(sp1c) < speedF) { current.pos.set(sp1c); speedF = 0.0f; eventManager.cutEnd(staffId); } break; } case '0003': if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 25.0f; speed.y = 60.0f; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } if (speedF > 0.0f && mAcch.ChkGroundLanding()) { speedF = 0.0f; speed.y = 0.0f; eventManager.cutEnd(staffId); fopAcM_delete(this); } break; default: JUT_ASSERT(2473, FALSE); break; } } } break; case 3: break; default: JUT_ASSERT(2479, FALSE); break; } } /* 80B1926C-80B1946C 004D2C 0200+00 1/0 0/0 0/0 .text demo_Lv6Gate__10daNpcTks_cFv */ void daNpcTks_c::demo_Lv6Gate() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); field_0x138a = false; mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': break; case '0002': field_0x1370 = 320; speedF = 13.0f; setMotion(MOT_RUN, -1.0f, 0); dComIfGp_event_setTalkPartner(this); break; default: JUT_ASSERT(2520, FALSE); break; } } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': mSound.startCreatureVoiceLevel(Z2SE_TKS_V_RUNNING_LOOP, -1); if (cLib_calcTimer(&field_0x1370) == 0) { eventManager.cutEnd(staffId); fopAcM_delete(this); } break; default: JUT_ASSERT(2535, FALSE); } } } break; case 3: break; default: JUT_ASSERT(2541, FALSE); break; } } /* 80B1946C-80B19DAC 004F2C 0940+00 1/0 0/0 0/0 .text demo_farewell__10daNpcTks_cFv */ void daNpcTks_c::demo_farewell() { switch (mMode) { case 0: if (cLib_calcTimer(&field_0x1370) > 0 || dComIfGp_event_runCheck() != FALSE) { return; } eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_FAREWELL", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotionAnm(ANM_WAIT_A, 0.0f); /* dSv_event_flag_c::F_0545 - Sacred Grove - Watched cutscene of Ooccoo Sr. parting (after Temple of Time) */ daNpcF_onEvtBit(545); Z2GetAudioMgr()->subBgmStart(Z2BGM_OBACHAN); mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': dComIfGp_getEvent().setSkipZev(this, "TKS_FAREWELL_SKIP"); // fallthrough case '0006': case '0007': case '0008': case '0009': initTalk(mMessageNo, NULL); mMsgTimer = 0; setLookMode(LOOK_PLAYER_TALK, NULL); setAngle(fopAcM_searchPlayerAngleY(this)); break; case '0002': setLookMode(LOOK_NONE, NULL); break; case '0003': { daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->setActionFollow(); } setMotion(MOT_RUN, -1.0f, 0); speedF = 10.0f; break; } case '0004': setMotion(MOT_JUMP_S, -1.0f, 0); setAngle(0x16EA); break; case '0005': break; case '0010': break; case '0011': Z2GetAudioMgr()->subBgmStop(); fopAcM_delete(this); break; default: JUT_ASSERT(2627, FALSE); break; } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': case '0006': case '0007': case '0008': case '0009': if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } break; case '0002': { cXyz* pos = dComIfGp_evmng_getMyXyzP(staffId, "pos"); if (pos != NULL) { if (step(cLib_targetAngleY(¤t.pos, pos), 1)) { mTurnMode = 0; eventManager.cutEnd(staffId); } } break; } case '0003': { cXyz* pos = dComIfGp_evmng_getMyXyzP(staffId, "pos"); if (pos != NULL && current.pos.abs(*pos) <= speedF) { setMotion(MOT_WAIT_A, -1.0f, 0); current.pos = *pos; speedF = 0.0f; eventManager.cutEnd(staffId); } mSound.startCreatureVoiceLevel(Z2SE_TKS_V_RUNNING_LOOP, -1); break; } case '0004': { cXyz* pos = dComIfGp_evmng_getMyXyzP(staffId, "pos"); if (mMotion == 4) { if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 15.0f; speed.y = 60.0f; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } else if (speedF > 0.0f && mAcch.ChkGroundLanding()) { setMotion(MOT_JUMP_E, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; } } else if (mMotion == 5 && mAnm_p->isStop()) { Z2GetAudioMgr()->subBgmStop(); eventManager.cutEnd(staffId); } break; } case '0005': break; case '0010': case '0011': eventManager.cutEnd(staffId); break; default: JUT_ASSERT(2711, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { dComIfGp_event_reset(); fopAcM_delete(this); mEventIdx = -1; } } } break; case 3: break; default: JUT_ASSERT(2737, FALSE); } } /* 80B19DAC-80B1A30C 00586C 0560+00 1/0 0/0 0/0 .text demo_warpBack__10daNpcTks_cFv */ void daNpcTks_c::demo_warpBack() { switch (mMode){ case 0: eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_WARPBACK", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotionAnm(ANM_WAIT_A, 0.0f); setLookMode(LOOK_PLAYER_TALK, NULL); if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0 && dComIfGp_getStartStageRoomNo() == 3) { cXyz* pcVar1 = fopAcM_GetPosition_p(daPy_getPlayerActorClass()); if (pcVar1->y >= 950.0f) { if (pcVar1->x == 3700.0f && pcVar1->z == -4220.0f) { current.pos.set(3500.0f, 950.0f, -4220.0f); setAngle(0x4000); } else if (pcVar1->x == 3360.0f && pcVar1->z == -2010.0f) { current.pos.set(3360.0f, 950.0f, -1810.0f); setAngle(0x7FFF); } old.pos = current.pos; } } mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': dComIfGs_resetLastWarpAcceptStage(); break; case '0002': initTalk(3, NULL); mMsgTimer = 0; setAngle(fopAcM_searchPlayerAngleY(this)); break; case '0003': mCyl.OffCoSetBit(); setMotion(MOT_JUMP_S, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; scale.setall(1.0f); break; default: JUT_ASSERT(2809, FALSE); } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } break; case '0003': if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 12.0f; speed.y = 33.0f; field_0x1370 = 200.0f / speedF; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } if (speedF > 0.0f) { cLib_chaseF(&scale.x, 0.15f, 0.85f / (200.0f / speedF)); scale.setall(scale.x); if (cLib_calcTimer(&field_0x1370) == 0) { speedF = 0.0f; speed.y = 0.0f; eventManager.cutEnd(staffId); } } break; default: JUT_ASSERT(2853, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { mEventIdx = -1; dComIfGp_event_reset(); fopAcM_delete(this); } } } break; case 3: break; default: JUT_ASSERT(2870, FALSE); } } /* 80B1A30C-80B1A888 005DCC 057C+00 1/0 0/0 0/0 .text demo_walkBack__10daNpcTks_cFv */ void daNpcTks_c::demo_walkBack() { switch (mMode){ case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotionAnm(ANM_WAIT_A, 0.0f); setLookMode(LOOK_PLAYER_TALK, NULL); if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0) { current.pos.set(0.0f, -150.0f, 6600.0f); old.pos = current.pos; } else if (strcmp(dComIfGp_getStartStageName(), "D_MN07") == 0) { current.pos.set(4955.0f, -200.0f, 5480.0f); old.pos = current.pos; } if (cLib_calcTimer(&field_0x1370) > 0) { return; } if (dComIfGp_event_runCheck() && !eventInfo.checkCommandTalk()) { if (dComIfGp_getEventManager().getMyStaffId(l_myName, NULL, 0) != -1) { mMode = 2; } else { break; } } else { eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_WARPBACK", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); } // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': dComIfGs_resetLastWarpAcceptStage(); break; case '0002': initTalk(3, NULL); mMsgTimer = 0; setAngle(fopAcM_searchPlayerAngleY(this)); break; case '0003': mCyl.OffCoSetBit(); setMotion(MOT_JUMP_S, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; scale.setall(1.0f); break; default: JUT_ASSERT(2809, FALSE); } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } break; case '0003': if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 12.0f; speed.y = 31.0f; field_0x1370 = 200.0f / speedF; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } if (speedF > 0.0f) { cLib_chaseF(&scale.x, 0.15f, 0.85f / (200.0f / speedF)); scale.setall(scale.x); if (cLib_calcTimer(&field_0x1370) == 0) { speedF = 0.0f; speed.y = 0.0f; eventManager.cutEnd(staffId); } } break; default: JUT_ASSERT(2986, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { dComIfGp_event_reset(); mEventIdx = -1; dMeter2Info_warpInProc(); fopAcM_delete(this); } } } break; case 3: break; default: JUT_ASSERT(3004, FALSE); } } /* 80B1A888-80B1B6A0 006348 0E18+00 1/0 0/0 0/0 .text demo_Lv7Start__10daNpcTks_cFv */ void daNpcTks_c::demo_Lv7Start() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_JUMP_S, -1.0f, 0); mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0000': break; case '0002': current.pos.set(120.0f, 3000.0f, 5500.0f); old.pos = current.pos; setAngle(fopAcM_searchPlayerAngleY(this)); parentActorID = fopAcM_createChild(PROC_NPC_TKC, fopAcM_GetID(this), 3, ¤t.pos, fopAcM_GetRoomNo(this), &mCurAngle, NULL, -1, NULL); dComIfGp_event_setTalkPartner(this); field_0x138b = false; field_0x1370 = 143; break; case '0003': { daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->setActionWait(); } setMotion(MOT_SWIM, -1.0f, 0); field_0x1370 = 60; break; } case '0004': case '0008': initTalk(mMessageNo, NULL); mMsgTimer = 0; setLookMode(LOOK_PLAYER_TALK, NULL); break; case '0005': break; case '0007': { daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->setActionWait(); } break; } case '0009': setLookMode(LOOK_NONE, NULL); break; case '0010': { daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->setActionFollow(); } setMotion(MOT_JUMP_S, -1.0f, 0); break; } case '0011': setMotion(MOT_RUN, -1.0f, 0); speedF = 10.0f; break; case '0012': fopAcM_delete(this); break; default: JUT_ASSERT(3091, FALSE); break; } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': gravity = 0.0f; if (!daPy_getPlayerActorClass()->checkSwimUp()) { eventManager.cutEnd(staffId); } break; case '0002': if (cLib_calcTimer(&field_0x1370) == 0) { eventManager.cutEnd(staffId); } if (mAcch.ChkWaterIn()) { f32 fVar3 = mAcch.m_wtr.GetHeight(); if (current.pos.y < fVar3) { cXyz i_pos(current.pos.x, fVar3, current.pos.z); if (!field_0x138b) { fopKyM_createWpillar(&i_pos, 1.0f, 0); Z2GetAudioMgr()->seStart(Z2SE_CM_BODYFALL_WATER_S, &i_pos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } if (speed.y < 0.0f) { speed.y *= 0.7; } speed.y -= gravity - 1.0f; setMotion(MOT_SWIM, -1.0f, 0); fopAcM_effHamonSet(&field_0x137c[0], &i_pos, 0.7f, 0.08f); field_0x138b = true; } else { field_0x138b = false; } } if (!field_0x138b) { mSound.startCreatureVoiceLevel(Z2SE_TKS_V_FALLING_LOOP, -1); } break; case '0003': if (cLib_calcTimer(&field_0x1370) == 0) { eventManager.cutEnd(staffId); } if (mAcch.ChkWaterIn()) { f32 fVar2 = mAcch.m_wtr.GetHeight(); if (current.pos.y < fVar2) { current.pos.y = fVar2; speed.y = 0.0f; fopAcM_effHamonSet(&field_0x137c[0], ¤t.pos, 0.7f, 0.08f); field_0x138b = true; } else { field_0x138b = false; } } break; case '0008': if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } } else { if (step(fopAcM_searchPlayerAngleY(this), 0)) { mTurnMode = 0; } } if (mAcch.ChkWaterIn()) { f32 fVar1 = mAcch.m_wtr.GetHeight(); if (current.pos.y < fVar1) { current.pos.y = fVar1; speed.y = 0.0f; fopAcM_effHamonSet(&field_0x137c[0], ¤t.pos, 0.7f, 0.08f); field_0x138b = true; } else { field_0x138b = false; } } break; case '0007': { case '0005': mSound.startCreatureVoiceLevel(Z2SE_TKJ_V_ODOROKI_LOOP, -1); daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->callOdorokiSound(); } // fallthrough } case '0012': eventManager.cutEnd(staffId); if (mAcch.ChkWaterIn()) { f32 fVar1 = mAcch.m_wtr.GetHeight(); if (current.pos.y < fVar1) { current.pos.y = fVar1; speed.y = 0.0f; fopAcM_effHamonSet(&field_0x137c[0], ¤t.pos, 0.7f, 0.08f); field_0x138b = true; } else { field_0x138b = false; } } break; case '0004': { int iVar1[2] = {0x2520, -1}; if (talkProc(iVar1, TRUE, NULL)) { if (!mFlow.checkEndFlow()) { fopAc_ac_c* actor_p = fopAcM_SearchByName(PROC_Tag_Lv7Gate); if (actor_p != NULL) { setLookMode(LOOK_ACTOR, actor_p); } } else { eventManager.cutEnd(staffId); current.pos.set(1627.059f, -250.0f, 5621.671f); old.pos = current.pos; setAngle(0x6024); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); setLookMode(LOOK_NONE, NULL); daNpcTkc_c* actor_p = NULL; fopAcM_SearchByID(parentActorID, (fopAc_ac_c**)&actor_p); if (actor_p != NULL) { actor_p->setActionFollow(); } } } if (mAcch.ChkWaterIn()) { f32 fVar2 = mAcch.m_wtr.GetHeight(); if (current.pos.y < fVar2) { current.pos.y = fVar2; speed.y = 0.0f; fopAcM_effHamonSet(&field_0x137c[0], ¤t.pos, 0.7f, 0.08f); field_0x138b = true; } else { field_0x138b = false; } } break; } case '0009': { cXyz sp8c(3453.1926f, -200.0f, 5485.9224f); if (step(cLib_targetAngleY(¤t.pos, &sp8c), 1)) { eventManager.cutEnd(staffId); } break; } case '0010': if (mMotion == 4) { if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 8.0f; speed.y = 30.0f; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); break; } if (speedF > 0.0f && mAcch.ChkGroundLanding()) { setMotion(MOT_JUMP_E, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; } } else if (mMotion == 5) { if (mAnm_p->isStop()) { eventManager.cutEnd(staffId); } } break; case '0011': { mSound.startCreatureVoiceLevel(Z2SE_TKS_V_RUNNING_LOOP, -1); cXyz sp98(3453.1926f, -200.0f, 5485.9224f); step(cLib_targetAngleY(¤t.pos, &sp98), 0); eventManager.cutEnd(staffId); break; } default: JUT_ASSERT(3263, FALSE); break; } } } break; case 3: break; default: JUT_ASSERT(3269, FALSE); break; } } /* 80B1B6A0-80B1BD64 007160 06C4+00 2/0 0/0 0/0 .text demo_Lv3PickUp__10daNpcTks_cFv */ void daNpcTks_c::demo_Lv3PickUp() { switch (mMode) { case 0: cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); setLookMode(LOOK_PLAYER, NULL); if (strcmp(dComIfGp_getStartStageName(), "D_MN01") == 0) { current.pos.set(0.0f, 1225.0f, 14737.291f); setAngle(0); } else if (strcmp(dComIfGp_getStartStageName(), "D_MN07") == 0) { current.pos.set(0.0f, -250.0f, 3885.7244f); setAngle(0); } old.pos = current.pos; if (cLib_calcTimer(&field_0x1370) <= 0) { if (dComIfGp_event_runCheck() && !eventInfo.checkCommandTalk()) { if (dComIfGp_getEventManager().getMyStaffId(l_myName, NULL, 0) != -1) { mMode = 2; } break; } if (daPy_getPlayerActorClass()->checkSwimUp()) { eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_WARPBACK", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); } } break; case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': dComIfGs_resetLastWarpAcceptStage(); break; case '0002': initTalk(3, NULL); mMsgTimer = 0; mTurnMode = 0; setLookMode(LOOK_PLAYER_TALK, NULL); break; case '0003': mCyl.OffCoSetBit(); setMotion(MOT_JUMP_S, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; scale.setall(1.0f); break; default: JUT_ASSERT(3348, FALSE); break; } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } } else if (step(fopAcM_searchPlayerAngleY(this), 0)) { mTurnMode = 0; } break; case '0003': if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speed.y = 33.0f; field_0x136c = speed.y * -2.0f / gravity; field_0x1370 = field_0x136c; speedF = fopAcM_searchPlayerDistanceXZ(this) / field_0x136c; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } if (speedF > 0.0f) { cLib_chaseF(&scale.x, 0.15f, 0.85f / field_0x136c); scale.setall(scale.x); if (cLib_calcTimer(&field_0x1370) == 0) { speedF = 0.0f; speed.y = 0.0f; eventManager.cutEnd(staffId); } } break; default: JUT_ASSERT(3406, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { dComIfGp_event_reset(); mEventIdx = -1; dMeter2Info_warpInProc(); fopAcM_delete(this); } } } break; case 3: break; default: JUT_ASSERT(3424, FALSE); break; } } /* 80B1BD64-80B1C3C8 007824 0664+00 1/0 0/0 0/0 .text demo_Lv6PickUp__10daNpcTks_cFv */ void daNpcTks_c::demo_Lv6PickUp() { switch (mMode) { case 0: if (strcmp(dComIfGp_getStartStageName(), "D_MN05") == 0) { current.pos.set(-11.226944f, 2204.15f, 17357.205f); setAngle(0); } else if (strcmp(dComIfGp_getStartStageName(), "D_MN06") == 0) { current.pos.set(0.0f, -275.0f, 1900.0f); setAngle(0); } old.pos = current.pos; if (fopAcM_searchPlayerDistance(this) <= 300.0f) { eventInfo.setArchiveName(l_arcName); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, "TKS_WARPBACK", 0xFF); fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 4, 1); mMode = 2; } else { cLib_offBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); setLookMode(LOOK_PLAYER, NULL); break; } // fallthrough case 2: if (dComIfGp_event_runCheck() != FALSE && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { int* cutName = (int*)eventManager.getMyNowCutName(staffId); if (eventManager.getIsAddvance(staffId)) { switch (*cutName) { case '0001': dComIfGs_resetLastWarpAcceptStage(); break; case '0002': initTalk(3, NULL); mMsgTimer = 0; mTurnMode = 0; setLookMode(LOOK_PLAYER_TALK, NULL); break; case '0003': mCyl.OffCoSetBit(); setMotion(MOT_JUMP_S, -1.0f, 0); speedF = 0.0f; speed.y = 0.0f; scale.setall(1.0f); break; default: JUT_ASSERT(3499, FALSE); break; } } int msgTimer = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, TRUE)) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0001': eventManager.cutEnd(staffId); break; case '0002': if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { eventManager.cutEnd(staffId); } } else if (step(fopAcM_searchPlayerAngleY(this), 0)) { mTurnMode = 0; } break; case '0003': if (mMotionPhase == 0 && mAnm_p->checkFrame(9.0f)) { speedF = 16.0f; speed.y = 36.0f; field_0x1370 = 300.0f / speedF; mSound.startCreatureSound(Z2SE_TKS_V_JUMP_UP, 0, -1); } if (speedF > 0.0f) { cLib_chaseF(&scale.x, 0.15f, 0.85f / (300.0f / speedF)); scale.setall(scale.x); if (cLib_calcTimer(&field_0x1370) == 0) { speedF = 0.0f; speed.y = 0.0f; eventManager.cutEnd(staffId); } } break; default: JUT_ASSERT(3650, FALSE); break; } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { dComIfGp_event_reset(); mEventIdx = -1; dMeter2Info_warpInProc(); fopAcM_delete(this); } } } break; case 3: break; default: JUT_ASSERT(3568, FALSE); break; } } /* 80B1C3C8-80B1C3E8 007E88 0020+00 1/0 0/0 0/0 .text daNpcTks_Create__FPv */ static int daNpcTks_Create(void* a_this) { return static_cast(a_this)->Create(); } /* 80B1C3E8-80B1C408 007EA8 0020+00 1/0 0/0 0/0 .text daNpcTks_Delete__FPv */ static int daNpcTks_Delete(void* a_this) { return static_cast(a_this)->Delete(); } /* 80B1C408-80B1C428 007EC8 0020+00 1/0 0/0 0/0 .text daNpcTks_Execute__FPv */ static int daNpcTks_Execute(void* a_this) { return static_cast(a_this)->Execute(); } /* 80B1C428-80B1C448 007EE8 0020+00 1/0 0/0 0/0 .text daNpcTks_Draw__FPv */ static int daNpcTks_Draw(void* a_this) { return static_cast(a_this)->Draw(); } /* 80B1C448-80B1C450 007F08 0008+00 1/0 0/0 0/0 .text daNpcTks_IsDelete__FPv */ static int daNpcTks_IsDelete(void* a_this) { return 1; } /* 80B1C480-80B1C4F8 007F40 0078+00 1/0 0/0 0/0 .text setParam__10daNpcTks_cFv */ void daNpcTks_c::setParam() { mAcchCir.SetWallR(daNpcTks_Param_c::m.common.width); mAcchCir.SetWallH(daNpcTks_Param_c::m.common.knee_length); gravity = fopAcM_checkCarryNow(this) != 0 ? 0.0f: daNpcTks_Param_c::m.common.gravity; maxFallSpeed = -50.0f; } /* 80B1CB54-80B1CC28 008614 00D4+00 1/0 0/0 0/0 .text ctrlBtk__10daNpcTks_cFv */ BOOL daNpcTks_c::ctrlBtk() { if (mpMatAnm != NULL) { J3DAnmTextureSRTKey* i_anm = getTexSRTKeyAnmP(l_arcName, l_btkGetParamList[0].fileIdx); J3DAnmTextureSRTKey* i_btk = mBtkAnm.getBtkAnm(); if (i_anm == i_btk) { mpMatAnm->setNowOffsetX((f32)cM_ssin(mEyeAngle.y) * 0.2f * -1.0f); mpMatAnm->setNowOffsetY((f32)cM_ssin(mEyeAngle.x) * 0.2f); mpMatAnm->onEyeMoveFlag(); return TRUE; } mpMatAnm->offEyeMoveFlag(); } return FALSE; } /* 80B1CC28-80B1CFD0 0086E8 03A8+00 1/0 0/0 0/0 .text setAttnPos__10daNpcTks_cFv */ void daNpcTks_c::setAttnPos() { if(mLookMode == 1) { for (int i = 0; i < 3; i++) { mLookatAngle[i].setall(0); } } J3DModelData* mdlData_p = mAnm_p->getModel()->getModelData(); for (u16 i = 0; i < mdlData_p->getJointNum(); i++) { mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack); } setMtx(); lookat(); if (field_0x138a) { eyePos = current.pos; eyePos.y += 80.0f; } else { cXyz sp2c(10.0f, 10.0f, 0.0f); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(0x11)); mDoMtx_stack_c::multVecZero(&mHeadPos); mDoMtx_stack_c::multVec(&sp2c, &eyePos); sp2c.x = 0.0f; mDoMtx_stack_c::multVec(&sp2c, &sp2c); mHeadAngle.x = cLib_targetAngleX(&mHeadPos, &sp2c); mHeadAngle.y = cLib_targetAngleY(&mHeadPos, &sp2c); } cXyz* attnPos = mLookat.getAttnPos(); if (attnPos != NULL) { cXyz sp38(*attnPos - eyePos); mEyeAngle.y = -(mLookatAngle[2].y + mCurAngle.y); mEyeAngle.y += cM_atan2s(sp38.x, sp38.z); mEyeAngle.x = -cM_atan2s(sp38.y, sp38.absXZ()); } else { mEyeAngle.y = 0; mEyeAngle.x = 0; } attention_info.position.set(current.pos.x, current.pos.y + daNpcTks_Param_c::m.common.attention_offset, current.pos.z); if (!fopAcM_checkCarryNow(this)) { if (!field_0x138a) { mCyl.SetC(current.pos); #ifdef DEBUG mCyl.SetH(daNpcTks_Param_c::m.common.height); mCyl.SetR(daNpcTks_Param_c::m.common.width); #endif dComIfG_Ccsp()->Set(&mCyl); } if (mTksTsubo.field_0x586 != 0) { mTksTsubo.mCyl.SetC(mTksTsubo.mPos); dComIfG_Ccsp()->Set(&mTksTsubo.mCyl); } } } /* 80B1D1FC-80B1D204 008CBC 0008+00 1/0 0/0 0/0 .text drawDbgInfo__10daNpcTks_cFv */ BOOL daNpcTks_c::drawDbgInfo() { return FALSE; } /* 80B1D204-80B1D35C 008CC4 0158+00 1/0 0/0 0/0 .text drawOtherMdls__10daNpcTks_cFv */ void daNpcTks_c::drawOtherMdls() { if (mTksTsubo.field_0x586 != 0) { J3DModel* model = mTksTsubo.mpModelMorf->getModel(); if (mTwilight) { g_env_light.settingTevStruct(4, &mTksTsubo.mPos, &mTksTsubo.mTevStr); } else { g_env_light.settingTevStruct(8, &mTksTsubo.mPos, &mTksTsubo.mTevStr); } g_env_light.setLightTevColorType_MAJI(model, &mTksTsubo.mTevStr); dComIfGd_setListBG(); mTksTsubo.mpModelMorf->entryDL(); dComIfGd_setList(); cXyz* pcVar1; if (field_0x138a) { pcVar1 = ¤t.pos; } else { pcVar1 = &mTksTsubo.mPos; } f32 fVar1; if (field_0x138a) { fVar1 = mGroundH; } else { fVar1 = mTksTsubo.mGroundH; } cBgS_PolyInfo* polyBase; if (field_0x138a) { polyBase = &mGndChk; } else { polyBase = &mTksTsubo.polyBase; } mTksTsubo.mShadowKey = dComIfGd_setShadow(mTksTsubo.mShadowKey, 1, model, pcVar1, daNpcTks_Param_c::m.common.real_shadow_size, 30.0f, pcVar1->y, fVar1, *polyBase, &mTksTsubo.mTevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } } /* 80B1E408-80B1E428 -00001 0020+00 1/0 0/0 0/0 .data daNpcTks_MethodTable */ static actor_method_class daNpcTks_MethodTable = { (process_method_func)daNpcTks_Create, (process_method_func)daNpcTks_Delete, (process_method_func)daNpcTks_Execute, (process_method_func)daNpcTks_IsDelete, (process_method_func)daNpcTks_Draw, }; /* 80B1E428-80B1E458 -00001 0030+00 0/0 0/0 1/0 .data g_profile_NPC_TKS */ extern actor_process_profile_definition g_profile_NPC_TKS = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_NPC_TKS, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daNpcTks_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 374, // mPriority &daNpcTks_MethodTable, // sub_method 0x08044108, // mStatus fopAc_NPC_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };