diff --git a/configure.py b/configure.py index 74fc276a2..dc9a333d2 100755 --- a/configure.py +++ b/configure.py @@ -1468,7 +1468,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_kantera"), ActorRel(NonMatching, "d_a_kn"), ActorRel(NonMatching, "d_a_kokiie"), - ActorRel(NonMatching, "d_a_ks"), + ActorRel(NonMatching, "d_a_ks"), # code 100%, possible issue unique to this TU ActorRel(NonMatching, "d_a_kt"), # regalloc, weak func order ActorRel(NonMatching, "d_a_mflft"), ActorRel(NonMatching, "d_a_npc_cb1"), diff --git a/include/d/actor/d_a_gm.h b/include/d/actor/d_a_gm.h index f41284fa0..6b3d77c5a 100644 --- a/include/d/actor/d_a_gm.h +++ b/include/d/actor/d_a_gm.h @@ -7,7 +7,9 @@ class gm_class : public fopEn_enemy_c { public: /* 0x2AC */ u8 m2AC[0x2CD - 0x2AC]; /* 0x2CD */ u8 m2CD; - /* 0x2CE */ u8 m2CE[0x3D0 - 0x2CE]; + /* 0x2CE */ u8 m2CE[0x31E - 0x2CE]; + /* 0x31E */ s16 m31E; + /* 0x320 */ u8 m320[0x3D0 - 0x320]; /* 0x3D0 */ f32 z; /* 0x3D4 */ u8 m3D4[0x3DC - 0x3D4]; /* 0x3DC */ f32 m3DC; diff --git a/include/d/actor/d_a_ks.h b/include/d/actor/d_a_ks.h index d22c1f1df..135fd024d 100644 --- a/include/d/actor/d_a_ks.h +++ b/include/d/actor/d_a_ks.h @@ -2,13 +2,59 @@ #define D_A_KS_H #include "f_op/f_op_actor.h" -#include "SSystem/SComponent/c_bg_s_poly_info.h" +#include "c/c_damagereaction.h" + +class mDoExt_McaMorf; +class mDoExt_brkAnm; +class mDoExt_btkAnm; +class daPy_lk_c; class ks_class : public fopEn_enemy_c { public: - /* 0x2AC */ u8 m2AC[0x44C - 0x2AC]; - /* 0x44C */ cBgS_PolyInfo m44C; - /* 0x45C */ u8 m45C[0xC88 - 0x45C]; + /* 0x2AC */ request_of_phase_process_class mPhs; + /* 0x2B4 */ mDoExt_McaMorf* mpBodyMorf; + /* 0x2B8 */ mDoExt_McaMorf* mpEyeMorf; + /* 0x2BC */ mDoExt_btkAnm* mpEyeBtkAnm; + /* 0x2C0 */ mDoExt_brkAnm* mpBodyBrkAnm; + /* 0x2C4 */ mDoExt_brkAnm* mpEyeBrkAnm; + /* 0x2C8 */ u8 m2C8; + /* 0x2C9 */ u8 m2C9; + /* 0x2CA */ u8 m2CA; + /* 0x2CB */ u8 m2CB; + /* 0x2CC */ u8 m2CC; + /* 0x2CD */ u8 m2CD; + /* 0x2CE */ u8 m2CE; + /* 0x2CF */ u8 m2CF; + /* 0x2D0 */ u8 m2D0; + /* 0x2D1 */ u8 m2D1; + /* 0x2D2 */ u8 m2D2; + /* 0x2D3 */ u8 m2D3; + /* 0x2D4 */ fpc_ProcID mGmID; // Mothula + /* 0x2D8 */ fpc_ProcID mKsID; // Morth + /* 0x2DC */ cXyz m2DC; + /* 0x2E8 */ s16 m2E8[4]; + /* 0x2F0 */ s16 m2F0[5]; + /* 0x2FA */ s16 m2FA; + /* 0x2FC */ s16 m2FC; + /* 0x2FE */ s16 m2FE; + /* 0x300 */ s16 m300; + /* 0x302 */ s16 m302; + /* 0x304 */ f32 m304; + /* 0x308 */ f32 m308; + /* 0x30C */ f32 m30C; + /* 0x310 */ f32 m310; + /* 0x314 */ f32 m314; + /* 0x318 */ f32 m318; + /* 0x31C */ f32 m31C; + /* 0x320 */ f32 m320; + /* 0x324 */ dBgS_AcchCir mAcchCir; + /* 0x364 */ dBgS_ObjAcch mAcch; + /* 0x528 */ MtxP m528; + /* 0x52C */ dPa_rippleEcallBack m52C; + /* 0x540 */ dCcD_Stts mStts; + /* 0x57C */ dCcD_Sph mSph; + /* 0x6A8 */ enemyice mEnemyIce; + /* 0xA60 */ enemyfire mEnemyFire; }; #endif /* D_A_KS_H */ diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 1a44d128b..1c9b49822 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -184,7 +184,7 @@ enum { /* 0xB0 */ DSNAP_TYPE_UNKB0, /* 0xB1 */ DSNAP_TYPE_UNKB1, /* 0xB2 */ DSNAP_TYPE_UNKB2, - /* 0xB3 */ DSNAP_TYPE_UNKB3, + /* 0xB3 */ DSNAP_TYPE_KS, /* 0xB4 */ DSNAP_TYPE_UNKB4, /* 0xB5 */ DSNAP_TYPE_UNKB5, /* 0xB6 */ DSNAP_TYPE_AM2, diff --git a/src/d/actor/d_a_ks.cpp b/src/d/actor/d_a_ks.cpp index 81daf8f6c..ee4344784 100644 --- a/src/d/actor/d_a_ks.cpp +++ b/src/d/actor/d_a_ks.cpp @@ -5,125 +5,1614 @@ #include "d/actor/d_a_ks.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/d_s_play.h" +#include "f_op/f_op_camera.h" +#include "d/d_snap.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_gm.h" +#include "d/res/res_ks.h" + +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep +#include "weak_data_1811.h" // IWYU pragma: keep + +static int KS_ALL_COUNT = 0; +static int KUTTUKU_ALL_COUNT = 0; +static BOOL HEAVY_IN = FALSE; +static int GORON_COUNT = 0; /* 00000078-000002CC .text draw_SUB__FP8ks_class */ -void draw_SUB(ks_class*) { - /* Nonmatching */ +void draw_SUB(ks_class* i_this) { + J3DModel* pBodyModel = i_this->mpBodyMorf->getModel(); + J3DModel* pEyeModel = i_this->mpEyeMorf->getModel(); + + cXyz local_24 = dComIfGp_getCamera(0)->mLookat.mEye - i_this->current.pos; + + int iVar3 = cM_atan2s(local_24.x, local_24.z); + int iVar4 = (s16)-cM_atan2s(local_24.y, std::sqrtf(local_24.x * local_24.x + local_24.z * local_24.z)); + + f32 fVar1 = 0.0f; + if (i_this->m2D0) { + fVar1 = i_this->m304; + } + + mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y + fVar1, i_this->current.pos.z); + + mDoMtx_stack_c::YrotM(iVar3); + mDoMtx_stack_c::XrotM(iVar4); + mDoMtx_stack_c::ZrotM(i_this->shape_angle.z + i_this->m2FA); + + cXyz local_18; + local_18.setall(1.0f); + + i_this->m2FA += i_this->m2FE; + + mDoMtx_stack_c::scaleM(1.0f,1.0f,1.0f); + + mDoMtx_stack_c::ZrotM(i_this->shape_angle.z - i_this->m2FA); + + pBodyModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y + fVar1, i_this->current.pos.z); + + mDoMtx_stack_c::YrotM(i_this->shape_angle.y); + mDoMtx_stack_c::XrotM(i_this->shape_angle.x); + mDoMtx_stack_c::ZrotM(i_this->shape_angle.z); + + mDoMtx_stack_c::scaleM(local_18); + + pEyeModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + enemy_fire(&i_this->mEnemyFire); } /* 000002CC-00000568 .text daKS_Draw__FP8ks_class */ -static BOOL daKS_Draw(ks_class*) { - /* Nonmatching */ +static BOOL daKS_Draw(ks_class* i_this) { + cXyz local_24 = i_this->current.pos - dComIfGp_getCamera(0)->mLookat.mEye; + + if (local_24.abs() < REG0_F(10) + 100.0f) { + return TRUE; + } + + J3DModel* pBodyModel = i_this->mpBodyMorf->getModel(); + J3DModel* pEyeModel = i_this->mpEyeMorf->getModel(); + + cXyz local_18 = i_this->current.pos; + local_18.y += 40.0f; + + dSnap_RegistFig(DSNAP_TYPE_KS, i_this, 1.0f, 1.0f, 1.0f); + + if (i_this->m2C8 == 6) { + return TRUE; + } + + if (i_this->m2D0 == 0 && i_this->m2CD == 0) { + draw_SUB(i_this); + } + + i_this->m2CD = 0; + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr); + g_env_light.setLightTevColorType(pBodyModel, &i_this->tevStr); + + i_this->mpBodyBrkAnm->entry(pBodyModel->getModelData()); + i_this->mpBodyBrkAnm->setFrame(i_this->m320); + + i_this->mpBodyMorf->updateDL(); + + i_this->mpBodyBrkAnm->remove(pBodyModel->getModelData()); + + g_env_light.setLightTevColorType(pEyeModel, &i_this->tevStr); + + i_this->mpEyeBtkAnm->entry(pEyeModel->getModelData()); + i_this->mpEyeBtkAnm->setFrame(i_this->m302); + + i_this->mpEyeBrkAnm->entry(pEyeModel->getModelData()); + i_this->mpEyeBrkAnm->setFrame(i_this->m320); + + i_this->mpEyeMorf->updateDL(); + + i_this->mpEyeBrkAnm->remove(pEyeModel->getModelData()); + i_this->mpEyeBtkAnm->remove(pEyeModel->getModelData()); + + return TRUE; } /* 00000568-0000074C .text naraku_check__FP8ks_class */ -void naraku_check(ks_class*) { - /* Nonmatching */ +void naraku_check(ks_class* i_this) { + cXyz local_24; + cXyz local_18; + + if (i_this->mAcch.GetGroundH() != C_BG_MIN_HEIGHT && dComIfG_Bgsp()->ChkPolySafe(i_this->mAcch.m_gnd) && dComIfG_Bgsp()->GetGroundCode(i_this->mAcch.m_gnd) == 4) { + i_this->m2D3++; + + if (i_this->current.pos.y < -500.0f || i_this->m2D3 > 0x32) { + i_this->speedF = 0.0; + i_this->speed.setall(0.0f); + i_this->gravity = 0.0f; + + fopAcM_delete(i_this); + + return; + } + } + + if (i_this->mAcch.ChkWaterIn() && i_this->current.pos.y < i_this->mAcch.m_wtr.GetHeight() + 20.0f) { + if (!i_this->m2CF) { + local_24 = i_this->current.pos; + + i_this->m2CF = 1; + + local_18.setall(0.5f); + + i_this->m52C.remove(); + dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0033, &i_this->current.pos, NULL, &local_18, 0xFF, &i_this->m52C); + i_this->m52C.setRate(0.0f); + } + + cLib_addCalc2(&i_this->current.pos.y, i_this->mAcch.m_wtr.GetHeight() + 20.0f, 1.0f, 10.0); + + i_this->gravity = 0.0f; + i_this->speed.y = 0.0f; + } + else if (i_this->m2CF && (i_this->mAcch.ChkGroundHit() || i_this->current.pos.y > i_this->mAcch.m_wtr.GetHeight() + 100.0f)) { + i_this->m2CF = 0; + + i_this->m52C.remove(); + } } /* 0000074C-00000788 .text tyaku_check__FP8ks_class */ -void tyaku_check(ks_class*) { - /* Nonmatching */ +BOOL tyaku_check(ks_class* i_this) { + if (i_this->mAcch.ChkGroundHit()) { + return TRUE; + } + + if (i_this->mAcch.ChkWaterIn()) { + i_this->speed.y = 0.0f; + i_this->gravity = 0.0f; + return TRUE; + } + + return FALSE; } /* 00000788-0000087C .text ks_kuttuki_check__FP8ks_class */ -void ks_kuttuki_check(ks_class*) { - /* Nonmatching */ +BOOL ks_kuttuki_check(ks_class* i_this) { + fopAc_ac_c* mAtHitAc; + if (i_this->mSph.ChkAtHit() && !i_this->mSph.ChkAtShieldHit() && (mAtHitAc = i_this->mSph.GetAtHitAc(), mAtHitAc) && mAtHitAc == dComIfGp_getLinkPlayer() && KUTTUKU_ALL_COUNT >= 0 && KUTTUKU_ALL_COUNT < 0x14 && GORON_COUNT == 0) { + i_this->mSph.OffTgSetBit(); + i_this->mSph.ClrCoSet(); + i_this->mSph.ClrTgHit(); + + if (i_this->m2CF) { + i_this->m2CF = 0; + + i_this->m52C.remove(); + } + + i_this->m2CB = 4; + i_this->m2CC = 0x28; + + return TRUE; + } + else { + return FALSE; + } } /* 0000087C-000008F4 .text gm_birth_delet__FP8ks_class */ -void gm_birth_delet(ks_class*) { - /* Nonmatching */ +void gm_birth_delet(ks_class* i_this) { + if (i_this->mGmID) { + gm_class* i_gm = (gm_class*)fopAcM_SearchByID(i_this->mGmID); + if (i_gm && fopAc_IsActor(i_gm) && fopAcM_GetName(i_gm) == PROC_GM && i_gm->m31E > 0) { + i_gm->m31E--; + } + } } /* 000008F4-00000A98 .text shock_damage_check__FP8ks_class */ -void shock_damage_check(ks_class*) { - /* Nonmatching */ +BOOL shock_damage_check(ks_class* i_this) { + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + + if (link->checkHammerQuake()) { + cXyz mSwordTopPos = link->getSwordTopPos(); + + mSwordTopPos.x -= i_this->current.pos.x; + mSwordTopPos.y -= i_this->current.pos.y; + mSwordTopPos.z -= i_this->current.pos.z; + + float distXZ = std::sqrtf(mSwordTopPos.x * mSwordTopPos.x + mSwordTopPos.z * mSwordTopPos.z); + + if (distXZ < 200.0f) { + if (std::sqrtf(mSwordTopPos.y * mSwordTopPos.y) < 40.0f) { + i_this->m2CB = 3; + i_this->m2CC = 0x20; + + return TRUE; + } + } + } + return FALSE; } /* 00000A98-00000DE8 .text body_atari_check__FP8ks_class */ -void body_atari_check(ks_class*) { - /* Nonmatching */ +BOOL body_atari_check(ks_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + cXyz mTgHitPos; + cXyz mParticleScale; + + i_this->mStts.Move(); + + if (i_this->mSph.ChkTgHit()) { + daPy_py_c* mpCurPlayerActor = (daPy_py_c*)daPy_getPlayerActorClass(); + + cCcD_Obj* mTgHitObj = i_this->mSph.GetTgHitObj(); + + mTgHitPos = *i_this->mSph.GetTgHitPosP(); + + if (!mTgHitObj) { + return FALSE; + } + + a_this->current.angle.y = fopAcM_searchPlayerAngleY(a_this) + 0x8000; + + i_this->m2CB = 3; + + switch (mTgHitObj->GetAtType()) { + case AT_TYPE_WIND: { + a_this->current.angle.y = cM_atan2s(a_this->current.pos.x - mTgHitPos.x, a_this->current.pos.z - mTgHitPos.z); + + i_this->m2CB = 2; + i_this->m2CC = 20; + + return FALSE; + } + case AT_TYPE_UNK8: { + i_this->m2CC = 0x20; + + a_this->health = 0; + + i_this->m2CC = 30; + + return FALSE; + } + case AT_TYPE_SWORD: { + if (i_this->m2CC != 43 || i_this->m2CE) { + dScnPly_ply_c::setPauseTimer(2); + a_this->stealItemBitNo = 1; + } + + mParticleScale.setall(REG8_F(0) + 0.8f); + dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, &mTgHitPos, &mpCurPlayerActor->shape_angle, &mParticleScale); + + break; + } + case AT_TYPE_SKULL_HAMMER: { + if (mpCurPlayerActor->getCutType() == 0x12 || mpCurPlayerActor->getCutType() == 0x13) { + a_this->speedF = 0.0f; + a_this->gravity = 0.0f; + a_this->speed.setall(0.0f); + + a_this->health = 0; + + dScnPly_ply_c::setPauseTimer(2); + + a_this->stealItemBitNo = 1; + + i_this->m2CC = 0x20; + + return TRUE; + } + + break; + } + case AT_TYPE_FIRE: + case AT_TYPE_FIRE_ARROW: { + i_this->mEnemyFire.mFireDuration = 100; + + break; + } + case AT_TYPE_ICE_ARROW: { + i_this->mEnemyIce.mFreezeDuration = 200; + + i_this->m2D0 = 1; + + i_this->mEnemyIce.mParticleScale = 0.2f; + i_this->mEnemyIce.mYOffset = 0.0f; + + enemy_fire_remove(&i_this->mEnemyFire); + + break; + } + case AT_TYPE_LIGHT_ARROW: { + i_this->mEnemyIce.mLightShrinkTimer = 1; + i_this->mEnemyIce.mParticleScale = 0.2f; + i_this->mEnemyIce.mYOffset = 0.0f; + + i_this->m2D0 = 1; + + break; + } + default: { + mParticleScale.setall(REG8_F(0) + 0.8f); + dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, &mTgHitPos, &mpCurPlayerActor->shape_angle, &mParticleScale); + } + } + + a_this->health = 0; + + i_this->m2CC = 30; + + return TRUE; + } + else { + return shock_damage_check(i_this) ? 1 : 0; + } } /* 00000DE8-00000EBC .text speed_keisan__FP8ks_classs */ -void speed_keisan(ks_class*, short) { - /* Nonmatching */ +void speed_keisan(ks_class* i_this, short i_speed) { + cMtx_YrotS(*calc_mtx, i_speed); + + s16 sVar1 = i_this->m30C * cM_ssin(i_this->m2F0[0]); + + cXyz local_14; + local_14.x = sVar1; + local_14.y = 0.0f; + local_14.z = 0.0f; + + cXyz local_8; + MtxPosition(&local_14, &local_8); + + i_this->current.pos.x += local_8.x; + i_this->current.pos.z += local_8.z; } /* 00000EBC-00001314 .text action_dousa_move__FP8ks_class */ -void action_dousa_move(ks_class*) { - /* Nonmatching */ +void action_dousa_move(ks_class* i_this) { + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + + switch (i_this->m2CC) { + case 0: + i_this->m30C = 0.0f; + + i_this->gravity = -3.0f; + + for (int i = 0; i < 5; i++) { + i_this->m2F0[i] = 0; + } + + i_this->m2CC++; + case 1: + cLib_addCalcAngleS2(&i_this->shape_angle.z, 0, 1, 0x1000); + + if (fopAcM_searchActorDistance(i_this, dComIfGp_getPlayer(0)) > 10000.0f) { + break; + } + + if (i_this->shape_angle.z > 0x100) { + return; + } + + i_this->shape_angle.z = 0; + + fopAcM_seStart(i_this, JA_SE_CM_KS_MOVE, 0); + + if (tyaku_check(i_this) != 0) { + i_this->gravity = -3.0f; + + i_this->speed.y = 1.0f; + i_this->speed.y += cM_rndF(5.0f); + } + + i_this->current.angle.y = i_this->m2FC + fopAcM_searchPlayerAngleY(i_this); + + i_this->m2CC++; + case 2: + if (i_this->mAcch.ChkGroundHit()) { + i_this->current.angle.y = i_this->m2FC + fopAcM_searchPlayerAngleY(i_this); + } + + if (KUTTUKU_ALL_COUNT >= 0 && KUTTUKU_ALL_COUNT < 0x14 && + (link->getSpeedF() > 12.0f || HEAVY_IN) && + fopAcM_searchActorDistance(i_this, dComIfGp_getPlayer(0)) < 500.0f && + !dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e) && + tyaku_check(i_this)) { + + i_this->m2CB = 1; + i_this->m2CC = 10; + + return; + } + + if (link->getSpeedF() <= 12.0f || dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e)) { + cLib_addCalc0(&i_this->speedF, 0.3f, cM_rndF(1.0f) + 0.3f); + + cLib_addCalcAngleS2(&i_this->shape_angle.z, 0, 1, 0x1000); + + i_this->m2FC = 0; + break; + } + + if (i_this->m2FC == 0) { + i_this->m2FC = (fopAcM_GetID(i_this) & 0xf) * cM_rndFX(512.0f); + } + + i_this->shape_angle.z = cM_rndFX(2000.0f); + + speed_keisan(i_this, i_this->current.angle.y); + + i_this->speedF = 12.0f; + + i_this->m2F0[0] += 1000; + + i_this->m30C = 10.0f; + + if (tyaku_check(i_this)) { + fopAcM_seStart(i_this, JA_SE_CM_KS_MOVE, 0); + + i_this->gravity = -3.0f; + + i_this->speed.y = 1.0f; + i_this->speed.y += cM_rndF(5.0f); + } + break; + case 3: + if (fopAcM_searchActorDistance(i_this, dComIfGp_getPlayer(0)) < 500.0f) { + i_this->current.angle.y = fopAcM_searchPlayerAngleY(i_this); + } + } + + if (i_this->m2CC == 2 || i_this->m2CC == 3) { + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->current.angle.y, 1, 0x1000); + } + + if (body_atari_check(i_this) != 0) { + fopAcM_seStart(i_this, JA_SE_LK_LAST_HIT, 0); + } } /* 00001314-00001630 .text action_kougeki_move__FP8ks_class */ -void action_kougeki_move(ks_class*) { - /* Nonmatching */ +void action_kougeki_move(ks_class* i_this) { + cXyz head_top_pos = daPy_getPlayerActorClass()->getHeadTopPos(); + + i_this->m31C = 20.0f; + + if (head_top_pos.y > i_this->current.pos.y) { + i_this->m31C = 60.0f; + } + + switch (i_this->m2CC) { + case 0xa: { + i_this->mSph.OffCoSetBit(); + + i_this->speedF = 26.0f; + i_this->gravity = -4.0f; + i_this->speed.y = 28.0f; + + for (int i = 0; i < 5; i++) { + i_this->m2F0[i] = 0; + } + + i_this->m30C = 0.0f; + + i_this->current.angle.y = fopAcM_searchPlayerAngleY(i_this); + + mDoAud_seStart(JA_SE_CM_KS_ATTACK, &i_this->eyePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + + fopAcM_monsSeStart(i_this, JA_SE_CV_KS_ATTACK, 0); + + i_this->m2CC++; + + break; + } + case 0xb: { + if (i_this->speedF > 0.0f && i_this->m2F0[1] == 0 && i_this->mSph.ChkAtShieldHit()) { + i_this->gravity = -4.0f; + i_this->speed.y = 25.0f; + i_this->speedF *= -0.5f; + + i_this->m2F0[1] = 1; + } + + if (!i_this->m2F0[1] && ks_kuttuki_check(i_this)) { + return; + } + + if (!i_this->mAcch.ChkGroundHit() && !i_this->mAcch.ChkWaterIn()) { + break; + } + + i_this->mSph.OnCoSetBit(); + + i_this->m2E8[2] = (s16)(cM_rndF(20.0f) + 20.0f); + + i_this->m2CC++; + } + case 0xc: + ks_kuttuki_check(i_this); + + if (tyaku_check(i_this)) { + i_this->gravity = -4.0f; + i_this->speed.y = 1.0f; + i_this->speed.y += cM_rndF(5.0f); + i_this->speedF = 16.0f; + } + + if (i_this->m2E8[2] == 0) { + i_this->speedF = 0.0f; + i_this->m31C = 20.0f; + i_this->m2CB = 0; + i_this->m2CC = 0; + } + } + + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->current.angle.y, 1, 0x1000); + + if (body_atari_check(i_this)) { + fopAcM_seStart(i_this, JA_SE_LK_LAST_HIT, 0); + } } /* 00001630-00001874 .text action_kaze_move__FP8ks_class */ -void action_kaze_move(ks_class*) { - /* Nonmatching */ +void action_kaze_move(ks_class* i_this) { + switch (i_this->m2CC) { + case 0x14: { + for (int i = 0; i < 5; i++) { + i_this->m2F0[i] = 0; + } + + i_this->m2E8[1] = 0x32; + + fopAcM_monsSeStart(i_this, JA_SE_CV_KS_BLOW, 0); + + i_this->m310 = i_this->current.pos.y; + + i_this->m30C = 0.0f; + + i_this->speedF = cM_rndF(15.0f) + 10.0f; + i_this->m314 = cM_rndF(15.0f) + 10.0f; + + i_this->m308 = 0.0f; + + i_this->m2CC++; + } + case 0x15: { + cLib_addCalc2(&i_this->speed.y, i_this->m314, 0.8f, i_this->m308); + + cLib_addCalc2(&i_this->m308, 5.0f, 1.0f, 0.5f); + + if (i_this->m310 + 200.0f < i_this->current.pos.y || i_this->m2E8[1] == 0) { + i_this->m2CC++; + } + + break; + } + case 0x16: { + cLib_addCalc2(&i_this->gravity, -1.0f, 0.3f, 0.5f); + + if (i_this->speed.y < -2.0f) { + i_this->speed.y = -2.0f; + } + + cLib_addCalc0(&i_this->speedF, 0.5f, 2.0f); + + speed_keisan(i_this, i_this->shape_angle.y); + + i_this->m2F0[0] += 3000; + + i_this->m30C = 2.0f; + + if (tyaku_check(i_this)) { + i_this->m2CB = 0; + i_this->m2CC = 0; + return; + } + } + } + + i_this->shape_angle.z += 0x500; + + if (body_atari_check(i_this)) { + fopAcM_seStart(i_this, JA_SE_LK_LAST_HIT, 0); + } } +static u8 item_tbl[4] = {0xA, 0xB, 0xC, 0xA}; + /* 00001874-00001A14 .text dead_eff_set__FP8ks_classP4cXyz */ -void dead_eff_set(ks_class*, cXyz*) { - /* Nonmatching */ +void dead_eff_set(ks_class* i_this, cXyz* i_pos) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + u8 drop_type; + if (!strcmp(dComIfGp_getStartStageName(), "GanonK") && (i_this->stealItemBitNo != 0)) { + if (dComIfGs_getLife() <= 8) { + drop_type = daDisItem_HEART_e; + } + else if (cM_rndF(1.0f) < 0.5f) { + if (dComIfGs_getArrowNum() == 0) { + drop_type = daDisItem_ARROW_e; + } + else if (dComIfGs_getMagic() < dComIfGs_getMaxMagic() / 2) { + drop_type = daDisItem_MAGIC_e; + } + else if (dComIfGs_getArrowNum() < 10) { + drop_type = daDisItem_ARROW_e; + } + else { + drop_type = item_tbl[(int)cM_rndF(2.99f)]; + } + } + else { + drop_type = daDisItem_UNK13_e; // Might just be a void drop (ie. getting nothing) + } + + fopAcM_createDisappear(i_this, i_pos, 3, drop_type, 0xff); + } + else { + fopAcM_seStart(i_this, JA_SE_CM_KS_DIE, 0); + + dComIfGp_particle_setSimple(dPa_name::ID_SCENE_8068, i_pos); + + gm_birth_delet(i_this); + } + + fopAcM_delete(a_this); } /* 00001A14-00001C5C .text action_dead_move__FP8ks_class */ -void action_dead_move(ks_class*) { - /* Nonmatching */ +void action_dead_move(ks_class* i_this) { + cXyz local_28; + + switch (i_this->m2CC) { + case 0x1e: { + for (int i = 0; i < 5; i++) { + i_this->m2F0[i] = 0; + } + + i_this->mSph.OffTgSetBit(); + i_this->mSph.ClrCoSet(); + i_this->mSph.ClrTgHit(); + + fopAcM_monsSeStart(i_this, JA_SE_CV_KS_DAMAGE, 0); + + i_this->speedF = cM_rndF(5.0f) + 15.0f; + i_this->gravity = -3.0f; + i_this->speed.y = cM_rndF(5.0f) + 20.0f; + + i_this->m2CC++; + + i_this->m2F0[1] = (s16)cM_rndFX(4096.0f); + + i_this->mSph.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + i_this->mSph.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + } + case 0x1f: { + i_this->shape_angle.z += i_this->m2F0[1]; + + if (tyaku_check(i_this)) { + i_this->gravity = -3.0f; + i_this->speedF *= 0.5f; + + switch (i_this->m2F0[0]) { + case 0: + i_this->speed.y = 13.0f; + i_this->m2F0[0]++; + break; + case 1: + i_this->speed.y = 7.0f; + i_this->m2F0[0]++; + break; + case 2: + local_28 = i_this->current.pos; + local_28.y += 20.0f; + dead_eff_set(i_this, &local_28); + } + } + break; + } + case 0x20: { + local_28 = i_this->current.pos; + local_28.y += 45.0f; + dead_eff_set(i_this, &local_28); + } + } } +u32 pl_harituki_joint_dt[20] = { + 0x20, + 0x21, + 0x25, + 0x26, + 0x02, + 0x03, + 0x04, + 0x1E, + 0x29, + 0x1F, + 0x24, + 0x08, + 0x06, + 0x07, + 0x05, + 0x0C, + 0x0A, + 0x0B, + 0x09, + 0x0e, +}; + /* 00001C5C-000026DC .text action_omoi__FP8ks_class */ -void action_omoi(ks_class*) { - /* Nonmatching */ +void action_omoi(ks_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + cXyz local_1c; + cXyz local_10; + + daPy_py_c* mpCurPlayerActor = (daPy_py_c*)daPy_getPlayerActorClass(); + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + + if (i_this->m2CE == 1 && HEAVY_IN == TRUE) { + link->onHeavyState(); + } + + switch (i_this->m2CC) { + case 0x28: { + i_this->m52C.remove(); + + a_this->speedF = 0.0f; + a_this->gravity = 0.0f; + a_this->speed.setall(0.0f); + + if (GORON_COUNT != 0 || KUTTUKU_ALL_COUNT >= 0x14) { + i_this->m528 = 0; + + fopAcM_OffStatus(a_this, fopAcStts_UNK4000_e); + + i_this->m2CC = 0x2a; + + break; + } + + for (int i = 0; i < 5; i++) { + i_this->m2F0[i] = 0; + } + + if (KUTTUKU_ALL_COUNT >= 0x14) { + i_this->m300 = 0x13; + } + + if (KUTTUKU_ALL_COUNT < 0) { + i_this->m300 = 0; + } + else { + i_this->m300 = KUTTUKU_ALL_COUNT; + } + + i_this->m528 = link->getModelJointMtx(pl_harituki_joint_dt[i_this->m300]); + + if (KUTTUKU_ALL_COUNT == 0) { + GORON_COUNT = 0; + + i_this->m2CE = 1; + } + + KUTTUKU_ALL_COUNT++; + + if (HEAVY_IN == FALSE && KUTTUKU_ALL_COUNT >= 5) { + link->onHeavyState(); + HEAVY_IN = TRUE; + } + + i_this->m2D2 = 0; + + i_this->m2E8[1] = 0; + i_this->m2E8[2] = 0; + + fopAcM_OnStatus(a_this, fopAcStts_UNK4000_e); + + fopAcM_setStageLayer(a_this); + + i_this->m2CC++; + } + case 0x29: { + fopAcM_SetRoomNo(a_this, fopAcM_GetRoomNo(mpCurPlayerActor)); + + if (!(fopAcM_GetID(a_this) & 1)) { + a_this->shape_angle.y += i_this->m2FE * 0.25f; + } + else { + a_this->shape_angle.y -= i_this->m2FE * 0.25f; + } + + if (i_this->m528) { + local_10.x = i_this->m528[0][3]; + local_10.y = i_this->m528[1][3]; + local_10.z = i_this->m528[2][3]; + } + else { + local_10 = mpCurPlayerActor->current.pos; + } + + if (!(local_10.x || local_10.y || local_10.z)) { + local_10 = mpCurPlayerActor->current.pos; + } + + local_1c.x = std::fabsf(mpCurPlayerActor->speed.x * 10.0f); + if (local_1c.x < REG12_F(16) + 10.0f) { + local_1c.x = REG12_F(16) + 10.0f; + } + + local_1c.y = std::fabsf(mpCurPlayerActor->speed.y * 10.0f); + if (local_1c.y < REG12_F(16) + 10.0f) { + local_1c.y = REG12_F(16) + 10.0f; + } + + local_1c.z = std::fabsf(mpCurPlayerActor->speed.z * 10.0f); + if (local_1c.z < REG12_F(16) + 10.0f) { + local_1c.z = REG12_F(16) + 10.0f; + } + + if (std::sqrtf(mpCurPlayerActor->speed.x * mpCurPlayerActor->speed.x + mpCurPlayerActor->speed.y * mpCurPlayerActor->speed.y + mpCurPlayerActor->speed.z * mpCurPlayerActor->speed.z) < REG12_F(17) + 8.0f) { + local_1c.setall(REG12_F(18) + 8.0f); + + f32 x = a_this->current.pos.x - local_10.x; + f32 y = a_this->current.pos.y - local_10.y; + f32 z = a_this->current.pos.z - local_10.z; + + if (std::sqrtf(x * x + y * y + z * z) < 2.0f && i_this->m2E8[1] == 0) { + i_this->m2E8[1] = cM_rndF(10.0f) + 10.0f; + + switch (i_this->m2D2) { + case 0: { + if (i_this->m300 < 0x13) { + i_this->m300++; + } + else { + i_this->m2D2 = 1; + i_this->m300--; + } + break; + } + case 1: { + if (i_this->m300 > 0) { + i_this->m300--; + } + else { + i_this->m2D2 = 0; + i_this->m300++; + } + } + } + + if (i_this->m300 >= 0x14) { + i_this->m300 = 0x13; + } + else if (i_this->m300 < 0) { + i_this->m300 = 1; + } + + i_this->m528 = link->getModelJointMtx(pl_harituki_joint_dt[i_this->m300]); + } + } + + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK800000_e) || dComIfGp_checkPlayerStatus1(0, daPyStts1_UNK10_e)) { + local_1c.setall(100.0f); + } + + cLib_addCalc2(&a_this->current.pos.x, local_10.x, 1.0f, local_1c.x); + cLib_addCalc2(&a_this->current.pos.y, local_10.y, 1.0f, local_1c.y); + cLib_addCalc2(&a_this->current.pos.z, local_10.z, 1.0f, local_1c.z); + + if (link->checkFrontRollCrash() || link->getCutType() == 8 || link->getCutType() == 9 || dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e)) { + i_this->mSph.OnCoSetBit(); + i_this->mSph.OnTgSetBit(); + + if (i_this->m2CE) { + link->offHeavyState(); + HEAVY_IN = FALSE; + + KUTTUKU_ALL_COUNT = 0; + GORON_COUNT = 0; + + i_this->m2F0[0] = 0; + i_this->m2F0[1] = 0; + } + + i_this->m2CC = 0x2a; + + return; + } + + if (!link->checkFrontRoll()) { + if (i_this->m2CE == 0) { + return; + } + + if (i_this->m2F0[1]) { + i_this->m2F0[1] = 0; + i_this->m2E8[2] = 0x32; + } + + if (i_this->m2E8[2] != 1) { + return; + } + + if (i_this->m2F0[0] <= 0) { + return; + } + + i_this->m2F0[0] = 0; + + return; + } + + if (i_this->m2CE) { + if (i_this->m2F0[1]) { + return; + } + + switch (i_this->m2F0[0]) { + case 0: + GORON_COUNT = KUTTUKU_ALL_COUNT * 0.25f; + break; + case 1: + GORON_COUNT = KUTTUKU_ALL_COUNT * 0.5f; + break; + case 2: + GORON_COUNT = KUTTUKU_ALL_COUNT; + } + + if (GORON_COUNT == 0) { + GORON_COUNT = 1; + } + i_this->m2F0[0]++; + i_this->m2F0[1] = 1; + + if (i_this->m2F0[0] < 3 && KUTTUKU_ALL_COUNT >= 3) { + return; + } + + i_this->m2CE = 0; + + link->offHeavyState(); + HEAVY_IN = FALSE; + + i_this->m2F0[0] = 0; + i_this->m2F0[1] = 0; + + if (KUTTUKU_ALL_COUNT > 0) { + KUTTUKU_ALL_COUNT--; + } + + GORON_COUNT = KUTTUKU_ALL_COUNT; + + i_this->m2CC = 0x2a; + + return; + } + + if (KUTTUKU_ALL_COUNT != 0 && GORON_COUNT > 0) { + GORON_COUNT--; + KUTTUKU_ALL_COUNT--; + + if (HEAVY_IN && KUTTUKU_ALL_COUNT < 5) { + HEAVY_IN = FALSE; + link->offHeavyState(); + } + + i_this->m2CC = 0x2a; + } + + break; + } + case 0x2a: { + if (i_this->m528) { + fopAcM_OffStatus(a_this, fopAcStts_UNK4000_e); + + fopAcM_setRoomLayer(a_this, fopAcM_GetRoomNo(a_this)); + + i_this->m528 = 0; + } + + i_this->current.angle.y = fopAcM_searchPlayerAngleY(a_this) + 0x8000; + i_this->current.angle.y += (s16)cM_rndFX(16384.0f); + + i_this->speedF = 15.0f; + i_this->gravity = -3.0f; + i_this->speed.y = 26.0f; + + i_this->m2CC++; + } + case 0x2b: { + if (i_this->mAcch.ChkGroundHit() || i_this->mAcch.ChkWaterIn()) { + i_this->m2E8[2] = (s16)(cM_rndF(40.0f) + 40.0f); + + i_this->mSph.OnCoSetBit(); + i_this->mSph.OnTgSetBit(); + + i_this->m2CB = 1; + i_this->m2CC = 0xc; + } + } + } + + if (i_this->m2CC == 0x2b && body_atari_check(i_this) && i_this->m2CE) { + fopAcM_seStart(a_this, JA_SE_LK_LAST_HIT, 0); + i_this->m2CE = 0; + } } /* 000026DC-000027A0 .text tsubo_search__FPvPv */ -void tsubo_search(void*, void*) { - /* Nonmatching */ +BOOL tsubo_search(void* param_1, void* param_2) { + ks_class* i_ks1 = (ks_class*)param_1; + ks_class* i_ks2 = (ks_class*)param_2; + + if (fopAc_IsActor(i_ks1) && (fopAcM_GetName(i_ks1) == 0x1cb) && + std::fabsf(i_ks1->current.pos.x - i_ks2->current.pos.x) < 20.0f && + std::fabsf(i_ks1->current.pos.y - i_ks2->current.pos.y) < 20.0f && + std::fabsf(i_ks1->current.pos.z - i_ks2->current.pos.z) < 20.0f) { + i_ks2->mKsID = fopAcM_GetID(i_ks1); + } + return FALSE; } /* 000027A0-00002A40 .text action_tubo_search__FP8ks_class */ -void action_tubo_search(ks_class*) { - /* Nonmatching */ +void action_tubo_search(ks_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + switch (i_this->m2CC) { + case 0x32: { + i_this->mKsID = fpcM_ERROR_PROCESS_ID_e; + + fpcEx_Search((fpcLyIt_JudgeFunc)tsubo_search, a_this); + + if (i_this->mKsID == fpcM_ERROR_PROCESS_ID_e) { + fopAcM_delete(a_this); + } + else { + i_this->m2CC++; + } + + break; + } + case 0x33: { + fopAc_ac_c* mpCurrActor = (fopAc_ac_c*)fopAcM_SearchByID(i_this->mKsID); + + if (mpCurrActor) { + a_this->current.pos = mpCurrActor->current.pos; + + if (!i_this->m318) { + return; + } + + if (fopAcM_searchActorDistance(a_this, daPy_getPlayerActorClass()) > i_this->m318) { + return; + } + } + + i_this->m31C = 100.0f; + + i_this->mSph.OffAtNoTgHitInfSet(); + + i_this->mSph.OnAtVsBitSet(cCcD_AtSPrm_VsOther_e); + + i_this->mSph.OffAtVsBitSet(cCcD_AtSPrm_VsPlayer_e); + i_this->mSph.OffAtVsBitSet(cCcD_AtSPrm_NoTgHitInfSet_e); + + i_this->mSph.OnAtSPrmBit(cCcD_AtSPrm_Set_e); + + i_this->mSph.OnAtHitBit(); + + i_this->mSph.SetC(i_this->current.pos); + i_this->mSph.SetR(i_this->m31C); + + dComIfG_Ccsp()->Set(&i_this->mSph); + + i_this->m2CC++; + + break; + } + case 0x34: { + i_this->mSph.SetC(a_this->current.pos); + i_this->mSph.SetR(i_this->m31C); + + dComIfG_Ccsp()->Set(&i_this->mSph); + + if (i_this->m2C9 > 0x15 || i_this->m2C9 == 0) { + i_this->m2C9 = 1; + } + + for (int i = 0; i < i_this->m2C9; i++) { + cXyz local_24 = a_this->current.pos; + local_24.y += cM_rndF(40.0f); + + if (i != 0) { + local_24.x += cM_rndFX(40.0f); + local_24.z += cM_rndFX(40.0f); + } + + a_this->shape_angle = a_this->current.angle; + a_this->shape_angle.x = 0; + + fopAcM_create(PROC_KS, 3, &local_24, fopAcM_GetRoomNo(a_this), &a_this->shape_angle, &a_this->scale, 0); + } + + fopAcM_delete(a_this); + } + } } /* 00002A40-00002BC4 .text action_kb_birth_check__FP8ks_class */ -void action_kb_birth_check(ks_class*) { - /* Nonmatching */ +void action_kb_birth_check(ks_class* i_this) { + switch (i_this->m2CC) { + case 0x3c: { + i_this->current.pos.y += REG8_F(13) + 30.0f; + i_this->current.angle.y = cM_rndFX(32767.0f); + + i_this->speedF = REG8_F(8) + 4.0f + cM_rndF(REG8_F(9) + 4.0f); + i_this->speed.y = REG8_F(10) + 20.0f + cM_rndF(REG8_F(11) + 5.0f); + i_this->gravity = -(REG8_F(12) + 2.0f); + + i_this->m2CC++; + } + case 0x3d: { + if (i_this->speed.y <= 0.0f && (i_this->mAcch.ChkGroundHit() || i_this->mAcch.GetGroundH() + (REG8_F(19) + 10.0f) > i_this->current.pos.y )) { + fopAcM_OffStatus(i_this, fopAcStts_UNK4000_e); + + i_this->speedF = 0.0f; + i_this->gravity = 0.0f; + i_this->speed.setall(0.0f); + + i_this->m2CB = 0; + i_this->m2CC = 0; + } + } + } } /* 00002BC4-00002C54 .text BG_check__FP8ks_class */ -void BG_check(ks_class*) { - /* Nonmatching */ +void BG_check(ks_class* i_this) { + i_this->mAcchCir.SetWall(30.0f, 30.0f); + + i_this->current.pos.y -= i_this->m304; + i_this->old.pos.y -= i_this->m304; + + i_this->mAcch.CrrPos(*dComIfG_Bgsp()); + + i_this->current.pos.y += i_this->m304; + i_this->old.pos.y += i_this->m304; } /* 00002C54-00003054 .text daKS_Execute__FP8ks_class */ -static BOOL daKS_Execute(ks_class*) { - /* Nonmatching */ +static BOOL daKS_Execute(ks_class* i_this) { + if (enemy_ice(&i_this->mEnemyIce)) { + i_this->mpBodyMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + i_this->mpEyeMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + if (i_this->m2D0 && (i_this->m320++, i_this->m320 > 7.0f)) { + i_this->m320 = 7.0f; + } + return TRUE; + } + + for (int i = 0; i < 4; i++) { + if (i_this->m2E8[i]) { + i_this->m2E8[i]--; + } + } + + if (i_this->mGmID != 0 && i_this->m2CB != 3) { + fopAc_ac_c* mpGmActor = fopAcM_SearchByID(i_this->mGmID); + + bool bVar5 = false; + + if (mpGmActor && ((fopAcM_GetParam(mpGmActor) & 0xff0000) == 0xff0000 || (fopAcM_GetParam(mpGmActor) & 0xff0000) == 0)) { + if (fopAcM_GetName(mpGmActor) == PROC_GM) { + if (mpGmActor->health <= 0) { + bVar5 = true; + } + } + else { + bVar5 = true; + } + + if (bVar5) { + if (i_this->m2CB != 4) { + i_this->m2CB = 3; + i_this->m2CC = 30; + } + else { + if (i_this->m2CC != 43) { + daPy_py_c* link = (daPy_py_c*)daPy_getPlayerLinkActorClass(); + link->offHeavyState(); + + HEAVY_IN = FALSE; + GORON_COUNT = 0; + + i_this->m2F0[0] = 0; + i_this->m2F0[1] = 0; + + i_this->m2CC = 0x2a; + } + } + } + } + } + + switch(i_this->m2CB) { + case 0: + action_dousa_move(i_this); + ks_kuttuki_check(i_this); + break; + case 1: + action_kougeki_move(i_this); + break; + case 2: + action_kaze_move(i_this); + break; + case 3: + action_dead_move(i_this); + break; + case 4: + action_omoi(i_this); + break; + case 10: + action_tubo_search(i_this); + break; + case 20: + action_kb_birth_check(i_this); + break; + } + + if (i_this->m2C8 == 6) { + return TRUE; + } + + if (i_this->m302 && (i_this->m302++, i_this->m302 > 7)) { + i_this->m302 = 0; + } + + if (i_this->m2E8[0] == 0) { + i_this->m2E8[0] = cM_rndFX(25.0f) + 50.0f; + + i_this->m302 = 1; + } + + cMtx_YrotS(*calc_mtx, i_this->current.angle.y); + + cXyz local_18; + local_18.x = 0.0f; + local_18.y = 0.0f; + local_18.z = i_this->speedF; + + cXyz local_c; + MtxPosition(&local_18, &local_c); + + i_this->speed.x = local_c.x; + i_this->speed.z = local_c.z; + + if (i_this->m2CC != 41 && !i_this->mAcch.ChkGroundHit() && !i_this->mAcch.ChkWaterIn()) { + i_this->speed.y += i_this->gravity; + + if (i_this->speed.y < -20.0f) { + i_this->speed.y = -20.0f; + } + } + + i_this->eyePos = i_this->current.pos; + + i_this->attention_info.position = i_this->eyePos; + + i_this->mSph.SetC(i_this->current.pos); + i_this->mSph.SetR(i_this->m31C); + + dComIfG_Ccsp()->Set(&i_this->mSph); + + if (i_this->mSph.ChkCoSet() && (i_this->m2CB == 0 || i_this->m2CB == 2)) { + fopAcM_posMove(i_this, i_this->mStts.GetCCMoveP()); + } + else { + fopAcM_posMove(i_this, NULL); + } + + if (i_this->m2CC != 41) { + BG_check(i_this); + naraku_check(i_this); + } + + draw_SUB(i_this); + + i_this->m2CD = 1; + + return TRUE; } /* 00003054-0000305C .text daKS_IsDelete__FP8ks_class */ -static BOOL daKS_IsDelete(ks_class*) { - /* Nonmatching */ +static BOOL daKS_IsDelete(ks_class* i_this) { + return TRUE; } /* 0000305C-000030F4 .text daKS_Delete__FP8ks_class */ -static BOOL daKS_Delete(ks_class*) { - /* Nonmatching */ +static BOOL daKS_Delete(ks_class* i_this) { + dComIfG_resDelete(&i_this->mPhs, "KS"); + + i_this->m52C.remove(); + + enemy_fire_remove(&i_this->mEnemyFire); + + KS_ALL_COUNT--; + if (KS_ALL_COUNT == 0) { + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + link->offHeavyState(); + + KUTTUKU_ALL_COUNT = 0; + HEAVY_IN = FALSE; + GORON_COUNT = 0; + } + + return TRUE; } /* 000030F4-000034B0 .text useHeapInit__FP10fopAc_ac_c */ -static BOOL useHeapInit(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL useHeapInit(fopAc_ac_c* i_act) { + J3DModel* mpBodyModel; + J3DModel* mpEyeModel; + + ks_class* i_this = (ks_class*)i_act; + + i_this->mpBodyMorf = new mDoExt_McaMorf((J3DModelData *)dComIfG_getObjectRes("KS", KS_BDL_KS_BODY), NULL, NULL, NULL, + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 0, NULL, 0, 0x11020203); + if (i_this->mpBodyMorf == NULL || i_this->mpBodyMorf->getModel() == NULL) + return FALSE; + mpBodyModel = i_this->mpBodyMorf->getModel(); + + i_this->mpBodyBrkAnm = new mDoExt_brkAnm(); + if (i_this->mpBodyBrkAnm == NULL) + return FALSE; + + if (i_this->mpBodyBrkAnm->init(mpBodyModel->getModelData(), (J3DAnmTevRegKey *)dComIfG_getObjectRes("KS", KS_BRK_KS_BODY), TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, FALSE, 0) == 0) + return FALSE; + + + i_this->mpEyeMorf = new mDoExt_McaMorf((J3DModelData *)dComIfG_getObjectRes("KS", KS_BDL_KS_EYE), NULL, NULL, + (J3DAnmTransformKey *)dComIfG_getObjectRes("KS", KS_BCK_MABATAKI), + J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, 1, NULL, 0, 0x11020203); + + if (i_this->mpEyeMorf == NULL || i_this->mpEyeMorf->getModel() == NULL) + return FALSE; + mpEyeModel = i_this->mpEyeMorf->getModel(); + + i_this->mpEyeBtkAnm = new mDoExt_btkAnm(); + if (i_this->mpEyeBtkAnm == NULL) + return FALSE; + + if (i_this->mpEyeBtkAnm->init(mpEyeModel->getModelData(), (J3DAnmTextureSRTKey *)dComIfG_getObjectRes("KS", KS_BTK_KS_EYE), TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, FALSE, 0) == 0) + return FALSE; + + i_this->mpEyeBrkAnm = new mDoExt_brkAnm(); + if (i_this->mpEyeBrkAnm == NULL) + return FALSE; + + if (i_this->mpEyeBrkAnm->init(mpEyeModel->getModelData(), (J3DAnmTevRegKey *)dComIfG_getObjectRes("KS", KS_BRK_KS_EYE), TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, FALSE, 0) == 0) { + return FALSE; + } + return TRUE; } +static dCcD_SrcSph body_co_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_STALFOS_MACE, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e | cCcD_AtSPrm_NoTgHitInfSet_e, + /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsPlayer_e | cCcD_CoSPrm_VsOther_e, + /* SrcGObjAt Se */ dCcG_SE_UNK6, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 15.0f, + }, +}; + +static s8 fire_j[10] = { + 0, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + +}; + +static f32 fire_sc[10] = { + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, +}; + /* 000034F8-00003A94 .text daKS_Create__FP10fopAc_ac_c */ -static cPhs_State daKS_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daKS_Create(fopAc_ac_c* i_this) { + fopAcM_SetupActor(i_this, ks_class); + ks_class* a_this = (ks_class*)i_this; + + cPhs_State res; + u32 parameters; + res = dComIfG_resLoad(&a_this->mPhs, "KS"); + if (res == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x1060)) { + return cPhs_ERROR_e; + } + + a_this->m2C8 = fopAcM_GetParam(i_this); + a_this->m2C9 = fopAcM_GetParam(i_this) >> 8; + a_this->m2CA = fopAcM_GetParam(i_this) >> 0x10; + + if (a_this->m2C8 == 0xff) { + a_this->m2C8 = 0; + } + + if (a_this->m2C8 <= 1 && (a_this->m2C9 > 0x15 || a_this->m2C9 == 0)) { + a_this->m2C9 = 1; + } + + if (a_this->m2CA == 0xff) { + a_this->m2CA = 0; + } + + a_this->m318 = a_this->m2CA * 10.0f; + + if (a_this->m2C8 <= 1) { + parameters = 2; + if (a_this->m2C8 == 0) { + parameters = 3; + } + + for (int i = 0; i < a_this->m2C9; i++) { + cXyz local_4c = i_this->current.pos; + if (i != 0) { + if (i_this->current.angle.x != 0) { + local_4c.y += cM_rndFX(120.0f); + f32 ground_y = a_this->mAcch.GetGroundH(); + if (local_4c.y < ground_y) { + local_4c.y = ground_y + cM_rndF(120.0f); + } + } + else { + local_4c.x += cM_rndFX(40.0f); + local_4c.z += cM_rndFX(40.0f); + } + } + i_this->shape_angle = i_this->current.angle; + i_this->shape_angle.x = 0; + + fopAcM_create(PROC_KS, parameters, &local_4c, fopAcM_GetRoomNo(i_this), &i_this->shape_angle, &i_this->scale, 0); + } + + return cPhs_ERROR_e; + } + + if (KS_ALL_COUNT == 0) { + KUTTUKU_ALL_COUNT = 0; + HEAVY_IN = FALSE; + GORON_COUNT = 0; + } + + KS_ALL_COUNT++; + + fopAcM_SetMtx(i_this, a_this->mpBodyMorf->getModel()->getBaseTRMtx()); + + fopAcM_setCullSizeBox(i_this, -20.0f, -20.0f, -20.0f, 20.0f, 20.0f, 20.0f); + + i_this->attention_info.flags = 0; + + a_this->mAcch.Set(&i_this->current.pos, &i_this->old.pos, i_this, 1, &a_this->mAcchCir, &i_this->speed, NULL, NULL); + + a_this->mStts.Init(2, 1, i_this); + + i_this->max_health = 1; + i_this->health = 1; + + a_this->m304 = 25.0f; + + a_this->m2E8[0] = cM_rndFX(25.0f) + 50.0f; + + a_this->m2DC.setall(1.0f); + + a_this->m2FE = (fopAcM_GetID(i_this) & 7) * 0x32 + 1000; + + a_this->mSph.Set(body_co_sph_src); + a_this->mSph.SetStts(&a_this->mStts); + + a_this->mEnemyIce.mpActor = i_this; + a_this->mEnemyIce.mWallRadius = 20.0f; + a_this->mEnemyIce.mCylHeight = 20.0f; + a_this->mEnemyIce.m1B0 = 1; + + a_this->mEnemyFire.mpMcaMorf = a_this->mpBodyMorf; + a_this->mEnemyFire.mpActor = i_this; + + for (int i = 0; i < 10; i++) { + a_this->mEnemyFire.mFlameJntIdxs[i] = fire_j[i]; + a_this->mEnemyFire.mParticleScale[i] = fire_sc[i]; + } + + i_this->itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("kuro_s", 0); + + if (a_this->m2C8 == 4 || a_this->m2C8 == 5) { + a_this->mGmID = fopAcM_GetLinkId(i_this); + if (a_this->mGmID == fpcM_ERROR_PROCESS_ID_e) { + return cPhs_ERROR_e; + } + + fopAc_ac_c* i_act = fopAcM_SearchByID(a_this->mGmID); + if (i_act && fopAc_IsActor(i_act) && fopAcM_GetName(i_act) == PROC_GM && a_this->m2C8 == 5) { + i_this->current.angle.y += cM_rndFX(8192.0f); + i_this->speedF = cM_rndF(6.0f) + 34.0f; + i_this->speed.y = cM_rndF(8.0f) + 22.0f; + } + } + + a_this->m31C = 20.0f; + + if (a_this->m2C8 == 6) { + a_this->mSph.OffTgSetBit(); + a_this->mSph.OffCoSetBit(); + a_this->mSph.ClrTgHit(); + + a_this->m2CB = 10; + a_this->m2CC = 0x32; + + return res; + } + + if (a_this->m2C8 == 7) { + fopAcM_OnStatus(i_this, fopAcStts_UNK4000_e); + + a_this->m2CB = 0x14; + a_this->m2CC = 0x3c; + + return res; + } + + if (a_this->m2C8 == 2) { + a_this->m2CB = 0; + a_this->m2CC = 3; + + fopAcM_SetGravity(i_this, -3.0f); + + BG_check(a_this); + + if (!a_this->mAcch.ChkGroundHit()) { + i_this->gravity = 0.0f; + } + + } + } + + return res; } static actor_method_class l_daKS_Method = {