/** * d_a_do.cpp * Dog */ // Every function matches, but a Z2SoundObjSimple dtor is generated that should not exist #include "d/actor/d_a_do.h" #include "JSystem/JGeometry.h" #include "SSystem/SComponent/c_math.h" #include "m_Do/m_Do_controller_pad.h" #include "c/c_damagereaction.h" #include "d/d_com_inf_game.h" #include "d/actor/d_a_player.h" #include "d/d_a_item_static.h" #include "d/d_procname.h" #include "f_op/f_op_actor_mng.h" #include "d/actor/d_a_canoe.h" #include "d/actor/d_a_obj_food.h" /* 8066F278-8066F27C 000008 0001+03 3/3 0/0 0/0 .bss @1109 */ static u8 lit_1109[1 + 3 /* padding */]; /* 8066F27C-8066F280 00000C 0001+03 0/0 0/0 0/0 .bss @1107 */ #pragma push #pragma force_active on static u8 lit_1107[1 + 3 /* padding */]; #pragma pop /* 8066F280-8066F284 000010 0001+03 0/0 0/0 0/0 .bss @1105 */ #pragma push #pragma force_active on static u8 lit_1105[1 + 3 /* padding */]; #pragma pop /* 8066F284-8066F288 000014 0001+03 0/0 0/0 0/0 .bss @1104 */ #pragma push #pragma force_active on static u8 lit_1104[1 + 3 /* padding */]; #pragma pop /* 8066F288-8066F28C 000018 0001+03 0/0 0/0 0/0 .bss @1099 */ #pragma push #pragma force_active on static u8 lit_1099[1 + 3 /* padding */]; #pragma pop /* 8066F28C-8066F290 00001C 0001+03 0/0 0/0 0/0 .bss @1097 */ #pragma push #pragma force_active on static u8 lit_1097[1 + 3 /* padding */]; #pragma pop /* 8066F290-8066F294 000020 0001+03 0/0 0/0 0/0 .bss @1095 */ #pragma push #pragma force_active on static u8 lit_1095[1 + 3 /* padding */]; #pragma pop /* 8066F294-8066F298 000024 0001+03 0/0 0/0 0/0 .bss @1094 */ #pragma push #pragma force_active on static u8 lit_1094[1 + 3 /* padding */]; #pragma pop /* 8066F298-8066F29C 000028 0001+03 0/0 0/0 0/0 .bss @1057 */ #pragma push #pragma force_active on static u8 lit_1057[1 + 3 /* padding */]; #pragma pop /* 8066F29C-8066F2A0 00002C 0001+03 0/0 0/0 0/0 .bss @1055 */ #pragma push #pragma force_active on static u8 lit_1055[1 + 3 /* padding */]; #pragma pop /* 8066F2A0-8066F2A4 000030 0001+03 0/0 0/0 0/0 .bss @1053 */ #pragma push #pragma force_active on static u8 lit_1053[1 + 3 /* padding */]; #pragma pop /* 8066F2A4-8066F2A8 000034 0001+03 0/0 0/0 0/0 .bss @1052 */ #pragma push #pragma force_active on static u8 lit_1052[1 + 3 /* padding */]; #pragma pop /* 8066F2A8-8066F2AC 000038 0001+03 0/0 0/0 0/0 .bss @1014 */ #pragma push #pragma force_active on static u8 lit_1014[1 + 3 /* padding */]; #pragma pop /* 8066F2AC-8066F2B0 00003C 0001+03 0/0 0/0 0/0 .bss @1012 */ #pragma push #pragma force_active on static u8 lit_1012[1 + 3 /* padding */]; #pragma pop /* 8066F2B0-8066F2B4 000040 0001+03 0/0 0/0 0/0 .bss @1010 */ #pragma push #pragma force_active on static u8 lit_1010[1 + 3 /* padding */]; #pragma pop /* 8066F2B4-8066F2B8 -00001 0004+00 1/2 0/0 0/0 .bss None */ /* 8066F2B4 0001+01 data_8066F2B4 @1009 */ /* 8066F2B6 0002+00 data_8066F2B6 None */ static u8 data_8066F2B4; static bool noFallCheck; static bool hioInit; /* 8066F2C4-8066F2E4 000054 0020+00 11/12 0/0 0/0 .bss l_HIO */ static daDo_HIO_c l_HIO; /* 80667D4C-80667DA8 0000EC 005C+00 1/1 0/0 0/0 .text __ct__10daDo_HIO_cFv */ daDo_HIO_c::daDo_HIO_c() { field_0x04 = -1; mBaseSize = 1.0f; mWalkSpeed = 2.5f; mRunSpeed = 12.0f; mSwimSpeed = 2.0f; mPlayerRecognitionDist = 600.0f; mWaitType = 0; mSwimming = 1; mWaterHuntAnimType = 0; } /* 80667DA8-80667E68 000148 00C0+00 16/16 0/0 0/0 .text anm_init__FP8do_classifUcf */ static void anm_init(do_class* i_this, int i_resIdx, f32 i_morf, u8 i_mode, f32 i_speed) { if (!(i_this->field_0x608 > 1.0f)) { i_this->mpMorf->setAnm(static_cast(dComIfG_getObjectRes("Do", i_resIdx)), i_mode, i_morf, i_speed, 0.0f, -1.0f, 0); i_this->mAnmID = i_resIdx; } } /* 80667E68-80667FE4 000208 017C+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */ static int nodeCallBack(J3DJoint* i_jntP, int param_1) { if (param_1 == 0) { int joint_num = i_jntP->getJntNo(); J3DModel* model = j3dSys.getModel(); do_class* _this = (do_class*)model->getUserArea(); if (_this != NULL) { MTXCopy(model->getAnmMtx(joint_num), *calc_mtx); if (joint_num == 9 || joint_num == 10) { cMtx_YrotM(*calc_mtx, _this->mHeadAngle.y + _this->mHeadBob.y); cMtx_XrotM(*calc_mtx, _this->mHeadAngle.z + _this->mHeadBob.z); cMtx_ZrotM(*calc_mtx, _this->mHeadAngle.x); } else if (joint_num == 22) { cMtx_YrotM(*calc_mtx, _this->mTailAngle.y << 1); cMtx_ZrotM(*calc_mtx, _this->mTailAngle.x << 1); } else { cMtx_YrotM(*calc_mtx, _this->mTailAngle.y); cMtx_ZrotM(*calc_mtx, _this->mTailAngle.x); } model->setAnmMtx(joint_num, *calc_mtx); MTXCopy(*calc_mtx, j3dSys.mCurrentMtx); } } return 1; } /* 80667FE4-80668134 000384 0150+00 1/0 0/0 0/0 .text daDo_Draw__FP8do_class */ static int daDo_Draw(do_class* i_this) { if (i_this->mNoDraw != 0) { i_this->mNoDraw = 0; return 1; } if (daPy_py_c::linkGrabSubjectNoDraw(i_this)) { return 1; } J3DModel* model = i_this->mpMorf->getModel(); g_env_light.settingTevStruct(0, &i_this->current.pos, &i_this->tevStr); g_env_light.setLightTevColorType_MAJI(model, &i_this->tevStr); i_this->mpBtk->entry(model->getModelData()); i_this->mpBtp->entry(model->getModelData()); i_this->mpMorf->entryDL(); if (!fopAcM_checkCarryNow(i_this) && i_this->mAction != ACT_BOAT) { cXyz pos; pos.set(i_this->current.pos.x, i_this->current.pos.y + 100.0f, i_this->current.pos.z); i_this->mShadowKey = dComIfGd_setShadow(i_this->mShadowKey, 1, model, &pos, 400.0f, 0.0f, i_this->current.pos.y, i_this->mBgS_Acch.GetGroundH(), i_this->mBgS_Acch.m_gnd, &i_this->tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } return 1; } /* 80668170-80668264 000510 00F4+00 1/1 0/0 0/0 .text * daDo_other_bg_check__FP8do_classP10fopAc_ac_c */ static BOOL daDo_other_bg_check(do_class* i_this, fopAc_ac_c* i_actor) { fopAc_ac_c* _this = static_cast(i_this); cXyz dog_pos; cXyz actor_pos; dBgS_LinChk lin_chk; if (i_actor != NULL) { actor_pos = i_actor->current.pos; actor_pos.y += 50.0f; dog_pos = _this->current.pos; dog_pos.y = _this->eyePos.y; lin_chk.Set(&dog_pos, &actor_pos, _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { return true; } else { return false; } } else { return true; } } /* 80668264-8066833C 000604 00D8+00 1/1 0/0 0/0 .text daDo_other_bg_check2__FP8do_classP4cXyz */ static BOOL daDo_other_bg_check2(do_class* i_this, cXyz* i_pos) { fopAc_ac_c* _this = static_cast(i_this); cXyz dog_pos; cXyz pos; dBgS_LinChk lin_chk; pos = *i_pos; pos.y += 30.0f; dog_pos = _this->current.pos; dog_pos.y += 30.0f; lin_chk.Set(&dog_pos, &pos, _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { return true; } else { return false; } } /* 8066F2E4-8066F2F8 000074 0014+00 1/2 0/0 0/0 .bss target_info */ static fopAc_ac_c* target_info[5]; /* 8066F2F8-8066F2FC 000088 0004+00 1/2 0/0 0/0 .bss target_info_count */ static int target_info_count; /* 8066F2FC-8066F310 00008C 0014+00 0/1 0/0 0/0 .bss target_bgc */ static BOOL target_bgc[5]; /* 8066833C-806683C0 0006DC 0084+00 1/1 0/0 0/0 .text s_w_sub__FPvPv */ static void* s_w_sub(void* i_proc, void* i_this) { if (fopAcM_IsActor(i_proc) && (fopAcM_GetName(i_proc) == PROC_OBJ_FOOD || fopAcM_GetName(i_proc) == PROC_OBJ_KANBAN2) && fopAcM_checkCarryNow(static_cast(i_proc)) && target_info_count < 5) { target_info[target_info_count] = static_cast(i_proc); target_info_count++; } return NULL; } /* 806683C0-8066858C 000760 01CC+00 1/1 0/0 0/0 .text search_food__FP8do_class */ static u32 search_food(do_class* i_this) { target_info_count = 0; for (int i = 0; i < 5; i++) { target_info[i] = NULL; target_bgc[i] = false; } fpcM_Search(s_w_sub, i_this); f32 pos_check = 200.0f; if (target_info_count != 0) { fopAc_ac_c* actor; int i = 0; while (i < target_info_count) { actor = target_info[i]; cXyz delta; delta.x = actor->current.pos.x - i_this->eyePos.x; delta.y = actor->current.pos.y + 50.0f - i_this->eyePos.y; delta.z = actor->current.pos.z - i_this->eyePos.z; f32 dist_xz = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z); if (dist_xz < pos_check) { if (target_bgc[i] || daDo_other_bg_check(i_this, actor)) { target_bgc[i] = true; } else { return fopAcM_GetID(actor); } } i++; if (i == target_info_count) { i = 0; pos_check += 100.0f; if (pos_check > i_this->mScale.z * 240.0f) { return -1; } } } } else { return -1; } return -1; } /* 8066858C-806685EC 00092C 0060+00 1/1 0/0 0/0 .text food_check__FP8do_class */ static void food_check(do_class* i_this) { i_this->mFoodActorID = search_food(i_this); if (fopAcM_SearchByID(i_this->mFoodActorID)) { i_this->mAction = ACT_FOOD; i_this->mMode = 0; } } /* 806685EC-80668624 00098C 0038+00 1/1 0/0 0/0 .text do_carry_check__FP8do_class */ static BOOL do_carry_check(do_class* i_this) { if (i_this->mAction != ACT_CARRY && fopAcM_checkCarryNow(i_this)) { i_this->mAction = ACT_CARRY; i_this->mMode = 0; return true; } return false; } /* 80668624-80668754 0009C4 0130+00 1/1 0/0 0/0 .text depth_check__FP8do_class4cXyzf */ static BOOL depth_check(do_class* i_this, cXyz i_pos, f32 param_2) { dBgS_GndChk gnd_chk; Vec pos; f32 f_gnd_chk; f32 f_gnd_chk_spl; pos.x = i_pos.x; pos.y = i_pos.y + 200.0f; pos.z = i_pos.z; gnd_chk.SetPos(&pos); f_gnd_chk = dComIfG_Bgsp().GroundCross(&gnd_chk); dBgS_ObjGndChk_Spl gnd_chk_spl; gnd_chk_spl.SetPos(&pos); f_gnd_chk_spl = dComIfG_Bgsp().GroundCross(&gnd_chk_spl); if (f_gnd_chk_spl - f_gnd_chk > 2.0f * param_2 * 0.8f * i_this->mScale.z) { return 1; } else { return 0; } } /* 80668754-8066886C 000AF4 0118+00 1/1 0/0 0/0 .text water_check__FP8do_class */ static bool water_check(do_class* i_this) { dBgS_GndChk gnd_chk; Vec pos; pos = i_this->current.pos; pos.y += 200.0f; gnd_chk.SetPos(&pos); f32 f_gnd_chk = dComIfG_Bgsp().GroundCross(&gnd_chk); dBgS_ObjGndChk_Spl gnd_chk_spl; gnd_chk_spl.SetPos(&pos); i_this->mWaterY = dComIfG_Bgsp().GroundCross(&gnd_chk_spl); if (i_this->mWaterY - f_gnd_chk > 8.0f * i_this->mScale.z) { return true; } else { return false; } } /* 8066886C-80668A30 000C0C 01C4+00 4/4 0/0 0/0 .text dansa_check__FP8do_class4cXyzf */ static int dansa_check(do_class* i_this, cXyz i_pos, f32 param_2) { fopAc_ac_c* _this = static_cast(i_this); i_pos.y += 25.0f; dBgS_GndChk gnd_chk; Vec pos; pos.x = i_pos.x; pos.y = i_pos.y + 25.0f; pos.z = i_pos.z; gnd_chk.SetPos(&pos); f32 f_gnd_chk = dComIfG_Bgsp().GroundCross(&gnd_chk); if (i_this->current.pos.y - f_gnd_chk > param_2) { return 1; } else { dBgS_LinChk lin_chk; cXyz pos2; pos2 = _this->current.pos; pos2.y += 60.0f; lin_chk.Set(&pos2, &i_pos, _this); if (dComIfG_Bgsp().LineCross(&lin_chk) != 0) { return -1; } else if (depth_check(i_this, i_pos, 5.0f) && l_HIO.mSwimming == 0) { return -100; } else { return 0; } } } /* 80668A30-80668B18 000DD0 00E8+00 3/3 0/0 0/0 .text dansa_check2__FP8do_classf */ static BOOL dansa_check2(do_class* i_this, f32 param_1) { cXyz pos, pos2; cMtx_YrotS(*calc_mtx, i_this->current.angle.y); pos.x = 0.0f; pos.y = 70.0f; pos.z = 0.8f * param_1 * i_this->mScale.z + 0.8f * i_this->speedF * i_this->mScale.z * 9.0f; MtxPosition(&pos, &pos2); pos2 += i_this->current.pos; return dansa_check(i_this, pos2, 100.0f) != 0 ? TRUE : FALSE; } /* 80668B18-80668BA0 000EB8 0088+00 4/4 0/0 0/0 .text move_dansa_check__FP8do_classf */ static BOOL move_dansa_check(do_class* i_this, f32 i_speed) { if (dansa_check2(i_this, 130.0f)) { i_this->mAction = ACT_WAIT_1; if (i_speed > 15.0f) { i_this->mMode = 10; } else { i_this->mMode = 0; } return true; } else { return false; } } /* 80668BA0-80668D5C 000F40 01BC+00 5/5 0/0 0/0 .text area_check__FP8do_class */ static void area_check(do_class* i_this) { cXyz pos_delta = i_this->home.pos - i_this->current.pos; if (i_this->mParam2 != 0xff) { if (pos_delta.abs() > i_this->mParam2 * 100.0f * 2.0f) { i_this->mAction = ACT_WALK; i_this->mMode = -1; i_this->mTimer[2] = cM_rndF(100.0f) + 100.0f; } } } /* 80668D5C-80669050 0010FC 02F4+00 2/1 0/0 0/0 .text do_stay__FP8do_class */ static void do_stay(do_class* i_this) { switch (i_this->mMode) { case 0: if (i_this->mParam0 == 0) { anm_init(i_this, ANM_DOWN_WT, 15.0f, 2, 1.0f); i_this->mMode++; i_this->mTimer[0] = 10; } else { i_this->mAction = ACT_WALK; i_this->mMode = 0; return; } // fallthrough case 1: if (i_this->mTimer[0] == 0 && i_this->mDistFromPlayer < l_HIO.mPlayerRecognitionDist) { i_this->mMode++; i_this->mTimer[0] = cM_rndF(50.0f) + 20.0f; } break; case 2: i_this->field_0x616 = 1; i_this->mHeadTilt = -6300; i_this->mTailWagTarget = 1000.0f; if (i_this->mTimer[0] == 0) { anm_init(i_this, ANM_DOWN, 5.0f, 0, 1.0f); i_this->mMode++; } break; case 3: i_this->field_0x616 = 1; i_this->mTailWagTarget = 2000.0f; if (i_this->mpMorf->isStop()) { i_this->mAction = ACT_WALK_RUN; i_this->mMode = 0; } break; case 10: anm_init(i_this, ANM_DOWN_WT, 15.0f, 2, 1.0f); i_this->mMode++; // fallthrough case 11: i_this->field_0x616 = 1; i_this->mHeadTilt = -6300; i_this->mTailWagTarget = 1000.0f; if (i_this->field_0x658 > 30.0f) { i_this->mMode++; i_this->mTimer[0] = cM_rndF(10.0f) + 10.0f; } if (i_this->mDistFromPlayer > 100.0f + l_HIO.mPlayerRecognitionDist) { i_this->field_0x5f4 = 0; i_this->mMode = 0; } break; case 12: i_this->field_0x616 = 1; i_this->mHeadTilt = -6300; i_this->mTailWagTarget = 1500.0f; if (i_this->field_0x658 > 30.0f) { if (i_this->mTimer[0] == 0) { anm_init(i_this, ANM_DOWN, 3.0f, 0, 1.0f); i_this->mMode = 13; } } else { i_this->mMode = 11; } break; case 13: i_this->field_0x616 = 1; i_this->mTailWagTarget = 1500.0f; if (i_this->mpMorf->isStop()) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } break; } cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f); } /* 80669050-8066973C 0013F0 06EC+00 2/1 0/0 0/0 .text do_walk__FP8do_class */ static void do_walk(do_class* i_this) { cXyz local_5c; s16 angle_diff; i_this->mTailWagTarget = 1000.0f; switch (i_this->mMode) { case -1: i_this->mTargetPos = i_this->home.pos; if (i_this->speedF >= l_HIO.mRunSpeed) { i_this->mAnmSpeed = 4.0f; } else { i_this->mAnmSpeed = 1.7f; } i_this->mTargetAnmSpeed = 1.7f; anm_init(i_this, ANM_WALK, 3.0f, 2, i_this->mAnmSpeed); i_this->mMode = 3; break; case 0: if (i_this->field_0x5f4 == 8) { anm_init(i_this, ANM_SIT, 5.0f, 0, 1.0f); } else { anm_init(i_this, ANM_DOWN, 5.0f, 0, 1.0f); } i_this->mMode++; break; case 1: if (i_this->mpMorf->isStop()) { i_this->mMode++; } break; case 2: local_5c.x = 0.0f; local_5c.y = 20.0f; for (int i = 0; i < 100; i++) { cMtx_YrotS(*calc_mtx, cM_rndF(65536.0f)); local_5c.z = cM_rndF(100.0f * i_this->mParam2); MtxPosition(&local_5c, &i_this->mTargetPos); i_this->mTargetPos += i_this->home.pos; if (dansa_check(i_this, i_this->mTargetPos, 100.0f) == 0) { local_5c = i_this->mTargetPos - i_this->current.pos; if (local_5c.abs() > 300.0f) break; } } i_this->mAnmSpeed = i_this->mTargetAnmSpeed = 1.3f + cM_rndF(0.6f); anm_init(i_this, ANM_WALK, 5.0f, 2, i_this->mAnmSpeed); i_this->mMode++; case 3: local_5c = i_this->mTargetPos - i_this->current.pos; cLib_addCalcAngleS2(&i_this->current.angle.y, (s16)cM_atan2s(local_5c.x, local_5c.z), 0x10, 0x100); cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mWalkSpeed, 1.0f, l_HIO.mWalkSpeed * 0.2f); if (local_5c.abs() < 150.0f) { if (i_this->mParam0 == 0) { i_this->mAction = ACT_STAY; i_this->mMode = 0; } else { anm_init(i_this, ANM_WAIT, 5.0f, 2, 1.0f); i_this->mTimer[0] = cM_rndF(50.0f) + 20.0f; i_this->mTargetAnmSpeed = 1.0f; i_this->mMode++; } } break; case 4: cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f); if (i_this->mTimer[0] == 0) { i_this->mMode = 2; } break; case 10: cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 4, 0x400); i_this->field_0x616 = 1; i_this->mTailWagTarget = 2000.0f; angle_diff = i_this->current.angle.y - i_this->mTargetAngleY; if (angle_diff < 0) { angle_diff *= -1; } if (angle_diff < 0x800) { i_this->mMode++; anm_init(i_this, ANM_WAIT, 5.0f, 2, 1.0f); i_this->mTargetAnmSpeed = 1.0f; i_this->mTimer[0] = cM_rndF(10.0f) + 10.0f; } break; case 11: i_this->field_0x616 = 1; i_this->mTailWagTarget = 3000.0f; if (i_this->mTimer[0] == 0) { i_this->mAction = ACT_WALK_RUN; i_this->mMode = 0; return; } break; } cLib_addCalc2(&i_this->mAnmSpeed, i_this->mTargetAnmSpeed, 1.0f, 0.05f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); if (i_this->mTimer[2] == 0 && i_this->mMode < 10 && i_this->mDistFromPlayer < l_HIO.mPlayerRecognitionDist) { anm_init(i_this, ANM_STEP_2, 2.0f, 2, 3.0f); i_this->mMode = 10; } move_dansa_check(i_this, i_this->speedF); } /* 8066973C-806698D0 001ADC 0194+00 1/1 0/0 0/0 .text do_walk_run__FP8do_class */ static void do_walk_run(do_class* i_this) { i_this->field_0x616 = 1; i_this->mTailWagTarget = 3000.0f; switch (i_this->mMode) { case 0: i_this->mAnmSpeed = 0.25f; anm_init(i_this, 22, 10.0f, 2, i_this->mAnmSpeed); i_this->mMode++; // fallthrough case 1: cLib_addCalc2(&i_this->mAnmSpeed, 2.0f, 1.0f, 0.05f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); if (i_this->mAnmSpeed >= 2.0f) { i_this->mAction = ACT_RUN; i_this->mMode = 0; i_this->mSound.startSound(Z2SE_DOG_BARK, 0, -1); } // fallthrough default: cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mWalkSpeed, 1.0f, 0.2f * l_HIO.mWalkSpeed); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 8, 0x400); if (i_this->mDistFromPlayer < 160.0f * i_this->mScale.z) { if (l_HIO.mWaitType != 0) { i_this->mAction = ACT_WAIT_2; } else { i_this->mAction = ACT_WAIT_1; } i_this->mMode = 0; } area_check(i_this); move_dansa_check(i_this, i_this->speedF); break; } } /* 806698D0-80669A1C 001C70 014C+00 1/1 0/0 0/0 .text do_run__FP8do_class */ static void do_run(do_class* i_this) { i_this->field_0x616 = 1; i_this->mTailWagTarget = 4000.0f; switch (i_this->mMode) { case 0: i_this->mAnmSpeed = 1.0f; i_this->mTargetAnmSpeed = cM_rndF(0.1f) + 1.5f; anm_init(i_this, 14, 2.0f, 2, 1.2f * i_this->mAnmSpeed); i_this->mMode++; // fallthrough case 1: cLib_addCalc2(&i_this->mAnmSpeed, i_this->mTargetAnmSpeed, 1.0f, 0.02f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); if (i_this->mDistFromPlayer < 320.0f * i_this->mScale.z) { i_this->mAction = ACT_RUN_WALK; i_this->mMode = 0; } // fallthrough default: cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mRunSpeed * 1.4f, 1.0f, 0.2f * l_HIO.mRunSpeed); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 8, 0x800); area_check(i_this); move_dansa_check(i_this, i_this->speedF); break; } } /* 80669A1C-80669B80 001DBC 0164+00 1/1 0/0 0/0 .text do_run_walk__FP8do_class */ static void do_run_walk(do_class* i_this) { i_this->field_0x616 = 1; i_this->mTailWagTarget = 3000.0f; switch (i_this->mMode) { case 0: i_this->mAnmSpeed = 4.0f; anm_init(i_this, 22, 3.0f, 2, i_this->mAnmSpeed); i_this->mMode++; // fallthrough case 1: cLib_addCalc2(&i_this->mAnmSpeed, 1.5f, 1.0f, 0.05f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); // fallthrough default: cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mWalkSpeed, 1.0f, 5.0f); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 8, 0x400); if (i_this->mDistFromPlayer < 160.0f * i_this->mScale.z) { if (l_HIO.mWaitType != 0) { i_this->mAction = ACT_WAIT_2; } else { i_this->mAction = ACT_WAIT_1; } i_this->mMode = 0; } else { if (i_this->mDistFromPlayer > 360.0f * i_this->mScale.z) { i_this->mAction = ACT_RUN; i_this->mMode = 0; } } area_check(i_this); move_dansa_check(i_this, i_this->speedF); } } /* 80669B80-8066A1C4 001F20 0644+00 2/1 0/0 0/0 .text do_wait_1__FP8do_class */ static void do_wait_1(do_class* i_this) { fopAc_ac_c* player = dComIfGp_getPlayer(0); i_this->field_0x616 = 1; i_this->mTailWagTarget = 2000.0f; s16 angle_diff = i_this->current.angle.y - i_this->mTargetAngleY; if (angle_diff < 0) { angle_diff *= -1; } s16 angle_check = 0x3000; if ((i_this->mCounter & 0x7fU) == 0) { angle_check = 0x1000; } switch (i_this->mMode) { case 0: if (i_this->mDistFromPlayer > i_this->mScale.z * 320.0f) { anm_init(i_this, ANM_JOYFUL, 5.0f, 2, cM_rndFX(0.1f) + 0.6f); i_this->mMode = -1; } else { anm_init(i_this, ANM_WAIT, 10.0f, 2, 1.0f); i_this->mMode++; } // fallthrough case -1: case 1: case1: if (angle_diff > angle_check) { anm_init(i_this, ANM_STEP_2, 2.0f, 2, 3.0f); i_this->mMode = 2; } else if (i_this->field_0x658 < 75.0f) { i_this->mMode = 3; i_this->mTimer[0] = cM_rndF(10.0f) + 10.0f; } else { if (i_this->mDistFromPlayer < i_this->mScale.z * 96.0f) { cXyz local_68; local_68.x = 0.0f; local_68.y = 20.0f; for (int i = 0; i < 20; i++) { if (i < 10) { cMtx_YrotS(*calc_mtx, i_this->mTargetAngleY + (s16)cM_rndFX(5000.0f)); } else { cMtx_YrotS(*calc_mtx, cM_rndF(65536.0f)); } local_68.z = -176.0f * i_this->mScale.z; MtxPosition(&local_68, &i_this->mTargetPos); i_this->mTargetPos += player->current.pos; if (cM_rndF(1.0f) < 0.2f) break; if (dansa_check(i_this, i_this->mTargetPos, 100.0f) == 0) break; i_this->mLookPos = i_this->mTargetPos; i_this->mLookTimer = 20.0f + cM_rndF(10.0f); } i_this->mMode = 5; i_this->mRandomTargetAngleY = cM_rndFX(10000.0f); anm_init(i_this, ANM_WALK, 2.0f, 2, -3.0f); i_this->mTimer[0] = cM_rndF(10.0f) + 15.0f; } else { if (i_this->mMode != 6 && i_this->mDistFromPlayer < i_this->mScale.z * 120.0f) { anm_init(i_this, ANM_JOYFUL, 3.0f, 2, cM_rndFX(0.1f) + 1.0f); i_this->mMode = 6; } } } break; case 2: cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 4, 0x400); if (angle_diff < 0x800) { i_this->mMode = 0; } break; case 3: if (i_this->field_0x658 < 75.0f) { if (i_this->mTimer[0] == 0) { if (i_this->field_0x658 < 30.0f) { i_this->mAction = ACT_STAY; i_this->mMode = 10; } else { i_this->mAction = ACT_SIT; i_this->mMode = 0; } } } else { i_this->mMode = 1; } break; case 5: cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY + i_this->mRandomAngleY, 4, 0x800); cLib_addCalcAngleS2(&i_this->mRandomAngleY, i_this->mRandomTargetAngleY, 4, 0x1000); cLib_addCalc2(&i_this->current.pos.x, i_this->mTargetPos.x, 0.2f, 3.5f); cLib_addCalc2(&i_this->current.pos.z, i_this->mTargetPos.z, 0.2f, 3.5f); if (i_this->mTimer[0] == 0) { i_this->mMode = 0; } break; case 6: i_this->mTailWagTarget = 4000.0f; if (i_this->mDistFromPlayer > i_this->mScale.z * 176.0f) { i_this->mMode = 0; } goto case1; case 10: i_this->mAnmSpeed = 5.0f; anm_init(i_this, ANM_WALK, 2.0f, 2, i_this->mAnmSpeed); i_this->mMode++; // fallthrough case 11: cLib_addCalc2(&i_this->mAnmSpeed, 2.0f, 1.0f, 0.2f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); if (i_this->mAnmSpeed <= 2.2f) { i_this->mMode = 0; } break; } cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f); if (i_this->mDistFromPlayer > i_this->mScale.z * 240.0f && !dansa_check2(i_this, 130.0f) && i_this->mMode < 10) { i_this->mAction = ACT_WALK_RUN; i_this->mAnmSpeed = 1.5f; anm_init(i_this, ANM_WALK, 5.0f, 2, i_this->mAnmSpeed); i_this->mMode = 1; } if (daPy_getLinkPlayerActorClass()->checkCanoeRide() && i_this->mDistFromPlayer < 1000.0f) { i_this->mAction = ACT_HELP; i_this->mMode = 0; } if (i_this->mParam0 == 2) { f32 distance = i_this->mDistFromPlayer * 0.0215f; if (distance > 127.0f) { distance = 127.0f; } i_this->mSound.startLevelSound(Z2SE_DOG_V_CALL_HELP, (u8)distance, -1); } } /* 8066A1C4-8066A3D0 002564 020C+00 1/1 0/0 0/0 .text do_wait_2__FP8do_class */ static void do_wait_2(do_class* i_this) { fopAc_ac_c* player = dComIfGp_getPlayer(0); i_this->field_0x616 = 1; i_this->mTailWagTarget = 4000.0f; switch (i_this->mMode) { case 0: i_this->mMode++; // fallthrough case 1: if (i_this->mTimer[0] == 0) { i_this->mTimer[0] = cM_rndF(20.0f) + 10.0f; i_this->mRandomTargetAngleY = cM_rndFX(15000.0f); if (cM_rndF(1.0f) < 0.5f) { i_this->mAnmSpeed = cM_rndF(0.2f) + 2.0f; } else { i_this->mAnmSpeed = -(cM_rndF(0.2f) + 2.0f); } anm_init(i_this, ANM_STEP, 3.0f, 2, i_this->mAnmSpeed); cMtx_YrotS(*calc_mtx, player->shape_angle.y); cXyz local_38; local_38.x = cM_rndFX(100.0f); local_38.y = 0.0f; local_38.z = cM_rndF(50.0f) + 120.0f; MtxPosition(&local_38, &i_this->mTargetPos); i_this->mTargetPos += player->current.pos; } break; } cLib_addCalc2(&i_this->current.pos.x, i_this->mTargetPos.x, 0.2f, 2.0f); cLib_addCalc2(&i_this->current.pos.z, i_this->mTargetPos.z, 0.2f, 2.0f); cLib_addCalc0(&i_this->speedF, 1.0f, 2.0f); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY + i_this->mRandomAngleY, 4, 0x800); cLib_addCalcAngleS2(&i_this->mRandomAngleY, i_this->mRandomTargetAngleY, 4, 0x1000); if (i_this->mDistFromPlayer > 240.0f * i_this->mScale.z) { i_this->mAction = ACT_RUN; i_this->mMode = 0; } area_check(i_this); } /* 8066A3D0-8066A5DC 002770 020C+00 1/1 0/0 0/0 .text do_sit__FP8do_class */ static void do_sit(do_class* i_this) { i_this->field_0x616 = 1; i_this->mTailWagTarget = 1000.0f; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_SIT_WAIT, 10.0f, 2, 1.0f); i_this->mMode++; // fallthrough case 1: if (i_this->field_0x658 > 75.0f) { i_this->mMode = 3; i_this->mTimer[0] = cM_rndF(10.0f) + 10.0f; } else { if (i_this->field_0x658 < 30.0f) { i_this->mMode = 2; i_this->mTimer[0] = cM_rndF(10.0f) + 10.0f; } } break; case 2: if (i_this->field_0x658 < 30.0f) { if (i_this->mTimer[0] == 0) { i_this->mAction = ACT_STAY; i_this->mMode = 10; } } else { i_this->mMode = 1; } break; case 3: if (i_this->field_0x658 > 75.0f) { if (i_this->mTimer[0] == 0) { anm_init(i_this, ANM_SIT, 3.0f, 0, 1.0f); i_this->mMode++; } } else { i_this->mMode = 1; } break; case 4: if (i_this->mpMorf->isStop()) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } break; } cLib_addCalc0(&i_this->speedF, 1.0f, 2.0f); if (i_this->mDistFromPlayer > 400.0f * i_this->mScale.z) { i_this->mAction = ACT_STAY; i_this->field_0x5f4 = 8; i_this->mMode = 0; } area_check(i_this); } /* 8066A5DC-8066A80C 00297C 0230+00 1/1 0/0 0/0 .text hang_set__FP8do_class */ static s16 hang_set(do_class* i_this) { fopAc_ac_c* _this = static_cast(i_this); dBgS_LinChk lin_chk; cXyz vec1, vec2, vec3[2]; vec1 = _this->old.pos - _this->current.pos; cMtx_YrotS(*calc_mtx, cM_atan2s(vec1.x, vec1.z)); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = -100.0f; MtxPosition(&vec1, &vec2); vec2 += _this->current.pos; vec2.y = _this->old.pos.y - 5.0f; vec1.x = 10.0f; vec1.y = 0.0f; vec1.z = 250.0f; for (int i = 0; i < 2; i++) { MtxPosition(&vec1, &vec3[i]); vec1.x *= -1.0f; vec3[i] += vec2; lin_chk.Set(&vec2, &vec3[i], _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { vec3[i] = lin_chk.GetCross(); } else { return 0xDCF; } } i_this->mHangPos = vec3[0] + (vec3[1] - vec3[0]) * 0.5f; i_this->mHangPos.y = _this->old.pos.y; vec1 = vec3[1] - vec3[0]; return cM_atan2s(vec1.x, vec1.z) + 0x4000; } /* 8066A80C-8066AB78 002BAC 036C+00 1/1 0/0 0/0 .text do_hang__FP8do_class */ static void do_hang(do_class* i_this) { i_this->mTailWagTarget = 3000.0f; i_this->field_0x616 = 2; cXyz vec1, vec2; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_CLIFF_WT, 3.0f, 2, 1.0f); i_this->mMode++; i_this->speedF = 0.0f; i_this->mHangSpeed = 0.0f; i_this->mTimer[0] = cM_rndF(30.0f) + 30.0f; // fallthrough case 1: cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mHangAngleY, 1, 0x1000); if (i_this->mTimer[0] == 0) { if (cM_rndF(1.0f) < 0.5f) { i_this->speed.y = 0.0f; i_this->mMode = 5; i_this->mTimer[0] = 3; anm_init(i_this, ANM_RUN, 5.0f, 2, 3.0f); } else { anm_init(i_this, ANM_CLIFF, 2.0f, 0, 1.0f); i_this->mMode = 2; } } cMtx_YrotS(*calc_mtx, i_this->mHangAngleY); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = i_this->mScale.z * 28.0f; MtxPosition(&vec1, &vec2); cLib_addCalc2(&i_this->current.pos.x, i_this->mHangPos.x + vec2.x, 1.0f, i_this->mHangSpeed); cLib_addCalc2(&i_this->current.pos.y, i_this->mHangPos.y + vec2.y, 1.0f, i_this->mHangSpeed); cLib_addCalc2(&i_this->current.pos.z, i_this->mHangPos.z + vec2.z, 1.0f, i_this->mHangSpeed); cLib_addCalc2(&i_this->mHangSpeed, 100.0f, 1.0f, 20.0f); break; case 2: if (i_this->mpMorf->isStop()) { i_this->mAction = ACT_STAY; i_this->mMode = 13; } break; case 5: cMtx_YrotS(*calc_mtx, i_this->mHangAngleY); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = i_this->mScale.z * -60.0f; MtxPosition(&vec1, &vec2); cLib_addCalc2(&i_this->current.pos.x, i_this->mHangPos.x + vec2.x, 1.0f, 15.0f); cLib_addCalc2(&i_this->current.pos.z, i_this->mHangPos.z + vec2.z, 1.0f, 15.0f); i_this->current.pos.y += i_this->speed.y; i_this->speed.y += i_this->gravity; if (i_this->mTimer[0] == 0) { i_this->mBgS_Acch.CrrPos(dComIfG_Bgsp()); if (i_this->mBgS_Acch.ChkGroundHit()) { i_this->current.angle.x = 0; anm_init(i_this, ANM_DOWN, 2.0f, 0, 2.0f); i_this->mMode = 6; } } break; case 6: if (i_this->mpMorf->isStop()) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } break; } } /* 8066AB78-8066B650 002F18 0AD8+00 2/1 0/0 0/0 .text do_food__FP8do_class */ static void do_food(do_class* i_this) { fopAc_ac_c* food = fopAcM_SearchByID(i_this->mFoodActorID); fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz vec; s16 angle_step; BOOL end = false; if (food == NULL) { end = true; } if (i_this->mBgS_Acch.ChkWallHit()) { i_this->mFoodEndTimer += 2; if (i_this->mFoodEndTimer >= 60) { end = true; } } else if (i_this->mFoodEndTimer != 0) { i_this->mFoodEndTimer--; } if (end) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; return; } i_this->mTailWagTarget = 4000.0f; switch (i_this->mMode) { case 0: i_this->mMode++; i_this->mTimer[1] = cM_rndF(10.0f) + 10.0f; i_this->mTimer[0] = 0; // fallthrough case 1: i_this->speedF = 0.0f; if (i_this->mTimer[1] == 0) { if (i_this->mTimer[0] == 0) { if (cM_rndF(1.0f) < 0.5f) { anm_init(i_this, ANM_JOYFUL, 3.0f, 2, 1.0f + cM_rndFX(0.1f)); i_this->mMode = 2; i_this->mTimer[0] = cM_rndF(20.0f) + 10.0f; } else { i_this->mTimer[0] = cM_rndF(20.0f) + 10.0f; i_this->mRandomTargetAngleY = cM_rndFX(15000.0f); i_this->mAnmSpeed = cM_rndF(0.2f) + 2.0f; anm_init(i_this, ANM_STEP, 3.0f, 2, i_this->mAnmSpeed); cMtx_YrotS(*calc_mtx, player->shape_angle.y); vec.x = cM_rndFX(100.0f); vec.y = 0.0f; vec.z = cM_rndF(50.0f) + 120.0f; MtxPosition(&vec, &i_this->mTargetPos); i_this->mTargetPos += player->current.pos; } } cLib_addCalc2(&i_this->current.pos.x, i_this->mTargetPos.x, 0.2f, 1.5f); cLib_addCalc2(&i_this->current.pos.z, i_this->mTargetPos.z, 0.2f, 1.5f); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY + i_this->mRandomAngleY, 4, 0x800); cLib_addCalcAngleS2(&i_this->mRandomAngleY, i_this->mRandomTargetAngleY, 4, 0x1000); } case1and2: i_this->field_0x616 = 1; if (fopAcM_CheckFoodStatus(food, fopAcM_FOOD_1)) { i_this->mMode = 10; i_this->mTimer[0] = cM_rndF(20.0f); i_this->mTimer[2] = cM_rndF(50.0f) + 70.0f; } else if (fopAcM_CheckFoodStatus(food, fopAcM_FOOD_0)) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } else if (i_this->mDistFromPlayer > 240.0f * i_this->mScale.z) { i_this->mAction = ACT_RUN; i_this->mMode = 0; } break; case 2: if (i_this->mTimer[0] == 0) { i_this->mMode = 1; } goto case1and2; case 10: if (i_this->mTimer[0] == 0) { i_this->mAnmSpeed = 1.0f; i_this->mTargetAnmSpeed = cM_rndF(0.1f) + 1.5f; anm_init(i_this, ANM_RUN, 2.0f, 2, 1.2f * i_this->mAnmSpeed); i_this->mMode++; } else { i_this->mLookPos = food->current.pos; i_this->mLookTimer = 10; break; } // fallthrough case 11: i_this->mLookPos = food->current.pos; i_this->mLookTimer = 10; cLib_addCalc2(&i_this->mAnmSpeed, i_this->mTargetAnmSpeed, 1.0f, 0.02f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mRunSpeed, 1.0f, 0.2f * l_HIO.mRunSpeed); vec = food->current.pos - i_this->current.pos; angle_step = 0x1000; if (vec.abs() < 120.0f * i_this->mScale.z) { angle_step = 0x2000; cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mRunSpeed * 0.75f, 1.0f, 0.2f * l_HIO.mRunSpeed * 1.5f); } cLib_addCalcAngleS2(&i_this->current.angle.y, cM_atan2s(vec.x, vec.z), 8, angle_step); if (fopAcM_CheckFoodStatus(food, fopAcM_FOOD_2) || fopAcM_CheckFoodStatus(food, fopAcM_FOOD_3) || fopAcM_CheckFoodStatus(food, fopAcM_FOOD_4)) { i_this->mMode = 25; i_this->mTimer[0] = cM_rndF(20.0f) + 5.0f; } else if (vec.abs() < 50.0f * i_this->mScale.z) { bool get_item = false; if (i_this->mDistFromPlayer > 400.0f && !strcmp(dComIfGp_getStartStageName(), "F_SP116")) { if (fopAcM_GetRoomNo(i_this) == 4) { if (i_this->current.pos.z < -1050.f) { get_item = true; } } else if (fopAcM_GetRoomNo(i_this) == 2) { vec.x = -4314.0f - i_this->current.pos.x; vec.z = 728.0f - i_this->current.pos.z; if (JMAFastSqrt(vec.x * vec.x + vec.z * vec.z) < 300.0f) { get_item = true; } } } if (get_item) { int item_no; if (dComIfGs_getLife() <= 4) { item_no = fpcNm_ITEM_HEART; } else { int rnd = cM_rndF(11.0f); if (rnd <= 5) { item_no = fpcNm_ITEM_HEART; } else if (rnd <= 9) { item_no = fpcNm_ITEM_GREEN_RUPEE; } else { item_no = fpcNm_ITEM_BLUE_RUPEE; } } i_this->mItemActorID = fopAcM_createItem(&i_this->eyePos, item_no, -1, -1, NULL, NULL, 0); i_this->mMode = 25; i_this->mTimer[0] = cM_rndF(10.0f) + 5.0f; } else { i_this->mMode = 20; i_this->mFoodInMouth = 1; i_this->mAnmSpeed = 4.0f; anm_init(i_this, ANM_JOYFUL, 3.0f, 2, 0.3f); } } break; case 20: i_this->mLookPos = player->current.pos; i_this->mLookTimer = 10; cLib_addCalc2(&i_this->mAnmSpeed, 1.5f, 1.0f, 0.2f); cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mWalkSpeed, 1.0f, 5.0f); if (i_this->mAnmSpeed <= 1.6f) { i_this->mTargetAnmSpeed = cM_rndF(0.1f) + 1.5f; anm_init(i_this, ANM_RUN, 2.0f, 2, 1.2f * i_this->mAnmSpeed); i_this->mMode++; } i_this->mFoodInMouth = 1; break; case 21: i_this->field_0x616 = 1; cLib_addCalc2(&i_this->mAnmSpeed, i_this->mTargetAnmSpeed, 1.0f, 0.02f); i_this->mpMorf->setPlaySpeed(i_this->mAnmSpeed); cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mRunSpeed, 1.0f, 0.2f * l_HIO.mRunSpeed); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 8, 0x1000); i_this->mFoodInMouth = 1; if (i_this->mDistFromPlayer < 120.0f * i_this->mScale.z) { i_this->mAction = ACT_RUN_WALK; i_this->mMode = 0; food->speedF = 0.0f; } break; case 25: if (i_this->mTimer[0] != 0) { if (i_this->mTimer[0] == 1) { i_this->mAnmSpeed = cM_rndFX(1.0f) + 3.0f; anm_init(i_this, ANM_JOYFUL, 3.0f, 2, 0.3f); } } else { i_this->mLookPos = player->current.pos; i_this->mLookTimer = 10; cLib_addCalc2(&i_this->mAnmSpeed, 1.5f, 1.0f, 0.1f); cLib_addCalc2(&i_this->speedF, i_this->mAnmSpeed * l_HIO.mWalkSpeed, 1.0f, 5.0f); if (i_this->mAnmSpeed <= 1.6f) { i_this->mAction = ACT_RUN; i_this->mMode = 0; } } break; } } /* 8066B650-8066B774 0039F0 0124+00 1/1 0/0 0/0 .text do_swim__FP8do_class */ static void do_swim(do_class* i_this) { cXyz pos; i_this->field_0x616 = 1; i_this->mTailWagTarget = 2000.0f; switch (i_this->mMode) { case 0: anm_init(i_this, 19, 5.0f, 2, cM_rndF(0.15f) + 1.3f); i_this->mMode++; break; case 1: break; } cLib_addCalc2(&i_this->speedF, l_HIO.mSwimSpeed, 1.0f, 0.5f * l_HIO.mSwimSpeed); cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 16, 0x100); i_this->speed.y = 0.0f; i_this->gravity = 0.0f; cLib_addCalc2(&i_this->current.pos.y, i_this->mWaterY - 45.0f, 1.0f, 5.0f); pos = i_this->eyePos; pos.y = i_this->mWaterY; fopAcM_effHamonSet(&i_this->mRippleKey, &pos, 0.7f, 0.1f); } /* 8066B774-8066B7C0 003B14 004C+00 2/2 0/0 0/0 .text s_c_sub__FPvPv */ static void* s_c_sub(void* param_0, void* param_1) { if (fopAcM_IsActor(param_0) && fopAcM_GetName(param_0) == PROC_CANOE) { return param_0; } return 0; } /* 8066B7C0-8066BD3C 003B60 057C+00 1/1 0/0 0/0 .text do_help__FP8do_class */ static void do_help(do_class* i_this) { f32 target_speed = 0.0f; i_this->field_0x616 = 1; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_WALK, 3.0f, 2, 2.0f); i_this->mMode++; break; case 1: target_speed = 5.0f; cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 2, 0x800); if (dansa_check2(i_this, 50.0f)) { anm_init(i_this, ANM_WAIT, 5.0f, 2, 1.0f); i_this->mMode++; } break; case 2: if (i_this->mDistFromPlayer < 800.0f) { i_this->mTailWagTarget = 1000.0f; } if (i_this->mDistFromPlayer < 500.0f) { i_this->mMode++; anm_init(i_this, ANM_JOYFUL, 3.0f, 2, 1.0f); } break; case 3: i_this->mTailWagTarget = 2000.0f; if (i_this->mDistFromPlayer > 550.0f) { anm_init(i_this, ANM_WAIT, 5.0f, 2, 1.0f); i_this->mMode = 2; } if (i_this->mTimer[2] == 0 && daPy_getLinkPlayerActorClass()->checkCanoeRide()) { cXyz vec1, vec2, vec3; daCanoe_c* canoe = (daCanoe_c*)fpcM_Search(s_c_sub, i_this); if (canoe != NULL) { vec3 = i_this->field_0x68c; MTXCopy(canoe->getModelMtx(), *calc_mtx); vec1.set(0.0f, 52.0f, 150.0f); MtxPosition(&vec1, &i_this->field_0x68c); i_this->mLookPos = i_this->field_0x68c; i_this->mLookTimer = 20; vec2 = i_this->field_0x68c - i_this->current.pos; vec2.y = 0.0f; if ((i_this->field_0x68c - vec3).abs() <= 5.0f && vec2.abs() < 230.0f) { i_this->mParam0 = 0; i_this->mAction = ACT_BOAT; i_this->mMode = 0; anm_init(i_this, ANM_DEFEND, 10.0f, 0, 1.0f); i_this->mTimer[0] = 20; } } i_this->mTargetAngleY = cM_atan2s(vec2.x, vec2.z); } cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 4, 0x400); break; } cLib_addCalc2(&i_this->speedF, target_speed, 1.0f, 2.0f); if (!daPy_getLinkPlayerActorClass()->checkCanoeRide() && i_this->mDistFromPlayer < 200.0f) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } if (i_this->mParam0 == 2) { f32 fvar2 = i_this->mDistFromPlayer * 0.0215f; if (fvar2 > 127.0f) { fvar2 = 127.0f; } i_this->mSound.startLevelSound(Z2SE_DOG_V_CALL_HELP, (u8)fvar2, -1); } } /* 8066BD3C-8066C894 0040DC 0B58+00 2/1 0/0 0/0 .text do_boat__FP8do_class */ static s8 do_boat(do_class* i_this) { fopAc_ac_c* _this = static_cast(i_this); s8 ret = 1; i_this->mCcDisableTimer = 10; f32 fvar3; daCanoe_c* canoe = (daCanoe_c*)fpcM_Search(s_c_sub, i_this); if (canoe == NULL) { return 1; } cXyz vec1, vec2; s16 canoe_angle = canoe->shape_angle.y; vec2 = i_this->field_0x68c; MTXCopy(canoe->getModelMtx(), *calc_mtx); vec1.set(0.0f, 52.0f, 150.0f); MtxPosition(&vec1, &i_this->field_0x68c); f32 fvar4 = (i_this->field_0x68c - vec2).abs(); if (!daPy_getLinkPlayerActorClass()->checkCanoeRide() && (i_this->mCounter & 0x200) != 0) { fvar4 = 5.0f; } s8 bvar2 = false; switch (i_this->mMode) { case 0: if (daDo_other_bg_check2(i_this, &i_this->field_0x68c)) { i_this->mAction = ACT_HELP; i_this->mMode = 0; _this->speedF = 0.0f; i_this->mTimer[2] = 50; break; } if (i_this->mTimer[0] == 2) { anm_init(i_this, ANM_RUN, 2.0f, 0, 2.0f); } if (i_this->mTimer[0] != 0) { break; } i_this->mMode++; _this->speed.y = 30.0f; _this->speedF = 0.0f; i_this->mSound.startSound(Z2SE_DOG_V_JUMP, 0, -1); i_this->mTimer[1] = 7; // fallthrough case 1: if (i_this->mTimer[1] != 0) { ret = 0; } vec1 = i_this->field_0x68c - _this->current.pos; fvar3 = vec1.abs(); cMtx_YrotS(*calc_mtx, cM_atan2s(vec1.x, vec1.z)); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = fvar3 * 0.075f + 10.0f; MtxPosition(&vec1, &i_this->field_0x698); cLib_addCalc2(&i_this->current.pos.x, i_this->field_0x68c.x, 1.0f, fabsf(i_this->field_0x698.x) + 2.0f); cLib_addCalc2(&i_this->current.pos.z, i_this->field_0x68c.z, 1.0f, fabsf(i_this->field_0x698.z) + 2.0f); if (_this->speed.y <= -80.0f) { _this->speed.y = -80.0f; } if (_this->current.pos.y <= i_this->field_0x68c.y) { _this->current.pos.y = i_this->field_0x68c.y; _this->speed.y = 0.0f; } if ((i_this->field_0x68c - _this->current.pos).abs() <= 5.0f) { i_this->mMode = 2; anm_init(i_this, ANM_STEP_2, 3.0f, 2, 3.0f); } else { break; } // fallthrough case 2: ret = 0; i_this->field_0x616 = 1; _this->speed.y = 0.0f; _this->gravity = 0.0f; _this->current.pos = i_this->field_0x68c; cLib_addCalcAngleS2(&_this->current.angle.y, i_this->mTargetAngleY, 2, 0x800); _this->current.angle.x = 2700; if (i_this->mAnmID == ANM_STEP_2) { s16 angle = i_this->mTargetAngleY - _this->current.angle.y; if (angle < 0x800 && angle > -0x800) { anm_init(i_this, ANM_JOYFUL, 3.0f, 2, 1.0f); } } else if (i_this->mAnmID == ANM_JOYFUL && fvar4 > 3.0f) { i_this->mMode = 3; anm_init(i_this, ANM_STEP_2, 3.0f, 2, 4.0f); } break; case 3: ret = 0; if (i_this->mTimer[0] == 0) { i_this->mTimer[0] = cM_rndF(70.0f) + 50.0f; cMtx_YrotS(*calc_mtx, _this->shape_angle.y); vec1.x = cM_rndFX(2000.0f); vec1.y = cM_rndF(50.0f) + 50.0f; vec1.z = 2000.0f; MtxPosition(&vec1, &i_this->mLookPos); i_this->mLookPos += _this->current.pos; } i_this->mLookTimer = 2; _this->speed.y = 0.0f; _this->gravity = 0.0f; _this->current.pos = i_this->field_0x68c; cLib_addCalcAngleS2(&_this->current.angle.y, canoe_angle, 2, 0x800); _this->current.angle.x = -2700; if (i_this->mAnmID == ANM_STEP_2) { s16 angle = canoe_angle - _this->current.angle.y; if (angle < 0x800 && angle > -0x800) { anm_init(i_this, ANM_WAIT, 3.0f, 2, 1.0f); } } else if (i_this->mAnmID == ANM_WAIT && fvar4 < 10.0f) { bvar2 = 1; if (fvar4 < 1.0f) { i_this->mMode = 2; anm_init(i_this, ANM_STEP_2, 3.0f, 2, 4.0f); } } break; case 5: anm_init(i_this, ANM_DEFEND, 10.0f, 0, 1.0f); i_this->mTimer[0] = 20; i_this->mMode++; // fallthrough case 6: ret = 0; i_this->mLookPos = i_this->mTargetPos; i_this->mLookTimer = 2; _this->speed.y = 0.0f; _this->gravity = 0.0f; _this->current.pos = i_this->field_0x68c; vec1 = i_this->mTargetPos - _this->current.pos; cLib_addCalcAngleS2(&_this->current.angle.y, cM_atan2s(vec1.x, vec1.z), 2, 0x800); if (i_this->mTimer[0] == 2) { anm_init(i_this, ANM_RUN, 2.0f, 0, 2.0f); } if (i_this->mTimer[0] == 0) { i_this->mMode++; _this->speed.y = 30.0f; _this->speedF = 30.0f; _this->current.angle.x = 0; i_this->mSound.startSound(Z2SE_DOG_V_JUMP, 0, -1); } break; case 7: if (i_this->mBgS_Acch.ChkGroundHit()) { i_this->mAction = ACT_HELP; i_this->mMode = 0; _this->speedF = 0.0f; i_this->mTimer[2] = 100; } break; } if (bvar2) { i_this->field_0xc84 = _this->current.pos; i_this->field_0xc84.y += 40.0f; cMtx_YrotS(*calc_mtx, canoe->shape_angle.y); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = 250.0f; MtxPosition(&vec1, &i_this->field_0xc90); i_this->field_0xc90 += i_this->field_0xc84; i_this->field_0xc9c = i_this->field_0xc90; i_this->field_0xc9c.y += -100.0f; vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = 180.0f; MtxPosition(&vec1, &i_this->field_0xca8); i_this->field_0xca8 += i_this->field_0xc84; i_this->field_0xcb4 = i_this->field_0xca8; i_this->field_0xcb4.y += -100.0f; dBgS_LinChk lin_chk; lin_chk.Set(&i_this->field_0xc84, &i_this->field_0xc90, _this); i_this->field_0xc80 = true; if (!dComIfG_Bgsp().LineCross(&lin_chk)) { lin_chk.Set(&i_this->field_0xca8, &i_this->field_0xcb4, _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { lin_chk.Set(&i_this->field_0xc90, &i_this->field_0xc9c, _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { i_this->field_0xc80 = false; i_this->mTargetPos = lin_chk.GetCross(); i_this->mMode = 5; } } } } return ret; } /* 8066C894-8066CAA8 004C34 0214+00 1/1 0/0 0/0 .text do_a_swim__FP8do_class */ static void do_a_swim(do_class* i_this) { i_this->mTailWagTarget = 2000.0f; cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f); JPABaseEmitter* emitter; switch (i_this->mMode) { case 0: if (l_HIO.mWaterHuntAnimType == 1) { anm_init(i_this, ANM_JOYFUL, 5.0f, 2, 1.0f); } else { anm_init(i_this, ANM_BULBUL, 5.0f, 2, 1.0f); } i_this->mMode = 1; i_this->mTimer[0] = 20; emitter = dComIfGp_particle_set(0x2a3, &i_this->current.pos, 0, 0); if (emitter) { emitter->setGlobalRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(2)); cXyz _pos(0.6f, 0.6f, 0.6f); JGeometry::TVec3 pos; JGeometry::setTVec3f(&_pos.x, &pos.x); emitter->setGlobalScale(pos); } // fallthrough case 1: if (i_this->mTimer[0] == 0) { i_this->mMode = 2; i_this->mShakeSpeed = 0.1f; i_this->mShakeTargetSpeed = 1.0f; } break; case 2: if (l_HIO.mWaterHuntAnimType == 1) { i_this->mpMorf->setPlaySpeed(i_this->mShakeSpeed * 5.0f); } else { i_this->mpMorf->setPlaySpeed(i_this->mShakeSpeed * 5.0f); } if (i_this->mShakeSpeed <= 0.025f) { i_this->mShakeSpeed = 0.0f; i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } break; } } /* 8066CAA8-8066CDEC 004E48 0344+00 1/1 0/0 0/0 .text do_carry__FP8do_class */ static s8 do_carry(do_class* i_this) { fopAc_ac_c* _this = static_cast(i_this); s8 ret = 0; i_this->mCcDisableTimer = 5; _this->speed.y = 0.0f; _this->speedF = 0.0f; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_TO_CARRY_B, 1.0f, 0, daPy_getLinkPlayerActorClass()->getBaseAnimeFrameRate()); i_this->mpMorf->setFrame(daPy_getLinkPlayerActorClass()->getBaseAnimeFrame()); i_this->mTimer[0] = 20; i_this->mMode++; break; case 1: if (i_this->mpMorf->checkFrame(10.0f)) { i_this->mSound.startSound(Z2SE_DOG_CARRIED, 0, -1); } if (daPy_getLinkPlayerActorClass()->getGrabPutStart()) { anm_init(i_this, ANM_TO_CARRY_B, 1.0f, 0, daPy_getLinkPlayerActorClass()->getBaseAnimeFrameRate()); i_this->mpMorf->setFrame(daPy_getLinkPlayerActorClass()->getBaseAnimeFrame()); i_this->mMode++; } break; } if (!fopAcM_checkCarryNow(_this)) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; dBgS_GndChk gnd_chk; cXyz vec = _this->current.pos; vec.y += 50.0f; gnd_chk.SetPos(&vec); if (fabsf(_this->current.pos.y - dComIfG_Bgsp().GroundCross(&gnd_chk)) < 30.0f) { _this->current.pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); _this->gravity = 0.0f; } } i_this->mTailWagTarget = 1000.0f; _this->speedF = 0.0f; if (i_this->mTimer[0] != 0) { ret = 1; _this->speed.y = -0.1f; } else { _this->speed.y = 0.0f; } fopAc_ac_c* player = dComIfGp_getPlayer(0); dBgS_LinChk lin_chk; cXyz vec = _this->current.pos; vec.y += 2.0f; lin_chk.Set(&player->eyePos, &vec, _this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { _this->current.pos = lin_chk.GetCross(); } return ret; } /* 8066CDEC-8066CEC4 00518C 00D8+00 1/1 0/0 0/0 .text do_message__FP8do_class */ static void do_message(do_class* i_this) { i_this->mTailWagTarget = 2000.0f; switch (i_this->mMode) { case 0: anm_init(i_this, 21, 5.0f, 2, 1.0f); i_this->mMode++; break; case 1: break; } cLib_addCalc0(&i_this->speedF, 1.0f, 2.0f); i_this->field_0x616 = 1; cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetAngleY, 2, 0x1000); if (!dComIfGp_event_runCheck() && i_this->mDistFromPlayer > 400.0f) { i_this->mAction = ACT_STAY; i_this->mMode = 0; } } /* 8066CEC4-8066DD48 005264 0E84+00 2/1 0/0 0/0 .text action__FP8do_class */ static void action(do_class* i_this) { fopAc_ac_c* _this = static_cast(i_this); cXyz vec1, vec2; daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); _this->gravity = -7.0f; i_this->mDistFromPlayer = fopAcM_searchPlayerDistance(_this); if (daPy_getPlayerActorClass()->checkHorseRide()) { i_this->mDistFromPlayer -= 100.0f; } i_this->mTargetAngleY = fopAcM_searchPlayerAngleY(_this); i_this->field_0x658 = fabsf(player->eyePos.y - player->current.pos.y); if (!mDoCPd_c::getHoldR(PAD_1) || fabsf(_this->current.pos.y - player->current.pos.y) > 50.0f) { i_this->field_0x658 = 300.0f; } i_this->field_0x658 *= 0.6f; s8 ground_check = 1; s8 carry_check = 1; s8 swim_check = 1; i_this->mCcSph.OnCoSetBit(); if (i_this->field_0x608 < 1.0f) { i_this->mMessageState = 0; switch (i_this->mAction) { case ACT_STAY: do_stay(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_WALK: do_walk(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_WALK_RUN: do_walk_run(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_RUN: do_run(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_RUN_WALK: do_run_walk(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_FOOD: do_food(i_this); i_this->mMessageState = 1; break; case ACT_WAIT_1: do_wait_1(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_WAIT_2: do_wait_2(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_SIT: do_sit(i_this); food_check(i_this); i_this->mMessageState = 1; break; case ACT_A_SWIM: do_a_swim(i_this); break; case ACT_SWIM: do_swim(i_this); swim_check = 0; fopAcM_riverStream(&_this->current.pos, &i_this->field_0x6b0, &i_this->field_0x6b4, 0.5f); break; case ACT_HELP: do_help(i_this); break; case ACT_BOAT: ground_check = do_boat(i_this); break; case ACT_HANG: do_hang(i_this); break; case ACT_CARRY: ground_check = do_carry(i_this); i_this->mCcSph.OffCoSetBit(); carry_check = 0; break; case ACT_MESSAGE: do_message(i_this); i_this->mMessageState = 2; } } if (i_this->mItemActorID != -1 && i_this->mDistFromPlayer < 160.0f * i_this->mScale.z) { daItem_c* item = static_cast(fopAcM_SearchByID(i_this->mItemActorID)); if (item) { item->endControl(); } i_this->mItemControlTimer = 0; i_this->mItemActorID = -1; } if (i_this->mRunningSoundTimer != 0) { i_this->mRunningSoundTimer--; if (i_this->mRunningSoundTimer == 0) { i_this->mSound.startSound(Z2SE_M007_DOG_COME_RUNNING, 0, -1); } } if (i_this->mMessageState == 1 && daPy_py_c::checkNowWolf() && i_this->mDistFromPlayer < 300.0f) { i_this->mAction = ACT_MESSAGE; i_this->mMode = 0; } if (carry_check && player->speedF < 2.0f) { cLib_onBit(_this->attention_info.flags, 0x10); if (do_carry_check(i_this)) { return; } } else { cLib_offBit(_this->attention_info.flags, 0x10); } cLib_addCalcAngleS2(&_this->current.angle.x, 0, 1, 0x400); if (i_this->mAction != ACT_HANG) { cMtx_YrotS(*calc_mtx, _this->current.angle.y); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = _this->speedF * 0.8f * i_this->mScale.z * l_HIO.mBaseSize; MtxPosition(&vec1, &vec2); _this->speed.x = vec2.x; _this->speed.z = vec2.z; _this->speed.y += _this->gravity; _this->current.pos += _this->speed; if (_this->speed.y < -80.0f) { _this->speed.y = -80.0f; } if (!fopAcM_checkCarryNow(_this)) { cXyz* cc_move = i_this->mStts.GetCCMoveP(); if (cc_move != NULL) { _this->current.pos.x += 0.3f * cc_move->x; _this->current.pos.z += 0.3f * cc_move->z; } } if (i_this->field_0x608 > 1.0f) { vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = -i_this->field_0x608; cMtx_YrotS(*calc_mtx, i_this->field_0x60c); MtxPosition(&vec1, &vec2); _this->current.pos += vec2; cLib_addCalc0(&i_this->field_0x608, 1.0f, 6.0f); _this->speedF = 0.0f; ground_check = 1; } if (ground_check) { i_this->mBgS_AcchCir.SetWall(30.0f, fabsf(_this->speedF) + fabsf(i_this->field_0x608) + 30.0f); i_this->mBgS_Acch.CrrPos(dComIfG_Bgsp()); if (i_this->mBgS_Acch.ChkGroundHit() && !noFallCheck && !fopAcM_checkCarryNow(_this)) { dBgS_GndChk gnd_chk; cMtx_YrotS(*calc_mtx, _this->shape_angle.y); vec1.x = 0.0f; vec1.y = 0.0f; vec1.z = -25.0f * i_this->mScale.z; MtxPosition(&vec1, &vec2); vec2 += _this->current.pos; Vec pos; pos.x = vec2.x; pos.y = vec2.y + 100.0f; pos.z = vec2.z; gnd_chk.SetPos(&pos); vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); vec1 = vec2 - _this->current.pos; if (fabsf(vec1.y) < 50.0f) { _this->current.angle.x = cM_atan2s(vec1.y, JMAFastSqrt(vec1.x * vec1.x + vec1.z * vec1.z)); } } } } else { if (i_this->field_0x608 < 1.0f && dansa_check(i_this, _this->current.pos, 100.0f) > 0) { i_this->mHangAngleY = hang_set(i_this); if (i_this->mHangAngleY != 0xdcf) { i_this->mAction = ACT_HANG; i_this->mMode = 0; i_this->mASwimTimer = 0; } } } water_check(i_this); if (swim_check) { if (i_this->mAction != ACT_CARRY) { if (i_this->mASwimTimer != 0) { i_this->mASwimTimer--; if (i_this->mASwimTimer == 0) { i_this->mAction = ACT_A_SWIM; i_this->mMode = 0; } } if (i_this->mWaterY - _this->current.pos.y > 45.0f) { i_this->mAction = ACT_SWIM; i_this->mMode = 0; i_this->field_0x608 = 0.0f; if (i_this->mSwimEffectTimer == 0) { i_this->mSwimEffectTimer = 20; cXyz pos = _this->current.pos; pos.y = i_this->mWaterY; static cXyz scc(0.7f, 0.7f, 0.7f); static u16 w_eff_id[4] = {0x1B8, 0x1B9, 0x1BA, 0x1BB}; for (int i = 0; i < 4; i++) { i_this->mParticleKey[i] = dComIfGp_particle_set(i_this->mParticleKey[i], w_eff_id[i], &pos, &_this->tevStr, NULL, &scc, 0xff, NULL, -1, NULL, NULL, NULL); } i_this->mSound.startSound(Z2SE_CM_BODYFALL_WATER_S, 0, -1); } } } } else { i_this->mASwimTimer = cM_rndF(25.0f) + 30.0f; if (i_this->mWaterY - _this->current.pos.y < 35.0f) { i_this->mAction = ACT_WAIT_1; i_this->mMode = 0; } } cLib_addCalcAngleS2(&_this->shape_angle.y, _this->current.angle.y, 2, 0x2000); cLib_addCalcAngleS2(&_this->shape_angle.x, _this->current.angle.x, 4, 0x1000); _this->shape_angle.z = _this->current.angle.z; s16 head_angle_y = 0; s16 head_angle_x = 0; if (i_this->field_0x616 != 0 || i_this->mLookTimer != 0) { if (i_this->field_0x616 == 2) { if (i_this->mCounter & 8) { head_angle_y = 10000; } else { head_angle_y = -10000; } } else { if (i_this->mLookTimer != 0) { i_this->mLookTimer--; vec1 = i_this->mLookPos - _this->eyePos; } else { vec1 = player->eyePos - _this->eyePos; } vec1.y += i_this->mScale.z * -16.0f; head_angle_y = cM_atan2s(vec1.x, vec1.z) - _this->shape_angle.y; head_angle_x = _this->shape_angle.x + cM_atan2s(vec1.y, JMAFastSqrt(vec1.x * vec1.x + vec1.z * vec1.z)); if (i_this->mLookTimer == 0 && (head_angle_y > 24000 || head_angle_y < -24000)) { head_angle_y = 0; } if (head_angle_y > 12000) { head_angle_y = 12000; } else if (head_angle_y < -12000) { head_angle_y = -12000; } if (head_angle_x > 12000) { head_angle_x = 12000; } else if (head_angle_x < -12000) { head_angle_x = -12000; } head_angle_y += i_this->mHeadTilt; } i_this->field_0x616 = 0; } cLib_addCalcAngleS2(&i_this->mHeadAngle.y, head_angle_y / 2, 4, 0x2000); cLib_addCalcAngleS2(&i_this->mHeadAngle.x, head_angle_x / 2, 4, 0x2000); cLib_addCalcAngleS2(&i_this->mHeadTilt, 0, 2, 0x300); cLib_addCalcAngleS2(&i_this->mHeadBob.y, i_this->mHeadBobTarget.y, 4, 0x400); cLib_addCalcAngleS2(&i_this->mHeadBob.z, i_this->mHeadBobTarget.z, 4, 0x400); if (fabsf(player->speedF) < 2.0f && fabsf(_this->speedF) < 2.0f) { if (i_this->mHeadBobTimer != 0) { i_this->mHeadBobTimer--; if (i_this->mHeadBobTimer == 0) { i_this->mHeadBobTimer = cM_rndF(100.0f) + 20.0f; if (cM_rndF(1.0f) < 0.5f) { i_this->mHeadBobTarget.y = cM_rndFX(2000.0f); } if (cM_rndF(1.0f) < 0.5f) { i_this->mHeadBobTarget.z = cM_rndFX(2000.0f); } } } } else { i_this->mHeadBobTarget.z = 0; i_this->mHeadBobTarget.y = 0; i_this->mHeadBobTimer = cM_rndF(60.0f) + 80.0f; } if (i_this->mShakeSpeed >= 0.025f) { if (l_HIO.mWaterHuntAnimType != 0) { f32 fvar17 = i_this->mShakeSpeed * 3000.0f; i_this->mHeadAngle.y = fvar17 * cM_ssin(i_this->mCounter * 22000) * 0.5f; i_this->mHeadAngle.z = fvar17 * cM_ssin(i_this->mCounter * 25000); } else { i_this->mHeadAngle.z = 0; i_this->mHeadAngle.y = 0; } } cLib_addCalc2(&i_this->mShakeSpeed, i_this->mShakeTargetSpeed, 1.0f, 0.15f); cLib_addCalc0(&i_this->mShakeTargetSpeed, 1.0f, 0.04f); i_this->mTailAngle.y = i_this->mTailWag * cM_ssin(i_this->mTailPhaseY); i_this->mTailAngle.x = i_this->mTailWag * cM_ssin(i_this->mTailPhaseX) * 0.5f; i_this->mTailPhaseY += i_this->mTailWag * 2.0f; if (i_this->mTailPhaseY > 65536.0f) { i_this->mTailPhaseY -= 65536.0f; } i_this->mTailPhaseX += i_this->mTailWag * 1.5f; if (i_this->mTailPhaseX > 65536.0f) { i_this->mTailPhaseX -= 65536.0f; } cLib_addCalc2(&i_this->mTailWag, i_this->mTailWagTarget, 1.0f, 100.0f); i_this->mTailWagTarget = 0.0f; if (i_this->mBtpReset != 0) { cLib_addCalcAngleS2(&i_this->mBtpFrame, 3, 1, 1); i_this->mBtpReset = 0; i_this->mBtpTimer = 60; } else { if (i_this->mBtpTimer == 0) { i_this->mBtpTimer = cM_rndF(100.0f) + 30.0f; } else { i_this->mBtpTimer--; if (i_this->mBtpTimer <= 5) { i_this->mBtpFrame = 5 - i_this->mBtpTimer; } else { i_this->mBtpFrame = 0; } } } } /* 8066DD48-8066DE64 0060E8 011C+00 1/1 0/0 0/0 .text message__FP8do_class */ static void message(do_class* i_this) { if (i_this->mIsTalking) { i_this->mCcDisableTimer = 10; if (i_this->mMsg.doFlow(i_this, 0, 0)) { dComIfGp_event_reset(); i_this->mIsTalking = 0; } } else { if (dComIfGp_event_runCheck() && i_this->eventInfo.checkCommandTalk()) { i_this->mMsg.init(i_this, i_this->mFlowID, 0, 0); i_this->mIsTalking = 1; } if (i_this->mMessageState == 2 && i_this->mFlowID != -1 && daPy_py_c::checkNowWolf()) { fopAcM_OnStatus(i_this, 0); cLib_onBit(i_this->attention_info.flags, 0xa); i_this->eventInfo.onCondition(dEvtCnd_CANTALK_e); } else { fopAcM_OffStatus(i_this, 0); cLib_offBit(i_this->attention_info.flags, 0xa); } } } /* 8066DE64-8066E494 006204 0630+00 2/1 0/0 0/0 .text daDo_Execute__FP8do_class */ static int daDo_Execute(do_class* i_this) { if (cDmrNowMidnaTalk() && !fopAcM_checkCarryNow(i_this)) { return 1; } i_this->mCounter++; for (int i = 0; i < 4; i++) { if (i_this->mTimer[i] != 0) { i_this->mTimer[i]--; } } if (i_this->mCcDisableTimer != 0) { i_this->mCcDisableTimer--; } if (i_this->mSwimEffectTimer != 0) { i_this->mSwimEffectTimer--; } action(i_this); mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z); mDoMtx_stack_c::YrotM(i_this->shape_angle.y); mDoMtx_stack_c::XrotM(i_this->shape_angle.x); mDoMtx_stack_c::ZrotM(i_this->shape_angle.z); i_this->scale.set(i_this->mScale.x * l_HIO.mBaseSize, i_this->mScale.y * l_HIO.mBaseSize, i_this->mScale.z * l_HIO.mBaseSize); mDoMtx_stack_c::scaleM(i_this->scale.x, i_this->scale.y, i_this->scale.z); J3DModel* model = i_this->mpMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); i_this->mpMorf->play(&i_this->eyePos, 0, 0); if (i_this->mAnmID == ANM_JOYFUL) { if (i_this->mpMorf->checkFrame(16.0f)) { i_this->mpMorf->setFrame(0.0f); } } else if (i_this->mAnmID == ANM_RUN) { if (i_this->mpMorf->checkFrame(15.0f)) { i_this->mpMorf->setFrame(0.0f); } } if ((i_this->mAnmID == ANM_JOYFUL || i_this->mAnmID == ANM_STEP) && i_this->mTimer[3] == 0) { i_this->mTimer[3] = cM_rndF(4.0f) + 13.0f; i_this->mSound.startSound(Z2SE_DOG_BREATH, 0, -1); } i_this->mpBtk->setFrame(i_this->mBtkFrame); i_this->mpBtp->setFrame(i_this->mBtpFrame); i_this->mpMorf->modelCalc(); cXyz vec, center; MTXCopy(model->getAnmMtx(10), *calc_mtx); vec.set(5.0f, 5.0f, 0.0f); MtxPosition(&vec, &i_this->eyePos); i_this->attention_info.position = i_this->eyePos; i_this->attention_info.position.y += i_this->mScale.y * 16.0f; vec.set(-15.0f, -15.0f, 0.0f); MtxPosition(&vec, ¢er); if (i_this->mCcDisableTimer != 0) { center.y += 13000.0f; } i_this->mCcSph.SetC(center); if (i_this->mAction == ACT_A_SWIM) { i_this->mCcSph.SetR(i_this->mScale.z * 45.0f); } else { i_this->mCcSph.SetR(i_this->mScale.z * 30.0f); } dComIfG_Ccsp()->Set(&i_this->mCcSph); if (i_this->mItemActorID != -1) { daItem_c* item = static_cast(fopAcM_SearchByID(i_this->mItemActorID)); if (item != NULL) { if (i_this->mItemControlTimer < 10) { i_this->mItemControlTimer++; if (i_this->mItemControlTimer == 10) { item->startControl(); i_this->mItemControlTimer = 20; } } MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(10), *calc_mtx); cMtx_YrotM(*calc_mtx, 0); cMtx_XrotM(*calc_mtx, 0); cMtx_ZrotM(*calc_mtx, 0); MtxTrans(20.0f, -24.0f, 0.0f, 1); vec.set(0.0f, 0.0f, 0.0f); MtxPosition(&vec, &item->current.pos); item->shape_angle = i_this->shape_angle; item->current.angle = item->shape_angle; item->speed.zero(); item->speedF = 0.0f; } } if (i_this->mFoodInMouth) { obj_food_class* food = static_cast(fopAcM_SearchByID(i_this->mFoodActorID)); if (food != NULL) { if (fopAcM_GetName(food) == PROC_OBJ_FOOD) { MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(10), *calc_mtx); cMtx_YrotM(*calc_mtx, 0x4000); MtxTrans(0.0f, -7.0f, 25.0f, 1); food->mpModel->setBaseTRMtx(*calc_mtx); vec.set(0.0f, 0.0f, 0.0f); MtxPosition(&vec, &food->current.pos); fopAcM_SetFoodStatus(food, fopAcM_FOOD_3); } } else { //!@bug: the last two lines will fail because this path only executes if food is null MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(10), *calc_mtx); cMtx_YrotM(*calc_mtx, 0x4000); MtxTrans(0.0f, -7.0f, 25.0f, 1); vec.set(0.0f, 0.0f, 0.0f); MtxPosition(&vec, &food->current.pos); fopAcM_SetFoodStatus(food, fopAcM_FOOD_3); } i_this->mFoodInMouth = 0; } i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); message(i_this); return 1; } /* 8066E494-8066E49C 006834 0008+00 1/0 0/0 0/0 .text daDo_IsDelete__FP8do_class */ static int daDo_IsDelete(do_class* i_this) { return 1; } /* 8066E49C-8066E504 00683C 0068+00 1/0 0/0 0/0 .text daDo_Delete__FP8do_class */ static int daDo_Delete(do_class* i_this) { u32 actor_id = fopAcM_GetID(i_this); dComIfG_resDelete(&i_this->mPhase, "Do"); if (i_this->mHIOInit) { hioInit = false; } if (i_this->heap) { i_this->mSound.deleteObject(); } return 1; } /* 8066E504-8066E7D4 0068A4 02D0+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { do_class* _this = (do_class*)i_this; _this->mpMorf = new mDoExt_McaMorf((J3DModelData*)dComIfG_getObjectRes("Do", 25), NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("Do", 14), 2, 1.0f, 0, -1, 1, NULL, 0x80000, 0x11020284); if (_this->mpMorf == NULL || _this->mpMorf->getModel() == NULL) { return 0; } J3DModel* model = _this->mpMorf->getModel(); _this->model = model; model->setUserArea((u32)i_this); for (u16 jnt_no = 0; jnt_no < model->getModelData()->getJointNum(); jnt_no++) { if (jnt_no == 9 || jnt_no == 10 || jnt_no == 22 || jnt_no == 23) { model->getModelData()->getJointNodePointer(jnt_no)->setCallBack(nodeCallBack); } } _this->mpBtk = new mDoExt_btkAnm(); if (_this->mpBtk == NULL) { return 0; } if (!_this->mpBtk->init(_this->mpMorf->getModel()->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Do", 29), TRUE, 0, 1.0f, 0, -1)) { return 0; } _this->mpBtp = new mDoExt_btpAnm(); if (_this->mpBtp == NULL) { return 0; } if (!_this->mpBtp->init(_this->mpMorf->getModel()->getModelData(), (J3DAnmTexPattern*)dComIfG_getObjectRes("Do", 32), TRUE, 0, 1.0f, 0, -1)) { return 0; } _this->mSound.init(&_this->current.pos, 1); return 1; } /* 8066E81C-8066EAE4 006BBC 02C8+00 1/0 0/0 0/0 .text daDo_Create__FP10fopAc_ac_c */ static cPhs__Step daDo_Create(fopAc_ac_c* i_this) { do_class* _this = static_cast(i_this); fopAcM_SetupActor(i_this, do_class); cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&_this->mPhase, "Do"); if (step == cPhs_COMPLEATE_e) { _this->mParam0 = fopAcM_GetParam(i_this) & 7; _this->mParam1 = fopAcM_GetParam(i_this) >> 4 & 0xf; _this->mParam2 = (u8)(fopAcM_GetParam(i_this) >> 8); if (_this->mParam0 != 2) { _this->mParam0 = 0; } _this->mFlowID = i_this->current.angle.x; i_this->shape_angle.x = 0; i_this->current.angle.x = 0; if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x2120)) { return cPhs_ERROR_e; } if (!hioInit) { _this->mHIOInit = true; hioInit = 1; l_HIO.field_0x04 = -1; } fopAcM_OnStatus(i_this, fopAcStts_CULL_e); fopAcM_OnCarryType(i_this, fopAcM_CARRY_TYPE_8); i_this->attention_info.flags = 0; i_this->attention_info.distances[fopAc_attn_CARRY_e] = 7; fopAcM_SetMtx(i_this, _this->mpMorf->getModel()->getBaseTRMtx()); _this->mBgS_Acch.Set(fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this), i_this, 1, &_this->mBgS_AcchCir, fopAcM_GetSpeed_p(i_this), NULL, NULL); _this->mBgS_AcchCir.SetWall(30.0f, 30.0f); i_this->health = 1; _this->field_0x560 = 1; _this->mStts.Init(100, 0, i_this); static dCcD_SrcSph cc_sph_src = { { {0x0, {{0x0, 0x0, 0x0}, {0x0, 0x0}, 0x75}}, // mObj {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 20.0f} // mSph } // mSphAttr }; _this->mCcSph.Set(cc_sph_src); _this->mCcSph.SetStts(&_this->mStts); _this->mCcSph.OnTgNoHitMark(); if (_this->mParam1 == 0xff) { _this->mBtkFrame = cM_rndF(3.999f); } else { _this->mBtkFrame = _this->mParam1; if (_this->mBtkFrame > 3) { _this->mBtkFrame = 3; } } _this->mTailPhaseY = cM_rndF(0x10000); _this->mTailPhaseX = cM_rndF(0x10000); _this->mCounter = cM_rndF(0x10000); _this->mScale.set(1.0f, 1.0f, 1.0f); if (_this->mParam0 == 2) { _this->mAction = ACT_HELP; i_this->current.pos.set(7216.0f, 220.0f, -4808.0f); } noFallCheck = false; if (dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo()) != ST_FIELD) { noFallCheck = true; _this->mParam2 = 200; } _this->mItemActorID = -1; daDo_Execute(_this); } return step; } /* 8066F32C-8066F330 0000BC 0004+00 0/0 0/0 0/0 .bss * sInstance__40JASGlobalInstance<19JASDefaultBankTable> */ #pragma push #pragma force_active on static u8 data_8066F32C[4]; #pragma pop /* 8066F330-8066F334 0000C0 0004+00 0/0 0/0 0/0 .bss * sInstance__35JASGlobalInstance<14JASAudioThread> */ #pragma push #pragma force_active on static u8 data_8066F330[4]; #pragma pop /* 8066F334-8066F338 0000C4 0004+00 0/0 0/0 0/0 .bss sInstance__27JASGlobalInstance<7Z2SeMgr> */ #pragma push #pragma force_active on static u8 data_8066F334[4]; #pragma pop /* 8066F338-8066F33C 0000C8 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8Z2SeqMgr> */ #pragma push #pragma force_active on static u8 data_8066F338[4]; #pragma pop /* 8066F33C-8066F340 0000CC 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SceneMgr> */ #pragma push #pragma force_active on static u8 data_8066F33C[4]; #pragma pop /* 8066F340-8066F344 0000D0 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2StatusMgr> */ #pragma push #pragma force_active on static u8 data_8066F340[4]; #pragma pop /* 8066F344-8066F348 0000D4 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2DebugSys> */ #pragma push #pragma force_active on static u8 data_8066F344[4]; #pragma pop /* 8066F348-8066F34C 0000D8 0004+00 0/0 0/0 0/0 .bss * sInstance__36JASGlobalInstance<15JAISoundStarter> */ #pragma push #pragma force_active on static u8 data_8066F348[4]; #pragma pop /* 8066F34C-8066F350 0000DC 0004+00 0/0 0/0 0/0 .bss * sInstance__35JASGlobalInstance<14Z2SoundStarter> */ #pragma push #pragma force_active on static u8 data_8066F34C[4]; #pragma pop /* 8066F350-8066F354 0000E0 0004+00 0/0 0/0 0/0 .bss * sInstance__33JASGlobalInstance<12Z2SpeechMgr2> */ #pragma push #pragma force_active on static u8 data_8066F350[4]; #pragma pop /* 8066F354-8066F358 0000E4 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8JAISeMgr> */ #pragma push #pragma force_active on static u8 data_8066F354[4]; #pragma pop /* 8066F358-8066F35C 0000E8 0004+00 0/0 0/0 0/0 .bss sInstance__29JASGlobalInstance<9JAISeqMgr> */ #pragma push #pragma force_active on static u8 data_8066F358[4]; #pragma pop /* 8066F35C-8066F360 0000EC 0004+00 0/0 0/0 0/0 .bss * sInstance__33JASGlobalInstance<12JAIStreamMgr> */ #pragma push #pragma force_active on static u8 data_8066F35C[4]; #pragma pop /* 8066F360-8066F364 0000F0 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SoundMgr> */ #pragma push #pragma force_active on static u8 data_8066F360[4]; #pragma pop /* 8066F364-8066F368 0000F4 0004+00 0/0 0/0 0/0 .bss * sInstance__33JASGlobalInstance<12JAISoundInfo> */ #pragma push #pragma force_active on static u8 data_8066F364[4]; #pragma pop /* 8066F368-8066F36C 0000F8 0004+00 0/0 0/0 0/0 .bss * sInstance__34JASGlobalInstance<13JAUSoundTable> */ #pragma push #pragma force_active on static u8 data_8066F368[4]; #pragma pop /* 8066F36C-8066F370 0000FC 0004+00 0/0 0/0 0/0 .bss * sInstance__38JASGlobalInstance<17JAUSoundNameTable> */ #pragma push #pragma force_active on static u8 data_8066F36C[4]; #pragma pop /* 8066F370-8066F374 000100 0004+00 0/0 0/0 0/0 .bss * sInstance__33JASGlobalInstance<12JAUSoundInfo> */ #pragma push #pragma force_active on static u8 data_8066F370[4]; #pragma pop /* 8066F374-8066F378 000104 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SoundInfo> */ #pragma push #pragma force_active on static u8 data_8066F374[4]; #pragma pop /* 8066F378-8066F37C 000108 0004+00 0/0 0/0 0/0 .bss * sInstance__34JASGlobalInstance<13Z2SoundObjMgr> */ #pragma push #pragma force_active on static u8 data_8066F378[4]; #pragma pop /* 8066F37C-8066F380 00010C 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2Audience> */ #pragma push #pragma force_active on static u8 data_8066F37C[4]; #pragma pop /* 8066F380-8066F384 000110 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2FxLineMgr> */ #pragma push #pragma force_active on static u8 data_8066F380[4]; #pragma pop /* 8066F384-8066F388 000114 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2EnvSeMgr> */ #pragma push #pragma force_active on static u8 data_8066F384[4]; #pragma pop /* 8066F388-8066F38C 000118 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SpeechMgr> */ #pragma push #pragma force_active on static u8 data_8066F388[4]; #pragma pop /* 8066F38C-8066F390 00011C 0004+00 0/0 0/0 0/0 .bss * sInstance__34JASGlobalInstance<13Z2WolfHowlMgr> */ #pragma push #pragma force_active on static u8 data_8066F38C[4]; #pragma pop /* 8066F1CC-8066F1EC -00001 0020+00 1/0 0/0 0/0 .data l_daDo_Method */ static actor_method_class l_daDo_Method = { (process_method_func)daDo_Create, (process_method_func)daDo_Delete, (process_method_func)daDo_Execute, (process_method_func)daDo_IsDelete, (process_method_func)daDo_Draw, }; /* 8066F1EC-8066F21C -00001 0030+00 0/0 0/0 1/0 .data g_profile_DO */ extern actor_process_profile_definition g_profile_DO = { fpcLy_CURRENT_e, 7, fpcPi_CURRENT_e, PROC_DO, &g_fpcLf_Method.base, sizeof(do_class), 0, 0, &g_fopAc_Method.base, 0x2BB, &l_daDo_Method, 0x8044000, fopAc_NPC_e, fopAc_CULLBOX_0_e, };