Files
tww/src/d/actor/d_a_ki.cpp
T
2026-05-10 13:11:56 -04:00

1510 lines
51 KiB
C++

/**
* d_a_ki.cpp
* Enemy - Keese
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_ki.h"
#include "d/actor/d_a_player.h"
#include "m_Do/m_Do_ext.h"
#include "d/d_procname.h"
#include "d/d_com_inf_game.h"
#include "d/d_priority.h"
#include "d/d_cc_d.h"
#include "d/d_s_play.h"
#include "d/d_path.h"
#include "d/d_snap.h"
#include "d/d_material.h"
#include "d/res/res_ki.h"
#include "m_Do/m_Do_hostIO.h"
#include "f_op/f_op_actor_mng.h"
#include "d/d_cc_uty.h"
#include "d/d_bg_s_lin_chk.h"
#include "JSystem/JUtility/JUTReport.h"
class kiHIO_c : public JORReflexible {
public:
kiHIO_c() {
m05 = 0;
m06 = 0;
m07 = 0;
m10 = 1.0f;
m08 = 1.0f;
m14 = 1.5f;
m18 = 2.0f;
m1C = 55.0f;
m20 = 175.0f;
m24 = 60.0f;
m28 = 30.0f;
m2C = 3.0f;
m30 = 7.0f;
m44 = 30.0f;
m34 = 65.0f;
m38 = 100.0f;
m40 = 7.0f;
m3C = 15.0f;
m4C = 30;
m48 = 0.2f;
m54 = 3;
m52 = 7;
m50 = 0x12C;
m4E = 0x320;
m0C = 500.0f;
m58 = 80.0f;
}
virtual ~kiHIO_c() {}
void genMessage(JORMContext* ctx) {}
/* 0x04 */ s8 mNo;
/* 0x05 */ u8 m05;
/* 0x06 */ u8 m06;
/* 0x07 */ u8 m07;
/* 0x08 */ f32 m08;
/* 0x0C */ f32 m0C;
/* 0x10 */ f32 m10;
/* 0x14 */ f32 m14;
/* 0x18 */ f32 m18;
/* 0x1C */ f32 m1C;
/* 0x20 */ f32 m20;
/* 0x24 */ f32 m24;
/* 0x28 */ f32 m28;
/* 0x2C */ f32 m2C;
/* 0x30 */ f32 m30;
/* 0x34 */ f32 m34;
/* 0x38 */ f32 m38;
/* 0x3C */ f32 m3C;
/* 0x40 */ f32 m40;
/* 0x44 */ f32 m44;
/* 0x48 */ f32 m48;
/* 0x4C */ s16 m4C;
/* 0x4E */ s16 m4E;
/* 0x50 */ s16 m50;
/* 0x52 */ s16 m52;
/* 0x54 */ s16 m54;
/* 0x58 */ f32 m58;
}; // size = 0x5C
static bool hio_set;
static kiHIO_c l_kiHIO;
static s32 ki_all_count;
static s32 ki_fight_count;
static u16 ki_tex_anm_idx[] = {KI_BTP_AKE1, KI_BTP_TOJI1, KI_BTP_METOJI1, KI_BTP_GURU1};
static u16 ki_tex_max_frame[] = { 2, 2, 3, 2 };
static u8 ki_tex_loop[] = { 0, 0, 0, 0 };
/* 000000EC-000001B4 .text nodeCallBack__FP7J3DNodei */
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
if (calcTiming == 0) {
J3DJoint* joint = (J3DJoint*)node;
s32 jntNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
ki_class* pvVar3 = (ki_class*)model->getUserArea();
if (pvVar3 != NULL) {
MTXCopy(model->getAnmMtx(jntNo), *calc_mtx);
cMtx_YrotM(*calc_mtx, pvVar3->m328);
cMtx_ZrotM(*calc_mtx, pvVar3->m326);
model->setAnmMtx(jntNo, *calc_mtx);
MTXCopy(*calc_mtx, J3DSys::mCurrentMtx);
}
}
return TRUE;
}
/* 000001B4-0000023C .text ki_a_d_sub__FPvPv */
void* ki_a_d_sub(void* ac1, void*) {
if (fopAcM_IsActor(ac1) && fopAcM_GetName(ac1) == PROC_KI) {
ki_class* ki = (ki_class*)ac1;
ki_all_count++;
if (ki->mAction == ki_class::ACT_ATTACK_MOVE_INDEX_e && ki->mBehaviorType < 10) {
ki_fight_count++;
}
}
return NULL;
}
/* 0000023C-0000027C .text ki_check__FP8ki_class */
void ki_check(ki_class* i_this) {
ki_fight_count = 0;
ki_all_count = 0;
fpcM_Search(ki_a_d_sub, &i_this->actor);
}
/* 0000027C-000003A4 .text anm_init__FP8ki_classifUcfi */
void anm_init(ki_class* i_this, int anmResIdx, float morf, unsigned char loopMode, float playSpeed, int soundResIdx) {
if (soundResIdx >= 0) {
i_this->mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Ki", anmResIdx), loopMode, morf, playSpeed, 0.0f, -1.0f, dComIfG_getObjectRes("Ki", soundResIdx));
} else {
i_this->mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Ki", anmResIdx), loopMode, morf, playSpeed, 0.0f, -1.0f, NULL);
}
}
/* 000003A4-00000478 .text tex_anm_set__FP8ki_classUs */
void tex_anm_set(ki_class* i_this, unsigned short idx) {
J3DAnmTexPattern* pJVar2;
i_this->m335 = 1;
pJVar2 = (J3DAnmTexPattern*)dComIfG_getObjectRes("Ki", ki_tex_anm_idx[idx]);
i_this->m336 = ki_tex_max_frame[idx];
i_this->m337 = ki_tex_loop[idx];
i_this->m32C = pJVar2;
i_this->m334 = 0;
i_this->m32C->setFrame(0.0f);
u16 materialNum = pJVar2->getUpdateMaterialNum();
for (u16 i = 0; i < materialNum; i++) {
i_this->m330[i].setAnmTexPattern(pJVar2);
}
}
/* 00000478-000004C4 .text ki_eye_tex_anm__FP8ki_class */
void ki_eye_tex_anm(ki_class* i_this) {
if (i_this->m335 != 0) {
if (i_this->m334 < i_this->m336) {
i_this->m334++;
} else if (i_this->m337 != 0) {
i_this->m334 = 0;
} else {
i_this->m335 = 0;
}
}
}
/* 000004C4-00000820 .text ki_player_bg_check__FP8ki_class */
BOOL ki_player_bg_check(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
if (std::fabsf(player->speedF) < 0.1f && player->checkGrabWear()) {
return TRUE;
}
dBgS_LinChk linChk;
cXyz sp14;
cXyz sp08;
sp08 = player->eyePos;
sp14 = a_this->eyePos;
linChk.Set(&sp14, &sp08, a_this);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
return TRUE;
}
return FALSE;
}
/* 00000C58-00000F04 .text daKi_Draw__FP8ki_class */
static BOOL daKi_Draw(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
if (i_this->m2D4 != 0) {
return TRUE;
}
J3DModel* pModel = i_this->mpMorf->getModel();
g_env_light.setLightTevColorType(pModel, &a_this->tevStr);
if (i_this->mEnemyIce.mFreezeTimer > 0x14) {
dMat_control_c::iceEntryDL(i_this->mpMorf, -1, NULL);
return TRUE;
}
a_this->model = pModel;
dSnap_RegistFig(DSNAP_TYPE_KI, a_this, 1.0f, 1.0f, 1.0f);
pModel->getModelData()->setTexNoAnimator(i_this->m32C, i_this->m330);
i_this->m32C->setFrame(i_this->m334);
f32 fVar1 = 30.0f;
if (i_this->mDamageType == 0) {
J3DModelData* pModelData = pModel->getModelData();
J3DJoint* joint = pModelData->getJointNodePointer(0);
J3DMaterial* material = pModelData->getMaterialNodePointer(0);
J3DShape* shape = material->getShape();
shape->hide();
i_this->mpMorf->entryDL();
dComIfGd_setListMaskOff();
shape->show();
pModel->getMatPacket(0)->unlock();
material = pModelData->getMaterialNodePointer(1);
material->getShape()->hide();
joint->entryIn();
material->getShape()->show();
dComIfGd_setList();
} else {
J3DModelData* pModelData = pModel->getModelData();
i_this->m920->entry(pModelData);
dComIfGd_setListMaskOff();
i_this->mpMorf->entryDL();
dComIfGd_setList();
fVar1 = 45.0f;
}
#if VERSION == VERSION_DEMO
dComIfGd_setSimpleShadow2(&a_this->current.pos, i_this->mAcch.GetGroundH(), fVar1, i_this->mAcch.m_gnd);
#else
if (i_this->m540 != 0 && strcmp(dComIfGp_getStartStageName(), "GanonK") != 0) {
cXyz sp08(a_this->current.pos.x, a_this->current.pos.y, a_this->current.pos.z);
i_this->m2E0 = dComIfGd_setShadow(i_this->m2E0, 1, pModel, &sp08, 400.0f, fVar1, sp08.y, i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd, &a_this->tevStr);
}
#endif
return TRUE;
}
/* 00000F04-00001118 .text ki_pos_move__FP8ki_classSc */
void ki_pos_move(ki_class* i_this, s8 arg1) {
if (arg1 == 0) {
f32 x = i_this->mPosMove.x - i_this->actor.current.pos.x;
f32 y = i_this->mPosMove.y - i_this->actor.current.pos.y;
f32 z = i_this->mPosMove.z - i_this->actor.current.pos.z;
s16 xzAngle = cM_atan2s(x, z);
s16 iVar6 = -cM_atan2s(y, std::sqrtf(x * x + z * z));
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, xzAngle, 5, i_this->m304 * i_this->mPosMoveDist);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, iVar6, 5, i_this->m304 * i_this->mPosMoveDist);
cLib_addCalc2(&i_this->mPosMoveDist, 1.0f, 1.0f, 0.04f);
}
cLib_addCalc2(&i_this->actor.speedF, i_this->mPosMoveTarget, 1.0f, i_this->mPosMoveMaxSpeed);
cXyz sp0C;
sp0C.x = 0.0f;
sp0C.y = 0.0f;
sp0C.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(&sp0C, &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;
}
/* 00001118-0000171C .text ki_wait_move__FP8ki_class */
void ki_wait_move(ki_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
cXyz sp58;
switch(i_this->mBehaviorType) {
case 0:
anm_init(i_this, KI_BCK_WAIT1, 10.0f, 2, 1.0f, KI_BAS_WAIT1);
i_this->mBehaviorType = 1;
tex_anm_set(i_this, 2);
case 1:
sp58 = player->current.pos - i_this->actor.current.pos;
if (std::sqrtf(sp58.x * sp58.x + sp58.z * sp58.z) < i_this->mMaxAttackMoveDist300) {
sp58 = player->current.pos - player->old.pos;
if (sp58.abs() > 1.0f) {
i_this->mBehaviorType = 2;
i_this->mTimers[0] = 10;
}
}
break;
case 2:
if (i_this->mTimers[0] == 0) {
i_this->mBehaviorType = 3;
tex_anm_set(i_this, 0);
i_this->mTimers[0] = 0x28;
fopAcM_monsSeStart(&i_this->actor, JA_SE_CV_KI_WAKEUP, 0);
}
break;
case 3:
i_this->m338 = 1;
if (i_this->mTimers[0] == 0) {
sp58 = player->current.pos - player->old.pos;
if (sp58.abs() > 1.0f) {
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
i_this->actor.current.angle.x = 0x4000;
} else {
i_this->mBehaviorType = 0;
}
}
sp58 = player->current.pos - i_this->actor.current.pos;
i_this->m322 = cM_atan2s(sp58.x, sp58.z) - i_this->actor.current.angle.y;
i_this->m324 = -cM_atan2s(sp58.y, std::sqrtf(sp58.x * sp58.x + sp58.z * sp58.z));
if (i_this->m322 > 10000) {
i_this->m322 = 10000;
} else if (i_this->m322 < -10000) {
i_this->m322 = -10000;
}
if (i_this->m324 > 0x2000) {
i_this->m324 = 0x1FF6;
} else if (i_this->m324 < -0x38E) {
i_this->m324 = -0x38E;
}
break;
case 10:
i_this->mPosMove = i_this->actor.home.pos;
i_this->mPosMoveTarget = 20.0f;
i_this->mPosMoveMaxSpeed = 20.0f;
i_this->m304 = 10000.0f;
i_this->mPosMoveDist = 1.0f;
ki_pos_move(i_this, 0);
sp58 = i_this->mPosMove - i_this->actor.current.pos;
if (sp58.abs() < 100.0f) {
i_this->mBehaviorType = 0xb;
i_this->mTimers[0] = 0x32;
anm_init(i_this, KI_BCK_WAIT1, 10.0f, 2, 1.0f, KI_BAS_WAIT1);
}
break;
case 0xb:
cLib_addCalc2(&i_this->actor.current.pos.x, i_this->actor.home.pos.x, 0.5f, std::fabsf(i_this->actor.speed.x) + 1.0f);
cLib_addCalc2(&i_this->actor.current.pos.y, i_this->actor.home.pos.y, 0.5f, std::fabsf(i_this->actor.speed.y) + 1.0f);
cLib_addCalc2(&i_this->actor.current.pos.z, i_this->actor.home.pos.z, 0.5f, std::fabsf(i_this->actor.speed.z) + 1.0f);
if (i_this->mTimers[0] == 0) {
i_this->mBehaviorType = 0;
i_this->mTimers[0] = cM_rndF(50.0f) + 70.0f;
}
break;
}
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->actor.current.angle.y, 1, 0x1000);
}
/* 0000171C-00001A34 .text ki_fly_move__FP8ki_class */
void ki_fly_move(ki_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
i_this->m540 = 1;
cXyz sp28 = i_this->mPosMove - i_this->actor.current.pos;
f32 sqrt = std::sqrtf(sp28.x * sp28.x + sp28.z * sp28.z);
switch (i_this->mBehaviorType) {
case 0:
anm_init(i_this, KI_BCK_FLY1, 10.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
i_this->mBehaviorType = 1;
tex_anm_set(i_this, 0);
i_this->mPosMoveTarget = l_kiHIO.m28;
i_this->mPosMoveMaxSpeed = 2.0f;
i_this->m304 = 3000.0f;
case 1:
if (i_this->mTimers[1] == 0 || sqrt < 50.0f) {
i_this->mTimers[1] = cM_rndF(50.0f) + 50.0f;
i_this->mPosMove = i_this->actor.home.pos;
i_this->mPosMove.x += cM_rndFX(l_kiHIO.m0C);
i_this->mPosMove.y -= cM_rndF(200.0f);
i_this->mPosMove.z += cM_rndFX(l_kiHIO.m0C);
i_this->mPosMoveDist = 0.0f;
}
if (i_this->mTimers[0] == 0) {
sp28 = player->current.pos - i_this->actor.current.pos;
if (std::sqrtf(sp28.x * sp28.x + sp28.z * sp28.z) < i_this->mMaxAttackMoveDist300) {
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
}
}
break;
}
#if VERSION > VERSION_DEMO
if ((i_this->mTimers[2] == 0) && i_this->mAcch.ChkWallHit()) {
i_this->actor.current.angle.y -= -0x8000;
i_this->mTimers[2] = 20;
}
#endif
ki_pos_move(i_this, 0);
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->actor.current.angle.y, 1, 0x2000);
}
/* 00001A34-00001D84 .text ki_fire_set_move__FP8ki_class */
void ki_fire_set_move(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
i_this->m540 = 0;
switch (i_this->mBehaviorType) {
case 0:
a_this->speedF = REG8_F(8) + 35.0f + cM_rndF(10.0f);
a_this->speed.y = REG8_F(9) + 97.0f + cM_rndF(30.0f);
anm_init(i_this, KI_BCK_WAIT1, 1.0f, 2, 1.0f, KI_BAS_WAIT1);
i_this->mBehaviorType = 1;
i_this->m91C = dComIfGp_particle_set(dPa_name::ID_IT_SN_FIREK_FIRE_A, &a_this->current.pos, NULL, NULL, 0xFF, &i_this->m908);
case 1:
a_this->shape_angle.x += 0x1400;
a_this->shape_angle.y += 0x1000;
if (a_this->speed.y < REG8_F(11) + -70.0f) {
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
a_this->shape_angle.x = 0;
if (i_this->m91C != NULL) {
i_this->m908.remove();
dComIfGp_particle_forceDeleteEmitter(i_this->m91C);
i_this->m91C = NULL;
}
dComIfGp_particle_set(dPa_name::ID_IT_SN_FIREK_FIRE_B, &a_this->current.pos);
dComIfGp_particle_set(dPa_name::ID_IT_SN_FIREK_HAHEN, &a_this->current.pos);
}
break;
case 10:
anm_init(i_this, KI_BCK_FLY1, 10.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
i_this->mBehaviorType = 0xb;
i_this->mTimers[1] = 100;
case 11:
i_this->m540 = 1;
a_this->speed.y = 20.0f;
if (i_this->mTimers[1] == 0) {
i_this->m2DC = 1;
}
break;
}
cXyz sp24;
cXyz sp18;
sp24.x = 0.0f;
sp24.y = 0.0f;
sp24.z = a_this->speedF;
cMtx_YrotS(*calc_mtx, a_this->current.angle.y);
MtxPosition(&sp24, &sp18);
a_this->current.pos.x += sp18.x;
a_this->current.pos.y += a_this->speed.y;
a_this->current.pos.z += sp18.z;
a_this->speed.y -= REG8_F(10) + 8.0f;
if (fopAcM_searchPlayerDistance(a_this) > 2000.0f && ki_player_bg_check(i_this)) {
i_this->m2DC = 1;
}
}
/* 00001D84-00002A18 .text ki_atack_move__FP8ki_class */
void ki_atack_move(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
cXyz sp24;
i_this->m540 = 1;
s8 cVar6 = 0;
if (i_this->mTimers[3] == 0 && i_this->mBehaviorType <= 3) {
i_this->mTimers[3] = cM_rndF(14.0f) + 15.0f;
fopAcM_monsSeStart(a_this, JA_SE_CV_KI_ATTACK, 0);
}
switch(i_this->mBehaviorType) {
case 0:
anm_init(i_this, KI_BCK_FLY1, 10.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
i_this->mBehaviorType = 1;
tex_anm_set(i_this, 0);
i_this->mTimers[0] = l_kiHIO.m50 + cM_rndF(std::fabsf(l_kiHIO.m4E - l_kiHIO.m50));
i_this->mTimers[2] = 20;
case 1:
i_this->mPosMoveTarget = l_kiHIO.m28;
i_this->mPosMoveMaxSpeed = 2.0f;
i_this->mPosMove = player->current.pos;
i_this->mPosMove.y += 80.0f;
sp24 = i_this->mPosMove - a_this->current.pos;
cLib_addCalcAngleS2(&a_this->shape_angle.y, a_this->current.angle.y, 2, 0x1000);
if (sp24.abs() < 300.0f) {
i_this->mBehaviorType = 10;
anm_init(i_this, KI_BCK_FLY2, 5.0f, 2, l_kiHIO.m14, KI_BAS_FLY2);
i_this->mPosMoveDist = 0.0f;
}
break;
case 2:
if (i_this->mTimers[2] == 0) {
ki_check(i_this);
i_this->mTimers[2] = l_kiHIO.m4C;
f32 tmp = l_kiHIO.m48;
if (ki_fight_count >= l_kiHIO.m54) {
tmp *= 0.5f;
i_this->mTimers[2] <<= 1;
}
if (cM_rndF(1.0f) < tmp) {
i_this->mBehaviorType = 3;
anm_init(i_this, KI_BCK_ATTACK1, 5.0f, 2, l_kiHIO.m18, KI_BAS_ATTACK1);
i_this->mPosMove = player->current.pos;
i_this->mPosMove.y += 80.0f;
a_this->current.angle.y = fopAcM_searchPlayerAngleY(a_this);
a_this->speedF = 0.0f;
i_this->mPosMoveTarget = l_kiHIO.m44;
i_this->mPosMoveMaxSpeed = 3.0f;
i_this->mTimers[1] = 30;
break;
}
}
cLib_addCalcAngleS2(&a_this->shape_angle.y, fopAcM_searchPlayerAngleY(a_this), 2, 0x1000);
if (i_this->mTimers[1] == 0) {
i_this->mTimers[1] = cM_rndF(50.0f) + 20.0f;
s32 rndFX = cM_rndFX(l_kiHIO.m24 * 182.0444f);
cMtx_YrotS(*calc_mtx, player->current.angle.y + rndFX);
sp24.x = 0.0f;
#if VERSION == VERSION_DEMO
sp24.y = cM_rndF(80.0f) + l_kiHIO.m1C;
#else
sp24.y = cM_rndF(50.0f) + l_kiHIO.m1C;
#endif
sp24.z = l_kiHIO.m20;
MtxPosition(&sp24, &i_this->mPosMove);
i_this->mPosMove += player->current.pos;
i_this->mPosMoveDist = 0.0f;
}
sp24.x = cM_ssin(i_this->m320 * 0x76C) * 50.0f;
sp24.y = cM_ssin(i_this->m320 * 0x9C4) * 60.0f;
sp24.z = cM_scos(i_this->m320 * 0x5DC) * 50.0f;
cLib_addCalc2(&a_this->current.pos.x, i_this->mPosMove.x + sp24.x, 0.1f, l_kiHIO.m2C * i_this->mPosMoveDist);
cLib_addCalc2(&a_this->current.pos.y, i_this->mPosMove.y + sp24.y, 0.1f, l_kiHIO.m2C * i_this->mPosMoveDist);
cLib_addCalc2(&a_this->current.pos.z, i_this->mPosMove.z + sp24.z, 0.1f, l_kiHIO.m2C * i_this->mPosMoveDist);
cLib_addCalc2(&i_this->mPosMoveDist, 1.0f, 1.0f, 0.05f);
cVar6 = -1;
break;
case 3:
i_this->m580.SetR(30.0f);
i_this->mDamageSphere.SetR(20.0f);
i_this->m6AC.SetR(0.0f);
if (i_this->mDamageType == 0) {
i_this->m580.SetAtAtp(1);
} else {
i_this->m580.SetAtAtp(2);
}
cVar6 = 1;
if (i_this->mTimers[1] == 10) {
i_this->mPosMoveTarget = 0.0f;
i_this->mPosMoveMaxSpeed = 3.0f;
}
if (i_this->mTimers[1] == 0) {
anm_init(i_this, KI_BCK_FLY1, 5.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
i_this->mBehaviorType = 1;
}
cLib_addCalcAngleS2(&a_this->shape_angle.y, a_this->current.angle.y, 2, 0x2000);
if (i_this->m580.ChkAtHit() || i_this->mDamageSphere.ChkCoHit()) {
anm_init(i_this, KI_BCK_FLY2, 2.0f, 2, l_kiHIO.m14, KI_BAS_FLY2);
i_this->mBehaviorType = 4;
i_this->mTimers[1] = 30;
a_this->speedF = -15.0f;
i_this->mPosMoveTarget = 0.0f;
i_this->mPosMoveMaxSpeed = 1.0f;
}
break;
case 4:
if (i_this->mTimers[1] == 0) {
anm_init(i_this, KI_BCK_FLY1, 3.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
i_this->mBehaviorType = 1;
}
break;
case 10:
i_this->mPosMoveTarget = l_kiHIO.m30;
ki_check(i_this);
if (ki_fight_count < l_kiHIO.m52) {
i_this->mBehaviorType = 2;
i_this->mTimers[2] = 50;
}
cLib_addCalcAngleS2(&a_this->shape_angle.y, fopAcM_searchPlayerAngleY(a_this), 2, 0x1000);
if (i_this->mTimers[1] == 0) {
i_this->mTimers[1] = cM_rndF(50.0f) + 50.0f;
s32 rndFX = cM_rndFX(32768.0f);
cMtx_YrotS(*calc_mtx, player->current.angle.y + rndFX);
sp24.x = 0.0f;
sp24.y = (cM_rndFX(50.0f) + 200.0f) + REG0_F(12);
sp24.z = l_kiHIO.m20 + REG0_F(13);
MtxPosition(&sp24, &i_this->mPosMove);
i_this->mPosMove += player->current.pos;
i_this->mPosMoveDist = 0.0f;
}
sp24.x = cM_ssin(i_this->m320 * 0x76C) * 100.0f;
sp24.y = cM_ssin(i_this->m320 * 0x9C4) * 60.0f;
sp24.z = cM_scos(i_this->m320 * 0x5DC) * 100.0f;
cLib_addCalc2(&a_this->current.pos.x, i_this->mPosMove.x + sp24.x, 0.1f, l_kiHIO.m30 * i_this->mPosMoveDist);
cLib_addCalc2(&a_this->current.pos.y, i_this->mPosMove.y + sp24.y, 0.1f, l_kiHIO.m30 * i_this->mPosMoveDist);
cLib_addCalc2(&a_this->current.pos.z, i_this->mPosMove.z + sp24.z, 0.1f, l_kiHIO.m30 * i_this->mPosMoveDist);
cLib_addCalc2(&i_this->mPosMoveDist, 1.0f, 1.0f, 0.025f);
cVar6 = -1;
break;
}
i_this->m304 = 10000.0f;
i_this->mPosMoveDist = 1.0f;
if (cVar6 >= 0) {
ki_pos_move(i_this, cVar6);
}
if (i_this->mParameters != 3) {
if (ki_player_bg_check(i_this)) {
i_this->mTimers[0] = 0;
}
if (i_this->mTimers[0] == 0) {
i_this->mAction = i_this->mParameters;
#if VERSION > VERSION_DEMO
i_this->mTimers[2] = 0;
#endif
if (i_this->mKiPathIndex != 0xFF) {
i_this->mCurrKiPathIndex = i_this->mKiPathIndex + 1;
i_this->mBehaviorType = 0xFF;
} else if (i_this->mAction == ki_class::ACT_FIRE_SET_MOVE_e) {
i_this->mBehaviorType = 10;
} else if (i_this->mAction == ki_class::ACT_WAIT_MOVE_e) {
dBgS_LinChk linChk;
cXyz sp18 = a_this->current.pos;
sp18.y += 5000.0f;
linChk.Set(&a_this->current.pos, &sp18, a_this);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
a_this->home.pos = linChk.GetCross();
a_this->home.pos.y -= 30.0f;
i_this->mBehaviorType = 10;
anm_init(i_this, KI_BCK_FLY1, 5.0f, 2, l_kiHIO.m08, KI_BAS_FLY1);
} else {
i_this->mTimers[0] = 50;
i_this->mBehaviorType = 1;
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
}
} else {
i_this->mBehaviorType = 0;
i_this->mTimers[0] = cM_rndF(50.0f) + 100.0f;
}
}
}
}
/* 00002A18-00002E28 .text wall_angle_get__FP8ki_class */
s16 wall_angle_get(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
dBgS_LinChk linChk;
cXyz sp2C[2];
cXyz sp20;
cXyz sp14;
cMtx_YrotS(*calc_mtx, a_this->shape_angle.y);
sp20.x = 0.0f;
sp20.y = 0.0f;
sp20.z = 100.0f;
MtxPosition(&sp20, &sp14);
sp14 += a_this->current.pos;
sp20.x = 10.0f;
sp20.y = 0.0f;
sp20.z = -300.0f;
for (s32 i = 0; i < 2; i++) {
MtxPosition(&sp20, &sp2C[i]);
sp20.x *= -1.0f;
sp2C[i] += sp14;
linChk.Set(&sp14, &sp2C[i], a_this);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
sp2C[i] = linChk.GetCross();
} else {
return TRUE;
}
}
sp20 = sp2C[1] - sp2C[0];
return cM_atan2s(sp20.x, sp20.z) + 0x4000;
}
/* 00002E28-00003114 .text ki_damage_move__FP8ki_class */
void ki_damage_move(ki_class* i_this) {
bool bVar1 = false;
i_this->m540 = 1;
i_this->m314 = 3;
switch (i_this->mBehaviorType) {
case 0:
anm_init(i_this, KI_BCK_DAMAGE1, 2.0f, 0, 1.0f, KI_BAS_DAMAGE1);
tex_anm_set(i_this, 3);
i_this->mBehaviorType = 1;
case 1:
if (i_this->m31C > 0.1f) {
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->m316, 1, 0x3000);
cXyz sp1C;
sp1C.x = 0.0f;
sp1C.y = 0.0f;
sp1C.z = -i_this->m31C;
cMtx_YrotS(*calc_mtx, i_this->m316);
cMtx_XrotM(*calc_mtx, i_this->mRand2000);
if (i_this->mAcch.ChkWallHit()) {
sp1C.z = 0.0f;
if (i_this->m31C >= l_kiHIO.m3C) {
i_this->mBehaviorType = 2;
i_this->mTimers[0] = 0x32;
anm_init(i_this, KI_BCK_BITA1, 1.0f, 0, 1.0f, KI_BAS_BITA1);
tex_anm_set(i_this, 3);
i_this->actor.speed.y = 0.0f;
csXyz shapeAngle = i_this->actor.shape_angle;
shapeAngle.y -= -0x8000;
s16 sVar2 = wall_angle_get(i_this);
if (sVar2 != 1) {
i_this->actor.current.angle.y = sVar2;
}
i_this->m904 = cM_rndF(1.9f);
bVar1 = true;
}
}
cXyz sp10;
MtxPosition(&sp1C, &sp10);
i_this->actor.current.pos.x += sp10.x;
i_this->actor.current.pos.y += sp10.y;
i_this->actor.current.pos.z += sp10.z;
cLib_addCalc0(&i_this->m31C, 1.0f, l_kiHIO.m40);
i_this->actor.speedF = 0.0;
} else {
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
bVar1 = true;
}
break;
case 2:
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->actor.current.angle.y, 1, 0x4000);
if (i_this->mTimers[0] < 30) {
i_this->actor.current.pos.y += i_this->actor.speed.y;
i_this->actor.speed.y -= 0.1f;
if (i_this->m904 == 0) {
i_this->actor.shape_angle.z += -0x250;
} else {
i_this->actor.shape_angle.z += 0x250;
}
}
if (i_this->mTimers[0] == 0) {
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
}
break;
}
if (bVar1 && i_this->actor.health <= 0) {
i_this->mAction = ki_class::ACT_FAIL_MOVE_e;
i_this->mBehaviorType = 0;
}
}
void* bgn_s_sub(void* ac1, void*) {
if (fopAcM_IsActor(ac1) && fopAcM_GetName(ac1) == PROC_BGN) {
return ac1;
}
return NULL;
}
/* 00003114-00003278 .text ki_fail_move__FP8ki_class */
void ki_fail_move(ki_class* i_this) {
fopEn_enemy_c* a_this = (fopEn_enemy_c*)&i_this->actor;
u8 dropType;
#if VERSION == VERSION_DEMO
if (fpcM_Search(bgn_s_sub, &i_this->actor) != NULL) {
#else
if (strcmp(dComIfGp_getStartStageName(), "GanonK") == 0) {
#endif
if (a_this->health != -10) {
#if VERSION == VERSION_DEMO
if (dComIfGs_getLife() <= 4) {
#else
if (dComIfGs_getLife() <= 8) {
#endif
dropType = daDisItem_HEART_e;
} else if (cM_rndF(1.0f) < 0.5f) {
#if VERSION == VERSION_DEMO
if (dComIfGs_getMagic() <= 16) {
dropType = daDisItem_MAGIC_e;
} else if (dComIfGs_getArrowNum() <= 10) {
dropType = daDisItem_ARROW_e;
} else {
dropType = daDisItem_HEART_e;
}
#else
if (dComIfGs_getArrowNum() == 0) {
dropType = daDisItem_ARROW_e;
} else if (dComIfGs_getMagic() < dComIfGs_getMaxMagic() / 2) {
dropType = daDisItem_MAGIC_e;
} else if (dComIfGs_getArrowNum() < 10) {
dropType = daDisItem_ARROW_e;
} else {
static u8 item_tbl[] = {daDisItem_HEART_e, daDisItem_MAGIC_e, daDisItem_ARROW_e, daDisItem_HEART_e};
dropType = item_tbl[(s32)cM_rndF(2.99f)];
}
#endif
} else {
dropType = daDisItem_NONE13_e;
}
} else {
dropType = daDisItem_NONE13_e;
}
fopAcM_createDisappear(a_this, &a_this->current.pos, 5, dropType, 0xFF);
} else {
fopAcM_createDisappear(a_this, &a_this->current.pos, 5, daDisItem_IBALL_e, 0xFF);
}
fopAcM_delete(a_this);
fopAcM_onActor(a_this);
}
/* 00003278-000035D0 .text ki_path_move__FP8ki_class */
void ki_path_move(ki_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
switch (i_this->mBehaviorType) {
case 0:
i_this->m2D6 += i_this->m2D7;
if (i_this->m2D6 >= (s8)i_this->ppd->m_num) {
if (dPath_ChkClose(i_this->ppd)) {
i_this->m2D6 = 0;
} else {
i_this->m2D7 = -1;
i_this->m2D6 = i_this->ppd->m_num - 2;
}
if ((s32)i_this->ppd->m_nextID != 0xFFFF) {
i_this->ppd = dPath_GetRoomPath(i_this->ppd->m_nextID, fopAcM_GetRoomNo(&i_this->actor));
JUT_ASSERT(DEMO_SELECT(1693, 1733), i_this->ppd != NULL)
}
} else if (i_this->m2D6 < 0) {
i_this->m2D7 = 1;
i_this->m2D6 = 1;
}
case -1: {
i_this->mBehaviorType = 1;
dPnt* point = &i_this->ppd->m_points[0];
point += i_this->m2D6;
i_this->mPosMoveTarget = cM_rndF(5.0f) + 30.0f;
i_this->mPosMoveMaxSpeed = REG0_F(13) + 1.0f;
i_this->mPosMoveDist = REG0_F(7);
i_this->mPosMove = point->m_position;
i_this->mPosMove.x = point->m_position.x + cM_rndFX(150.0f);
i_this->mPosMove.y = point->m_position.y + cM_rndFX(150.0f);
i_this->mPosMove.z = point->m_position.z + cM_rndFX(150.0f);
break;
}
case 1:
f32 x = i_this->mPosMove.x - i_this->actor.current.pos.x;
f32 y = i_this->mPosMove.y - i_this->actor.current.pos.y;
f32 z = i_this->mPosMove.z - i_this->actor.current.pos.z;
if (std::sqrtf(x * x + y * y + z * z) < REG0_F(10) * 10.0f + 200.0f) {
i_this->mBehaviorType = 0;
if (i_this->ppd->m_points[i_this->m2D6].mArg3 == 6) {
fopAcM_delete(&i_this->actor);
}
}
break;
}
i_this->mPosMoveTarget = l_kiHIO.m28;
i_this->mPosMoveMaxSpeed = 2.0f;
i_this->m304 = 4000.0f;
i_this->mPosMoveDist = 1.0f;
ki_pos_move(i_this, 0);
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->actor.current.angle.y, 1, 0x2000);
if (fopAcM_searchPlayerDistance(&i_this->actor) < i_this->mMaxAttackMoveDist300) {
i_this->mCurrKiPathIndex = 0;
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
}
}
/* 000035D0-00003E04 .text daKi_Execute__FP8ki_class */
static BOOL daKi_Execute(ki_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
s32 i;
cXyz* ccMoveP;
s16 tmp;
CcAtInfo atInfo;
J3DModel* model;
i_this->actor.model = NULL;
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);
J3DModel* model = i_this->mpMorf->getModel();
model->setBaseTRMtx(mDoMtx_stack_c::get());
i_this->mpMorf->calc();
return TRUE;
}
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->actor.current.pos, &i_this->actor.tevStr);
if (i_this->m2DC != 0) {
cLib_addCalc0(&i_this->actor.scale.x, 1.0f, 0.05f);
i_this->actor.scale.y = i_this->actor.scale.z = i_this->actor.scale.x;
if (i_this->actor.scale.x <= 0.04f) {
fopAcM_delete(&i_this->actor);
return TRUE;
}
}
if (i_this->m2D4 != 0) {
if (dComIfGs_isSwitch(i_this->m2D4 - 1, fopAcM_GetRoomNo(&i_this->actor))) {
i_this->m2D4 = 0;
i_this->actor.speedF = l_kiHIO.m28;
i_this->actor.attention_info.flags = fopAc_Attn_LOCKON_BATTLE_e;
} else {
fopAcM_OnStatus(&i_this->actor, 0);
fopAcM_OffStatus(&i_this->actor, 0);
i_this->actor.attention_info.flags = 0;
return TRUE;
}
}
fopAcM_OnStatus(&i_this->actor, fopAcStts_SHOWMAP_e);
if (l_kiHIO.m07 != 0) {
ki_check(i_this);
JUTReport(0x104, 0x186,"ALL %d", ki_all_count);
JUTReport(0x104, 0x19a,"READY %d", ki_all_count - ki_fight_count);
JUTReport(0x104, 0x1ae,"FIGHT %d", ki_fight_count);
}
i_this->m580.SetR(0.0f);
i_this->mDamageSphere.SetR(40.0f);
i_this->m6AC.SetR(l_kiHIO.m58);
if (l_kiHIO.m06 == 0) {
i_this->m540 = 0;
for (i = 0; i < 4; i++) {
if (i_this->mTimers[i] != 0) {
i_this->mTimers[i]--;
}
}
if (i_this->m314 != 0) {
i_this->m314--;
}
i_this->m320++;
if (i_this->m338 == 0) {
i_this->mpMorf->play(&i_this->actor.current.pos, 0, 0);
} else {
i_this->m338 = 0;
}
if (i_this->mAction == ki_class::ACT_ATTACK_MOVE_e) {
ki_atack_move(i_this);
} else if (i_this->mCurrKiPathIndex != 0) {
ki_path_move(i_this);
} else if (i_this->mAction == ki_class::ACT_WAIT_MOVE_e) {
ki_wait_move(i_this);
} else if (i_this->mAction == ki_class::ACT_FIRE_SET_MOVE_e) {
ki_fire_set_move(i_this);
} else if (i_this->mAction == ki_class::ACT_FLY_MOVE_e) {
ki_fly_move(i_this);
} else if (i_this->mAction == ki_class::ACT_ATTACK_MOVE_INDEX_e) {
ki_atack_move(i_this);
} else if (i_this->mAction == ki_class::ACT_DAMAGE_MOVE_e) {
ki_damage_move(i_this);
} else if (i_this->mAction == ki_class::ACT_FAIL_MOVE_e) {
ki_fail_move(i_this);
}
ki_eye_tex_anm(i_this);
}
if (i_this->mDamageType != 0) {
i_this->m920->play();
if (i_this->mAction != ki_class::ACT_FAIL_MOVE_e) {
dComIfGp_particle_setSimple(dPa_name::ID_IT_SN_O_FIREK_KASU, &i_this->actor.current.pos);
fopAcM_seStart(&i_this->actor, JA_SE_OBJ_TORCH_BURNING, 0);
}
}
ccMoveP = i_this->mStts.GetCCMoveP();
if (ccMoveP != NULL) {
i_this->actor.current.pos.x += ccMoveP->x;
i_this->actor.current.pos.y += ccMoveP->y;
i_this->actor.current.pos.z += ccMoveP->z;
}
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.shape_angle.y);
cMtx_XrotM(*calc_mtx, i_this->actor.shape_angle.x);
cMtx_ZrotM(*calc_mtx, i_this->actor.shape_angle.z);
model = i_this->mpMorf->getModel();
model->setBaseScale(i_this->actor.scale);
model->setBaseTRMtx(*calc_mtx);
i_this->mpMorf->calc();
enemy_fire(&i_this->mEnemyFire);
i_this->actor.eyePos = i_this->actor.current.pos;
i_this->actor.attention_info.position = i_this->actor.eyePos;
i_this->actor.attention_info.position.y += 50.0f;
i_this->m580.SetC(i_this->actor.current.pos);
i_this->m6AC.SetC(i_this->actor.current.pos);
i_this->mDamageSphere.SetC(i_this->actor.current.pos);
dComIfG_Ccsp()->Set(&i_this->m580);
dComIfG_Ccsp()->Set(&i_this->m6AC);
dComIfG_Ccsp()->Set(&i_this->mDamageSphere);
if (i_this->m540 != 0) {
#if VERSION > VERSION_DEMO
i_this->actor.current.pos.y -= REG0_F(5) + 30.0f;
i_this->actor.old.pos.y -= REG0_F(5) + 30.0f;
#endif
i_this->mAcch.CrrPos(*dComIfG_Bgsp());
#if VERSION > VERSION_DEMO
i_this->actor.current.pos.y += REG0_F(5) + 30.0f;
i_this->actor.old.pos.y += REG0_F(5) + 30.0f;
#endif
}
i_this->mStts.Move();
if (i_this->mDamageSphere.ChkTgHit() && i_this->m314 == 0) {
i_this->m314 = 10;
atInfo.mpObj = i_this->mDamageSphere.GetTgHitObj();
atInfo.pParticlePos = i_this->mDamageSphere.GetTgHitPosP();
if (atInfo.mpObj->ChkAtType(AT_TYPE_LIGHT_ARROW | AT_TYPE_ICE_ARROW)) {
if (atInfo.mpObj->ChkAtType(AT_TYPE_ICE_ARROW)) {
i_this->mEnemyIce.mFreezeDuration = REG0_S(3) + 300;
i_this->mAction = ki_class::ACT_ATTACK_MOVE_INDEX_e;
i_this->mBehaviorType = 0;
} else {
i_this->mEnemyIce.mLightShrinkTimer = 1;
}
enemy_fire_remove(&i_this->mEnemyFire);
return TRUE;
}
if (atInfo.mpObj->ChkAtType(AT_TYPE_FIRE_ARROW | AT_TYPE_FIRE)) {
i_this->mEnemyFire.mFireDuration = REG0_S(2) + 100;
i_this->m314 = 0x32;
i_this->m580.OnAtVsBitSet(cCcD_AtSPrm_VsEnemy_e);
}
if (atInfo.mpObj->ChkAtType(AT_TYPE_WIND)) {
#if VERSION == VERSION_DEMO
i_this->m31C = 130.0f;
#else
i_this->m31C = 100.0f;
#endif
} else {
atInfo.mpActor = cc_at_check(&i_this->actor, &atInfo);
if (atInfo.mpActor != NULL) {
if (fpcM_GetName(atInfo.mpActor) == PROC_BGN || fpcM_GetName(atInfo.mpActor) == PROC_BGN2 || fpcM_GetName(atInfo.mpActor) == PROC_BGN3) {
i_this->actor.health = -10;
}
}
if (l_kiHIO.m05 != 0) {
i_this->actor.health = 10;
}
#if VERSION > VERSION_DEMO
if (atInfo.mResultingAttackType == 9) {
i_this->m31C = 150.0f;
} else
#endif
if (i_this->mStts.GetAtSpl() == dCcG_At_Spl_UNK1) {
i_this->m31C = l_kiHIO.m38;
} else {
i_this->m31C = l_kiHIO.m34;
}
}
i_this->m316 = fopAcM_searchPlayerAngleY(&i_this->actor);
i_this->mRand2000 = cM_rndF(2000.0f);
i_this->mAction = ki_class::ACT_DAMAGE_MOVE_e;
i_this->mBehaviorType = 0;
fopAcM_monsSeStart(&i_this->actor, JA_SE_CV_KI_DAMAGE, 0);
}
if (i_this->m322) {
tmp = 0x1000;
} else {
tmp = 0x200;
}
cLib_addCalcAngleS2(&i_this->m326, i_this->m322, 5, tmp);
if (i_this->m324) {
tmp = 0x1000;
} else {
tmp = 0x200;
}
cLib_addCalcAngleS2(&i_this->m328, i_this->m324, 5, tmp);
i_this->m324 = 0;
i_this->m322 = 0;
cLib_addCalcAngleS2(&i_this->actor.shape_angle.z, 0, 1, 0x200);
return TRUE;
}
/* 00003E04-00003E0C .text daKi_IsDelete__FP8ki_class */
static BOOL daKi_IsDelete(ki_class*) {
return TRUE;
}
/* 00003E0C-00003EB8 .text daKi_Delete__FP8ki_class */
static BOOL daKi_Delete(ki_class* i_this) {
dComIfG_resDeleteDemo(&i_this->mPhase, "Ki");
if (i_this->m339 != 0) {
hio_set = false;
mDoHIO_deleteChild(l_kiHIO.mNo);
}
#if VERSION > VERSION_DEMO
if (i_this->actor.heap != NULL) {
i_this->mpMorf->stopZelAnime();
}
#endif
if (i_this->mDamageType != 0) {
i_this->m908.remove();
}
enemy_fire_remove(&i_this->mEnemyFire);
return TRUE;
}
/* 00003EB8-000042B8 .text useHeapInit__FP10fopAc_ac_c */
static BOOL useHeapInit(fopAc_ac_c* a_this) {
ki_class* i_this = (ki_class*)a_this;
J3DModel* model;
if (i_this->mDamageType == 0) {
i_this->actor.gbaName = 0x17;
i_this->mpMorf = new mDoExt_McaMorf(
(J3DModelData*)dComIfG_getObjectRes("Ki", KI_BDL_KI),
NULL, NULL,
(J3DAnmTransform*)dComIfG_getObjectRes("Ki", KI_BCK_WAIT1),
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1,
dComIfG_getObjectRes("Ki", KI_BAS_WAIT1),
0x80000, 0x37221203
);
#if VERSION == VERSION_DEMO
model = i_this->mpMorf->getModel();
#else
if (i_this->mpMorf == NULL || (model = i_this->mpMorf->getModel()) == NULL) {
return FALSE;
}
#endif
} else {
i_this->actor.gbaName = 6;
i_this->mpMorf = new mDoExt_McaMorf(
(J3DModelData*)dComIfG_getObjectRes("Ki", KI_BDL_FK),
NULL, NULL,
(J3DAnmTransform*)dComIfG_getObjectRes("Ki", KI_BCK_WAIT1),
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1,
dComIfG_getObjectRes("Ki", KI_BAS_WAIT1),
0x80000, 0x37221203
);
#if VERSION > VERSION_DEMO
if (i_this->mpMorf == NULL) {
return FALSE;
}
#endif
model = i_this->mpMorf->getModel();
if (model == NULL) {
return FALSE;
}
i_this->m920 = new mDoExt_btkAnm();
if (i_this->m920 == NULL) {
return FALSE;
}
if (!i_this->m920->init(model->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Ki", KI_BTK_FK), true, J3DFrameCtrl::EMode_LOOP)) {
return FALSE;
}
}
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
if (i == 14) {
model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
}
}
J3DAnmTexPattern* anmTexPattern;
for (s32 i = 0; i < 4; i++) {
anmTexPattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Ki", ki_tex_anm_idx[i]);
anmTexPattern->searchUpdateMaterialID(model->getModelData());
}
u16 materialCount = anmTexPattern->getUpdateMaterialNum();
i_this->m330 = new J3DTexNoAnm[materialCount];
for (u16 i = 0; i < materialCount; i++) {
i_this->m330[i].setAnmIndex(i);
}
tex_anm_set(i_this, 1);
i_this->mpMorf->getModel()->setUserArea((u32)i_this);
return TRUE;
}
/* 00004364-000046F4 .text daKi_Create__FP10fopAc_ac_c */
static cPhs_State daKi_Create(fopAc_ac_c* a_this) {
static dCcD_SrcSph at_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ AT_TYPE_UNK800,
/* SrcObjAt Atp */ 1,
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ 0,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ dCcG_AtSPrm_NoConHit_e,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ 0,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{{
/* Center */ {0.0f, 0.0f, 0.0f},
/* Radius */ 30.0f,
}},
};
static dCcD_SrcSph tg_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_WATER & ~AT_TYPE_UNK20000 & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT,
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{{
/* Center */ {0.0f, 0.0f, 0.0f},
/* Radius */ 40.0f,
}},
};
static dCcD_SrcSph co_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ 0,
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsPlayer_e,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ 0,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{{
/* Center */ {0.0f, 0.0f, 0.0f},
/* Radius */ 80.0f,
}},
};
ki_class* i_this = (ki_class*)a_this;
fopAcM_ct(a_this, ki_class);
cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Ki");
if (ret == cPhs_COMPLEATE_e) {
i_this->mParameters = fopAcM_GetParam(a_this);
if (i_this->mParameters == 0xFF) {
i_this->mParameters = 0;
}
i_this->mAction = i_this->mParameters;
i_this->m2CD = fopAcM_GetParam(a_this) >> 8 & 0x7f;
i_this->mDamageType = (fopAcM_GetParam(a_this) >> 8) & 0x80;
i_this->mKiPathIndex = fopAcM_GetParam(a_this) >> 0x10;
i_this->m2CF = fopAcM_GetParam(a_this) >> 0x18;
a_this->itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("keeth", 0);
if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x4E00)) {
return cPhs_ERROR_e;
}
switch (i_this->m2CD) {
case 0:
i_this->mMaxAttackMoveDist300 = 300.0f;
break;
case 1:
i_this->mMaxAttackMoveDist300 = 800.0f;
break;
case 2:
i_this->mMaxAttackMoveDist300 = 1500.0f;
break;
case 3:
default:
i_this->mMaxAttackMoveDist300 = 3000.0f;
break;
}
if (i_this->mKiPathIndex != 0xFF) {
i_this->ppd = dPath_GetRoomPath(i_this->mKiPathIndex, fopAcM_GetRoomNo(a_this));
if (i_this->ppd == NULL) {
return cPhs_ERROR_e;
}
i_this->mCurrKiPathIndex = i_this->mKiPathIndex + 1;
i_this->m2D7 = 1;
}
if (i_this->m2CF != 0xFF) {
i_this->m2D4 = i_this->m2CF + 1;
}
fopAcM_SetMtx(a_this, i_this->mpMorf->getModel()->getBaseTRMtx());
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));
#if VERSION == VERSION_DEMO
i_this->mAcchCir.SetWall(10.0f, 20.0f);
i_this->mAcch.SetGroundUpY(REG0_F(8) + 30.0f);
#else
i_this->mAcchCir.SetWall(20.0f, 50.0f);
#endif
a_this->health = 1;
a_this->max_health = 1;
i_this->m320 = cM_rndF(10000.0f);
i_this->mStts.Init(0x32, 2, a_this);
i_this->m580.Set(at_sph_src);
i_this->m6AC.Set(co_sph_src);
i_this->mDamageSphere.Set(tg_sph_src);
i_this->m580.SetStts(&i_this->mStts);
i_this->m6AC.SetStts(&i_this->mStts);
i_this->mDamageSphere.SetStts(&i_this->mStts);
if (i_this->mDamageType != 0) {
i_this->m580.SetAtType(AT_TYPE_FIRE);
#if VERSION == VERSION_DEMO
i_this->mDamageSphere.SetTgType(~(AT_TYPE_WATER | AT_TYPE_FIRE | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT));
#else
i_this->mDamageSphere.SetTgType(~(AT_TYPE_WATER | AT_TYPE_FIRE | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT));
#endif
}
i_this->m580.OffAtVsBitSet(cCcD_AtSPrm_VsEnemy_e);
a_this->attention_info.flags = fopAc_Attn_LOCKON_BATTLE_e;
if (!hio_set) {
l_kiHIO.mNo = mDoHIO_createChild("キース", &l_kiHIO);
i_this->m339 = 1;
hio_set = true;
}
i_this->mEnemyIce.mpActor = a_this;
i_this->mEnemyIce.mWallRadius = REG0_F(4) + 30.0f;
i_this->mEnemyIce.mCylHeight = REG0_F(5) + 30.0f;
i_this->mEnemyIce.mParticleScale = 0.5f;
i_this->mEnemyIce.mYOffset = 10.0f;
i_this->mEnemyFire.mpMcaMorf = i_this->mpMorf;
i_this->mEnemyFire.mpActor = a_this;
for (s32 i = 0; i < 10; i++) {
static s8 fire_j[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
static f32 fire_sc[] = { 1.0f, 0.8f, 0.7f, 0.6f, 0.5f, 1.0f, 0.8f, 0.7f, 0.6f, 0.5f };
i_this->mEnemyFire.mFlameJntIdxs[i] = fire_j[i];
i_this->mEnemyFire.mParticleScale[i] = fire_sc[i];
}
daKi_Execute(i_this);
}
return ret;
}
static actor_method_class l_daKi_Method = {
(process_method_func)daKi_Create,
(process_method_func)daKi_Delete,
(process_method_func)daKi_Execute,
(process_method_func)daKi_IsDelete,
(process_method_func)daKi_Draw,
};
actor_process_profile_definition g_profile_KI = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_KI,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(ki_class),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_KI,
/* Actor SubMtd */ &l_daKi_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ENEMY_e,
/* CullType */ fopAc_CULLBOX_0_e,
};