/** * d_a_bb.cpp * Enemy - Kargaroc */ #include "d/actor/d_a_bb.h" #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" #include "d/d_com_inf_game.h" #include "d/d_s_play.h" #include "d/res/res_bb.h" #include "d/d_kankyo.h" #include "f_op/f_op_kankyo_mng.h" #include "d/d_snap.h" #include "d/d_material.h" #include "d/actor/d_a_esa.h" #include "d/actor/d_a_sea.h" #include "d/actor/d_a_mo2.h" #include "d/actor/d_a_bk.h" #include "d/actor/d_a_player.h" #if VERSION == VERSION_DEMO #include "m_Do/m_Do_controller_pad.h" #endif #include "d/d_bg_s_lin_chk.h" #include "d/d_cc_uty.h" #include "SSystem/SComponent/c_lib.h" class bbHIO_c : public mDoHIO_entry_c { public: bbHIO_c() { unk_04 = 0; unk_05 = 0; #if VERSION == VERSION_DEMO unk_10 = 0x3228; #endif unk_08 = 20.0f; unk_0C = 2500.0f; unk_12 = 0x258; unk_14 = 0x4B0; unk_16 = 0x1C2; unk_18 = 0x2EE; unk_1C = 0.35f; unk_20 = 0.5f; unk_24 = 1.5f; unk_28 = 1.0f; unk_2C = 0.85f; unk_38 = 0.85f; unk_3C = 1.0f; unk_40 = 30; unk_44 = 1.0f; unk_48 = 1.0f; unk_4C = 1.5f; unk_50 = 0x44C; unk_54 = 3.5f; unk_32 = 20; unk_30 = 0x2D; unk_34 = 2.5f; unk_58 = 45.0f; unk_5C = 30.0f; unk_60 = 2; unk_62 = 2; unk_64 = 1; unk_68 = 8000.0f; unk_74 = 3000.0f; unk_70 = 0x6D60; unk_6C = 1500.0f; unk_78 = 2000.0f; unk_72 = 0x59D8; unk_7C = 10000.0f; } virtual ~bbHIO_c() {} void genMessage(JORMContext* ctx); public: /* 0x04 */ u8 unk_04; /* 0x05 */ u8 unk_05; /* 0x06 */ u8 unk_06; /* 0x08 */ f32 unk_08; /* 0x0C */ f32 unk_0C; /* 0x10 */ s16 unk_10; /* 0x12 */ s16 unk_12; /* 0x14 */ s16 unk_14; /* 0x16 */ s16 unk_16; /* 0x18 */ s16 unk_18; /* 0x1C */ f32 unk_1C; /* 0x20 */ f32 unk_20; /* 0x24 */ f32 unk_24; /* 0x28 */ f32 unk_28; /* 0x2C */ f32 unk_2C; /* 0x30 */ s16 unk_30; /* 0x32 */ s16 unk_32; /* 0x34 */ f32 unk_34; /* 0x38 */ f32 unk_38; /* 0x3C */ f32 unk_3C; /* 0x40 */ s16 unk_40; /* 0x44 */ f32 unk_44; /* 0x48 */ f32 unk_48; /* 0x4C */ f32 unk_4C; /* 0x50 */ s16 unk_50; /* 0x54 */ f32 unk_54; /* 0x58 */ f32 unk_58; /* 0x5C */ f32 unk_5C; /* 0x60 */ s16 unk_60; /* 0x62 */ s16 unk_62; /* 0x64 */ s16 unk_64; /* 0x68 */ f32 unk_68; /* 0x6C */ f32 unk_6C; /* 0x70 */ s16 unk_70; /* 0x72 */ s16 unk_72; /* 0x74 */ f32 unk_74; /* 0x78 */ f32 unk_78; /* 0x7C */ f32 unk_7C; }; // size = 0x80 #include "weak_data_1811.h" // IWYU pragma: keep static s8 callback_check_index[] = {0xFF, 0xFF, 0xFF, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x64, 0x64, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x64}; static f32 tial_scale[] = { 0.25f, 0.275f, 0.2875f, 0.3f, 0.325f, 0.375f, 0.4625f, 0.575f, 0.8f, }; static u16 bb_tex_anm_idx[] = { BB_BTP_TATACK, BB_BTP_TCLOSE, BB_BTP_TDAMAGE, BB_BTP_TKAIJO, BB_BTP_TMABATAKI, BB_BTP_TOPEN, }; static u16 bb_tex_max_frame[] = { 5, 3, 40, 5, 7, 3, }; static bbHIO_c l_bbHIO; static esa_class* esa_info[100]; static s32 esa_check_count; /* 000000EC-000003C8 .text nodeCallBack__FP7J3DNodei */ static BOOL nodeCallBack(J3DNode* node, int calcTiming) { s32 idx; s32 jntNo; J3DModel* model; bb_class* i_this; if (calcTiming == J3DNodeCBCalcTiming_In) { J3DJoint* joint = (J3DJoint*)node; jntNo = joint->getJntNo(); idx = callback_check_index[jntNo]; model = j3dSys.getModel(); i_this = (bb_class*)model->getUserArea(); if (i_this) { MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); if (idx >= 0 && idx <= 10) { cMtx_YrotM(*calc_mtx, i_this->unk_C00[idx].y); cMtx_XrotM(*calc_mtx, i_this->unk_C00[idx].x); cMtx_ZrotM(*calc_mtx, i_this->unk_C00[idx].z); model->setAnmMtx(jntNo, *calc_mtx); } cXyz v; if (jntNo == 0x16) { v.x = 0.0f; v.z = 0.0f; v.y = 0.0f; MtxPosition(&v, &i_this->actor.eyePos); i_this->actor.attention_info.position = i_this->actor.eyePos; i_this->actor.attention_info.position.y += REG0_F(8) * 10.0f + 50.0f; } else if (jntNo == 0x1D || jntNo == 0x1E) { if (jntNo == 0x1E) { v.x = REG0_F(10) * 10.0f + 10.0f; v.y = REG0_F(11) * 10.0f; v.z = REG0_F(12) * 10.0f; } else { v.x = 0.0f; v.z = 0.0f; v.y = 0.0f; } MtxPosition(&v, &i_this->unk_BD4[jntNo - 0x1D]); } else if (jntNo == 0x3 || jntNo == 0x8) { v.x = REG0_F(10) * 10.0f + 5.0f; v.y = REG0_F(11) * 10.0f; v.z = REG0_F(12) * 10.0f; if (jntNo == 0x3) { MtxPosition(&v, &i_this->unk_A6C[0]); } else { MtxPosition(&v, &i_this->unk_A6C[1]); } } else if (jntNo == 0x17) { cMtx_ZrotM(*calc_mtx, -i_this->unk_C4E); model->setAnmMtx(jntNo, *calc_mtx); } else if (jntNo == 0x18) { cMtx_YrotM(*calc_mtx, i_this->unk_C4E); model->setAnmMtx(jntNo, *calc_mtx); } cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); } } return TRUE; } /* 00000404-000009A4 .text tail_control__FP8bb_class */ void tail_control(bb_class* i_this) { s32 i; cXyz sp28; cXyz sp1C; f32 x = i_this->unk_BD4[1].x - i_this->unk_BD4[0].x; f32 y = i_this->unk_BD4[1].y - i_this->unk_BD4[0].y; f32 z = i_this->unk_BD4[1].z - i_this->unk_BD4[0].z; s16 atan2; s32 atan; i_this->unk_BEE = cM_atan2s(x, z); i_this->unk_BEC = -cM_atan2s(y, std::sqrtf(x * x + z * z)); sp28.x = 0.0f; sp28.y = 0.0f; sp28.z = REG0_F(5) + 5.0f; cMtx_YrotS(*calc_mtx, i_this->unk_BEE); cMtx_XrotM(*calc_mtx, i_this->unk_BEC); MtxPosition(&sp28, &i_this->unk_BF4); cXyz* AA8 = &i_this->unk_AA8[1]; csXyz* B20 = &i_this->unk_B20[1]; cXyz* B5C = &i_this->unk_B5C[1]; f32 reg2 = REG0_F(2) + 0.8f; f32 reg3 = REG0_F(3); f32 groundY = i_this->mAcch.GetGroundH() + 5.0f; for (i = 1; i < 10; i++, AA8++, B20++, B5C++) { f32 tmp = 1.0f - (i - 1) * (REG0_F(4) + 0.1f); cXyz sp10; sp10.x = B5C->x + i_this->unk_BF4.x * tmp; sp10.y = B5C->y + i_this->unk_BF4.y * tmp; sp10.z = B5C->z + i_this->unk_BF4.z * tmp; if (reg3 > 1.0f) { sp28.x = reg3 * cM_ssin(i_this->unk_352 * (REG0_S(5) + 1200) + (i * (REG0_S(6) + 6000))); sp28.y = reg3 * cM_ssin(i_this->unk_352 * (REG0_S(5) + 1000) + (i * (REG0_S(6) + 5000))); sp28.z = 0.0f; cMtx_YrotS(*calc_mtx, i_this->unk_BEE); cMtx_XrotM(*calc_mtx, i_this->unk_BEC); MtxPosition(&sp28, &sp1C); sp10.x += sp1C.x; sp10.y += sp1C.y; sp10.z += sp1C.z; } f32 gY = AA8->y + sp10.y; if (gY < groundY) { gY = groundY; } y = gY - (AA8 - 1)->y; x = sp10.x + (AA8->x - (AA8 - 1)->x); z = sp10.z + (AA8->z - (AA8 - 1)->z); atan = cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); (B20 - 1)->y = atan; (B20 - 1)->x = atan2; sp28.x = 0.0f; sp28.y = 0.0f; sp28.z = (i * 0.03f + 0.25f) * 20.0f * 2.0f; cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&sp28, &sp1C); B5C->x = AA8->x; B5C->y = AA8->y; B5C->z = AA8->z; AA8->x = (AA8 - 1)->x + sp1C.x; AA8->y = (AA8 - 1)->y + sp1C.y; AA8->z = (AA8 - 1)->z + sp1C.z; B5C->x = reg2 * (AA8->x - B5C->x); B5C->y = reg2 * (AA8->y - B5C->y); B5C->z = reg2 * (AA8->z - B5C->z); } } /* 000009A4-00000A94 .text tail_draw__FP8bb_class */ void tail_draw(bb_class* i_this) { cXyz* AA8 = &i_this->unk_AA8[0]; csXyz* B20 = &i_this->unk_B20[0]; for (s32 i = 0; i < 9; AA8++, B20++, i++) { f32 scale = tial_scale[i]; MtxTrans(AA8->x, AA8->y, AA8->z, false); MtxScale(scale, scale, scale, true); cMtx_YrotM(*calc_mtx, B20->y); cMtx_XrotM(*calc_mtx, B20->x); J3DModel* model = i_this->unk_A84[i]; model->setBaseTRMtx(*calc_mtx); g_env_light.setLightTevColorType(model, &i_this->actor.tevStr); mDoExt_modelUpdate(model); } } /* 00000A94-00000B90 .text tex_anm_set__FP8bb_classUs */ void tex_anm_set(bb_class* i_this, unsigned short idx) { i_this->unk_2CD = 1; i_this->unk_2CE = bb_tex_max_frame[idx]; i_this->unk_2CC = 0; J3DAnmTexPattern* btp = static_cast(dComIfG_getObjectRes("Bb", bb_tex_anm_idx[idx])); JUT_ASSERT(671, btp); i_this->mBtpAnm.init(i_this->mpMorf->getModel()->getModelData(), btp, 0, 2, 1.0f, 0, -1, true, 0); } /* 00000B90-00000C40 .text bb_eye_tex_anm__FP8bb_class */ void bb_eye_tex_anm(bb_class* i_this) { if (i_this->unk_2D0 != 0) { i_this->unk_2D0--; } else { i_this->unk_2D0 = cM_rndF(50.0f) + 10.0f; if (i_this->unk_2CD == 0) { tex_anm_set(i_this, 4); } } if (i_this->unk_2CD != 0) { if (i_this->unk_2CC < i_this->unk_2CE) { i_this->unk_2CC++; } else { i_this->unk_2CD = 0; } } } /* 00000C40-00000D74 .text anm_init__FP8bb_classifUcfi */ void anm_init(bb_class* i_this, int animFileIdx, float morf, unsigned char loopMode, float speed, int soundFileIdx) { if (i_this->unk_2DF < 3) { if (soundFileIdx >= 0) { i_this->mpMorf->setAnm((J3DAnmTransform*)(dComIfG_getObjectRes("Bb", animFileIdx)), loopMode, morf, speed, 0.0f, -1.0f, dComIfG_getObjectRes("Bb", soundFileIdx)); } else { i_this->mpMorf->setAnm((J3DAnmTransform*)(dComIfG_getObjectRes("Bb", animFileIdx)), loopMode, morf, speed, 0.0f, -1.0f, NULL); } } } /* 00000D74-00001048 .text s_a_d_sub__FPvPv */ void* s_a_d_sub(void* ac1, void* ac2) { dBgS_LinChk linChk; cXyz sp14; cXyz sp8; if (esa_check_count < 100 && fopAc_IsActor(ac1) && fpcM_GetName(ac1) == PROC_ESA) { esa_class* esa1 = (esa_class*)ac1; esa_class* esa2 = (esa_class*)ac2; if (esa1->field_0x298 == 0) { sp8 = esa1->current.pos; sp8.y += 10.0f; sp14 = esa2->current.pos; linChk.Set(&sp14, &sp8, esa2); if (!dComIfG_Bgsp()->LineCross(&linChk)) { esa_info[esa_check_count] = esa1; esa_check_count++; } } } return NULL; } /* 00001480-000015D4 .text search_esa__FP8bb_class */ esa_class* search_esa(bb_class* i_this) { esa_check_count = 0; fpcM_Search(s_a_d_sub, i_this); if (esa_check_count != 0) { f32 fDist = 50.0f; s32 i = 0; while (i < esa_check_count) { esa_class* esa = esa_info[i]; f32 x = esa->current.pos.x - i_this->actor.current.pos.x; f32 z = esa->current.pos.z - i_this->actor.current.pos.z; if (std::sqrtf(x * x + z * z) < fDist) { esa->field_0x298 = 1; return esa; } i++; if (i == esa_check_count) { i = 0; fDist += 50.0f; if (fDist > 10000.0f) { return NULL; } } } } return NULL; } /* 000015D4-000015F4 .text kuti_open__FP8bb_classsUl */ void kuti_open(bb_class* i_this, short arg1, unsigned long sfxId) { if (i_this->unk_C50 == 0) { i_this->unk_C50 = arg1; i_this->unk_C52 = arg1 - 3; i_this->unk_C54 = sfxId; } } /* 000015F4-00001928 .text bb_player_bg_check__FP8bb_class */ BOOL bb_player_bg_check(bb_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); dBgS_LinChk linChk; cXyz sp14; cXyz sp8; sp8 = player->current.pos; sp8.y += 100.0f; sp14 = a_this->eyePos; linChk.Set(&sp14, &sp8, a_this); if (dComIfG_Bgsp()->LineCross(&linChk)) { return TRUE; } return FALSE; } /* 00001928-00001C50 .text bb_setpos_bg_check__FP8bb_class */ BOOL bb_setpos_bg_check(bb_class* i_this) { dBgS_LinChk linChk; cXyz sp14; cXyz sp8; sp8 = i_this->actor.home.pos; sp8.y += 100.0f; sp14 = i_this->actor.eyePos; linChk.Set(&sp14, &sp8, &i_this->actor); if (dComIfG_Bgsp()->LineCross(&linChk)) { return TRUE; } return FALSE; } /* 00001C50-00001DF8 .text bb_player_view_check__FP8bb_class */ s32 bb_player_view_check(bb_class* i_this) { daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); s16 var_r5; f32 var_f2; if (l_bbHIO.unk_06 != 0) { return 1; } if (i_this->unk_2D9 != 0xFF) { if (i_this->unk_33C > i_this->unk_2D9 * 100.0f || bb_player_bg_check(i_this)) { return 0; } } else if (i_this->unk_2DD == 4 || i_this->unk_2DD == 7) { if (i_this->unk_33C > l_bbHIO.unk_6C || bb_player_bg_check(i_this)) { return 0; } } else if (i_this->unk_33C > l_bbHIO.unk_68 || bb_player_bg_check(i_this)) { return 0; } if (i_this->unk_2DD == 4 || i_this->unk_2DD == 7) { var_r5 = l_bbHIO.unk_72; var_f2 = l_bbHIO.unk_78; } else { var_r5 = l_bbHIO.unk_70; var_f2 = l_bbHIO.unk_74; } if (std::fabsf(player->current.pos.y - i_this->actor.eyePos.y) < var_f2) { s16 tmp = i_this->actor.current.angle.y - i_this->unk_C5C - i_this->unk_336; if (tmp < 0) { tmp = -tmp; } if ((u16)tmp < var_r5) { return 1; } } return 0; } /* 00001DF8-00002250 .text path_check__FP8bb_class */ void path_check(bb_class* i_this) { static u8 check_index[255]; fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor; if (i_this->ppd == NULL) { return; } dBgS_LinChk linChk; cXyz sp24; cXyz spC; dPnt* point; sp24 = a_this->current.pos; sp24.y += 100.0f; point = &i_this->ppd->m_points[0]; for (s32 i = 0; i < i_this->ppd->m_num; i++, point++) { spC.x = point->m_position.x; spC.y = point->m_position.y + 100.0f; spC.z = point->m_position.z; linChk.Set(&sp24, &spC, a_this); if (!dComIfG_Bgsp()->LineCross(&linChk)) { check_index[i] = 1; } else { check_index[i] = 0; } } f32 fDist = 0.0f; bool r7 = false; for (s32 j = 0; j < 100; j++) { point = &i_this->ppd->m_points[0]; for (s32 i = 0; i < i_this->ppd->m_num; i++, point++) { if (check_index[i] != 0) { f32 x = a_this->current.pos.x - point->m_position.x; f32 y = a_this->current.pos.y - point->m_position.y; f32 z = a_this->current.pos.z - point->m_position.z; if (std::sqrtf(x * x + y * y + z * z) < fDist) { i_this->unk_35E = i - (u8)i_this->unk_35F; if (i_this->unk_35E >= (s8)i_this->ppd->m_num) { i_this->unk_35E = i_this->ppd->m_num; } else if (i_this->unk_35E < 0) { i_this->unk_35E = 0; } r7 = true; break; } } } if (r7) { break; } fDist += 50.0f; } if (!r7) { i_this->unk_35D = 0; } else { i_this->unk_35D = i_this->unk_2DA + 1; } } /* 00002250-0000234C .text daBb_shadowDraw__FP8bb_class */ static void daBb_shadowDraw(bb_class* i_this) { J3DModel* model = i_this->mpMorf->getModel(); cXyz pos( i_this->actor.current.pos.x, i_this->actor.current.pos.y + 150.0f + REG8_F(18), i_this->actor.current.pos.z ); i_this->unk_2D4 = dComIfGd_setShadow(i_this->unk_2D4, 1, model, &pos, REG8_F(19) + 800.0f, REG8_F(17) + 40.0f, i_this->actor.current.pos.y, i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd, &i_this->actor.tevStr, 0, 1.0f, &dDlst_shadowControl_c::mSimpleTexObj); if (i_this->unk_2D4 != 0) { for (s32 i = 0; i < 9; i++) { dComIfGd_addRealShadow(i_this->unk_2D4, i_this->unk_A84[i]); } } } /* 0000234C-00002444 .text daBb_Draw__FP8bb_class */ static BOOL daBb_Draw(bb_class* i_this) { if (i_this->unk_2F2 != 0) { return TRUE; } J3DModel* model = i_this->mpMorf->getModel(); g_env_light.setLightTevColorType(model, &i_this->actor.tevStr); if (i_this->mEnemyIce.mFreezeTimer > 20) { dMat_control_c::iceEntryDL(i_this->mpMorf, -1, NULL); daBb_shadowDraw(i_this); return TRUE; } i_this->mBtpAnm.entry(model->getModelData(), i_this->unk_2CC); i_this->mpMorf->entryDL(); J3DModelData* modelData = model->getModelData(); modelData->getMaterialTable().removeTexNoAnimator(i_this->mBtpAnm.getBtpAnm()); daBb_shadowDraw(i_this); tail_draw(i_this); #if VERSION == VERSION_DEMO dSnap_RegistFig(DSNAP_TYPE_UNKB0, &i_this->actor, 1.0f, 1.0f, 1.0f); #else dSnap_RegistFig(DSNAP_TYPE_UNKB0, &i_this->actor, i_this->actor.eyePos, i_this->actor.shape_angle.y, 1.0f, 1.0f, 1.0f); #endif return TRUE; } /* 00002444-00002708 .text bb_pos_move__FP8bb_class */ void bb_pos_move(bb_class* i_this) { f32 x = i_this->unk_2F4.x - i_this->actor.current.pos.x; f32 y = i_this->unk_2F4.y - i_this->actor.current.pos.y; f32 z = i_this->unk_2F4.z - i_this->actor.current.pos.z; s16 atan = cM_atan2s(x, z); f32 sqrt = std::sqrtf(x * x + z * z); s16 atan2 = -cM_atan2s(y, sqrt); s16 old_y = i_this->actor.current.angle.y; cLib_addCalcAngleS2(&i_this->actor.current.angle.y, atan, REG0_S(3) + 10, i_this->unk_310 * i_this->unk_308); old_y = (old_y - i_this->actor.current.angle.y) * 32; s16 target = REG0_S(1) + 5500; if (old_y > target) { old_y = target; } else if (old_y < -target) { old_y = -target; } cLib_addCalcAngleS2(&i_this->actor.current.angle.z, old_y, REG0_S(3) + 10, i_this->unk_310 * i_this->unk_308 * 0.5f); cLib_addCalcAngleS2(&i_this->actor.current.angle.x, atan2, REG0_S(3) + 10, i_this->unk_310 * i_this->unk_308); cLib_addCalc2(&i_this->unk_308, 1.0f, 1.0f, 0.04f); cLib_addCalc2(&i_this->actor.speedF, i_this->unk_300, 1.0f, i_this->unk_304); cXyz v; v.x = 0.0f; v.y = 0.0f; v.z = i_this->actor.speedF; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x); MtxPosition(&v, &i_this->actor.speed); i_this->actor.current.pos.x += i_this->actor.speed.x; i_this->actor.current.pos.y += i_this->actor.speed.y; i_this->actor.current.pos.z += i_this->actor.speed.z; if (i_this->unk_324 != 0) { i_this->unk_324--; i_this->actor.current.pos.y += 5.0f; } } /* 00002708-00002854 .text bb_ground_pos_move__FP8bb_class */ void bb_ground_pos_move(bb_class* i_this) { cXyz v; cXyz v2; s16 atan = cM_atan2s(i_this->unk_2F4.x - i_this->actor.current.pos.x, i_this->unk_2F4.z - i_this->actor.current.pos.z); cLib_addCalcAngleS2(&i_this->actor.current.angle.y, atan, REG0_S(3) + 2, i_this->unk_310 * i_this->unk_308); cLib_addCalc2(&i_this->unk_308, 1.0f, 1.0f, 0.1f); cLib_addCalc2(&i_this->actor.speedF, i_this->unk_300, 1.0f, i_this->unk_304); v.x = 0.0f; v.y = 0.0f; v.z = i_this->actor.speedF; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&v, &v2); i_this->actor.speed.x = v2.x; i_this->actor.speed.z = v2.z; i_this->actor.current.pos.x += i_this->actor.speed.x; i_this->actor.current.pos.y += i_this->actor.speed.y; i_this->actor.current.pos.z += i_this->actor.speed.z; i_this->actor.speed.y -= 3.0f; if (i_this->mAcch.ChkGroundHit()) { i_this->actor.speed.y = -0.5f; } } /* 00002854-00003224 .text bb_path_move__FP8bb_class */ void bb_path_move(bb_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor; s8 r29 = 0; s32 frame; f32 x; f32 y; f32 z; f32 sqrt; dPnt* point; esa_class* esa; i_this->unk_C60 = 2; switch (i_this->unk_2F0) { case 0: frame = i_this->mpMorf->getFrame(); if (a_this->current.pos.y > i_this->unk_2F4.y && frame == (REG0_S(0) + 9)) { i_this->unk_2F0 = 1; anm_init(i_this, 0x19, REG0_F(0) + 12.0f, 2, 1.0f, 9); } break; case 1: if (a_this->current.pos.y <= i_this->unk_2F4.y) { i_this->unk_2F0 = 0; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); } break; case 10: break; } switch (i_this->unk_2F1) { case 0: i_this->unk_35E += i_this->unk_35F; if (i_this->unk_35E >= (s8)i_this->ppd->m_num) { if (i_this->ppd->m_closed & 1) { i_this->unk_35E = 0; } else { i_this->unk_35F = -1; i_this->unk_35E = i_this->ppd->m_num - 2; } if (i_this->ppd->m_nextID + 0 != 0xFFFF) { i_this->ppd = dPath_GetRoomPath(i_this->ppd->m_nextID, fopAcM_GetRoomNo(a_this)); JUT_ASSERT(DEMO_SELECT(1476, 1479), i_this->ppd != NULL); } } else if (i_this->unk_35E < 0) { i_this->unk_35F = 1; i_this->unk_35E = 1; } case -1: i_this->unk_2F1 = 1; point = &i_this->ppd->m_points[0]; point += i_this->unk_35E; if (i_this->unk_364 != 0) { i_this->unk_300 = 25.0f; i_this->unk_304 = 2.0f; i_this->unk_364 = 0; } else if (a_this->current.pos.y < i_this->unk_2F4.y) { i_this->unk_300 = 20.0; i_this->unk_304 = REG0_F(11) + 1.0f; } else { i_this->unk_300 = 30.0; i_this->unk_304 = REG0_F(13) + 1.0f; } i_this->unk_308 = REG0_F(7); i_this->unk_2F4 = point->m_position; if (point->mArg3 == 1) { i_this->unk_2F1 = 10; } else if (i_this->unk_2DF == 0) { i_this->unk_2F4.x = point->m_position.x + cM_rndFX(150.0f); i_this->unk_2F4.y = point->m_position.y + cM_rndFX(150.0f); i_this->unk_2F4.z = point->m_position.z + cM_rndFX(150.0f); } if (l_bbHIO.unk_06 != 0 || (i_this->unk_318[3] == 0 && i_this->unk_2DF == 0)) { esa = search_esa(i_this); if (esa != NULL) { i_this->unk_330 = fpcM_GetID(esa); i_this->unk_2F1 = 10; i_this->unk_310 = 1000.0f; i_this->unk_35D = 0; } else if (bb_player_view_check(i_this) != 0) { i_this->unk_2DD = 3; i_this->unk_2F1 = 0; i_this->unk_35D = 0; } } break; case 1: cLib_addCalc2(&i_this->unk_308,1.0f, 1.0f, 0.04f); x = i_this->unk_2F4.x - a_this->current.pos.x; y = i_this->unk_2F4.y - a_this->current.pos.y; z = i_this->unk_2F4.z - a_this->current.pos.z; sqrt = std::sqrtf(x * x + y * y + z * z); i_this->unk_310 = (REG0_F(5) * 10.0f + 100.0f) + (REG0_F(6) * 1000.0f + 500000.0f) / sqrt; if (i_this->unk_310 > (REG0_F(4) * 10.0f + 5000.0f)) { i_this->unk_310 = REG0_F(4) * 10.0f + 5000.0f; } if (sqrt < REG0_F(10) * 10.0f + 300.0f) { i_this->unk_2F1 = 0; point = &i_this->ppd->m_points[0]; point += i_this->unk_35E; if (point->mArg3 == 5) { i_this->unk_2E0 = 1; } else if (point->mArg3 == 6) { fopAcM_delete(a_this); } } break; case 10: i_this->unk_300 = 20.0f; x = i_this->unk_2F4.x - a_this->current.pos.x; y = (i_this->unk_2F4.y + 50.0f + REG0_F(8) * 10.0f) - a_this->current.pos.y; z = i_this->unk_2F4.z - a_this->current.pos.z; if (std::sqrtf(x * x + y * y + z * z) < REG0_F(9) * 10.0f + 300.0f) { i_this->unk_2F1 = 20; i_this->unk_2F0 = 10; a_this->speed.y = 0.0f; r29 = -1; } break; case 20: r29 = -1; frame = i_this->mpMorf->getFrame(); cLib_addCalc2(&a_this->current.pos.x, i_this->unk_2F4.x, 0.1f, std::fabsf(a_this->speed.x)); cLib_addCalc2(&a_this->current.pos.z, i_this->unk_2F4.z, 0.1f, std::fabsf(a_this->speed.z)); a_this->current.pos.y += a_this->speed.y; if (frame > (REG0_S(2) + 15)) { a_this->speed.y -= REG0_F(7) + 0.8f; } cLib_addCalcAngleS2(&a_this->current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&a_this->current.angle.z, 0, 5, 0x800); if (i_this->mAcch.ChkGroundHit()) { a_this->speed.y = -0.5f; } if (i_this->unk_318[2] == 0) { i_this->unk_2F1 = 0x17; } break; case 22: r29 = 1; if (i_this->unk_318[2] == 0) { i_this->unk_35E++; if (i_this->unk_35E >= i_this->ppd->m_num) { i_this->unk_35E = 0; } point = &i_this->ppd->m_points[0]; point += i_this->unk_35E; i_this->unk_2F4 = point->m_position; if (point->mArg3 == 2) { i_this->unk_2F1 = 0x19; } else { i_this->unk_2F1 = 0x17; i_this->unk_310 = 1000.0f; i_this->unk_308 = 1.0f; } } i_this->unk_300 = 0.0f; a_this->speedF = 0.0f; break; case 23: r29 = 1; frame = i_this->mpMorf->getFrame(); if (frame >= REG0_S(3) && frame <= REG0_S(4) + 9) { i_this->unk_300 = i_this->unk_328 * 5.0f; a_this->speedF = i_this->unk_328 * 5.0f; } else { i_this->unk_300 = 0.0f; a_this->speedF = 0.0f; x = i_this->unk_2F4.x - a_this->current.pos.x; z = i_this->unk_2F4.z - a_this->current.pos.z; if (std::sqrtf(x * x + z * z) < 50.0f) { i_this->unk_2F1 = 0x16; if (i_this->ppd->m_points[i_this->unk_35E].mArg3 == 3) { i_this->unk_318[2] = cM_rndF(50.0f) + 50.0f; } } } break; case 25: r29 = 1; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); i_this->unk_2F1 = -1; i_this->unk_310 = REG0_F(4) * 10.0f + 5000.0f; i_this->unk_300 = 25.0f; i_this->unk_304 = 2.0f; a_this->speedF = 0.0f; i_this->unk_324 = REG0_S(4) + 10; break; } switch (r29) { case 0: bb_pos_move(i_this); break; case 1: bb_ground_pos_move(i_this); break; } } /* 00003224-00003F88 .text bb_auto_move__FP8bb_class */ void bb_auto_move(bb_class* i_this) { daPy_py_c* player = daPy_getPlayerActorClass(); s32 frame; s8 r29 = 0; cXyz sp34; i_this->unk_C60 = 2; switch (i_this->unk_2F0) { case 0: frame = i_this->mpMorf->getFrame(); if ((i_this->unk_318[0] == 0) && (frame == REG0_S(0) + 9)) { i_this->unk_2F0 = 1; i_this->unk_318[0] = cM_rndF(200.0) + 50.0f; anm_init(i_this, 0x19, REG0_F(0) + 12.0f, 2, 1.0f, 9); } break; case 1: if ((i_this->unk_318[0] == 0) && (i_this->actor.current.pos.y < i_this->unk_2F4.y)) { i_this->unk_2F0 = 0; i_this->unk_318[0] = cM_rndF(60.0) + 20.0f; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); } break; case 10: break; case 20: frame = i_this->mpMorf->getFrame(); if (frame == 0x22) { i_this->unk_2F0 = 0; i_this->unk_318[0] = cM_rndF(60.0f) + 20.0f; anm_init(i_this, 0x18, 0.0f, 2, l_bbHIO.unk_24, 8); } break; } switch(i_this->unk_2F1) { case 0: if (i_this->unk_318[1] == 0) { f32 x = (i_this->actor.home.pos.x + cM_rndFX(l_bbHIO.unk_0C)) - i_this->actor.current.pos.x; f32 z = (i_this->actor.home.pos.z + cM_rndFX(l_bbHIO.unk_0C)) - i_this->actor.current.pos.z; if (std::sqrtf(x * x + z * z) > 200.0f) { i_this->unk_318[1] = cM_rndF(150.0f) + 50.0f; i_this->unk_2F4.x = x + i_this->actor.current.pos.x; i_this->unk_2F4.y = i_this->actor.home.pos.y + cM_rndF(500.0f); i_this->unk_2F4.z = z + i_this->actor.current.pos.z; i_this->unk_308 = 0.0; i_this->unk_300 = REG0_F(10) + 25.0f; i_this->unk_304 = REG0_F(11) + 1.0f; i_this->unk_310 = cM_rndF(300.0f) + 200.0f; if ((l_bbHIO.unk_06 != 0) || (i_this->unk_318[3] == 0 && (i_this->unk_2DF == 0))) { esa_class* esa = search_esa(i_this); if (esa != NULL) { i_this->unk_330 = fpcM_GetID(esa); i_this->unk_2F1 = 10; i_this->unk_310 = 1000.0f; } else if (bb_player_view_check(i_this) != 0) { i_this->unk_2DD = 3; i_this->unk_2F1 = 0; } } } } break; case 10: case 11: { i_this->unk_C60 = 0; fopAc_ac_c* ac = fopAcM_SearchByID(i_this->unk_330); if (ac != NULL) { sp34.x = 0.0f; sp34.y = 0.0f; sp34.z = REG0_F(16) * 10.0f + -200.0f; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); cXyz v2; MtxPosition(&sp34, &v2); i_this->unk_2F4.x = ac->current.pos.x + v2.x; i_this->unk_2F4.y = ac->current.pos.y + 80.0f + REG0_F(8) * 10.0f; i_this->unk_2F4.z = ac->current.pos.z + v2.z; i_this->unk_300 = 20.0f; f32 x = i_this->unk_2F4.x - i_this->actor.current.pos.x; f32 y = i_this->unk_2F4.y - i_this->actor.current.pos.y; f32 z = i_this->unk_2F4.z - i_this->actor.current.pos.z; f32 sqrt = std::sqrtf(x * x + y * y + z * z); if (i_this->unk_2F1 == 10) { if (sqrt < l_bbHIO.unk_50) { i_this->unk_2F1 = 11; anm_init(i_this, 0x1A, 10.0f, 0, 1.0f, 10); } } else if (sqrt < REG0_F(9) * 10.0f + 300.0f) { i_this->unk_2F1 = 20; anm_init(i_this, 0x1F, 5.0f, 2, l_bbHIO.unk_44, 15); i_this->unk_2F0 = 10; i_this->actor.speed.y = 0.0f; i_this->unk_354 = 0; r29 = -1; } } else { i_this->unk_2F1 = 0; } break; } case 20: { r29 = -1; i_this->unk_C60 = 0; s16 old_354 = i_this->unk_354; i_this->unk_354++; cLib_addCalc2(&i_this->actor.current.pos.x, i_this->unk_2F4.x, 0.1f, std::fabsf(i_this->actor.speed.x)); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->unk_2F4.z, 0.1f, std::fabsf(i_this->actor.speed.z)); i_this->actor.current.pos.y += i_this->actor.speed.y; if (old_354 > l_bbHIO.unk_40) { i_this->actor.speed.y -= REG0_F(7) + 0.8f; } cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, 0, 5, 0x800); if (i_this->mAcch.GetGroundH() - i_this->actor.current.pos.y < -200.0f) { i_this->unk_2F1 = 25; } else if (i_this->mAcch.ChkGroundHit()) { i_this->actor.speed.y = -0.5f; anm_init(i_this, 0x20, 5.0f, 0, l_bbHIO.unk_48, 0x10); i_this->unk_2F1 = 22; i_this->unk_318[2] = 50; } break; } case 21: { r29 = 1; fopAc_ac_c* esa = search_esa(i_this); if (esa == NULL) { i_this->unk_2F1 = 25; } else { i_this->unk_2F1 = 22; } break; } case 22: r29 = 1; i_this->unk_300 = 0.0f; i_this->actor.speedF = 0.0f; i_this->unk_310 = 0.0f; if (i_this->unk_318[2] == 0) { i_this->unk_2F1 = 23; fopAc_ac_c* ac = fopAcM_SearchByID(i_this->unk_330); if (ac != NULL) { i_this->unk_2F4.x = ac->current.pos.x; i_this->unk_2F4.z = ac->current.pos.z; i_this->unk_310 = 1000.0f; i_this->unk_308 = 1.0f; anm_init(i_this, 0x22, 5.0f, 2, 1.0f, 0x12); } else { i_this->unk_2F1 = 0x19; } } break; case 23: { r29 = 1; i_this->unk_C60 = 0; i_this->unk_300 = l_bbHIO.unk_54; i_this->actor.speedF = 1.0; f32 x = i_this->unk_2F4.x - i_this->actor.current.pos.x; f32 z = i_this->unk_2F4.z - i_this->actor.current.pos.z; if (std::sqrtf(x * x + z * z) < 110.0f) { i_this->unk_2F1 = 21; i_this->unk_318[2] = cM_rndF(50.0f) + 50.0f; anm_init(i_this, 0x17, 5.0f, 0, 1.0f, 7); i_this->unk_2F1 = 24; } break; } case 24: { r29 = 1; i_this->unk_C50 = 0; i_this->unk_C60 = 0; i_this->unk_300 = 0.0f; i_this->actor.speedF = 0.0f; frame = i_this->mpMorf->getFrame(); if (frame == 9) { fopAc_ac_c* ac = fopAcM_SearchByID(i_this->unk_330); if (ac != NULL) { fopAcM_delete(ac); } } if (i_this->mpMorf->isStop()) { i_this->unk_2F1 = 21; i_this->unk_318[2] = cM_rndF(50.0f); anm_init(i_this, 0x21, 5.0f, 2, 1.0f, 0x11); } break; } case 25: r29 = 1; i_this->unk_2F1 = 0; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); i_this->unk_310 = REG0_F(4) * 10.0f + 2000.0f; i_this->unk_300 = 25.0f; i_this->unk_304 = 1.0f; i_this->actor.speedF = 0.0f; i_this->unk_324 = REG0_S(4) + 10; i_this->unk_318[3] = cM_rndF(100.0f) + 100.0f; i_this->unk_324 = REG0_S(4) + 10; if (i_this->unk_2DA != 0xFF) { i_this->unk_35D = i_this->unk_2DA + 1; path_check(i_this); i_this->unk_364 = 1; } else { i_this->unk_318[1] = 50; MtxTrans(i_this->actor.current.pos.x, i_this->actor.current.pos.y, i_this->actor.current.pos.z, false); sp34.x = 0.0f; sp34.y = 1000.0f; sp34.z = 2000.0f; cMtx_YrotM(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&sp34, &i_this->unk_2F4); } break; } switch (r29) { case 0: bb_pos_move(i_this); break; case 1: bb_ground_pos_move(i_this); if (i_this->unk_2F1 != 25) { f32 x = player->current.pos.x - i_this->actor.current.pos.x; f32 z = player->current.pos.z - i_this->actor.current.pos.z; if (std::sqrtf(x * x + z * z) < 400.0f) { i_this->unk_2F1 = 0; fopAc_ac_c* ac = fopAcM_SearchByID(i_this->unk_330); if (ac != NULL) { esa_class* esa = (esa_class*)ac; esa->field_0x298 = 0; } i_this->unk_2F0 = 0; i_this->unk_318[0] = cM_rndF(60.0f) + 20.0f; anm_init(i_this, 0x18, 3.0f, 2, l_bbHIO.unk_24, 8); if (i_this->unk_2DA != 0xFF) { i_this->unk_35D = i_this->unk_2DA + 1; path_check(i_this); i_this->unk_318[3] = cM_rndF(250.0f) + 250.0f; i_this->unk_364 = 1; } else { i_this->unk_318[1] = 50; i_this->unk_310 = REG0_F(4) * 10.0f + 5000.0f; i_this->unk_300 = 30.0f; i_this->unk_304 = 3.0f; i_this->actor.speedF = 0.0f; MtxTrans(i_this->actor.current.pos.x, i_this->actor.current.pos.y, i_this->actor.current.pos.z, false); sp34.x = 0.0f; sp34.y = 1000.0f; sp34.z = 2000.0f; cMtx_YrotM(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&sp34, &i_this->unk_2F4); i_this->unk_318[3] = cM_rndF(250.0f) + 250.0f; } } } break; } } /* 00003F88-00004000 .text bb_water_check__FP8bb_class */ void bb_water_check(bb_class* i_this) { if (daSea_ChkArea(i_this->unk_2F4.x, i_this->unk_2F4.z)) { f32 waveHeight = daSea_calcWave(i_this->unk_2F4.x, i_this->unk_2F4.z); waveHeight = REG0_F(0) + waveHeight; waveHeight = 100.0f + waveHeight; if (i_this->actor.current.pos.y <= waveHeight) { i_this->actor.current.pos.y = waveHeight; } } } /* 00004000-0000404C .text pl_name_check__FPvPv */ void* pl_name_check(void* ac1, void* ac2) { if (fopAc_IsActor(ac1) && fopAcM_GetName(ac1) == PROC_NPC_KAM) { return ac1; } return NULL; } /* 0000404C-000044EC .text bb_kamome_attack__FP8bb_class */ void bb_kamome_attack(bb_class* i_this) { daPy_py_c* player = daPy_getPlayerActorClass(); i_this->unk_C60 = 1; switch (i_this->unk_2F0) { case 0: { s32 frame = i_this->mpMorf->getFrame(); if ((i_this->actor.current.pos.y > i_this->unk_2F4.y) && (frame == REG0_S(0) + 9)) { i_this->unk_2F0 = 1; anm_init(i_this, 0x19, REG0_F(0) + 12.0f, 2, 1.0f, 9); } break; } case 1: { if (i_this->actor.current.pos.y <= i_this->unk_2F4.y) { i_this->unk_2F0 = 0; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); } break; } default: i_this->unk_2F0 = 0; break; } switch (i_this->unk_2F1) { case 0: anm_init(i_this, 0x19, 10.0f, 2, 1.0f, 9); i_this->unk_2F1 = 1; case 1: { cXyz v; v.x = (REG0_F(5) + 300.0f) * cM_ssin(i_this->unk_352 * (REG0_S(5) + 400)); v.y = (REG0_F(3) + 100.0f) * cM_ssin(i_this->unk_352 * (REG0_S(5) + 300)); v.z = REG0_F(4) + 100.0f + (REG0_F(7) + 100.0f) * cM_ssin(i_this->unk_352 * (REG0_S(6) + 100)); cMtx_YrotS(*calc_mtx, player->shape_angle.y); cXyz v2; MtxPosition(&v, &v2); i_this->unk_2F4 = v2 + player->current.pos; break; } default: i_this->unk_2F1 = 0; break; } i_this->unk_300 = l_bbHIO.unk_08; cXyz tmp = i_this->unk_2F4 - i_this->actor.current.pos; if (std::sqrtf(tmp.getSquareMag()) < REG0_F(9) + 100.0f) { i_this->unk_300 = 0.0f; } i_this->unk_304 = REG0_F(10) + 0.5f; i_this->unk_310 = REG0_F(11) + 1000.0f; i_this->unk_308 = 1.0f; bb_pos_move(i_this); if ((i_this->unk_352 & 0x3F) == 0 && cM_rndF(1.0f) < 0.5f) { kuti_open(i_this, 0x1B, JA_SE_CV_BB_ATTACK); } i_this->mHeadAtSph.SetC(i_this->actor.eyePos); dComIfG_Ccsp()->Set(&i_this->mHeadAtSph); if (daSea_ChkArea(i_this->actor.eyePos.x, i_this->actor.eyePos.z)) { f32 waveHeight = daSea_calcWave(i_this->actor.eyePos.x, i_this->actor.eyePos.z); if (i_this->actor.eyePos.y < waveHeight && i_this->unk_358 >= waveHeight) { cXyz i_pos = i_this->actor.eyePos; i_pos.y = waveHeight; fopKyM_createWpillar(&i_pos, REG0_F(9) + 0.7f, REG0_F(10) + 0.7f, 0); fopAcM_seStart(&i_this->actor, JA_SE_OBJ_FALL_WATER_S, 0); } i_this->unk_358 = i_this->actor.eyePos.y; if (i_this->actor.current.pos.y < waveHeight + 30.0f) { i_this->actor.current.pos.y = waveHeight + 30.0f; } } } /* 000044EC-00005534 .text bb_atack_move__FP8bb_class */ void bb_atack_move(bb_class* i_this) { fopAc_ac_c* a_this = &i_this->actor; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); s8 r29 = 0; s8 r28 = 0; f32 x; f32 y; f32 z; i_this->unk_C60 = 1; if (i_this->unk_C7C != 0) { i_this->unk_C7C = 0; i_this->unk_318[5] = (cM_rndF(30.0f) + 20.0f) * l_bbHIO.unk_20; anm_init(i_this, 0x1B, 10.0f, 2, l_bbHIO.unk_28, 11); i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; i_this->unk_2F1 = 4; kuti_open(i_this, 0x30, JA_SE_CV_BB_NORMAL); } #if VERSION == VERSION_DEMO if (&player->base == fpcM_Search(pl_name_check, i_this) || l_bbHIO.unk_10 != 0) #else if (&player->base == fpcM_Search(pl_name_check, i_this)) #endif { bb_kamome_attack(i_this); return; } switch (i_this->unk_2F1) { case 0: i_this->unk_2F1 = 1; i_this->unk_308 = 0.0f; i_this->unk_300 = 30.0f; i_this->unk_304 = 1.0f; anm_init(i_this, 0x19, 10.0f, 2, 1.0f, 9); case 1: case 2: i_this->unk_2F4 = player->current.pos; i_this->unk_2F4.y += 200.0f; bb_pos_move(i_this); x = i_this->unk_2F4.x - a_this->current.pos.x; y = i_this->unk_2F4.y - a_this->current.pos.y; z = i_this->unk_2F4.z - a_this->current.pos.z; if (i_this->unk_2F1 == 1) { i_this->unk_310 = 400.0; if (std::sqrtf(x * x + y * y + z * z) < l_bbHIO.unk_50) { i_this->unk_2F1 = 2; anm_init(i_this, 0x1A, 10.0f, 0, 1.0f, 10); kuti_open(i_this, 0x15, JA_SE_CV_BB_FIND); } } else { i_this->unk_310 = 2000.0; if (std::sqrtf(x * x + y * y + z * z) < REG0_F(9) * 100.0f + 350.0f) { i_this->unk_2F1 = 3; } } break; case 3: i_this->unk_300 = 0.0f; i_this->unk_304 = 3.0f; bb_pos_move(i_this); if (a_this->speedF < 0.1f) { i_this->unk_2F1 = 4; i_this->unk_318[0] = 0; if ((i_this->unk_2D8 == 4) || (i_this->unk_2D8 == 7)) { i_this->unk_318[1] = l_bbHIO.unk_16 + cM_rndF(l_bbHIO.unk_18 - l_bbHIO.unk_16); } else { i_this->unk_318[1] = l_bbHIO.unk_12 + cM_rndF(l_bbHIO.unk_14 - l_bbHIO.unk_12); } i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; anm_init(i_this, 0x1B, 5.0f, 2, l_bbHIO.unk_28, 11); kuti_open(i_this, 0x30, JA_SE_CV_BB_NORMAL); } break; case 4: i_this->unk_354++; x = cM_ssin(i_this->unk_354 * (REG0_S(2) + 1000)) * 200.0f; y = cM_ssin(i_this->unk_354 * (REG0_S(3) + 1200)) * 100.0f; z = cM_scos(i_this->unk_354 * (REG0_S(4) + 1500)) * 200.0f; cLib_addCalc2(&a_this->current.pos.x, i_this->unk_2F4.x + x, 0.1f, i_this->unk_308 * 20.0f); cLib_addCalc2(&a_this->current.pos.y, i_this->unk_2F4.y + y, 0.1f, i_this->unk_308 * 20.0f); cLib_addCalc2(&a_this->current.pos.z, i_this->unk_2F4.z + z, 0.1f, i_this->unk_308 * 20.0f); cLib_addCalc2(&i_this->unk_308, l_bbHIO.unk_1C, 1.0f, l_bbHIO.unk_1C * 0.1f); cLib_addCalcAngleS2(&a_this->current.angle.y, i_this->unk_336, 5, i_this->unk_30C * 1280.0f); cLib_addCalcAngleS2(&a_this->current.angle.x, i_this->unk_338, 5, i_this->unk_30C * 768.0f); cLib_addCalcAngleS2(&a_this->current.angle.z, 0, 5, i_this->unk_30C * 768.0f); cLib_addCalc2(&i_this->unk_30C, 1.0f, 1.0f, 0.05f); if (i_this->unk_318[1] == 0) { r29 = 1; break; } if (((i_this->unk_318[0] & 0x1F) == 0) && cM_rndF(1.0f) < 0.5f) { kuti_open(i_this, 0x1B, JA_SE_CV_BB_ATTACK); } if (i_this->unk_318[0] == 0) { i_this->unk_2F4.x = player->current.pos.x + cM_rndFX(400.0f); i_this->unk_2F4.y = player->current.pos.y + 100.0f + cM_rndF(200.0f); i_this->unk_2F4.z = player->current.pos.z + cM_rndFX(400.0f); i_this->unk_318[0] = cM_rndF(100.0f) + 20.0f; i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; } if (i_this->unk_318[5] == 0) { i_this->unk_318[5] = (l_bbHIO.unk_20 * (cM_rndF(30.0f) + 20.0f)); if (i_this->unk_33C > ((REG0_F(5) * 10.0f + 200.0f)) && i_this->unk_33C < (REG0_F(6) * 10.0f + 350.0f)) { i_this->unk_2F1 = 5; i_this->unk_318[0] = l_bbHIO.unk_32; anm_init(i_this, 0x1B, 2.0f, 2, l_bbHIO.unk_34, 0xB); tex_anm_set(i_this, 0); } } break; case 5: i_this->unk_2D0 = 2; x = cM_ssin(i_this->unk_354 * (REG0_S(2) + 1000)) * 200.0f; z = cM_scos(i_this->unk_354 * (REG0_S(4) + 1500)) * 200.0f; cLib_addCalc2(&a_this->current.pos.x, i_this->unk_2F4.x + x, 0.1f, i_this->unk_308 * 30.0f); cLib_addCalc2(&a_this->current.pos.y, player->current.pos.y + 175.0f, 0.1f, i_this->unk_308 * 30.0f); cLib_addCalc2(&a_this->current.pos.z, i_this->unk_2F4.z + z, 0.1f, i_this->unk_308 * 30.0f); cLib_addCalc2(&i_this->unk_308, l_bbHIO.unk_1C, 1.0f, l_bbHIO.unk_1C * 0.1f); cLib_addCalcAngleS2(&a_this->current.angle.y, i_this->unk_336, 5, i_this->unk_30C * 2048.0f); cLib_addCalc2(&i_this->unk_30C, 1.0f, 1.0f, 0.05f); if (i_this->unk_318[0] == 0) { i_this->unk_2F1 = 6; anm_init(i_this, 0x15, 2.0f, 0, l_bbHIO.unk_2C, 6); i_this->unk_2F4.x = player->current.pos.x; i_this->unk_2F4.y = player->current.pos.y + 100.0f; i_this->unk_2F4.z = player->current.pos.z; i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; i_this->unk_300 = REG0_F(7) + 15.0f; i_this->unk_304 = 5.0f; a_this->speedF = 0.0f; } break; case 6: { i_this->unk_2D0 = 2; i_this->unk_C60 = 0; s32 frame = i_this->mpMorf->getFrame(); if (frame == 0x12) { i_this->unk_300 = -10.0f; i_this->unk_304 = 5.0f; } i_this->unk_310 = 2000.0f; bb_pos_move(i_this); if (i_this->mpMorf->isStop()) { i_this->unk_2F1 = 4; anm_init(i_this, 0x1B, 3.0f, 2, l_bbHIO.unk_28, 11); i_this->unk_318[5] = l_bbHIO.unk_20 * (cM_rndF(30.0f) + 20.0f); i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; tex_anm_set(i_this, 3); } else if (frame < REG0_S(2) + 18) { r28 = 1; if (player->checkPlayerGuard() && i_this->mHeadAtSph.ChkAtHit()) { i_this->unk_326 = 10; fopAcM_seStart(a_this, JA_SE_LK_ROPE_HOOK_METAL, 0); cXyz scale; scale.x = scale.y = scale.z = 4.0f; dComIfGp_particle_set(dPa_name::ID_COMMON_PURPLE_HIT, &a_this->eyePos, NULL, &scale); i_this->unk_2F1 = 10; i_this->unk_318[0] = l_bbHIO.unk_30; anm_init(i_this, 0x1E, 0.0f, 0, l_bbHIO.unk_38, 14); i_this->unk_300 = REG0_F(7); i_this->unk_304 = 1.0f; a_this->speedF = -20.0f; r28 = 0; fopAcM_monsSeStart(a_this, JA_SE_CV_BB_DAMAGE, 0); tex_anm_set(i_this, 1); } } break; } case 10: case 11: i_this->unk_2D0 = 2; i_this->unk_C60 = 0; bb_pos_move(i_this); if (i_this->mpMorf->isStop() && (i_this->unk_2F1 == 10)) { i_this->unk_2F1 = 11; anm_init(i_this, 0x1D, 0.0f, 2, l_bbHIO.unk_3C, 13); } if ((i_this->unk_2F1 == 11) && ((i_this->unk_318[0] & 7) == 5)) { kuti_open(i_this, 0x12, JA_SE_CV_BB_FURAFURA); } if (i_this->unk_318[0] == 0) { i_this->unk_2F1 = 4; i_this->unk_318[5] = l_bbHIO.unk_20 * (cM_rndF(30.0f) + 20.0f); anm_init(i_this, 0x1B, 10.0f, 2, l_bbHIO.unk_28, 11); i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; tex_anm_set(i_this, 5); } cLib_addCalc2(&a_this->current.pos.y, i_this->mAcch.GetGroundH() + 50.0f, 0.05f, 5.0f); break; } if (i_this->unk_2D8 != 3) { x = i_this->unk_2F4.x - a_this->current.pos.x; y = i_this->unk_2F4.y - a_this->current.pos.y; z = i_this->unk_2F4.z - a_this->current.pos.z; if (std::sqrtf(x * x + y * y + z * z) > l_bbHIO.unk_7C || bb_player_bg_check(i_this) || bb_setpos_bg_check(i_this) || r29 != 0) { i_this->unk_2DD = i_this->unk_2D8; if (i_this->unk_2DA != 0xFF) { i_this->unk_35D = i_this->unk_2DA + 1; path_check(i_this); } if ((i_this->unk_2DD == 4) || (i_this->unk_2DD == 7)) { i_this->unk_2F1 = 10; anm_init(i_this, 0x18, 5.0f, 2, l_bbHIO.unk_24, 8); } else { i_this->unk_2F1 = 0; i_this->unk_318[0] = 0; i_this->unk_318[1] = 0; i_this->unk_2F0 = 1; anm_init(i_this, 0x19, REG0_F(0) + 12.0f, 2, 1.0f, 9); a_this->speedF = 0.0; i_this->unk_2F4.y = player->current.pos.y + 500.0f; i_this->unk_318[3] = cM_rndF(200.0f) + 300.0f; } i_this->unk_308 = 0.0f; } } if (r28 != 0) { i_this->mHeadAtSph.SetC(a_this->eyePos); dComIfG_Ccsp()->Set(&i_this->mHeadAtSph); if (daSea_ChkArea(a_this->eyePos.x, a_this->eyePos.z)) { f32 waveHeight = daSea_calcWave(a_this->eyePos.x, a_this->eyePos.z); if (a_this->eyePos.y < waveHeight && i_this->unk_358 >= waveHeight) { cXyz i_pos; i_pos = a_this->eyePos; i_pos.y = waveHeight; fopKyM_createWpillar(&i_pos, REG0_F(9) + 0.7f, REG0_F(10) + 0.7f, 0); fopAcM_seStart(a_this, JA_SE_OBJ_FALL_WATER_S, 0); } i_this->unk_358 = a_this->eyePos.y; } } else { i_this->mHeadAtSph.ClrAtHit(); } } /* 00005534-00005BB4 .text bb_wait_move__FP8bb_class */ void bb_wait_move(bb_class* i_this) { cXyz v; cXyz v2; s8 r30 = -1; f32 speedX = std::fabsf(i_this->actor.speed.x); if (speedX < 5.0f) { speedX = 5.0f; } f32 speedZ = std::fabsf(i_this->actor.speed.z); if (speedZ < 5.0f) { speedZ = 5.0f; } i_this->unk_C60 = 2; switch (i_this->unk_2F1) { case -1: i_this->unk_57C = 1; if (!i_this->mpMorf->isStop()) { break; } i_this->unk_2F1 = 0; case 0: anm_init(i_this, 0x21, 1.0f, 2, 1.0f, 0x11); i_this->unk_2F1 = 1; i_this->unk_318[0] = 100; case 1: i_this->unk_57C = 1; cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->actor.home.angle.y, 5, 0x300); cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, 0, 5, 0x800); cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x, 0.2f, speedX); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z, 0.2f, speedZ); i_this->actor.current.pos.y = i_this->actor.home.pos.y; if ((i_this->unk_318[0] == 0) && bb_player_view_check(i_this)) { i_this->unk_2F1 = 2; i_this->unk_318[0] = 0x1E; } break; case 2: i_this->unk_C60 = 1; if (i_this->unk_318[0] != 0) { break; } i_this->unk_2F1 = 3; anm_init(i_this, 0x18, 5.0f , 2, l_bbHIO.unk_24 * 1.5f, 8); i_this->unk_318[0] = REG0_S(0) + 70; case 3: i_this->unk_C60 = 1; cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->unk_336, 10, 0x200); v.x = 0.0f; v.y = REG0_F(0) * 10.0f + 300.0f; v.z = REG0_F(1) * 10.0f + 300.0f; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&v, &v2); cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x + v2.x, 0.1f, 10.0f); cLib_addCalc2(&i_this->actor.current.pos.y, i_this->actor.home.pos.y + v2.y, 0.1f, 10.0f); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z + v2.z, 0.1f, 10.0f); if (i_this->unk_318[0] == 0) { i_this->unk_2DD = 3; i_this->unk_2F1 = 0; } break; case 10: case 11: case 12: { r30 = 0; i_this->unk_C60 = 0; v.x = 0.0; v.y = 0.0; v.z = 0.0; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&v, &v2); f32 fVar2 = 80.0f; if (i_this->unk_2F1 == 10) { fVar2 = 300.0f; } i_this->unk_2F4.x = i_this->actor.home.pos.x + v2.x; i_this->unk_2F4.y = i_this->actor.home.pos.y + fVar2; i_this->unk_2F4.z = i_this->actor.home.pos.z + v2.z; i_this->unk_300 = 20.0f; i_this->unk_304 = 5.0f; i_this->unk_310 = 2000.0f; f32 x = i_this->unk_2F4.x - i_this->actor.current.pos.x; f32 y = i_this->unk_2F4.y - i_this->actor.current.pos.y; f32 z = i_this->unk_2F4.z - i_this->actor.current.pos.z; f32 sqrt = std::sqrtf(x * x + y * y + z * z); if (i_this->unk_2F1 == 10) { if (sqrt < 2000.0f) { i_this->unk_2F1 = 11; } } else if (i_this->unk_2F1 == 11) { if (sqrt < l_bbHIO.unk_50) { i_this->unk_2F1 = 12; anm_init(i_this, 0x1A, 10.0f, 0, 1.0f, 10); } } else if (i_this->unk_2F1 == 12 && sqrt < REG0_F(9) * 10.0f + 300.0f) { i_this->unk_2F1 = 20; anm_init(i_this, 0x1F, 5.0f, 2, l_bbHIO.unk_44, 15); i_this->unk_2F0 = 10; i_this->actor.speed.y = 0.0f; i_this->unk_354 = 0; r30 = -1; } break; } case 20: { i_this->unk_57C = 1; i_this->unk_C60 = 0; s16 old_354 = i_this->unk_354; i_this->unk_354++; cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x, 0.1f, speedX); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z, 0.1f, speedZ); i_this->actor.current.pos.y += i_this->actor.speed.y; if (old_354 > l_bbHIO.unk_40) { i_this->actor.speed.y -= REG0_F(7) + 0.8f; } cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->actor.home.angle.y, 5, 0x300); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, 0, 5, 0x800); if (i_this->actor.current.pos.y <= i_this->actor.home.pos.y) { i_this->actor.current.pos.y = i_this->actor.home.pos.y; i_this->actor.speed.y = -0.5; if (old_354 > l_bbHIO.unk_40) { anm_init(i_this, 0x20, 5.0f, 0, l_bbHIO.unk_48, 0x10); i_this->unk_2F1 = -1; } } break; } } switch (r30) { case 0: bb_pos_move(i_this); break; } } /* 00005BB4-00006234 .text bb_su_wait_move__FP8bb_class */ void bb_su_wait_move(bb_class* i_this) { cXyz v; cXyz v2; s8 r30 = -1; f32 speedX = std::fabsf(i_this->actor.speed.x); if (speedX < 5.0f) { speedX = 5.0f; } f32 speedZ = std::fabsf(i_this->actor.speed.z); if (speedZ < 5.0f) { speedZ = 5.0f; } i_this->unk_C60 = 2; switch (i_this->unk_2F1) { case -1: i_this->unk_57C = 1; if (!i_this->mpMorf->isStop()) { break; } i_this->unk_2F1 = 0; case 0: anm_init(i_this, 0x21, 1.0f, 2, 1.0f, 0x11); i_this->unk_2F1 = 1; i_this->unk_318[0] = 100; case 1: i_this->unk_57C = 1; cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->actor.home.angle.y, 5, 0x300); cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, 0, 5, 0x800); cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x, 0.2f, speedX); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z, 0.2f, speedZ); i_this->actor.current.pos.y = i_this->actor.home.pos.y; if ((i_this->unk_318[0] == 0) && bb_player_view_check(i_this)) { i_this->unk_2F1 = 2; i_this->unk_318[0] = 0x1E; } break; case 2: i_this->unk_C60 = 1; if (i_this->unk_318[0] != 0) { break; } i_this->unk_2F1 = 3; anm_init(i_this, 0x18, 5.0f , 2, l_bbHIO.unk_24 * 1.5f, 8); i_this->unk_318[0] = REG0_S(0) + 70; case 3: i_this->unk_C60 = 1; cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->unk_336, 10, 0x200); v.x = 0.0; v.y = REG0_F(0) * 10.0f + 300.0f; v.z = REG0_F(1) * 10.0f + 300.0f; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&v, &v2); cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x + v2.x, 0.1f, 10.0f); cLib_addCalc2(&i_this->actor.current.pos.y, i_this->actor.home.pos.y + v2.y, 0.1f, 10.0f); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z + v2.z, 0.1f, 10.0f); if (i_this->unk_318[0] == 0) { i_this->unk_2DD = 3; i_this->unk_2F1 = 0; } break; case 10: case 11: case 12: { r30 = 0; i_this->unk_C60 = 0; v.x = 0.0; v.y = 0.0; v.z = 0.0; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); MtxPosition(&v, &v2); f32 fVar2 = 80.0f; if (i_this->unk_2F1 == 10) { fVar2 = 300.0f; } i_this->unk_2F4.x = i_this->actor.home.pos.x + v2.x; i_this->unk_2F4.y = i_this->actor.home.pos.y + fVar2; i_this->unk_2F4.z = i_this->actor.home.pos.z + v2.z; i_this->unk_300 = 20.0f; i_this->unk_304 = 5.0f; i_this->unk_310 = 2000.0f; f32 x = i_this->unk_2F4.x - i_this->actor.current.pos.x; f32 y = i_this->unk_2F4.y - i_this->actor.current.pos.y; f32 z = i_this->unk_2F4.z - i_this->actor.current.pos.z; f32 sqrt = std::sqrtf(x * x + y * y + z * z); if (i_this->unk_2F1 == 10) { if (sqrt < 2000.0f) { i_this->unk_2F1 = 11; } } else if (i_this->unk_2F1 == 11) { if (sqrt < l_bbHIO.unk_50) { i_this->unk_2F1 = 12; anm_init(i_this, 0x1A, 10.0f, 0, 1.0f, 10); } } else if (i_this->unk_2F1 == 12 && sqrt < REG0_F(9) * 10.0f + 300.0f) { i_this->unk_2F1 = 20; anm_init(i_this, 0x1F, 5.0f, 2, l_bbHIO.unk_44, 15); i_this->unk_2F0 = 10; i_this->actor.speed.y = 0.0f; i_this->unk_354 = 0; r30 = -1; } break; } case 20: { i_this->unk_57C = 1; i_this->unk_C60 = 0; s16 old_354 = i_this->unk_354; i_this->unk_354++; cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x, 0.1f, speedX); cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z, 0.1f, speedZ); i_this->actor.current.pos.y += i_this->actor.speed.y; if (old_354 > l_bbHIO.unk_40) { i_this->actor.speed.y -= REG0_F(7) + 0.8f; } cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 5, 0x800); cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->actor.home.angle.y, 5, 0x300); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, 0, 5, 0x800); if (i_this->actor.current.pos.y <= i_this->actor.home.pos.y) { i_this->actor.current.pos.y = i_this->actor.home.pos.y; i_this->actor.speed.y = -0.5; if (old_354 > l_bbHIO.unk_40) { anm_init(i_this, 0x20, 5.0f, 0, l_bbHIO.unk_48, 0x10); i_this->unk_2F1 = -1; } } break; } } switch (r30) { case 0: bb_pos_move(i_this); break; } } /* 00006234-00006278 .text bb_fail_move__FP8bb_class */ void bb_fail_move(bb_class* i_this) { fopAcM_createDisappear(&i_this->actor, &i_this->actor.current.pos, 10, 0, i_this->actor.stealItemBitNo); fopAcM_delete(&i_this->actor); } #if VERSION == VERSION_DEMO void bb_key_move(bb_class* i_this) { f32 stickX = g_mDoCPd_cpadInfo[0].mMainStickPosX; f32 stickY = g_mDoCPd_cpadInfo[0].mMainStickPosY; switch (i_this->unk_2F0) { case 0: { s32 frame = i_this->mpMorf->getFrame(); i_this->unk_300 = 30.0f; i_this->unk_304 = 0.5f; if (!CPad_CHECK_HOLD_B(0) && frame == REG0_S(0) + 9) { i_this->unk_2F0 = 1; anm_init(i_this, 25, REG0_F(0) + 12.0f, 2, 1.0f, 9); } break; } case 1: if (CPad_CHECK_HOLD_X(0)) { i_this->unk_300 = 5.0f; i_this->unk_304 = 0.2f; } else { i_this->unk_300 = 20.0f; i_this->unk_304 = 0.1f; } if (CPad_CHECK_HOLD_B(0)) { i_this->unk_2F0 = 0; anm_init(i_this, 24, 5.0f, 2, l_bbHIO.unk_24, 8); fopAcM_monsSeStart(&i_this->actor, JA_SE_CV_BB_NORMAL, 0); } break; } s16 x = stickX * (REG0_F(10) + -5.0f) * 1000.0f; s16 y = stickY * (REG0_F(11) + 5.0f) * 1000.0f; s16 d; s16 c; s16 a; s16 b; if (std::fabsf(stickX) > 0.2f) { a = 0x200; b = 0x800; } else { a = 0x80; b = 0x80; } if (std::fabsf(stickY) > 0.2f) { c = 0x200; } else { c = 0x80; } if (y > 0 && i_this->mAcch.ChkGroundHit()) { y = 0; c = 0x800; d = 10; } else { d = 4; } cLib_addCalcAngleS2(&i_this->unk_368, x, 10, a); cLib_addCalcAngleS2(&i_this->unk_366, y, d, c); cLib_addCalc2(&i_this->unk_32C, stickX * (REG0_F(12) + -0.4f) * 1000.0f, 1.0f, 50.0f); i_this->actor.current.angle.y += (s16)i_this->unk_32C; cLib_addCalcAngleS2(&i_this->actor.current.angle.x, y, d, c); cLib_addCalcAngleS2(&i_this->actor.current.angle.z, -x, 5, b); cLib_addCalc2(&i_this->actor.speedF, i_this->unk_300, 1.0f, i_this->unk_304); cXyz v; v.x = 0.0f; v.y = 0.0f; v.z = i_this->actor.speedF; cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y); cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x); MtxPosition(&v, &i_this->actor.speed); i_this->actor.current.pos.x += i_this->actor.speed.x; i_this->actor.current.pos.y += i_this->actor.speed.y; i_this->actor.current.pos.z += i_this->actor.speed.z; } #endif /* 00006278-0000696C .text damage_check__FP8bb_class */ void damage_check(bb_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor; daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); cXyz scale; JPABaseEmitter* emitter; CcAtInfo sp30; i_this->mStts.Move(); if ((i_this->mBodyTgSph.ChkTgHit() || i_this->mHeadTgSph.ChkTgHit()) && i_this->unk_340 == 0) { i_this->unk_340 = 5; tex_anm_set(i_this, 2); if (i_this->mBodyTgSph.ChkTgHit()) { sp30.mpObj = i_this->mBodyTgSph.GetTgHitObj(); sp30.pParticlePos = i_this->mBodyTgSph.GetTgHitPosP(); } else if (i_this->mHeadTgSph.ChkTgHit()) { sp30.mpObj = i_this->mHeadTgSph.GetTgHitObj(); sp30.pParticlePos = i_this->mHeadTgSph.GetTgHitPosP(); } if (sp30.mpObj->GetAtType() & (AT_TYPE_LIGHT_ARROW | AT_TYPE_ICE_ARROW)) { if (sp30.mpObj->GetAtType() & AT_TYPE_ICE_ARROW) { i_this->mEnemyIce.mFreezeDuration = REG0_S(3) + 300; i_this->unk_2DD = 3; i_this->unk_2F1 = 0; anm_init(i_this, 0x16, 0.0f, 0, 1.0f, -1); } else { i_this->mEnemyIce.mLightShrinkTimer = 1; } enemy_fire_remove(&i_this->mEnemyFire); return; } if (sp30.mpObj->GetAtType() & (AT_TYPE_FIRE_ARROW | AT_TYPE_FIRE)) { i_this->mEnemyFire.mFireDuration = REG0_S(2) + 100; i_this->unk_340 = 50; } s8 old_health; old_health = a_this->health; at_power_check(&sp30); if (sp30.mResultingAttackType == 14) { a_this->health = 20; } sp30.mpActor = cc_at_check(a_this, &sp30); #if VERSION == VERSION_DEMO if (sp30.mResultingAttackType == 14) { a_this->health = old_health; } #else if (sp30.mResultingAttackType == 14) { a_this->health = old_health; dComIfGp_particle_set(dPa_name::ID_COMMON_STARS_BLOW, sp30.pParticlePos); } else if (a_this->health <= 0) { dComIfGp_particle_set(dPa_name::ID_COMMON_0010, sp30.pParticlePos); scale.x = 2.0f; scale.y = 2.0f; scale.z = 2.0f; dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, sp30.pParticlePos, &player->shape_angle, &scale); } else { dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, sp30.pParticlePos, &player->shape_angle); } #endif dKy_Sound_set(a_this->current.pos, 100, fpcM_GetID(i_this), 5); if (l_bbHIO.unk_04 != 0) { a_this->health = 10; } if (sp30.mbDead) { if (a_this->health <= 0) { i_this->unk_C7E = 1; i_this->unk_2F1 = 0; fopAcM_monsSeStart(a_this, JA_SE_CV_BB_FAINTED, 0); } else { fopAcM_monsSeStart(a_this, JA_SE_CV_BB_DAMAGE, 0); } i_this->unk_34C = REG0_F(13) * 100.0f + 5000.0f; } else { i_this->unk_C58 = REG0_F(9) * 200.0f + 10000.0f; i_this->unk_34C = REG0_F(13) * 100.0f + 3000.0f; fopAcM_monsSeStart(a_this, JA_SE_CV_BB_DAMAGE, 0); } dComIfGp_particle_setToon(dPa_name::ID_COMMON_0438, &a_this->current.pos, &a_this->current.angle, NULL, 0xFF, NULL, fopAcM_GetRoomNo(a_this), &a_this->tevStr.mColorK0, &a_this->tevStr.mColorK0); i_this->mParticleCallBack.end(); emitter = dComIfGp_particle_setToon(dPa_name::ID_COMMON_0439, &a_this->current.pos, &a_this->current.angle, NULL, 0xFF, &i_this->mParticleCallBack, fopAcM_GetRoomNo(a_this)); if (emitter != NULL) { if (sp30.mbDead) { emitter->setMaxFrame(REG0_S(7) + 20); } else { emitter->setMaxFrame(REG0_S(8) + 6); } emitter->setGlobalPrmColor(a_this->tevStr.mColorK0.r, a_this->tevStr.mColorK0.g, a_this->tevStr.mColorK0.b); emitter->setGlobalEnvColor(a_this->tevStr.mColorK0.r, a_this->tevStr.mColorK0.g, a_this->tevStr.mColorK0.b); } if (sp30.mResultingAttackType == 1) { i_this->unk_342 = i_this->unk_336; i_this->unk_344 = i_this->unk_338; } else { i_this->unk_342 = sp30.m0C.y; i_this->unk_344 = 0; } if (i_this->unk_2DD != 3) { i_this->unk_2DD = 3; i_this->unk_318[1] = l_bbHIO.unk_16 + cM_rndF(l_bbHIO.unk_18 - l_bbHIO.unk_16); i_this->unk_35D = 0; } if (sp30.mbDead) { i_this->unk_348 = l_bbHIO.unk_58; if (cM_rndF(1.0f) < 0.5f) { i_this->unk_350 = cM_rndF(3000.0f) + 5000.0f; } else { i_this->unk_350 = -(cM_rndF(3000.0f) + 5000.0f); } } else { i_this->unk_348 = l_bbHIO.unk_5C; i_this->unk_350 = 0; } i_this->unk_C7C = 1; anm_init(i_this, 0x16, 0.0f, 0, 1.0f, -1); } } /* 000069A8-00007778 .text daBb_Execute__FP8bb_class */ static BOOL daBb_Execute(bb_class* i_this) { s16 z; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp28; cXyz sp1C; cXyz sp10; i_this->mEnemyIce.m02C = REG0_F(5) + 50.0f; if (enemy_ice(&i_this->mEnemyIce)) { i_this->mpMorf->setPlayMode(J3DFrameCtrl::EMode_NONE); i_this->mpMorf->setPlaySpeed(3.0f); i_this->mpMorf->play(&i_this->actor.eyePos, 0, 0); MtxTrans(i_this->actor.current.pos.x, i_this->actor.current.pos.y, i_this->actor.current.pos.z, false); cMtx_YrotM(*calc_mtx, i_this->actor.current.angle.y + i_this->unk_368); cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x + i_this->unk_366); cMtx_ZrotM(*calc_mtx, i_this->actor.current.angle.z); J3DModel* model = i_this->mpMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); i_this->mpMorf->calc(); i_this->unk_AA8[0] = i_this->unk_BD4[1]; tail_control(i_this); return TRUE; } g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->actor.current.pos, &i_this->actor.tevStr); f32 xDiff = player->current.pos.x - i_this->actor.current.pos.x; f32 yDiff = (player->current.pos.y + 100.0f) - i_this->actor.current.pos.y; f32 zDiff = player->current.pos.z - i_this->actor.current.pos.z; i_this->unk_33C = std::sqrtf(SQUARE(xDiff) + SQUARE(zDiff)); i_this->unk_336 = cM_atan2s(xDiff, zDiff); i_this->unk_338 = -cM_atan2s(yDiff, i_this->unk_33C); i_this->unk_352++; if (i_this->unk_2F2 != 0) { if (dComIfGs_isSwitch(i_this->unk_2F2 - 1, fopAcM_GetRoomNo(&i_this->actor))) { i_this->unk_2F2 = 0; } else { return TRUE; } } i_this->actor.attention_info.flags = fopAc_Attn_LOCKON_BATTLE_e; fopAcM_OnStatus(&i_this->actor, fopAcStts_SHOWMAP_e); if (l_bbHIO.unk_05 == 0) { for (s32 i = 0; i < 6; i++) { if (i_this->unk_318[i] != 0) { i_this->unk_318[i]--; } } if (i_this->unk_326 != 0) { i_this->unk_326--; } if (i_this->unk_340 != 0) { i_this->unk_340--; } if (i_this->unk_348 > 0.01f) { sp28.x = 0.0f; sp28.y = 0.0f; sp28.z = -i_this->unk_348; cMtx_YrotS(*calc_mtx, i_this->unk_342); cMtx_XrotM(*calc_mtx, i_this->unk_344); MtxPosition(&sp28, &sp1C); i_this->actor.current.pos.x += sp1C.x; i_this->actor.current.pos.y += sp1C.y; i_this->actor.current.pos.z += sp1C.z; cLib_addCalc0(&i_this->unk_348, 1.0f, 2.0f); i_this->unk_308 = 0.0f; i_this->unk_30C = 0.0f; i_this->actor.current.angle.y += i_this->unk_350; cLib_addCalcAngleS2(&i_this->unk_350, 0, 1, 200); i_this->mpMorf->play(&i_this->actor.current.pos, 0, 0); } else { i_this->mpMorf->play(&i_this->actor.current.pos, 0, 0); if (i_this->unk_C7E != 0) { bb_fail_move(i_this); } else if (i_this->unk_35D != 0) { bb_path_move(i_this); #if VERSION == VERSION_DEMO } else if (i_this->unk_2DD == 1) { bb_key_move(i_this); #endif } else if (i_this->unk_2DD == 3) { bb_atack_move(i_this); } else if (i_this->unk_2DD == 4) { bb_wait_move(i_this); } else if (i_this->unk_2DD == 7) { bb_su_wait_move(i_this); } else { bb_auto_move(i_this); } } } MtxTrans(i_this->actor.current.pos.x, i_this->actor.current.pos.y + i_this->mEnemyIce.m028, i_this->actor.current.pos.z, false); s16 x = i_this->unk_C00[0].x / 2; z = i_this->unk_C00[0].z / 2; cMtx_YrotM(*calc_mtx, i_this->actor.current.angle.y + i_this->unk_368 + x); cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x + i_this->unk_366 + z); cMtx_ZrotM(*calc_mtx, i_this->actor.current.angle.z); J3DModel* model = i_this->mpMorf->getModel(); model->setBaseScale(i_this->actor.scale); model->setBaseTRMtx(*calc_mtx); i_this->mpMorf->calc(); i_this->unk_AA8[0].x = i_this->unk_BD4[1].x; i_this->unk_AA8[0].y = i_this->unk_BD4[1].y; i_this->unk_AA8[0].z = i_this->unk_BD4[1].z; tail_control(i_this); enemy_fire(&i_this->mEnemyFire); if (i_this->unk_2DF != 0) { switch (i_this->unk_2DF) { case 1: anm_init(i_this, 0x1C, 1.0f, 2, l_bbHIO.unk_4C, 0xC); i_this->unk_2DF = 2; break; case 2: { fopAc_ac_c* ac = fopAcM_SearchByID(i_this->unk_2E8); if (ac != NULL) { i_this->unk_2E4 = ac; i_this->unk_2DF = 3; } } break; case 3: { fopAc_ac_c* ac = i_this->unk_2E4; sp10.x = (i_this->unk_A6C[1].x - i_this->unk_A6C[0].x) / 2.0f + i_this->unk_A6C[0].x; sp10.y = (i_this->unk_A6C[1].y - i_this->unk_A6C[0].y) / 2.0f + i_this->unk_A6C[0].y; sp10.z = (i_this->unk_A6C[1].z - i_this->unk_A6C[0].z) / 2.0f + i_this->unk_A6C[0].z; ac->current.pos = sp10; ac->current.angle = i_this->actor.current.angle; ac->shape_angle = i_this->actor.current.angle; if (i_this->unk_2EC == PROC_MO2 || i_this->unk_2EC == PROC_BK) { damagereaction* dr; if (i_this->unk_2EC == PROC_MO2) { dr = &((mo2_class*)ac)->mDamageReaction; dr->m468 = REG0_F(8) * 10.0f + -110.0f; dr->m46C = REG0_F(9) * 10.0f + 10.0f; } else if (i_this->unk_2EC == PROC_BK) { dr = &((bk_class*)ac)->dr; dr->m468 = REG0_F(8) * 10.0f + -100.0f; dr->m46C = REG0_F(9) * 10.0f; } if (i_this->unk_2E0 != 0) { i_this->unk_2DF = 0; anm_init(i_this, 0x19, 12.0f, 2, 1.0f, 9); dr->mAction = 31; ac->speedF = 40.0f; } } } break; } } i_this->mHeadTgSph.SetC(i_this->actor.eyePos); i_this->mBodyTgSph.SetC(i_this->actor.current.pos); i_this->mBodyCoSph.SetC(i_this->actor.current.pos); dComIfG_Ccsp()->Set(&i_this->mHeadTgSph); dComIfG_Ccsp()->Set(&i_this->mBodyTgSph); dComIfG_Ccsp()->Set(&i_this->mBodyCoSph); if (i_this->unk_57C == 0) { i_this->actor.current.pos.y -= REG0_F(5) + 70.0f; i_this->actor.old.pos.y -= REG0_F(5) + 70.0f; i_this->mAcch.CrrPos(*dComIfG_Bgsp()); i_this->actor.current.pos.y += REG0_F(5) + 70.0f; i_this->actor.old.pos.y += REG0_F(5) + 70.0f; } i_this->unk_57C = 0; bb_water_check(i_this); for (s32 i = 0; i < 11; i++) { i_this->unk_C00[i].x = i_this->unk_C00[i].y = i_this->unk_C00[i].z = 0; } if (i_this->unk_34C > 0.1f) { f32 tmp = i_this->unk_34C; if (tmp > 4000.0f) { tmp = 4000.0f; } for (s32 i = 0; i < 11; i++) { i_this->unk_C00[i].x += tmp * cM_ssin(i_this->unk_352 * (REG0_S(0) + 6000) + (i * (REG0_S(1) + 13000))) * 1.0f; i_this->unk_C00[i].y += tmp * cM_ssin(i_this->unk_352 * (REG0_S(3) + 7000) + (i * (REG0_S(4) + 18000))) * 2.0f; i_this->unk_C00[i].z += tmp * cM_scos(i_this->unk_352 * (REG0_S(6) + 6500) + (i * (REG0_S(7) + 24000))) * 3.0f; } cLib_addCalc0(&i_this->unk_34C, 1.0f, REG0_F(16) * 10.0f + 120.0f); } s16 atan = cM_atan2s(player->current.pos.x - i_this->actor.eyePos.x, player->current.pos.z - i_this->actor.eyePos.z); cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y - atan); sp28.x = 0.0f; sp28.y = 0.0f; sp28.z = i_this->unk_C58; MtxPosition(&sp28, &sp1C); i_this->unk_C00[8].z += (s16)sp1C.z; i_this->unk_C00[9].z += (s16)sp1C.z; i_this->unk_C00[8].y += (s16)(sp1C.x * (REG0_F(10) + 1.0f)); i_this->unk_C00[9].y += (s16)(sp1C.x * (REG0_F(10) + 1.0f)); i_this->unk_C00[10].y += (s16)(sp1C.x * (REG0_F(10) + 1.0f)); cLib_addCalc0(&i_this->unk_C58, 0.1f, (REG0_F(12) + 400.0f) * 100.0f); damage_check(i_this); if (i_this->unk_C58 > 1.0f) { i_this->unk_C60 = 3; } s16 tmp2 = 0x800; if (i_this->unk_C60 != 0) { if (i_this->unk_C60 == 1) { i_this->unk_C5E = i_this->actor.current.angle.y - atan; if (i_this->unk_C5E > 0x3A98) { i_this->unk_C5E = 0x3A98; } else if (i_this->unk_C5E < -0x3A98) { i_this->unk_C5E = -0x3A98; } } else if (i_this->unk_C60 == 2) { if ((i_this->unk_352 & 0xF) == 0 && cM_rndF(1.0f) < 0.4f) { i_this->unk_C5E = cM_rndFX(15000.0f); tmp2 = 0x200; } if ((i_this->unk_352 & 0x3F) == 0 && cM_rndF(1.0f) < 0.5f) { kuti_open(i_this, 0x30, JA_SE_CV_BB_NORMAL); } } else if (i_this->unk_C60 == 3) { i_this->unk_C5E = i_this->unk_C58 * cM_ssin(i_this->unk_352 * (REG0_S(5) + 9000)) * 5.0f; tmp2 = 0x2000; } i_this->unk_C60 = 0; } else { i_this->unk_C5E = 0; } cLib_addCalcAngleS2(&i_this->unk_C5C, i_this->unk_C5E, 2, tmp2); i_this->unk_C00[10].x = (i_this->unk_C00[10].x - i_this->unk_C5C) / 2; i_this->unk_C00[9].x = (i_this->unk_C00[9].x - i_this->unk_C5C) / 2; tmp2 = 0; if (i_this->unk_C50 != 0) { i_this->unk_C50--; tmp2 = 0x2000; if (i_this->unk_C50 == i_this->unk_C52 && i_this->unk_C54 != 0) { fopAcM_monsSeStart(&i_this->actor, i_this->unk_C54, 0); } } cLib_addCalcAngleS2(&i_this->unk_C4E, tmp2, 3, 0x2000); s16 div = i_this->unk_C4E / 8; i_this->unk_C00[8].z += div; i_this->unk_C00[9].z += div; i_this->unk_C00[10].z += div; bb_eye_tex_anm(i_this); return TRUE; } /* 00007778-00007780 .text daBb_IsDelete__FP8bb_class */ static BOOL daBb_IsDelete(bb_class*) { return TRUE; } /* 00007780-000077EC .text daBb_Delete__FP8bb_class */ static BOOL daBb_Delete(bb_class* i_this) { dComIfG_resDelete(&i_this->mPhase, "Bb"); #if VERSION == VERSION_DEMO l_bbHIO.removeHIO(); #endif i_this->mParticleCallBack.end(); enemy_fire_remove(&i_this->mEnemyFire); #if VERSION > VERSION_DEMO if (i_this->actor.heap != NULL) { i_this->mpMorf->stopZelAnime(); } #endif return TRUE; } /* 000077EC-00007A68 .text useHeapInit__FP10fopAc_ac_c */ static BOOL useHeapInit(fopAc_ac_c* ac) { bb_class* i_this = (bb_class*)ac; i_this->mpMorf = new mDoExt_McaMorf( static_cast(dComIfG_getObjectRes("Bb", BB_BDL_BB)), NULL, NULL, static_cast(dComIfG_getObjectRes("Bb", BB_BCK_FLY02)), J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, dComIfG_getObjectRes("Bb", BB_BAS_FLY02), 0x80000, 0x37221203 ); if (i_this->mpMorf == NULL || i_this->mpMorf->getModel() == NULL) { return FALSE; } J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Bb", BB_BDL_BB_TAIL)); JUT_ASSERT(DEMO_SELECT(4508, 4535), modelData != NULL); for (s32 i = 0; i < 9; i++) { i_this->unk_A84[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x33221202); if (i_this->unk_A84[i] == NULL) { return FALSE; } } J3DAnmTexPattern* btp = static_cast(dComIfG_getObjectRes("Bb", bb_tex_anm_idx[4])); JUT_ASSERT(DEMO_SELECT(4529, 4556), btp); s32 ret = i_this->mBtpAnm.init(i_this->mpMorf->getModel()->getModelData(), btp, 0, 2, 1.0f, 0, -1, false, 0); if (ret == 0) { return FALSE; } return TRUE; } /* 00007A68-00007F58 .text daBb_Create__FP10fopAc_ac_c */ static cPhs_State daBb_Create(fopAc_ac_c* a_this) { static dCcD_SrcSph head_at_sph_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ AT_TYPE_UNK800, /* SrcObjAt Atp */ 1, /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e, /* SrcObjTg Type */ 0, /* SrcObjTg SPrm */ 0, /* SrcObjCo SPrm */ 0, /* SrcGObjAt Se */ dCcG_SE_UNK5, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ dCcG_AtSPrm_NoConHit_e, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ 0, /* SrcGObjCo SPrm */ 0, }, // cM3dGSphS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 62.5f, }}, }; static dCcD_SrcSph head_tg_sph_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 1, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_ALL & ~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 */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, #if VERSION == DEMO /* SrcGObjTg HitMark */ dCcG_SE_UNK1, #else /* SrcGObjTg HitMark */ 0, #endif /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, #if VERSION == DEMO /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e, #else /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e, #endif /* SrcGObjCo SPrm */ 0, }, // cM3dGSphS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 62.5f, }}, }; static dCcD_SrcSph body_tg_sph_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 1, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_ALL & ~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 */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, #if VERSION == DEMO /* SrcGObjTg HitMark */ dCcG_SE_UNK1, #else /* SrcGObjTg HitMark */ 0, #endif /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, #if VERSION == DEMO /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e, #else /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e, #endif /* SrcGObjCo SPrm */ 0, }, // cM3dGSphS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 62.5f, }}, }; static dCcD_SrcSph body_co_sph_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 1, /* 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 */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ 0, /* SrcGObjCo SPrm */ 0, }, // cM3dGSphS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 87.5f, }}, }; bb_class* i_this = (bb_class*)a_this; cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Bb"); fopAcM_SetupActor(a_this, bb_class); if (ret == cPhs_COMPLEATE_e) { i_this->unk_2D8 = (fopAcM_GetParam(i_this) >> 0) & 0xFF; i_this->unk_2DD = i_this->unk_2D8; i_this->unk_2D9 = (fopAcM_GetParam(i_this) >> 8) & 0xFF; i_this->unk_2DA = (fopAcM_GetParam(i_this) >> 16) & 0xFF; i_this->unk_2DB = (fopAcM_GetParam(i_this) >> 24) & 0xFF; i_this->unk_2DC = a_this->home.angle.z; a_this->current.angle.x = a_this->current.angle.z = 0; if (i_this->unk_2DC == 0xFF) { i_this->unk_2DC = 0; } if (dComIfGs_isEventBit(0x1101) && i_this->unk_2DC != 0 && dComIfGs_isSwitch(i_this->unk_2DC, fopAcM_GetRoomNo(a_this))) { return cPhs_ERROR_e; } if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x9FA0)) { return cPhs_ERROR_e; } tex_anm_set(i_this, 4); a_this->current.pos.y += REG0_F(5) + 70.0f; a_this->home.pos = a_this->current.pos; a_this->gbaName = 0x1A; a_this->itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Bb", 0); J3DModel* model = i_this->mpMorf->getModel(); for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) { if (callback_check_index[i] >= 0) { model->getModelData()->getJointTree().getJointNodePointer(i)->setCallBack(nodeCallBack); } } model->setUserArea(reinterpret_cast(i_this)); if (i_this->unk_2DA != 0xFF) { i_this->ppd = dPath_GetRoomPath(i_this->unk_2DA, fopAcM_GetRoomNo(a_this)); if (i_this->ppd == NULL) { return cPhs_ERROR_e; } i_this->unk_35D = i_this->unk_2DA + 1; i_this->unk_35F = 1; } if (i_this->unk_2DB != 0xFF) { i_this->unk_2F2 = i_this->unk_2DB + 1; } if (i_this->unk_2DD == 5 || i_this->unk_2DD == 6) { i_this->unk_2DF = 1; fopAcM_prm_class* ac = fopAcM_CreateAppend(); ac->base.position = a_this->current.pos; ac->base.angle = a_this->home.angle; ac->room_no = fopAcM_GetRoomNo(a_this); ac->base.parameters = (fopAcM_GetParam(i_this) & 0xFF000000) | 0xFFFF05; if (i_this->unk_2DD == 5) { i_this->unk_2E8 = fpcM_Create(PROC_MO2, NULL, ac); i_this->unk_2EC = PROC_MO2; } else { i_this->unk_2E8 = fpcM_Create(PROC_BK, NULL, ac); i_this->unk_2EC = PROC_BK; } } else if (i_this->unk_2D8 == 3) { i_this->unk_2DD = 3; } a_this->cullMtx = i_this->mpMorf->getModel()->getBaseTRMtx(); fopAcM_SetMin(a_this, -200.0f, -200.0f, -200.0f); fopAcM_SetMax(a_this, 200.0f, 200.0f, 200.0f); i_this->mAcch.Set(fopAcM_GetPosition_p(a_this), fopAcM_GetOldPosition_p(a_this), a_this, 1, &i_this->mAcchCir, fopAcM_GetSpeed_p(a_this)); i_this->mAcchCir.SetWall(50.0f, 120.0f); a_this->health = 2; a_this->max_health = 2; i_this->mStts.Init(100, 0xFF, a_this); i_this->mHeadAtSph.Set(head_at_sph_src); i_this->mHeadTgSph.Set(head_tg_sph_src); i_this->mBodyTgSph.Set(body_tg_sph_src); i_this->mBodyCoSph.Set(body_co_sph_src); i_this->mHeadAtSph.SetStts(&i_this->mStts); i_this->mHeadTgSph.SetStts(&i_this->mStts); i_this->mBodyTgSph.SetStts(&i_this->mStts); i_this->mBodyCoSph.SetStts(&i_this->mStts); i_this->unk_318[3] = cM_rndF(200.0f) + 300.0f; i_this->unk_352 = cM_rndF(10000.0f); i_this->mEnemyIce.mpActor = a_this; i_this->mEnemyIce.mWallRadius = REG0_F(4) + 50.0f; i_this->mEnemyIce.mCylHeight = REG0_F(5) + 80.0f; i_this->mEnemyIce.mParticleScale = 1.3f; i_this->mEnemyIce.mYOffset = -2.0f; i_this->mEnemyFire.mpMcaMorf = i_this->mpMorf; i_this->mEnemyFire.mpActor = a_this; static u8 fire_j[] = { 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x15, 0x1D, }; static f32 fire_sc[] = { 1.0f, 0.8f, 0.7f, 0.6f, 0.5f, 1.0f, 0.8f, 0.7f, 0.6f, 0.5f, }; for (s32 i = 0; i < 10; i++) { i_this->mEnemyFire.mFlameJntIdxs[i] = fire_j[i]; i_this->mEnemyFire.mParticleScale[i] = fire_sc[i]; } a_this->stealItemLeft = 3; daBb_Execute(i_this); #if VERSION == VERSION_DEMO l_bbHIO.entryHIO("カーゴ鳥"); #endif } return ret; } static actor_method_class l_daBb_Method = { (process_method_func)daBb_Create, (process_method_func)daBb_Delete, (process_method_func)daBb_Execute, (process_method_func)daBb_IsDelete, (process_method_func)daBb_Draw, }; actor_process_profile_definition g_profile_BB = { /* LayerID */ fpcLy_CURRENT_e, /* ListID */ 0x0007, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_BB, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(bb_class), /* SizeOther */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Priority */ PRIO_BB, /* Actor SubMtd */ &l_daBb_Method, /* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e | fopAcStts_UNK80000_e, /* Group */ fopAc_ENEMY_e, /* CullType */ fopAc_CULLBOX_CUSTOM_e, };