/** * d_a_npc_cb1.cpp * Player - Makar */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_cb1.h" #include "d/actor/d_a_obj_vmc.h" #include "d/actor/d_a_ship.h" #include "d/d_camera.h" #include "d/d_com_inf_game.h" #include "d/d_kankyo_wether.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" #include "d/d_s_play.h" #include "d/d_snap.h" #include "f_op/f_op_camera.h" #include "m_Do/m_Do_controller_pad.h" #include "d/actor/d_a_player_main.h" #include "d/res/res_cb.h" class daNpc_Cb1_HIO_c : public JORReflexible { public: daNpc_Cb1_HIO_c(); virtual ~daNpc_Cb1_HIO_c() {} void genMessage(JORMContext*) {} public: /* 0x04 */ s8 mNo; /* 0x08 */ dNpc_HIO_c mNpc; /* 0x30 */ f32 field_0x30; /* 0x34 */ f32 mPlayerChaseDistance; // distance from the player before Makar starts following him (while called) /* 0x38 */ f32 mChaseDistScale; // scales the distance to the player to get a target speed /* 0x3C */ f32 mMaxWalkSpeed; /* 0x40 */ f32 mMinWalkSpeed; /* 0x44 */ f32 mForwardAccel; /* 0x48 */ f32 mDecelScale; // scales speed to get deceleration in daNpc_Cb1_c::breaking() /* 0x4C */ f32 mMaxDecel; /* 0x50 */ f32 mDecel; /* 0x54 */ f32 mWalkAnmSpeedScale; /* 0x58 */ f32 mMaxWalkAnmSpeed; /* 0x5C */ f32 mNpcFlyLaunchSpeedF; // forward speed when Makar jumps to start flying /* 0x60 */ f32 mNpcFlyLaunchSpeedY; /* 0x64 */ f32 field_0x64; /* 0x68 */ f32 mHitSpeedScaleF; // scales forward speed when Makar is hit /* 0x6C */ f32 mHitSpeedScaleY; // scales forward speed to get y recoil speed when Makar is hit /* 0x70 */ f32 field_0x70; /* 0x74 */ f32 field_0x74; /* 0x78 */ f32 field_0x78; /* 0x7C */ f32 field_0x7C; /* 0x80 */ f32 field_0x80; /* 0x84 */ f32 field_0x84; /* 0x88 */ f32 mStickWalkSpeedScale; // scales main stick value to get a target speed /* 0x8C */ f32 field_0x8C; /* 0x90 */ f32 field_0x90; /* 0x94 */ u8 field_0x94[4]; /* 0x98 */ f32 field_0x98; /* 0x9C */ f32 field_0x9C; /* 0xA0 */ f32 field_0xA0; /* 0xA4 */ f32 field_0xA4; /* 0xA8 */ f32 field_0xA8; /* 0xAC */ f32 mStickFlySpeedScale; /* 0xB0 */ f32 field_0xB0; /* 0xB4 */ f32 field_0xB4; /* 0xB8 */ f32 field_0xB8; /* 0xBC */ f32 mFlyLaunchSpeedY; /* 0xC0 */ f32 field_0xC0; /* 0xC4 */ f32 field_0xC4; /* 0xC8 */ s16 field_0xC8; /* 0xCA */ s16 mPlayerFlyTimer; /* 0xCC */ s16 field_0xCC; /* 0xCE */ s16 field_0xCE; /* 0xD0 */ s16 field_0xD0; /* 0xD2 */ s16 field_0xD2; /* 0xD4 */ s16 field_0xD4; /* 0xD6 */ s16 field_0xD6; /* 0xD8 */ s16 field_0xD8; /* 0xDA */ s16 field_0xDA; /* 0xDC */ s16 mNpcFlyTimer; /* 0xDE */ s16 field_0xDE; /* 0xE0 */ s16 field_0xE0; /* 0xE2 */ s16 field_0xE2; /* 0xE4 */ s16 field_0xE4; /* 0xE6 */ s16 field_0xE6; /* 0xE8 */ s16 field_0xE8; /* 0xEA */ s16 field_0xEA; /* 0xEC */ s16 field_0xEC; /* 0xEE */ u8 mDamageTimer; /* 0xEF */ u8 field_0xEF; }; // Size: 0xF0 daNpc_Cb1_HIO_c l_HIO; static dCcD_SrcCyl l_cyl_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG & ~AT_TYPE_WIND & ~AT_TYPE_LIGHT, /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e, /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsGrpAll_e, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e, /* SrcGObjCo SPrm */ 0, }, // cM3dGCylS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 30.0f, /* Height */ 80.0f, }}, }; static dCcD_SrcCyl l_wind_cyl_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_WATER & ~AT_TYPE_UNK20000 & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT, /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e, /* SrcObjCo SPrm */ 0, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e, /* SrcGObjCo SPrm */ 0, }, // cM3dGCylS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 30.0f, /* Height */ 80.0f, }}, }; /* 000000EC-0000031C .text __ct__15daNpc_Cb1_HIO_cFv */ daNpc_Cb1_HIO_c::daNpc_Cb1_HIO_c() { mNpc.m04 = -20.0f; mNpc.mMaxHeadX = 0; mNpc.mMaxHeadY = 0; mNpc.mMaxBackboneX = 0xBB8; mNpc.mMaxBackboneY = 0x1770; mNpc.mMinHeadX = 0; mNpc.mMinHeadY = 0; mNpc.mMinBackboneX = -0x3E8; mNpc.mMinBackboneY = -0x1770; mNpc.mMaxTurnStep = 0x7D0; mNpc.mMaxHeadTurnVel = 0x7D0; mNpc.mAttnYOffset = 65.0f; mNpc.mMaxAttnAngleY = 0x4000; mNpc.m22 = 0; mNpc.mMaxAttnDistXZ = 180.0f; field_0x30 = 50.0f; mPlayerChaseDistance = 140.0f; mChaseDistScale = 0.05f; mMaxWalkSpeed = 9.0f; mMinWalkSpeed = 3.0f; mForwardAccel = 0.4f; field_0xE8 = 0x8FC; field_0xEA = 0x320; field_0xEC = 0x3; mDecelScale = 0.9f; mMaxDecel = 1.0f; mDecel = 1.0f; mWalkAnmSpeedScale = 0.45f; mMaxWalkAnmSpeed = 0.9f; mNpcFlyLaunchSpeedF = 50.0f; mNpcFlyLaunchSpeedY = 20.0f; field_0x64 = 8.0f; mHitSpeedScaleF = -1.0f; mHitSpeedScaleY = 3.5f; field_0x70 = -4.0f; field_0x74 = -1.5f; field_0x78 = -6.0f; field_0x7C = -7.6f; field_0x80 = 0.1f; field_0x84 = 0.2f; mStickWalkSpeedScale = 10.0f; field_0xC8 = -0x1000; mPlayerFlyTimer = 450; field_0xCC = 0x64; field_0xCE = 0xF; field_0xD0 = 0x4E20; field_0xD2 = 0x190; field_0xD4 = 0x9C4; field_0xD6 = 0xC8; field_0x8C = 0.0002f; field_0x90 = -15.0f; field_0x98 = 10.0f; field_0x9C = 10.0f; field_0xA0 = -2.5f; field_0xD8 = 1; field_0xA4 = 100.0f; field_0xA8 = 6000.0f; field_0xE0 = 0xC8; mStickFlySpeedScale = 0.5f; field_0xDA = 0x2968; field_0xB0 = 34.0f; field_0xB4 = 2.0f; mNpcFlyTimer = 60; field_0xDE = 0xD; field_0xB8 = 2.0f; mFlyLaunchSpeedY = 50.0f; field_0xC0 = 400.0f; field_0xE2 = 0x5; field_0xE4 = 0x14; field_0xE6 = 0xBB8; field_0xC4 = 20.0f; mDamageTimer = 60; field_0xEF = 0; mNo = -1; } /* 0000031C-00000424 .text isTagCheckOK__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::isTagCheckOK() { if(chkNpcAction(&daNpc_Cb1_c::waitNpcAction) || chkNpcAction(&daNpc_Cb1_c::searchNpcAction)) { return TRUE; } if(chkNpcAction(&daNpc_Cb1_c::carryNpcAction) && !daPy_getPlayerLinkActorClass()->checkCarryActionNow()) { return TRUE; } return FALSE; } /* 00000424-000004D8 .text setMessageAnimation__11daNpc_Cb1_cFUc */ void daNpc_Cb1_c::setMessageAnimation(u8 param_1) { if(!fopAcM_checkCarryNow(this) && dComIfGp_event_runCheck()) { int staffIdx = dComIfGp_evmng_getMyStaffId("Cb1"); if(staffIdx != -1 && strcmp(dComIfGp_evmng_getMyActName(staffIdx), "WAIT") == 0) { setAnm(getAnmType(param_1)); } } } /* 000004D8-000004F8 .text CheckCreateHeap__FP10fopAc_ac_c */ static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { return static_cast(i_this)->createHeap(); } /* 000004F8-00000814 .text create__11daNpc_Cb1_cFv */ cPhs_State daNpc_Cb1_c::create() { fopAcM_ct(this, daNpc_Cb1_c); if(!isTypeBossDie()) { #if VERSION == VERSION_DEMO if(dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_WT)) #else if(dComIfGs_checkGetItem(dItem_MASTER_SWORD_3_e)) #endif { if(!isTypeKazeBoss()) { return cPhs_ERROR_e; } } else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2910)) { if(!isTypeKaze()) { return cPhs_ERROR_e; } } else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E02)) { if(!isTypeEkaze()) { return cPhs_ERROR_e; } } else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { if(strcmp(dComIfGp_getStartStageName(), "sea") != 0 || !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604)) { return cPhs_ERROR_e; } } else if(dComIfGs_checkGetItem(dItem_MASTER_SWORD_2_e)) { if(!isTypeWaterFall()) { return cPhs_ERROR_e; } } else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1820)) { return cPhs_ERROR_e; } else if(dComIfGs_checkGetItem(dItem_PEARL_FARORE_e)) { if(!isTypeForest()) { return cPhs_ERROR_e; } } else { return cPhs_ERROR_e; } } cPhs_State result = dComIfG_resLoad(&mPhs, "Cb"); if(result == cPhs_COMPLEATE_e) { if(isTypeKaze()) { if(dComIfGs_getPlayerPriestFlag() == 1) { dComIfGs_setRestartOption(&dComIfGs_getPlayerPriestPos(), dComIfGs_getPlayerPriestRotate(), dComIfGs_getPlayerPriestRoomNo(), 1); } #if VERSION > VERSION_DEMO checkRestart(1); #endif } #if VERSION == VERSION_DEMO checkRestart(1); #endif if(dComIfGp_getCb1Player()) { return cPhs_ERROR_e; } #if VERSION == VERSION_DEMO if(isTypeForest() || isTypeWaterFall() || isTypeEkaze() || isTypeKaze()) #else if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall() || isTypeEkaze() || isTypeKaze()) #endif { onMusic(); } if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x9400)) { return cPhs_ERROR_e; } setBaseMtx(); fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); if(!init()) { return cPhs_ERROR_e; } fopAcM_setStageLayer(this); if(l_HIO.mNo < 0) { l_HIO.mNo = mDoHIO_createChild("マコレ", &l_HIO); } } return result; } /* 00000814-00000984 .text nodeCallBack__FP7J3DNodei */ static BOOL nodeCallBack(J3DNode* node, int calcTiming) { if (calcTiming == J3DNodeCBCalcTiming_In) { J3DJoint* joint = (J3DJoint*)node; J3DModel* model = j3dSys.getModel(); daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea(); if (a_this != NULL) { static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f); static cXyz l_offsetEyePos(20.0f, 10.0f, 0.0f); s32 jnt_no = joint->getJntNo(); mDoMtx_stack_c::copy(model->getAnmMtx(jnt_no)); mDoMtx_stack_c::XrotM(a_this->getBackbone_y()); mDoMtx_stack_c::ZrotM(-a_this->getBackbone_x()); mDoMtx_stack_c::multVec(&l_offsetEyePos, &a_this->getEyePos()); a_this->incAttnSetCount(); cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } } return TRUE; } /* 00000984-00000CF4 .text nutNodeCallBack__FP7J3DNodei */ static BOOL nutNodeCallBack(J3DNode* node, int calcTiming) { if (calcTiming == J3DNodeCBCalcTiming_In) { J3DJoint* joint = (J3DJoint*)node; J3DModel* model = j3dSys.getModel(); daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea(); if (a_this != NULL) { static cXyz l_nutOffset(0.0f, 0.0f, 0.0f); static cXyz l_nutBase(1.0f, 0.0f, 0.0f); s32 jnt_no = joint->getJntNo(); cXyz temp2(model->getAnmMtx(jnt_no)[0][3], model->getAnmMtx(jnt_no)[1][3], model->getAnmMtx(jnt_no)[2][3]); a_this->getNutPos() += a_this->getNusSpeed(); cXyz temp = a_this->getNutPos() - temp2; f32 temp4 = temp.abs(); f32 f1; if(!cM3d_IsZero(temp4)) { f1 = 14.0f / temp4; temp *= f1; } a_this->getNutPos() = temp2 + temp; a_this->getNusSpeed() += temp * -0.15f; a_this->getNusSpeed().y += -1.3f; f32 temp5 = a_this->getNusSpeed().abs(); if(!cM3d_IsZero(temp5)) { f1 = 5.8f / temp5; a_this->getNusSpeed() *= f1; } Mtx temp3; cM3d_UpMtx_Base(l_nutBase, temp, temp3); model->getAnmMtx(jnt_no)[0][0] = temp3[0][0]; model->getAnmMtx(jnt_no)[0][1] = temp3[0][1]; model->getAnmMtx(jnt_no)[0][2] = temp3[0][2]; model->getAnmMtx(jnt_no)[1][0] = temp3[1][0]; model->getAnmMtx(jnt_no)[1][1] = temp3[1][1]; model->getAnmMtx(jnt_no)[1][2] = temp3[1][2]; model->getAnmMtx(jnt_no)[2][0] = temp3[2][0]; model->getAnmMtx(jnt_no)[2][1] = temp3[2][1]; model->getAnmMtx(jnt_no)[2][2] = temp3[2][2]; cMtx_copy(model->getAnmMtx(jnt_no), J3DSys::mCurrentMtx); } } return TRUE; } static fpc_ProcID l_msgId; static msg_class* l_msg; /* 00000CF4-00000D9C .text ppNodeCallBack__FP7J3DNodei */ static BOOL ppNodeCallBack(J3DNode* node, int calcTiming) { if (calcTiming == J3DNodeCBCalcTiming_In) { J3DJoint* joint = (J3DJoint*)node; J3DModel* model = j3dSys.getModel(); daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea(); if (a_this != NULL) { s32 jnt_no = joint->getJntNo(); mDoMtx_stack_c::YrotS(a_this->getWork3()); mDoMtx_stack_c::revConcat(model->getAnmMtx(jnt_no)); cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } } return TRUE; } /* 00000D9C-00001458 .text createHeap__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::createHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB); JUT_ASSERT(DEMO_SELECT(937, 936), modelData != NULL); mpMorf = new mDoExt_McaMorf( modelData, NULL, NULL, NULL, -1, 1.0f, 0, -1, 1, NULL, 0x00080000, 0x11000022 ); if(mpMorf == NULL || mpMorf->getModel() == NULL) { return FALSE; } m_backbone_jnt_num = modelData->getJointName()->getIndex("backbone"); JUT_ASSERT(DEMO_SELECT(949, 948), m_backbone_jnt_num >= 0); m_armRend_jnt_num = modelData->getJointName()->getIndex("armRend"); JUT_ASSERT(DEMO_SELECT(952, 951), m_armRend_jnt_num >= 0); m_armL2_jnt_num = modelData->getJointName()->getIndex("armL2"); JUT_ASSERT(DEMO_SELECT(955, 954), m_armL2_jnt_num >= 0); modelData->getJointNodePointer(m_backbone_jnt_num)->setCallBack(nodeCallBack); mpMorf->getModel()->setUserArea((u32)this); mpFaceModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_FACE), 0x00080000, 0x11000022); if(mpFaceModel == NULL) { return FALSE; } if(isMusic()) { modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_STICK); JUT_ASSERT(DEMO_SELECT(973, 972), modelData != NULL); mpStickModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); if(mpStickModel == NULL) { return FALSE; } m_nut_jnt_num = modelData->getJointName()->getIndex("nut"); JUT_ASSERT(DEMO_SELECT(983, 982), m_nut_jnt_num >= 0); modelData->getJointNodePointer(m_nut_jnt_num)->setCallBack(nutNodeCallBack); mpStickModel->setUserArea((u32)this); modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_CELLO); JUT_ASSERT(DEMO_SELECT(990, 989), modelData != NULL); mpCelloModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); if(mpCelloModel == NULL) { return FALSE; } } modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_PP); JUT_ASSERT(DEMO_SELECT(1002, 1001), modelData != NULL); mpPropellerModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); if(mpPropellerModel == NULL) { return FALSE; } m_center_jnt_num = modelData->getJointName()->getIndex("center"); modelData->getJointNodePointer(m_center_jnt_num)->setCallBack(ppNodeCallBack); mpPropellerModel->setUserArea((u32)this); if(!mPropellerBckAnim.init(modelData, (J3DAnmTransform*)dComIfG_getObjectRes("Cb", CB_BCK_M_OPEN), FALSE, J3DFrameCtrl::EMode_NONE)) { return FALSE; } modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_NUT); JUT_ASSERT(DEMO_SELECT(1026, 1025), modelData != NULL); mpNutModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); if(mpNutModel == NULL) { return FALSE; } if(!mNutBckAnim.init(modelData, (J3DAnmTransform*)dComIfG_getObjectRes("Cb", CB_BCK_NUT_SOW), TRUE, J3DFrameCtrl::EMode_NONE)) { return FALSE; } mAcchCir[0].SetWall(20.0f, 20.0f); mAcchCir[1].SetWall(80.0f, 20.0f); mAcch.SetRoofCrrHeight(100.0f); mAcch.ClrRoofNone(); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, ARRAY_SIZE(mAcchCir), mAcchCir, fopAcM_GetSpeed_p(this)); mAcch.OnLineCheck(); return TRUE; } /* 00001458-0000155C .text setAction__11daNpc_Cb1_cFPM11daNpc_Cb1_cFPCvPvPv_iM11daNpc_Cb1_cFPCvPvPv_iPv */ BOOL daNpc_Cb1_c::setAction(daNpc_Cb1_c::ActionFunc_t* param_1, daNpc_Cb1_c::ActionFunc_t param_2, void* param_3) { #if VERSION > VERSION_DEMO setFlyingTimer(0); offFlying(); #endif if(*param_1 != param_2) { if(*param_1) { m8F0 = -1; (this->**param_1)(param_3); } *param_1 = param_2; m8F0 = 0; m8F4 = 0; m8F6 = 0; m8F8 = 0; m8FA = 0; m8FC = 0.0f; m8F1 = 0; m8F2 = 0; shape_angle.x = 0; shape_angle.z = 0; attention_info.flags = 0; (this->**param_1)(param_3); m8F0++; } return TRUE; } /* 0000155C-000015C0 .text setWaitAction__11daNpc_Cb1_cFPv */ void daNpc_Cb1_c::setWaitAction(void* param_1) { if(dComIfGp_getPlayer(0) == this) { setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL); } else { setWaitNpcAction(param_1); } } /* 000015C0-00001634 .text setWaitNpcAction__11daNpc_Cb1_cFPv */ void daNpc_Cb1_c::setWaitNpcAction(void*) { setNpcAction(isShipRide() ? &daNpc_Cb1_c::shipNpcAction : (isMusic() ? &daNpc_Cb1_c::musicNpcAction : &daNpc_Cb1_c::waitNpcAction), NULL); } /* 00001634-000016A4 .text npcAction__11daNpc_Cb1_cFPv */ void daNpc_Cb1_c::npcAction(void* param_1) { if(!mNpcAction) { speedF = 0.0f; setWaitNpcAction(NULL); } (this->*mNpcAction)(param_1); } /* 000016A4-00001708 .text setNpcAction__11daNpc_Cb1_cFM11daNpc_Cb1_cFPCvPvPv_iPv */ void daNpc_Cb1_c::setNpcAction(daNpc_Cb1_c::ActionFunc_t param_1, void* param_2) { mPlayerAction = NULL; setAction(&mNpcAction, param_1, param_2); } /* 00001708-000017AC .text playerAction__11daNpc_Cb1_cFPv */ void daNpc_Cb1_c::playerAction(void* param_1) { if(!mPlayerAction) { speedF = 0.0f; setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL); } dComIfGp_setDoStatus(dActStts_FLY_e); (this->*mPlayerAction)(param_1); } /* 000017AC-00001810 .text setPlayerAction__11daNpc_Cb1_cFM11daNpc_Cb1_cFPCvPvPv_iPv */ void daNpc_Cb1_c::setPlayerAction(daNpc_Cb1_c::ActionFunc_t param_1, void* param_2) { mNpcAction = NULL; setAction(&mPlayerAction, param_1, param_2); } /* 00001810-00001858 .text getStickAngY__11daNpc_Cb1_cFv */ s16 daNpc_Cb1_c::getStickAngY() { return 0x8000 + g_mDoCPd_cpadInfo[0].mMainStickAngle + dCam_getControledAngleY(dComIfGp_getCamera(0)); } /* 00001858-000019B0 .text calcStickPos__11daNpc_Cb1_cFsP4cXyz */ int daNpc_Cb1_c::calcStickPos(s16 param_1, cXyz* param_2) { // This temp variable for attention is probably a fakematch, but it fixes a regswap in dAttention_c::Lockon. dAttention_c& attention = dComIfGp_getAttention(); dAttList_c* attList = attention.GetLockonList(0); bool r26 = attention.Lockon(); int r31 = !r26 ? 0 : (attention.LockonTruth() ? 1 : -1); if (attList == NULL) { attList = attention.GetActionList(0); } if (attList) { *param_2 = attList->getActor()->eyePos; return r31; } if (r26) { param_1 = shape_angle.y; } param_2->set( current.pos.x + 100.0f * cM_ssin(param_1), current.pos.y, current.pos.z + 100.0f * cM_scos(param_1) ); return r31; } /* 000019B0-00001A18 .text flyCheck__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::flyCheck() { if(!CPad_CHECK_TRIG_A(0)) { return FALSE; } setPlayerAction(&daNpc_Cb1_c::flyPlayerAction, NULL); return TRUE; } /* 00001A18-00001B28 .text checkLanding__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::checkLanding() { if(m900 > 200.0f) { if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) != 1) { fopAcM_monsSeStart(this, JA_SE_CV_CB_LANDING, 0); } int temp; dComIfGp_particle_setSimpleLand(mAcch.m_gnd, ¤t.pos, &shape_angle, 1.25f, 1.5f, 1.0f, &tevStr, &temp, 7); } else { int temp; dComIfGp_particle_setSimpleLand(mAcch.m_gnd, ¤t.pos, &shape_angle, 0.625f, 0.75f, 0.5f, &tevStr, &temp, 7); } } /* 00001B28-00001B68 .text breaking__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::breaking() { cLib_addCalc(&speedF, 0.0f, l_HIO.mDecelScale, l_HIO.mMaxDecel, l_HIO.mDecel); } /* 00001B68-0000270C .text flyAction__11daNpc_Cb1_cFifsi */ BOOL daNpc_Cb1_c::flyAction(BOOL param_1, f32 param_2, s16 param_3, BOOL param_4) { bool isMakarPlayer = dComIfGp_getPlayer(0) == this; f32 ySpeedLimit = l_HIO.field_0x98; f32 temp3 = m8F8 * l_HIO.field_0x8C; BOOL temp4 = FALSE; if(mAcch.ChkGroundHit()) { breaking(); cLib_chaseAngleS(&shape_angle.x, 0, l_HIO.field_0xE0); cLib_chaseAngleS(&shape_angle.z, 0, l_HIO.field_0xE0); gravity = l_HIO.field_0xA0 + temp3; } else if(m8F0 < 3) { BOOL temp7 = calcFlyingTimer(); if(isMakarPlayer) { if(temp7) { fopAcM_monsSeStart(this, JA_SE_CV_CB_FLY_END, 0); } onFlying(); } m900 = 0.0f; cXyz temp(0.0f, temp3 + l_HIO.field_0xA0, 0.0f); f32 temp5 = l_HIO.field_0x9C; if(m8F2) { temp.x += param_2 * cM_ssin(param_3); temp.z += param_2 * cM_scos(param_3); } #if VERSION == VERSION_DEMO if(mWindCyl.ChkTgHit()) #else if(!isMusic() && mWindCyl.ChkTgHit()) #endif { cCcD_Obj* tg = mWindCyl.GetTgHitObj(); if(tg && tg->ChkAtType(AT_TYPE_WIND)) { temp += *mWindCyl.GetTgRVecP() * 0.01f; temp5 = 30.0f; ySpeedLimit = 30.0f; } m8F8 = 20000; temp4 = TRUE; } else { cXyz temp3; f32 power; dKyw_get_AllWind_vec(¤t.pos, &temp3, &power); power *= l_HIO.field_0xB8; temp += temp3 * power; temp5 += power; ySpeedLimit += power; s16 temp8 = power * 400.0f; if(m8F8 < temp8) { m8F8 = temp8; } } s16 angle = cM_atan2s(temp.x, temp.z); f32 temp6_2 = cLib_maxLimit(std::sqrtf(SQUARE(temp.x) + SQUARE(temp.z)), temp5); angle = angle - shape_angle.y; f32 temp6 = temp6_2 * l_HIO.field_0xA8; if (temp6 > 14000.0f) { temp6 = 14000.0f; } s16 cos = temp6 * cM_scos(angle); s16 sin = -temp6 * cM_ssin(angle); cLib_chaseAngleS(&shape_angle.x, cos, l_HIO.field_0xE0); cLib_chaseAngleS(&shape_angle.z, sin, l_HIO.field_0xE0); lookBack(0); speed += temp; f32 temp8 = speed.abs(); if(!cM3d_IsZero(temp8) && temp8 > temp5) { f32 temp2 = temp8; cLib_chaseF(&temp8, temp5, 1.0f); if(temp8 > 30.0f) { temp8 = 30.0f; } speed *= temp8 / temp2; } current.angle.y = cM_atan2s(speed.x, speed.z); speedF = std::sqrtf(SQUARE(speed.x) + SQUARE(speed.z)); if(speed.y > ySpeedLimit) { speed.y = ySpeedLimit; } gravity = 0.0f; } if(m8F0 == 1) { if(m8D7) { if(!mAcch.ChkGroundHit()) { m8F8 = l_HIO.field_0xDA; speed.y += l_HIO.field_0xB0; setAnm(ANM_07); } else { setAnm(ANM_05); } m8F0++; } else if(mpMorf->checkFrame(6.0f)) { fopAcM_seStart(this, JA_SE_CM_PRAPELLO_OPEN, 0); JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_AK_SN_PERAPROOPEN00, ¤t.pos); if(emitter) { emitter->setGlobalRTMatrix(mpPropellerModel->getAnmMtx(m_center_jnt_num)); } } } else if(m8F0 == 2) { if(isMakarPlayer && (temp4 || getFlyingTimer() < l_HIO.field_0xCE)) { if(setAnm(ANM_15) && temp4) { fopAcM_monsSeStart(this, JA_SE_CV_CB_FLY_END, 0); } } else if(m8DC != 6 && m8FC > l_HIO.field_0xD8) { setAnm(ANM_07); } if(getFlyingTimer() != 0 && param_1) { cLib_chaseS(&m8F8, l_HIO.field_0xD0, l_HIO.field_0xD4); m8F6 = 0; } else { cLib_chaseS(&m8F8, mAcch.ChkGroundHit() ? l_HIO.field_0xD2 : 0, l_HIO.field_0xD6); } m8FA += m8F8; m8FC += (current.pos.y - old.pos.y); if(m8FC > l_HIO.field_0xA4) { m8F2 = 1; } fopAcM_seStart(this, JA_SE_CM_PRAPELLO_ROLLING, m8F8 * (100.0f / l_HIO.field_0xD0)); if(param_4 || (!isMakarPlayer && mAcch.ChkWallHit()) || (!mAcch.ChkGroundHit() && m8F8 == 0) || (mAcch.ChkGroundHit() && m8F8 <= l_HIO.field_0xD2 && (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x80 || ++m8F6 > l_HIO.field_0xCC)) ) { setAnm(ANM_06); mpMorf->setFrame(8.0f); m8F0++; offFlying(); } else if(mAcch.ChkGroundHit() && m8DC == 6) { setAnm(ANM_05); } maxFallSpeed = l_HIO.field_0x90; } else { if(m8DC == 4 && m8D7) { setAnm(ANM_02); fopAcM_seStart(this, JA_SE_CM_PRAPELLO_OPEN, 0); } if(mAcch.ChkGroundHit()) { if(m8E0 == 0 && m8F0 == 3) { if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) != 1) { speed.y = l_HIO.field_0x64; checkLanding(); } m8F0++; } else if(m8DC != 4) { if(isMakarPlayer) { setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL); } else { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this)); } return FALSE; } } } return TRUE; } /* 0000270C-00002818 .text walkAction__11daNpc_Cb1_cFffs */ BOOL daNpc_Cb1_c::walkAction(f32 targetSpeed, f32 accel, s16 targetAngle) { cLib_chaseAngleS(¤t.angle.y, targetAngle, 0x400); lookBack(1); shape_angle.y = current.angle.y; if(cLib_chaseF(&speedF, targetSpeed, accel) && targetSpeed == 0.0f) { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); return TRUE; } f32 playSpeed = std::fabsf(speedF) * l_HIO.mWalkAnmSpeedScale; playSpeed = cLib_minLimit(playSpeed, l_HIO.mMaxWalkAnmSpeed); mpMorf->setPlaySpeed(playSpeed); return FALSE; } /* 00002818-00002868 .text returnLinkPlayer__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::returnLinkPlayer() { changePlayer(dComIfGp_getLinkPlayer()); offFlying(); setWaitNpcAction(NULL); } /* 00002868-00002914 .text isFlyAction__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::isFlyAction() { return chkPlayerAction(&daNpc_Cb1_c::flyPlayerAction) || chkNpcAction(&daNpc_Cb1_c::flyNpcAction); } /* 00002914-00002A2C .text sowCheck__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::sowCheck() { #if VERSION > VERSION_DEMO if(!dComIfGp_event_runCheck() && !isReturnLink()) #endif { dAttList_c* list = dComIfGp_getAttention().getActionBtnB(); if(list) { fopAc_ac_c* actor = list->getActor(); if((list->mType == fopAc_Attn_TYPE_SPEAK_e || list->mType == fopAc_Attn_TYPE_TALK_e) && (actor->attention_info.flags & fopAc_Attn_UNK10000000_e)) { if(m8E2 != 0x2D) { #if VERSION == VERSION_DEMO dComIfGp_getVibration().StartShock(2, -0x21, cXyz(0.0f, 1.0f, 0.0f)); #else dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); #endif } dComIfGp_setDoStatus(dActStts_ba_nageru__dupe_2D); if(CPad_CHECK_TRIG_A(0)) { eventInfo.onCondition(dEvtCnd_CANTALK_e); fopAcM_orderTalkEvent(this, actor); return TRUE; } return FALSE; } } } return flyCheck(); } /* 00002A2C-00002AD8 .text shipRideCheck__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::shipRideCheck() { if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604) && dComIfGp_getShipActor()) { setNpcAction(&daNpc_Cb1_c::shipNpcAction, NULL); onShipRide(); fopDwTg_DrawQTo(&draw_tag); return TRUE; } return FALSE; } #ifdef __MWERKS__ static #endif daNpc_Cb1_c::mode_entry_t daNpc_Cb1_c::m_evProcTbl[] = { { &daNpc_Cb1_c::evInitWait, &daNpc_Cb1_c::evActWait }, { &daNpc_Cb1_c::evInitMsgSet, &daNpc_Cb1_c::evActMsgSet }, { &daNpc_Cb1_c::evInitMsgEnd, &daNpc_Cb1_c::evActMsgEnd }, { &daNpc_Cb1_c::evInitMovePos, &daNpc_Cb1_c::evActMovePos }, { &daNpc_Cb1_c::evInitOffsetLink, &daNpc_Cb1_c::evActOffsetLink }, { &daNpc_Cb1_c::evInitWalk, &daNpc_Cb1_c::evActWalk }, { &daNpc_Cb1_c::evInitToLink, &daNpc_Cb1_c::evActToLink }, { &daNpc_Cb1_c::evInitTact, &daNpc_Cb1_c::evActTact }, { &daNpc_Cb1_c::evInitCelloPlay, &daNpc_Cb1_c::evActCelloPlay }, { &daNpc_Cb1_c::evInitTurn, &daNpc_Cb1_c::evActTurn }, { &daNpc_Cb1_c::evInitSow, &daNpc_Cb1_c::evActSow }, { &daNpc_Cb1_c::evInitSetAnm, &daNpc_Cb1_c::evActSetAnm }, { &daNpc_Cb1_c::evInitSetGoal, &daNpc_Cb1_c::evActSetGoal }, { &daNpc_Cb1_c::evInitWarp, &daNpc_Cb1_c::evActWarp }, { &daNpc_Cb1_c::evInitEnd, &daNpc_Cb1_c::evActEnd }, }; static char* l_cutNameTbl[] = { "WAIT", "MSG_SET", "MSG_END", "POS_MOV", "OFFSET_LINK", "WALK", "TO_LINK", "TACT", "CELLOPLAY", "TURN", "SOW", "SET_ANM", "SET_GOAL", "WARP", "END", }; /* 00002AD8-00002DC8 .text eventProc__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::eventProc() { #if VERSION > VERSION_JPN mAcch.ClrWallNone(); #endif if(eventInfo.checkCommandDemoAccrpt() && m8DD != -1) { if(m8DD == 0) { fopAcM_onDraw(this); } else if(m8DD == 1) { dComIfGp_event_setTalkPartner(dComIfGp_getLinkPlayer()); mDoAud_seStart(JA_SE_CTRL_NPC_TO_LINK); } onEventAccept(); m8DD = -1; } int staffIdx = dComIfGp_evmng_getMyStaffId("Cb1"); if(dComIfGp_event_runCheck() && (dComIfGp_getPlayer(0) == this || !checkCommandTalk())) { if(staffIdx != -1) { int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, l_cutNameTbl, ARRAY_SIZE(l_cutNameTbl), TRUE, 0); if(actIdx == -1) { dComIfGp_evmng_cutEnd(staffIdx); } else { if(dComIfGp_evmng_getIsAddvance(staffIdx)) { (this->*m_evProcTbl[actIdx].init)(staffIdx); speedF = 0.0f; } if((this->*m_evProcTbl[actIdx].run)(staffIdx)) { dComIfGp_evmng_cutEnd(staffIdx); } } mPlayerAction = NULL; mNpcAction = NULL; #if VERSION > VERSION_JPN mAcch.SetWallNone(); #endif } if(isEventAccept()) { if(dComIfGp_evmng_endCheck(mEventIdx[m8E3])) { dComIfGp_event_reset(); offEventAccept(); if(m8E3 == 1) { returnLinkPlayer(); offReturnLink(); } m8E3 = 0xFF; } return TRUE; } if(staffIdx != -1) { return TRUE; } #if VERSION > VERSION_DEMO if(dComIfGp_getLinkPlayer()->eventInfo.checkCommandDoor() == FALSE) { return TRUE; } #endif } return FALSE; } /* 00002DC8-00002E5C .text evCheckDisp__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evCheckDisp(int staffIdx) { int* pDisp = dComIfGp_evmng_getMyIntegerP(staffIdx, "Disp"); if(pDisp) { if(*pDisp) { fopAcM_onDraw(this); } else { fopDwTg_DrawQTo(&draw_tag); } } else { fopAcM_onDraw(this); } } /* 00002E5C-00002EF8 .text evInitWait__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitWait(int staffIdx) { evCheckDisp(staffIdx); int* pTimer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); if(pTimer) { m8EE = *pTimer; } else { m8EE = 0; } setAnm(isMusic() ? ANM_08 : ANM_00); } /* 00002EF8-00002F5C .text evActWait__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActWait(int) { s16 temp = m8EE; if(cLib_chaseS(&m8EE, 0, 1)) { if(temp < 0) { dComIfGp_event_reset(); } return TRUE; } return FALSE; } /* 00002F5C-00002FF0 .text evInitMsgSet__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitMsgSet(int staffIdx) { l_msgId = fpcM_ERROR_PROCESS_ID_e; int* pMsgNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo"); if(pMsgNo) { mMsgNo = *pMsgNo; if(mMsgNo == 0x1520 && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1840)) { mMsgNo = 0x1522; } } } /* 00002FF0-00003010 .text evActMsgSet__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActMsgSet(int) { return initTalk(); } /* 00003010-00003014 .text evInitMsgEnd__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitMsgEnd(int) {} /* 00003014-000030A4 .text evActMsgEnd__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActMsgEnd(int staffIdx) { BOOL result = execTalk(0); if(result) { dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMode"); setWaitAction(NULL); } else { mJntCtrl.setTrn(); lookBack(1); } return result; } /* 000030A4-000031E0 .text evInitMovePos__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitMovePos(int staffIdx) { f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); if(pAngle) { s16 angle = cM_deg2s(*pAngle); current.angle.y = angle; shape_angle.y = angle; } cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); if(pPos) { current.pos = *pPos; } const char* pShipRide = dComIfGp_evmng_getMyStringP(staffIdx, "ShipRide"); if(pShipRide) { if(strcmp(pShipRide, "on") == 0) { onShipRide(); } else if(strcmp(pShipRide, "off") == 0) { offShipRide(); } } } /* 000031E0-000031E8 .text evActMovePos__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActMovePos(int) { return 1; } /* 000031E8-000032E4 .text evInitOffsetLink__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitOffsetLink(int staffIdx) { daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); cXyz* pTo = dComIfGp_evmng_getMyXyzP(staffIdx, "To"); if(pTo) { cXyz dest; cLib_offsetPos(&dest, ¤t.pos, shape_angle.y, pTo); pLink->setPlayerPosAndAngle(&dest, cLib_targetAngleY(&dest, ¤t.pos)); } cXyz* pFrom = dComIfGp_evmng_getMyXyzP(staffIdx, "From"); if(pFrom) { fopAc_ac_c* pPlayer = dComIfGp_getPlayer(0); cLib_offsetPos(¤t.pos, &pLink->current.pos, pPlayer->shape_angle.y, pFrom); } current.angle.y = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); shape_angle.y = current.angle.y; } /* 000032E4-000032EC .text evActOffsetLink__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActOffsetLink(int) { return 1; } /* 000032EC-00003328 .text evInitWalk__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitWalk(int) { setAnm(ANM_01); speedF = 0.0f; } /* 00003328-0000373C .text evActWalk__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActWalk(int staffIdx) { f32* speed_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed"); f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist"); JUT_ASSERT(VERSION_SELECT(2042, 2055, 2060, 2060), speed_p != NULL); cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos"); cXyz temp; cXyz temp2; cXyz temp4; if(pPos) { temp = *pPos; temp4 = *pPos; } else { cXyz* pOffset = dComIfGp_evmng_getMyXyzP(staffIdx, "Offset"); if(pOffset) { fopAc_ac_c* target = dComIfGp_event_getTalkPartner(); JUT_ASSERT(VERSION_SELECT(2059, 2072, 2077, 2077), target != NULL); cLib_offsetPos(&temp, &target->current.pos, fopAcM_searchActorAngleY(this, target), pOffset); temp4 = target->current.pos; } else { temp = *dComIfGp_evmng_getGoal(); temp4 = temp; } } temp2 = temp - current.pos; s16 angle = cM_atan2s(temp2.x, temp2.z); if(!pDist) { if(temp2.absXZ() <= *speed_p) { setAnm(ANM_00); current.pos = temp; speedF = 0.0f; return TRUE; } } else { if(temp2.absXZ() < *pDist) { setAnm(ANM_00); speedF = 0.0f; return TRUE; } } f32 walkSpeed = *speed_p; if(cLib_distanceAngleS(shape_angle.y, angle) > 0x4000) { walkSpeed = -walkSpeed; angle += 0x8000; } if(mAcch.ChkGroundHit()) { walkAction(walkSpeed, l_HIO.mForwardAccel, angle); } else if(m8E0) { speed.y = 10.0f; } return FALSE; } /* 0000373C-00003798 .text evInitToLink__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitToLink(int) { setAnm(ANM_01); speedF = 0.0f; current.angle.y = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); shape_angle.y = current.angle.y; } /* 00003798-000038D8 .text evActToLink__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActToLink(int staffIdx) { f32* speed_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed"); f32* dist_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist"); JUT_ASSERT(VERSION_SELECT(2131, 2144, 2149, 2149), speed_p != NULL && dist_p != NULL); if(fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)) < *dist_p) { setAnm(ANM_00); speedF = 0.0f; return TRUE; } else { walkAction(*speed_p, l_HIO.mForwardAccel, fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0))); } return FALSE; } /* 000038D8-000038FC .text evInitTact__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitTact(int) { setAnm(ANM_08); } /* 000038FC-00003A2C .text evActTact__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActTact(int staffIdx) { int* pPrm0 = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm0"); s32 prm = 0; if(pPrm0) { prm = *pPrm0; } s32 song = daPy_getPlayerActorClass()->getTactMusic(); if(song >= 0) { onTactCorrect(); } BOOL result = execTalk(1); if(result) { if(isTactCorrect()) { offTactCorrect(); if(song == prm) { mMsgNo = 0x1526; } else { mMsgNo = 0x1523; } } else { m8DD = 3; if(isTactCancel()) { mMsgNo = 0x1525; offTactCancel(); } fopAcM_onDraw(this); dComIfGp_event_reset(); } } return result; } /* 00003A2C-00003A50 .text evInitCelloPlay__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitCelloPlay(int) { #if VERSION == VERSION_DEMO setAnm(ANM_09); #else setAnm(ANM_17); #endif } /* 00003A50-00003A84 .text evActCelloPlay__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActCelloPlay(int) { return daPy_getPlayerLinkActorClass()->checkEndTactMusic() ? TRUE : FALSE; } /* 00003A84-00003ABC .text evInitTurn__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitTurn(int param_1) { evCheckDisp(param_1); setAnm(ANM_00); } /* 00003ABC-00003C0C .text evActTurn__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActTurn(int staffIdx) { f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle"); s16 angle; if(pAngle) { angle = cM_deg2s(*pAngle); } else { fopAc_ac_c* target; if(dComIfGp_evmng_getMyIntegerP(staffIdx, "Target")) { target = dComIfGp_getLinkPlayer(); } else { target = dComIfGp_event_getTalkPartner(); } JUT_ASSERT(VERSION_SELECT(2308, 2321, 2326, 2326), target != NULL); angle = fopAcM_searchActorAngleY(this, target); } if(cLib_chaseAngleS(&shape_angle.y, angle, 0x800)) { shape_angle.y = angle; current.angle.y = angle; return TRUE; } current.angle.y = shape_angle.y; return FALSE; } /* 00003C0C-00003CEC .text evInitSow__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitSow(int staffIdx) { setAnm(ANM_0C); mNutBckAnim.initPlay(mNutBckAnim.getBckAnm()->getFrameMax(), J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, true); onNut(); int* timer_p = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); JUT_ASSERT(VERSION_SELECT(2353, 2366, 2371, 2371), timer_p != NULL); m8EE = *timer_p; } /* 00003CEC-00003D90 .text evActSow__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActSow(int staffIdx) { if(mNutBckAnim.play() && isNut()) { offNut(); ((daObjVmc::Act_c*)dComIfGp_event_getTalkPartner())->daObjVmc_ChangeGrow(); } if(m8D7) { setAnm(ANM_00); } if(cLib_calcTimer(&m8EE) == 0) { return TRUE; } return FALSE; } /* 00003D90-00003DF8 .text evInitSetAnm__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitSetAnm(int staffIdx) { int* pNumber = dComIfGp_evmng_getMyIntegerP(staffIdx, "Number"); if(pNumber) { setAnm(getAnmType(*pNumber)); } } /* 00003DF8-00003E00 .text evActSetAnm__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActSetAnm(int) { return TRUE; } /* 00003E00-00003E74 .text evInitSetGoal__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitSetGoal(int staffIdx) { cXyz* pOffset = dComIfGp_evmng_getMyXyzP(staffIdx, "Offset"); if(pOffset) { cLib_offsetPos(dComIfGp_evmng_getGoal(), ¤t.pos, shape_angle.y, pOffset); } } /* 00003E74-00003E98 .text evActSetGoal__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActSetGoal(int param_1) { #if VERSION > VERSION_JPN evInitSetGoal(param_1); #endif return TRUE; } /* 00003E98-00003EF4 .text evInitWarp__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitWarp(int) { setAnm(ANM_00); speed.y = REG18_F(13) + 2.5f; m8EE = -(REG18_S(5) + 0x14); } /* 00003EF4-0000405C .text evActWarp__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActWarp(int) { gravity = 0.0f; if(m8EE < 0) { if(cLib_chaseF(&speed.y, 0.0f, REG18_F(14) + 0.1f) && cLib_chaseS(&m8EE, 0, 1)) { m8EE = 0; } } else { if(cLib_chaseS(&m8EE, REG18_S(6) + 8000, REG18_S(7) + 400)) { cLib_chaseF(&speed.y, REG18_F(15) + 20.0f, REG18_F(16) + 0.5f); cLib_chaseF(&scale.x, 0.0f, REG18_F(17) + 0.05f); scale.z = scale.x; if(cLib_chaseF(&scale.y, REG18_F(18) + 4.0f, REG18_F(19) + 0.05f)) { return TRUE; } } current.angle.y += m8EE; shape_angle.y = current.angle.y; } return FALSE; } /* 0000405C-00004174 .text evInitEnd__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::evInitEnd(int staffIdx) { int* pEndMode = dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMode"); int mode; if(pEndMode == NULL) { mode = 0; } else { mode = *pEndMode; } if(mode == -2) { if(mMsgNo == 0x1526) { dComIfGp_setNextStage("Otkura", 0xE6, 0, 8); dComIfGs_onEventBit(dSv_event_flag_c::UNK_1610); dComIfGs_onEventBit(dSv_event_flag_c::UNK_1604); } dComIfGp_event_reset(); setWaitAction(NULL); } else if(mode == -1) { dComIfGp_event_reset(); setWaitAction(NULL); } else { setWaitAction(NULL); } } /* 00004174-0000417C .text evActEnd__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::evActEnd(int) { return TRUE; } /* 0000417C-000041A4 .text getAnmType__11daNpc_Cb1_cFi */ u8 daNpc_Cb1_c::getAnmType(int param_1) { static u8 l_talkAnmType[] = {ANM_00, ANM_08, ANM_0A, ANM_0E, ANM_10, ANM_11, ANM_12, ANM_13, ANM_14, ANM_0D, ANM_17}; if((u32)param_1 < ARRAY_SIZE(l_talkAnmType)) { return l_talkAnmType[param_1]; } return l_talkAnmType[0]; } /* 000041A4-00004228 .text initTalk__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::initTalk() { if(l_msgId == fpcM_ERROR_PROCESS_ID_e) { if(mMsgNo == 0x5AC) { l_msgId = fopMsgM_tactMessageSet(); } else { l_msgId = fopMsgM_messageSet(mMsgNo, this); } } else { l_msg = fopMsgM_SearchByID(l_msgId); if(l_msg) { return TRUE; } } return FALSE; } /* 00004228-00004358 .text execTalk__11daNpc_Cb1_cFi */ BOOL daNpc_Cb1_c::execTalk(BOOL param_1) { if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { l_msg->mStatus = next_msgStatus(&mMsgNo); if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { fopMsgM_messageSet(mMsgNo); } } else if(l_msg->mStatus == fopMsgStts_INPUT_e) { if(param_1) { if(dComIfGp_checkMesgCancelButton()) { l_msg->mStatus = fopMsgStts_MSG_ENDS_e; fopMsgM_messageSendOn(); onTactCancel(); } if(isTactCorrect()) { l_msg->mStatus = fopMsgStts_MSG_ENDS_e; fopMsgM_messageSendOn(); } } } else if(l_msg->mStatus == fopMsgStts_MSG_TYPING_e) { if(mMsgNo != 0x5AC) { setAnm(getAnmType(dComIfGp_getMesgAnimeAttrInfo())); } } else if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; return TRUE; } return FALSE; } /* 00004358-0000461C .text waitNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::waitNpcAction(void* param_1) { if(m8F0 == 0) { if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); } u8 anm = ANM_00; if(param_1) { u32 seNum; if(isPlayerFind()) { anm = ANM_0F; seNum = JA_SE_CV_CB_LEFT_ALONE; } else { anm = ANM_14; seNum = JA_SE_CV_CB_TROUBLE; } fopAcM_monsSeStart(this, seNum, 0); } setAnm(anm); offPlayerFind(); speedF = 0.0f; } else if(m8F0 != -1) { if(m8E1) { setNpcAction(&daNpc_Cb1_c::searchNpcAction, NULL); } else { mHasAttention = chkAttention(m8DC == 0x14 ? 4000.0f : l_HIO.mNpc.mMaxAttnDistXZ, 0x10000); BOOL temp = mHasAttention; if(temp) { if(getMsg()) { m8DD = 6; cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } else { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } } else { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } f32 dist_sq = fopAcM_searchActorDistance2(this, dComIfGp_getPlayer(0)); if(!checkNpcCallCommand()) { if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610) && dist_sq < SQUARE(l_HIO.field_0xC0)) { daPy_getPlayerLinkActorClass()->onNpcCall(); temp = TRUE; } } else { if(dist_sq >= SQUARE(l_HIO.mPlayerChaseDistance)) { setNpcAction(&daNpc_Cb1_c::searchNpcAction, NULL); } temp = TRUE; } lookBack(temp); current.angle.y = shape_angle.y; } } return TRUE; } /* 0000461C-000047B0 .text talkNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::talkNpcAction(void*) { if(m8F0 == 0) { l_msgId = fpcM_ERROR_PROCESS_ID_e; mMsgNo = getMsg(); cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); if(!isMusic()) { setAnm(isShipRide() ? ANM_0D : ANM_00); } } else if(m8F0 != -1) { mHasAttention = true; if(m8F0 == 1) { if(initTalk()) { m8F0 = 2; } } else if(m8F0 == 2) { if(execTalk(0)) { setWaitNpcAction(NULL); dComIfGp_event_reset(); } } if(isShipRide()) { daShip_c* pShip = dComIfGp_getShipActor(); if(pShip) { fopAc_ac_c* pLink = dComIfGp_getLinkPlayer(); cXyz temp = current.pos - (pLink->current.pos - current.pos); pShip->setAtnPos(&temp); } } else { mJntCtrl.setTrn(); lookBack(1); } } return TRUE; } /* 000047B0-00004B74 .text carryNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::carryNpcAction(void*) { if(m8F0 == 0) { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); offNpcCallCommand(); m8F4 = fopAcM_toPlayerShapeAngleY(this); if(isNoCarryAction()) { fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0); setAnm(ANM_0B); } else { fopAcM_monsSeStart(this, JA_SE_CV_CB_LIFT_UP, 0); setAnm(ANM_03); } onNpcNotChange(); } else if(m8F0 == -1) { m904.y = 0.0f; m904.z = 0.0f; offNoCarryAction(); offNpcNotChange(); } else { if(isNoCarryAction()) { mpMorf->setPlaySpeed(2.0f); } else { setRestart(1); daPy_py_c* pPlayer = (daPy_py_c*)dComIfGp_getPlayer(0); f32 oldPlaySpeed = mpMorf->getPlaySpeed(); if(0.0f == pPlayer->getSpeedF() && pPlayer->getBaseAnimeFrame() <= mpMorf->getEndFrame()) { mpMorf->setFrame(pPlayer->getBaseAnimeFrame()); mpMorf->setPlaySpeed(0.0f); } else { mpMorf->setPlaySpeed(1.0f); } if(oldPlaySpeed != mpMorf->getPlaySpeed()) { mpMorf->setMorf(4.0f); } cLib_chaseF(&m904.x, l_HIO.field_0x74, 1.0f); cLib_chaseF(&m904.y, l_HIO.field_0x78, 1.0f); cLib_chaseF(&m904.z, l_HIO.field_0x7C, 1.0f); cLib_chaseAngleS(&m8F4, 0, 0x800); shape_angle.y = pPlayer->shape_angle.y + m8F4; } if(!fopAcM_checkCarryNow(this)) { if(fopAcM_GetSpeedF(this) > 0.0f) { setNpcAction(&daNpc_Cb1_c::flyNpcAction, NULL); } else { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); } } mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false); current.angle.y = shape_angle.y; } return TRUE; } /* 00004B74-00004CBC .text flyNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::flyNpcAction(void*) { s8 temp = m8F0; if(temp == 0) { speedF = l_HIO.mNpcFlyLaunchSpeedF; speed.y = l_HIO.mNpcFlyLaunchSpeedY; setAnm(ANM_04); setFlyingTimer(l_HIO.mNpcFlyTimer); m8FC = l_HIO.field_0xD8 + 1; fopAcM_monsSeStart(this, JA_SE_CV_CB_THROW, 0); } else if(temp != -1) { flyAction(m8F1 ? FALSE : TRUE, 0.0f, 0, FALSE); if(temp != 1) { m8F1 = (m8F1 + 1) % l_HIO.field_0xDE; } } return TRUE; } /* 00004CBC-00004D88 .text routeAngCheck__11daNpc_Cb1_cFR4cXyzPs */ void daNpc_Cb1_c::routeAngCheck(cXyz& param_1, s16* param_2) { cXyz temp = m910.outprod(param_1); s16 angle = cM_atan2s(temp.x, temp.z); if((m910.y >= 1.0f && cLib_distanceAngleS(angle, *param_2) > 0x4000) || fopAcM_searchPlayerDistanceY(this) * temp.y < 0.0f) { angle += 0x8000; } *param_2 = angle; } /* 00004D88-00004FEC .text routeWallCheck__11daNpc_Cb1_cFR4cXyzR4cXyzPs */ void daNpc_Cb1_c::routeWallCheck(cXyz& param_1, cXyz& param_2, s16* param_3) { dBgS_LinChk lin_chk; lin_chk.Set(¶m_1, ¶m_2, NULL); if(dComIfG_Bgsp()->LineCross(&lin_chk)) { cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk); if(pla) { routeAngCheck(pla->mNormal, param_3); } } } /* 000053DC-0000565C .text checkForwardGroundY__11daNpc_Cb1_cFs */ f32 daNpc_Cb1_c::checkForwardGroundY(s16 param_1) { cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(mAcchCir[0]); if(pla && cLib_distanceAngleS(param_1, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) { dBgS_GndChk gnd_chk; gnd_chk.OffWall(); cXyz pos(current.pos.x + cM_ssin(param_1) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(param_1) * 80.0f); gnd_chk.SetPos(&pos); return dComIfG_Bgsp()->GroundCross(&gnd_chk); } return -1e+7; } /* 000057F4-000058C8 .text checkWallJump__11daNpc_Cb1_cFs */ f32 daNpc_Cb1_c::checkWallJump(s16 param_1) { f32 temp = checkForwardGroundY(param_1) - current.pos.y; if(0.0f < temp && temp < 80.0f) { return std::sqrtf(temp) * 3.8f; } return -1.0f; } /* 000058C8-0000593C .text chkWallHit__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::chkWallHit() { if(mAcch.ChkWallHit()) { s16 temp; if(mAcchCir[0].ChkWallHit()) { temp = mAcchCir[0].GetWallAngleY(); } else if(mAcchCir[1].ChkWallHit()) { temp = mAcchCir[1].GetWallAngleY(); } return cLib_distanceAngleS(shape_angle.y, temp) > 0x6000; } return FALSE; } /* 0000593C-00005F0C .text routeCheck__11daNpc_Cb1_cFfPs */ BOOL daNpc_Cb1_c::routeCheck(f32 param_1, s16* param_2) { if(!mAcch.ChkGroundHit()) { cXyz temp = current.pos; current.pos = old.pos; speedF = 0.0f; m8E0 = 1; dBgS_LinChk lin_chk; lin_chk.Set(&temp, ¤t.pos, NULL); if(dComIfG_Bgsp()->LineCross(&lin_chk)) { cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk); if(pla && cLib_distanceAngleS(*param_2, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) { return TRUE; } } if(mAcch.GetGroundH() - temp.y < -30.0f) { return FALSE; } setNpcAction(&daNpc_Cb1_c::jumpNpcAction, NULL); } else { if(chkWallHit()) { f32 temp = checkWallJump(*param_2); if(temp >= 0.0f) { setNpcAction(&daNpc_Cb1_c::jumpNpcAction, &temp); return TRUE; } if(param_1 > SQUARE(600.0f)) { return FALSE; } if(std::fabsf(dComIfGp_getPlayer(0)->current.pos.y - current.pos.y) > 100.0f) { return FALSE; } } cXyz temp(current.pos.x, current.pos.y + 100.0f, current.pos.z); cXyz temp2(cM_ssin(*param_2) * 80.0f + current.pos.x, current.pos.y + 100.0f, cM_scos(*param_2) * 80.0f + current.pos.z); routeWallCheck(temp, temp2, param_2); } return TRUE; } /* 00005F0C-000062F4 .text searchNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::searchNpcAction(void*) { f32 temp2; if(m8F0 == 0) { cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); setAnm(ANM_01); } else if(m8F0 != -1) { s16 temp; if(m8E1) { s16 temp3 = m8E1 < 0 ? -0x4000 : 0x4000; temp = temp3 + cM_atan2s(m91C.x, m91C.z); } else { if(!checkNpcCallCommand()) { temp2 = 0.0f; if(speedF == 0.0f) { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); return TRUE; } temp2 = 0.0f; temp = current.angle.y; } else { mHasAttention = true; fopAc_ac_c* pPlayer = dComIfGp_getPlayer(0); BOOL door = pPlayer->eventInfo.checkCommandDoor(); f32 dist_sq = fopAcM_searchPlayerDistance2(this); f32 dist_xz_sq = fopAcM_searchPlayerDistanceXZ2(this); if(!door && dist_sq < SQUARE(l_HIO.mPlayerChaseDistance)) { temp2 = 0.0f; } else { temp2 = l_HIO.mChaseDistScale * std::sqrtf(dist_xz_sq); temp2 = cLib_maxLimit(temp2, l_HIO.mMaxWalkSpeed); } temp = fopAcM_searchPlayerAngleY(this); if(door || !routeCheck(dist_xz_sq, &temp) || dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK1_e) || ((daPy_py_c*)pPlayer)->checkAttentionLock()) { temp2 = 0.0f; if(speedF == 0.0f) { offNpcCallCommand(); setNpcAction(&daNpc_Cb1_c::waitNpcAction, this); return TRUE; } temp2 = 0.0f; temp = current.angle.y; } if(dist_xz_sq < SQUARE(400.0f) && cLib_distanceAngleS(shape_angle.y, temp) < 0x2000 && std::fabsf(fopAcM_searchPlayerDistanceY(this)) < 100.0f) { onPlayerFind(); } if(cLib_calcTimer(&m8DF) == 0) { m8DE ^= 1; m8DF = cLib_getRndValue(l_HIO.field_0xE2, l_HIO.field_0xE4); } temp += m8DE ? -l_HIO.field_0xE6 : l_HIO.field_0xE6; } } if(mCyl.ChkCoHit()) { setNpcAction(&daNpc_Cb1_c::hitNpcAction, NULL); } else { walkAction(temp2, l_HIO.mForwardAccel, temp); } } return TRUE; } /* 000062F4-00006440 .text hitNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::hitNpcAction(void*) { if(m8F0 == 0) { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); speedF = cLib_maxLimit(speedF, l_HIO.mMaxWalkSpeed * 0.5f); speed.y = l_HIO.mHitSpeedScaleY * std::fabsf(speedF); speedF *= l_HIO.mHitSpeedScaleF; fopAcM_seStart(this, JA_SE_CM_CB_BOUND, 0); setAnm(ANM_02); } else if(m8F0 != -1 && mAcch.ChkGroundHit()) { speedF = 0.0f; setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); } return TRUE; } /* 00006440-00006518 .text jumpNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::jumpNpcAction(void* param_1) { if(m8F0 == 0) { if(param_1) { speed.y = *(f32*)param_1; } else { speed.y = 10.0f; } speedF = 4.0f; m900 = 0.0f; setAnm(ANM_16); } else if(m8F0 != -1 && mAcch.ChkGroundHit()) { checkLanding(); speedF = 0.0f; setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); } return TRUE; } /* 00006518-00006574 .text rescueNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::rescueNpcAction(void*) { #if VERSION <= VERSION_JPN if(m8F0 == 0) { setAnm(ANM_00); fopDwTg_DrawQTo(&draw_tag); } else if(m8F0 != -1) { m8DD = 0; } #else if(m8F0 != -1) { if(m8F0 == 0) { setAnm(ANM_00); fopDwTg_DrawQTo(&draw_tag); } m8DD = 0; } #endif return TRUE; } /* 00006574-00006658 .text musicNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::musicNpcAction(void*) { if(m8F0 == 0) { setAnm(ANM_09); } #if VERSION == VERSION_DEMO else if(m8F0 != -1) #else else if(m8F0 != -1 && !isTypeKazeBoss()) #endif { #if VERSION == VERSION_DEMO getStickAngY(); #endif cLib_addCalcAngleS(&shape_angle.y, home.angle.y, 8, 0x2000, 0x400); current.angle.y = shape_angle.y; mHasAttention = chkAttention(l_HIO.mNpc.mMaxAttnDistXZ, 0x10000); if(mHasAttention) { if(isTypeWaterFall()) { m8DD = 7; } else { m8DD = 6; } cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } else { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } } return TRUE; } /* 00006658-000067A4 .text shipNpcAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::shipNpcAction(void*) { if(m8F0 == 0) { onNpcNotChange(); setAnm(ANM_0D); speedF = 0.0f; m8F0++; } else if(m8F0 != -1) { if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604)) { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); offShipRide(); } else { mHasAttention = chkAttention(500.0f, l_HIO.mNpc.mMaxAttnAngleY); BOOL temp = mHasAttention; if(temp && !dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && getMsg()) { m8DD = 6; cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } else { cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e); } } } return TRUE; } /* 000067A4-000069E8 .text waitPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::waitPlayerAction(void*) { if(m8F0 == 0) { setAnm(ANM_00); cLib_onBit(attention_info.flags, ~0); } else if(m8F0 != -1 && !sowCheck()) { dAttention_c& attention = dComIfGp_getAttention(); if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x80 || attention.Lockon()) { s16 target = getStickAngY(); cLib_addCalcAngleS(¤t.angle.y, target, 0x19, 0x7FFF, 1); cXyz temp; int stickPos = calcStickPos(target, &temp); if(stickPos == 0) { shape_angle.y = current.angle.y; } else if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x84) { shape_angle.y = current.angle.y; } s16 temp3 = shape_angle.y; mJntCtrl.lookAtTarget(&temp3, &temp, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false); if(stickPos > 0) { shape_angle.y = temp3; } current.angle.y = shape_angle.y; if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x84 && stickPos == 0) { current.angle.y = target; setPlayerAction(&daNpc_Cb1_c::walkPlayerAction, NULL); } } else { mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false); current.angle.y = shape_angle.y; } breaking(); } return TRUE; } /* 000069E8-00006D00 .text walkPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::walkPlayerAction(void*) { if(m8F0 == 0) { setAnm(ANM_01); cLib_onBit(attention_info.flags, ~0); } else if(m8F0 != -1 && !sowCheck()) { f32 temp = g_mDoCPd_cpadInfo[0].mMainStickValue * l_HIO.mStickWalkSpeedScale; s16 temp7 = getStickAngY(); s32 temp2 = cLib_distanceAngleS(temp7, current.angle.y); f32 temp6 = l_HIO.mForwardAccel; if(temp > speedF) { if(temp < l_HIO.mMinWalkSpeed) { temp = l_HIO.mMinWalkSpeed; } } else { temp6 = l_HIO.mDecel; } if(temp2 > 0x6000) { temp = 0.0f; if(speedF != 0.0f) { temp7 = current.angle.y; } temp6 = 2.0f; } cLib_addCalcAngleS(¤t.angle.y, temp7, l_HIO.field_0xEC, l_HIO.field_0xE8, l_HIO.field_0xEA); cXyz temp4; int stickPos = calcStickPos(temp7, &temp4); if(stickPos == 0) { cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 8, 0x2000, 0x400); } s16 temp3 = shape_angle.y; mJntCtrl.lookAtTarget(&temp3, &temp4, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false); if(stickPos > 0) { shape_angle.y = temp3; } temp = cLib_maxLimit(temp, l_HIO.mMaxWalkSpeed); if(cLib_chaseF(&speedF, temp, temp6) && temp == 0) { setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL); } else { f32 temp8 = speedF * l_HIO.mWalkAnmSpeedScale; mpMorf->setPlaySpeed(cLib_minLimit(temp8, l_HIO.mMaxWalkAnmSpeed)); if(!mAcch.ChkGroundHit()) { setPlayerAction(&daNpc_Cb1_c::jumpPlayerAction, NULL); } else if(chkWallHit()) { f32 temp5 = checkWallJump(current.angle.y); if(temp5 >= 0.0f) { setPlayerAction(&daNpc_Cb1_c::jumpPlayerAction, &temp5); return TRUE; } } } } return TRUE; } /* 00006D00-00006E20 .text hitPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::hitPlayerAction(void*) { if(m8F0 == 0) { speedF = cLib_maxLimit(speedF, 0.5f * l_HIO.mMaxWalkSpeed); speed.y = l_HIO.mHitSpeedScaleY * std::fabsf(speedF); speedF *= l_HIO.mHitSpeedScaleF; fopAcM_seStart(this, JA_SE_CM_CB_BOUND, 0); setAnm(ANM_02); } else if(m8F0 != -1 && mAcch.ChkGroundHit()) { returnLink(); speedF = 0.0f; } return TRUE; } /* 00006E20-00006EFC .text jumpPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::jumpPlayerAction(void* param_1) { if(m8F0 == 0) { if(param_1) { speed.y = *(f32*)param_1; } else { speed.y = 10.0f; } m900 = 0.0f; setAnm(ANM_16); } else if(m8F0 != -1 && !flyCheck() && mAcch.ChkGroundHit()) { checkLanding(); speedF = 0.0f; setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL); } return TRUE; } /* 00006EFC-00006FFC .text flyPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::flyPlayerAction(void*) { if(m8F0 == 0) { speed.y = l_HIO.mFlyLaunchSpeedY; setAnm(ANM_04); setFlyingTimer(l_HIO.mPlayerFlyTimer); fopAcM_monsSeStart(this, JA_SE_CV_CB_LEAF_OUT, 0); } else if(m8F0 != -1) { dComIfGp_setAStatus(dActStts_LET_GO_e); flyAction(CPad_CHECK_TRIG_A(0), g_mDoCPd_cpadInfo[0].mMainStickValue * l_HIO.mStickFlySpeedScale, getStickAngY(), CPad_CHECK_TRIG_B(0)); } return TRUE; } /* 00006FFC-0000707C .text carryPlayerAction__11daNpc_Cb1_cFPv */ BOOL daNpc_Cb1_c::carryPlayerAction(void*) { if(m8F0 == 0) { setAnm(ANM_0B); fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE_S, 0); } return TRUE; } /* 0000707C-000070D0 .text daNpc_Cb1_XyCheckCB__FPvi */ static s16 daNpc_Cb1_XyCheckCB(void* i_this, int i_itemBtn) { return static_cast(i_this)->XyCheckCB(i_itemBtn); } /* 000070D0-000070D8 .text daNpc_Cb1_XyEventCB__FPvi */ static s16 daNpc_Cb1_XyEventCB(void* param_1, int param_2) { return static_cast(param_1)->XyEventCB(param_2); } /* 000070D8-0000711C .text calcFlyingTimer__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::calcFlyingTimer() { if(getFlyingTimer() != 0 && !cLib_calcTimer(&m_flyingTimer)) { return TRUE; } return FALSE; } /* 0000711C-00007250 .text initAnm__11daNpc_Cb1_cFSci */ void daNpc_Cb1_c::initAnm(s8 param_1, BOOL param_2) { if(param_1 >= 0) { m8DC = param_1; AnmData& data = anmTblData[m8DC]; m8B0 = 0; dNpc_setAnm(mpMorf, data.mLoopMode, param_2 ? data.field_0x02 : 0.0f, data.mSpeed, abs(data.mAnmFileIdx), -1, "Cb"); m8D7 = 0; m8D8 = 0; if(data.mAnmFileIdx < 0) { onMusic(); } else { offMusic(); } } } /* 00007250-000072B4 .text musicPlay__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::musicPlay() { if(!isTypeKazeBoss()) { mDoAud_cbPracticePlay(&eyePos); } else { mDoAud_bgmStart(JA_BGM_MAKORE_TAKT_8); } } /* 000072B4-000072EC .text musicStop__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::musicStop() { if(!isTypeKazeBoss()) { mDoAud_cbPracticeStop(); } } daNpc_Cb1_c::AnmData daNpc_Cb1_c::anmTblData[] = { {0x17, 0x02, 0x08, 0x01, -1, -1}, {0x1A, 0x02, 0x04, 0x01, -1, -1}, {0x0C, 0x00, 0x04, 0x01, -1, -1}, {0x0B, 0x02, 0x04, 0x01, -1, -1}, {0x10, 0x00, 0x04, 0x01, -1, -1}, {0x11, 0x02, 0x00, 0x01, -1, -1}, {0x09, 0x02, 0x0F, 0x01, -1, -1}, {-0x18, 0x02, 0x10, 0x01, -1, -1}, {-0x13, 0x02, 0x08, 0x01, -1, -1}, {-0x12, 0x02, 0x08, 0x01, -1, -1}, {0x0D, 0x02, 0x08, 0x01, -1, -1}, {0x15, 0x00, 0x08, 0x01, -1, -1}, {0x14, 0x02, 0x08, 0x01, -1, -1}, {-0x18, 0x02, 0x08, 0x01, 0x02, 0x0E}, {-0x04, 0x00, 0x10, 0x01, -1, 0x0F}, {-0x18, 0x02, 0x00, 0x01, 0x02, -1}, {-0x13, 0x00, 0x10, 0x01, -1, 0x11}, {-0x12, 0x02, 0x00, 0x01, 0x18, 0x12}, {-0x13, 0x00, 0x00, 0x01, -1, 0x13}, {-0x18, 0x02, 0x10, 0x01, 0x03, 0x10}, {0x06, 0x02, 0x08, 0x01, 0x04, 0x00}, {0x05, 0x00, 0x08, 0x01, -1, 0x00}, {0x07, 0x00, 0x08, 0x01, -1, 0x17}, {0x06, 0x02, 0x08, 0x01, -1, -1}, {0x08, 0x02, 0x08, 0x01, -1, -1}, {0x19, 0x02, 0x08, 0x01, 0x03, 0x00}, {0x0A, 0x02, 0x08, 0x01, -1, -1}, {0x17, 0x02, 0x08, 0x01, -1, -1}, }; s8 daNpc_Cb1_c::anmPrmData[] = {0, 1, 2, 3, 4, 5, 4, 6, 7, 0x10, 8, 0xA, 0xB, 0xC, 0xE, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x09}; /* 000072EC-00007390 .text setAnm__11daNpc_Cb1_cFUc */ BOOL daNpc_Cb1_c::setAnm(u8 param_1) { if(m8DB == param_1) { return FALSE; } if(m8DB == 9) { #if VERSION == VERSION_DEMO mDoAud_cbPracticeStop(); #else musicStop(); #endif } m8DB = param_1; if(m8DB == 9) { fopAcM_OnStatus(this, fopAcStts_NOPAUSE_e); } else { fopAcM_OffStatus(this, fopAcStts_NOPAUSE_e); } initAnm(anmPrmData[m8DB], 1); return TRUE; } /* 00007390-000074F0 .text playAnm__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::playAnm() { BOOL r3 = mpMorf->play( &eyePos, #if VERSION == VERSION_DEMO mAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd) : 0, #else (m_status & daCbStts_UNK_0100) && mAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd) : 0, #endif dComIfGp_getReverb(fopAcM_GetRoomNo(this)) ); if(r3 || mpMorf->getFrame() < m8B0) { m8D7 = 1; m8D8++; AnmData& data = anmTblData[m8DC]; #if VERSION == VERSION_DEMO if(m8D8 >= data.field_0x04) #else s8 temp = data.field_0x04; if(isTypeKazeBoss() && temp == 0x18) { temp = 0xD; } if(m8D8 >= temp) #endif { if(data.field_0x05 == 0x13) { #if VERSION == VERSION_DEMO mDoAud_cbPracticeStop(); #else musicStop(); #endif } else if(data.field_0x05 == 0x11) { #if VERSION == VERSION_DEMO mDoAud_cbPracticePlay(&eyePos); #else musicPlay(); #endif } initAnm(data.field_0x05, 1); } } m8B0 = mpMorf->getFrame(); } /* 000074F0-00007650 .text chkAttention__11daNpc_Cb1_cFfl */ BOOL daNpc_Cb1_c::chkAttention(f32 param_1, s32 param_2) { cXyz temp; temp.x = dComIfGp_getPlayer(0)->current.pos.x - current.pos.x; temp.z = dComIfGp_getPlayer(0)->current.pos.z - current.pos.z; f32 diff = std::sqrtf(SQUARE(temp.x) + SQUARE(temp.z)); s16 angle = cM_atan2s(temp.x, temp.z); if(mHasAttention) { param_1 += 40.0f; param_2 += 0x71C; } s16 temp2 = shape_angle.y + getHead_y() + getBackbone_y(); angle -= temp2; BOOL result = FALSE; if(abs(angle) < param_2 && param_1 > diff) { result = TRUE; } return result; } /* 00007650-000076A4 .text carryCheck__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::carryCheck() { if(fopAcM_checkCarryNow(this)) { setNpcAction(&daNpc_Cb1_c::carryNpcAction, NULL); } } /* 000076A4-0000776C .text eventOrder__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::eventOrder() { if(m8DD == 5 || m8DD == 6) { eventInfo.onCondition(dEvtCnd_CANTALK_e); if(m8DD == 5) { fopAcM_orderSpeakEvent(this); } } else if(m8DD == 7) { eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); eventInfo.onCondition(dEvtCnd_CANTALK_e); } else if(m8DD != -1 && m8DD < 5) { m8E3 = m8DD; if(m8E3 != -1 && mEventIdx[m8E3] != -1) { fopAcM_orderOtherEventId(this, mEventIdx[m8E3]); } } } /* 0000776C-00007848 .text checkOrder__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::checkOrder() { if(eventInfo.checkCommandTalk()) { if(m8DD == 5 || m8DD == 6 || m8DD == 7) { m8DD = -1; if(dComIfGp_event_chkTalkXY()) { onTact(); } else { setNpcAction(&daNpc_Cb1_c::talkNpcAction, NULL); } fopAcM_cancelCarryNow(this); } } } /* 00007848-000078C4 .text checkCommandTalk__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::checkCommandTalk() { if(eventInfo.checkCommandTalk()) { if(dComIfGp_event_chkTalkXY()) { if(m8DD == 7) { m8DD = -1; } onTact(); return FALSE; } return TRUE; } return FALSE; } /* 000078C4-000079AC .text next_msgStatus__11daNpc_Cb1_cFPUl */ u16 daNpc_Cb1_c::next_msgStatus(u32* pMsgNo) { if(*pMsgNo == 0x5AC) { return fopMsgStts_MSG_ENDS_e; } else if(*pMsgNo == 0x1520 || (0x1519 <= *pMsgNo && *pMsgNo <= 0x151D) || *pMsgNo == 0x1523 || (0x14C2 <= *pMsgNo && *pMsgNo <= 0x14C3)) { *pMsgNo += 1; } else if(*pMsgNo == 0x151E) { dComIfGs_onEventBit(dSv_event_flag_c::UNK_1880); return fopMsgStts_MSG_ENDS_e; } else if(*pMsgNo == 0x1521) { dComIfGs_onEventBit(dSv_event_flag_c::UNK_1840); return fopMsgStts_MSG_ENDS_e; } else if(*pMsgNo == 0x14C4) { dComIfGs_onEventBit(dSv_event_flag_c::UNK_1904); return fopMsgStts_MSG_ENDS_e; } else { return fopMsgStts_MSG_ENDS_e; } return fopMsgStts_MSG_CONTINUES_e; } /* 000079AC-00007A8C .text getMsg__11daNpc_Cb1_cFv */ u32 daNpc_Cb1_c::getMsg() { #if VERSION == VERSION_DEMO if(isShipRide()) { return 0x152F; } #endif if(isTypeBossDie()) { return 0x1456; } if(isTypeForest()) { return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1904) ? 0x14C5 : 0x14C2; } if(isTypeWaterFall()) { if(isTact()) { return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1840) ? 0x1522 : 0x1520; } return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1880) ? 0x151F : 0x1519; } #if VERSION > VERSION_DEMO if(isShipRide()) { return 0x152F; } #endif return 0; } /* 00007A8C-00007B38 .text setCollision__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::setCollision() { mCyl.SetC(current.pos); mCyl.SetR(20.0f); mCyl.SetH(60.0f); dComIfG_Ccsp()->Set(&mCyl); mWindCyl.SetC(current.pos); mWindCyl.SetR(20.0f); mWindCyl.SetH(60.0f); dComIfG_Ccsp()->Set(&mWindCyl); } /* 00007B38-00007C4C .text lookBack__11daNpc_Cb1_cFi */ void daNpc_Cb1_c::lookBack(BOOL param_1) { cXyz* dstPos = NULL; cXyz vec2; cXyz vec(0.0f, 0.0f, 0.0f); s16 desiredY = shape_angle.y; if(mJntCtrl.trnChk()) { cLib_addCalcAngleS2(&m8D0, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800); } else { m8D0 = 0; } if(param_1) { vec2 = dNpc_playerEyePos(l_HIO.mNpc.m04); dstPos = &vec2; vec = current.pos; vec.y = eyePos.y; } mJntCtrl.lookAtTarget(&shape_angle.y, dstPos, vec, desiredY, m8D0, 0); } /* 00007C4C-00007E7C .text setBaseMtx__11daNpc_Cb1_cFv */ void daNpc_Cb1_c::setBaseMtx() { J3DModel* pModel = mpMorf->getModel(); if(isShipRide()) { daShip_c* pShip = dComIfGp_getShipActor(); if(pShip != NULL) { mDoMtx_stack_c::copy(pShip->getHeadJntMtx()); mDoMtx_stack_c::transM(10.92f, 0.57f, -14.0f); mDoMtx_stack_c::XYZrotM(-0x3AAA, 0, 0x40FE); pModel->setBaseTRMtx(mDoMtx_stack_c::get()); MtxP pMtx = mDoMtx_stack_c::get(); current.pos.set(pMtx[0][3], pMtx[1][3], pMtx[2][3]); shape_angle.y = pShip->shape_angle.y + 0x8000; fopAcM_OnStatus(this, fopAcStts_UNK4000_e); tevStr.mRoomNo = pShip->tevStr.mRoomNo; tevStr.mEnvrIdxOverride = pShip->tevStr.mEnvrIdxOverride; pShip->onCb1Ride(); fopAcM_onDraw(this); } } else { pModel->setBaseScale(scale); mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 25.0f, current.pos.z); mDoMtx_stack_c::YrotM(shape_angle.y); mDoMtx_stack_c::transM(m904); mDoMtx_stack_c::XrotM(shape_angle.x); mDoMtx_stack_c::transM(0.0f, -25.0f, 0.0f); mDoMtx_stack_c::ZrotM(shape_angle.z); pModel->setBaseTRMtx(mDoMtx_stack_c::get()); if(mpNutModel && isNut()) { mpNutModel->setBaseTRMtx(mDoMtx_stack_c::get()); } if(mpPropellerModel) { mDoMtx_stack_c::transM(0.0f, 24.8f, 1.5f); mpPropellerModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpPropellerModel->calc(); } } } /* 00007E7C-00008104 .text init__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::init() { gravity = l_HIO.field_0x70; #if VERSION > VERSION_DEMO offPlayerRoom(); offFlying(); setFlyingTimer(0); m_status = 0; #endif attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAB; attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAB; attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 8; #if VERSION == VERSION_DEMO if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { onNpcNotChange(); } if (shipRideCheck()) { attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF; attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF; } else if(isTypeBossDie()) { setNpcAction(&daNpc_Cb1_c::rescueNpcAction, NULL); } else if(isTypeForest()) { setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL); } else if(isTypeWaterFall()) { setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL); } else { if(isTypeEkaze()) { onNpcCallCommand(); setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); } else { setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); } offMusic(); } #elif VERSION == VERSION_JPN onNpcNotChange(); if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall()) { setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL); home.roomNo = -1; current.roomNo = -1; gravity = -0.1f; } else if(isTypeBossDie()) { daNpc_Cb1_c::ActionFunc_t func = dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_FW) ? &daNpc_Cb1_c::waitNpcAction : &daNpc_Cb1_c::rescueNpcAction; setNpcAction(func, NULL); } else if(!isTypeEkaze() && !isTypeKaze() && shipRideCheck()) { attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF; attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF; } else { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { offNpcNotChange(); } if(isTypeEkaze()) { onNpcCallCommand(); } setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); offMusic(); } #else // VERSION_USA or VERSION_PAL static const char* l_eventNameTbl[] = { "cb_rescue", "OPTION_CHAR_END", "cb_tact", "cb_tactCancel", "cb_sow" }; for(int i = 0; i < 5; i++) { mEventIdx[i] = dComIfGp_evmng_getEventIdx(l_eventNameTbl[i]); } m8E3 = -1; m8DD = -1; eventInfo.setXyCheckCB(&daNpc_Cb1_XyCheckCB); eventInfo.setXyEventCB(&daNpc_Cb1_XyEventCB); onNpcNotChange(); if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall()) { setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL); home.roomNo = -1; current.roomNo = -1; gravity = -0.1f; } else if(isTypeBossDie()) { setNpcAction(dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_FW) ? &daNpc_Cb1_c::waitNpcAction : &daNpc_Cb1_c::rescueNpcAction, NULL); } else if(!isTypeEkaze() && !isTypeKaze() && shipRideCheck()) { attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF; attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF; } else { if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { offNpcNotChange(); } if(isTypeEkaze()) { onNpcCallCommand(); } setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL); offMusic(); } #endif mStts.Init(0xFE, 0xFF, this); mCyl.Set(l_cyl_src); mCyl.SetStts(&mStts); mWindCyl.Set(l_wind_cyl_src); mWindCyl.SetStts(&mStts); #if VERSION <= VERSION_JPN static const char* l_eventNameTbl[] = { "cb_rescue", "OPTION_CHAR_END", "cb_tact", "cb_tactCancel", "cb_sow" }; for(int i = 0; i < 5; i++) { mEventIdx[i] = dComIfGp_evmng_getEventIdx(l_eventNameTbl[i]); } m8E3 = -1; #if VERSION == VERSION_JPN m8DD = -1; #endif eventInfo.setXyCheckCB(&daNpc_Cb1_XyCheckCB); eventInfo.setXyEventCB(&daNpc_Cb1_XyEventCB); #endif return TRUE; } /* 00008104-000084A4 .text draw__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::draw() { if(isShipRide()) { daShip_c* pShip = dComIfGp_getShipActor(); if(pShip && pShip->checkHeadNoDraw()) { return TRUE; } } else #if VERSION > VERSION_DEMO if(!fopAcM_checkCarryNow(this)) #endif { s32 homeRoomNo = fopAcM_GetHomeRoomNo(this); if (homeRoomNo < 0 || !dComIfGp_roomControl_checkStatusFlag(homeRoomNo, 0x10)) { return TRUE; } } J3DModel* pModel = mpMorf->getModel(); g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); drawDamageFog(); g_env_light.setLightTevColorType(pModel, &tevStr); mpMorf->updateDL(); J3DModel* pFaceModel = mpFaceModel; g_env_light.setLightTevColorType(pFaceModel, &tevStr); pFaceModel->setBaseTRMtx(pModel->getAnmMtx(m_backbone_jnt_num)); mDoExt_modelUpdateDL(pFaceModel); mShadowId = 0; if( #if VERSION > VERSION_DEMO (m_status & daCbStts_UNK_0100) && #endif fopAcM_GetHomeRoomNo(this) >= 0 && !fopAcM_checkCarryNow(this) && !isShipRide() ) { cXyz shadowPos(current.pos.x, current.pos.y + 80.0f, current.pos.z); mShadowId = dComIfGd_setShadow( mShadowId, 0, mpMorf->getModel(), &shadowPos, 600.0f, 20.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr ); } if(isMusic()) { g_env_light.setLightTevColorType(mpStickModel, &tevStr); mpStickModel->setBaseTRMtx(pModel->getAnmMtx(m_armRend_jnt_num)); mDoExt_modelUpdateDL(mpStickModel); g_env_light.setLightTevColorType(mpCelloModel, &tevStr); mpCelloModel->setBaseTRMtx(pModel->getAnmMtx(m_armL2_jnt_num)); mDoExt_modelUpdateDL(mpCelloModel); if( #if VERSION > VERSION_DEMO (m_status & daCbStts_UNK_0100) && #endif mShadowId ) { dComIfGd_addRealShadow(mShadowId, mpStickModel); dComIfGd_addRealShadow(mShadowId, mpCelloModel); } } else { if(mpPropellerModel && isFlyAction() && m8DC != 2) { f32 frame = 11.0f; if(m8DC == 4) { frame = mpMorf->getFrame(); } mPropellerBckAnim.entry(mpPropellerModel->getModelData(), frame); g_env_light.setLightTevColorType(mpPropellerModel, &tevStr); mDoExt_modelUpdateDL(mpPropellerModel); if( #if VERSION > VERSION_DEMO (m_status & daCbStts_UNK_0100) && #endif mShadowId ) { dComIfGd_addRealShadow(mShadowId, mpPropellerModel); } } else if(mpNutModel && isNut()) { J3DModelData* pModelData = mpNutModel->getModelData(); mNutBckAnim.entry(pModelData); g_env_light.setLightTevColorType(mpNutModel, &tevStr); mDoExt_modelUpdateDL(mpNutModel); } } dSnap_RegistFig(DSNAP_TYPE_CB1, this, 1.0f, 1.0f, 1.0f); return TRUE; } /* 000084A4-00009090 .text execute__11daNpc_Cb1_cFv */ BOOL daNpc_Cb1_c::execute() { cLib_offBit(actor_status, fopAcStts_SHOWMAP_e); executeDamageFog(); fopAcM_setStageLayer(this); if(fopAcM_GetRoomNo(this) == dComIfGp_roomControl_getStayNo()) { onPlayerRoom(); } else { offPlayerRoom(); } #if VERSION > VERSION_DEMO m_status &= ~daCbStts_UNK_0100; #endif if( !isShipRide() #if VERSION > VERSION_DEMO && !fopAcM_checkCarryNow(this) #endif ) { if( !check_initialRoom() #if VERSION > VERSION_DEMO || (isTypeKazeBoss() && !dComIfG_Bgsp()->ChkMoveBG_NoDABg(mAcch.m_gnd)) #endif ) { #if VERSION > VERSION_DEMO home.roomNo = 0xFF; current.roomNo = 0xFF; #endif if(dComIfGp_getCb1Player() == this) { dComIfGp_setCb1Player(NULL); } return TRUE; } initialRestartOption(1, isTypeKaze()); if(!isShipRide() && check_moveStop()) { setWaitNpcAction(NULL); return TRUE; } if(m8E0 && dComIfG_Bgsp()->ChkPolySafe(mPolyInfo) && dComIfG_Bgsp()->ChkMoveBG(mPolyInfo)) { cXyz temp = old.pos; dComIfG_Bgsp()->MoveBgCrrPos(mPolyInfo, true, &old.pos, NULL, NULL); } mJntCtrl.setParam(l_HIO.mNpc.mMaxBackboneX, l_HIO.mNpc.mMaxBackboneY, l_HIO.mNpc.mMinBackboneX, l_HIO.mNpc.mMinBackboneY, l_HIO.mNpc.mMaxHeadX, l_HIO.mNpc.mMaxHeadY, l_HIO.mNpc.mMinHeadX, l_HIO.mNpc.mMinHeadY, l_HIO.mNpc.mMaxTurnStep ); } #if VERSION == VERSION_DEMO if (checkNowPosMove("Cb1")) { playAnm(); } #endif cXyz temp2 = cXyz::Zero; f32 temp3 = 3.0f; if(!fopAcM_checkCarryNow(this) && !isShipRide()) { if(checkNowPosMove("Cb1") && !isReturnLink()) { f32 temp4 = current.pos.y; fopAcM_posMoveF(this, mStts.GetCCMoveP()); m900 += temp4 - current.pos.y; current.pos.x += m88C.x; current.pos.z += m88C.z; maxFallSpeed = -100.0f; gravity = l_HIO.field_0x70; } m8E0 = mAcch.ChkGroundHit(); mAcch.CrrPos(*dComIfG_Bgsp()); #if VERSION > VERSION_DEMO m_status |= daCbStts_UNK_0100; #endif if(mAcch.GetGroundH() == -G_CM3D_F_INF || dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4) { if(isFlyAction() && m8FC > -400.0f) { m4E8 = 0; } else if(m4E8 < 0x1E) { m4E8++; } else if(!dComIfGp_roomControl_checkStatusFlag(fopAcM_GetHomeRoomNo(this), 0x10)) { current = home; shape_angle = home.angle; speedF = 0.0f; m4E8 = 0; fopAcM_seStart(this, JA_SE_CV_CB_LEFT_ALONE, 0); } else { daPy_getPlayerLinkActorClass()->npcStartRestartRoom(); } } else { m4E8 = 0; } if(mAcch.GetGroundH() != -G_CM3D_F_INF) { cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); if(pla) { m910 = pla->mNormal; if(m8E0) { maxFallSpeed = -4.0f - (1.0f - m910.y) * 100.0f; if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) == 1) { f32 temp = m910.abs2XZ(); temp2.x = m910.x * 40.0f; temp2.z = m910.z * 40.0f; speed.y = std::sqrtf(1.0f - temp) * -40.0f; maxFallSpeed = speed.y; temp3 = temp * 2.0f; checkLanding(); } } } s8 roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); fopAcM_SetRoomNo(this, roomNo); tevStr.mRoomNo = roomNo; tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); mStts.SetRoomId(roomNo); mPolyInfo = mAcch.m_gnd; } setCollision(); } #if VERSION > VERSION_DEMO if(checkNowPosMove("Cb1")) { playAnm(); } #endif #if VERSION > VERSION_JPN if(dComIfGp_getPlayer(0) == this) { dComIfGp_setDoStatus(dActStts_BLANK_e); dComIfGp_setAStatus(dActStts_HIDDEN_e); dComIfGp_setRStatusForce(dActStts_BLANK_e); } #endif if(!eventProc()) { offTact(); if( !isFlyAction() #if VERSION > VERSION_DEMO && !isMusic() #endif && mWindCyl.ChkTgHit() ) { temp2 = *mWindCyl.GetTgRVecP(); f32 temp = mWindCyl.GetTgRVecP()->absXZ(); if(temp < 1.0f) { temp2 = (current.pos - *mWindCyl.GetTgHitPosP()) * 30.0f; } if(temp > 30.0f) { temp2 *= 30.0f / temp; } temp3 = 1.0f; } cLib_addCalcPosXZ(&m88C, temp2, 0.5f, temp3, 0.5f); if(dComIfGp_getPlayer(0) == this) { #if VERSION <= VERSION_JPN int r4 = dActStts_BLANK_e; dComIfGp_setDoStatus(r4); dComIfGp_setAStatus(dActStts_HIDDEN_e); if(mAcch.ChkGroundHit() != false) { r4 = dActStts_RETURN_e; } dComIfGp_setRStatusForce(r4); #else if(mAcch.ChkGroundHit()) { dComIfGp_setRStatusForce(dActStts_RETURN_e); } #endif fopAcM_SetStatusMap(this, 0x12); if(isReturnLink()) { m8DD = 1; } else { if(isNoCarryAction()) { setPlayerAction(&daNpc_Cb1_c::carryPlayerAction, NULL); returnLink(); } #if VERSION == VERSION_DEMO playerAction(NULL); if(dComIfGp_getRStatusForce() == 7 && !dComIfGp_event_runCheck() && (CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0))) { returnLink(); } else #else if(!dComIfGp_event_runCheck() && dComIfGp_getRStatusForce() == 7 && !dComIfGp_event_runCheck() && (CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0))) { returnLink(); } playerAction(NULL); #endif if( getDamageFogTimer() == 0 #if VERSION > VERSION_DEMO && !isMusic() #endif && mCyl.ChkTgHit() && mCyl.GetTgHitObj() ) { cXyz temp = current.pos - *mCyl.GetTgHitPosP(); current.angle.y = cM_atan2s(temp.x, temp.z); speedF = l_HIO.field_0xC4; setPlayerAction(&daNpc_Cb1_c::hitPlayerAction, NULL); setDamageFogTimer(l_HIO.mDamageTimer); fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0); } } m8E2 = dComIfGp_getDoStatus(); } else { m8E1 = chkMoveBlock(&m91C); if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) { fopAcM_SetStatusMap(this, 0xD); } else { fopAcM_SetStatusMap(this, 0x7); } carryCheck(); checkOrder(); npcAction(NULL); if(!chkNpcAction(&daNpc_Cb1_c::flyNpcAction)) { current.angle.y = shape_angle.y; } if( getDamageFogTimer() == 0 && #if VERSION > VERSION_DEMO !isMusic() && #endif mCyl.ChkTgHit() && mCyl.GetTgHitObj() ) { cXyz temp = current.pos - *mCyl.GetTgHitPosP(); current.angle.y = cM_atan2s(temp.x, temp.z); speedF = l_HIO.field_0xC4; setNpcAction(&daNpc_Cb1_c::hitNpcAction, NULL); setDamageFogTimer(l_HIO.mDamageTimer); fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0); } m8E2 = 0; } } eventOrder(); setBaseMtx(); cXyz temp5(0.0f, l_HIO.mNpc.mAttnYOffset, 0.0f); cLib_offsetPos(&attention_info.position, ¤t.pos, shape_angle.y, &temp5); cXyz temp6(0.0f, l_HIO.field_0x30, 0.0f); cLib_offsetPos(&eyePos, ¤t.pos, shape_angle.y, &temp6); return TRUE; } /* 00009090-000093A8 .text __dt__11daNpc_Cb1_cFv */ daNpc_Cb1_c::~daNpc_Cb1_c() { dComIfG_resDelete(&mPhs, "Cb"); #if VERSION == VERSION_DEMO if(mpMorf) #else if(heap && mpMorf) #endif { mpMorf->stopZelAnime(); } if(l_HIO.mNo >= 0) { mDoHIO_deleteChild(l_HIO.mNo); l_HIO.mNo = -1; } offFlying(); offPlayerRoom(); #if VERSION == VERSION_DEMO mDoAud_cbPracticeStop(); #else musicStop(); #endif } /* 000093A8-000093C8 .text daNpc_Cb1_Create__FP10fopAc_ac_c */ static cPhs_State daNpc_Cb1_Create(fopAc_ac_c* i_this) { return ((daNpc_Cb1_c*)i_this)->create(); } /* 000093C8-000093F0 .text daNpc_Cb1_Delete__FP11daNpc_Cb1_c */ static BOOL daNpc_Cb1_Delete(daNpc_Cb1_c* i_this) { ((daNpc_Cb1_c*)i_this)->~daNpc_Cb1_c(); return TRUE; } /* 000093F0-00009410 .text daNpc_Cb1_Execute__FP11daNpc_Cb1_c */ static BOOL daNpc_Cb1_Execute(daNpc_Cb1_c* i_this) { return ((daNpc_Cb1_c*)i_this)->execute(); } /* 00009410-00009430 .text daNpc_Cb1_Draw__FP11daNpc_Cb1_c */ static BOOL daNpc_Cb1_Draw(daNpc_Cb1_c* i_this) { return ((daNpc_Cb1_c*)i_this)->draw(); } /* 00009430-00009438 .text daNpc_Cb1_IsDelete__FP11daNpc_Cb1_c */ static BOOL daNpc_Cb1_IsDelete(daNpc_Cb1_c*) { return TRUE; } static actor_method_class l_daNpc_Cb1_Method = { (process_method_func)daNpc_Cb1_Create, (process_method_func)daNpc_Cb1_Delete, (process_method_func)daNpc_Cb1_Execute, (process_method_func)daNpc_Cb1_IsDelete, (process_method_func)daNpc_Cb1_Draw, }; actor_process_profile_definition g_profile_NPC_CB1 = { /* LayerID */ fpcLy_CURRENT_e, /* ListID */ 0x0007, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_NPC_CB1, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daNpc_Cb1_c), /* SizeOther */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Priority */ PRIO_NPC_CB1, /* Actor SubMtd */ &l_daNpc_Cb1_Method, /* Status */ 0x07 | fopAcStts_SHOWMAP_e | fopAcStts_CULL_e | fopAcStts_FREEZE_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e | fopAcStts_UNK2000000_e, /* Group */ fopAc_NPC_e, /* CullType */ fopAc_CULLBOX_12_e, };