mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-23 22:45:05 -04:00
6ec6fce8cb
* Fix JUT_ASSERT to be a nested define * Switch names that appear in asserts to be constants instead of defines * Replace `0` in asserts with `NULL` or `FALSE` * Fix fpclassify * Fix ARRAY_SIZE * Use G_CM3D_F_INF * More fixes for fpclassify * Remove FLOAT_LABEL * Remove incorrect FLAG_ON macro * Remove UNK_BSS macro * Silence clangd unused header warning for PCH
1137 lines
34 KiB
C++
1137 lines
34 KiB
C++
/**
|
|
* @file d_a_e_dk.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_e_dk.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_s_play.h"
|
|
#include <cmath.h>
|
|
|
|
#define ACTION_MODE_WAIT 0
|
|
#define ACTION_MODE_CHASE 1
|
|
#define ACTION_MODE_ATTACK 2
|
|
#define ACTION_MODE_HURT 3
|
|
#define ACTION_MODE_DIE 4
|
|
|
|
enum E_DK_RES_FILE_ID {
|
|
/* BCK */
|
|
/* 0x06 */ BCK_DK_ATTACK = 6,
|
|
/* 0x07 */ BCK_DK_CHARGE,
|
|
/* 0x08 */ BCK_DK_C_ATTACK,
|
|
/* 0x09 */ BCK_DK_C_CHARGE,
|
|
/* 0x0A */ BCK_DK_C_DEAD,
|
|
/* 0x0B */ BCK_DK_C_GUARD,
|
|
/* 0x0C */ BCK_DK_C_WAIT,
|
|
/* 0x0D */ BCK_DK_GUARD,
|
|
/* 0x0E */ BCK_DK_SHELLDEAD,
|
|
/* 0x0F */ BCK_DK_WAIT,
|
|
|
|
/* BMDR */
|
|
/* 0x12 */ BMDR_DK = 0x12,
|
|
/* 0x13 */ BMDR_DK_CORE,
|
|
|
|
/* BRK */
|
|
/* 0x16 */ BRK_DK_ATTACK = 0x16,
|
|
/* 0x17 */ BRK_DK_WAIT,
|
|
|
|
/* BTK */
|
|
/* 0x1A */ BTK_DK_ATTACK = 0x1A,
|
|
/* 0x1B */ BTK_DK_WAIT,
|
|
};
|
|
|
|
|
|
static dCcD_SrcSph cc_dk_src = {
|
|
{ // mObjInf
|
|
{ 0x0, { { 0, 0, { 0 } }, { (s32)0xd8fbbddf, { 3 } }, { { 0x75 } } } }, // mObj
|
|
{ 0x09, 0, 0, 0, { 0 } }, // mGObjAt
|
|
{ 0x00, 0x00, 0x00, 0x00, { 5 } }, // mGObjTg
|
|
{ { 0 } }, // mGObjCo
|
|
},
|
|
{ { { 0.0f, 0.0f, 0.0f }, 40.0f, } } // mSphAttr
|
|
};
|
|
|
|
static dCcD_SrcSph cc_dk_at_src = {
|
|
{ // mObjInf
|
|
{ 0x0, { { 0x400, 2, { 0xc } }, { 0, { 0 } }, { { 0 } } } }, // mObj
|
|
{ 0x09, 0, 0, 0, { 0 } }, // mGObjAt
|
|
{ 0x00, 0x00, 0x00, 0x00, { 2 } }, // mGObjTg
|
|
{ { 0 } }, // mGObjCo
|
|
},
|
|
{ { { 0.0f, 0.0f, 0.0f }, 40.0f, } } // mSphAttr
|
|
};
|
|
|
|
static dCcD_SrcSph cc_dk_core_src = {
|
|
{ // mObjInf
|
|
{ 0x0, { { 0, 0, { 0 } }, { 0x4020, { 3 } }, { { 0 } } } }, // mObj
|
|
{ 0x09, 0, 0, 0, { 0 } }, // mGObjAt
|
|
{ 0x00, 0x00, 0x00, 0x00, { 2 } }, // mGObjTg
|
|
{ { 0 } }, // mGObjCo
|
|
},
|
|
{ { { 0.0f, 0.0f, 0.0f }, 40.0f, } } // mSphAttr
|
|
};
|
|
|
|
/* 806AA1EC-806AA228 0000EC 003C+00 1/1 0/0 0/0 .text __ct__12daE_DK_HIO_cFv */
|
|
daE_DK_HIO_c::daE_DK_HIO_c() {
|
|
field_0x4 = -1;
|
|
model_size = 2.0f;
|
|
player_detection_range = 700.0f;
|
|
field_0x10 = 1000.0f;
|
|
first_attack_range = 1000.0f;
|
|
}
|
|
|
|
static u32 const dk_brk_name[2] = { BRK_DK_WAIT, BRK_DK_ATTACK };
|
|
static u32 const dk_btk_name[2] = { BTK_DK_WAIT, BTK_DK_ATTACK };
|
|
|
|
/* 806AA228-806AA5A8 000128 0380+00 1/1 0/0 0/0 .text draw__8daE_DK_cFv */
|
|
int daE_DK_c::draw() {
|
|
J3DModel* model = mpMorfSO->getModel();
|
|
J3DModel* modelCore = mpCoreMorfSO->getModel();
|
|
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(modelCore, &tevStr);
|
|
|
|
J3DModelData* modelData = model->getModelData();
|
|
for (u16 i = 0; i < modelData->getMaterialNum(); i++) {
|
|
J3DMaterial* matNodePtr = modelData->getMaterialNodePointer(i);
|
|
if (i == 0) {
|
|
J3DBlend* blend = matNodePtr->getBlend();
|
|
if (this->field_0x692 != 0xff) {
|
|
blend->setType(1);
|
|
blend->setSrcFactor(4);
|
|
blend->setDstFactor(5);
|
|
matNodePtr->getZMode()->setUpdateEnable(0);
|
|
matNodePtr->setZCompLoc(0);
|
|
} else {
|
|
blend->setType(0);
|
|
blend->setSrcFactor(1);
|
|
blend->setDstFactor(0);
|
|
matNodePtr->getZMode()->setUpdateEnable(1);
|
|
matNodePtr->setZCompLoc(1);
|
|
}
|
|
matNodePtr->getTevKColor(3)->a = (u8)field_0x692;
|
|
} else {
|
|
matNodePtr->getTevKColor(3)->a = (u8)field_0x691;
|
|
}
|
|
}
|
|
|
|
mpBrkAnm[field_0x6a0]->entry(model->getModelData());
|
|
mpBtkAnm[field_0x6a0]->entry(model->getModelData());
|
|
|
|
mpMorfSO->entryDL();
|
|
|
|
if (field_0x6a1 == 0) {
|
|
mpCoreMorfSO->entryDL();
|
|
}
|
|
|
|
if (field_0x6a1 != 0) {
|
|
return 1;
|
|
}
|
|
|
|
cXyz shadowPos;
|
|
shadowPos.set(current.pos.x, current.pos.y + 100.0f, current.pos.z);
|
|
|
|
mShadowKey2 = dComIfGd_setShadow(mShadowKey2, 1, modelCore, &shadowPos, 700.0f + nREG_F(19),
|
|
0.0f, current.pos.y, this->mObjAcch.GetGroundH(), mObjAcch.m_gnd,
|
|
&tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
|
|
if (field_0x6a2 == 0) {
|
|
mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &shadowPos, 700.0f + nREG_F(19),
|
|
0.0f, current.pos.y, this->mObjAcch.GetGroundH(), mObjAcch.m_gnd,
|
|
&tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
} else {
|
|
shadowPos.set(field_0x670.x, field_0x670.y + 100.0f, field_0x670.z);
|
|
|
|
mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &shadowPos, 700.0f + nREG_F(19),
|
|
0.0f, field_0x670.y, this->mObjAcch.GetGroundH(), mObjAcch.m_gnd,
|
|
&tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 806AA5A8-806AA5C8 0004A8 0020+00 1/0 0/0 0/0 .text daE_DK_Draw__FP8daE_DK_c */
|
|
static int daE_DK_Draw(daE_DK_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 806AA5C8-806AA68C 0004C8 00C4+00 5/5 0/0 0/0 .text setBck__8daE_DK_cFiUcff */
|
|
void daE_DK_c::setBck(int i_resIndex, u8 i_attr, f32 i_morf, f32 i_rate) {
|
|
field_0x6a0 = 0;
|
|
if (i_resIndex == BCK_DK_CHARGE || i_resIndex == BCK_DK_ATTACK) {
|
|
field_0x6a0 = 1;
|
|
}
|
|
|
|
mpMorfSO->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_DK", i_resIndex),
|
|
i_attr, i_morf, i_rate, 0.0f, -1.0f);
|
|
}
|
|
|
|
/* 806AA68C-806AA730 00058C 00A4+00 5/5 0/0 0/0 .text setBckCore__8daE_DK_cFiUcff */
|
|
void daE_DK_c::setBckCore(int i_resIndex, u8 i_attr, f32 i_morf, f32 i_rate) {
|
|
mpCoreMorfSO->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_DK", i_resIndex),
|
|
i_attr, i_morf, i_rate, 0.0f, -1.0f);
|
|
}
|
|
|
|
/* 806AA730-806AA73C 000630 000C+00 6/6 0/0 0/0 .text setActionMode__8daE_DK_cFii */
|
|
void daE_DK_c::setActionMode(int i_actionMode, int i_moveMode) {
|
|
mActionMode = i_actionMode;
|
|
mMoveMode = i_moveMode;
|
|
}
|
|
|
|
/* 806AA73C-806AA8B0 00063C 0174+00 1/1 0/0 0/0 .text damage_check__8daE_DK_cFv */
|
|
void daE_DK_c::damage_check() {
|
|
if (field_0x694 == 0 && field_0x6a2 == 0) {
|
|
mStts.Move();
|
|
if (mSphere.ChkTgHit() != 0) {
|
|
field_0x694 = 10;
|
|
|
|
mAtInfo.mpCollider = mSphere.GetTgHitObj();
|
|
|
|
fopAc_ac_c* colliderActor = dCc_GetAc(mAtInfo.mpCollider->GetAc());
|
|
f32 xDiff = current.pos.x - colliderActor->current.pos.x;
|
|
f32 zDiff = current.pos.z - colliderActor->current.pos.z;
|
|
|
|
mAtInfo.mHitDirection.y = cM_atan2s(-xDiff, -zDiff);
|
|
if (field_0x6a3 == 0) {
|
|
if (mAtInfo.mpCollider->ChkAtType(0x10) != 0) {
|
|
setActionMode(3, 1);
|
|
} else {
|
|
setActionMode(3, 0);
|
|
}
|
|
}
|
|
|
|
mSphere.ClrTgHit();
|
|
}
|
|
if (mCoreSphere.ChkTgHit() != 0) {
|
|
mAtInfo.mpCollider = mCoreSphere.GetTgHitObj();
|
|
|
|
cc_at_check(this, &mAtInfo);
|
|
|
|
field_0x694 = 10;
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(0x20) != 0) {
|
|
setActionMode(4, 1);
|
|
} else {
|
|
if (field_0x6a3 == 0) {
|
|
setActionMode(4, 0);
|
|
}
|
|
}
|
|
|
|
mCoreSphere.ClrTgHit();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806AD7F8-806AD7FC 000008 0004+00 2/2 0/0 0/0 .bss None */
|
|
static u8 data_806AD7F8;
|
|
|
|
/* 806AD808-806AD820 000018 0018+00 9/9 0/0 0/0 .bss l_HIO */
|
|
static daE_DK_HIO_c l_HIO;
|
|
|
|
/* 806AA8B0-806AAB18 0007B0 0268+00 2/2 0/0 0/0 .text checkPlayerSearch__8daE_DK_cFv */
|
|
bool daE_DK_c::checkPlayerSearch() {
|
|
if (current.pos.abs(home.pos) > field_0x6a8) {
|
|
return 0;
|
|
}
|
|
|
|
if (daPy_getPlayerActorClass()->current.pos.abs(home.pos) > l_HIO.player_detection_range) {
|
|
return 0;
|
|
}
|
|
|
|
if (fopAcM_otherBgCheck(this, daPy_getPlayerActorClass()) != 0) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 806AAB18-806AAC24 000A18 010C+00 2/2 0/0 0/0 .text checkPlayerAttack__8daE_DK_cFf */
|
|
int daE_DK_c::checkPlayerAttack(f32 param_0) {
|
|
if (field_0x69c == 0) {
|
|
f32 dist = fopAcM_searchPlayerDistance(this);
|
|
if (field_0x690 == 0 && dist < l_HIO.first_attack_range) {
|
|
if (dist > 8.0f) {
|
|
setActionMode(2, 0);
|
|
field_0x690 = 2;
|
|
return 1;
|
|
} else if (dist < l_HIO.first_attack_range - 100.0f) {
|
|
field_0x690 = 1;
|
|
}
|
|
}
|
|
|
|
if (param_0 > 30.0f && param_0 < 60.0f && dist < 400.0f) {
|
|
setActionMode(2, 0);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 806AAC24-806AAD68 000B24 0144+00 1/1 0/0 0/0 .text checkWaterHeight__8daE_DK_cFv */
|
|
void daE_DK_c::checkWaterHeight() {
|
|
dBgS_ObjGndChk_Spl gndChk;
|
|
Vec gndChkPos;
|
|
if (mActionMode != ACTION_MODE_DIE) {
|
|
gndChkPos = current.pos;
|
|
gndChkPos.y += 1000.0f;
|
|
gndChk.SetPos(&gndChkPos);
|
|
field_0x6b8 = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
if (field_0x6b8 != -G_CM3D_F_INF && current.pos.y + 350.0f > field_0x6b8) {
|
|
current.pos.y = field_0x6b8 - 350.0f;
|
|
}
|
|
} else {
|
|
gndChkPos = field_0x670;
|
|
gndChkPos.y += 1000.0f;
|
|
gndChk.SetPos(&gndChkPos);
|
|
field_0x6b8 = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
if (field_0x6b8 != -G_CM3D_F_INF && field_0x670.y + 350.0f > field_0x6b8) {
|
|
field_0x670.y = field_0x6b8 - 350.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806AAD68-806AAE10 000C68 00A8+00 1/1 0/0 0/0 .text
|
|
* SphBgcCallBack__8daE_DK_cFP11dBgS_SphChkP10cBgD_Vtx_tiiiP8cM3dGPlaPv */
|
|
void daE_DK_c::SphBgcCallBack(dBgS_SphChk* param_0, cBgD_Vtx_t* param_1, int param_2,
|
|
int param_3, int param_4, cM3dGPla* param_5, void* param_6) {
|
|
fopAc_ac_c* actor = (fopAc_ac_c*)param_6;
|
|
f32 speedY = actor->speed.y;
|
|
if (!speedY) {
|
|
return;
|
|
}
|
|
|
|
s32 isOutsideRange = FALSE;
|
|
f32 unkFloat1 = (param_1[param_2].y + param_1[param_3].y + param_1[param_4].y) / 3.0f;
|
|
if (actor->speed.y < 0.0f) {
|
|
if (actor->current.pos.y + 150.0f + nREG_F(18) > unkFloat1) {
|
|
isOutsideRange = TRUE;
|
|
}
|
|
} else {
|
|
if (actor->current.pos.y + 150.0f + nREG_F(18) < unkFloat1) {
|
|
isOutsideRange = TRUE;
|
|
}
|
|
}
|
|
|
|
if (isOutsideRange) {
|
|
actor->speed.y = 0.0f;
|
|
actor->current.pos.y = actor->old.pos.y;
|
|
}
|
|
}
|
|
|
|
/* 806AAE10-806AB054 000D10 0244+00 1/1 0/0 0/0 .text setElectricEffect__8daE_DK_cFv */
|
|
void daE_DK_c::setElectricEffect() {
|
|
static u16 elect_effect_name[6] = {
|
|
0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3,
|
|
};
|
|
|
|
cXyz emitterPos(current.pos);
|
|
emitterPos.y += 100.0f;
|
|
cXyz emitterScale(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
csXyz emitterRot;
|
|
|
|
JPABaseEmitter* emitter;
|
|
|
|
u8 alpha = 0xff;
|
|
if (dKy_camera_water_in_status_check() == 0) {
|
|
alpha = 0x55;
|
|
}
|
|
|
|
for (s32 i = 0; i < 6; i++) {
|
|
emitterRot.set(0, 0, 0);
|
|
mElectricEffects[i] = dComIfGp_particle_set(mElectricEffects[i], elect_effect_name[i],
|
|
&emitterPos, &tevStr, &emitterRot, &emitterScale, alpha, 0, -1, 0, 0, 0);
|
|
if (i == 1 || i == 2 || i == 3) {
|
|
emitter = dComIfGp_particle_getEmitter(mElectricEffects[i]);
|
|
if (emitter != NULL) {
|
|
emitterRot.x = cM_rndFX(32768.0f);
|
|
emitterRot.y = cM_rndFX(32768.0f);
|
|
emitterRot.z = cM_rndFX(32768.0f);
|
|
emitter->setLocalRotation(*(JGeometry::TVec3<s16>*)&emitterRot);
|
|
}
|
|
}
|
|
}
|
|
|
|
mCreatureSound.startCreatureSoundLevel(Z2SE_EN_DK_ATTACK, 0, -1);
|
|
}
|
|
|
|
/* 806AB054-806AB158 000F54 0104+00 1/1 0/0 0/0 .text setCoreDeadEffect__8daE_DK_cFv */
|
|
void daE_DK_c::setCoreDeadEffect() {
|
|
cXyz emitterPos;
|
|
cXyz emitterScale(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
csXyz emitterRot(0, 0, 0);
|
|
|
|
u8 alpha = 0xff;
|
|
if (dKy_camera_water_in_status_check() == 0) {
|
|
alpha = 0x55;
|
|
}
|
|
|
|
J3DModel* model = mpCoreMorfSO->getModel();
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(1));
|
|
mDoMtx_stack_c::multVecZero(&emitterPos);
|
|
dComIfGp_particle_set(0x860c, &emitterPos, &tevStr, &emitterRot, &emitterScale, alpha, NULL,
|
|
-1, NULL, NULL, NULL);
|
|
}
|
|
|
|
/* 806AB158-806AB29C 001058 0144+00 1/1 0/0 0/0 .text setBodyDeadEffect__8daE_DK_cFv */
|
|
void daE_DK_c::setBodyDeadEffect() {
|
|
static u16 dead_effect_name[2] = {
|
|
0x860D,
|
|
0x860E,
|
|
};
|
|
|
|
cXyz emitterPos;
|
|
cXyz emitterScale(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
csXyz emitterRot(0, 0, 0);
|
|
|
|
u8 alpha = 0xff;
|
|
if (dKy_camera_water_in_status_check() == 0) {
|
|
alpha = 0x55;
|
|
}
|
|
|
|
for (s32 i = 0; i < 2; i++) {
|
|
mDeadEffects[i] = dComIfGp_particle_set(mDeadEffects[i], dead_effect_name[i], &emitterPos, &tevStr,
|
|
&emitterRot, &emitterScale, alpha, 0, -1, 0, 0, 0);
|
|
|
|
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mDeadEffects[i]);
|
|
if (emitter != NULL) {
|
|
emitter->setGlobalSRTMatrix(mpMorfSO->getModel()->getAnmMtx(1));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806AB29C-806AB684 00119C 03E8+00 1/1 0/0 0/0 .text executeWait__8daE_DK_cFv */
|
|
void daE_DK_c::executeWait() {
|
|
cXyz dirFromHome;
|
|
switch (mMoveMode) {
|
|
case 0: {
|
|
setBck(BCK_DK_WAIT, 2, 3.0f, 1.0f);
|
|
setBckCore(BCK_DK_C_WAIT, 2, 3.0f, 1.0f);
|
|
mMoveMode = 1;
|
|
break;
|
|
}
|
|
case 1: {
|
|
if (mpMorfSO->checkFrame(0.0f) != 0 || mpMorfSO->checkFrame(80.0f) != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_WAIT, 0, -1);
|
|
}
|
|
f32 fVar4 = mpMorfSO->getFrame();
|
|
if (mpMorfSO->checkFrame(70.0f) != 0 || mpMorfSO->checkFrame(150.0f) != 0) {
|
|
dirFromHome = current.pos - home.pos;
|
|
if (std::abs(dirFromHome.y) < 100.0f) {
|
|
field_0x6ac = 5.0f;
|
|
} else {
|
|
if (dirFromHome.y > 0.0f) {
|
|
field_0x6ac = 4.0f;
|
|
} else {
|
|
field_0x6ac = 6.0f;
|
|
}
|
|
}
|
|
if (dirFromHome.absXZ() < 200.0f) {
|
|
field_0x6b0 = 0;
|
|
} else {
|
|
field_0x6b0 = 3.0f + nREG_F(3);
|
|
}
|
|
|
|
current.angle.y = cLib_targetAngleY(¤t.pos, &home.pos);
|
|
}
|
|
if (fVar4 >= 80.0f) {
|
|
fVar4 -= 80.0f;
|
|
}
|
|
|
|
if (70.0f <= fVar4 || fVar4 <= 9.0f) {
|
|
cLib_chaseF(&speed.y, field_0x6ac, 1.0f);
|
|
} else if (fVar4 < 30.0f) {
|
|
cLib_chaseF(&speed.y, 0.0f, 0.2f);
|
|
} else if (fVar4 < 60.0f) {
|
|
cLib_chaseF(&speed.y, -5.0f, 0.3f);
|
|
} else {
|
|
cLib_chaseF(&speed.y, 0.0f, 0.2f);
|
|
}
|
|
|
|
if (fVar4 < 60.0f || fVar4 >= 70.0f) {
|
|
cLib_chaseF(&speedF, field_0x6b0, 0.2f);
|
|
} else {
|
|
cLib_chaseF(&speedF, 0.0f, 0.2f);
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 0x10, 0x100, 0x10);
|
|
|
|
if (checkPlayerSearch()) {
|
|
setActionMode(1, 0);
|
|
} else {
|
|
checkPlayerAttack(fVar4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806AB684-806ABA78 001584 03F4+00 1/1 0/0 0/0 .text executeChase__8daE_DK_cFv */
|
|
void daE_DK_c::executeChase() {
|
|
cXyz dirFromHome;
|
|
switch (mMoveMode) {
|
|
case 0: {
|
|
setBck(BCK_DK_WAIT, 2, 3.0f, 1.0f);
|
|
setBckCore(BCK_DK_C_WAIT, 2, 3.0f, 1.0f);
|
|
mMoveMode = 1;
|
|
break;
|
|
}
|
|
case 1: {
|
|
if (mpMorfSO->checkFrame(0.0f) != 0 || mpMorfSO->checkFrame(80.0f) != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_WAIT, 0, -1);
|
|
}
|
|
f32 fVar4 = mpMorfSO->getFrame();
|
|
if (mpMorfSO->checkFrame(70.0f) != 0 || mpMorfSO->checkFrame(150.0f) != 0) {
|
|
dirFromHome = current.pos - daPy_getPlayerActorClass()->current.pos;
|
|
if (std::abs(dirFromHome.y) < 50.0f) {
|
|
field_0x6ac = 5.0f;
|
|
} else {
|
|
if (dirFromHome.y > 0.0f) {
|
|
field_0x6ac = 4.0f;
|
|
} else {
|
|
field_0x6ac = 6.0f;
|
|
}
|
|
}
|
|
if (dirFromHome.absXZ() < 200.0f) {
|
|
field_0x6b0 = 0;
|
|
} else {
|
|
field_0x6b0 = 3.0f + nREG_F(3);
|
|
}
|
|
|
|
current.angle.y = fopAcM_searchActorAngleY(this, daPy_getPlayerActorClass());
|
|
}
|
|
if (fVar4 >= 80.0f) {
|
|
fVar4 -= 80.0f;
|
|
}
|
|
|
|
if (70.0f <= fVar4 || fVar4 <= 9.0f) {
|
|
cLib_chaseF(&speed.y, field_0x6ac, 1.0f);
|
|
} else if (fVar4 < 30.0f) {
|
|
cLib_chaseF(&speed.y, 0.0f, 0.2f);
|
|
} else if (fVar4 < 60.0f) {
|
|
cLib_chaseF(&speed.y, -5.0f, 0.3f);
|
|
} else {
|
|
cLib_chaseF(&speed.y, 0.0f, 0.2f);
|
|
}
|
|
|
|
if (fVar4 < 60.0f || fVar4 >= 70.0f) {
|
|
cLib_chaseF(&speedF, field_0x6b0, 0.2f);
|
|
} else {
|
|
cLib_chaseF(&speedF, 0.0f, 0.2f);
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 0x10, 0x100, 0x10);
|
|
|
|
if (!checkPlayerSearch()) {
|
|
setActionMode(0, 0);
|
|
} else {
|
|
checkPlayerAttack(fVar4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806ABA78-806ABCC8 001978 0250+00 1/1 0/0 0/0 .text executeAttack__8daE_DK_cFv */
|
|
void daE_DK_c::executeAttack() {
|
|
switch (mMoveMode) {
|
|
case 0: {
|
|
setBck(BCK_DK_CHARGE, 2, 6.0f, 2.0f);
|
|
setBckCore(BCK_DK_C_CHARGE, 2, 3.0f, 2.0f);
|
|
field_0x698 = 45 + nREG_S(9);
|
|
mMoveMode = 1;
|
|
break;
|
|
}
|
|
case 1: {
|
|
if (mpMorfSO->checkFrame(14.0f) != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_CHARGE, 0, -1);
|
|
}
|
|
cLib_chaseF(&speed.y, -3.0f, 0.2f);
|
|
cLib_chaseF(&speedF, 0.0f, 0.2f);
|
|
if (field_0x698 == 0) {
|
|
setBck(BCK_DK_ATTACK, 2, 3.0f, 1.0f);
|
|
setBckCore(BCK_DK_C_ATTACK, 2, 3.0f, 1.0f);
|
|
field_0x698 = 100;
|
|
mMoveMode = 2;
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
case 3: {
|
|
cLib_chaseF(&speed.y, 0.0, 0.2f);
|
|
cLib_chaseF(&speedF, 0.0, 0.2f);
|
|
mAtSphere.OnAtSetBit();
|
|
mAtSphere.SetTgSpl(1);
|
|
mAtSphere.SetAtMtrl(5);
|
|
mSphere.SetTgSpl(1);
|
|
mCoreSphere.SetTgSpl(1);
|
|
setElectricEffect();
|
|
field_0x6a3 = 1;
|
|
fopAcM_OffStatus(this, 0x80000);
|
|
if (mMoveMode == 2) {
|
|
if (field_0x698 == 0) {
|
|
field_0x69c = 150;
|
|
setActionMode(1, 0);
|
|
}
|
|
if (daPy_getPlayerActorClass()->checkElecDamage() != 0) {
|
|
mMoveMode = 3;
|
|
}
|
|
} else {
|
|
if (daPy_getPlayerActorClass()->checkElecDamage() == 0) {
|
|
field_0x69c = 150;
|
|
setActionMode(1, 0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806ABCC8-806ABE3C 001BC8 0174+00 1/1 0/0 0/0 .text executeDamage__8daE_DK_cFv */
|
|
void daE_DK_c::executeDamage() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
case 1: {
|
|
if (mMoveMode == 0) {
|
|
speedF = 8.0f + nREG_F(5);
|
|
} else {
|
|
speedF = 8.0f + nREG_F(5);
|
|
}
|
|
|
|
shape_angle.x = 0xf000;
|
|
|
|
setBck(BCK_DK_GUARD, 0, 3.0f, 1.0f);
|
|
setBckCore(BCK_DK_C_GUARD, 0, 3.0f, 1.0f);
|
|
|
|
shape_angle.y = mAtInfo.mHitDirection.y;
|
|
current.angle.y = mAtInfo.mHitDirection.y + 0x8000;
|
|
|
|
mMoveMode = 2;
|
|
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_GUARD, 0, -1);
|
|
|
|
break;
|
|
}
|
|
case 2: {
|
|
cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x100, 0x10);
|
|
|
|
cLib_chaseF(&speed.y, 0.0, 0.2f);
|
|
cLib_chaseF(&speedF, 0.0, 0.2f);
|
|
|
|
if (mpMorfSO->isStop() != 0) {
|
|
shape_angle.x = 0;
|
|
setActionMode(1, 0);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806ABE3C-806ABF6C 001D3C 0130+00 1/1 0/0 0/0 .text BodyDeathMove__8daE_DK_cFv */
|
|
void daE_DK_c::BodyDeathMove() {
|
|
cLib_chaseF(&field_0x6ac, -2.0f, 0.2f);
|
|
cLib_chaseF(&field_0x6b0, 0.0f, 0.2f);
|
|
|
|
field_0x670.x += field_0x6b0 * cM_ssin(field_0x68c);
|
|
field_0x670.y += field_0x6ac;
|
|
field_0x670.z += field_0x6b0 * cM_scos(field_0x68c);
|
|
|
|
dBgS_GndChk gndChk;
|
|
|
|
cXyz gndChkPos(field_0x670);
|
|
gndChkPos.y += 100.0f;
|
|
gndChk.SetPos(&gndChkPos);
|
|
|
|
f32 crossY = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
if (field_0x670.y + 50.0f < crossY) {
|
|
field_0x6ac = 0;
|
|
field_0x670.y = crossY - 50.0f;
|
|
}
|
|
}
|
|
|
|
/* 806ABF6C-806AC390 001E6C 0424+00 1/1 0/0 0/0 .text executeDeath__8daE_DK_cFv */
|
|
void daE_DK_c::executeDeath() {
|
|
cXyz itemPos;
|
|
switch (mMoveMode) {
|
|
case 0: {
|
|
setCoreDeadEffect();
|
|
}
|
|
case 1: {
|
|
setBodyDeadEffect();
|
|
|
|
setBck(BCK_DK_SHELLDEAD, 0, 3.0f, 0.0f);
|
|
setBckCore(BCK_DK_C_DEAD, 0, 3.0f, 0.0f);
|
|
|
|
field_0x6a2 = 1;
|
|
|
|
field_0x670 = current.pos;
|
|
|
|
field_0x6b4 = 100.0f;
|
|
|
|
mSphere.OffCoSetBit();
|
|
mSphere.OffTgSetBit();
|
|
mCoreSphere.OffTgSetBit();
|
|
fopAcM_OffStatus(this, 0x100);
|
|
|
|
field_0x68e = 0;
|
|
|
|
attention_info.flags = 0;
|
|
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_PULLOUT, 0, -1);
|
|
|
|
if (mMoveMode == 0) {
|
|
field_0x68c = mAtInfo.mHitDirection.y + 0x8000;
|
|
|
|
field_0x6b0 = 3.0f;
|
|
field_0x6ac = 5.0f;
|
|
} else {
|
|
field_0x68c = mAtInfo.mHitDirection.y + 0x8000;
|
|
|
|
field_0x6b0 = 5.0f;
|
|
field_0x6ac = 7.0f;
|
|
|
|
current.angle.y = mAtInfo.mHitDirection.y + 0x8000;
|
|
|
|
speedF = 10.0f;
|
|
speed.y = 5.0f;
|
|
|
|
field_0x68e = 0x1000;
|
|
}
|
|
mMoveMode = 2;
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_DK_BUBBLE, 0, -1);
|
|
|
|
break;
|
|
}
|
|
case 2: {
|
|
setBodyDeadEffect();
|
|
|
|
shape_angle.y += field_0x68e;
|
|
shape_angle.x += field_0x68e;
|
|
|
|
if (mObjAcch.ChkGroundHit()) {
|
|
cLib_chaseAngleS(&field_0x68e, 0, 0x40);
|
|
} else {
|
|
cLib_chaseAngleS(&field_0x68e, 0x100, 0x40);
|
|
}
|
|
|
|
BodyDeathMove();
|
|
|
|
if (fopAcM_CheckStatus(this, 0x100000) == 0) {
|
|
mMoveMode = 3;
|
|
|
|
mpMorfSO->setPlaySpeed(1.0f);
|
|
mpCoreMorfSO->setPlaySpeed(1.0f);
|
|
|
|
current.pos.y += 125.0f;
|
|
|
|
field_0x6b4 = -25.0f + nREG_F(7);
|
|
|
|
field_0x68e = 0x800;
|
|
field_0x69c = 30;
|
|
field_0x698 = 100;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 3: {
|
|
setBodyDeadEffect();
|
|
|
|
if (field_0x69c != 0) {
|
|
shape_angle.y += field_0x68e;
|
|
shape_angle.x += field_0x68e;
|
|
|
|
if (mObjAcch.ChkGroundHit()) {
|
|
cLib_chaseAngleS(&field_0x68e, 0, 0x40);
|
|
} else {
|
|
cLib_chaseAngleS(&field_0x68e, 0x100, 0x40);
|
|
}
|
|
|
|
cLib_chaseF(&speed.y, -2.0f + nREG_F(8), 0.2f);
|
|
cLib_chaseF(&speedF, 0.0f, 0.2f);
|
|
|
|
if (field_0x69c == 1) {
|
|
itemPos.set(current.pos.x, current.pos.y + 90.0f, current.pos.z);
|
|
|
|
fopAcM_createItem(&itemPos, 0, -1, -1, 0, NULL, 0);
|
|
fopAcM_createDisappear(this, &itemPos, 5, 0, 0x16);
|
|
|
|
field_0x6a1 = 1;
|
|
}
|
|
}
|
|
BodyDeathMove();
|
|
if (mpMorfSO->isStop() == 0) {
|
|
cLib_chaseUC(&field_0x691, 120.0f - mpMorfSO->getFrame(), 2);
|
|
cLib_chaseUC(&field_0x692, field_0x691, 3);
|
|
} else {
|
|
cLib_chaseUC(&field_0x691, 0, 2);
|
|
cLib_chaseUC(&field_0x692, field_0x691, 3);
|
|
|
|
if (field_0x691 == 0) {
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806AC390-806AC5BC 002290 022C+00 1/1 0/0 0/0 .text action__8daE_DK_cFv */
|
|
void daE_DK_c::action() {
|
|
checkWaterHeight();
|
|
|
|
mAtSphere.OffAtSetBit();
|
|
|
|
damage_check();
|
|
|
|
fopAcM_OnStatus(this, 0x80000);
|
|
|
|
if (fopAcM_searchPlayerDistance(this) > l_HIO.first_attack_range) {
|
|
field_0x690 = 0x0;
|
|
}
|
|
|
|
mAtSphere.SetTgSpl(0);
|
|
mAtSphere.SetAtMtrl(0);
|
|
mSphere.SetTgSpl(0);
|
|
mCoreSphere.SetTgSpl(0);
|
|
|
|
field_0x6a3 = 0;
|
|
|
|
s32 isFocusedOnPlayer = FALSE;
|
|
|
|
switch (mActionMode) {
|
|
case ACTION_MODE_WAIT:
|
|
executeWait();
|
|
break;
|
|
case ACTION_MODE_CHASE:
|
|
isFocusedOnPlayer = TRUE;
|
|
executeChase();
|
|
break;
|
|
case ACTION_MODE_ATTACK:
|
|
isFocusedOnPlayer = TRUE;
|
|
executeAttack();
|
|
break;
|
|
case ACTION_MODE_HURT:
|
|
isFocusedOnPlayer = TRUE;
|
|
executeDamage();
|
|
break;
|
|
case ACTION_MODE_DIE:
|
|
executeDeath();
|
|
break;
|
|
}
|
|
|
|
mCreatureSound.setLinkSearch(isFocusedOnPlayer);
|
|
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
|
|
mObjAcch.CrrPos(dComIfG_Bgsp());
|
|
|
|
if (!mObjAcch.ChkWallHit() && speed.y) {
|
|
cXyz collCenter(current.pos);
|
|
collCenter.y += 150.0f + nREG_F(18);
|
|
mSphereChk.SetC(collCenter);
|
|
mSphereChk.SetR(150.0f + nREG_F(19));
|
|
mSphereChk.SetCallback(SphBgcCallBack);
|
|
dComIfG_Bgsp().SphChk(&mSphereChk, this);
|
|
}
|
|
|
|
mpBrkAnm[field_0x6a0]->play();
|
|
mpBtkAnm[field_0x6a0]->play();
|
|
|
|
mpMorfSO->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
mpCoreMorfSO->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
|
|
/* 806AC5BC-806AC754 0024BC 0198+00 1/1 0/0 0/0 .text mtx_set__8daE_DK_cFv */
|
|
void daE_DK_c::mtx_set() {
|
|
if (field_0x6a2 == 0) {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 100.0f, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
} else {
|
|
mDoMtx_stack_c::transS(field_0x670.x, field_0x670.y + 100.0f, field_0x670.z);
|
|
}
|
|
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
|
|
J3DModel* model = mpMorfSO->getModel();
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpMorfSO->modelCalc();
|
|
|
|
if (!field_0x6a2) {
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(14));
|
|
mDoMtx_stack_c::transS(mDoMtx_stack_c::get()[0][3], mDoMtx_stack_c::get()[1][3],
|
|
mDoMtx_stack_c::get()[2][3]);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::transM(0.0f, -50.0f + nREG_F(17), 0.0f);
|
|
} else {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + field_0x6b4, current.pos.z);
|
|
mDoMtx_stack_c::transM(0.0f, 90.0f, 0.0f);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::transM(0.0f, -90.0f, 0.0f);
|
|
}
|
|
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
|
|
mpCoreMorfSO->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpCoreMorfSO->modelCalc();
|
|
}
|
|
|
|
/* 806AC754-806AC968 002654 0214+00 1/1 0/0 0/0 .text cc_set__8daE_DK_cFv */
|
|
void daE_DK_c::cc_set() {
|
|
cXyz sphCenter;
|
|
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(14));
|
|
mDoMtx_stack_c::transS(mDoMtx_stack_c::get()[0][3], mDoMtx_stack_c::get()[1][3],
|
|
mDoMtx_stack_c::get()[2][3]);
|
|
|
|
mDoMtx_stack_c::multVecZero(&eyePos);
|
|
eyePos.y += 60.0f + nREG_F(14);
|
|
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += 100.0f + nREG_F(15);
|
|
|
|
if (field_0x6a2 == 0) {
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(0));
|
|
mDoMtx_stack_c::transM(nREG_F(10), 40.0f + nREG_F(0xb), nREG_F(0xc));
|
|
mDoMtx_stack_c::multVecZero(&sphCenter);
|
|
mSphere.SetC(sphCenter);
|
|
mSphere.SetR(90.0f + nREG_F(13));
|
|
dComIfG_Ccsp()->Set(&mSphere);
|
|
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(0));
|
|
mDoMtx_stack_c::transM(0.0f, 20.0f + nREG_F(16), 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sphCenter);
|
|
mAtSphere.SetC(sphCenter);
|
|
mAtSphere.SetR(160.0f + nREG_F(14));
|
|
dComIfG_Ccsp()->Set(&mAtSphere);
|
|
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(0));
|
|
mDoMtx_stack_c::transM(0.0f, 50.0f + nREG_F(16), 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sphCenter);
|
|
mCoreSphere.SetC(sphCenter);
|
|
mCoreSphere.SetR(70.0f + nREG_F(15));
|
|
dComIfG_Ccsp()->Set(&mCoreSphere);
|
|
}
|
|
}
|
|
|
|
/* 806AC968-806AC9E8 002868 0080+00 1/1 0/0 0/0 .text execute__8daE_DK_cFv */
|
|
int daE_DK_c::execute() {
|
|
if (field_0x698 != 0) {
|
|
field_0x698--;
|
|
}
|
|
if (field_0x69c != 0) {
|
|
field_0x69c--;
|
|
}
|
|
if (field_0x694) {
|
|
field_0x694--;
|
|
}
|
|
|
|
action();
|
|
mtx_set();
|
|
cc_set();
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 806AC9E8-806ACA08 0028E8 0020+00 2/1 0/0 0/0 .text daE_DK_Execute__FP8daE_DK_c */
|
|
static int daE_DK_Execute(daE_DK_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 806ACA08-806ACA10 002908 0008+00 1/0 0/0 0/0 .text daE_DK_IsDelete__FP8daE_DK_c */
|
|
static int daE_DK_IsDelete(daE_DK_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 806ACA10-806ACA84 002910 0074+00 1/1 0/0 0/0 .text _delete__8daE_DK_cFv */
|
|
int daE_DK_c::_delete() {
|
|
dComIfG_resDelete(&mPhaseReq, "E_DK");
|
|
|
|
if (mHIOInit != 0) {
|
|
data_806AD7F8 = 0;
|
|
mDoHIO_DELETE_CHILD(data_806AD7F8);
|
|
}
|
|
|
|
if (heap != NULL) {
|
|
mCreatureSound.deleteObject();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 806ACA84-806ACAA4 002984 0020+00 1/0 0/0 0/0 .text daE_DK_Delete__FP8daE_DK_c */
|
|
static int daE_DK_Delete(daE_DK_c* i_this) {
|
|
fpc_ProcID unusedId = fopAcM_GetID(i_this); // debug match
|
|
return i_this->_delete();
|
|
}
|
|
|
|
/* 806ACAA4-806ACDAC 0029A4 0308+00 1/1 0/0 0/0 .text CreateHeap__8daE_DK_cFv */
|
|
int daE_DK_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_DK", BMDR_DK);
|
|
JUT_ASSERT(1488, modelData != NULL);
|
|
mpMorfSO = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("E_DK", BCK_DK_WAIT), 0, 1.0f, 0,
|
|
-1, &mCreatureSound, 0x80000, 0x31000284);
|
|
|
|
if (mpMorfSO == NULL || mpMorfSO->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
for (s32 i = 0; i < 2; i++) {
|
|
mpBrkAnm[i] = new mDoExt_brkAnm();
|
|
if (mpBrkAnm[i] == 0) {
|
|
return 0;
|
|
}
|
|
|
|
J3DAnmTevRegKey* tevKey = (J3DAnmTevRegKey*)dComIfG_getObjectRes("E_DK", dk_brk_name[i]);
|
|
if (mpBrkAnm[i]->init(mpMorfSO->getModel()->getModelData(), tevKey,
|
|
1, 2, 1.0f, 0, -1) == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
mpBtkAnm[i] = new mDoExt_btkAnm();
|
|
if (mpBtkAnm[i] == 0) {
|
|
return 0;
|
|
}
|
|
|
|
J3DAnmTextureSRTKey* texKey =
|
|
(J3DAnmTextureSRTKey*)dComIfG_getObjectRes("E_DK", dk_btk_name[i]);
|
|
if (mpBtkAnm[i]->init(mpMorfSO->getModel()->getModelData(), texKey,
|
|
1, 2, 1.0f, 0, -1) == 0) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("E_DK", BMDR_DK_CORE);
|
|
JUT_ASSERT(1537, modelData != NULL);
|
|
mpCoreMorfSO = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("E_DK", BCK_DK_C_WAIT), 0,
|
|
1.0f, 0, -1, &mCreatureSound, 0x80000, 0x11000084);
|
|
|
|
if (mpCoreMorfSO == NULL || mpCoreMorfSO->getModel() == NULL) {
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
/* 806ACDF4-806ACE14 002CF4 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
daE_DK_c* dk = (daE_DK_c*)i_this;
|
|
return dk->CreateHeap();
|
|
}
|
|
|
|
/* 806ACE14-806AD0AC 002D14 0298+00 1/1 0/0 0/0 .text create__8daE_DK_cFv */
|
|
int daE_DK_c::create() {
|
|
fopAcM_SetupActor(this, daE_DK_c);
|
|
|
|
s32 loadRes = dComIfG_resLoad(&mPhaseReq, "E_DK");
|
|
if (loadRes == cPhs_COMPLEATE_e) {
|
|
OS_REPORT("E_DK PARAM %x\n", fopAcM_GetParam(this));
|
|
field_0x6a4 = fopAcM_GetParam(this);
|
|
|
|
if (field_0x6a4 != 0xff) {
|
|
if (dComIfGs_isSwitch(field_0x6a4, fopAcM_GetRoomNo(this)) != 0) {
|
|
OS_REPORT("E_DK やられ後なので再セットしません\n");
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
u8 param_1 = fopAcM_GetParam(this) >> 8 & 0xff;
|
|
if (param_1 == 0xff) {
|
|
field_0x6a8 = 1000.0f;
|
|
} else {
|
|
field_0x6a8 = param_1 * 100.0f;
|
|
if (field_0x6a8 < 500.0f) {
|
|
field_0x6a8 = 500.0f;
|
|
}
|
|
}
|
|
|
|
if (fopAcM_entrySolidHeap(this, useHeapInit, 0x2520) == 0) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (data_806AD7F8 == 0) {
|
|
data_806AD7F8 = 1;
|
|
this->mHIOInit = 1;
|
|
l_HIO.field_0x4 = mDoHIO_CREATE_CHILD("", &l_HIO);
|
|
}
|
|
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
fopAcM_SetMtx(this, mpMorfSO->getModel()->getBaseTRMtx());
|
|
fopAcM_SetMin(this, -200.0, -200.0, -200.0);
|
|
fopAcM_SetMax(this, 200.0, 200.0, 200.0);
|
|
|
|
mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir,
|
|
fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
|
|
mAcchCir.SetWall(150.0f + nREG_F(0x12), 150.0f + nREG_F(0x13));
|
|
|
|
field_0x560 = health = 100;
|
|
|
|
mStts.Init(100, 0, this);
|
|
mSphere.Set(cc_dk_src);
|
|
mSphere.SetStts(&mStts);
|
|
|
|
mAtSphere.Set(cc_dk_at_src);
|
|
mAtSphere.SetStts(&mStts);
|
|
|
|
mCoreSphere.Set(cc_dk_core_src);
|
|
mCoreSphere.SetStts(&mStts);
|
|
|
|
mCreatureSound.init(¤t.pos, &eyePos, 3, 1);
|
|
mCreatureSound.setEnemyName("E_dk");
|
|
|
|
mAtInfo.mpSound = &mCreatureSound;
|
|
|
|
mAtInfo.mPowerType = 0x1;
|
|
|
|
field_0x691 = 0x96;
|
|
field_0x692 = 0xff;
|
|
|
|
onWolfNoLock();
|
|
|
|
daE_DK_Execute(this);
|
|
}
|
|
return loadRes;
|
|
}
|
|
|
|
/* 806AD0AC-806AD25C 002FAC 01B0+00 1/1 0/0 0/0 .text __ct__8daE_DK_cFv */
|
|
daE_DK_c::daE_DK_c() {
|
|
}
|
|
|
|
/* 806AD428-806AD448 003328 0020+00 1/0 0/0 0/0 .text daE_DK_Create__FP8daE_DK_c */
|
|
static int daE_DK_Create(daE_DK_c* i_this) {
|
|
return i_this->create();
|
|
}
|
|
|
|
/* 806AD724-806AD744 -00001 0020+00 1/0 0/0 0/0 .data l_daE_DK_Method */
|
|
static actor_method_class l_daE_DK_Method = {
|
|
(process_method_func)daE_DK_Create,
|
|
(process_method_func)daE_DK_Delete,
|
|
(process_method_func)daE_DK_Execute,
|
|
(process_method_func)daE_DK_IsDelete,
|
|
(process_method_func)daE_DK_Draw,
|
|
};
|
|
|
|
/* 806AD744-806AD774 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_DK */
|
|
extern actor_process_profile_definition g_profile_E_DK = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_E_DK, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daE_DK_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
755, // mPriority
|
|
&l_daE_DK_Method, // sub_method
|
|
0x000C0100, // mStatus
|
|
fopAc_ENEMY_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|