/** * @file d_a_e_mk_bo.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_e_mk_bo.h" #include "d/actor/d_a_e_mk.h" #include "d/actor/d_a_player.h" #include "d/d_s_play.h" #include "c/c_damagereaction.h" #include "Z2AudioLib/Z2Instances.h" /* 8071CCEC-8071CE30 0000EC 0144+00 1/0 0/0 0/0 .text daE_MK_BO_Draw__FP13e_mk_bo_class */ static int daE_MK_BO_Draw(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; if (i_this->field_0x9b4 != 0) { return 1; } g_env_light.settingTevStruct(0, &actor->current.pos, &actor->tevStr); g_env_light.setLightTevColorType_MAJI(i_this->model, &actor->tevStr); if (i_this->action >= 2) { i_this->model->getModelData()->getMaterialNodePointer(1)->getTevColor(1)->r = 25; i_this->model->getModelData()->getMaterialNodePointer(1)->getTevColor(1)->g = 35; i_this->model->getModelData()->getMaterialNodePointer(1)->getTevColor(1)->b = 10; } mDoExt_modelUpdateDL(i_this->model); if (i_this->field_0x9b5 != 0) { i_this->pbtk->entry(i_this->efModelMorf->getModel()->getModelData()); i_this->efModelMorf->entryDL(); } return 1; } /* 8071CE30-8071D084 000230 0254+00 1/1 0/0 0/0 .text hit_check__FP13e_mk_bo_class */ static void hit_check(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fopAc_ac_c* a_parent = (fopAc_ac_c*)fopAcM_SearchByID(actor->parentActorID); e_mk_class* e_mk = (e_mk_class*)a_parent; cXyz sp24; if (i_this->ccAtSph.ChkTgHit() || i_this->acch.ChkGroundHit() || i_this->acch.ChkWallHit() || (e_mk != NULL && e_mk->field_0xc30 == 1 && i_this->ccAtSph.ChkAtHit()) || i_this->ccAtSph.ChkAtShieldHit()) { i_this->field_0x5f8 = 20; OS_REPORT("E_MK_BO HIT \n"); if (i_this->ccAtSph.ChkTgHit()) { i_this->sound.startSound(Z2SE_COL_FLIP_BOOM, 0, -1); } if (i_this->ccAtSph.ChkAtHit()) { fopAc_ac_c* at_hit_actor = dCc_GetAc(i_this->ccAtSph.GetAtHitObj()->GetAc()); if (at_hit_actor != NULL && fopAcM_GetName(at_hit_actor) == PROC_ALINK && daPy_getPlayerActorClass()->checkPlayerGuard()) { dComIfGp_getVibration().StartShock(4, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); } } if (i_this->field_0x998 == 1) { i_this->field_0x998 = 2; } if (i_this->field_0x5dc <= 2) { i_this->field_0x5dc = 3; i_this->field_0x5e0 = a_parent->current.pos; i_this->field_0x5e0.y += 100.0f; sp24 = i_this->field_0x5e0 - actor->current.pos; actor->current.angle.y = cM_atan2s(sp24.x, sp24.z); actor->current.angle.x = -cM_atan2s(sp24.y, JMAFastSqrt(SQUARE(sp24.x) + SQUARE(sp24.z))); if (i_this->acch.ChkGroundHit()) { fopAcM_effSmokeSet2(&i_this->field_0x990, &i_this->field_0x994, &actor->current.pos, &actor->current.angle, 3.0f + NREG_F(18), &actor->tevStr); } } } } /* 8071D084-8071D694 000484 0610+00 1/1 0/0 0/0 .text e_mk_bo_shot__FP13e_mk_bo_class */ static s8 e_mk_bo_shot(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fopAc_ac_c* a_parent = (fopAc_ac_c*)fopAcM_SearchByID(actor->parentActorID); s8 rt = 1; if (a_parent == NULL) { return rt; } e_mk_class* e_mk = (e_mk_class*)a_parent; fopAc_ac_c* player = (fopAc_ac_c*)dComIfGp_getPlayer(0); cXyz sp3C; switch (i_this->field_0x5dc) { case 0: if (e_mk->field_0x70c != 0) { i_this->field_0x5e0 = e_mk->field_0x70c->enemy.current.pos; i_this->field_0x5e0.y += 100.0f; } else { i_this->field_0x5e0 = player->current.pos; i_this->field_0x5e0.y += 100.0f; } i_this->field_0x5dc = 1; sp3C = i_this->field_0x5e0 - actor->current.pos; actor->current.angle.y = cM_atan2s(sp3C.x, sp3C.z); i_this->field_0x5fa = actor->current.angle.y; actor->current.angle.x = -cM_atan2s(sp3C.y, JMAFastSqrt(SQUARE(sp3C.x) + SQUARE(sp3C.z))); i_this->field_0x5ee = 0x400; break; case 1: sp3C = i_this->field_0x5e0 - actor->current.pos; if (sp3C.abs() < 300.0f + TREG_F(18)) { i_this->field_0x5dc = 2; i_this->timers[0] = 30; } break; case 2: case 3: if (i_this->timers[0] == 0) { rt = 0; } i_this->field_0x5e0 = a_parent->current.pos; i_this->field_0x5e0.y += 160.0f; sp3C = i_this->field_0x5e0 - actor->current.pos; cLib_addCalcAngleS2(&actor->current.angle.y, cM_atan2s(sp3C.x, sp3C.z), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&actor->current.angle.x, -cM_atan2s(sp3C.y, JMAFastSqrt(SQUARE(sp3C.x) + SQUARE(sp3C.z))), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&i_this->field_0x5ec, i_this->field_0x5ee, 1, 0x40); cLib_addCalcAngleS2(&i_this->field_0x5ee, 0x2000, 1, 4); f32 temp_f31 = sp3C.abs(); if (e_mk->mDemoMode != 0 || (e_mk->mAction == 2 && e_mk->mMode >= 20)) { if (temp_f31 < 350.0f + YREG_F(18)) { i_this->field_0x600 = 1; e_mk->field_0x707 = 3; } else if (temp_f31 < 600.0f + YREG_F(17)) { e_mk->field_0x707 = 2; } } else if (e_mk->mAction == 3 && temp_f31 < 120.0f + YREG_F(19)) { e_mk->field_0x707 = 4; i_this->action = 1; i_this->field_0x5dc = 0; dComIfGp_setHitMark(3, actor, &actor->current.pos, &actor->shape_angle, NULL, 0); actor->speed.y = 30.0f; i_this->timers[0] = 40; return rt; } } actor->speedF = 40.0f + NREG_F(0); cMtx_YrotS(*calc_mtx, actor->current.angle.y); cMtx_XrotM(*calc_mtx, actor->current.angle.x); sp3C.x = 0.0f; sp3C.y = 0.0f; sp3C.z = actor->speedF; MtxPosition(&sp3C, &actor->speed); actor->current.pos += actor->speed; actor->shape_angle.z = -(TREG_S(2) + 0x1800); if (i_this->ccAtSph.ChkAtHit() && !i_this->ccAtSph.ChkAtShieldHit()) { OS_REPORT("E_MK_BO ANY HIT !!!!\n"); cCcD_Obj* at_hit_obj = i_this->ccAtSph.GetAtHitObj(); if (fopAcM_GetName(dCc_GetAc(at_hit_obj->GetAc())) == PROC_ALINK) { OS_REPORT("E_MK_BO PL HIT !!!!\n"); e_mk->field_0x707 = 5; i_this->field_0x5f8 = 10; } } cLib_addCalc2(&i_this->field_0x5f0, 50.0f + BREG_F(2), 1.0f, 5.0f); return rt; } /* 8071D694-8071DBA0 000A94 050C+00 1/1 0/0 0/0 .text e_mk_bo_start__FP13e_mk_bo_class */ static s8 e_mk_bo_start(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; e_mk_class* e_mk = (e_mk_class*)fopAcM_SearchByID(actor->parentActorID); s8 rt = 2; if (e_mk == NULL) { return rt; } fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp38; switch (i_this->field_0x5dc) { case 0: i_this->field_0x998 = 1; i_this->field_0x5e0.set(0.0f, 5000.0f + JREG_F(18), -3900.0f); i_this->field_0x5dc = 1; sp38 = i_this->field_0x5e0 - actor->current.pos; actor->current.angle.y = cM_atan2s(sp38.x, sp38.z); i_this->field_0x5fa = actor->current.angle.y; actor->current.angle.x = -cM_atan2s(sp38.y, JMAFastSqrt(SQUARE(sp38.x) + SQUARE(sp38.z))); i_this->field_0x5ee = 0x400; break; case 1: sp38 = i_this->field_0x5e0 - actor->current.pos; if (sp38.abs() < 200.0f + TREG_F(18)) { i_this->field_0x5dc = 2; i_this->timers[0] = 30; } break; case 2: case 3: if (i_this->timers[0] == 0) { rt = 0; } i_this->field_0x5e0 = e_mk->enemy.current.pos; i_this->field_0x5e0.y += 160.0f; sp38 = i_this->field_0x5e0 - actor->current.pos; cLib_addCalcAngleS2(&actor->current.angle.y, cM_atan2s(sp38.x, sp38.z), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&actor->current.angle.x, -cM_atan2s(sp38.y, JMAFastSqrt(SQUARE(sp38.x) + SQUARE(sp38.z))), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&i_this->field_0x5ec, i_this->field_0x5ee, 1, 0x40); cLib_addCalcAngleS2(&i_this->field_0x5ee, 0x2000, 1, 4); f32 temp_f31 = sp38.abs(); if (e_mk->mDemoMode != 0 || (e_mk->mAction == 2 && e_mk->mMode >= 20)) { if (temp_f31 < 350.0f + YREG_F(18)) { i_this->field_0x600 = 1; e_mk->field_0x707 = 3; } else if (temp_f31 < 600.0f + YREG_F(17)) { e_mk->field_0x707 = 2; } } break; } actor->speedF = 40.0f + NREG_F(0); cMtx_YrotS(*calc_mtx, actor->current.angle.y); cMtx_XrotM(*calc_mtx, actor->current.angle.x); sp38.x = 0.0f; sp38.y = 0.0f; sp38.z = actor->speedF; MtxPosition(&sp38, &actor->speed); actor->current.pos += actor->speed; actor->shape_angle.z = -(TREG_S(2) + 0x1800); cLib_addCalc2(&i_this->field_0x5f0, 50.0f + BREG_F(2), 1.0f, 5.0f); return rt; } /* 8071DBA0-8071DF04 000FA0 0364+00 1/1 0/0 0/0 .text e_mk_bo_r04__FP13e_mk_bo_class */ static s8 e_mk_bo_r04(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; e_mk_class* e_mk = (e_mk_class*)fopAcM_SearchByID(actor->parentActorID); s8 rt = 2; if (e_mk == NULL) { return rt; } fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp1C; switch (i_this->field_0x5dc) { case 0: i_this->field_0x998 = 1; i_this->field_0x5dc = 1; actor->current.angle.y = (VREG_S(7) + e_mk->enemy.shape_angle.y) - 0x3000; i_this->field_0x5fa = actor->current.angle.y; i_this->timers[0] = JREG_S(7) + 65; i_this->timers[1] = 30; break; case 1: if (i_this->timers[0] != 0) { actor->current.angle.y += i_this->field_0x5ee; i_this->field_0x5ee = JREG_S(9) + 350; actor->current.angle.x = JREG_S(2) + 1700; } else { i_this->field_0x5e0 = e_mk->enemy.current.pos; i_this->field_0x5e0.y += 160.0f; sp1C = i_this->field_0x5e0 - actor->current.pos; cLib_addCalcAngleS2(&actor->current.angle.y, cM_atan2s(sp1C.x, sp1C.z), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&actor->current.angle.x, -cM_atan2s(sp1C.y, JMAFastSqrt(SQUARE(sp1C.x) + SQUARE(sp1C.z))), 1, i_this->field_0x5ec); cLib_addCalcAngleS2(&i_this->field_0x5ec, i_this->field_0x5ee, 1, 0x40); cLib_addCalcAngleS2(&i_this->field_0x5ee, 0x2000, 1, JREG_S(8) + 4); f32 temp_f31 = sp1C.abs(); if (i_this->timers[1] == 0 && temp_f31 < 350.0f + YREG_F(18)) { i_this->field_0x600 = 1; e_mk->field_0x707 = 3; } else if (temp_f31 < 600.0f + YREG_F(17)) { e_mk->field_0x707 = 2; } } break; } actor->speedF = 40.0f + NREG_F(0); cMtx_YrotS(*calc_mtx, actor->current.angle.y); cMtx_XrotM(*calc_mtx, actor->current.angle.x); sp1C.x = 0.0f; sp1C.y = 0.0f; sp1C.z = actor->speedF; MtxPosition(&sp1C, &actor->speed); actor->current.pos += actor->speed; actor->shape_angle.z = -(TREG_S(2) + 0x1800); cLib_addCalc2(&i_this->field_0x5f0, 50.0f + BREG_F(2), 1.0f, 5.0f); return rt; } /* 8071DF04-8071E1A4 001304 02A0+00 1/1 0/0 0/0 .text e_mk_bo_hasira__FP13e_mk_bo_class */ static void e_mk_bo_hasira(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fopAc_ac_c* a_parent = fopAcM_SearchByID(actor->parentActorID); if (a_parent != NULL) { e_mk_class* e_mk = (e_mk_class*)a_parent; if (e_mk->field_0xc30 == 2) { i_this->action = 2; i_this->field_0x998 = 1; return; } cXyz sp24; cXyz sp18; if (e_mk->mHasira != NULL) { daPillar_c* pillar = e_mk->mHasira; cXyz spC; mDoMtx_stack_c::transS(e_mk->mHasira->current.pos.x, e_mk->mHasira->current.pos.y, pillar->current.pos.z); mDoMtx_stack_c::YrotM(pillar->mRotY); mDoMtx_stack_c::XrotM(e_mk->mHasira->shape_angle.x); mDoMtx_stack_c::YrotM(-pillar->mRotY); mDoMtx_stack_c::transM(0.0f, 500.0f, 0.0f); mDoMtx_multVecZero(mDoMtx_stack_c::get(), &spC); mDoMtx_stack_c::YrotS(actor->current.angle.y + i_this->field_0x5fa); sp24.x = 0.0f; sp24.y = 0.0f; sp24.z = i_this->field_0x5fc; mDoMtx_stack_c::multVec(&sp24, &sp18); cLib_addCalc2(&actor->current.pos.x, spC.x + sp18.x, 1.0f, 50.0f); cLib_addCalc2(&actor->current.pos.z, spC.z + sp18.z, 1.0f, 50.0f); actor->current.pos.y += actor->speed.y; actor->speed.y -= 5.0f; if (actor->current.pos.y <= 7.0f + spC.y) { actor->current.pos.y = 7.0f + spC.y; if (i_this->field_0x5dc <= 3) { actor->speed.y *= -0.4f; } else { actor->speed.y = 0.0f; } if (i_this->field_0x5dc <= 1) { i_this->timers[0] = 20; } i_this->field_0x5dc++; } if (pillar->checkRollAttack()) { i_this->timers[0] = 20; } } if (i_this->timers[0] != 0) { i_this->field_0x5fc += 0.1f + AREG_F(19); } actor->shape_angle.x = (200.0f + KREG_F(2)) * (i_this->timers[0] * cM_ssin(i_this->timers[0] * 12000)); actor->shape_angle.z = 0; cLib_addCalc2(&i_this->field_0x5f0, 10.0f + BREG_F(3), 1.0f, 5.0f); } } /* 8071E1A4-8071E200 0015A4 005C+00 1/1 0/0 0/0 .text e_mk_bo_demo_ground__FP13e_mk_bo_class */ static void e_mk_bo_demo_ground(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fopAc_ac_c* player = dComIfGp_getPlayer(0); if (actor->health != 0) { actor->health = 0; i_this->action = 3; i_this->field_0x5dc = 0; actor->home.pos.y = actor->current.pos.y; } fopAc_ac_c* a_parent = fopAcM_SearchByID(actor->parentActorID); } /* 8071E200-8071E6C4 001600 04C4+00 1/1 0/0 0/0 .text e_mk_bo_demo_spin__FP13e_mk_bo_class */ static void e_mk_bo_demo_spin(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fopAc_ac_c* player = dComIfGp_getPlayer(0); cXyz sp34; cXyz sp28; f32 var_f31 = 0.0f; switch (i_this->field_0x5dc) { case 4: break; case 0: actor->speed.y = 0.0f; i_this->field_0x5dc = 1; actor->home.pos = actor->current.pos; i_this->timers[0] = 20; actor->speedF = 0.0f; /* fallthrough */ case 1: i_this->sound.startLevelSound(Z2SE_BOOM_GET_DEMO_LOOP1, 0, -1); if (i_this->timers[0] == 1) { Z2GetAudioMgr()->seStart(Z2SE_OBJ_PEEL_OFF_LEAVES, &actor->current.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(actor)), 1.0f, 1.0f, -1.0f, -1.0f, 0); } if (i_this->timers[0] == 0) { actor->field_0x560 = 1; } if (i_this->timers[0] <= 10 && (i_this->counter & 15) == 0) { static cXyz sc(1.0f, 1.0f, 1.0f); dComIfGp_particle_set(dPa_RM(ID_ZI_S_OTIBA_A), &actor->home.pos, &actor->tevStr, &actor->shape_angle, &sc); } actor->shape_angle.y += i_this->field_0x602; cLib_addCalcAngleS2(&i_this->field_0x602, 0x2000, 2, (ZREG_S(0) + 0x200)); cLib_addCalc2(&actor->current.pos.y, 200.0f + (actor->home.pos.y + ZREG_F(1)), 0.1f, actor->speed.y); cLib_addCalc2(&actor->speed.y, 20.0f + ZREG_F(2), 1.0f, 0.5f + ZREG_F(3)); if (actor->health != 0) { actor->health = 0; actor->speedF = 0.0f; actor->current.angle.y = fopAcM_searchPlayerAngleY(actor) + 0x8000; i_this->field_0x5ec = 0; i_this->timers[0] = 40; i_this->field_0x5dc = 2; } break; case 2: i_this->sound.startLevelSound(Z2SE_BOOM_GET_DEMO_LOOP2, 0, -1); var_f31 = 40.0f; actor->shape_angle.y += i_this->field_0x602; if (i_this->timers[0] == 0) { actor->current.angle.y += i_this->field_0x5ec; cLib_addCalcAngleS2(&i_this->field_0x5ec, 0x400, 1, 0x100); s16 sp8 = (actor->current.angle.y - fopAcM_searchPlayerAngleY(actor)); if (sp8 <= 0x400 && sp8 > -0x400) { i_this->field_0x5dc = 3; } cLib_addCalcAngleS2(&actor->shape_angle.z, -0x1200, 2, 0x200); } break; case 3: i_this->sound.startLevelSound(Z2SE_BOOM_GET_DEMO_LOOP2, 0, -1); var_f31 = 40.0f; actor->shape_angle.y += i_this->field_0x602; cLib_addCalcAngleS2(&actor->current.angle.y, fopAcM_searchPlayerAngleY(actor), 1, 0x400); cLib_addCalc2(&actor->current.pos.y, 170.0f + (actor->home.pos.y + ZREG_F(1)), 0.1f,5.0f); if (fopAcM_searchPlayerDistanceXZ(actor) < 50.0f) { e_mk_class* e_mk = (e_mk_class*)fopAcM_SearchByID(actor->parentActorID); e_mk->mDemoMode++; i_this->field_0x5dc = 4; i_this->field_0x600 = 1; } break; } cLib_addCalc2(&actor->speedF, var_f31, 1.0f, 1.0f); cMtx_YrotS(*calc_mtx, actor->current.angle.y); sp34.x = 0.0f; sp34.y = 0.0f; sp34.z = actor->speedF; MtxPosition(&sp34, &sp28); actor->current.pos += sp28; if (var_f31 > 0.0f && (i_this->counter & 7) == 0) { i_this->sound.startSound(Z2SE_EN_MK_BOOM_FLY, 0, -1); } } /* 8071E6C4-8071E8A4 001AC4 01E0+00 1/1 0/0 0/0 .text action__FP13e_mk_bo_class */ static void action(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; cXyz sp24; cXyz sp18; e_mk_class* e_mk = (e_mk_class*)fopAcM_SearchByID(actor->parentActorID); s8 var_r28; u32 sound = Z2SE_MK_DARK_BOOMERANG; switch (i_this->action) { case 0: if (e_mk->field_0xc30 == 1) { var_r28 = e_mk_bo_start(i_this); } else if (e_mk->field_0xc30 == 3 || fopAcM_GetRoomNo(actor) == 4) { var_r28 = e_mk_bo_r04(i_this); } else { var_r28 = e_mk_bo_shot(i_this); sound = Z2SE_EN_MK_BOOM_FLY; } actor->shape_angle.y += 0x2000; if ((i_this->counter & 7) == 0) { i_this->sound.startSound(sound, 0, -1); } if (var_r28 == 1) { i_this->acch.CrrPos(dComIfG_Bgsp()); hit_check(i_this); } else if (var_r28 == 0) { i_this->field_0x5f8 = 10; } break; case 1: e_mk_bo_hasira(i_this); i_this->field_0x5f8 = 10; break; case 2: e_mk_bo_demo_ground(i_this); i_this->field_0x5f8 = 10; break; case 3: e_mk_bo_demo_spin(i_this); i_this->field_0x5f8 = 10; i_this->field_0x9b5 = 1; break; } cXyz spC(actor->current.pos); if (i_this->field_0x5f8 != 0) { spC.y += 10000.0f; } i_this->ccAtSph.SetC(spC); dComIfG_Ccsp()->Set(&i_this->ccAtSph); } /* 8071E8A4-8071EECC 001CA4 0628+00 2/1 0/0 0/0 .text daE_MK_BO_Execute__FP13e_mk_bo_class */ static int daE_MK_BO_Execute(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; cXyz sp64; cXyz sp58; cXyz sp4C; if (cDmrNowMidnaTalk()) { return 1; } if (i_this->field_0x9b4 != 0) { return 1; } if (i_this->field_0x600 != 0) { fopAcM_delete(actor); #if VERSION == VERSION_GCN_JPN return 1; #endif } i_this->counter++; for (int i = 0; i < 2; i++) { if (i_this->timers[i] != 0) { i_this->timers[i]--; } } if (i_this->field_0x5f8 != 0) { i_this->field_0x5f8--; } action(i_this); cLib_addCalcAngleS2(&i_this->field_0x5fa, actor->current.angle.y, 4, 0x1000); mDoMtx_stack_c::transS(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z); mDoMtx_stack_c::YrotM(s16(i_this->field_0x5fa)); mDoMtx_stack_c::ZrotM(s16(actor->shape_angle.z)); mDoMtx_stack_c::YrotM(s16(actor->shape_angle.y)); mDoMtx_stack_c::XrotM(s16(actor->shape_angle.x)); fopAc_ac_c* a_parent = fopAcM_SearchByID(actor->parentActorID); if (a_parent == NULL) { return 1; } f32 size = a_parent->scale.x; mDoMtx_stack_c::scaleM(size, size, size); mDoMtx_stack_c::transM(0.0f, 0.0f, i_this->field_0x5f0); i_this->model->setBaseTRMtx(mDoMtx_stack_c::get()); e_mk_class* e_mk = (e_mk_class*)a_parent; if (e_mk->field_0x707 == 6) { e_mk->field_0x707 = 0; fopAcM_delete(actor); } actor->eyePos = actor->current.pos; i_this->sound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(actor))); if (i_this->field_0x998 != 0) { JPABaseEmitter* emt; int eff_num = 4; if (i_this->action == 2) { eff_num = 2; } static u16 bo_eno_1[] = { dPa_RM(ID_ZI_S_MKDEMO_BOOM_WAIT_A), dPa_RM(ID_ZI_S_MKDEMO_BOOM_WAIT_B), dPa_RM(ID_ZI_S_MKDEMO_BOOM_KISEKI_A), dPa_RM(ID_ZI_S_MKDEMO_BOOM_KISEKI_B), }; static u16 bo_eno_2[] = { dPa_RM(ID_ZI_S_MKDEMO_BOOM2_WAIT_A), dPa_RM(ID_ZI_S_MKDEMO_BOOM2_WAIT_B), dPa_RM(ID_ZI_S_MKDEMO_BOOM2_KISEKI_A), dPa_RM(ID_ZI_S_MKDEMO_BOOM2_KISEKI_B), }; static u16 bo_eno_12[] = { dPa_RM(ID_ZI_S_MKDEMO_BOOM_HIT_A), dPa_RM(ID_ZI_S_MKDEMO_BOOM_HIT_B), }; for (int i = 0; i < eff_num; i++) { if (i_this->action >= 2) { if (i < 2) { e_mk->field_0xc18[i] = dComIfGp_particle_set(e_mk->field_0xc18[i], bo_eno_2[i], &actor->current.pos, NULL, NULL); emt = dComIfGp_particle_getEmitter(e_mk->field_0xc18[i]); } else { i_this->field_0x99c[i - 2] = dComIfGp_particle_set(i_this->field_0x99c[i - 2], bo_eno_2[i], &actor->current.pos, NULL, NULL); emt = dComIfGp_particle_getEmitter(i_this->field_0x99c[i - 2]); } } else if (i < 2) { e_mk->field_0xc18[i] = dComIfGp_particle_set(e_mk->field_0xc18[i], bo_eno_1[i], &actor->current.pos, NULL, NULL); emt = dComIfGp_particle_getEmitter(e_mk->field_0xc18[i]); } else { i_this->field_0x99c[i - 2] = dComIfGp_particle_set(i_this->field_0x99c[i - 2], bo_eno_1[i], &actor->current.pos, NULL, NULL); emt = dComIfGp_particle_getEmitter(i_this->field_0x99c[i - 2]); } if (emt != NULL) { MTXCopy(i_this->model->getBaseTRMtx(), mDoMtx_stack_c::get()); if (i_this->field_0x998 == 2) { mDoMtx_stack_c::transM(10000.0f, 10000.0f, 100000.0f); } emt->setGlobalSRTMatrix(mDoMtx_stack_c::get()); } } if (i_this->field_0x998 == 2) { i_this->field_0x998 = 0; for (int i = 0; i < 2; i++) { dComIfGp_particle_set(bo_eno_12[i], &actor->current.pos, NULL, NULL); } } } if (i_this->field_0x9b5 != 0) { mDoMtx_stack_c::transS(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z); mDoMtx_stack_c::scaleM(size, size, size); J3DModel* model = i_this->efModelMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); i_this->efModelMorf->play(NULL, 0, 0); i_this->pbtk->play(); i_this->efModelMorf->modelCalc(); cXyz sp40(size, size, size); for (int i = 0; i < 4; i++) { cXyz sp34(actor->current.pos); if (i >= 1) { sp34.y = actor->home.pos.y; } static u16 bo_eno_end[] = { ID_ZI_J_SPBOOM_LEAF_A, ID_ZI_J_SPBOOM_ROCK_A, ID_ZI_J_SPBOOM_SYOUGEKI_A, ID_ZI_J_SPBOOM_SYOUGEKI_B, }; i_this->field_0x9a4[i] = dComIfGp_particle_set(i_this->field_0x9a4[i], bo_eno_end[i], &sp34, &actor->tevStr, NULL, &sp40, 0xFF, NULL, -1, NULL, NULL, NULL); } } return 1; } /* 8071EECC-8071EED4 0022CC 0008+00 1/0 0/0 0/0 .text daE_MK_BO_IsDelete__FP13e_mk_bo_class */ static int daE_MK_BO_IsDelete(e_mk_bo_class* i_this) { return 1; } /* 8071EED4-8071EF24 0022D4 0050+00 1/0 0/0 0/0 .text daE_MK_BO_Delete__FP13e_mk_bo_class */ static int daE_MK_BO_Delete(e_mk_bo_class* i_this) { fopAc_ac_c* actor = &i_this->enemy; fpc_ProcID id = fopAcM_GetID(actor); dComIfG_resDelete(&i_this->phase, "E_mk"); if (actor->heap != NULL) { i_this->sound.deleteObject(); } return 1; } /* 8071EF24-8071F120 002324 01FC+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { e_mk_bo_class* a_this = (e_mk_bo_class*)i_this; J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_mk", 0x2E); JUT_ASSERT(1265, modelData != NULL); a_this->model = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (a_this->model == NULL) { return 0; } a_this->efModelMorf = new mDoExt_McaMorf((J3DModelData*)dComIfG_getObjectRes("E_mk", 0x2F), NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_mk", 6), 2, 1.0f, 0, -1, 1, NULL, 0x80000, 0x11000284); if (a_this->efModelMorf == NULL || a_this->efModelMorf->getModel() == NULL) { return 0; } a_this->pbtk = new mDoExt_btkAnm(); if (a_this->pbtk == NULL) { return 0; } if (!a_this->pbtk->init(a_this->efModelMorf->getModel()->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("E_mk", 0x34), 1, 2, 1.0f, 0, -1)) { return 0; } a_this->sound.init(&i_this->current.pos, 1); return 1; } /* 8071F168-8071F3D0 002568 0268+00 1/0 0/0 0/0 .text daE_MK_BO_Create__FP10fopAc_ac_c */ static int daE_MK_BO_Create(fopAc_ac_c* i_this) { e_mk_bo_class* a_this = (e_mk_bo_class*)i_this; fopAcM_ct(i_this, e_mk_bo_class); int phase_state = dComIfG_resLoad(&a_this->phase, "E_mk"); if (phase_state == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x3120)) { return cPhs_ERROR_e; } fopAcM_SetMtx(i_this, a_this->model->getBaseTRMtx()); static dCcD_SrcSph at_sph_src = { { {0x0, {{AT_TYPE_40, 0x2, 0x1f}, {0xd8fbfdff, 0x3}, 0x0}}, // mObj {dCcD_SE_WOOD, 0x1, 0x1, 0x0, 0x0}, // mGObjAt {dCcD_SE_METAL, 0x5, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 30.0f} // mSph } // mSphAttr }; a_this->ccStts.Init(0xFF, 0, i_this); a_this->ccAtSph.Set(at_sph_src); a_this->ccAtSph.SetStts(&a_this->ccStts); if (fopAcM_GetRoomNo(i_this) == 4) { a_this->ccAtSph.SetR(100.0f + BREG_F(15)); } a_this->acch.Set(fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this), i_this, 1, &a_this->acchcir, fopAcM_GetSpeed_p(i_this), NULL, NULL); a_this->acchcir.SetWall(80.0f, 100.0f); a_this->counter = cM_rndF(65535.0f); if ((fopAcM_GetParam(i_this) & 0xFF) == 2) { a_this->action = 1; } else { a_this->field_0x9b4 = 1; } mDoMtx_stack_c::scaleS(0.0f, 0.0f, 0.0f); a_this->model->setBaseTRMtx(mDoMtx_stack_c::get()); daE_MK_BO_Execute(a_this); } return phase_state; } /* 8071F75C-8071F77C -00001 0020+00 1/0 0/0 0/0 .data l_daE_MK_BO_Method */ static actor_method_class l_daE_MK_BO_Method = { (process_method_func)daE_MK_BO_Create, (process_method_func)daE_MK_BO_Delete, (process_method_func)daE_MK_BO_Execute, (process_method_func)daE_MK_BO_IsDelete, (process_method_func)daE_MK_BO_Draw, }; /* 8071F77C-8071F7AC -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_MK_BO */ extern actor_process_profile_definition g_profile_E_MK_BO = { fpcLy_CURRENT_e, // mLayerID 8, // mListID fpcPi_CURRENT_e, // mListPrio PROC_E_MK_BO, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(e_mk_bo_class), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 166, // mPriority &l_daE_MK_BO_Method, // sub_method 0x00044100, // mStatus fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_0_e, // cullType }; AUDIO_INSTANCES