/** * @file d_a_e_bug.cpp * */ #include "d/dolzel_rel.h" #include "d/actor/d_a_e_bug.h" #include "d/actor/d_a_player.h" #include "d/d_path.h" #include "d/actor/d_a_nbomb.h" #include "Z2AudioLib/Z2Instances.h" enum E_bug_RES_File_ID { /* BMDG */ /* 0x3 */ BMDG_MU04 = 0x3, /* 0x4 */ BMDG_MU05, }; /* 80694B8C-80694BBC 0000EC 0030+00 1/1 0/0 0/0 .text __ct__13daE_Bug_HIO_cFv */ daE_Bug_HIO_c::daE_Bug_HIO_c() { field_0x4 = -1; field_0x8 = 1.5f; field_0xc = 1.0f; } /* 80697E6C-80697E70 -00001 0004+00 1/2 0/0 0/0 .bss None */ /* 80697E6C 0001+00 data_80697E6C @1009 */ /* 80697E6D 0003+00 data_80697E6D None */ static u8 l_initHIO; /* 80697E7C-80697E8C 000054 0010+00 4/6 0/0 0/0 .bss l_HIO */ static daE_Bug_HIO_c l_HIO; /* 80697E8C-80697E90 -00001 0004+00 4/8 0/0 0/0 .bss None */ /* 80697E8C 0001+00 data_80697E8C None */ static s8 l_roomNo; /* 80697E8D 0003+00 data_80697E8D None */ static s8 data_80697E8D; /* 80694BBC-80694CC8 00011C 010C+00 1/0 0/0 0/0 .text daE_Bug_Draw__FP11e_bug_class */ static int daE_Bug_Draw(e_bug_class* i_this) { bug_s* bugs = i_this->Bug_s; for (int i = 0; i < i_this->bug_num; i++, bugs++) { if (bugs->field_0x50 == 4) { if ((bugs->field_0x8 & 1) != 0) { dComIfGp_entrySimpleModel(bugs->field_0x0, l_roomNo); } else { dComIfGp_entrySimpleModel(bugs->field_0x4, l_roomNo); } } else if (bugs->field_0x50 >= 1) { if ((bugs->field_0x52 & 2) != 0) { dComIfGp_entrySimpleModel(bugs->field_0x0, l_roomNo); } else { dComIfGp_entrySimpleModel(bugs->field_0x4, l_roomNo); } } } return 1; } /* 80694CC8-80694F58 000228 0290+00 3/3 0/0 0/0 .text simple_bg_check__FP5bug_si */ static int simple_bg_check(bug_s* i_this, int param_2) { dBgS_LinChk lin_chk; cXyz start, end, spc0, spcc; spcc.y = 0.0f; int iVar1 = 0; f32 fVar1 = (i_this->field_0xc - i_this->field_0x18).abs() + 5.0f; cMtx_YrotS(*calc_mtx, i_this->field_0x3c.y); static f32 c_x[4] = {0.0f, 1.0f, -1.0f, 0.0f}; static f32 c_z[4] = {2.0f, 0.0f, 0.0f, -2.0f}; for (int i = 0; i < param_2 + 3; i++) { start = i_this->field_0x18; start.y += 20.0f; spcc.x = fVar1 * c_x[i]; spcc.z = fVar1 * c_z[i]; MtxPosition(&spcc, &spc0); end = start + spc0; lin_chk.Set(&start, &end, NULL); if (dComIfG_Bgsp().LineCross(&lin_chk)) { i_this->field_0x18.x -= spc0.x; i_this->field_0x18.z -= spc0.z; iVar1 = i + 1; } } return iVar1; } /* 80694F94-8069506C 0004F4 00D8+00 1/1 0/0 0/0 .text bug_mtxset__FP5bug_s */ static void bug_mtxset(bug_s* i_this) { mDoMtx_stack_c::transS(i_this->field_0x18.x, i_this->field_0x18.y, i_this->field_0x18.z); mDoMtx_stack_c::XrotM(i_this->field_0x44); mDoMtx_stack_c::ZrotM(i_this->field_0x46); mDoMtx_stack_c::YrotM(i_this->field_0x3c.y); mDoMtx_stack_c::XrotM(i_this->field_0x3c.x); mDoMtx_stack_c::scaleM(l_HIO.field_0x8 * i_this->field_0x28, l_HIO.field_0x8 * i_this->field_0x28, l_HIO.field_0x8 * i_this->field_0x28); if ((i_this->field_0x52 & 2) != 0) { i_this->field_0x0->setBaseTRMtx(mDoMtx_stack_c::get()); } else { i_this->field_0x4->setBaseTRMtx(mDoMtx_stack_c::get()); } } /* 8069506C-806951C8 0005CC 015C+00 1/1 0/0 0/0 .text bug_mtxset_stick__FP5bug_s */ static void bug_mtxset_stick(bug_s* i_this) { cXyz sp2c; mDoMtx_stack_c::transS(i_this->field_0x18.x, i_this->field_0x18.y, i_this->field_0x18.z); mDoMtx_stack_c::YrotM(i_this->field_0x3c.y); sp2c = i_this->field_0x18 - i_this->field_0xc; s16 sVar1 = cM_atan2s(JMAFastSqrt(sp2c.x * sp2c.x + sp2c.z * sp2c.z), sp2c.y); if (i_this->field_0x4a < 0) { sVar1 *= -1; } cLib_addCalcAngleS2(&i_this->field_0x3c.z, sVar1, 2, 0x1000); mDoMtx_stack_c::ZrotM(i_this->field_0x3c.z); mDoMtx_stack_c::XrotM(-0x4000); mDoMtx_stack_c::scaleM(l_HIO.field_0xc * i_this->field_0x28, l_HIO.field_0xc * i_this->field_0x28, l_HIO.field_0xc * i_this->field_0x28); mDoMtx_stack_c::transM(0.0f, 2.0f, 0.0f); if ((i_this->field_0x52 & 2) != 0) { i_this->field_0x0->setBaseTRMtx(mDoMtx_stack_c::get()); } else { i_this->field_0x4->setBaseTRMtx(mDoMtx_stack_c::get()); } } /* 806951C8-806953E4 000728 021C+00 1/1 0/0 0/0 .text bug_mtxset_stickW__FP5bug_s */ static void bug_mtxset_stickW(bug_s* i_this) { fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp38, sp44, sp50; sp38 = i_this->field_0x18 - i_this->field_0xc; s16 sVar1 = cM_atan2s(JMAFastSqrt(sp38.x * sp38.x + sp38.z * sp38.z), sp38.y); if (i_this->field_0x4a < 0) { sVar1 *= -1; } MTXCopy(daPy_getLinkPlayerActorClass()->getModelJointMtx(1), *calc_mtx); sp38.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp38, &sp44); sp50 = i_this->field_0x18 - sp44; mDoMtx_stack_c::transS(sp44.x, sp44.y, sp44.z); mDoMtx_stack_c::YrotM(player->shape_angle.y); mDoMtx_stack_c::XrotM(-14000); mDoMtx_stack_c::transM(sp50.x, sp50.y, sp50.z); mDoMtx_stack_c::YrotM(i_this->field_0x3c.y); cLib_addCalcAngleS2(&i_this->field_0x3c.z, sVar1, 2, 0x1000); mDoMtx_stack_c::ZrotM(i_this->field_0x3c.z); mDoMtx_stack_c::XrotM(-0x4000); mDoMtx_stack_c::scaleM(l_HIO.field_0xc * i_this->field_0x28, l_HIO.field_0xc * i_this->field_0x28, l_HIO.field_0xc * i_this->field_0x28); mDoMtx_stack_c::transM(0.0f, 2.0f, 0.0f); if ((i_this->field_0x52 & 2) != 0) { i_this->field_0x0->setBaseTRMtx(mDoMtx_stack_c::get()); } else { i_this->field_0x4->setBaseTRMtx(mDoMtx_stack_c::get()); } } /* 806953E4-806954D4 000944 00F0+00 1/1 0/0 0/0 .text bug_mtxset_fail__FP5bug_s */ static void bug_mtxset_fail(bug_s* i_this) { mDoMtx_stack_c::transS(i_this->field_0x18.x, i_this->field_0x18.y, i_this->field_0x18.z); mDoMtx_stack_c::XrotM(i_this->field_0x44); mDoMtx_stack_c::ZrotM(i_this->field_0x46); mDoMtx_stack_c::YrotM(i_this->field_0x3c.y); mDoMtx_stack_c::XrotM(i_this->field_0x3c.x); mDoMtx_stack_c::scaleM(l_HIO.field_0x8 * i_this->field_0x28, l_HIO.field_0x8 * i_this->field_0x28, l_HIO.field_0x8 * i_this->field_0x28); mDoMtx_stack_c::transM(0.0f, -4.0f, 0.0f); if ((i_this->field_0x8 & 1) != 0) { i_this->field_0x0->setBaseTRMtx(mDoMtx_stack_c::get()); } else { i_this->field_0x4->setBaseTRMtx(mDoMtx_stack_c::get()); } } /* 806954D4-806957DC 000A34 0308+00 1/1 0/0 0/0 .text bug_ground_ang_set__FP5bug_s */ static void bug_ground_ang_set(bug_s* i_this) { dBgS_LinChk lin_chk; cXyz sp8c, end, cross; cXyz start(i_this->field_0x18); start.y += 30.0f; mDoMtx_stack_c::transS(i_this->field_0x18.x, i_this->field_0x18.y, i_this->field_0x18.z); mDoMtx_stack_c::transM(5.0f, -30.0f, 0.0f); mDoMtx_stack_c::multVecZero(&end); mDoMtx_stack_c::transM(-10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&cross); s8 sVar1 = 0; lin_chk.Set(&start, &end, NULL); if (dComIfG_Bgsp().LineCross(&lin_chk)) { end = lin_chk.GetCross(); lin_chk.Set(&start, &cross, NULL); if (dComIfG_Bgsp().LineCross(&lin_chk)) { cross = lin_chk.GetCross(); sVar1 = 1; } } if (sVar1) { sp8c = end - cross; i_this->field_0x46 = cM_atan2s(sp8c.y, JMAFastSqrt(sp8c.x * sp8c.x + sp8c.z * sp8c.z)); } mDoMtx_stack_c::transM(5.0f, 0.0f, 5.0f); mDoMtx_stack_c::multVecZero(&end); mDoMtx_stack_c::transM(0.0f, 0.0f, -10.0f); mDoMtx_stack_c::multVecZero(&cross); sVar1 = 0; lin_chk.Set(&start, &end, NULL); if (dComIfG_Bgsp().LineCross(&lin_chk)) { end = lin_chk.GetCross(); lin_chk.Set(&start, &cross, NULL); if (dComIfG_Bgsp().LineCross(&lin_chk)) { cross = lin_chk.GetCross(); sVar1 = 1; } } if (sVar1) { sp8c = end - cross; i_this->field_0x44 = -cM_atan2s(sp8c.y, JMAFastSqrt(sp8c.x * sp8c.x + sp8c.z * sp8c.z)); } } /* 806957DC-806958E8 000D3C 010C+00 2/2 0/0 0/0 .text bug_action__FP11e_bug_classP5bug_s */ static int bug_action(e_bug_class* a_this, bug_s* i_this) { int rv = 0; i_this->field_0x18.x += i_this->field_0x30.x; i_this->field_0x18.y += i_this->field_0x30.y; i_this->field_0x18.z += i_this->field_0x30.z; i_this->field_0x30.y -= 3.0f; if (i_this->field_0x30.y < -60.0f) { i_this->field_0x30.y = -60.0f; } cXyz sp24(i_this->field_0x18.x, i_this->field_0x18.y + 70.0f, i_this->field_0x18.z); if (fopAcM_gc_c::gndCheck(&sp24)) { if (i_this->field_0x18.y <= fopAcM_gc_c::getGroundY()) { i_this->field_0x18.y = fopAcM_gc_c::getGroundY(); i_this->field_0x30.y = -i_this->field_0x24 - 0.5f; if ((i_this->field_0x52 & 7) == 0) { bug_ground_ang_set(i_this); } rv = 1; } } return rv; } /* 80697E9C-80697EA8 000074 000C+00 1/5 0/0 0/0 .bss at_pos */ static cXyz at_pos; /* 80697EA8-80697EAC 000080 0004+00 0/3 0/0 0/0 .bss at_size */ static f32 at_size; /* 80697EAC-80697EB0 000084 0004+00 2/3 0/0 0/0 .bss None */ static s8 data_80697EAC; /* 806958E8-80695BE4 000E48 02FC+00 1/1 0/0 0/0 .text bug_stick__FP5bug_s */ static void bug_stick(bug_s* i_this) { cXyz sp30, sp3c, sp48; daPy_py_c* player = daPy_getLinkPlayerActorClass(); MTXCopy(player->getModelJointMtx(1), *calc_mtx); sp30.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp30, &sp48); if ((i_this->field_0x52 & 15) == 0) { if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x4a = cM_rndF(1000.0f) + 1000.0f; } else { i_this->field_0x4a = -(cM_rndF(1000.0f) + 1000.0f); } if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x4e = cM_rndF(200.0f) + 600.0f; } } i_this->field_0x48 += i_this->field_0x4a; i_this->field_0x4c += i_this->field_0x4e; f32 fVar1 = cM_ssin(i_this->field_0x4c); cMtx_YrotS(*calc_mtx, i_this->field_0x48); sp30.x = 0.0f; sp30.y = fVar1 * 40.0f; sp30.z = 7.0f * fabsf(fVar1) + 13.0f; if (fabsf(sp30.y) > 30.0f) { sp30.z *= 0.6f; } MtxPosition(&sp30, &sp3c); i_this->field_0x18 = sp48 + sp3c; i_this->field_0x3c.y = i_this->field_0x48 + 0x8000; if ((i_this->field_0x52 & 15) == 0 && (daPy_getLinkPlayerActorClass()->checkFrontRoll() || daPy_getLinkPlayerActorClass()->checkMetamorphose() || daPy_getPlayerActorClass()->eventInfo.checkCommandDoor() || data_80697EAC != 0)) { i_this->field_0x50 = 1; i_this->field_0x3c.y = i_this->field_0x48; i_this->field_0x30.y = cM_rndF(5.0f) + 30.0f; i_this->field_0x24 = cM_rndF(3.0f) + 9.0f; i_this->mSound.startSound(Z2SE_EN_BUG_JUMP, 0, -1); i_this->field_0x54[2] = cM_rndF(20.0f) + 20.0f; } } /* 80695BE4-80695DE8 001144 0204+00 1/1 0/0 0/0 .text bug_stickW__FP5bug_s */ static void bug_stickW(bug_s* i_this) { cXyz sp34, sp40, sp4c; MTXCopy(daPy_getLinkPlayerActorClass()->getModelJointMtx(1), *calc_mtx); sp34.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp34, &sp4c); if ((i_this->field_0x52 & 15) == 0) { if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x4a = cM_rndF(1000.0f) + 1000.0f; } else { i_this->field_0x4a = -(cM_rndF(1000.0f) + 1000.0f); } if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x4e = cM_rndF(200.0f) + 600.0f; } } i_this->field_0x48 += i_this->field_0x4a; i_this->field_0x4c += i_this->field_0x4e; f32 fVar1 = cM_ssin(i_this->field_0x4c); cMtx_YrotS(*calc_mtx, i_this->field_0x48); sp34.x = 0.0f; sp34.y = (fVar1 * 41.0f - 5.0f) - 30.0f; sp34.z = -13.0f * fabsf(fVar1) + 13.0f + 10.0f; MtxPosition(&sp34, &sp40); i_this->field_0x18 = sp4c + sp40; i_this->field_0x3c.y = i_this->field_0x48 + 0x8000; } /* 80695DE8-80695ECC 001348 00E4+00 1/1 0/0 0/0 .text wind_move__FP5bug_s */ static void wind_move(bug_s* i_this) { s16 sVar1 = i_this->field_0x52 * -0x1700; i_this->field_0x3c.x -= 0xD00; i_this->field_0x3c.y += 0x700; i_this->field_0x30.x = cM_ssin(sVar1) * 25.0f; i_this->field_0x30.z = cM_scos(sVar1) * 25.0f; i_this->field_0x30.y = 20.0f; i_this->field_0x18 += i_this->field_0x30; if (i_this->field_0x54[0] == 0 || simple_bg_check(i_this, 1) != 0) { i_this->field_0x50 = 1; i_this->field_0x3c.y = sVar1; i_this->field_0x24 = cM_rndF(5.0f) + 8.0f; } } /* 80695ECC-80695FCC 00142C 0100+00 1/1 0/0 0/0 .text bug_fail__FP11e_bug_classP5bug_s */ static void bug_fail(e_bug_class* a_this, bug_s* i_this) { i_this->field_0x53 = bug_action(a_this, i_this); if (i_this->field_0x51 == 0 && simple_bg_check(i_this, 1) != 0) { i_this->field_0x51 = 1; i_this->field_0x18 = i_this->field_0xc; i_this->field_0x30.x = 0.0f; i_this->field_0x30.z = 0.0f; } if (i_this->field_0x53 == 0) { i_this->field_0x3c.x += 0x2000; i_this->field_0x3c.y += 0x1300; } else { i_this->field_0x30.set(0.0f, 0.0f, 0.0f); i_this->field_0x3c.x = -0x8000; } if (i_this->field_0x54[0] == 0) { cLib_addCalc0(&i_this->field_0x28, 1.0f, 0.1f); if (i_this->field_0x28 < 0.01f) { i_this->field_0x50 = 0; } } } /* 80695FCC-806965B4 00152C 05E8+00 1/1 0/0 0/0 .text damage_check__FP11e_bug_classP5bug_s */ static void damage_check(e_bug_class* a_this, bug_s* i_this) { fopAc_ac_c* actor = (fopAc_ac_c*)&a_this->actor; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp4c, sp58; f32 fVar1 = 70.0f; if (daPy_py_c::checkNowWolf()) { sp58 = player->current.pos; } else { if (daPy_getLinkPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_TURN_RIGHT || daPy_getLinkPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT || daPy_getLinkPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT || daPy_getLinkPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_TURN_LEFT) { sp58 = player->current.pos; fVar1 = 200.0f; } else { MTXCopy(player->getLeftItemMatrix(), mDoMtx_stack_c::get()); mDoMtx_stack_c::multVecZero(&sp58); sp58.y -= 50.0f; } } sp4c = i_this->field_0x18 - sp58; s8 sVar1 = 0; if (daPy_getPlayerActorClass()->getCutAtFlg() != 0 && sp4c.abs() < fVar1) { if (daPy_py_c::checkNowWolf()) { if (i_this->field_0x50 == 2) { sVar1 = 2; } else { sVar1 = 1; } } else if (i_this->field_0x50 == 1 || fVar1 > 100.0f) { sVar1 = 1; } } if (data_80697E8D != 0) { sp4c = i_this->field_0x18 - at_pos; if (data_80697E8D == 1) { if (sp4c.y < 50.0f && sp4c.y > -400.0f && JMAFastSqrt(sp4c.x * sp4c.x + sp4c.z * sp4c.z) < 50.0f) { sVar1 = 2; } } else if (data_80697E8D == 2) { if (sp4c.abs() < at_size) { sVar1 = 1; } } } if (sVar1 != 0){ if (sVar1 == 1) { i_this->field_0x50 = 4; i_this->field_0x51 = 0; i_this->field_0x54[0] = cM_rndF(15.0f) + 15.0f + 25.0f; i_this->mSound.startSound(Z2SE_EN_BUG_DIE, 0, -1); cMtx_YrotS(*calc_mtx, cM_atan2s(sp4c.x, sp4c.z)); sp4c.x = 0.0f; if (data_80697E8D == 2) { sp4c.y = cM_rndF(10.0f) + 35.0f; sp4c.z = cM_rndF(10.0f) + 35.0f; } else { sp4c.y = cM_rndF(10.0f) + 20.0f; sp4c.z = cM_rndF(10.0f) + 20.0f; } MtxPosition(&sp4c, &i_this->field_0x30); i_this->field_0x53 = 0; i_this->field_0x3c.x = cM_rndF(65536.0f); i_this->field_0x3c.z = cM_rndF(65536.0f); cXyz sp64(0.35f, 0.35f, 0.35f); dComIfGp_setHitMark(1, actor, &i_this->field_0x18, NULL, &sp64, 0); } else { i_this->field_0x50 = 3; i_this->field_0x54[0] = cM_rndF(10.0f) + 15.0f; i_this->field_0x3c.y = cM_rndF(65536.0f); } } } /* 806965B4-80696828 001B14 0274+00 1/1 0/0 0/0 .text set_wait__FP11e_bug_classP5bug_s */ static void set_wait(e_bug_class* a_this, bug_s* i_this) { fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp40; s8 sVar1 = 0; switch (i_this->field_0x51) { case 0: if (a_this->bitSw != 0xFF) { if (dComIfGs_isSwitch(a_this->bitSw, l_roomNo)) { sVar1 = 1; } } else { sp40 = i_this->field_0x18 - player->current.pos; if (sp40.abs() < a_this->field_0x57c) { sVar1 = 1; } } break; case 1: if (i_this->field_0x54[0] == 0) { i_this->field_0x50 = 1; i_this->field_0x51 = 0; } break; } if (sVar1) { i_this->field_0x54[0] = i_this->field_0x8 * 3.0f + cM_rndF(2.0f); i_this->field_0x51 = 1; sp40 = i_this->field_0x18 - player->current.pos; i_this->field_0x3c.y = cM_rndFX(65536.0f); } } /* 80696828-80696E84 001D88 065C+00 1/1 0/0 0/0 .text normal_move__FP11e_bug_classP5bug_s */ static void normal_move(e_bug_class* a_this, bug_s* i_this) { fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp68, sp74; if (i_this->field_0x53 != 0) { if ((i_this->field_0x52 & 15) == 0) { i_this->field_0x4a = cM_rndF(1000.0f) + 700.0f; i_this->field_0x24 = cM_rndFX(0.5f) + 5.0f; } s16 sVar1 = cM_ssin(i_this->field_0x48) * 3000.0f; i_this->field_0x48 += i_this->field_0x4a; sp74.x = player->current.pos.x - i_this->field_0x18.x; sp74.z = player->current.pos.z - i_this->field_0x18.z; if (data_80697EAC != 0 && JMAFastSqrt(sp74.x * sp74.x + sp74.z * sp74.z) < 200.0f) { sVar1 -= 0x8000; } cLib_addCalcAngleS2(&i_this->field_0x3c.y, i_this->field_0x42 + (sVar1 + cM_atan2s(sp74.x, sp74.z)), 2, 0x800); i_this->field_0x3c.x = 0; } else { i_this->field_0x3c.x += (s16)((i_this->field_0x8 << 1) + 0xE00); } i_this->field_0x30.x = i_this->field_0x24 * cM_ssin(i_this->field_0x3c.y); i_this->field_0x30.z = i_this->field_0x24 * cM_scos(i_this->field_0x3c.y); i_this->field_0x53 = bug_action(a_this, i_this); if (i_this->field_0x54[1] == 1) { i_this->field_0x42 = 0; } sp74 = player->current.pos - i_this->field_0x18; f32 fVar1 = JMAFastSqrt(sp74.x * sp74.x + sp74.z * sp74.z); f32 fVar2 = sp74.y; if ((i_this->field_0x52 & 1) != 0) { f32 fVar3 = sp74.abs(); if (i_this->field_0x53 != 0 && data_80697EAC == 0 && i_this->field_0x54[2] == 0 && fVar3 < 140.0f) { s16 sVar2 = cM_atan2s(sp74.x, sp74.z); s16 sVar3 = i_this->field_0x3c.y - sVar2; if (sVar3 < 0x1000 && sVar3 > -0x1000) { i_this->field_0x30.y = cM_rndF(5.0f) + 25.0f; i_this->field_0x24 = 9.0f; i_this->field_0x53 = 0; i_this->field_0x3c.y = sVar2; i_this->mSound.startSound(Z2SE_EN_BUG_JUMP, 0, -1); } } f32 fVar4 = fVar3 * 0.10000000149011612f; if (fVar4 > 100.0f) { fVar4 = 100.0f; } else if (fVar4 < 20.0f) { fVar4 = 20.0f; } cLib_addCalc2(&i_this->field_0x2c, fVar4, 0.2f, 2.0f); int iVar1 = i_this->field_0x8 + 1; for (int i = iVar1; i < a_this->bug_num; i++) { sp68.x = a_this->Bug_s[i].field_0x18.x - i_this->field_0x18.x; sp68.z = a_this->Bug_s[i].field_0x18.z - i_this->field_0x18.z; fVar4 = JMAFastSqrt(sp68.x * sp68.x + sp68.z * sp68.z); iVar1 = i; if (fVar4 < i_this->field_0x2c) { cMtx_YrotS(*calc_mtx, cM_atan2s(-sp68.x, -sp68.z)); sp68.x = 0.0f; sp68.y = 0.0f; sp68.z = 0.4f; MtxPosition(&sp68, &sp74); i_this->field_0x18.x += sp74.x; i_this->field_0x18.z += sp74.z; iVar1 = i; } } } if (i_this->field_0x30.y <= 0.0f && data_80697EAC == 0 && !dComIfGp_checkPlayerStatus0(0, 0x100) && fVar1 < 40.0f && fVar2 <= 0.0f && fVar2 >= -150.0f) { i_this->field_0x50 = 2; if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x4a = cM_rndF(1000.0f) + 1000.0f; } else { i_this->field_0x4a = -(cM_rndF(1000.0f) + 1000.0f); } i_this->field_0x4e = cM_rndF(300.0f) + 600.0f; } int iVar2 = simple_bg_check(i_this, 0); if (i_this->field_0x54[1] == 0 && iVar2 >= 2) { if (iVar2 == 3) { i_this->field_0x42 = 0x1000; } else { i_this->field_0x42 = -0x1000; } i_this->field_0x54[1] = cM_rndF(30.0f) + 30.0f; } } /* 80696E84-80697160 0023E4 02DC+00 1/1 0/0 0/0 .text bug_control__FP11e_bug_class */ static void bug_control(e_bug_class* a_this) { fopAc_ac_c* actor = (fopAc_ac_c*)&a_this->actor; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp1c, sp28; bug_s* i_this = a_this->Bug_s; u8 sVar1 = 0; u8 sVar2 = 0; u8 uVar1 = 0; for (int i = 0; i < a_this->bug_num; i++, i_this++) { if (i_this->field_0x50 != 0) { if (i_this->field_0x18.y < actor->home.pos.y - 2000.0f) { i_this->field_0x50 = 0; } sVar1++; i_this->field_0xc = i_this->field_0x18; actor->current.pos = i_this->field_0x18; for (int j = 0; j < 3; j++) { if (i_this->field_0x54[j] != 0) { i_this->field_0x54[j]--; } } i_this->field_0x52++; if (i_this->field_0x50 == -1) { set_wait(a_this, i_this); bug_mtxset(i_this); } else if (i_this->field_0x50 == 1) { normal_move(a_this, i_this); if (i_this->field_0x53 != 0) { sVar2++; } bug_mtxset(i_this); damage_check(a_this, i_this); } else if (i_this->field_0x50 == 2) { if (daPy_py_c::checkNowWolf()) { bug_stickW(i_this); bug_mtxset_stickW(i_this); } else { bug_stick(i_this); bug_mtxset_stick(i_this); } uVar1++; damage_check(a_this, i_this); } else if (i_this->field_0x50 == 3) { wind_move(i_this); bug_mtxset(i_this); damage_check(a_this, i_this); } else if (i_this->field_0x50 == 4) { bug_fail(a_this, i_this); bug_mtxset_fail(i_this); } i_this->mSound.framework(0, dComIfGp_getReverb(l_roomNo)); } } if (sVar1 == 0) { fopAcM_delete(actor); OS_REPORT("E_BUG DELETED \n"); } else { if (sVar2 != 0) { a_this->mSound.playBeeGroupSound(Z2SE_EN_BUG_WALK_GRD, sVar2); } if (uVar1 != 0) { a_this->mSound.playBeeGroupSound(Z2SE_EN_BUG_WALK_BODY, uVar1); } a_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(actor))); } if (uVar1 > 10) { player->onHeavyStateMidnaPanic(); } } /* 80697160-806971EC 0026C0 008C+00 1/1 0/0 0/0 .text s_boom_sub__FPvPv */ static void* s_boom_sub(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_BOOMERANG && daPy_py_c::checkBoomerangCharge() && fopAcM_GetParam(i_actor) == 1) { data_80697E8D = 1; at_pos = ((fopAc_ac_c*)i_actor)->current.pos; return i_actor; } return NULL; } /* 806971EC-80697294 00274C 00A8+00 1/1 0/0 0/0 .text s_bomb_sub__FPvPv */ static void* s_bomb_sub(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor) && dBomb_c::checkBombActor((fopAc_ac_c*)i_actor) && ((daNbomb_c*)i_actor)->checkExplodeNow()) { data_80697E8D = 2; at_pos = ((fopAc_ac_c*)i_actor)->current.pos; at_size = 300.0f; return i_actor; } return NULL; } /* 80697294-806975A0 0027F4 030C+00 2/1 0/0 0/0 .text daE_Bug_Execute__FP11e_bug_class */ static int daE_Bug_Execute(e_bug_class* i_this) { daPy_py_c* player = daPy_getPlayerActorClass(); if (!player->checkMetamorphose()) { if (!daPy_getPlayerActorClass()->eventInfo.checkCommandDoor() && dComIfGp_event_runCheck()) { return 1; } } i_this->field_0x580++; data_80697E8D = 0; fpcM_Search(s_boom_sub, i_this); fpcM_Search(s_bomb_sub, i_this); if (daPy_getPlayerActorClass()->checkSpinnerRide()) { if (daPy_getPlayerActorClass()->checkSpinnerTriggerAttack()) { data_80697E8D = 2; at_pos = player->current.pos; at_size = 120.0f; } } if ((i_this->field_0x580 & 1) != 0) { cXyz* pos = player->getIronBallCenterPos(); if (pos != NULL && (player->current.pos - *pos).abs() > 200.0f && !daPy_getPlayerActorClass()->checkIronBallReturn() && !daPy_getPlayerActorClass()->checkIronBallGroundStop()) { data_80697E8D = 2; at_pos = *pos; at_size = 130.0f; } } if (daPy_getPlayerActorClass()->getKandelaarFlamePos() != NULL || daPy_getPlayerActorClass()->eventInfo.checkCommandDoor()) { data_80697EAC = 1; } else { data_80697EAC = 0; } bug_control(i_this); return 1; } /* 806975A0-806975A8 002B00 0008+00 1/0 0/0 0/0 .text daE_Bug_IsDelete__FP11e_bug_class */ static int daE_Bug_IsDelete(e_bug_class* i_this) { return 1; } /* 806975A8-806976B4 002B08 010C+00 1/0 0/0 0/0 .text daE_Bug_Delete__FP11e_bug_class */ static int daE_Bug_Delete(e_bug_class* i_this) { fopAc_ac_c* a_this = &i_this->actor; static u32 const l_bmdidx[2] = {BMDG_MU04, BMDG_MU05}; if (i_this->field_0x7dad != 0) { for (u32 i = 0; i < 2; i++) { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_bug", l_bmdidx[i]); dComIfGp_removeSimpleModel(modelData, fopAcM_GetRoomNo(a_this)); } } dComIfG_resDelete(&i_this->mPhase, "E_bug"); if (i_this->field_0x7dac != 0) { l_initHIO = 0; } if (a_this->heap != NULL) { i_this->mSound.deleteObject(); for (int i = 0; i < i_this->bug_num; i++) { i_this->Bug_s[i].mSound.deleteObject(); } } return 1; } /* 806976B4-806977A8 002C14 00F4+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* a_this) { e_bug_class* i_this = (e_bug_class*)a_this; J3DModelData* modelData = static_cast(dComIfG_getObjectRes("E_bug", BMDG_MU04)); JUT_ASSERT(1322, modelData != 0); J3DModelData* modelData2 = static_cast(dComIfG_getObjectRes("E_bug", BMDG_MU05)); JUT_ASSERT(1327, modelData2 != 0); for (int i = 0; i < i_this->bug_num; i++) { i_this->Bug_s[i].field_0x0 = mDoExt_J3DModel__create(modelData, 0x20000, 0x11000084); if (i_this->Bug_s[i].field_0x0 == NULL) { return 0; } i_this->Bug_s[i].field_0x4 = mDoExt_J3DModel__create(modelData2, 0x20000, 0x11000084); if (i_this->Bug_s[i].field_0x4 == NULL) { return 0; } } return 1; } /* 806977A8-80697B4C 002D08 03A4+00 1/0 0/0 0/0 .text daE_Bug_Create__FP10fopAc_ac_c */ static cPhs__Step daE_Bug_Create(fopAc_ac_c* a_this) { e_bug_class* i_this = (e_bug_class*)a_this; fopAcM_SetupActor(a_this, e_bug_class); cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&i_this->mPhase, "E_bug"); if (phase == cPhs_COMPLEATE_e) { OS_REPORT("E_BUG PARAM %x\n", fopAcM_GetParam(a_this)); i_this->field_0x570 = fopAcM_GetParam(a_this); i_this->bug_num = i_this->field_0x570 + 1; if (i_this->bug_num > 0x100) { i_this->bug_num = 0x100; } if (strcmp(dComIfGp_getStartStageName(), "T_ENEMY") == 0) { i_this->bug_num = 0x100; } OS_REPORT("E_BUG//////////////E_BUG SET 1 !!\n"); if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x4b000)) { OS_REPORT("//////////////E_BUG SET NON !!\n"); return cPhs_ERROR_e; } OS_REPORT("//////////////E_BUG SET 2 !!\n"); if (l_initHIO == 0) { i_this->field_0x7dac = 1; l_initHIO = 1; l_HIO.field_0x4 = -1; } i_this->bitSw = (fopAcM_GetParam(a_this) & 0xFF0000) >> 16; i_this->field_0x578 = fopAcM_GetParam(a_this) >> 24; i_this->field_0x57c = ((fopAcM_GetParam(a_this) & 0xFF00) >> 8) * 100.0f; u8 uVar1 = a_this->home.angle.z; a_this->home.angle.z = 0; a_this->current.angle.z = 0; for (int i = 0; i < i_this->bug_num; i++) { i_this->Bug_s[i].field_0x8 = i; i_this->Bug_s[i].field_0x50 = -1; i_this->Bug_s[i].field_0x18 = a_this->home.pos; i_this->Bug_s[i].field_0x52 = i; i_this->Bug_s[i].field_0x28 = cM_rndFX(0.1f) + 1.0f; i_this->Bug_s[i].field_0x48 = cM_rndF(65536.0f); i_this->Bug_s[i].field_0x4c = cM_rndF(65536.0f); i_this->Bug_s[i].mSound.init(&i_this->Bug_s[i].field_0x18, 1); } if (uVar1 != 0) { dPath* roomPath = dPath_GetRoomPath(uVar1, fopAcM_GetRoomNo(a_this)); if (roomPath != NULL) { dPnt* mPnts = roomPath->m_points; if (roomPath->m_num >= 1 && roomPath->m_num <= 4) { int iVar1 = i_this->bug_num / (roomPath->m_num + 1); for (int i = 0; i < roomPath->m_num; i++, mPnts++) { for (int j = iVar1 * (i + 1); j < iVar1 * (i + 2); j++) { i_this->Bug_s[j].field_0x18.x = mPnts->m_position.x; i_this->Bug_s[j].field_0x18.y = mPnts->m_position.y; i_this->Bug_s[j].field_0x18.z = mPnts->m_position.z; } } } } } daE_Bug_Execute(i_this); static u32 const l_bmdidx[2] = {BMDG_MU04, BMDG_MU05}; for (u32 i = 0; i < 2; i++) { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_bug", l_bmdidx[i]); JUT_ASSERT(1476, modelData != 0); if (dComIfGp_addSimpleModel(modelData, fopAcM_GetRoomNo(a_this), 0) == -1) { OS_REPORT("1Bh[43;30m虫の集団:シンプルモデル登録失敗しました。\n1Bh[m"); // 1Bh, group of insects: Simple model registration failed. } i_this->field_0x7dad = 1; } l_roomNo = fopAcM_GetRoomNo(a_this); i_this->mSound.init(&a_this->current.pos, 2); } return phase; } AUDIO_INSTANCES; /* 80697DC8-80697DE8 -00001 0020+00 1/0 0/0 0/0 .data l_daE_Bug_Method */ static actor_method_class l_daE_Bug_Method = { (process_method_func)daE_Bug_Create, (process_method_func)daE_Bug_Delete, (process_method_func)daE_Bug_Execute, (process_method_func)daE_Bug_IsDelete, (process_method_func)daE_Bug_Draw, }; /* 80697DE8-80697E18 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_BUG */ extern actor_process_profile_definition g_profile_E_BUG = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_E_BUG, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(e_bug_class), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 182, // mPriority &l_daE_Bug_Method, // sub_method 0x00044000, // mStatus fopAc_ACTOR_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };