/** * d_a_bk.cpp * Enemy - Bokoblin */ #include "d/actor/d_a_bk.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( 0x2022, &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 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(0x24, &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 param_1) { if (!param_1) { 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 param_1) { if (!param_1) { 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() == DROPPED_SWORD) { 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) { /* Nonmatching */ } /* 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) { /* Nonmatching */ } /* 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) { /* Nonmatching */ } /* 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(0xE, &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_root.mDoHIO_deleteChild(l_bkHIO.mChildID); } 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.mChildID = mDoHIO_root.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, };