/** * @file d_a_npc_bouS.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_bouS.h" #include "JSystem/JHostIO/JORFile.h" #include "d/actor/d_a_tag_instruction.h" #include "d/d_item.h" #include "d/actor/d_a_npc_wrestler.h" #include "Z2AudioLib/Z2Instances.h" #include "d/d_camera.h" enum Bou_RES_File_ID { /* BCK */ /* 0x06 */ BCK_BOU_F_TALK_A = 0x6, /* 0x07 */ BCK_BOU_STEP, /* 0x08 */ BCK_BOU_WAIT_A, /* BMDR */ /* 0x0B */ BMDR_BOU = 0xB, /* BTK */ /* 0x0E */ BTK_BOU = 0xE, /* BTP */ /* 0x11 */ BTP_BOU = 0x11, }; enum Bou4_RES_File_ID { /* BCK */ /* 0x05 */ BCK_BOU4_CONSIDER = 0x5, /* 0x06 */ BCK_BOU4_CONSIDERING, /* 0x07 */ BCK_BOU4_F_CONSIDER, /* 0x08 */ BCK_BOU4_F_CONSIDERING, /* 0x09 */ BCK_BOU4_F_TALK_A, /* 0x0A */ BCK_BOU4_F_TALK_B, /* 0x0B */ BCK_BOU4_FH_TALK_B, /* 0x0C */ BCK_BOU4_LOOKBACK, /* 0x0D */ BCK_BOU4_ORDER, /* 0x0E */ BCK_BOU4_STEP, /* 0x0F */ BCK_BOU4_TALK_B, /* 0x10 */ BCK_BOU4_TALK_C, /* 0x11 */ BCK_BOU4_THINKING_A, /* 0x12 */ BCK_BOU4_THINKING_B, /* 0x13 */ BCK_BOU4_UNADUKI, /* 0x14 */ BCK_BOU4_WAIT_A, /* 0x15 */ BCK_BOU4_WALK, /* 0x16 */ BCK_BOU4_WORRY_WAIT, /* BTP */ /* 0x19 */ BTP_BOU4_F_CONSIDER = 0x19, /* 0x1A */ BTP_BOU4_F_CONSIDERING, /* 0x1B */ BTP_BOU4_F_TALK_B, /* 0x1C */ BTP_BOU4_FH_TALK_B, /* EVT */ /* 0x1F */ EVT_BOU4_EVENT_LIST = 0x1F, }; enum RES_Name { /* 0x0 */ BOU, /* 0x1 */ BOU4, }; enum Animation { /* 0x00 */ ANM_NONE, /* 0x01 */ ANM_F_TALK_A, /* 0x02 */ ANM_F_TALK_A_2, /* 0x03 */ ANM_F_CONSIDER, /* 0x04 */ ANM_F_CONSIDERING, /* 0x05 */ ANM_F_TALK_B, /* 0x06 */ ANM_FH_TALK_B, /* 0x07 */ ANM_WAIT_A, /* 0x0A */ ANM_LOOKBACK = 0xA, /* 0x0B */ ANM_ORDER, /* 0x0C */ ANM_STEP, /* 0x0D */ ANM_TALK_B, /* 0x0E */ ANM_TALK_C, /* 0x0F */ ANM_UNADUKI, /* 0x10 */ ANM_WAIT_A_2, /* 0x11 */ ANM_WORRY_WAIT, /* 0x12 */ ANM_WALK, /* 0x13 */ ANM_CONSIDER, /* 0x14 */ ANM_CONSIDERING, /* 0x15 */ ANM_THINKING_A, /* 0x16 */ ANM_THINKING_B, }; enum Expression_BTP { /* 0x0 */ EXPR_BTP_BOU, /* 0x1 */ EXPR_BTP_F_CONSIDER, /* 0x2 */ EXPR_BTP_F_CONSIDERING, /* 0x3 */ EXPR_BTP_F_TALK_B, /* 0x4 */ EXPR_BTP_FH_TALK_B, }; enum Expression { /* 0x2 */ EXPR_TALK_A = 0x2, /* 0x3 */ EXPR_CONSIDER, /* 0x4 */ EXPR_TALK_B, /* 0x5 */ EXPR_NONE, }; enum Motion { /* 0x06 */ MOT_WAIT_A = 0x6, /* 0x07 */ MOT_WORRY_WAIT, /* 0x09 */ MOT_TALK_C = 0x9, /* 0x0A */ MOT_UNADUKI, /* 0x0B */ MOT_LOOKBACK, /* 0x0C */ MOT_ORDER, /* 0x0D */ MOT_TALK_B, /* 0x0E */ MOT_CONSIDER, /* 0x0F */ MOT_CONSIDERING, /* 0x10 */ MOT_THINKING_A, /* 0x11 */ MOT_THINKING_B, /* 0x12 */ MOT_WALK, /* 0x13 */ MOT_STEP, }; enum Joint { /* 0x00 */ JNT_CENTER, /* 0x01 */ JNT_BACKBONE1, /* 0x02 */ JNT_BACKBONE2, /* 0x03 */ JNT_NECK, /* 0x04 */ JNT_HEAD, /* 0x05 */ JNT_CHIN, /* 0x06 */ JNT_MAYU_L, /* 0x07 */ JNT_MAYU_R, /* 0x08 */ JNT_MOUTH, /* 0x09 */ JNT_SHOULDERL, /* 0x0A */ JNT_ARML1, /* 0x0B */ JNT_ARML2, /* 0x0C */ JNT_HANDL, /* 0x0D */ JNT_FINGERL1, /* 0x0E */ JNT_THAMBL, /* 0x0F */ JNT_SHOULDERR, /* 0x10 */ JNT_ARMR1, /* 0x11 */ JNT_ARMR2, /* 0x12 */ JNT_HANDR, /* 0x13 */ JNT_FINGERR1, /* 0x14 */ JNT_THAMBR, /* 0x15 */ JNT_SKIRT1, /* 0x16 */ JNT_SKIRT2, /* 0x17 */ JNT_SKIRTL1, /* 0x18 */ JNT_SKIRTL2, /* 0x19 */ JNT_SKIRTR1, /* 0x1A */ JNT_SKIRTR2, /* 0x1B */ JNT_WAIST, /* 0x1C */ JNT_LEGL1, /* 0x1D */ JNT_LEGL2, /* 0x1E */ JNT_FOOTL, /* 0x1F */ JNT_LEGR1, /* 0x20 */ JNT_LEGR2, /* 0x21 */ JNT_FOOTR, }; enum Event { /* 0x0 */ EVENT_NONE, /* 0x1 */ EVENT_INTRO_SUMO1, /* 0x2 */ EVENT_INTRO_SUMO2, /* 0x3 */ EVENT_INTRO_SUMO3, }; static daNpc_GetParam2 l_bckGetParamList[23] = { {-1, J3DFrameCtrl::EMode_LOOP, BOU}, {BCK_BOU_F_TALK_A, J3DFrameCtrl::EMode_NONE, BOU}, {BCK_BOU4_F_TALK_A, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_F_CONSIDER, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_F_CONSIDERING, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU4_F_TALK_B, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_FH_TALK_B, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU_WAIT_A, J3DFrameCtrl::EMode_LOOP, BOU}, {-1, J3DFrameCtrl::EMode_LOOP, BOU}, {BCK_BOU_STEP, J3DFrameCtrl::EMode_NONE, BOU}, {BCK_BOU4_LOOKBACK, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_ORDER, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_STEP, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_TALK_B, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_TALK_C, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_UNADUKI, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_WAIT_A, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU4_WORRY_WAIT, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU4_WALK, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU4_CONSIDER, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_CONSIDERING, J3DFrameCtrl::EMode_LOOP, BOU4}, {BCK_BOU4_THINKING_A, J3DFrameCtrl::EMode_NONE, BOU4}, {BCK_BOU4_THINKING_B, J3DFrameCtrl::EMode_LOOP, BOU4}, }; static daNpc_GetParam2 l_btpGetParamList[5] = { {BTP_BOU, J3DFrameCtrl::EMode_LOOP, BOU}, {BTP_BOU4_F_CONSIDER, J3DFrameCtrl::EMode_NONE, BOU4}, {BTP_BOU4_F_CONSIDERING, J3DFrameCtrl::EMode_LOOP, BOU4}, {BTP_BOU4_F_TALK_B, J3DFrameCtrl::EMode_NONE, BOU4}, {BTP_BOU4_FH_TALK_B, J3DFrameCtrl::EMode_LOOP, BOU4}, }; static daNpc_GetParam2 l_btkGetParamList[1] = { {BTK_BOU, J3DFrameCtrl::EMode_LOOP, BOU}, }; static char* l_arcNames[2] = { "Bou", "Bou4", }; static char* l_evtNames[4] = { NULL, "BOUS_INTRO_SUMO1", "BOUS_INTRO_SUMO2", "BOUS_INTRO_SUMO3", }; static char* l_myName = "BouS"; static cXyz l_createPos(1000000000.0f, 1000000000.0f, 1000000000.0f); static NPC_BOUS_HIO_CLASS l_HIO; #if DEBUG daNpcBouS_HIO_c::daNpcBouS_HIO_c() { m = daNpcBouS_Param_c::m; } void daNpcBouS_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) { char buffer[2000]; JORReflexible::listenPropertyEvent(event); JORFile jorFile; int length; switch ((int)event->id) { case 0x40000002: if (jorFile.open(6, "", NULL, NULL, NULL)) { memset(buffer, 0, sizeof(buffer)); length = 0; daNpcF_commonListenPropertyEvent(buffer, &length, &m.common); length = strlen(buffer); jorFile.writeData(buffer, length); jorFile.close(); OS_REPORT("write append success!::%6d\n", length); } else { OS_REPORT("write append failure!\n"); } } } void daNpcBouS_HIO_c::genMessage(JORMContext* ctx) { ctx->genSlider("興奮度", &m.excitement_level, 0.0f, 1.0f); ctx->genSlider("会話距離", &m.talk_dist, 0.0f, 500.0f); ctx->genSlider("目線 X", &m.gaze_x, -500.0f, 500.0f); ctx->genSlider("目線 Y", &m.gaze_y, -500.0f, 500.0f); ctx->genSlider("目線 Z", &m.gaze_z, -500.0f, 500.0f); ctx->genSlider("Eye 距離", &m.eye_dist, 0.0f, 3000.0f); ctx->genSlider("Eye 角度X", &m.eye_angle_x, -0x8000, 0x7FFF); ctx->genSlider("Eye 角度Y", &m.eye_angle_y, -0x8000, 0x7FFF); } #endif daNpcBouS_c::eventFunc daNpcBouS_c::mEvtSeqList[4] = { NULL, &daNpcBouS_c::EvCut_BousIntroSumo1, &daNpcBouS_c::EvCut_BousIntroSumo2, &daNpcBouS_c::EvCut_BousIntroSumo3, }; daNpcBouS_c::daNpcBouS_c() {} daNpcBouS_c::~daNpcBouS_c() { for (int i = 0; i < 2; i++) { dComIfG_resDelete(&mPhases[i], l_arcNames[i]); } if (heap != NULL) { mAnm_p->stopZelAnime(); } #if DEBUG if (mHIO != NULL) { mHIO->removeHIO(); } #endif } daNpcBouS_HIOParam const daNpcBouS_Param_c::m = { 220.0f, -3.0f, 1.0f, 400.0f, 255.0f, 200.0f, 35.0f, 40.0f, 0.0f, 0.0f, 10.0f, -10.0f, 30.0f, -10.0f, 45.0f, -45.0f, 0.6f, 12.0f, 3, 6, 0x13, 6, 80.0f, 500.0f, 300.0f, -300.0f, 60, 8, 0, 0, 0, false, false, 0.0f, 220.0f, 0.0f, 100.0f, 80.0f, 654.78497f, -0x14AF, -0x5C3A, 0, }; cPhs__Step daNpcBouS_c::Create() { fopAcM_ct(this, daNpcBouS_c); mMsgNo = getMessageNo(); cPhs__Step phase = cPhs_ERROR_e; for (int i = 0; i < 2; i++) { phase = (cPhs__Step)dComIfG_resLoad(&mPhases[i], l_arcNames[i]); if (phase != cPhs_COMPLEATE_e) { return phase; } } if (phase == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0x3D40)) { return cPhs_ERROR_e; } J3DModelData* mdlData_p = mAnm_p->getModel()->getModelData(); fopAcM_SetMtx(this, mAnm_p->getModel()->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -160.0f, -50.0f, -160.0f, 160.0f, 220.0f, 160.0f); mSound.init(¤t.pos, &eyePos, 3, 1); #if DEBUG mHIO = &l_HIO; mHIO->entryHIO("ボウ(着衣)"); #endif mAcchCir.SetWall(mHIO->m.common.width, mHIO->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(mHIO->m.common.weight, 0, this); mCyl.Set(mCcDCyl); mCyl.SetStts(&mCcStts); mAcch.CrrPos(dComIfG_Bgsp()); mGndChk = mAcch.m_gnd; mGroundH = mAcch.GetGroundH(); setEnvTevColor(); setRoomNo(); reset(); Execute(); } return phase; } int daNpcBouS_c::CreateHeap() { J3DModelData* mdlData_p = NULL; J3DModel* mdl_p = NULL; mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_arcNames[0], BMDR_BOU); JUT_ASSERT(393, NULL != mdlData_p); u32 i_differedDlistFlag = 0x11020284; mAnm_p = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, J3DMdlFlag_DifferedDLBuffer, i_differedDlistFlag); if (mAnm_p != NULL && mAnm_p->getModel() == NULL) { mAnm_p->stopZelAnime(); mAnm_p = NULL; } if (mAnm_p == NULL) { return 0; } mdl_p = mAnm_p->getModel(); for (u16 i = 0; i getJointNum(); i++) { mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack); } mdl_p->setUserArea((uintptr_t)this); mpMatAnm = new daNpcF_MatAnm_c(); if (mpMatAnm == NULL) { return 0; } if (!setExpressionAnm(ANM_F_TALK_A, false)) { return 0; } setMotionAnm(ANM_WAIT_A, 0.0f); return 1; } int daNpcBouS_c::Delete() { fopAcM_RegisterDeleteID(this, "NPC_BOU_S"); this->~daNpcBouS_c(); return 1; } int daNpcBouS_c::Execute() { execute(); return 1; } int daNpcBouS_c::Draw() { if (!mDispFlag) { return 1; } J3DModelData* mdlData_p = mAnm_p->getModel()->getModelData(); mdlData_p->getMaterialNodePointer(1)->setMaterialAnm(mpMatAnm); draw(FALSE, FALSE, mHIO->m.common.real_shadow_size, NULL, FALSE); return 1; } int daNpcBouS_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { int jntNo = i_joint->getJntNo(); int lookatJoints[3] = {JNT_BACKBONE1, JNT_NECK, JNT_HEAD}; if (jntNo == 0) { mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_BACKBONE1)); mDoMtx_stack_c::multVecZero(&mLookatPos[0]); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_NECK)); 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_BACKBONE1: case JNT_NECK: case JNT_HEAD: setLookatMtx(jntNo, lookatJoints, mHIO->m.common.neck_rotation_ratio); break; } if (jntNo == JNT_BACKBONE1) { mDoMtx_stack_c::YrotM(field_0x908[0].z); mDoMtx_stack_c::ZrotM(-field_0x908[0].x); } else if (jntNo == JNT_HEAD) { mDoMtx_stack_c::YrotM(field_0x908[2].z); mDoMtx_stack_c::ZrotM(field_0x908[2].x); } i_model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); #if DEBUG cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); #else MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); #endif if ((jntNo == JNT_HEAD || jntNo == JNT_MOUTH) && (mAnmFlags & ANM_PLAY_BCK)) { J3DAnmTransform* anm = mBckAnm.getBckAnm(); mBckAnm.changeBckOnly(mAnm_p->getAnm()); mAnm_p->changeAnm(anm); } return 1; } int daNpcBouS_c::createHeapCallBack(fopAc_ac_c* i_this) { daNpcBouS_c* actor = (daNpcBouS_c*)i_this; return actor->CreateHeap(); } int daNpcBouS_c::ctrlJointCallBack(J3DJoint* i_joint, int param_2) { if (param_2 == 0) { J3DModel* mdl_p = j3dSys.getModel(); daNpcBouS_c* actor = (daNpcBouS_c*)mdl_p->getUserArea(); if (actor != NULL) { actor->ctrlJoint(i_joint, mdl_p); } } return 1; } bool daNpcBouS_c::setExpressionAnm(int i_idx, bool i_modify) { mAnmFlags &= ~ANM_EXPRESSION_FLAGS; J3DAnmTransform* bckAnm; if (l_bckGetParamList[i_idx].fileIdx >= 0) { bckAnm = getTrnsfrmKeyAnmP(l_arcNames[l_bckGetParamList[i_idx].arcIdx], l_bckGetParamList[i_idx].fileIdx); } else { bckAnm = NULL; } s32 i_attr = l_bckGetParamList[i_idx].attr; bool res = false; switch (i_idx) { case ANM_NONE: res = setExpressionBtp(EXPR_BTP_BOU); break; case ANM_F_TALK_A: res = setExpressionBtp(EXPR_BTP_BOU); break; case ANM_F_TALK_A_2: res = setExpressionBtp(EXPR_BTP_BOU); break; case ANM_F_CONSIDER: res = setExpressionBtp(EXPR_BTP_F_CONSIDER); break; case ANM_F_CONSIDERING: res = setExpressionBtp(EXPR_BTP_F_CONSIDERING); break; case ANM_F_TALK_B: res = setExpressionBtp(EXPR_BTP_F_TALK_B); break; case ANM_FH_TALK_B: res = setExpressionBtp(EXPR_BTP_FH_TALK_B); break; default: bckAnm = NULL; break; } if (!res) { return false; } if (bckAnm == NULL) { return true; } if (setBckAnm(bckAnm, 1.0f, i_attr, 0, -1, i_modify)) { mAnmFlags |= (ANM_PAUSE_BCK | ANM_PLAY_BCK); mExpressionLoops = 0; return true; } OS_REPORT("%s: 表情Bckアニメーションの登録に失敗しました!\n", __FILE__); return false; } bool daNpcBouS_c::setExpressionBtp(int i_idx) { J3DAnmTexPattern* btp = getTexPtrnAnmP(l_arcNames[l_btpGetParamList[i_idx].arcIdx], l_btpGetParamList[i_idx].fileIdx); s32 i_attr = l_btpGetParamList[i_idx].attr; mAnmFlags &= ~(ANM_PAUSE_BTP | ANM_PLAY_BTP | ANM_FLAG_800); if (btp == NULL) { return true; } if (setBtpAnm(btp, mAnm_p->getModel()->getModelData(), 1.0f, i_attr)) { mAnmFlags |= ANM_PAUSE_BTP | ANM_PLAY_BTP; if (i_idx == EXPR_BTP_BOU) { mAnmFlags |= ANM_FLAG_800; } return true; } OS_REPORT("%s: 表情Btpアニメーションの登録に失敗しました!\n", __FILE__); return false; } void daNpcBouS_c::setMotionAnm(int i_idx, f32 i_morf) { int btk_idx; switch (i_idx) { default: btk_idx = 0; break; } J3DAnmTransformKey* morfAnm = getTrnsfrmKeyAnmP(l_arcNames[l_bckGetParamList[i_idx].arcIdx], l_bckGetParamList[i_idx].fileIdx); J3DAnmTextureSRTKey* btk = getTexSRTKeyAnmP(l_arcNames[l_btkGetParamList[btk_idx].arcIdx], l_btkGetParamList[btk_idx].fileIdx); int morfAttr = l_bckGetParamList[i_idx].attr; int btkAttr = l_btkGetParamList[btk_idx].attr; mAnmFlags &= ~ANM_MOTION_FLAGS; if (morfAnm != NULL && setMcaMorfAnm(morfAnm, 1.0f, i_morf, morfAttr, 0, -1)) { mAnmFlags |= ANM_PLAY_MORF | ANM_PAUSE_MORF; mMotionLoops = 0; } if (btk != NULL && setBtkAnm(btk, mAnm_p->getModel()->getModelData(), 1.0f, btkAttr)) { mAnmFlags |= ANM_PAUSE_BTK | ANM_PLAY_BTK; } } void daNpcBouS_c::reset() { initialize(); mpMatAnm->initialize(); mLookat.initialize(); for (int i = 0; i < 1; i++) { mActorMngrs[i].initialize(); } mTimer = 0; mInstructionMode = 0; mAction = NULL; mLookMode = -1; mMode = 0; mDispFlag = 1; current.pos.set(home.pos); old.pos.set(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); mItemPartnerId = fpcM_ERROR_PROCESS_ID_e; mOrderEvtNo = EVENT_NONE; if (checkIntroDemoStart()) { setAction(&daNpcBouS_c::demo); } else { setAction(&daNpcBouS_c::wait); } mExpressionMorfOverride = 0.0f; mMotionMorfOverride = 0.0f; } BOOL daNpcBouS_c::setAction(actionFunc action) { mMode = 3; if (mAction) { (this->*mAction)(NULL); } mMode = 0; mAction = action; if (mAction) { (this->*mAction)(NULL); } return TRUE; } static void* s_sub(void* i_actor, void* i_data) { if ( fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Tag_Instruction && ((daNpcBouS_c*)i_data)->checkInstructionTag((fopAc_ac_c*)i_actor) ) { return i_actor; } return NULL; } bool daNpcBouS_c::checkInstructionTag(fopAc_ac_c* i_this) { daTagInst_c* actor = (daTagInst_c*)i_this; if (getArenaNo() == actor->getInstructionNo()) { return true; } return false; } void daNpcBouS_c::setParam() { s16 attention_distance = 5; s16 attention_angle = 6; s16 talk_distance = 3; s16 talk_angle = 6; attention_info.distances[fopAc_attn_LOCK_e] = getDistTableIdx(attention_distance, 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); #if PLATFORM_SHIELD attention_info.flags = fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e; #else attention_info.flags = mMsgNo > 0 ? fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e : 0; #endif mAcchCir.SetWallR(mHIO->m.common.width); mAcchCir.SetWallH(mHIO->m.common.knee_length); gravity = mHIO->m.common.gravity; } BOOL daNpcBouS_c::main() { if (mAction) { (this->*mAction)(NULL); } if (dComIfGp_event_runCheck() && !eventInfo.checkCommandTalk() && mItemPartnerId != fpcM_ERROR_PROCESS_ID_e) { dComIfGp_event_setItemPartnerId(mItemPartnerId); mItemPartnerId = fpcM_ERROR_PROCESS_ID_e; } playExpression(); playMotion(); return TRUE; } void daNpcBouS_c::playExpression() { daNpcF_anmPlayData dat0 = {ANM_F_TALK_A, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1 = {ANM_F_TALK_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[1] = {&dat1}; daNpcF_anmPlayData dat2a = {ANM_F_CONSIDER, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat2b = {ANM_F_CONSIDERING, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat2[2] = {&dat2a, &dat2b}; daNpcF_anmPlayData dat3a = {ANM_F_TALK_B, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat3b = {ANM_FH_TALK_B, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat3[2] = {&dat3a, &dat3b}; daNpcF_anmPlayData dat4 = {ANM_NONE, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat4[1] = {&dat4}; daNpcF_anmPlayData** ppDat[6] = { pDat0, NULL, pDat1, pDat2, pDat3, pDat4, }; if (mExpression >= 0 && mExpression < 6) { playExpressionAnm(ppDat); } } void daNpcBouS_c::playMotion() { daNpcF_anmPlayData dat0 = {ANM_WAIT_A, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&dat0}; daNpcF_anmPlayData dat1 = {ANM_WAIT_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat1[1] = {&dat1}; daNpcF_anmPlayData dat2 = {ANM_WORRY_WAIT, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat2[1] = {&dat2}; daNpcF_anmPlayData dat3a = {ANM_TALK_C, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat3b = {ANM_WAIT_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat3[2] = {&dat3a, &dat3b}; daNpcF_anmPlayData dat4a = {ANM_UNADUKI, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat4b = {ANM_WORRY_WAIT, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat4[2] = {&dat4a, &dat4b}; daNpcF_anmPlayData dat5a = {ANM_LOOKBACK, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat5b = {ANM_WAIT_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat5[2] = {&dat5a, &dat5b}; daNpcF_anmPlayData dat6a = {ANM_ORDER, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat6b = {ANM_WAIT_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat6[2] = {&dat6a, &dat6b}; daNpcF_anmPlayData dat7a = {ANM_TALK_B, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat7b = {ANM_WAIT_A_2, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat7[2] = {&dat7a, &dat7b}; daNpcF_anmPlayData dat8a = {ANM_CONSIDER, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat8b = {ANM_CONSIDERING, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat8[2] = {&dat8a, &dat8b}; daNpcF_anmPlayData dat9 = {ANM_CONSIDERING, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat9[1] = {&dat9}; daNpcF_anmPlayData dat10a = {ANM_THINKING_A, mHIO->m.common.morf_frame, 1}; daNpcF_anmPlayData dat10b = {ANM_THINKING_B, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat10[2] = {&dat10a, &dat10b}; daNpcF_anmPlayData dat11 = {ANM_THINKING_B, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat11[1] = {&dat11}; daNpcF_anmPlayData dat12 = {ANM_WALK, mHIO->m.common.morf_frame, 0}; daNpcF_anmPlayData* pDat12[1] = {&dat12}; daNpcF_anmPlayData dat13 = {ANM_STEP, 4.0f, 1}; daNpcF_anmPlayData* pDat13[1] = {&dat13}; daNpcF_anmPlayData** ppDat[20] = { pDat0, NULL, NULL, NULL, NULL, NULL, pDat1, pDat2, NULL, pDat3, pDat4, pDat5, pDat6, pDat7, pDat8, pDat9, pDat10, pDat11, pDat12, pDat13, }; if (mMotion >= 0 && mMotion < 0x14) { mMotionPhaseCopy = mMotionPhase; playMotionAnm(ppDat); } } BOOL daNpcBouS_c::ctrlBtk() { if (mpMatAnm != NULL) { J3DAnmTextureSRTKey* btk = NULL; btk = getTexSRTKeyAnmP(l_arcNames[l_btkGetParamList[0].arcIdx], l_btkGetParamList[0].fileIdx); if (btk == mBtkAnm.getBtkAnm()) { mpMatAnm->setNowOffsetX(cM_ssin(mEyeAngle.y) * 0.2f * -1.0f); mpMatAnm->setNowOffsetY(cM_ssin(mEyeAngle.x) * 0.2f); mpMatAnm->onEyeMoveFlag(); return TRUE; } mpMatAnm->offEyeMoveFlag(); } return FALSE; } void daNpcBouS_c::setAttnPos() { static cXyz eyeOffset(-10.0f, 10.0f, 0.0f); cXyz* attnPos = NULL; cXyz sp44, sp50, sp5c; 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++) { sp50.set(0.0f, 0.0f, field_0x984[i] * cM_ssin(field_0x992)); mDoMtx_stack_c::multVec(&sp50, &sp5c); field_0x908[i].x = -sp5c.z; field_0x908[i].z = -sp5c.x; } cLib_chaseS(&field_0x992, 0, 0x555); if (mLookMode == LOOK_RESET) { for (int i = 0; i < 3; i++) { mLookatAngle[i].setall(0); } } setMtx(); lookat(); mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::multVecZero(&mHeadPos); mDoMtx_stack_c::multVec(&eyeOffset, &eyePos); eyeOffset.y = 0.0f; mDoMtx_stack_c::multVec(&eyeOffset, &sp50); mHeadAngle.x = cLib_targetAngleX(&mHeadPos, &sp50); mHeadAngle.y = cLib_targetAngleY(&mHeadPos, &sp50); attnPos = mLookat.getAttnPos(); if (attnPos != NULL) { sp44 = *attnPos - eyePos; mEyeAngle.y = -(mLookatAngle[2].y + mCurAngle.y); mEyeAngle.y += cM_atan2s(sp44.x, sp44.z); mEyeAngle.x = mHeadAngle.x - cM_atan2s(sp44.y, sp44.absXZ()); } else { mEyeAngle.y = 0; mEyeAngle.x = 0; } cXyz sp68; f32 attnOffset = mHIO->m.common.attention_offset; sp44.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(&sp44, &sp68); attention_info.position.set(sp68.x, sp68.y + attnOffset, sp68.z); mCyl.SetTgType(0); mCyl.SetTgSPrm(0); mCyl.SetC(sp68); mCyl.SetH(mHIO->m.common.height); mCyl.SetR(mHIO->m.common.width); dComIfG_Ccsp()->Set(&mCyl); } void daNpcBouS_c::lookat() { daPy_py_c* player = NULL; J3DModel* mdl_p = mAnm_p->getModel(); BOOL i_snap = FALSE; f32 body_angleX_min = mHIO->m.common.body_angleX_min; f32 body_angleX_max = mHIO->m.common.body_angleX_max; f32 body_angleY_min = mHIO->m.common.body_angleY_min; f32 body_angleY_max = mHIO->m.common.body_angleY_max; f32 head_angleX_min = mHIO->m.common.head_angleX_min; f32 head_angleX_max = mHIO->m.common.head_angleX_max; f32 head_angleY_min = mHIO->m.common.head_angleY_min; f32 head_angleY_max = mHIO->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: 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; } if (player != NULL) { mLookPos = player->attention_info.position; if (mLookMode != LOOK_PLAYER && mLookMode != LOOK_PLAYER_TALK) { 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, mdl_p->getBaseTRMtx(), lookatAngle, i_snap, angle_delta, FALSE); } BOOL daNpcBouS_c::chkFindPlayer() { BOOL inArea = FALSE; if (mActorMngrs[0].getActorP() == NULL) { inArea = chkPlayerInSpeakArea(this); } else { inArea = chkPlayerInTalkArea(this); } if (inArea) { mActorMngrs[0].entry(daPy_getPlayerActorClass()); } else { mActorMngrs[0].remove(); } return inArea; } BOOL daNpcBouS_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_STEP, -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; } bool daNpcBouS_c::wait(void* param_1) { switch (mMode) { case 0: setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); mTurnMode = 0; speedF = 0.0f; mMode = 2; break; case 2: if (mActorMngrs[0].getActorP() != NULL) { if (!chkFindPlayer()) { mTurnMode = 0; } } else if (chkFindPlayer()) { mTurnMode = 0; } if (mActorMngrs[0].getActorP() != NULL) { setLookMode(LOOK_PLAYER); } else { setLookMode(LOOK_NONE); if (home.angle.y != mCurAngle.y && step(home.angle.y, 1)) { setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); mTurnMode = 0; } } if (!checkItemGet(fpcNm_ITEM_HVY_BOOTS, 1) && dComIfGs_isTbox(2)) { mForcibleTalk = 1; } if (dComIfGp_event_runCheck()) { if (eventInfo.checkCommandTalk()) { if (!dComIfGp_event_chkTalkXY() || dComIfGp_evmng_ChkPresentEnd()) { if (daNpcF_chkEvtBit(231)) { // dSv_event_flag_c::F_0231 - Ordon Village - Did first wrestle match with Bo setAction(&daNpcBouS_c::talk); } else { mOrderEvtNo = EVENT_INTRO_SUMO2; changeEvent("Bou4", l_evtNames[mOrderEvtNo], 1, 0xFFFF); setAction(&daNpcBouS_c::demo); } } } else { s32 staffId = dComIfGp_getEventManager().getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { setAction(&daNpcBouS_c::demo); } } } else { if (mOrderEvtNo != EVENT_NONE) { eventInfo.setArchiveName("Bou4"); } orderEvent(mForcibleTalk, l_evtNames[mOrderEvtNo], 0xFFFF, 40, 0xFF, 1); } break; case 3: break; default: JUT_ASSERT(1527, FALSE); break; } return true; } void daNpcBouS_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 < 20) { mMotion = motion; mMotionMorfOverride = i_morf; mMotionPrevPhase = -1; mMotionPhase = 0; mMotionPhaseCopy = 0; } } void daNpcBouS_c::setExpression(int i_expression, f32 i_morf) { if (i_expression >= 0 && i_expression < 6) { mExpression = i_expression; mExpressionMorfOverride = i_morf; mExpressionPrevPhase = -1; mExpressionPhase = 0; } } void daNpcBouS_c::setExpressionTalkAfter() { switch (mExpression) { case EXPR_CONSIDER: setExpressionAnm(ANM_F_CONSIDERING, true); break; case EXPR_TALK_B: setExpressionAnm(ANM_FH_TALK_B, true); break; default: setExpression(ANM_F_TALK_B, -1.0f); break; } } bool daNpcBouS_c::talk(void* param_1) { int itemNo; bool rv = false; switch (mMode) { case 0: initTalk(mMsgNo, NULL); mTurnMode = 0; mMsgTimer = 0; mForcibleTalk = 0; speedF = 0.0f; setLookMode(LOOK_PLAYER_TALK); mMode = 2; if (mMsgNo != getMessageNo()) { mMsgNo = getMessageNo(); } break; case 2: if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { mActorMngrs[0].entry(daPy_getPlayerActorClass()); itemNo = 0; u16 eventId = mFlow.getEventId(&itemNo); OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", eventId, itemNo); if (eventId == 6) { if (itemNo == 1) { setAction(&daNpcBouS_c::instruction); } else { parentActorID = fopAcM_createChild(PROC_NPC_WRESTLER, fopAcM_GetID(this), (itemNo << 24) | (getArenaNo() | 0x700), &l_createPos, fopAcM_GetRoomNo(this), NULL, NULL, getType(), NULL); setAngle(home.angle.y); setAction(&daNpcBouS_c::wait); mMsgNo = 0; attention_info.flags = 0; eventInfo.offCondition(dEvtCnd_CANTALK_e); } } else { setAction(&daNpcBouS_c::wait); } rv = 1; } else { int i_expression, i_motion; int msgTimer = mMsgTimer; 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: setExpression(EXPR_NONE, -1.0f); if (!field_0x9ec) { dComIfGp_event_reset(); } break; default: JUT_ASSERT(1614, FALSE); break; } return rv; } bool daNpcBouS_c::demo(void* param_1) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); s32 staffId = 0; switch (mMode) { case 0: setExpression(EXPR_NONE, -1.0f); setMotion(MOT_WAIT_A, -1.0f, 0); mMode = 2; // fallthrough case 2: if (dComIfGp_event_runCheck() && !eventInfo.checkCommandTalk()) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); staffId = eventManager.getMyStaffId(l_myName, NULL, 0); if (staffId != -1) { mStaffID = staffId; JUT_ASSERT(1648, NULL != mEvtSeqList[mOrderEvtNo]); if ((this->*mEvtSeqList[mOrderEvtNo])(staffId)) { eventManager.cutEnd(staffId); staffId = 1; } } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager.endCheck(mEventIdx)) { dComIfGp_event_reset(); mOrderEvtNo = EVENT_NONE; mEventIdx = -1; setAction(&daNpcBouS_c::wait); } } break; case 3: break; default: JUT_ASSERT(1676, FALSE); break; } return 1; } fopAc_ac_c* daNpcBouS_c::searchInstructionTag() { fopAc_ac_c* instructionTag = (fopAc_ac_c*)fpcM_Search(s_sub, this); return instructionTag; } bool daNpcBouS_c::instruction(void* param_1) { dCamera_c* camBody = dCam_getBody(); switch (mMode) { case 0: setLookMode(LOOK_PLAYER); mInstructionMode = 0; mTimer = 20; mDoGph_gInf_c::fadeOut(0.05f); camBody->Stop(); mMode = 2; break; case 2: switch (mInstructionMode) { case 0: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 1, 0xFFFF, 0); eventInfo.onCondition(dEvtCnd_CANDEMO_e); return false; } if (mTimer <= 0) { setInstructionPos(); cXyz camCenter(mHIO->m.gaze_x, mHIO->m.gaze_y, mHIO->m.gaze_z); cXyz camEye(0.0f, 0.0f, mHIO->m.eye_dist); mDoMtx_stack_c::transS(fopAcM_GetPosition(daPy_getPlayerActorClass())); mDoMtx_stack_c::YrotM(fopAcM_GetShapeAngle_p(daPy_getPlayerActorClass())->y); mDoMtx_stack_c::multVec(&camCenter, &camCenter); mDoMtx_stack_c::YrotM(mHIO->m.eye_angle_y); mDoMtx_stack_c::XrotM(mHIO->m.eye_angle_x); mDoMtx_stack_c::multVec(&camEye, &camEye); camBody->Set(camCenter, camEye, camBody->Fovy(), 0); mTimer = 16; mInstructionMode++; } mTimer--; break; case 1: if (mTimer-- <= 0) { mTimer = abs(20); mDoGph_gInf_c::fadeOut(-0.05f); initTalk(6, NULL); setMotionAnm(ANM_WAIT_A, 0.0f); mInstructionMode++; } break; case 2: if (talkProc(NULL, TRUE, NULL)) { mActorMngrs[0].entry(daPy_getPlayerActorClass()); parentActorID = fopAcM_createChild(PROC_NPC_WRESTLER, fopAcM_GetID(this), getArenaNo() | 0x700 | 0x2000000, &l_createPos, fopAcM_GetRoomNo(this), NULL, NULL, getType(), NULL); mInstructionMode++; } else { int i_expression, i_motion; int msgTimer = mMsgTimer; 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(); } } break; case 3: { daNpcWrestler_c* actor = (daNpcWrestler_c*)fpcM_SearchByID(parentActorID); if (actor != NULL) { if (actor->checkStartUp()) { dComIfGp_event_reset(); setAction(&daNpcBouS_c::wait); } } break; } default: JUT_ASSERT(1798, FALSE); break; } break; case 3: break; default: JUT_ASSERT(1803, FALSE); break; } return true; } bool daNpcBouS_c::checkIntroDemoStart() { if (strcmp(dComIfGp_getStartStageName(), "R_SP01") != 0 || dComIfGs_getStartPoint() != 2) { return FALSE; } OS_REPORT("イベント実行中%s 会話イベント%s\n", dComIfGp_event_runCheck() ? "です。" : "じゃないです。", eventInfo.checkCommandTalk() ? "です。" : "じゃないです。"); mOrderEvtNo = EVENT_INTRO_SUMO1; if (dComIfGp_event_runCheck()) { changeEvent("Bou4", l_evtNames[mOrderEvtNo], 1, 0xFFFF); } else { eventInfo.setArchiveName("Bou4"); orderEvent(0, l_evtNames[mOrderEvtNo], 0xFFFF, 4, 0xFF, 1); } return TRUE; } int daNpcBouS_c::EvCut_BousIntroSumo1(int i_staffId) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); int* cutName = (int*)eventManager.getMyNowCutName(i_staffId); if (eventManager.getIsAddvance(i_staffId)) { switch (*cutName) { case '0x0001': setLookMode(LOOK_PLAYER_TALK); mActorMngrs[0].entry(daPy_getPlayerActorClass()); break; case '0x0002': case '0x0003': case '0x0005': case '0x0006': case '0x0007': case '0x0008': case '0x0009': initTalk(9, NULL); break; case '0x0004': setExpressionAnm(ANM_FH_TALK_B, true); break; default: JUT_ASSERT(1870, FALSE); break; } } int i_expression, i_motion; int msgTimer = mMsgTimer; 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(); } switch (*cutName) { case '0x0001': case '0x0004': return 1; case '0x0002': case '0x0003': case '0x0005': case '0x0006': case '0x0007': case '0x0008': case '0x0009': if (talkProc(NULL, TRUE, NULL)) { s32 choiceNo = mFlow.getChoiceNo(); OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ"); if (choiceNo == 0) { mOrderEvtNo = EVENT_INTRO_SUMO3; changeEvent("Bou4", l_evtNames[mOrderEvtNo], 1, 0xFFFF); } return 1; } break; default: JUT_ASSERT(1911, FALSE); break; } return 0; } int daNpcBouS_c::EvCut_BousIntroSumo2(int i_staffId) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); int* cutName = (int*)eventManager.getMyNowCutName(i_staffId); if (eventManager.getIsAddvance(i_staffId)) { switch (*cutName) { case '0x0001': initTalk(9, NULL); setLookMode(LOOK_PLAYER_TALK); mActorMngrs[0].entry(daPy_getPlayerActorClass()); break; default: JUT_ASSERT(1939, FALSE); } } int i_expression, i_motion; int msgTimer = mMsgTimer; 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(); } switch (*cutName) { case '0x0001': if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) { if (talkProc(NULL, TRUE, NULL)) { int choiceNo = mFlow.getChoiceNo(); OS_REPORT("二択分岐 %s\n", choiceNo == 0 ? "はい" : "いいえ"); if (choiceNo == 0) { mOrderEvtNo = EVENT_INTRO_SUMO3; changeEvent("Bou4", l_evtNames[mOrderEvtNo], 1, 0xFFFF); } return 1; } } else if (step(fopAcM_searchPlayerAngleY(this), 1)) { setMotion(MOT_WAIT_A, -1.0f, 0); mTurnMode = 0; } break; default: JUT_ASSERT(1979, FALSE); break; } return 0; } int daNpcBouS_c::EvCut_BousIntroSumo3(int i_staffId) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); int* cutName = (int*)eventManager.getMyNowCutName(i_staffId); if (eventManager.getIsAddvance(i_staffId)) { switch (*cutName) { case '0x0001': setLookMode(LOOK_PLAYER_TALK); mActorMngrs[0].entry(daPy_getPlayerActorClass()); break; case '0x0003': setMotion(MOT_WALK, -1.0f, 0); // fallthrough case '0x0002': setAngle(-0x2AAA); initTalk(9, NULL); break; default: JUT_ASSERT(2012, FALSE); break; } } int i_expression, i_motion; int msgTimer = mMsgTimer; if (ctrlMsgAnm(i_expression, i_motion, this, FALSE)) { if (*cutName != 0x30303033) { setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } } else if (msgTimer != 0 && mMsgTimer == 0) { setExpressionTalkAfter(); } switch (*cutName) { case '0x0001': return 1; case '0x0002': if (talkProc(NULL, TRUE, NULL)) { return 1; } break; case '0x0003': { cXyz* pos = dComIfGp_evmng_getMyXyzP(i_staffId, "pos"); if (pos != NULL) { if (cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(¤t.pos, pos), 0x100)) { speedF = 1.2f; } else { cLib_chasePosXZ(¤t.pos, *pos, 2.5f); } setAngle(shape_angle.y); if (speedF > 0.0f) { fopAcM_posMoveF(this, NULL); } } if (talkProc(NULL, TRUE, NULL)) { int itemNo = 0; u16 eventId = mFlow.getEventId(&itemNo); OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", eventId, itemNo); if (eventId == 6) { if (itemNo == 1) { setAction((&daNpcBouS_c::instruction)); } else { parentActorID = fopAcM_createChild(PROC_NPC_WRESTLER, fopAcM_GetID(this), (itemNo << 24) | (getArenaNo() | 0x700), &l_createPos, fopAcM_GetRoomNo(this), NULL, NULL, getType(), NULL); setAngle(home.angle.y); setAction(&daNpcBouS_c::wait); } dComIfGp_event_reset(); mOrderEvtNo = EVENT_NONE; mEventIdx = -1; } return 1; } break; } default: JUT_ASSERT(2084, FALSE); break; } return 0; } static int daNpcBouS_Create(void* i_this) { return static_cast(i_this)->Create(); } static int daNpcBouS_Delete(void* i_this) { return static_cast(i_this)->Delete(); } static int daNpcBouS_Execute(void* i_this) { return static_cast(i_this)->Execute(); } static int daNpcBouS_Draw(void* i_this) { return static_cast(i_this)->Draw(); } static int daNpcBouS_IsDelete(void* i_this) { return 1; } int daNpcBouS_c::drawDbgInfo() { #if DEBUG if (mHIO->m.common.debug_info_ON) { cXyz sp48; } #endif return 0; } inline void daNpcBouS_c::drawOtherMdls() {} AUDIO_INSTANCES; static actor_method_class daNpcBouS_MethodTable = { (process_method_func)daNpcBouS_Create, (process_method_func)daNpcBouS_Delete, (process_method_func)daNpcBouS_Execute, (process_method_func)daNpcBouS_IsDelete, (process_method_func)daNpcBouS_Draw, }; actor_process_profile_definition g_profile_NPC_BOU_S = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_NPC_BOU_S, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daNpcBouS_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 325, // mPriority &daNpcBouS_MethodTable, // sub_method 0x00044100, // mStatus fopAc_NPC_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };