tp/src/d/actor/d_a_do.cpp

2828 lines
86 KiB
C++

/**
* 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<J3DAnmTransform*>(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<fopAc_ac_c*>(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<fopAc_ac_c*>(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<fopAc_ac_c*>(i_proc)) && target_info_count < 5)
{
target_info[target_info_count] = static_cast<fopAc_ac_c*>(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<fopAc_ac_c*>(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<fopAc_ac_c*>(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<fopAc_ac_c*>(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<f32> 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<fopAc_ac_c*>(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<fopAc_ac_c*>(i_this);
cXyz vec1, vec2;
daPy_py_c* player = static_cast<daPy_py_c*>(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<daItem_c*>(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<u32>(_this->attention_info.flags, 0x10);
if (do_carry_check(i_this)) {
return;
}
} else {
cLib_offBit<u32>(_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<u32>(i_this->attention_info.flags, 0xa);
i_this->eventInfo.onCondition(dEvtCnd_CANTALK_e);
} else {
fopAcM_OffStatus(i_this, 0);
cLib_offBit<u32>(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, &center);
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<daItem_c*>(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<obj_food_class*>(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<do_class*>(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,
};