Files
tww/src/d/actor/d_a_bk.cpp
T

3889 lines
131 KiB
C++

/**
* d_a_bk.cpp
* Enemy - Bokoblin
*/
#include "d/actor/d_a_bk.h"
#include "d/d_bg_s_gnd_chk.h"
#include "d/res/res_bk.h"
#include "f_op/f_op_actor_mng.h"
#include "d/d_procname.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_obj_search.h"
#include "d/actor/d_a_item.h"
#include "d/d_item_data.h"
#include "d/actor/d_a_boko.h"
#include "d/actor/d_a_bomb.h"
#include "d/actor/d_a_obj_search.h"
#include "d/d_bg_s_lin_chk.h"
#include "m_Do/m_Do_mtx.h"
#include "m_Do/m_Do_controller_pad.h"
#include "d/actor/d_a_player.h"
#include "d/d_s_play.h"
#include "d/d_path.h"
#include "d/d_jnt_hit.h"
#include "d/d_cc_uty.h"
#include "d/d_material.h"
#include "d/d_snap.h"
#include "JSystem/JUtility/JUTReport.h"
#include "weak_bss_936_to_1036.h" // IWYU pragma: keep
#include "weak_data_1811.h" // IWYU pragma: keep
static u8 hio_set;
static u8 another_hit;
static fopAc_ac_c* ken;
static s8 search_sp;
static bkHIO_c l_bkHIO;
static dCcG_At_Spl bk_at_kind[] = { dCcG_At_Spl_UNK0, dCcG_At_Spl_UNK1, dCcG_At_Spl_UNK0 };
static int bk_attack_ready_SE[] = { JA_SE_CV_BK_KAMAE, JA_SE_CV_BK_KAMAE, -0xDCF }; // TODO what is -0xDCF?
static int bk_attack_go_SE[] = { JA_SE_CV_BK_ATTACK_S, JA_SE_CV_BK_ATTACK_L, -0xDCF }; // TODO what is -0xDCF?
static int bk_attack_AP[] = { 1, 2, 1 };
static f32 br_set_tm[] = { -100.0f, -100.0f, -100.0f };
struct attack_info_s {
/* 0x00 */ int bckFileIdx;
/* 0x04 */ f32 speed;
/* 0x08 */ int soundFileIdx;
};
static attack_info_s attack1_info[] = {
{ BK_BCK_BK_ATTACK1, 1.2f, BK_BAS_BK_ATTACK1 },
{ BK_BCK_BK_ATTACK2, 1.0f, BK_BAS_BK_ATTACK2 },
{ BK_BCK_BK_ATTACK3, 1.0f, BK_BAS_BK_ATTACK3 },
};
static attack_info_s jattack1_info[] = {
{ BK_BCK_BK_JATTACK1, 1.0f, -1 },
{ BK_BCK_BK_JATTACK2, 1.0f, BK_BAS_BK_JATTACK2 },
{ BK_BCK_BK_JATTACK3, 1.0f, BK_BAS_BK_JATTACK3 },
};
static attack_info_s kattack1_info[] = {
{ BK_BCK_BK_KERI1, 1.0f, BK_BAS_BK_KERI1 },
{ BK_BCK_BK_KERI2, 1.0f, BK_BAS_BK_KERI2 },
{ -BK_BTP_TMABATAKI, 1.0f, 0 }, // TODO: why is bckFileIdx negative and soundFileIdx zero? bug?
};
static attack_info_s* attack_info[] = {
attack1_info,
jattack1_info,
kattack1_info,
};
static s8 joint_check[] = {
-1, -1, 0x0B, 0x07, 0x03, 0x0F, -1, 0x0A, 0x06, 0x02, 0x0E, -1, -1, -1, -1, -1,
0x0C, 0x0D, 0x12, 0x32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0x09, 0x05, 0x01, 0x11, -1, -1, -1, -1, 0x08, 0x04, 0x00, 0x10, -1, -1, -1, -1,
-1, -1, -1, 0x13,
};
/* 000000EC-00000234 .text anm_init__FP8bk_classifUcfi */
static void anm_init(bk_class* i_this, int bckFileIdx, f32 morf, u8 loopMode, f32 speed, int soundFileIdx) {
if (i_this->dr.mState == 0x13 && bckFileIdx != BK_BCK_BK_OTISOU1 && bckFileIdx != BK_BCK_BK_OTISOU2) {
return;
}
if (soundFileIdx >= 0) {
void* soundAnm = dComIfG_getObjectRes("Bk", soundFileIdx);
J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("Bk", bckFileIdx);
i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, soundAnm);
} else {
J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("Bk", bckFileIdx);
i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, NULL);
}
}
/* 00000234-000005A8 .text yari_off_check__FP8bk_class */
static void yari_off_check(bk_class* i_this) {
if (i_this->m0B34 == 0) {
return;
}
daBoko_c* boko = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (boko) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
fopAcM_cancelCarryNow(boko);
if (i_this->m0B34 != 2) {
boko->setRotAngleSpeed(cM_rndFX(2000.0f));
s16 angleY = i_this->shape_angle.y + 0x8000 + (s16)cM_rndFX(8000.0f);
f32 speedY = 20.0f + cM_rndF(20.0f);
f32 speedForward = 20.0f + cM_rndF(10.0f);
boko->moveStateInit(speedForward, speedY, angleY);
}
boko->current.angle.y = player->shape_angle.y;
dBgS_LinChk linChk;
linChk.Set(&i_this->eyePos, &boko->current.pos, i_this);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
MtxP mtx = i_this->mpMorf->getModel()->getAnmMtx(0x10); // mune (chest) joint
MTXCopy(mtx, *calc_mtx);
boko->setMatrix(*calc_mtx);
cXyz offset;
offset.set(0.0f, 0.0f, 0.0f);
MtxPosition(&offset, &boko->current.pos);
}
}
i_this->m121F = 1;
i_this->m0B34 = 0;
i_this->m0B30 = 0;
}
/* 00000A1C-00000EE8 .text smoke_set_s__FP8bk_classf */
static void smoke_set_s(bk_class* i_this, f32 rate) {
fopAc_ac_c* i_actor = i_this;
dBgS_LinChk linChk;
s32 attribCode;
attribCode = 0;
cXyz startPos = i_this->m0338;
startPos.y += 100.0f;
cXyz endPos = i_this->m0338;
endPos.y -= 100.0f;
linChk.Set(&startPos, &endPos, i_actor);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
endPos = linChk.GetCross();
i_this->m0338.y = endPos.y;
attribCode = dComIfG_Bgsp()->GetAttributeCode(linChk);
} else {
i_this->m0338.y -= 20000.0f;
}
if (i_this->m034F != 0 && attribCode != dBgS_Attr_GRASS_e) {
return;
}
i_this->m034F++;
switch (attribCode) {
case dBgS_Attr_NORMAL_e:
case dBgS_Attr_DIRT_e:
case dBgS_Attr_WOOD_e:
case dBgS_Attr_STONE_e:
case dBgS_Attr_SAND_e: {
i_this->m0350.end();
JPABaseEmitter* emitter1 = dComIfGp_particle_setToon(
dPa_name::ID_COMMON_2022, &i_this->m0338, &i_this->m0344, NULL, 0xB9,
&i_this->m0350, fopAcM_GetRoomNo(i_this)
);
if (emitter1) {
emitter1->setRate(rate);
emitter1->setSpread(1.0f);
JGeometry::TVec3<f32> scale;
scale.x = scale.y = scale.z = 1.2f;
emitter1->setGlobalScale(scale);
scale.x = scale.y = scale.z = 1.5f + REG0_F(16);
emitter1->setGlobalParticleScale(scale);
}
break;
}
case dBgS_Attr_GRASS_e:
JPABaseEmitter* emitter2 = dComIfGp_particle_set(dPa_name::ID_COMMON_0024, &i_this->m0338, &i_this->m0344);
if (emitter2) {
emitter2->setRate(rate * 0.5f);
emitter2->setMaxFrame(3);
}
break;
}
}
/* 00000EE8-000011F0 .text ground_smoke_set__FP8bk_class */
static void ground_smoke_set(bk_class* i_this) {
if (i_this->m034C == 0) {
return;
}
i_this->m034C--;
if (i_this->m034C >= l_bkHIO.m00C) {
i_this->m0344.x = 0;
i_this->m0344.z = 0;
cXyz sp8;
sp8.x = 0.0f;
sp8.y = 0.0f;
MtxTrans(i_this->current.pos.x, i_this->current.pos.y + 7.5f, i_this->current.pos.z, 0);
if (i_this->m034E == 0) {
sp8.z = -350.0f;
cMtx_YrotM(*calc_mtx, i_this->m034A);
MtxPosition(&sp8, &i_this->m0338);
i_this->m0344.y = i_this->m034A;
smoke_set_s(i_this, 6.0f);
i_this->m034A = i_this->m034A + 2000 + REG0_S(7);
} else if (i_this->m034E == 1) {
cMtx_YrotM(*calc_mtx, i_this->current.angle.y);
cMtx_YrotM(*calc_mtx, i_this->m034A);
sp8.z = -55.0f;
MtxPosition(&sp8, &i_this->m0338);
i_this->m0344.y = i_this->m034A;
smoke_set_s(i_this, 5.0f);
i_this->m034A += 0x1FA0;
} else if (i_this->m034E == 2) {
MtxTrans(i_this->m11A8.x, i_this->m11A8.y + 7.5f, i_this->m11A8.z, 0);
cMtx_YrotM(*calc_mtx, i_this->m034A);
sp8.z = -12.5f;
MtxPosition(&sp8, &i_this->m0338);
i_this->m0344.y = i_this->m034A;
smoke_set_s(i_this, 6.0f);
i_this->m034A += 0x2000;
} else if (i_this->m034E == 3) {
cMtx_YrotM(*calc_mtx, i_this->current.angle.y);
cMtx_YrotM(*calc_mtx, i_this->m034A);
sp8.z = -37.5f;
MtxPosition(&sp8, &i_this->m0338);
i_this->m0344.y = i_this->m034A;
smoke_set_s(i_this, 2.0f);
i_this->m034A += 0x1FA0;
} else if (i_this->m034E == 4) {
if (i_this->m02F8 & 1) {
i_this->m0338 = i_this->dr.m100[14];
} else {
i_this->m0338 = i_this->dr.m100[15];
}
if (i_this->dr.m712 != 0) {
i_this->m0338.y = 512.5f;
} else {
i_this->m0338.y -= 12.5f;
}
i_this->m0344.y = cM_atan2s(i_this->speed.x, i_this->speed.z);
smoke_set_s(i_this, 1.0f);
}
} else {
i_this->m0338.y = i_this->dr.mSpawnY + 25000.0f;
}
if (i_this->m034C == 0) {
i_this->m0350.end();
i_this->m034F = 0;
}
}
/* 000011F0-00001454 .text nodeCallBack__FP7J3DNodei */
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
if (calcTiming == J3DNodeCBCalcTiming_In) {
J3DJoint* joint = (J3DJoint*)node;
s32 jntNo = joint->getJntNo();
int r28 = joint_check[jntNo];
J3DModel* model = j3dSys.getModel();
bk_class* i_this = (bk_class*)model->getUserArea();
if (i_this) {
MTXCopy(model->getAnmMtx(jntNo), *calc_mtx);
if (jntNo == 0x13) { // ago joint
mDoMtx_ZrotM(*calc_mtx, i_this->m11F4);
model->setAnmMtx(jntNo, *calc_mtx);
MTXCopy(*calc_mtx, J3DSys::mCurrentMtx);
} else {
mDoMtx_YrotM(*calc_mtx, i_this->dr.m088[r28].y);
mDoMtx_XrotM(*calc_mtx, i_this->dr.m088[r28].x);
mDoMtx_ZrotM(*calc_mtx, i_this->dr.m088[r28].z);
model->setAnmMtx(jntNo, *calc_mtx);
MTXCopy(*calc_mtx, J3DSys::mCurrentMtx);
cXyz offset;
offset.x = 0.0f;
offset.y = 0.0f;
offset.z = 0.0f;
cXyz sp08;
if (r28 == 0x00 || r28 == 0x01 || r28 == 0x02 || r28 == 0x03 || r28 == 0x04 ||
r28 == 0x05 || r28 == 0x06 || r28 == 0x07
) {
offset.x = 0.0f;
} else if (r28 == 0x12) {
offset.x = 200.0f;
offset.y = -100.0f;
MtxPosition(&offset, &sp08);
offset.x = 0.0f;
offset.y = 0.0f;
MtxPosition(&offset, &i_this->eyePos);
i_this->attention_info.position = i_this->eyePos;
i_this->attention_info.position.y += l_bkHIO.m024;
if (l_bkHIO.m009 == 0) {
i_this->m0330 = cM_atan2s(sp08.x - i_this->eyePos.x, sp08.z - i_this->eyePos.z);
} else {
i_this->m0330 = i_this->current.angle.y;
}
offset.x = 20.75f;
offset.y = 18.5f;
offset.z = 0.0f;
MtxPosition(&offset, &i_this->m116C);
offset.y = -45.0f;
}
MtxPosition(&offset, &i_this->dr.m100[r28]);
}
}
}
return TRUE;
}
/* 00001454-00001564 .text nodeCallBack_P__FP7J3DNodei */
static BOOL nodeCallBack_P(J3DNode* node, int calcTiming) {
if (calcTiming == J3DNodeCBCalcTiming_In) {
J3DJoint* joint = (J3DJoint*)node;
s32 jntNo = joint->getJntNo();
int r30 = joint_check[jntNo];
J3DModel* model = j3dSys.getModel();
bk_class* i_this = (bk_class*)model->getUserArea();
if (i_this) {
MTXCopy(model->getAnmMtx(jntNo), *calc_mtx);
cXyz offset;
offset.x = 0.0f;
offset.z = 0.0f;
offset.y = 0.0f;
if (r30 == 0x11) {
offset.x = 17.5f;
offset.y = -8.75f;
offset.z = 0.0f;
MtxPosition(&offset, &i_this->m1190);
} else if (r30 == 0x10) {
MtxPosition(&offset, &i_this->m119C);
} else if (r30 == 0x0E || r30 == 0x0F) {
offset.y = 25.0f;
} else {
offset.y = 0.0f;
}
MtxPosition(&offset, &i_this->dr.m100[r30]);
}
}
return TRUE;
}
/* 00001564-000019A4 .text search_check_draw__FP8bk_class */
static void search_check_draw(bk_class* i_this) {
if (l_bkHIO.m005 == 0) {
return;
}
cXyz sp14[0x10];
cXyz sp08(0.0f, 0.0f, l_bkHIO.m028);
int i;
s16 r26 = 0;
for (i = 0; i < 0x10; i++, r26 += 0x1000) {
MtxTrans(i_this->current.pos.x, 2.5f + i_this->dr.mSpawnY, i_this->current.pos.z, 0);
mDoMtx_YrotM(*calc_mtx, r26);
MtxPosition(&sp08, &sp14[0]);
mDoMtx_YrotM(*calc_mtx, 0x1000);
MtxPosition(&sp08, &sp14[1]);
}
sp08.z = l_bkHIO.m02C;
for (i = 0; i < 0x10; i++, r26 += 0x1000) {
MtxTrans(i_this->current.pos.x, 2.5f + i_this->dr.mSpawnY, i_this->current.pos.z, 0);
mDoMtx_YrotM(*calc_mtx, (int)r26);
MtxPosition(&sp08, &sp14[0]);
mDoMtx_YrotM(*calc_mtx, 0x1000);
MtxPosition(&sp08, &sp14[1]);
}
sp08.x = 0.0f;
sp08.z = l_bkHIO.m028;
MtxTrans(i_this->eyePos.x, i_this->eyePos.y, i_this->eyePos.z, 0);
MtxPush();
mDoMtx_YrotM(*calc_mtx, i_this->m0330 - l_bkHIO.m034);
sp08.y = l_bkHIO.m038;
MtxPosition(&sp08, &sp14[1]);
MtxPull();
MtxPush();
sp08.y = l_bkHIO.m038;
mDoMtx_YrotM(*calc_mtx, i_this->m0330 + l_bkHIO.m034);
MtxPosition(&sp08, &sp14[2]);
MtxPull();
MtxPush();
mDoMtx_YrotM(*calc_mtx, i_this->m0330 - l_bkHIO.m034);
sp08.y = -l_bkHIO.m038;
MtxPosition(&sp08, &sp14[4]);
MtxPull();
sp08.y = -l_bkHIO.m038;
mDoMtx_YrotM(*calc_mtx, i_this->m0330 + l_bkHIO.m034);
MtxPosition(&sp08, &sp14[5]);
sp14[0] = i_this->eyePos;
sp14[0].y += l_bkHIO.m038;
sp14[3] = i_this->eyePos;
sp14[3].y -= l_bkHIO.m038;
sp08.x = 0.0f;
sp08.z = l_bkHIO.m02C;
MtxTrans(i_this->eyePos.x, i_this->eyePos.y, i_this->eyePos.z, 0);
mDoMtx_YrotM(*calc_mtx, i_this->current.angle.y);
sp08.x = l_bkHIO.m03C;
sp08.y = l_bkHIO.m040;
sp08.z = l_bkHIO.m044;
MtxPosition(&sp08, &sp14[7]);
sp08.y = -l_bkHIO.m040;
MtxPosition(&sp08, &sp14[5]);
sp08.x = -l_bkHIO.m03C;
sp08.y = l_bkHIO.m040;
MtxPosition(&sp08, &sp14[6]);
sp08.y = -l_bkHIO.m040;
MtxPosition(&sp08, &sp14[4]);
sp08.x = l_bkHIO.m03C;
sp08.y = l_bkHIO.m040;
sp08.z = l_bkHIO.m048;
MtxPosition(&sp08, &sp14[1]);
sp08.y = -l_bkHIO.m040;
MtxPosition(&sp08, &sp14[3]);
sp08.x = -l_bkHIO.m03C;
sp08.y = l_bkHIO.m040;
MtxPosition(&sp08, &sp14[0]);
sp08.y = -l_bkHIO.m040;
MtxPosition(&sp08, &sp14[2]);
}
/* 000019A8-00001B88 .text br_draw__FP8bk_class */
static void br_draw(bk_class* i_this) {
if (i_this->m02F0 == 0) {
return;
}
if (REG6_S(3) != 0) {
return;
}
J3DModel* model = i_this->m02E8;
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
J3DMaterial* mat = model->getModelData()->getJointNodePointer(i)->getMesh();
while (mat) {
J3DShape* shape = mat->getShape();
if (i_this->m02F4 == 0) {
if (i == 1) {
shape->show();
} else {
shape->hide();
}
} else {
if (i == 2) {
shape->show();
} else {
shape->hide();
}
}
mat = mat->getNext();
}
}
MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(0x2C), *calc_mtx);
MtxTrans(150.0f + l_bkHIO.m100, REG8_F(1), REG8_F(2), 1);
s16 angleX = REG8_S(6) + 0x4000;
cMtx_XrotM(*calc_mtx, angleX);
s16 angleZ = REG8_S(7) + 0x4000;
cMtx_ZrotM(*calc_mtx, angleZ);
MtxScale(l_bkHIO.m018 * i_this->m02EC, l_bkHIO.m018, l_bkHIO.m018, 1);
model->setBaseTRMtx(*calc_mtx);
g_env_light.setLightTevColorType(model, &i_this->tevStr);
mDoExt_modelUpdateDL(model);
}
/* 00001B88-00001CD0 .text daBk_shadowDraw__FP8bk_class */
static void daBk_shadowDraw(bk_class* i_this) {
J3DModel* model = i_this->mpMorf->getModel();
if (!fopAcM_checkCarryNow(i_this)) {
cXyz shadowPos(
i_this->current.pos.x,
i_this->current.pos.y + 150.0f + REG8_F(18),
i_this->current.pos.z
);
f32 temp = 800.0f + REG8_F(19);
f32 shadowSize = 40.0f + REG8_F(17);
i_this->mShadowId = dComIfGd_setShadow(
i_this->mShadowId, 1, model, &shadowPos, temp, shadowSize,
i_this->current.pos.y, i_this->dr.mAcch.GetGroundH(),
i_this->dr.mAcch.m_gnd, &i_this->tevStr
);
}
if (i_this->mShadowId) {
daBoko_c* boko = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (boko) {
dComIfGd_addRealShadow(i_this->mShadowId, boko->model);
}
if (i_this->m02D4) {
dComIfGd_addRealShadow(i_this->mShadowId, i_this->m02D0);
}
if (i_this->m02DC) {
dComIfGd_addRealShadow(i_this->mShadowId, i_this->m02D8);
}
}
}
/* 00001CD0-00001F60 .text daBk_Draw__FP8bk_class */
static BOOL daBk_Draw(bk_class* i_this) {
J3DModel* model = i_this->mpMorf->getModel();
if (i_this->m02B7 != 0xFF && i_this->mType == 6 && dComIfGs_isSwitch(i_this->m02B7, dComIfGp_roomControl_getStayNo())) {
return TRUE;
}
if (i_this->m02BA != 0 || i_this->mType == 8 || i_this->m121C != 0 || i_this->m02DE != 0) {
return TRUE;
}
g_env_light.setLightTevColorType(model, &i_this->tevStr);
if (i_this->mEnemyIce.mFreezeTimer > 20) {
dMat_control_c::iceEntryDL(i_this->mpMorf, -1, NULL);
daBk_shadowDraw(i_this);
return TRUE;
}
br_draw(i_this);
search_check_draw(i_this);
J3DModelData* modelData = model->getModelData();
J3DJoint* rootJoint = modelData->getJointNodePointer(0x00);
J3DShape* eyeShape = modelData->getMaterialNodePointer(0x00)->getShape();
J3DShape* hatShape = modelData->getMaterialNodePointer(0x01)->getShape();
J3DShape* bodyShape = modelData->getMaterialNodePointer(0x02)->getShape();
eyeShape->hide();
i_this->m02C4->entry(model->getModelData());
if (i_this->m1230) {
i_this->mpMorf->entryDL(i_this->m1230);
} else {
i_this->mpMorf->entryDL();
}
dComIfGd_setListMaskOff();
eyeShape->show();
model->getMatPacket(0x00)->unlock();
hatShape->hide();
bodyShape->hide();
rootJoint->entryIn();
hatShape->show();
bodyShape->show();
dComIfGd_setList();
daBk_shadowDraw(i_this);
if (i_this->m02D4 != 0) {
g_env_light.setLightTevColorType(i_this->m02D0, &i_this->tevStr);
mDoExt_modelUpdateDL(i_this->m02D0);
}
if (i_this->m02DC != 0) {
g_env_light.setLightTevColorType(i_this->m02D8, &i_this->tevStr);
mDoExt_modelUpdateDL(i_this->m02D8);
}
dSnap_RegistFig(DSNAP_TYPE_BK, i_this, 1.0f, 1.0f, 1.0f);
return TRUE;
}
/* 00001F60-00002404 .text way_pos_check__FP8bk_classP4cXyz */
static void way_pos_check(bk_class* i_this, cXyz* r31) {
fopAc_ac_c* i_actor = i_this;
dBgS_LinChk linChk;
dBgS_GndChk gndChk;
cXyz sp2C;
cXyz sp20;
cXyz sp14;
cXyz sp08;
sp2C.x = 0.0f;
sp2C.y = 50.0f;
sp14 = i_this->current.pos;
sp14.y += 50.0f;
for (int i = 0; i < 100; i++) {
sp2C.z = 300.0f + cM_rndF(200.0f);
MtxRotY(cM_rndF(M_PI*2), 0);
MtxPosition(&sp2C, &sp20);
sp08.x = i_this->current.pos.x + sp20.x;
sp08.y = i_this->current.pos.y + sp20.y;
sp08.z = i_this->current.pos.z + sp20.z;
*r31 = sp08;
linChk.Set(&sp14, &sp08, i_actor);
if (!dComIfG_Bgsp()->LineCross(&linChk)) {
gndChk.SetPos(&sp08);
if (i_this->dr.mAcch.GetGroundH() - dComIfG_Bgsp()->GroundCross(&gndChk) < 200.0f) {
break;
}
}
}
}
/* 0000259C-00002864 .text ground_4_check__FP8bk_classisf */
static u8 ground_4_check(bk_class* i_this, int r18, s16 r20, f32 f29) {
static f32 xad[] = {
0.0f, 0.0f, 1.0f, -1.0f,
};
static f32 zad[] = {
1.0f, -1.0f, 0.0f, 0.0f,
};
static u8 check_bit[] = {
0x01, 0x02, 0x04, 0x08,
};
dBgS_GndChk gndChk;
int i;
u8 r19 = 0;
cMtx_YrotS(*calc_mtx, r20);
cXyz sp14;
sp14.y = 100.0f;
for (i = 0; i < r18; i++) {
sp14.x = xad[i] * f29;
sp14.z = zad[i] * f29;
cXyz sp8;
MtxPosition(&sp14, &sp8);
sp8 += i_this->current.pos;
gndChk.SetPos(&sp8);
sp8.y = dComIfG_Bgsp()->GroundCross(&gndChk);
if (sp8.y == -1e9f) {
sp8.y = 1e9f;
}
if (i_this->dr.mAcch.GetGroundH() - sp8.y > 200.0f) {
r19 |= check_bit[i];
}
}
return r19;
}
/* 00002864-00002C4C .text daBk_other_bg_check__FP8bk_classP10fopAc_ac_c */
static BOOL daBk_other_bg_check(bk_class* i_this, fopAc_ac_c* r23) {
fopAc_ac_c* i_actor = i_this;
dBgS_LinChk linChk;
cXyz sp14;
cXyz sp08;
if (r23) {
sp08 = r23->current.pos;
sp08.y += 50.0f;
sp14 = i_actor->eyePos;
linChk.Set(&sp14, &sp08, i_actor);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
return TRUE;
} else {
return FALSE;
}
}
return TRUE;
}
static fopAc_ac_c* target_info[10];
static s32 target_info_count;
/* 00002C4C-00002CD4 .text s_w_sub__FPvPv */
static void* s_w_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_BOKO) {
daBoko_c* boko = (daBoko_c*)param_1;
// TODO: enum for boko type
if (fopAcM_GetParam(boko) != 4 && !fopAcM_checkCarryNow(boko)) {
if (target_info_count < (s32)ARRAY_SIZE(target_info)) {
target_info[target_info_count] = boko;
target_info_count++;
}
}
}
return NULL;
}
/* 00002CD4-00002FB0 .text search_wepon__FP8bk_class */
static fpc_ProcID search_wepon(bk_class* i_this) {
target_info_count = 0;
for (int i = 0; i < ARRAY_SIZE(target_info); i++) {
target_info[i] = NULL;
}
fpcM_Search(&s_w_sub, i_this);
f32 f29 = 50.0f;
if (target_info_count != 0) {
fopAc_ac_c* r25;
int i = 0;
while (i < target_info_count) {
r25 = target_info[i];
cXyz sp18;
sp18.x = r25->current.pos.x - i_this->eyePos.x;
sp18.y = 50.0f + r25->current.pos.y - i_this->eyePos.y;
sp18.z = r25->current.pos.z - i_this->eyePos.z;
f32 f4 = std::sqrtf(sp18.x*sp18.x + sp18.z*sp18.z);
if (f4 < f29 && !daBk_other_bg_check(i_this, r25)) {
if (std::fabsf(r25->current.pos.y + 50.0f - i_this->eyePos.y) <= l_bkHIO.m038) {
s16 angleDiff = i_this->m0330 - cM_atan2s(sp18.x, sp18.z);
if (angleDiff < 0) {
angleDiff = -angleDiff;
}
if ((u16)angleDiff < 0x1800) {
return fopAcM_GetID(r25);
}
cMtx_YrotS(*calc_mtx, -i_this->current.angle.y);
cXyz sp0C;
MtxPosition(&sp18, &sp0C);
if (std::fabsf(sp0C.x) < l_bkHIO.m03C &&
std::fabsf(sp0C.y) < l_bkHIO.m040 &&
sp0C.z > l_bkHIO.m048 &&
sp0C.z < l_bkHIO.m044
) {
return fopAcM_GetID(r25);
}
}
}
i++;
if (i == target_info_count) {
i = 0;
f29 += 50.0f;
if (f29 > 1500.0f) {
return fpcM_ERROR_PROCESS_ID_e;
}
}
}
} else {
return fpcM_ERROR_PROCESS_ID_e;
}
return fpcM_ERROR_PROCESS_ID_e;
}
/* 00002FB0-0000302C .text s_b_sub__FPvPv */
static void* s_b_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_BOMB) {
daBomb_c* bomb = (daBomb_c*)param_1;
// TODO: why is it checking the bomb's params as a single field instead of just one param? bug?
if (fopAcM_GetParam(bomb) != 0) {
if (target_info_count < (s32)ARRAY_SIZE(target_info)) {
target_info[target_info_count] = bomb;
target_info_count++;
}
}
}
return NULL;
}
/* 0000302C-000033BC .text search_bomb__FP8bk_classi */
static fopAc_ac_c* search_bomb(bk_class* i_this, BOOL r26) {
if (!(i_this->m1208 & 0x0200)) {
return NULL;
}
target_info_count = 0;
for (int i = 0; i < ARRAY_SIZE(target_info); i++) {
target_info[i] = NULL;
}
fpcM_Search(&s_b_sub, i_this);
f32 f29 = 50.0f;
if (target_info_count != 0) {
fopAc_ac_c* r24;
int i = 0;
while (i < target_info_count) {
r24 = target_info[i];
cXyz sp28;
sp28.x = r24->current.pos.x - i_this->eyePos.x;
sp28.y = 50.0f + r24->current.pos.y - i_this->eyePos.y;
sp28.z = r24->current.pos.z - i_this->eyePos.z;
cXyz sp1C;
sp1C.x = r24->current.pos.x - i_this->current.pos.x;
sp1C.z = r24->current.pos.z - i_this->current.pos.z;
f32 f0 = std::sqrtf(sp28.x*sp28.x + sp28.z*sp28.z);
f32 f5 = std::sqrtf(sp1C.x*sp1C.x + sp1C.z*sp1C.z);
if (f0 < f29 && !(f5 > 30.0f + i_this->mPlayerDistance) &&
!(daBk_other_bg_check(i_this, r24) && r26)
) {
if (r26) {
if (std::fabsf(r24->current.pos.y + 50.0f - i_this->eyePos.y) <= l_bkHIO.m038) {
s16 angleDiff = i_this->m0330 - cM_atan2s(sp28.x, sp28.z);
if (angleDiff < 0) {
angleDiff = -angleDiff;
}
if ((u16)angleDiff < l_bkHIO.m034) {
return r24;
}
cMtx_YrotS(*calc_mtx, -i_this->current.angle.y);
cXyz sp10;
MtxPosition(&sp28, &sp10);
if (std::fabsf(sp10.x) < l_bkHIO.m03C &&
std::fabsf(sp10.y) < l_bkHIO.m040 &&
sp10.z > l_bkHIO.m048 &&
sp10.z < l_bkHIO.m044
) {
return r24;
}
}
} else {
return r24;
}
}
i++;
if (i == target_info_count) {
i = 0;
f29 += 50.0f;
if (f29 > 1500.0f) {
return NULL;
}
}
}
} else {
return NULL;
}
return NULL;
}
/* 000033BC-00003438 .text daBk_wepon_view_check__FP8bk_class */
static BOOL daBk_wepon_view_check(bk_class* i_this) {
if (i_this->m02CC != 0) {
return FALSE;
}
i_this->m1200 = search_wepon(i_this);
if (i_this->m1200 != fpcM_ERROR_PROCESS_ID_e) {
if (fopAcM_SearchByID(i_this->m1200)) {
return TRUE;
}
}
return FALSE;
}
/* 00003438-00003478 .text daBk_bomb_view_check__FP8bk_class */
static BOOL daBk_bomb_view_check(bk_class* i_this) {
i_this->m11F8 = search_bomb(i_this, 1);
return i_this->m11F8 != NULL ? TRUE : FALSE;
}
/* 00003478-000034B8 .text daBk_bomb_check__FP8bk_class */
static BOOL daBk_bomb_check(bk_class* i_this) {
i_this->m11F8 = search_bomb(i_this, 0);
if (i_this->m11F8) {
return TRUE;
}
return FALSE;
}
/* 000034B8-0000385C .text daBk_player_bg_check__FP8bk_classP4cXyz */
static BOOL daBk_player_bg_check(bk_class* i_this, cXyz* r22) {
fopAc_ac_c* i_actor = i_this;
daPy_py_c* player = daPy_getPlayerActorClass();
if (search_sp != 0 || i_this->mType == 0xA) {
return FALSE;
}
if (i_this->dr.m713 == 0 && std::fabsf(player->speedF) < 0.1f && player->checkGrabWear()) {
return TRUE;
}
dBgS_LinChk linChk;
cXyz sp14;
cXyz sp08;
sp08 = *r22;
sp08.y += 75.0f;
sp14 = i_this->eyePos;
linChk.Set(&sp14, &sp08, i_actor);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
i_this->dr.m713 = 0;
return TRUE;
}
return FALSE;
}
/* 0000385C-00003A18 .text daBk_player_view_check__FP8bk_classP4cXyzss */
static BOOL daBk_player_view_check(bk_class* i_this, cXyz* r30, s16 r27, s16 r31) {
daPy_py_c* player = daPy_getPlayerActorClass();
if (search_sp != 0 || i_this->mType == 0xA) {
return TRUE;
}
if (daBk_player_bg_check(i_this, r30)) {
return FALSE;
}
if (std::fabsf(player->current.pos.y + 50.0f - i_this->eyePos.y) > l_bkHIO.m038) {
return FALSE;
}
s16 angleDiff = i_this->m0330 - r27;
if (angleDiff < 0) {
angleDiff = -angleDiff;
}
if ((u16)angleDiff < r31) {
i_this->dr.m713 = 1;
return TRUE;
}
cMtx_YrotS(*calc_mtx, -i_this->current.angle.y);
cXyz sp14;
sp14.x = r30->x - i_this->current.pos.x;
sp14.y = r30->y - i_this->current.pos.y;
sp14.z = r30->z - i_this->current.pos.z;
cXyz sp08;
MtxPosition(& sp14, &sp08);
if (std::fabsf(sp08.x) < l_bkHIO.m03C &&
std::fabsf(sp08.y) < l_bkHIO.m040 &&
sp08.z > l_bkHIO.m048 &&
sp08.z < l_bkHIO.m044
) {
i_this->dr.m713 = 1;
return TRUE;
} else {
i_this->dr.m713 = 0;
return FALSE;
}
}
/* 00003A18-00003A5C .text daBk_player_way_check__FP8bk_class */
static BOOL daBk_player_way_check(bk_class* i_this) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
s16 angleDiff = i_this->current.angle.y - player->shape_angle.y;
if (angleDiff < 0) {
angleDiff = -angleDiff;
}
if ((u16)angleDiff < 0x4000) {
return FALSE;
}
return TRUE;
}
/* 00003A5C-00003B2C .text wait_set__FP8bk_class */
static void wait_set(bk_class* i_this) {
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
anm_init(i_this, BK_BCK_BK_KYORO1, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO1);
} else if (i_this->dr.mState >= 4) {
anm_init(i_this, BK_BCK_BK_KYORO1, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO1);
} else {
anm_init(i_this, BK_BCK_BK_KYORO2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO2);
}
i_this->m0300[1] = 40.0f + cM_rndF(60.0f);
}
/* 00003B2C-00003C34 .text walk_set__FP8bk_class */
static void walk_set(bk_class* i_this) {
if (i_this->m0B30 != 0 || i_this->m1214 != 0) {
anm_init(i_this, BK_BCK_BK_WALK, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK);
} else if (i_this->m11F3 == 0) {
anm_init(i_this, BK_BCK_BK_NIGERU, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_NIGERU);
} else {
anm_init(i_this, BK_BCK_BK_WALK, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK);
}
if (i_this->m0B30 == 0 && i_this->m121F != 0) {
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_LOST_BOKO, 0);
i_this->m121F = 0;
}
}
/* 00003C34-00003C74 .text fight_run_set__FP8bk_class */
static void fight_run_set(bk_class* i_this) {
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, l_bkHIO.m070, BK_BAS_BK_RUN);
}
/* 00003C74-00004104 .text path_check__FP8bk_classUc */
static void path_check(bk_class* i_this, u8 r19) {
fopAc_ac_c* i_actor = i_this;
if (i_this->ppd == NULL) {
return;
}
if (i_this->m0B30 == 0 && i_this->m11F3 == 0 && i_this->mType != 4 && i_this->mType != 10 && i_this->mType != 6) {
return;
}
u8 sp90[0x108];
dBgS_LinChk linChk;
cXyz sp18;
sp18.set(i_this->current.pos);
sp18.y += 100.0f;
cXyz spc;
dPath__Point* pnt = i_this->ppd->mpPnt;
for (int i = 0; i < i_this->ppd->m_num; i++, pnt++) {
spc.x = pnt->mPos.x;
spc.y = pnt->mPos.y + 100.0f;
spc.z = pnt->mPos.z;
linChk.Set(&sp18, &spc, i_actor);
if (!dComIfG_Bgsp()->LineCross(&linChk)) {
sp90[i] = 1;
} else {
sp90[i] = 0;
}
}
f32 f0 = 0.0f;
bool r6 = false;
for (int i2 = 0; i2 < 100; i2++, f0 += 50.0f) {
pnt = i_this->ppd->mpPnt;
for (int j = 0; j < i_this->ppd->m_num; j++, pnt++) {
if (sp90[j] == 0) {
continue;
}
f32 distX = i_this->current.pos.x - pnt->mPos.x;
f32 distY = i_this->current.pos.y - pnt->mPos.y;
f32 distZ = i_this->current.pos.z - pnt->mPos.z;
if (std::sqrtf(distX*distX + distY*distY + distZ*distZ) < f0) {
if (r19) {
i_this->m1216 = j;
} else {
i_this->m1216 = j - i_this->m1217;
if (i_this->m1216 >= (s8)i_this->ppd->m_num) {
i_this->m1216 = i_this->ppd->m_num;
} else if (i_this->m1216 < 0) {
i_this->m1216 = 0;
}
}
r6 = true;
break;
}
}
if (r6) {
break;
}
}
if (!r6) {
i_this->m1215 = 0;
} else {
i_this->m1215 = i_this->m02B6 + 1;
}
}
/* 00004104-0000488C .text jyunkai__FP8bk_class */
static void jyunkai(bk_class* i_this) {
fopAc_ac_c* i_actor = i_this;
if (i_this->mType == 4 || i_this->mType == 0xA) {
i_this->dr.mState = 1;
i_this->dr.m004 = 50;
return;
} else if (i_this->mType == 6) {
i_this->dr.mState = 2;
i_this->dr.m004 = 50;
return;
} else if (i_this->mType == 9) {
i_this->dr.mState = 3;
i_this->dr.m004 = 0;
i_this->m0300[2] = 0;
i_this->m120C = 0;
i_this->m1210 = 0;
path_check(i_this, 0);
return;
}
cXyz sp10;
switch (i_this->dr.m004) {
case 0:
walk_set(i_this);
// Fall-through
case -1:
i_this->dr.m004 = 1;
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
if (i_this->m1215 != 0) {
i_this->m1216 += i_this->m1217;
if (i_this->m1216 >= (s8)i_this->ppd->m_num) {
if (i_this->ppd->mLoops & 1) {
i_this->m1216 = 0;
} else {
i_this->m1217 = -1;
i_this->m1216 = i_this->ppd->m_num - 2;
}
if ((i_this->ppd->mNextPathId & 0xFFFF) != 0xFFFF) {
i_this->ppd = dPath_GetRoomPath(i_this->ppd->mNextPathId, fopAcM_GetRoomNo(i_this));
JUT_ASSERT(2924, i_this->ppd != NULL);
}
} else if (i_this->m1216 < 0) {
i_this->m1217 = 1;
i_this->m1216 = 1;
}
dPath__Point* point = &i_this->ppd->mpPnt[i_this->m1216];
i_this->m0320 = point->mPos;
} else {
way_pos_check(i_this, &i_this->m0320);
}
} else {
way_pos_check(i_this, &i_this->m0320);
i_this->m0300[1] = 30.0f + cM_rndF(25.0f);
}
i_this->m0300[2] = 30;
// Fall-through
case 1:
s16 r29;
f32 f31;
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
r29 = 0x400;
f31 = l_bkHIO.m04C;
} else {
r29 = 0x1000;
f31 = l_bkHIO.m050;
}
sp10.x = i_this->m0320.x - i_this->current.pos.x;
sp10.z = i_this->m0320.z - i_this->current.pos.z;
i_this->dr.m4D0 = cM_atan2s(sp10.x, sp10.z);
if (i_this->m1215 != 0 && (i_this->m0B30 != 0 || i_this->m11F3 != 0)) {
if (std::sqrtf(sp10.x*sp10.x + sp10.z*sp10.z) < f31 * 0.25f * 2.0f) {
if (i_this->ppd->mpPnt[i_this->m1216].mArg3 == 3) {
wait_set(i_this);
i_this->dr.m004 = 2;
} else {
i_this->dr.m004 = -1;
}
}
} else if (std::sqrtf(sp10.x*sp10.x + sp10.z*sp10.z) < f31 * 0.25f * 2.0f ||
(
i_this->m0300[2] == 0 && (
i_this->dr.mAcch.ChkWallHit() ||
ground_4_check(i_this, 1, i_this->current.angle.y, 200.0f)
)
)
) {
wait_set(i_this);
i_this->dr.m004 = 2;
}
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, r29);
cLib_addCalc2(&i_this->speedF, f31, 1.0f, 5.0f);
break;
case 2:
i_this->speedF = 0.0f;
if (i_this->m0B30 == 0 && i_this->m11F3 == 0) {
int frame = i_this->mpMorf->getFrame();
if ((frame == 0xB || frame == 0x19) && cM_rndF(1.0f) < 0.5f) {
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_SEARCH, 0);
}
}
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 0;
if (i_this->m0B30 == 0 && i_this->m11F3 == 0 && i_this->m030A == 0) {
i_this->m11F3 = 1;
}
}
break;
case 3:
i_this->speedF = 0.0f;
int frame = i_this->mpMorf->getFrame();
if (frame == 3 || frame == 0x35) {
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_SEARCH, 0);
}
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 0;
}
break;
}
s32 r3 = fopAcM_otoCheck(i_actor, 1000.0f);
r3 += search_sp;
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
if (r3 != 0 ||
(
i_this->mPlayerDistance < l_bkHIO.m028 &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
)
) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
}
} else if (i_this->m11F3 == 0 && i_this->dr.m004 == 2) {
int frame = i_this->mpMorf->getFrame();
if ((frame == 0xB || frame == 0x19) && cM_rndF(1.0f) < 0.5f) {
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_SEARCH_BOKO, 0);
}
}
if (i_this->m0B30 == 0 && daBk_wepon_view_check(i_this)) {
i_this->dr.mState = 0xC;
i_this->dr.m004 = -1;
}
if (daBk_bomb_view_check(i_this)) {
i_this->dr.mState = 9;
i_this->dr.m004 = 0;
}
}
/* 0000488C-000048E4 .text ken_s_sub__FPvPv */
static void* ken_s_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_ITEM) {
daItem_c* item = (daItem_c*)param_1;
if (item->getItemNo() == dItem_DROPPED_SWORD_e) {
return param_1;
}
}
return NULL;
}
/* 000048E4-000053E0 .text stand__FP8bk_class */
static void stand(bk_class* i_this) {
daPy_py_c* player = daPy_getPlayerActorClass();
i_this->dr.m710 = 0;
bool r28 = false;
bool r27 = false;
s32 r31 = fopAcM_otoCheck(i_this, 1000.0f);
cXyz sp28;
switch (i_this->dr.m004) {
case -0x14:
fopAcM_OnStatus(i_this, fopAcStts_UNK4000_e);
anm_init(i_this, BK_BCK_BK_WAIT, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WAIT);
i_this->dr.m004 = -0x13;
i_this->m0300[1] = 20;
i_this->m02B5 = 0;
// Fall-through
case -0x13:
if (i_this->m0300[1] == 0) {
ken = (fopAc_ac_c*)fpcM_Search(ken_s_sub, i_this);
if (ken) {
sp28 = player->current.pos - ken->current.pos;
if (sp28.abs() < 800.0f) {
i_this->m1234 = 1;
i_this->dr.m004 = -0x12;
}
} else {
i_this->dr.m004 = 0x01;
break;
}
}
r27 = true;
break;
case 0x00:
i_this->m0300[1] = l_bkHIO.m104 + cM_rndF(l_bkHIO.m106 - l_bkHIO.m104);
// Fall-through
case -0x01:
i_this->dr.m004 = 1;
if (i_this->m02DC != 0) {
if (cM_rndF(1.0f) < 0.5f) {
anm_init(i_this, BK_BCK_BK_NOZOKU, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
i_this->m0300[1] = 200.0f + cM_rndF(200.0f);
} else {
anm_init(i_this, BK_BCK_BK_TATAKU, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
i_this->m0300[1] = 100.0f + cM_rndF(100.0f);
}
} else {
anm_init(i_this, BK_BCK_BK_WAIT, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WAIT);
}
i_this->m121E++;
// Fall-through
case 0x01:
cLib_addCalc2(&i_this->current.pos.x, i_this->home.pos.x, 0.5f, i_this->speed.x * 0.25f);
cLib_addCalc2(&i_this->current.pos.z, i_this->home.pos.z, 0.5f, i_this->speed.z * 0.25f);
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->home.angle.y, 2, 0x800);
i_this->speedF = 0.0f;
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_NOBI, 10.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_NOBI);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_NOBI, 0);
if (i_this->m121E < 3) {
i_this->dr.m004 = 2;
} else {
i_this->dr.m004 = 3;
i_this->m121E = 0;
}
}
break;
case 0x02:
r28 = true;
i_this->m02CA = 2;
if (i_this->mpMorf->isStop()) {
i_this->dr.m004 = 0;
}
break;
case 0x03:
r28 = true;
i_this->m02CA = 2;
if (i_this->mpMorf->isStop()) {
anm_init(i_this, BK_BCK_BK_SLEEP, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_SLEEP);
i_this->m0300[1] = l_bkHIO.m108 + cM_rndF(l_bkHIO.m10A - l_bkHIO.m108);
i_this->dr.m004 += 1;
}
break;
case 0x04:
r28 = true;
i_this->m02CA = 2;
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_NOBI, 10.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_NOBI);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_NOBI, 0);
i_this->dr.m004 = 2;
}
break;
case 0x0A:
if (i_this->m0300[1] == 30) {
anm_init(i_this, BK_BCK_BK_BIKKURI, 3.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
}
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_KYORO2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO2);
i_this->dr.m004 = 0xB;
i_this->m0300[3] = 30.0f + cM_rndF(30.0f);
}
break;
case 0x0B:
if (i_this->m0300[3] == 0) {
i_this->dr.m004 = 0;
}
break;
case 0x14:
if (i_this->m0300[1] < 10) {
i_this->dr.m710 = 1;
}
if (i_this->m0300[1] == 0) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
return;
}
break;
case 0x32:
anm_init(i_this, BK_BCK_BK_KYORO1, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO1);
i_this->dr.m004 += 1;
i_this->m0300[1] = 50;
// Fall-through
case 0x33:
i_this->speedF = 0.0f;
if (i_this->m0300[1] > 25) {
r28 = true;
}
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_RUN);
i_this->dr.m004 += 1;
i_this->m0300[2] = 60;
}
break;
case 0x34:
sp28 = i_this->home.pos - i_this->current.pos;
i_this->dr.m4D0 = cM_atan2s(sp28.x, sp28.z);
if (std::sqrtf(sp28.x*sp28.x + sp28.z*sp28.z) < l_bkHIO.m054 * 0.25f * 5.0f) {
i_this->dr.m004 = 0;
}
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, 0x1000);
cLib_addCalc2(&i_this->speedF, l_bkHIO.m054, 1.0f, 5.0f);
if (i_this->dr.mAcch.ChkGroundHit() && i_this->dr.mAcch.ChkWallHit()) {
if (i_this->m02DC != 0) {
i_this->dr.m004 = 0x3C;
i_this->m0300[2] = 20;
break;
}
i_this->speed.y = 100.0f + REG0_F(16);
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
i_this->dr.m004 = 0x35;
}
break;
case 0x35:
i_this->speedF = 0.5f * l_bkHIO.m054;
if (!i_this->dr.mAcch.ChkGroundHit()) {
break;
}
anm_init(i_this, BK_BCK_BK_JUMP2, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->dr.m004 += 1;
break;
case 0x36:
i_this->speedF = 0.0f;
if (i_this->mpMorf->isStop()) {
i_this->dr.m004 = 0x33;
}
break;
case 0x3C:
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0 + 0x4000, 4, 0x1000);
cLib_addCalc2(&i_this->speedF, l_bkHIO.m054, 1.0f, 5.0f);
if (i_this->m0300[2] == 0) {
i_this->dr.m004 = 0x34;
}
break;
}
if (r27) {
return;
}
if (i_this->dr.m004 < 10 && r31 != 0) {
i_this->dr.m004 = 10;
i_this->m0300[1] = 45.0f + cM_rndF(10.0f);
}
if (!r28 && i_this->m0300[2] == 0 && i_this->dr.m004 != 0x14) {
f32 f1;
if (i_this->m02B5 != 0xFF) {
f1 = i_this->m02B5 * 10.0f;
} else {
f1 = 500.0f;
}
if (i_this->mPlayerDistance < f1 &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
) {
if (i_this->dr.m004 >= 0x32) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
} else {
i_this->dr.m004 = 0x14;
anm_init(i_this, BK_BCK_BK_BIKKURI, 3.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
i_this->m0300[1] = 30;
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_FOUND_LINK, 0);
}
}
if (daBk_bomb_view_check(i_this)) {
i_this->dr.mState = 9;
i_this->dr.m004 = 0;
}
}
if (i_this->m0B30 == 0 && daBk_wepon_view_check(i_this)) {
i_this->dr.mState = 0xC;
i_this->dr.m004 = -1;
}
}
/* 000053E0-000054E0 .text s_s_sub__FPvPv */
static void* s_s_sub(void* r29, void* r30) {
bk_class* i_this = (bk_class*)r30;
if (fopAc_IsActor(r29) && fopAcM_GetName(r29) == PROC_OBJ_SEARCH) {
daObj_Search::Act_c* search = (daObj_Search::Act_c*)r29;
cXyz sp18 = i_this->home.pos - search->current.pos;
if (sp18.abs() < 600.0f) {
return r29;
}
}
return NULL;
}
/* 000054E0-00005D40 .text stand2__FP8bk_class */
static void stand2(bk_class* i_this) {
i_this->dr.m710 = 0;
s32 r31 = fopAcM_otoCheck(i_this, 1000.0f);
if (i_this->mpSearchLight == NULL) {
i_this->mpSearchLight = (daObj_Search::Act_c*)fpcM_Search(s_s_sub, i_this);
if (i_this->mpSearchLight != NULL) {
i_this->mpSearchLight->setChildId(fpcM_GetID(i_this));
} else {
return;
}
}
cXyz sp24;
if (i_this->mpSearchLight != NULL) {
cMtx_YrotS(*calc_mtx, i_this->mpSearchLight->current.angle.y);
sp24.x = REG8_F(11) + 320.0f;
sp24.y = REG8_F(12) + 114.0f;
sp24.z = REG8_F(13) + -55.0f;
MtxPosition(&sp24, &i_this->home.pos);
i_this->home.pos += i_this->mpSearchLight->current.pos;
i_this->home.angle.y = i_this->mpSearchLight->current.angle.y + REG8_S(4);
}
switch (i_this->dr.m004) {
case 0x00:
i_this->dr.m004 = 1;
// Fall-through
case 0x01: {
if (i_this->mpSearchLight != NULL) {
i_this->mpSearchLight->setBkControl(true);
}
i_this->dr.m710 = 6;
if (i_this->m0300[3] == 0) {
i_this->m0300[3] = cM_rndF(150.0f) + 80.0f;
i_this->m1212 = cM_rndF(30.0f);
} else if (i_this->m0300[3] < (s16)(i_this->m1212 + 30)) {
i_this->dr.m71A = 10000;
i_this->dr.m718 = -10000;
} else if (i_this->m0300[4] == 0) {
i_this->m0300[4] = cM_rndF(30.0f) + 10.0f;
i_this->dr.m71A = 3000.0f - cM_rndF(10000.0f);
i_this->dr.m718 = -cM_rndF(2000.0f);
}
i_this->m0B7B = 1;
s16 r28 = i_this->m1224 - i_this->m1228;
if (i_this->m122A >= 0 && r28 < 0) {
anm_init(i_this, BK_BCK_BK_MIGIROT, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
}
if (i_this->m122A <= 0 && r28 > 0) {
anm_init(i_this, BK_BCK_BK_HIDARIROT, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
}
i_this->m122A = r28;
i_this->m1228 = i_this->m1224;
cLib_addCalc2(&i_this->current.pos.x, i_this->home.pos.x, 0.5f, i_this->speed.x * 0.25f + 10.0f);
cLib_addCalc2(&i_this->current.pos.z, i_this->home.pos.z, 0.5f, i_this->speed.z * 0.25f + 10.0f);
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->home.angle.y, 2, 0x800);
i_this->speedF = 0.0f;
break;
}
case 0x0A:
i_this->m0B7B = 1;
if (i_this->m0300[1] == 30) {
anm_init(i_this, BK_BCK_BK_BIKKURI, 3.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
}
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_KYORO2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO2);
i_this->dr.m004 = 0xB;
i_this->m0300[3] = 30.0f + cM_rndF(30.0f);
}
break;
case 0x0B:
if (i_this->m0300[3] == 0) {
i_this->dr.m004 = 0;
}
break;
case 0x14:
i_this->m0B7B = 1;
if (i_this->m0300[1] < 10) {
i_this->dr.m710 = 1;
}
if (i_this->m0300[1] == 0) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
return;
}
break;
case 0x32:
anm_init(i_this, BK_BCK_BK_KYORO1, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO1);
i_this->dr.m004 += 1;
i_this->m0300[1] = 50;
// Fall-through
case 0x33:
i_this->speedF = 0.0f;
if (i_this->m0300[1] == 0) {
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_RUN);
i_this->dr.m004 += 1;
path_check(i_this, 1);
if (i_this->m1216 >= 4) {
i_this->m1217 = 1;
} else {
i_this->m1217 = -1;
}
i_this->m0300[2] = 60;
}
break;
case 0x34: {
dPath__Point* pnt = &i_this->ppd->mpPnt[i_this->m1216];
i_this->m0320 = pnt->mPos;
sp24 = i_this->m0320 - i_this->current.pos;
goto temp_568;
}
case 0x3C:
sp24 = i_this->home.pos - i_this->current.pos;
temp_568:
i_this->dr.m4D0 = cM_atan2s(sp24.x, sp24.z);
if (std::sqrtf(sp24.x*sp24.x + sp24.z*sp24.z) < l_bkHIO.m054 * 0.25f * 5.0f) {
if (i_this->dr.m004 == 0x3C) {
i_this->dr.m004 = 0;
} else if (i_this->m1216 == 0) {
i_this->dr.m004 = 0x3C;
} else {
i_this->m1216 += i_this->m1217;
if (i_this->m1216 >= (s8)i_this->ppd->m_num) {
i_this->m1216 = 0;
} else if (i_this->m1216 < 0) {
i_this->m1216 = i_this->ppd->m_num - 1;
}
}
}
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, 0x1000);
cLib_addCalc2(&i_this->speedF, l_bkHIO.m054, 1.0f, 5.0f);
break;
}
if (i_this->dr.m004 < 0x0A && r31 != 0) {
i_this->dr.m004 = 0x0A;
i_this->m0300[1] = cM_rndF(10.0f) + 45.0f;
}
if (i_this->m0300[2] == 0 && i_this->dr.m004 != 0x14) {
f32 f1;
if (i_this->m02B5 != 0xFF) {
f1 = i_this->m02B5 * 10.0f;
} else {
f1 = 500.0f;
}
if (i_this->mPlayerDistance < f1 &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
) {
if (i_this->dr.m004 >= 0x32) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
} else {
i_this->dr.m004 = 0x14;
anm_init(i_this, BK_BCK_BK_BIKKURI, 3.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
i_this->m0300[1] = 30;
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_FOUND_LINK, 0);
}
}
if (daBk_bomb_view_check(i_this)) {
i_this->dr.mState = 9;
i_this->dr.m004 = 0;
}
}
if (i_this->m0B30 == 0 && daBk_wepon_view_check(i_this)) {
i_this->dr.mState = 0xC;
i_this->dr.m004 = -1;
}
}
/* 00005D40-00006218 .text path_run__FP8bk_class */
static void path_run(bk_class* i_this) {
i_this->dr.m710 = 0;
switch (i_this->dr.m004) {
case 0:
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, l_bkHIO.m070, BK_BAS_BK_RUN);
i_this->dr.m004 = 1;
// Fall-through
case 1:
dPath__Point* point = &i_this->ppd->mpPnt[i_this->m1216];
f32 x = point->mPos.x + i_this->m0320.x;
f32 z = point->mPos.z + i_this->m0320.z;
cXyz sp0C;
sp0C.x = x - i_this->current.pos.x;
sp0C.z = z - i_this->current.pos.z;
i_this->dr.m4D0 = cM_atan2s(sp0C.x, sp0C.z);
if (std::sqrtf(sp0C.x*sp0C.x + sp0C.z*sp0C.z) < 100.0f) {
i_this->m1216 += i_this->m1217;
if (i_this->m1216 >= (s8)i_this->ppd->m_num) {
i_this->m1216 = i_this->ppd->m_num - 1;
i_this->m1217 = -1;
i_this->m121C = 1;
} else if (i_this->m1216 < 0) {
i_this->m1216 = 0;
i_this->m1217 = 1;
i_this->m121C = 1;
}
}
if (i_this->m0300[1] == 0) {
i_this->m0300[1] = cM_rndF(50.0f) + 30.0f;
i_this->m0320.x = cM_rndFX(50.0f);
i_this->m0320.z = cM_rndFX(50.0f);
}
if (i_this->dr.mAcch.ChkGroundHit()) {
s16 maxStep = 0x600;
if (i_this->m120C != 0) {
maxStep = 0x2000;
}
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, maxStep);
}
if (i_this->m120C == 0) {
i_this->speedF = l_bkHIO.m054;
if (i_this->m0300[2] == 0) {
i_this->m0300[2] = cM_rndF(100.0f) + 50.0f;
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
i_this->m120C = 1;
i_this->m1210 = 0;
}
} else {
switch (i_this->m1210) {
case 0:
i_this->speedF = l_bkHIO.m054 * 1.2f;
if (i_this->dr.mAcch.ChkGroundHit() && i_this->mpMorf->isStop()) {
anm_init(i_this, BK_BCK_BK_JUMP2, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->m1210 = 1;
i_this->m034C = l_bkHIO.m00C + 2;
i_this->m034E = 4;
}
break;
case 1:
i_this->speedF = 0.0f;
if (i_this->dr.mAcch.ChkGroundHit() && i_this->mpMorf->isStop()) {
i_this->m1210 = 0;
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
i_this->speed.y = cM_rndF(REG8_F(7) + 10.0f) + 65.0f + REG8_F(8);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
}
if (i_this->m0300[2] == 0) {
i_this->m0300[2] = cM_rndF(100.0f) + 50.0f;
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, l_bkHIO.m070, BK_BAS_BK_RUN);
i_this->m120C = 0;
}
break;
}
}
break;
}
if (i_this->mPlayerDistance < l_bkHIO.m028 &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
) {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
}
}
/* 00006218-0000647C .text attack_set__FP8bk_classUc */
static void attack_set(bk_class* i_this, u8 r28) {
i_this->m0B5C = 0;
i_this->m11F1 = 0;
i_this->m11FC = fpcM_ERROR_PROCESS_ID_e;
i_this->m11F2 = 0;
i_this->m0B64 = 0.0f;
i_this->m0300[4] = 0;
cM_rndF(100.0f);
i_this->m1040.SetR(60.0f + REG8_F(3));
if (r28 == 2) {
i_this->m1040.SetAtType(AT_TYPE_UNK2000);
i_this->m1040.SetAtSe(dCcG_SE_UNK6);
} else if (i_this->m02D5 != 0) {
i_this->m1040.SetAtType(AT_TYPE_UNK800);
i_this->m1040.SetAtSe(dCcG_SE_UNK2);
} else {
i_this->m1040.SetAtType(AT_TYPE_UNK2000);
i_this->m1040.SetAtSe(dCcG_SE_UNK4);
}
if (r28 == 0) {
i_this->m0B5C = 0;
i_this->m0B68 = 23.0f + REG6_F(4);
i_this->m0B6C = 26.0f + REG6_F(5);
i_this->m0B70 = 45.0f;
i_this->m0B74 = l_bkHIO.m09C;
} else if (r28 == 1) {
i_this->m0B5C = 1;
i_this->m0B68 = 3.0f + REG6_F(8);
i_this->m0B6C = 9.0f + REG6_F(9);
i_this->m0B70 = 45.0f;
i_this->m0B74 = 0.0f;
} else if (r28 == 2) {
i_this->m0B5C = 2;
i_this->m0B68 = REG6_F(4);
i_this->m0B6C = 20.0f + REG6_F(5);
i_this->m0B70 = 45.0f;
i_this->m0B74 = 0.0f;
i_this->m1040.SetR(25.0f + REG8_F(3));
}
i_this->m0B7A = 1;
i_this->m0B60 = 0;
attack_info_s* info = attack_info[i_this->m0B5C];
anm_init(i_this, info->bckFileIdx, 5.0f, J3DFrameCtrl::LOOP_ONCE_e, info->speed, info->soundFileIdx);
if (bk_attack_ready_SE[i_this->m0B5C] != -0xDCF) {
fopAcM_monsSeStart(i_this, bk_attack_ready_SE[i_this->m0B5C], 0);
}
}
u16 learn_check;
/* 0000647C-000064D8 .text shot_s_sub__FPvPv */
static void* shot_s_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && (learn_check & 0x400) && fopAcM_GetName(param_1) == PROC_HIMO2) {
return param_1;
}
return NULL;
}
/* 000064D8-000073B8 .text fight_run__FP8bk_class */
static void fight_run(bk_class* i_this) {
/* Nonmatching - data offsets */
daPy_py_c* player = daPy_getPlayerActorClass();
f32 stickPosX = g_mDoCPd_cpadInfo[0].mMainStickPosX;
s8 r29 = 0;
if (i_this->dr.mAcch.ChkGroundHit() && i_this->dr.mAcch.ChkWallHit()) {
r29 = 1;
}
i_this->dr.m4D0 = i_this->m0332;
if (i_this->dr.m004 != 0) {
s16 r6 = 0x400;
if (i_this->dr.m004 == 1) {
r6 = 0x800;
}
if (i_this->dr.mAcch.ChkGroundHit()) {
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, r6);
}
}
switch (i_this->dr.m004) {
case 0x00:
if (i_this->m0300[1] == 0) {
fight_run_set(i_this);
i_this->dr.m004 = 1;
i_this->m120C = 0;
i_this->m1212 = cM_rndF(1000.0f);
} else {
i_this->speedF = 0.0f;
break;
}
// Fall-through
case 0x01:
f32 scaleMag;
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
scaleMag = l_bkHIO.m054;
} else {
scaleMag = l_bkHIO.m058;
}
cLib_addCalc2(&i_this->speedF, scaleMag, 1.0f, 5.0f);
i_this->m1212++;
if (daBk_player_way_check(i_this) && (i_this->m1212 & 0x30) && !r29) {
if (i_this->m120C != 0) {
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, l_bkHIO.m070, BK_BAS_BK_RUN);
i_this->m120C = 0;
}
if (i_this->mPlayerDistance < l_bkHIO.m02C) {
i_this->dr.m004 = 2;
i_this->m0300[4] = 50;
}
break;
} else {
if (i_this->m120C == 0 && i_this->m0B30 != 0) {
i_this->m120C = 1;
i_this->m1210 = 0;
}
}
if (i_this->m0B30 != 0) {
i_this->speedF = l_bkHIO.m068;
switch (i_this->m1210) {
case 0:
i_this->m1210 = 1;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 2, 0x2000);
anm_init(i_this, BK_BCK_BK_JUMP2, 5.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
break;
case 1:
if (i_this->dr.mAcch.ChkGroundHit() && i_this->mpMorf->isStop()) {
anm_init(i_this, BK_BCK_BK_JUMP2, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->m1210 = 2;
i_this->m034C = l_bkHIO.m00C + 2;
i_this->m034E = 4;
}
break;
case 2:
i_this->speedF = 0.0f;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 2, 0x2000);
if (i_this->dr.mAcch.ChkGroundHit() && i_this->mpMorf->isStop()) {
i_this->m1210 = 1;
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
i_this->speed.y = 65.0f + cM_rndF(10.0f + REG8_F(7)) + REG8_F(8);
if ((i_this->m02DD & 0xC) == 0) {
s16 temp = cM_rndFX(3000.0f + REG6_F(13));;
i_this->current.angle.y += temp;
}
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
}
break;
}
}
if (i_this->mPlayerDistance < l_bkHIO.m030) {
i_this->dr.mState = 5;
i_this->dr.m004 = 0;
return;
}
break;
case 0x02:
i_this->m120C = 0;
if (cM_rndF(1.0f) < 0.3f && i_this->m0B30 == 0) {
i_this->dr.m004 = 8;
wait_set(i_this);
i_this->m0300[1] = 20.0f + cM_rndF(20.0f);
break;
}
if ((i_this->m02DD & 0xC) == 0 && std::fabsf(stickPosX) > 0.1f) {
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
} else {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
}
if (stickPosX > 0.0f) {
i_this->dr.m004 = 5;
} else {
i_this->dr.m004 = 6;
}
} else if (i_this->mPlayerDistance < l_bkHIO.m030) {
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
} else {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
}
i_this->dr.m004 = 4;
} else {
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
} else {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
}
i_this->dr.m004 = 3;
}
i_this->m0300[1] = 20.0f + cM_rndF(20.0f);
break;
case 0x03:
cLib_addCalc2(&i_this->speedF, l_bkHIO.m060, 1.0f, 20.0f);
if (r29) {
i_this->speed.y = 100.0f + REG0_F(16);
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
i_this->dr.m004 = 0x21;
break;
}
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 2;
}
break;
case 0x21:
if (i_this->dr.mAcch.ChkGroundHit()) {
anm_init(i_this, BK_BCK_BK_JUMP2, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->dr.m004++;
}
break;
case 0x22:
i_this->speedF = 0.0f;
if (i_this->mpMorf->isStop()) {
i_this->dr.m004 = 3;
}
break;
case 0x04:
if ((i_this->m02DD & 0x2) == 0) {
cLib_addCalc2(&i_this->speedF, -l_bkHIO.m060, 1.0f, 20.0f);
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 2;
}
break;
}
i_this->dr.m004 = 3;
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
} else {
anm_init(i_this, BK_BCK_BK_WALK2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WALK2);
}
break;
case 0x05:
if ((i_this->m02DD & 0x4) == 0) {
i_this->m0334 = 0x4000;
goto temp_860;
} else {
i_this->m0300[1] = 0;
goto temp_860;
}
case 0x06:
if ((i_this->m02DD & 0x8) == 0) {
i_this->m0334 = -0x4000;
goto temp_860;
} else {
i_this->m0300[1] = 0;
goto temp_860;
}
temp_860:
cLib_addCalc2(&i_this->speedF, l_bkHIO.m064, 1.0f, 30.0f);
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 2;
}
break;
case 0x08:
i_this->speedF = 0.0f;
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 2;
}
break;
}
if (i_this->dr.m004 >= 3 && i_this->m0314 <= 2) {
if (i_this->mPlayerDistance > l_bkHIO.m02C + 75.0f) {
i_this->dr.mState = 0;
i_this->dr.m004 = 0;
path_check(i_this, 0);
}
if (i_this->mPlayerDistance < l_bkHIO.m030 + 62.5f && i_this->mPlayerDistance > l_bkHIO.m030 - 62.5f) {
if (i_this->m0300[4] == 0) {
i_this->m0300[4] = l_bkHIO.m078;
if (cM_rndF(100.0f) < l_bkHIO.m07C) {
i_this->dr.mState = 5;
i_this->dr.m004 = 0;
}
}
}
if (i_this->m0310 == 0) {
bool r27 = false;
learn_check = i_this->m1208;
fopAc_ac_c* r29 = (fopAc_ac_c*)fpcM_Search(shot_s_sub, i_this);
if (r29) {
if (r29->speedF > 10.0f) {
cXyz sp18 = (r29->current.pos - i_this->eyePos);
if (sp18.abs() < r29->speedF * 10.0f) {
r27 = true;
}
}
}
dAttention_c& attention = dComIfGp_getAttention();
if (i_this->m0B30 &&
daBk_player_way_check(i_this) &&
(
r27 || (
player->getCutType() != 0 &&
(cc_pl_cut_bit_get() & i_this->m1208) &&
attention.Lockon() &&
i_this == attention.LockonTarget(0)
)
)
) {
if (i_this->m02D4 != 0 && (cM_rndF(1.0f) <= 0.5f || l_bkHIO.m008 != 0)) {
i_this->dr.mState = 0xA;
i_this->dr.m004 = 0;
if (player->getCutType() == 0xA) {
i_this->m0300[1] = 0x1E;
} else {
i_this->m0300[1] = 0x0F;
}
} else {
i_this->m030E = 0xA;
if ((ground_4_check(i_this, 4, i_this->current.angle.y, 200.0f) & 0xD) == 0) {
i_this->dr.mState = 5;
attack_set(i_this, 1);
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
i_this->dr.m004 = -0xA;
i_this->speedF = -60.0f + REG0_F(3);
i_this->speed.y = 80.0f + REG0_F(4);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
}
}
}
}
}
if (i_this->m0B30 != 0 && i_this->mPlayerDistance < l_bkHIO.m030 - 62.5f &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
) {
i_this->m02FC++;
s16 temp = 0x19 + REG0_S(0);
if (i_this->m02FC >= temp) {
if (cM_rndF(1.0f) < 0.5f + REG0_F(0) &&
(ground_4_check(i_this, 4, i_this->current.angle.y, 200.0f) & 0xD) == 0
) {
i_this->dr.mState = 7;
i_this->dr.m004 = 0;
}
i_this->m02FC = 0;
}
} else {
i_this->m02FC = 0;
}
if (daBk_player_bg_check(i_this, &i_this->dr.m714->current.pos)) {
i_this->dr.mState = 0;
i_this->dr.m004 = 0;
path_check(i_this, 0);
}
if (i_this->m0B30 == 0 && daBk_wepon_view_check(i_this)) {
i_this->dr.mState = 0xC;
i_this->dr.m004 = -1;
}
if (daBk_bomb_view_check(i_this)) {
i_this->dr.mState = 9;
i_this->dr.m004 = 0;
}
i_this->m02DD = ground_4_check(i_this, 4, i_this->current.angle.y, 90.0f + REG6_F(7));
if (i_this->m0314 != 0) {
if (std::fabsf(i_this->speedF) < 30.0f) {
if (i_this->m0318 == 0) {
i_this->dr.m710 = 3;
} else if (i_this->m0318 == 1) {
i_this->dr.m710 = 4;
} else if (i_this->m02F8 & 0x10) {
i_this->dr.m710 = 3;
} else {
i_this->dr.m710 = 4;
}
cLib_addCalcAngleS2(&i_this->m11F4, 12000, 2, 0x1800);
} else {
i_this->dr.m710 = 1;
}
} else {
i_this->dr.m710 = 1;
if (i_this->m0316 == 0) {
i_this->m0316 = 30.0f + cM_rndF(100.0f);
if (i_this->m02DD == 4) {
i_this->m0318 = 0;
i_this->m0314 = 0x10;
} else if (i_this->m02DD == 8) {
i_this->m0318 = 1;
i_this->m0314 = 0x10;
} else if (i_this->m02DD == 2) {
i_this->m0318 = 2;
i_this->m0314 = 0x20;
}
}
}
}
/* 000073B8-000075E8 .text yari_hit_check__FP8bk_class */
static fopAc_ac_c* yari_hit_check(bk_class* i_this) {
i_this->m11F0 = 0;
i_this->m11C0 = i_this->m11A8;
if (i_this->m0B7A < 0) { return NULL; }
if (i_this->m0B5C == 2) {
i_this->m11A8 = i_this->dr.m100[0xE];
} else {
i_this->m11A8 = i_this->m1178;
}
if (i_this->m0B78 != 0) { return NULL; }
if (i_this->m0B64 < i_this->m0B68 || i_this->m0B64 > i_this->m0B6C) { return NULL; }
i_this->m11F0 <<= 1;
i_this->m1040.SetAtSpl(bk_at_kind[i_this->m0B5C]);
if ((int)i_this->m0B64 == (int)i_this->m0B68 && bk_attack_go_SE[i_this->m0B5C] != -0xDCF) {
fopAcM_monsSeStart(i_this, bk_attack_go_SE[i_this->m0B5C], 0);
}
if (i_this->m11F1 == 0) {
i_this->m1040.StartCAt(i_this->m11A8);
i_this->m11F1 += 1;
} else {
i_this->m1040.MoveCAt(i_this->m11A8);
dComIfG_Ccsp()->Set(&i_this->m1040);
if (i_this->m02D5 != 0) {
// Using the dComIfG_Ccsp inline here breaks the match.
// dComIfG_Ccsp()->SetMass(&i_this->m1040, 3);
g_dComIfG_gameInfo.play.mCcS.SetMass(&i_this->m1040, 3);
}
if (i_this->m1040.ChkAtHit()) {
i_this->m0B78 = 5;
cCcD_Obj* hitObj = i_this->m1040.GetAtHitObj();
return hitObj->GetAc();
}
}
return NULL;
}
/* 000075E8-00007EF4 .text fight__FP8bk_class */
static void fight(bk_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
switch (i_this->dr.m004) {
case -0x0A:
if (i_this->dr.mAcch.ChkGroundHit()) {
anm_init(i_this, BK_BCK_BK_JUMP2, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->dr.m004 = -0x09;
i_this->speedF = 0.0f;
}
break;
case -0x09:
if (i_this->mpMorf->isStop()) {
i_this->dr.m004 = 1;
i_this->m0300[2] = 8;
anm_init(i_this, BK_BCK_BK_JATTACK1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
i_this->speedF = 80.0f + REG0_F(5);
i_this->speed.y = 115.0f + REG0_F(6);
goto temp_1B8;
}
break;
case 0x00:
if (i_this->m0B30 != 0) {
attack_set(i_this, 0);
} else {
attack_set(i_this, 2);
i_this->speedF = 70.0f + REG0_F(7);
i_this->speed.y = 105.0f + REG0_F(8);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_ATTACK_L, 0);
}
i_this->dr.m004 = 1;
i_this->m0300[2] = 8;
// Fall-through
temp_1B8:
case 0x01:
i_this->m1040.SetAtAtp(bk_attack_AP[i_this->m0B5C]);
f32 f1 = attack_info[i_this->m0B5C][i_this->m0B60].speed;
if (i_this->dr.mAcch.ChkGroundHit() || (i_this->m0B5C != 1 && i_this->m0B5C != 2)) {
i_this->m0B64 += f1;
cLib_addCalc2(&i_this->speedF, 0.0f, 1.0f, 20.0f);
}
if (
i_this->m0B64 > i_this->m0B70 &&
daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)
) {
i_this->dr.m710 = 1;
}
if (i_this->m0B7A > 0) {
if (i_this->m0B5C == 0) {
int r3 = l_bkHIO.m0A0 + l_bkHIO.m0A2 + l_bkHIO.m0A4 + l_bkHIO.m0A6;
if ((int)i_this->m0B64 >= l_bkHIO.m0A0 && (int)i_this->m0B64 <= r3) {
i_this->m02F0 = 1;
if ((int)i_this->m0B64 >= (l_bkHIO.m0A0 + l_bkHIO.m0A2) && (int)i_this->m0B64 < (l_bkHIO.m0A0 + l_bkHIO.m0A2 + l_bkHIO.m0A4)) {
i_this->m02F4 = 1;
}
int r0 = (int)i_this->m0B64 - l_bkHIO.m0A0;
if (r0 < (int)ARRAY_SIZE(l_bkHIO.m0A8)) {
i_this->m02EC = l_bkHIO.m0A8[r0];
}
}
} else if (i_this->m0B5C == 1) {
int r3 = l_bkHIO.m0D0 + l_bkHIO.m0D2 + l_bkHIO.m0D4 + l_bkHIO.m0D6;
if ((int)i_this->m0B64 >= l_bkHIO.m0D0 && (int)i_this->m0B64 <= r3) {
i_this->m02F0 = 1;
if ((int)i_this->m0B64 >= (l_bkHIO.m0D0 + l_bkHIO.m0D2) && (int)i_this->m0B64 < (l_bkHIO.m0D0 + l_bkHIO.m0D2 + l_bkHIO.m0D4)) {
i_this->m02F4 = 1;
}
int r0 = (int)i_this->m0B64 - l_bkHIO.m0D0;
if (r0 < (int)ARRAY_SIZE(l_bkHIO.m0D8)) {
i_this->m02EC = l_bkHIO.m0D8[r0];
}
}
}
}
if ((i_this->m0B64 < i_this->m0B74) || i_this->m11F2 != 0) {
i_this->dr.m4D0 = i_this->m0332;
}
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, 0x800);
u8 attackType = 0;
f32 startFrame = 1000.0f;
f32 endFrame = 1000.0f;
f32 maxDist = 10000.0f;
if (i_this->m0B5C == 0) {
startFrame = 12.0f + REG0_F(8);
endFrame = 25.0f + REG0_F(9);
attackType = 2;
} else if (i_this->m0B5C == 1) {
startFrame = REG0_F(10);
endFrame = 10.0f + REG0_F(11);
attackType = 2;
}
i_this->setBtAttackData(startFrame, endFrame, maxDist, attackType);
i_this->setBtMaxDis(l_bkHIO.m014);
i_this->setBtNowFrame(i_this->m0B64);
fopAc_ac_c* hitActor = yari_hit_check(i_this);
if (hitActor != NULL) {
if (fopAcM_GetName(hitActor) == PROC_PLAYER) {
// Note: The code seems to assume that the hit actor and the controlled player are the same actor.
// This isn't necessarily correct, but likely doesn't cause any bugs in practice as checkPlayerGuard always
// returns false for non-Link player actors.
if (player->checkPlayerGuard() && (i_this->m0B5C == 0 || i_this->m0B5C == 1)) {
i_this->mpMorf->setPlaySpeed(-1.0f);
if (i_this->m034C != 0) {
i_this->m034C = l_bkHIO.m00C + 6;
}
i_this->m0B7A = -1;
i_this->mpMorf->play(&i_this->eyePos, 0, 0);
if (i_this->m0B30 != 0 && i_this->m02D5 == 0 && cM_rndF(1.0f) < 0.5f) {
i_this->m0B34 = 1;
i_this->dr.mState = 8;
i_this->dr.m004 = -10;
i_this->m0300[0] = 10;
i_this->m0300[1] = 100;
}
}
} else if (fopAcM_GetName(hitActor) == PROC_BK) {
i_this->m11FC = fopAcM_GetID(hitActor);
}
} else {
i_this->m1040.ClrAtHit();
if (i_this->m11F0 != 0) {
if (i_this->m11F0 == 2) {
i_this->mpMorf->setPlaySpeed(-1.0f);
i_this->m02F0 = 0;
if (i_this->m034C != 0) {
i_this->m034C = l_bkHIO.m00C + 6;
}
i_this->m0B7A = -1;
i_this->mpMorf->play(&i_this->eyePos, 0, 0);
} else {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
}
i_this->m0318 = 1;
i_this->m0314 = 0x10;
cXyz sp18;
sp18.x = sp18.y = sp18.z = 1.0f;
dComIfGp_particle_set(dPa_name::ID_COMMON_PURPLE_HIT, &i_this->m11E4, NULL, &sp18);
}
}
if (!i_this->mpMorf->isStop()) {
break;
}
if (
(i_this->m0B60 == 2 && i_this->m0B7A > 0) ||
(i_this->m0B7A < 0 && i_this->m0B60 == 0) ||
(i_this->m0B5C == 2 && i_this->m0B60 == 1)
) {
if (i_this->m11FC != fpcM_ERROR_PROCESS_ID_e) {
i_this->dr.mState = 0xE;
i_this->dr.m004 = 0;
} else if (i_this->mPlayerDistance < l_bkHIO.m02C) {
if (daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)) {
if (cM_rndF(1.0f) < 0.8f || i_this->m0B7A < 0) {
i_this->dr.mState = 4;
i_this->dr.m004 = 2;
i_this->m0300[1] = 0;
} else {
i_this->dr.m004 = 0;
}
} else {
if (i_this->m0B30 != 0 || i_this->m11F3 != 0) {
i_this->dr.mState = 8;
i_this->dr.m004 = 0;
} else {
i_this->dr.mState = 0;
wait_set(i_this);
i_this->dr.m004 = 2;
}
}
} else {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
}
} else if (i_this->dr.mAcch.ChkGroundHit()) {
attack_info_s* r6 = attack_info[i_this->m0B5C];
f32 speed;
if (i_this->m0B7A > 0) {
i_this->m0B60++;
speed = r6[i_this->m0B60].speed;
} else {
i_this->m0B60--;
speed = -r6[i_this->m0B60].speed;
}
anm_init(i_this, r6[i_this->m0B60].bckFileIdx, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, speed, r6[i_this->m0B60].soundFileIdx);
}
break;
}
}
/* 00007EF4-00008108 .text p_lost__FP8bk_class */
static void p_lost(bk_class* i_this) {
i_this->dr.m710 = 0;
switch (i_this->dr.m004) {
case -0x0A:
if (i_this->mpMorf->isStop() || i_this->m0300[0] == 0) {
i_this->dr.m004++;
i_this->m0300[0] = 5;
}
break;
case -0x09:
if (i_this->m0300[0] != 0) {
break;
}
// Fall-through
case 0x00:
i_this->dr.m004 = 1;
anm_init(i_this, BK_BCK_BK_KYORO2, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_KYORO2);
i_this->speedF = 0.0f;
i_this->m0300[1] = 30.0f + cM_rndF(30.0f);
// Fall-through
case 0x01:
int frame = i_this->mpMorf->getFrame();
if ((frame == 0xB || frame == 0x19) && cM_rndF(1.0f) < 0.5f) {
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_SEARCH, 0);
}
if (i_this->m0300[1] == 0) {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
}
break;
}
if (i_this->m0300[1] < 10 && daBk_player_view_check(i_this, &i_this->dr.m714->current.pos, i_this->m0332, l_bkHIO.m034)) {
i_this->dr.mState = 4;
i_this->dr.m004 = 2;
i_this->m0300[1] = 0;
}
}
/* 00008108-00008470 .text b_nige__FP8bk_class */
static void b_nige(bk_class* i_this) {
if (!daBk_bomb_check(i_this)) {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
return;
}
fopAc_ac_c* r3 = i_this->m11F8;
cXyz sp10;
sp10.x = r3->current.pos.x - i_this->current.pos.x;
sp10.z = r3->current.pos.z - i_this->current.pos.z;
i_this->dr.m4D0 = cM_atan2s(-sp10.x, -sp10.z);
switch (i_this->dr.m004) {
case 0:
i_this->dr.m004 = 1;
anm_init(i_this, BK_BCK_BK_HAKKEN, 3.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_HAKKEN);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_FOUND_LINK, 0);
i_this->m0300[1] = 20;
// Fall-through
case 1:
i_this->speedF = 0.0f;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0 + 0x8000, 2, 0x3000);
if (i_this->m0300[1] == 0) {
i_this->dr.m004 = 2;
anm_init(i_this, BK_BCK_BK_NIGERU, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_NIGERU);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_LOST_BOKO, 0);
}
break;
case 2:
i_this->speedF = l_bkHIO.m05C;
i_this->m034C = l_bkHIO.m00C + 3;
i_this->m034E = 4;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, 0x1000);
if (std::sqrtf(sp10.x*sp10.x + sp10.z*sp10.z) > 800.0f) {
i_this->dr.m004 = 3;
anm_init(i_this, BK_BCK_BK_WAIT, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_WAIT);
}
break;
case 3:
i_this->speedF = 0.0f;
i_this->dr.m4D0 = i_this->m0332;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 3, 0x1000);
if (std::sqrtf(sp10.x*sp10.x + sp10.z*sp10.z) < 700.0f) {
i_this->dr.m004 = 0;
}
break;
}
}
/* 00008470-00008580 .text defence__FP8bk_class */
static void defence(bk_class* i_this) {
i_this->dr.m710 = 1;
i_this->dr.m4D0 = i_this->m0332;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 4, 0x400);
switch (i_this->dr.m004) {
case 0:
i_this->dr.m004 = 1;
anm_init(i_this, BK_BCK_BK_BOUGYO1, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, -1);
i_this->speedF = 0.0f;
// Fall-through
case 1:
i_this->m0F14.SetR(60.0f);
i_this->m11D8 = i_this->m11CC;
if (i_this->m0300[1] == 0) {
if (cM_rndF(1.0f) < 0.5f) {
i_this->dr.mState = 5;
i_this->dr.m004 = 0;
} else {
i_this->dr.mState = 4;
i_this->m0300[1] = 0;
i_this->dr.m004 = 0;
}
}
break;
}
}
/* 00008580-00008654 .text oshi__FP8bk_class */
static void oshi(bk_class* i_this) {
i_this->dr.mState = 5;
attack_set(i_this, 1);
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
i_this->dr.m004 = -0xA;
i_this->speedF = -90.0f + REG6_F(10);
i_this->speed.y = 85.0f + REG6_F(11);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
}
/* 00008654-00008C38 .text hukki__FP8bk_class */
static void hukki(bk_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
cXyz sp24 = i_this->dr.m100[10] - i_this->dr.m100[13];
cXyz sp18;
mDoMtx_YrotS(*calc_mtx, cM_atan2s(sp24.x, sp24.z));
mDoMtx_XrotM(*calc_mtx, -cM_atan2s(sp24.y, std::sqrtf(sp24.x*sp24.x + sp24.z*sp24.z)));
sp24.x = sp24.y = 0.0f;
i_this->m030E = 2;
switch (i_this->dr.m004) {
case 0xA:
anm_init(i_this, BK_BCK_BK_OKIRUA, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_OKIRUA);
i_this->m0300[2] = 15;
goto temp_194;
case 0xC:
anm_init(i_this, BK_BCK_BK_OKIRUU, 0.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_OKIRUU);
i_this->m0300[2] = 15 + REG0_S(5);
temp_194:
i_this->speedF = 0.0f;
i_this->dr.m004 = 0xD;
i_this->dr.m480 = 0;
i_this->current.pos.y -= i_this->dr.m44C.y;
i_this->old.pos.y -= i_this->dr.m44C.y;
i_this->dr.m44C.y = 0.0f;
sp24.z = (125.0f + REG14_F(8)) * 0.1f;
MtxPosition(&sp24, &sp18);
for (int i = 0; i < 3; i++) {
i_this->old.pos = i_this->current.pos;
i_this->current.pos += sp18;
i_this->dr.mAcch.CrrPos(*dComIfG_Bgsp());
}
// Fall-through
case 0xD:
if (i_this->m0300[2] == 1) {
i_this->m034C = l_bkHIO.m00C + 6;
i_this->m034E = 3;
}
if (i_this->m0300[2] > 3) {
i_this->dr.m7B6 = 1;
}
if (i_this->mpMorf->isStop()) {
if (i_this->mPlayerDistance < l_bkHIO.m02C) {
i_this->dr.m004 = 0xE;
i_this->m0300[1] = 10;
} else {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
}
i_this->dr.m488 = 0;
}
break;
case 0xE:
i_this->dr.m710 = 1;
i_this->dr.m4D0 = i_this->m0332;
cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->dr.m4D0, 3, 0x1000);
if (i_this->m0300[1] == 0) {
if (!player->checkGrabWear() && l_bkHIO.m00A == 0 && i_this->m0B30 != 0) {
i_this->dr.mState = 5;
i_this->m0B5C = 0;
i_this->m0B64 = 29.0f + REG0_F(8);
i_this->m0B68 = 32.0f;
i_this->m0B6C = 39.0f;
i_this->m0B70 = 0.0f;
i_this->m0B74 = l_bkHIO.m09C;
i_this->m0B7A = 1;
i_this->m0B60 = 1;
attack_info_s* info = attack_info[i_this->m0B5C];
info += 1;
anm_init(i_this, info->bckFileIdx, 5.0f, J3DFrameCtrl::LOOP_ONCE_e, info->speed, info->soundFileIdx);
i_this->dr.m004 = 1;
i_this->m11F2 = 1;
} else {
i_this->dr.mState = 4;
i_this->dr.m004 = 0;
}
}
break;
}
dBgS_GndChk gndChk;
Vec sp54;
sp54.x = i_this->current.pos.x;
sp54.y = i_this->current.pos.y;
sp54.z = i_this->current.pos.z;
sp54.y += 200.0f;
gndChk.SetPos(&sp54);
f32 groundY = dComIfG_Bgsp()->GroundCross(&gndChk);
groundY -= 50.0f;
groundY = REG17_F(2) + groundY;
if (i_this->current.pos.y < groundY) {
i_this->current.pos.y = groundY;
}
}
/* 00008C38-00008D1C .text aite_miru__FP8bk_class */
static void aite_miru(bk_class* i_this) {
switch (i_this->dr.m004) {
case 0:
i_this->m0300[1] = 20 + REG0_S(8);
i_this->speedF = 0.0f;
i_this->dr.m004 = 1;
// Fall-through
case 1:
cLib_addCalcAngleS2(&i_this->m11F4, 0x2EE0, 2, 0x1800);
i_this->dr.m710 = 1;
if (i_this->m11FC != fpcM_ERROR_PROCESS_ID_e) {
fopAc_ac_c* temp = fopAcM_SearchByID(i_this->m11FC);
if (temp != NULL) {
i_this->dr.m714 = temp;
}
}
if (i_this->m0300[1] == 0) {
i_this->m11FC = fpcM_ERROR_PROCESS_ID_e;
i_this->dr.mState = 0;
i_this->dr.m004 = 0;
path_check(i_this, 0);
}
break;
}
}
/* 00008D1C-00008ECC .text fail__FP8bk_class */
static void fail(bk_class* i_this) {
i_this->m030E = 5;
fopAcM_OffStatus(i_this, 0);
i_this->attention_info.flags = 0;
i_this->speedF = 0.0f;
i_this->speed.y = 0.0f;
switch (i_this->dr.m004) {
case -1:
if (i_this->m1234 == 0) {
fopAcM_delete(i_this);
}
break;
case 0:
i_this->dr.m004 = 1;
// Fall-through
case 1:
cXyz sp08 = i_this->current.pos;
sp08.y += 100.0f + l_bkHIO.m020;
u8 dropType = daDisItem_NORMAL_e;
if (i_this->m0300[2] >= 1000) {
dropType = daDisItem_NONE1_e;
}
fopAcM_createDisappear(i_this, &sp08, 10, dropType, i_this->stealItemBitNo);
if (i_this->mType == 10) {
i_this->m02DE = 1;
i_this->dr.m004 = -1;
mDoAud_subBgmStop();
} else {
fopAcM_delete(i_this);
}
if (i_this->m02B8 != 0) {
dComIfGs_onSwitch(i_this->m02B8, i_this->current.roomNo);
}
fopAcM_onActor(i_this);
if (i_this->mType != 4) {
if (dComIfGs_isEventBit(0x0301)) {
dComIfGs_onEventBit(0x0480);
} else {
dComIfGs_onEventBit(0x0301);
}
}
break;
}
}
/* 00008ECC-000090E0 .text yogan_fail__FP8bk_class */
static void yogan_fail(bk_class* i_this) {
/* Nonmatching */
}
/* 000090E0-0000924C .text water_fail__FP8bk_class */
static void water_fail(bk_class* i_this) {
i_this->dr.m71E = 5;
i_this->m030E = 5;
fopAcM_OffStatus(i_this, 0);
i_this->attention_info.flags = 0;
i_this->speedF = 0.0f;
switch (i_this->dr.m004) {
case 0:
anm_init(i_this, BK_BCK_BK_NIGERU, 5.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, BK_BAS_BK_NIGERU);
i_this->dr.m004 = 1;
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_SURPRISE, 0);
i_this->dr.m458.y = 0.0f;
i_this->dr.m44C.y = 0.0f;
i_this->dr.m480 = 0;
if (i_this->m0B30 != 0) {
i_this->m0B34 = 1;
}
i_this->m0300[3] = 120;
// Fall-through
case 1:
i_this->speed.y = 0.0f;
i_this->current.pos.y -= 1.0f;
cLib_addCalcAngleS2(&i_this->current.angle.x, 0, 8, 0x800);
if (i_this->m0300[3] == 0) {
fopAcM_delete(i_this);
if (i_this->m02B8 != 0) {
dComIfGs_onSwitch(i_this->m02B8, i_this->current.roomNo);
}
}
break;
}
}
/* 0000924C-00009944 .text wepon_search__FP8bk_class */
static void wepon_search(bk_class* i_this) {
/* Nonmatching */
}
/* 00009944-00009AFC .text d_dozou__FP8bk_class */
static void d_dozou(bk_class* i_this) {
/* Nonmatching */
}
/* 00009AFC-00009B0C .text carry__FP8bk_class */
static void carry(bk_class* i_this) {
i_this->speed.y = 0.0f;
}
/* 00009B0C-00009DF0 .text carry_drop__FP8bk_class */
static void carry_drop(bk_class* i_this) {
/* Nonmatching */
}
/* 00009DF0-00009F1C .text d_mahi__FP8bk_class */
static void d_mahi(bk_class* i_this) {
switch (i_this->dr.m004) {
case 0:
i_this->dr.m004 = 1;
anm_init(i_this, BK_BCK_BK_SUWARI, 20.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_SUWARI);
i_this->m0300[0] = 100;
// Fall-through
case 1:
if (i_this->m0300[0] <= 80 && i_this->m0300[0] >= 40) {
if (i_this->m0300[0] == 80) {
enemy_piyo_set(i_this);
}
fopAcM_seStart(i_this, JA_SE_CM_MD_PIYO, 0);
}
i_this->speedF = 0.0f;
if (i_this->m0300[0] == 30) {
i_this->dr.m49E = 0xF;
}
if (i_this->m0300[0] == 0) {
i_this->dr.mState = 0;
path_check(i_this, 0);
wait_set(i_this);
i_this->dr.m004 = 2;
}
break;
}
}
/* 00009F1C-0000A350 .text tubo_wait__FP8bk_class */
static void tubo_wait(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A350-0000A630 .text z_demo_1__FP8bk_class */
static void z_demo_1(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A630-0000A9BC .text b_hang__FP8bk_class */
static void b_hang(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A9BC-0000AC6C .text rope_on__FP8bk_class */
static void rope_on(bk_class* i_this) {
i_this->dr.m710 = 1;
i_this->m030E = 2;
switch (i_this->dr.m004) {
case 0:
i_this->speedF = 0.0f;
anm_init(i_this, BK_BCK_BK_KYORO2, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 2.0f, BK_BAS_BK_KYORO2);
i_this->dr.m004 = 1;
i_this->m0300[0] = 40;
// Fall-through
case 1:
if (i_this->m0300[0] == 0) {
i_this->dr.m004 = 2;
anm_init(i_this, BK_BCK_BK_WALK, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 2.0f, BK_BAS_BK_WALK);
}
break;
case 2: {
i_this->speedF = 70.0f;
s16 targetAngle = fopAcM_searchPlayerAngleY((i_this));
cLib_addCalcAngleS2(&i_this->current.angle.y, targetAngle, 4, 0x1000);
if (i_this->dr.mAcch.ChkWallHit()) {
i_this->speed.y = 100.0f + REG0_F(16);
anm_init(i_this, BK_BCK_BK_JUMP1, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP1);
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_JUMP, 0);
i_this->dr.m004 = 3;
}
if (fopAcM_searchPlayerDistance(i_this) < 200.0f) {
anm_init(i_this, BK_BCK_BK_SUWARI, 10.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_SUWARI);
i_this->dr.m004 = 5;
}
break;
}
case 3:
i_this->speedF = 35.0f;
if (i_this->dr.mAcch.ChkGroundHit()) {
anm_init(i_this, BK_BCK_BK_JUMP2, 1.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_JUMP2);
i_this->dr.m004 = 4;
}
break;
case 4:
i_this->speedF = 0.0f;
if (i_this->mpMorf->isStop()) {
i_this->dr.m004 = 2;
anm_init(i_this, BK_BCK_BK_WALK, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 2.0f, BK_BAS_BK_WALK);
}
break;
case 5:
i_this->speedF = 0.0f;
if (fopAcM_searchPlayerDistance(i_this) > 250.0f) {
i_this->dr.m004 = 2;
anm_init(i_this, BK_BCK_BK_WALK, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, 2.0f, BK_BAS_BK_WALK);
}
break;
}
}
/* 0000AC6C-0000AC84 .text search_target__FP8bk_class */
static BOOL search_target(bk_class* i_this) {
i_this->dr.m714 = dComIfGp_getPlayer(0);
return FALSE;
}
/* 0000AC84-0000B25C .text Bk_move__FP8bk_class */
static void Bk_move(bk_class* i_this) {
/* Nonmatching */
}
/* 0000B25C-0000B324 .text bk_eye_tex_anm__FP8bk_class */
static void bk_eye_tex_anm(bk_class* i_this) {
if (i_this->m02C8 != 0) {
i_this->m02C8--;
} else {
i_this->m02C8 = 20.0f + cM_rndF(100.0f);
i_this->m02CA = 3.0f + cM_rndF(3.0f);
}
if (i_this->m02CA != 0) {
i_this->m02CA--;
i_this->m02C4->setFrame(6.0f);
} else {
i_this->m02C4->setFrame(0.0f);
}
}
/* 0000B324-0000BC98 .text damage_check__FP8bk_class */
static void damage_check(bk_class* i_this) {
/* Nonmatching */
}
/* 0000BCD4-0000BD30 .text s_s2_sub__FPvPv */
static void* s_s2_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_OBJ_SEARCH) {
if (daObj_Search::Act_c::getFindFlag()) {
return param_1;
}
}
return NULL;
}
/* 0000BD30-0000C2D0 .text waki_set__FP8bk_class */
static void waki_set(bk_class* i_this) {
/* Nonmatching */
}
/* 0000C2D0-0000CC68 .text demo_camera__FP8bk_class */
static void demo_camera(bk_class* i_this) {
/* Nonmatching */
JUTReport(410, 430, "K SUB COUNT %d");
}
/* 0000CC68-0000CD00 .text tate_mtx_set__FP8bk_class */
static void tate_mtx_set(bk_class* i_this) {
if (i_this->m02D4 != 0) {
int jointIdx = 0x25; // tate joint
MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(jointIdx), *calc_mtx);
i_this->m02D0->setBaseTRMtx(*calc_mtx);
cXyz sp08;
sp08.x = REG8_F(12);
sp08.y = REG8_F(13);
sp08.z = REG8_F(14);
MtxPosition(&sp08, &i_this->m11CC);
}
}
/* 0000CD00-0000CE18 .text bou_mtx_set__FP8bk_class */
static void bou_mtx_set(bk_class* i_this) {
if (i_this->m02DC != 0) {
int jointIdx = 0x2C + REG7_S(4); // buki joint
MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(jointIdx), *calc_mtx);
s16 angleY = 0x4000 + REG7_S(0);
cMtx_YrotM(*calc_mtx, angleY);
s16 angleX = REG7_S(1);
cMtx_XrotM(*calc_mtx, angleX);
s16 angleZ = REG7_S(2);
cMtx_ZrotM(*calc_mtx, angleZ);
MtxTrans(
0.01f * REG7_F(9),
0.01f * REG7_F(10),
0.01f * REG7_F(11) + 50.0f,
1
);
i_this->m02D8->setBaseTRMtx(*calc_mtx);
}
}
static u8 temp[0x118] = {};
/* 0000CE18-0000DD1C .text daBk_Execute__FP8bk_class */
static BOOL daBk_Execute(bk_class* i_this) {
another_hit = 0;
if (i_this->mpSearchLight != NULL) {
i_this->mpSearchLight->setBkControl(false);
}
if (i_this->m121C != 0 || i_this->home.pos.y - i_this->current.pos.y > 4000.0f) {
if (i_this->m0B30 != 0) {
fopAc_ac_c* temp = fopAcM_SearchByID(i_this->m1200);
if (temp != NULL) {
fopAcM_delete(temp);
}
}
fopAcM_delete(i_this);
return TRUE;
}
if (enemy_ice(&i_this->mEnemyIce)) {
i_this->mpMorf->setPlayMode(J3DFrameCtrl::LOOP_ONCE_e);
i_this->mpMorf->setPlaySpeed(3.0f);
i_this->mpMorf->play(&i_this->eyePos, 0, 0);
i_this->mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
i_this->mpMorf->calc();
tate_mtx_set(i_this);
bou_mtx_set(i_this);
return TRUE;
}
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr);
if (i_this->mType == 8) {
for (int i = 0; i < ARRAY_SIZE(i_this->m0300); i++) {
if (i_this->m0300[i] != 0) {
i_this->m0300[i]--;
}
}
waki_set(i_this);
return TRUE;
}
if (l_bkHIO.m006 == 0 || CPad_CHECK_TRIG_B(0) || CPad_CHECK_HOLD_Y(0)) {
i_this->m02F8++;
for (int i = 0; i < ARRAY_SIZE(i_this->m0300); i++) {
if (i_this->m0300[i] != 0) {
i_this->m0300[i]--;
}
}
if (i_this->m0314 != 0) {
i_this->m0314--;
}
if (i_this->m0316 != 0) {
i_this->m0316--;
}
if (i_this->m030A != 0) {
i_this->m030A--;
}
if (i_this->m02CC != 0) {
i_this->m02CC--;
}
if (i_this->dr.m48A != 0) {
i_this->dr.m48A--;
}
if (i_this->m030E != 0) {
i_this->m030E--;
}
if (i_this->m0310 != 0) {
i_this->m0310--;
}
if (i_this->m0B78 != 0) {
i_this->m0B78--;
}
if (i_this->m02B7 != 0xFF && i_this->mType == 6 && dComIfGs_isSwitch(i_this->m02B7, dComIfGp_roomControl_getStayNo())) {
return TRUE;
}
if (i_this->m1214 != 0) {
daBoko_c* temp = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (temp != NULL) {
i_this->m1214 = 0;
i_this->m0B30 = 1;
fopAcM_setCarryNow(temp, FALSE);
MtxTrans(-10000.0f, -10000.0f, 0.0f, 0);
temp->setMatrix(*calc_mtx);
}
}
if (i_this->m02BA != 0x00) {
if (i_this->m02BA == 0xFF) {
f32 f30;
if (i_this->m02B5 != 0xFF) {
f30 = i_this->m02B5 * 10.0f;
} else {
f30 = 300.0f;
}
fopAc_ac_c* r23 = fopAcM_SearchByID(i_this->m1204);
if (i_this->m030E == 0 && (fopAcM_searchPlayerDistance(i_this) < f30 || r23 == NULL)) {
i_this->m02BA = 0;
if (r23 == NULL) {
i_this->m0300[0] = 50;
i_this->m0310 = 20;
if (std::fabsf(i_this->speedF) > 10.0f) {
another_hit = 1;
} else {
i_this->scale.x = i_this->scale.y = i_this->scale.z = 0.5f;
}
}
i_this->m0B88.SetR(62.5f);
} else {
if (r23 != NULL) {
i_this->current.pos = r23->current.pos;
if (r23->speedF > 1.0f) {
i_this->speedF = r23->speedF;
i_this->shape_angle = r23->shape_angle;
i_this->current.angle = r23->shape_angle;
}
} else {
i_this->m0B88.SetC(i_this->current.pos);
i_this->m0B88.SetR(10.0f);
dComIfG_Ccsp()->Set(&i_this->m0B88);
cCcD_Obj* r3 = i_this->m0B88.GetCoHitObj();
if (r3 != NULL) {
fopAc_ac_c* temp = r3->GetAc();
if (temp != NULL) {
i_this->m1204 = fopAcM_GetID(temp);
}
}
}
return TRUE;
}
} else {
if (dComIfGs_isSwitch(i_this->m02BA - 1, fopAcM_GetRoomNo(i_this))) {
i_this->m02BA = 0;
} else {
return TRUE;
}
}
}
i_this->attention_info.flags = fopAc_Attn_LOCKON_BATTLE_e;
fopAcM_OnStatus(i_this, fopAcStts_SHOWMAP_e);
i_this->m02F0 = 0;
i_this->m02F4 = 0;
i_this->m0B7B = 0;
bk_eye_tex_anm(i_this);
i_this->dr.m438 = 0;
i_this->setBtAttackData(100.0f, 100.0f, 10000.0f, 0);
i_this->setBtNowFrame(0.0f);
damage_check(i_this);
Bk_move(i_this);
demo_camera(i_this);
ground_smoke_set(i_this);
if (i_this->m030C != 0) {
i_this->m030C--;
}
i_this->dr.mpEnemy = i_this;
i_this->dr.mEnemyType = 2;
}
if (i_this->dr.mState != 0x1F) {
i_this->shape_angle = i_this->current.angle;
}
int r3 = damage_reaction(&i_this->dr);
if (r3 != 0) {
i_this->m034C = 1;
i_this->m11FC = fpcM_ERROR_PROCESS_ID_e;
switch (r3) {
case 1:
anm_init(i_this, BK_BCK_BK_AOMUKE, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_AOMUKE);
if (i_this->m0B30 != 0) {
i_this->m0B34 = 1;
}
i_this->dr.mState = 0;
break;
case 2:
anm_init(i_this, BK_BCK_BK_UTUBUSE, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_UTUBUSE);
break;
case 5:
if (i_this->dr.mState != 4 && i_this->dr.mState != 0xB) {
wait_set(i_this);
i_this->dr.mState = 4;
i_this->dr.m004 = 0;
i_this->m0300[1] = 30;
}
i_this->m0336 = 5;
i_this->m0344.x = -0x4000;
break;
case 10:
wait_set(i_this);
i_this->dr.m004 = 2;
i_this->dr.mState = 0;
path_check(i_this, 0);
break;
case 20:
i_this->m0336 = 1;
i_this->m0344.x = -0x4000;
i_this->m034C = l_bkHIO.m00C + 0x10;
i_this->m034E = 1;
i_this->dr.m4C8[2] = l_bkHIO.m08C;
break;
case 21:
i_this->m0336 = 1;
i_this->m0344.x = 0;
i_this->dr.m4C8[2] = l_bkHIO.m08C;
break;
case 30:
anm_init(i_this, BK_BCK_BK_AOMUKE, 2.0f, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, BK_BAS_BK_AOMUKE);
if (i_this->m0B30 != 0) {
i_this->m0B34 = 1;
}
i_this->dr.mState = 0;
fopAcM_monsSeStart(i_this, JA_SE_CV_BK_FAINTED, 0);
break;
}
}
J3DModel* model = i_this->mpMorf->getModel();
model->setBaseScale(i_this->scale);
model->setBaseTRMtx(*calc_mtx);
if (i_this->m030C == 0) {
i_this->mpMorf->play(&i_this->eyePos, 0, 0);
}
i_this->mpMorf->calc();
enemy_fire(&i_this->mEnemyFire);
if (i_this->m0B30 != 0) {
daBoko_c* r29 = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (r29 != NULL) {
if (fopAcM_checkCarryNow(r29)) {
if (i_this->m0B7B == 0) {
int jointIdx = 0x2C; // buki joint
MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(jointIdx), *calc_mtx);
s16 angleY = 0x3E80 + REG8_S(1);
cMtx_YrotM(*calc_mtx, angleY);
s16 angleX = REG8_S(2);
cMtx_XrotM(*calc_mtx, angleX);
s16 angleZ = REG8_S(3);
cMtx_ZrotM(*calc_mtx, angleZ);
MtxTrans(
REG8_F(9),
REG8_F(10),
REG8_F(11) + 65.0f,
1
);
} else {
MtxTrans(
i_this->home.pos.x,
i_this->home.pos.y,
i_this->home.pos.z,
0
);
cMtx_YrotM(*calc_mtx, i_this->shape_angle.y);
MtxTrans(
REG6_F(7) - 40.0f,
REG6_F(8) + 68.0f,
REG6_F(9) + 82.0f,
1
);
s16 angleX = 0x5B1B + REG8_S(5);
cMtx_XrotM(*calc_mtx, angleX);
}
r29->setMatrix(*calc_mtx);
cXyz sp64;
sp64.x = REG8_F(12);
sp64.y = REG8_F(13);
sp64.z = REG8_F(14);
MtxPosition(&sp64, &i_this->m1178);
}
} else {
i_this->m0B30 = 0;
}
}
tate_mtx_set(i_this);
bou_mtx_set(i_this);
yari_off_check(i_this);
MtxTrans(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z, 0);
cMtx_YrotM(*calc_mtx, i_this->current.angle.y);
cXyz sp58(0.0f, 0.0f, 35.0f);
cXyz sp4C;
MtxPosition(&sp58, &sp4C);
i_this->m0B88.SetC(sp4C);
dComIfG_Ccsp()->Set(&i_this->m0B88);
// Using the inline breaks the match.
// dComIfG_Ccsp()->SetMass(&i_this->m0B88, 3);
dComIfG_Ccsp()->mMass_Mng.Set(&i_this->m0B88, 3);
cXyz sp40 = i_this->m116C;
cXyz sp34 = i_this->current.pos;
if (i_this->m030E != 0) {
sp40.y -= 20000.0f;
sp34.y -= 20000.0f;
}
if (i_this->dr.mState == 0xA) {
sp40.y -= 20000.0f;
sp34.y -= 100.0f;
}
i_this->m0CB8.SetC(sp34);
dComIfG_Ccsp()->Set(&i_this->m0CB8);
i_this->m0DE8.SetC(sp40);
dComIfG_Ccsp()->Set(&i_this->m0DE8);
if (i_this->m0336 != 0) {
i_this->m0336--;
if (i_this->m0336 == 0) {
i_this->m0344.y = i_this->current.angle.y;
dComIfGp_particle_set(dPa_name::ID_COMMON_000E, &i_this->m116C, &i_this->m0344);
}
}
if (i_this->dr.mAcch.ChkGroundHit() || i_this->dr.mState == 0x13) {
dBgS_GndChk gndChk;
s16 r21 = 0x7FFF;
s16 r23 = 0x7FFF;
f32 f31 = i_this->dr.m480 != 0 ? 100.0f : 10.0f;
cXyz sp28 = i_this->current.pos;
sp28.y += 50.0f - i_this->dr.m44C.y;
gndChk.SetPos(&sp28);
sp28.y = dComIfG_Bgsp()->GroundCross(&gndChk);
if (sp28.y != -1e9f) {
Vec temp;
temp.x = sp28.x;
temp.y = 50.0f + sp28.y;
temp.z = sp28.z + f31;
gndChk.SetPos(&temp);
f32 f1 = dComIfG_Bgsp()->GroundCross(&gndChk);
if (f1 != -1e9f) {
r21 = (s16)-cM_atan2s(f1 - sp28.y, temp.z - sp28.z);
if (r21 > 0x2000 || r21 < -0x2000) {
r21 = 0;
}
}
temp.x = sp28.x + f31;
temp.y = 50.0f + sp28.y;
temp.z = sp28.z;
gndChk.SetPos(&temp);
f1 = dComIfG_Bgsp()->GroundCross(&gndChk);
if (f1 != -1e9f) {
r23 = (s16)cM_atan2s(f1 - sp28.y, temp.x - sp28.x);
if (r23 > 0x2000 || r23 < -0x2000) {
r23 = 0;
}
}
}
if (i_this->dr.mState == 0x13) {
r23 = 0;
r21 = 0;
}
if (r21 != 0x7FFF) {
cLib_addCalcAngleS2(&i_this->dr.m48C.x, r21, 1, 0x400);
}
if (r23 != 0x7FFF) {
cLib_addCalcAngleS2(&i_this->dr.m48C.z, r23, 1, 0x400);
}
}
return TRUE;
}
/* 0000DD1C-0000DD24 .text daBk_IsDelete__FP8bk_class */
static BOOL daBk_IsDelete(bk_class* i_this) {
return TRUE;
}
/* 0000DD24-0000DDD8 .text daBk_Delete__FP8bk_class */
static BOOL daBk_Delete(bk_class* i_this) {
dComIfG_resDelete(&i_this->mPhase, "Bk");
if (i_this->heap) {
i_this->mpMorf->stopZelAnime();
}
if (i_this->m121D) {
hio_set = 0;
mDoHIO_deleteChild(l_bkHIO.mNo);
}
i_this->m0350.end();
i_this->dr.mParticleCallBack.end();
enemy_fire_remove(&i_this->mEnemyFire);
return TRUE;
}
/* 0000DDD8-0000E2C8 .text useHeapInit__FP10fopAc_ac_c */
static BOOL useHeapInit(fopAc_ac_c* i_actor) {
bk_class* i_this = (bk_class*)i_actor;
i_this->mpMorf = new mDoExt_McaMorf(
(J3DModelData*)dComIfG_getObjectRes("Bk", BK_BDL_BK),
NULL, NULL,
(J3DAnmTransformKey*)dComIfG_getObjectRes("Bk", BK_BCK_BK_SUWARI),
J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1,
dComIfG_getObjectRes("Bk", BK_BAS_BK_SUWARI),
0x00080000,
0x37221203
);
if (i_this->mpMorf == NULL || i_this->mpMorf->getModel() == NULL) {
return FALSE;
}
J3DModel* model = i_this->mpMorf->getModel();
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
s32 r3 = joint_check[i];
if (r3 < 0) {
continue;
}
if (r3 == 0x0E || r3 == 0x0F || r3 == 0x10 || r3 == 0x11 || r3 == 0x14) {
model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_P);
} else {
model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
}
}
if (i_this->m02DC != 0) {
i_this->m1230 = (J3DMaterialTable*)dComIfG_getObjectRes("Bk", BK_BMT_PINK);
} else if (i_this->m02D4 != 0) {
i_this->m1230 = (J3DMaterialTable*)dComIfG_getObjectRes("Bk", BK_BMT_GREEN);
}
i_this->m02C4 = new mDoExt_btpAnm();
if (i_this->m02C4 == NULL) {
// Bug: This function is supposed to return a boolean but here it returns a phase state instead.
// TODO: Check what happens when this bug occurs.
return cPhs_ERROR_e;
}
J3DAnmTexPattern* btp = (J3DAnmTexPattern*)dComIfG_getObjectRes("Bk", BK_BTP_TMABATAKI);
if (!i_this->m02C4->init(model->getModelData(), btp, TRUE, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0)) {
// Bug: Same as above.
// TODO check this case as well.
return cPhs_ERROR_e;
}
J3DModelData* modelData;
modelData = (J3DModelData*)dComIfG_getObjectRes("Bk", BK_BMD_BK_KB);
JUT_ASSERT(9418, modelData != NULL);
if (i_this->m02D5 & 0x40) {
J3DMaterialTable* bmt = (J3DMaterialTable*)dComIfG_getObjectRes("Bk", BK_BMT_BK_KEN);
modelData->setMaterialTable(bmt, J3DMatCopyFlag_Material);
} else {
J3DMaterialTable* bmt = (J3DMaterialTable*)dComIfG_getObjectRes("Bk", BK_BMT_BK_BOKO);
modelData->setMaterialTable(bmt, J3DMatCopyFlag_Material);
}
i_this->m02E8 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (i_this->m02E8 == NULL) {
// Bug: Same as above.
// TODO check this case as well.
return cPhs_ERROR_e;
}
i_this->m02E8->setBaseScale(i_this->scale);
if (i_this->m02D4 != 0) {
modelData = (J3DModelData*)dComIfG_getObjectRes("Bk", BK_BMD_BK_TATE);
i_this->m02D0 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
JUT_ASSERT(9445, modelData != NULL);
}
if (i_this->m02DC != 0) {
modelData = (J3DModelData*)dComIfG_getObjectRes("Bk", BK_BDL_BOUEN);
i_this->m02D8 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
JUT_ASSERT(9454, modelData != NULL);
}
static Vec hip_offset[] = {
{0.0f, 0.0f, 0.0f},
};
static Vec momo_offset[] = {
{-10.0f, 0.0f, 0.0f},
{20.0f, 0.0f, 0.0f},
};
static Vec sune_offset[] = {
{0.0f, -2.0f, 0.0f},
{15.0f, -2.0f, 0.0f},
};
static Vec shipo_offset[] = {
{0.0f, -1.0f, 0.0f},
{22.0f, -1.0f, 0.0f},
};
static Vec mune1_offset[] = {
{15.0f, 0.0f, 0.0f},
{40.0f, 0.0f, 0.0f},
};
static Vec mune2_offset[] = {
{40.0f, 0.0f, 0.0f},
{60.0f, 0.0f, 0.0f},
};
static Vec udeL_offset[] = {
{0.0f, 0.0f, 0.0f},
{45.0f, 0.0f, 0.0f},
};
static Vec udeR_offset[] = {
{0.0f, 0.0f, 0.0f},
{-45.0f, 0.0f, 0.0f},
};
static __jnt_hit_data_c search_data[] = {
{
/* mShapeType */ 1, // Sphere
/* mJointIndex */ 0x01, // hip1 joint
/* mRadius */ 20.0f,
/* mpOffsets */ hip_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x03, // momoL joint
/* mRadius */ 5.0f,
/* mpOffsets */ momo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x04, // suneL1 joint
/* mRadius */ 2.5f,
/* mpOffsets */ sune_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x08, // momorR joint
/* mRadius */ 5.0f,
/* mpOffsets */ momo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x09, // suneR1 joint
/* mRadius */ 2.5f,
/* mpOffsets */ sune_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x0C, // sippo1 joint
/* mRadius */ 3.0f,
/* mpOffsets */ shipo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x0D, // sippo2 joint
/* mRadius */ 2.5f,
/* mpOffsets */ shipo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x0E, // sippo3 joint
/* mRadius */ 1.5f,
/* mpOffsets */ shipo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x0F, // sippo4 joint
/* mRadius */ 2.5f,
/* mpOffsets */ shipo_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x10, // mune joint
/* mRadius */ 20.0f,
/* mpOffsets */ mune1_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x10, // mune joint
/* mRadius */ 15.0f,
/* mpOffsets */ mune2_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x21, // udeL2 joint
/* mRadius */ 6.0f,
/* mpOffsets */ udeL_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x22, // udeL3 joint
/* mRadius */ 3.0f,
/* mpOffsets */ udeL_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x29, // udeR2 joint
/* mRadius */ 6.0f,
/* mpOffsets */ udeR_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x2A, // udeR3 joint
/* mRadius */ 3.0f,
/* mpOffsets */ udeR_offset,
},
};
i_this->mpJntHit = JntHit_create(i_this->mpMorf->getModel(), search_data, ARRAY_SIZE(search_data));
if (i_this->mpJntHit) {
i_this->jntHit = i_this->mpJntHit;
} else {
return FALSE;
}
return TRUE;
}
/* 0000E310-0000EA2C .text daBk_Create__FP10fopAc_ac_c */
static s32 daBk_Create(fopAc_ac_c* i_actor) {
/* Nonmatching - data */
fopAcM_SetupActor(i_actor, bk_class);
bk_class* i_this = (bk_class*)i_actor;
s32 phase_state = dComIfG_resLoad(&i_this->mPhase, "Bk");
if (phase_state == cPhs_COMPLEATE_e) {
i_this->gbaName = 1;
if (strcmp(dComIfGp_getStartStageName(), "ITest63") == 0 ||
strcmp(dComIfGp_getStartStageName(), "GanonJ") == 0)
{
search_sp = 1;
} else {
search_sp = 0;
}
i_this->mType = fopAcM_GetParam(i_this) & 0xF;
i_this->m02B9 = fopAcM_GetParam(i_this) & 0x10;
i_this->m02D4 = fopAcM_GetParam(i_this) & 0x20;
if (i_this->mType == 0xB) {
i_this->m02D4 = 0;
i_this->m02DC = 1;
i_this->mType = 4;
}
i_this->m02D5 = fopAcM_GetParam(i_this) & 0xC0;
i_this->m02B5 = fopAcM_GetParam(i_this) >> 8 & 0xFF;
i_this->m02B6 = fopAcM_GetParam(i_this) >> 16 & 0xFF;
i_this->m02B7 = fopAcM_GetParam(i_this) >> 24 & 0xFF;
i_this->m02B8 = i_this->current.angle.z;
i_this->current.angle.z = 0;
i_this->current.angle.x = 0;
if (i_this->m02B8 == 0xFF) {
i_this->m02B8 = 0;
}
if (i_this->m02B8 != 0) {
if (dComIfGs_isSwitch(i_this->m02B8, fopAcM_GetRoomNo(i_this))) {
return cPhs_ERROR_e;
}
}
if (i_this->m02B9 != 0) {
if (dComIfGs_isSwitch(i_this->m02B7, fopAcM_GetRoomNo(i_this))) {
return cPhs_ERROR_e;
}
i_this->m02B7 = 0xFF;
}
i_this->itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Bk", 0);
if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x17B20)) {
return cPhs_ERROR_e;
}
if (!hio_set) {
l_bkHIO.mNo = mDoHIO_createChild("ボコちゃん", &l_bkHIO); // "Boko-chan"
i_this->m121D = 1;
hio_set = 1;
}
ken = NULL;
if (!i_this->mpMorf || !i_this->mpMorf->getModel()) {
return cPhs_ERROR_e;
}
fopAcM_SetMin(i_this, -200.0f, -50.0f, -100.0f);
fopAcM_SetMax(i_this, 125.0f, 250.0f, 250.0f);
fopAcM_SetMtx(i_this, i_this->mpMorf->getModel()->getBaseTRMtx());
i_this->mpMorf->getModel()->setUserArea((u32)i_this);
i_this->initBt(162.5f, 125.0f);
i_this->dr.m70C = 1;
i_this->dr.mSpawnY = i_this->current.pos.y;
i_this->dr.mMaxFallDistance = 1000.0f;
if (i_this->m02B6 != 0xFF) {
i_this->ppd = dPath_GetRoomPath(i_this->m02B6, fopAcM_GetRoomNo(i_this));
if (i_this->ppd == NULL) {
return cPhs_ERROR_e;
}
i_this->m1215 = i_this->m02B6 + 1;
i_this->m1217 = 1;
}
if (i_this->mType == 4 || i_this->mType == 0xA) {
i_this->dr.mState = 1;
if (i_this->mType == 0xA) {
i_this->dr.m004 = -0x14;
fopAcM_OnStatus(i_this, fopAcStts_BOSS_e);
} else {
i_this->dr.m004 = -1;
}
i_this->m0300[1] = 1000.0f + cM_rndF(1000.0f);
} else if (i_this->mType == 6) {
i_this->dr.mState = 2;
i_this->dr.mMaxFallDistance = 300.0f;
} else if (i_this->mType == 7) {
i_this->dr.mState = 0x1D;
i_this->dr.mMaxFallDistance = 300.0f;
} else if (i_this->mType == 5) {
anm_init(i_this, BK_BCK_BK_HAKOBI, 1.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
i_this->dr.mState = 0x1E;
i_this->dr.mMaxFallDistance = 100000.0f;
} else if (i_this->mType == 2 || i_this->mType == 3) {
i_this->m02BA = 0xFF;
i_this->dr.mState = 0xF;
i_this->m030E = 0xA;
} else if (i_this->mType == 9) {
i_this->dr.mState = 3;
i_this->m1216 = i_this->current.angle.z;
i_this->m1217 = i_this->current.angle.y;
i_this->current.angle.z = 0;
i_this->current.angle.y = 0;
}
if (i_this->m02B7 != 0xFF) {
if (i_this->mType != 6) {
i_this->m02BA = i_this->m02B7 + 1;
}
}
if (i_this->mType == 0xF) {
i_this->dr.mState = 0x17;
i_this->m02BA = 0;
}
if (i_this->mType != 8 && i_this->m02DC == 0 &&
strcmp(dComIfGp_getStartStageName(), "A_mori") != 0)
{
u32 weaponType; // TODO enum
if (i_this->m02D5 & 0x40) {
weaponType = 1;
} else if (i_this->m02D5 & 0x80) {
weaponType = 7;
} else {
weaponType = 0;
}
i_this->m1200 = fopAcM_create(PROC_BOKO, weaponType, &i_this->current.pos, fopAcM_GetRoomNo(i_this));
i_this->m1214 = 1;
i_this->m02D5 &= 0x40;
} else {
i_this->m11F3 = 1;
}
i_this->dr.mAcch.Set(
fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this),
i_this, 1, &i_this->dr.mAcchCir,
fopAcM_GetSpeed_p(i_this)
);
i_this->dr.mAcchCir.SetWall(40.0f, 40.0f);
i_this->dr.mAcch.ClrRoofNone();
i_this->dr.mAcch.SetRoofCrrHeight(80.0f + REG0_F(7));
i_this->dr.mAcch.OnLineCheck();
i_this->dr.mInvincibleTimer = 5;
if (i_this->m02D4 != 0) {
i_this->max_health = i_this->health = 7;
} else {
i_this->max_health = i_this->health = 5;
}
i_this->dr.mStts.Init(200, 0xFF, i_this);
static dCcD_SrcCyl co_cyl_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ 0,
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsGrpAll_e,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ 0,
/* SrcGObjAt Spl */ 0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ 0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGCylS
{
/* Center */ 0.0f, 0.0f, 0.0f,
/* Radius */ 62.5f,
/* Height */ 100.0f,
},
};
i_this->m0B88.Set(co_cyl_src);
i_this->m0B88.SetStts(&i_this->dr.mStts);
static dCcD_SrcCyl tg_cyl_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ 0,
/* SrcGObjAt Spl */ 0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ dCcG_TgHitMark_Unk1_e,
/* SrcGObjTg Spl */ 0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGCylS
{
/* Center */ 0.0f, 0.0f, 0.0f,
/* Radius */ 30.0f,
/* Height */ 112.5f,
},
};
i_this->m0CB8.Set(tg_cyl_src);
i_this->m0CB8.SetStts(&i_this->dr.mStts);
static dCcD_SrcSph head_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ 0,
/* SrcGObjAt Spl */ 0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ dCcG_TgHitMark_Unk1_e,
/* SrcGObjTg Spl */ 0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{
/* Center */ 0.0f, 0.0f, 0.0f,
/* Radius */ 37.5f,
},
};
i_this->m0DE8.Set(head_sph_src);
i_this->m0DE8.SetStts(&i_this->dr.mStts);
static dCcD_SrcSph wepon_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ AT_TYPE_UNK800,
/* SrcObjAt Atp */ 2,
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsEnemy_e | cCcD_AtSPrm_VsPlayer_e | cCcD_AtSPrm_VsOther_e,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ 0,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_Nrm_e,
/* SrcGObjAt Spl */ 0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ dCcG_AtSPrm_NoConHit_e,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ 0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ 0,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{
/* Center */ 0.0f, 0.0f, 0.0f,
/* Radius */ 100.0f,
},
};
i_this->m1040.Set(wepon_sph_src);
i_this->m1040.SetStts(&i_this->dr.mStts);
static dCcD_SrcSph defence_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ 0,
/* SrcGObjAt Spl */ 0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ dCcG_SE_UNK6,
/* SrcGObjTg HitMark */ dCcg_TgHitMark_Purple_e,
/* SrcGObjTg Spl */ 0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_NoConHit_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{
/* Center */ 0.0f, 0.0f, 0.0f,
/* Radius */ 62.5f,
},
};
i_this->m0F14.Set(defence_sph_src);
i_this->m0F14.SetStts(&i_this->dr.mStts);
i_this->m02CC = 5;
i_this->model = i_this->mpMorf->getModel();
i_this->mEnemyIce.mpActor = i_this;
i_this->mEnemyIce.mWallRadius = 50.0f + REG0_F(4);
i_this->mEnemyIce.mCylHeight = 180.0f + REG0_F(5);
i_this->mEnemyIce.mDeathSwitch = i_this->m02B8;
i_this->mEnemyFire.mpMcaMorf = i_this->mpMorf;
i_this->mEnemyFire.mpActor = i_this;
static u8 fire_j[ARRAY_SIZE(i_this->mEnemyFire.mFlameJntIdxs)] = {
0x12,
0x10,
0x29,
0x2A,
0x21,
0x22,
0x08,
0x09,
0x03,
0x04,
};
static f32 fire_sc[ARRAY_SIZE(i_this->mEnemyFire.mParticleScale)] = {
2.0f,
2.0f,
1.2f,
1.0f,
1.2f,
1.0f,
1.2f,
1.0f,
1.2f,
1.0f,
};
for (int i = 0; i < ARRAY_SIZE(i_this->mEnemyFire.mFlameJntIdxs); i++) {
i_this->mEnemyFire.mFlameJntIdxs[i] = fire_j[i];
i_this->mEnemyFire.mParticleScale[i] = fire_sc[i];
}
i_this->stealItemLeft = 3;
daBk_Execute(i_this);
}
return phase_state;
}
static actor_method_class l_daBk_Method = {
(process_method_func)daBk_Create,
(process_method_func)daBk_Delete,
(process_method_func)daBk_Execute,
(process_method_func)daBk_IsDelete,
(process_method_func)daBk_Draw,
};
actor_process_profile_definition g_profile_BK = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_BK,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(bk_class),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ 0x00B0,
/* Actor SubMtd */ &l_daBk_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e | fopAcStts_UNK80000_e,
/* Group */ fopAc_ENEMY_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};