From b324f4b1fc0812aa8e6b1a878f910eff03dd8a60 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sun, 20 Jul 2025 03:39:35 +0100 Subject: [PATCH] d_a_bb (#810) * d_a_bb * PR --- configure.py | 2 +- include/d/actor/d_a_bb.h | 107 +- include/f_op/f_op_actor_mng.h | 2 +- include/m_Do/m_Do_ext.h | 2 +- src/d/actor/d_a_andsw0.cpp | 4 +- src/d/actor/d_a_bb.cpp | 2648 ++++++++++++++++++++++++++++++++- 6 files changed, 2694 insertions(+), 71 deletions(-) diff --git a/configure.py b/configure.py index 694de946d..04e34557f 100755 --- a/configure.py +++ b/configure.py @@ -1533,7 +1533,7 @@ config.libs = [ ActorRel(Matching, "d_a_acorn_leaf", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_atdoor"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_auction", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_bb"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_bb", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_bdk"), ActorRel(NonMatching, "d_a_bdkobj"), ActorRel(NonMatching, "d_a_bgn"), diff --git a/include/d/actor/d_a_bb.h b/include/d/actor/d_a_bb.h index 50d3f9633..5825e8afa 100644 --- a/include/d/actor/d_a_bb.h +++ b/include/d/actor/d_a_bb.h @@ -2,10 +2,109 @@ #define D_A_BB_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "SSystem/SComponent/c_phase.h" +#include "d/d_path.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_particle.h" +#include "c/c_damagereaction.h" -class bb_class : public fopAc_ac_c { -public: - /* Place member variables here */ -}; +struct bb_class { + /* 0x0000 */ fopEn_enemy_c actor; + /* 0x02AC */ request_of_phase_process_class mPhase; + /* 0x02B4 */ mDoExt_McaMorf* mpMorf; + /* 0x02B8 */ mDoExt_btpAnm mBtpAnm; + /* 0x02CC */ u8 unk_2CC; + /* 0x02CD */ u8 unk_2CD; + /* 0x02CE */ u8 unk_2CE; + /* 0x02D0 */ s16 unk_2D0; + /* 0x02D4 */ u32 unk_2D4; + /* 0x02D8 */ u8 unk_2D8; + /* 0x02D9 */ u8 unk_2D9; + /* 0x02DA */ u8 unk_2DA; + /* 0x02DB */ u8 unk_2DB; + /* 0x02DC */ u8 unk_2DC; + /* 0x02DD */ u8 unk_2DD; + /* 0x02DE */ char unk2DE[0x1]; + /* 0x02DF */ u8 unk_2DF; + /* 0x02E0 */ u8 unk_2E0; + /* 0x02E4 */ fopAc_ac_c* unk_2E4; + /* 0x02E8 */ fpc_ProcID unk_2E8; + /* 0x02EC */ s32 unk_2EC; + /* 0x02F0 */ s8 unk_2F0; + /* 0x02F1 */ s8 unk_2F1; + /* 0x02F2 */ u8 unk_2F2; + /* 0x02F4 */ cXyz unk_2F4; + /* 0x0300 */ f32 unk_300; + /* 0x0304 */ f32 unk_304; + /* 0x0308 */ f32 unk_308; + /* 0x030C */ f32 unk_30C; + /* 0x0310 */ f32 unk_310; + /* 0x0314 */ char unk314[0x4]; + /* 0x0318 */ s16 unk_318[6]; + /* 0x0324 */ s16 unk_324; + /* 0x0326 */ s16 unk_326; + /* 0x0328 */ f32 unk_328; + /* 0x032C */ f32 unk_32C; + /* 0x0330 */ fpc_ProcID unk_330; + /* 0x0334 */ char unk334[0x2]; + /* 0x0336 */ s16 unk_336; + /* 0x0338 */ s16 unk_338; + /* 0x033C */ f32 unk_33C; + /* 0x0340 */ s16 unk_340; + /* 0x0342 */ s16 unk_342; + /* 0x0344 */ s16 unk_344; + /* 0x0348 */ f32 unk_348; + /* 0x034C */ f32 unk_34C; + /* 0x0350 */ s16 unk_350; + /* 0x0352 */ s16 unk_352; + /* 0x0354 */ s16 unk_354; + /* 0x0358 */ f32 unk_358; + /* 0x035C */ char unk35C[0x1]; + /* 0x035D */ s8 unk_35D; + /* 0x035E */ s8 unk_35E; + /* 0x035F */ s8 unk_35F; + /* 0x0360 */ dPath* ppd; + /* 0x0364 */ u8 unk_364; + /* 0x0366 */ s16 unk_366; + /* 0x0364 */ s16 unk_368; + /* 0x036A */ char unk36A[0xE]; + /* 0x0378 */ dBgS_AcchCir mAcchCir; + /* 0x03B8 */ dBgS_ObjAcch mAcch; + /* 0x057C */ u8 unk_57C; + /* 0x0580 */ dCcD_Stts mStts; + /* 0x05BC */ dCcD_Sph mHeadAtSph; + /* 0x06E8 */ dCcD_Sph mHeadTgSph; + /* 0x0814 */ dCcD_Sph mBodyTgSph; + /* 0x0940 */ dCcD_Sph mBodyCoSph; + /* 0x0A6C */ cXyz unk_A6C[2]; + /* 0x0A84 */ J3DModel* unk_A84[9]; + /* 0x0AA8 */ cXyz unk_AA8[10]; + /* 0x0B20 */ csXyz unk_B20[10]; + /* 0x0B5C */ cXyz unk_B5C[10]; + /* 0x0BD4 */ cXyz unk_BD4[2]; + /* 0x0BEC */ s16 unk_BEC; + /* 0x0BEE */ s16 unk_BEE; + /* 0x0BF0 */ char unkBF0[0x4]; + /* 0x0BF0 */ cXyz unk_BF4; + /* 0x0C00 */ csXyz unk_C00[11]; + /* 0x0C42 */ csXyz unk_C42[2]; + /* 0x0C4E */ s16 unk_C4E; + /* 0x0C50 */ s16 unk_C50; + /* 0x0C52 */ s16 unk_C52; + /* 0x0C54 */ u32 unk_C54; + /* 0x0C58 */ f32 unk_C58; + /* 0x0C5C */ s16 unk_C5C; + /* 0x0C5E */ s16 unk_C5E; + /* 0x0C5C */ u8 unk_C60; + /* 0x0C16 */ char unkC61[0x7]; + /* 0x0C68 */ dPa_followEcallBack mParticleCallBack; + /* 0x0C7C */ s8 unk_C7C; + /* 0x0C7D */ char unkC7D[0x1]; + /* 0x0C7E */ u8 unk_C7E; + /* 0x0C80 */ enemyice mEnemyIce; + /* 0x1038 */ enemyfire mEnemyFire; +}; // size = 0x1260 #endif /* D_A_BB_H */ diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 89161fae2..4007c2295 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -40,7 +40,7 @@ struct fopAcM_prm_class { /* 0x1C */ fpc_ProcID parent_id; /* 0x20 */ s8 subtype; /* 0x21 */ s8 room_no; -}; +}; // size = 0x24 struct fopAcM_search4ev_prm { fopAcM_search4ev_prm() { clear(); } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index bc1bd2787..90d0120ca 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -143,7 +143,7 @@ private: /* 0x08 */ J3DAnmTexPattern* mpAnm; /* 0x0C */ J3DTexNoAnm* field_0xc; /* 0x10 */ u16 mUpdateMaterialNum; -}; +}; // size = 0x14 class mDoExt_blkAnm : public mDoExt_baseAnm { public: diff --git a/src/d/actor/d_a_andsw0.cpp b/src/d/actor/d_a_andsw0.cpp index 30ce003f9..e2e310d82 100644 --- a/src/d/actor/d_a_andsw0.cpp +++ b/src/d/actor/d_a_andsw0.cpp @@ -237,9 +237,9 @@ static void hajimarinomori_check(andsw0_class* i_this) { if (dComIfGs_isEventBit(4)) { bb_class* kargaroc = (bb_class*)ac[5]; - fopAcM_delete(kargaroc); + fopAcM_delete(&kargaroc->actor); kargaroc = (bb_class*)ac[6]; - fopAcM_delete(kargaroc); + fopAcM_delete(&kargaroc->actor); bk_class* bokoblin = (bk_class*)ac[3]; bokoblin->m121C = 1; diff --git a/src/d/actor/d_a_bb.cpp b/src/d/actor/d_a_bb.cpp index 28da97632..362b308a5 100644 --- a/src/d/actor/d_a_bb.cpp +++ b/src/d/actor/d_a_bb.cpp @@ -8,145 +8,2480 @@ #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" +#include "m_Do/m_Do_controller_pad.h" +#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*, int) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*, unsigned short) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*, int, float, unsigned char, float, int) { - /* Nonmatching */ +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*, void*) { - /* Nonmatching */ +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 */ -void search_esa(bb_class*) { - /* Nonmatching */ +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*, short, unsigned long) { - /* Nonmatching */ +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 */ -void bb_player_bg_check(bb_class*) { - /* Nonmatching */ +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 */ -void bb_setpos_bg_check(bb_class*) { - /* Nonmatching */ +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 */ -void bb_player_view_check(bb_class*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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(VERSION_SELECT(1476, 1479, 1479, 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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*, void*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +void bb_atack_move(bb_class* i_this) { + fopAc_ac_c* a_this = static_cast(&i_this->actor); + daPy_py_c* player = daPy_getPlayerActorClass(); + 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, &i_this->actor.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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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(xDiff * xDiff + zDiff * 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 */ @@ -155,18 +2490,62 @@ static BOOL daBb_IsDelete(bb_class*) { } /* 00007780-000077EC .text daBb_Delete__FP8bb_class */ -static BOOL daBb_Delete(bb_class*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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(VERSION_SELECT(4508, 4535, 4535, 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(VERSION_SELECT(4529, 4556, 4556, 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*) { - /* Nonmatching */ +static cPhs_State daBb_Create(fopAc_ac_c* a_this) { static dCcD_SrcSph head_at_sph_src = { // dCcD_SrcGObjInf { @@ -211,10 +2590,18 @@ static cPhs_State daBb_Create(fopAc_ac_c*) { /* 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 @@ -239,10 +2626,18 @@ static cPhs_State daBb_Create(fopAc_ac_c*) { /* 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 @@ -279,6 +2674,135 @@ static cPhs_State daBb_Create(fopAc_ac_c*) { /* 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 = {