mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-26 15:24:30 -04:00
1621 lines
44 KiB
C++
1621 lines
44 KiB
C++
/**
|
|
* @file d_a_e_hm.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_e_hm.h"
|
|
#include "d/d_cc_uty.h"
|
|
#include "f_op/f_op_actor_enemy.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
|
|
class daE_HM_HIO_c : public JORReflexible {
|
|
public:
|
|
daE_HM_HIO_c();
|
|
virtual ~daE_HM_HIO_c() {}
|
|
|
|
#if DEBUG
|
|
void genMessage(JORMContext* ctx);
|
|
#endif
|
|
|
|
s8 field_0x04;
|
|
f32 searchArea;
|
|
f32 flyDirSpeed;
|
|
f32 flyDirYSpeed;
|
|
f32 gravity;
|
|
f32 attackRange;
|
|
f32 galeStunTime;
|
|
};
|
|
|
|
daE_HM_HIO_c::daE_HM_HIO_c() {
|
|
field_0x04 = -1;
|
|
searchArea = 600.0f;
|
|
flyDirSpeed = -16.0f;
|
|
flyDirYSpeed = 44.0f;
|
|
gravity = -9.0f;
|
|
attackRange = 1.1f;
|
|
galeStunTime = 0.0f;
|
|
}
|
|
|
|
|
|
#if DEBUG
|
|
void daE_HM_HIO_c::genMessage(JORMContext* ctx) {
|
|
// "Himekuji"
|
|
// appears to be a portmanteau - "ヒメ" = small (prefix), "ナメクジ" = slug)
|
|
ctx->genLabel("ヒメクジ", 0x80000001);
|
|
ctx->genSlider("サーチエリア", &searchArea, 0.0f, 2000.0f);
|
|
ctx->genSlider("飛ばし方向スピード", &flyDirSpeed, 0.0f, -100.0f);
|
|
ctx->genSlider("飛ばし方向Yスピード", &flyDirYSpeed, 0.0f, 100.0f);
|
|
ctx->genSlider("重力設定", &gravity, 0.0f, -20.0f);
|
|
ctx->genSlider("攻撃範囲", &attackRange, -1.0f, 20.0f);
|
|
ctx->genSlider("疾風受け時間", &galeStunTime, 0.0f, 1000.0f);
|
|
}
|
|
#endif
|
|
|
|
int daE_HM_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_HM", 17);
|
|
JUT_ASSERT(0xbf, modelData != NULL);
|
|
mAnm_p = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("E_HM", 13), 2, 1.0f, 0, -1, &mSound,
|
|
0x80000, 0x11000284);
|
|
if (mAnm_p == NULL || mAnm_p->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
J3DModel* model = mAnm_p->getModel();
|
|
|
|
mpBrkAnm = new mDoExt_brkAnm();
|
|
if (mpBrkAnm == NULL) {
|
|
return 0;
|
|
}
|
|
if (!mpBrkAnm->init(model->getModelData(),
|
|
(J3DAnmTevRegKey*)dComIfG_getObjectRes("E_HM", 20), 1, 2, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
mpBtkAnm = new mDoExt_btkAnm();
|
|
if (mpBtkAnm == NULL) {
|
|
return 0;
|
|
}
|
|
if (!mpBtkAnm->init(model->getModelData(),
|
|
(J3DAnmTextureSRTKey*)dComIfG_getObjectRes("E_HM", 23), 1, 2, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
daE_HM_c* hm = (daE_HM_c*)i_this;
|
|
return hm->CreateHeap();
|
|
}
|
|
|
|
void daE_HM_c::initCcCylinder() {
|
|
static const dCcD_SrcSph ccShpSrc = {
|
|
{
|
|
{0x0, {{0x2, 0x1, 0xd}, {(s32)0xD8FBFDFF, 0x43}, 0x75}}, // mObj
|
|
{dCcD_SE_STONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 50.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
if (field_0x5d2 == 2) {
|
|
mStts.Init(0x68,0,this);
|
|
} else {
|
|
mStts.Init(0xfe,0,this);
|
|
}
|
|
|
|
mSph.Set(ccShpSrc);
|
|
mSph.SetStts(&mStts);
|
|
mSph.SetC(current.pos);
|
|
mSph.SetAtMtrl(1);
|
|
}
|
|
|
|
void daE_HM_c::setCcCylinder() {
|
|
cXyz unkXyz1;
|
|
switch (field_0x5d2) {
|
|
case 1:
|
|
unkXyz1.set(current.pos.x, current.pos.y + 50.0f, current.pos.z);
|
|
mSph.SetC(unkXyz1);
|
|
mSph.SetR(field_0x5b0);
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
break;
|
|
case 2:
|
|
mSph.SetC(current.pos);
|
|
mSph.SetR(field_0x5b0);
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
break;
|
|
case 3:
|
|
unkXyz1.set(current.pos.x, current.pos.y, current.pos.z);
|
|
if (field_0x5d4 == 3) {
|
|
unkXyz1.y += 50.0f;
|
|
}
|
|
mSph.SetC(unkXyz1);
|
|
mSph.SetR(field_0x5b0);
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static int other_bg_check(daE_HM_c* i_this, fopAc_ac_c* i_other) {
|
|
daE_HM_c* hm = (daE_HM_c*)i_this;
|
|
|
|
dBgS_LinChk linChk;
|
|
|
|
cXyz unusedXyz1;
|
|
cXyz curPosWithOff;
|
|
cXyz otherPosWithOff;
|
|
otherPosWithOff = i_other->current.pos;
|
|
otherPosWithOff.y += 100.0f;
|
|
curPosWithOff = hm->current.pos;
|
|
curPosWithOff.y += 100.0f;
|
|
|
|
linChk.Set(&curPosWithOff, &otherPosWithOff, hm);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int daE_HM_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
|
|
J3DJoint* joint = i_joint;
|
|
u32 jointNo = joint->getJntNo();
|
|
mDoMtx_stack_c::copy(i_model->getAnmMtx(jointNo));
|
|
|
|
if (field_0x5d2 == 1) {
|
|
switch (jointNo) {
|
|
case 1:
|
|
mDoMtx_stack_c::YrotM(((f32)field_0x5c0 * ((f32)(s32)nREG_S(1) + 6.0f)));
|
|
break;
|
|
case 4:
|
|
mDoMtx_stack_c::YrotM(((f32)field_0x5c0 * ((f32)(s32)nREG_S(2) + 6.0f)));
|
|
break;
|
|
case 5:
|
|
mDoMtx_stack_c::YrotM(((f32)field_0x5c0 * ((f32)(s32)nREG_S(3) + -8.0f)));
|
|
break;
|
|
case 6:
|
|
mDoMtx_stack_c::YrotM(((f32)field_0x5c0 * ((f32)(s32)nREG_S(4) + -9.0f)));
|
|
break;
|
|
case 7:
|
|
mDoMtx_stack_c::YrotM(
|
|
((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(5) + -13.0f)));
|
|
break;
|
|
case 8:
|
|
mDoMtx_stack_c::YrotM(
|
|
((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(6) + -14.0f)));
|
|
}
|
|
} else if (field_0x5d2 == 2) {
|
|
switch (jointNo) {
|
|
case 1:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(1) + 6.0f)));
|
|
break;
|
|
case 4:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(2) + 6.0f)));
|
|
break;
|
|
case 5:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(3) + -4.0f)));
|
|
break;
|
|
case 6:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(4) + -5.0f)));
|
|
break;
|
|
case 7:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(5) + -11.0f)));
|
|
break;
|
|
case 8:
|
|
mDoMtx_stack_c::YrotM(((f32)(s32)field_0x5c0 * ((f32)(s32)nREG_S(6) + -12.0f)));
|
|
}
|
|
}
|
|
|
|
i_model->setAnmMtx(jointNo, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int JointCallBack(J3DJoint* i_joint, int param_1) {
|
|
if (param_1 == 0) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daE_HM_c* hm = (daE_HM_c*)model->getUserArea();
|
|
if (hm != NULL) {
|
|
hm->ctrlJoint(i_joint, model);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void daE_HM_c::Particle_Set(u32& param_0, u16 param_1) {
|
|
param_0 = dComIfGp_particle_set(param_0, param_1, ¤t.pos, &tevStr, &shape_angle,
|
|
&field_0x5e8, 0xff, 0, -1, 0, 0, 0);
|
|
|
|
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(param_0);
|
|
if (emitter != NULL) {
|
|
emitter->setGlobalSRTMatrix(mAnm_p->getModel()->getAnmMtx(4));
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::SetAnm(int param_0, int param_1, f32 param_2, f32 param_3) {
|
|
mAnm_p->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_HM", param_0), param_1, param_2,
|
|
param_3, 0.0f, -1.0f);
|
|
field_0x61c = param_0;
|
|
}
|
|
|
|
s16 daE_HM_c::W_TargetAngle(cXyz param_0, cXyz param_1) {
|
|
cXyz local_14;
|
|
cXyz angleDiff = param_1 - param_0;
|
|
mDoMtx_stack_c::ZrotS(-field_0x5cc.z);
|
|
mDoMtx_stack_c::XrotM(-field_0x5cc.x);
|
|
mDoMtx_stack_c::YrotM(-field_0x5cc.y);
|
|
mDoMtx_stack_c::multVec(&angleDiff, &local_14);
|
|
return cM_atan2s(local_14.x, local_14.z);
|
|
}
|
|
|
|
void daE_HM_c::W_DeathSpSet() {
|
|
cXyz unkXyz1;
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
cXyz& playerPos = fopAcM_GetPosition(player);
|
|
s16 targetYaw = W_TargetAngle(current.pos, playerPos);
|
|
mDoMtx_stack_c::ZXYrotS(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(targetYaw);
|
|
|
|
if (field_0x5af == 0) {
|
|
unkXyz1.set(0.0f, KREG_F(5) + 20.0f, KREG_F(6) + -20.0f);
|
|
} else {
|
|
unkXyz1.set(0.0f, KREG_F(5), KREG_F(6) + -20.0f);
|
|
}
|
|
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &field_0x5dc);
|
|
|
|
mSph.OffAtSetBit();
|
|
mSph.OffTgSetBit();
|
|
|
|
SetAnm(7, 2, kREG_F(10) + 10.0f, nREG_F(12) + 1.0f);
|
|
|
|
attention_info.flags = 0;
|
|
}
|
|
|
|
static f32 dummy0() {
|
|
return 2.0f;
|
|
}
|
|
|
|
static f32 dummy1() {
|
|
return 0.8f;
|
|
}
|
|
|
|
void daE_HM_c::W_DeathAction() {
|
|
f32 frame = mAnm_p->getFrame();
|
|
cXyz unusedXyz1;
|
|
cXyz unusedXyz2;
|
|
|
|
f32 unkFloat1 = field_0x5da + 1;
|
|
cLib_chaseAngleS(&shape_angle.z, 0, unkFloat1 * 768.0f);
|
|
cLib_chaseAngleS(&shape_angle.x, 0, unkFloat1 * 768.0f);
|
|
cLib_chaseAngleS(&field_0x5cc.x, 0, 0x300);
|
|
cLib_chaseAngleS(&field_0x5cc.z, 0, 0x300);
|
|
|
|
if (mAnm_p->getFrame() > 30.0f) {
|
|
field_0x5e8.x *= 0.8f;
|
|
field_0x5e8.y *= 0.8f;
|
|
field_0x5e8.z *= 0.8f;
|
|
field_0x60c = 1;
|
|
cLib_chaseF(&field_0x5f8, 0.0f, 0.04f);
|
|
}
|
|
|
|
if (field_0x5da > 1) {
|
|
field_0x5dc.set(0.0f, 0.0f, 0.0f);
|
|
if (mAnm_p->isStop()) {
|
|
fopAcM_createDisappear(this, ¤t.pos, 10, 0, 0x23);
|
|
fopAcM_delete(this);
|
|
}
|
|
} else {
|
|
field_0x5dc.y += -(kREG_F(5) + 6.0f);
|
|
if (mAcch.ChkGroundHit()) {
|
|
if (field_0x5dc.y < 0.0f) {
|
|
field_0x5da++;
|
|
}
|
|
field_0x5dc.y *= -0.2f;
|
|
} else if (mAcch.ChkWallHit() && field_0x5dc.y < 0.0f) {
|
|
}
|
|
current.pos += field_0x5dc;
|
|
}
|
|
|
|
if (field_0x5da == 1) {
|
|
if (mAnm_p->getFrame() > 15.0f) {
|
|
mAnm_p->setFrame(15.0f);
|
|
}
|
|
if (field_0x61c != 8) {
|
|
mAnm_p->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_HM", 8), 0, 5.0f, 1.0f, 0.0f, -1.0f);
|
|
field_0x61c = 8;
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::W_DeathMotion() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
if (field_0x5ae != 0xff) {
|
|
if (!dComIfGs_isSwitch(field_0x5ae, fopAcM_GetRoomNo(this))) {
|
|
dComIfGs_onSwitch(field_0x5ae, fopAcM_GetRoomNo(this));
|
|
}
|
|
}
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_DIE, -1);
|
|
|
|
mAcch.SetWaterNone();
|
|
W_DeathSpSet();
|
|
|
|
field_0x5d6++;
|
|
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_A), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_B), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_C), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
|
|
mSph.OffAtSetBit();
|
|
mSph.OffTgSetBit();
|
|
|
|
break;
|
|
case 1:
|
|
mSph.OffAtSetBit();
|
|
W_DeathAction();
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
int daE_HM_c::W_MoveCheckWall() {
|
|
s16 unkFloat1;
|
|
s16 unkFloat2;
|
|
|
|
cXyz unkXyz1(0.0f, -100.0f, speedF * 3.0f);
|
|
cXyz unkXyz2(0.0f, 100.0f, 0.0f);
|
|
|
|
dBgS_LinChk linChk;
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &unkXyz1);
|
|
mDoMtx_stack_c::multVec(&unkXyz2, &unkXyz2);
|
|
|
|
cXyz unusedXyz1;
|
|
|
|
linChk.Set(&unkXyz2, &unkXyz1, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane1;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane1);
|
|
|
|
if (!dComIfG_Bgsp().GetMagnetCode(linChk)) {
|
|
field_0x5b4 += (s16)0x200;
|
|
return 1;
|
|
}
|
|
|
|
cM3dGPla plane2;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane2);
|
|
|
|
cXyz* normal = plane2.GetNP();
|
|
f32 normalY = normal->y;
|
|
|
|
current.pos = linChk.GetCross();
|
|
cXyz unkXyz3(0.0f, 0.0f, 0.0f);
|
|
cXyz unkXyz4(0.0f, normal->y, normal->z);
|
|
f32 temp = unkXyz3.abs(unkXyz4);
|
|
unkFloat1 = -cM_atan2s(normal->x, temp);
|
|
unkFloat2 = cM_atan2s(normal->z, normal->y);
|
|
}
|
|
|
|
cLib_chaseAngleS(&field_0x5cc.z, unkFloat1, 0x150);
|
|
cLib_chaseAngleS(&field_0x5cc.x, unkFloat2, 0x150);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int daE_HM_c::W_WallCheck() {
|
|
cXyz unkXyz1(0.0f, -300.0f, 300.0f);
|
|
cXyz unkXyz2(0.0f, 200.0f, 0.0f);
|
|
|
|
dBgS_LinChk linChk;
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &unkXyz1);
|
|
mDoMtx_stack_c::multVec(&unkXyz2, &unkXyz2);
|
|
|
|
cXyz unusedXyz1;
|
|
linChk.Set(&unkXyz2, &unkXyz1, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
if (!dComIfG_Bgsp().GetMagnetCode(linChk)) {
|
|
field_0x5b4 += (s16)0x200;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void daE_HM_c::WallExecute() {
|
|
switch (field_0x5d4) {
|
|
case 4:
|
|
WaitAction();
|
|
break;
|
|
case 2:
|
|
AttackAction();
|
|
break;
|
|
case 1:
|
|
mSph.OffAtSetBit();
|
|
W_DeathMotion();
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
break;
|
|
case 0:
|
|
ShieldMotion();
|
|
break;
|
|
case 5:
|
|
ShippuAction();
|
|
break;
|
|
}
|
|
}
|
|
|
|
static f32 dummy2() {
|
|
return -30.0f;
|
|
}
|
|
|
|
void daE_HM_c::WallCreateExecute() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
field_0x5ad = 1;
|
|
SetAnm(14, 2, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
field_0x5f4 = 0.0f;
|
|
field_0x5d6++;
|
|
break;
|
|
case 1:
|
|
cLib_chaseF(&field_0x5f4, 1.0f, 0.05f);
|
|
if (field_0x5f4 == 1.0f) {
|
|
field_0x5d2 = 3;
|
|
field_0x5d4 = 3;
|
|
MemberClear();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::CreateExecute() {
|
|
if (fopAcM_SearchByID(field_0x5c4) == NULL && field_0x5c4 != fpcM_ERROR_PROCESS_ID_e) {
|
|
field_0x5c4 = fpcM_ERROR_PROCESS_ID_e;
|
|
field_0x5b8 = 300;
|
|
}
|
|
if (field_0x5c4 == fpcM_ERROR_PROCESS_ID_e && field_0x5b8 == 0) {
|
|
field_0x5c4 = fopAcM_createChild(PROC_E_HM, fopAcM_GetID(this), 0xfffff05, ¤t.pos,
|
|
fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::Tyakuchi_Set() {
|
|
cXyz unkXyz1(0.0f, 30.0f, 0.0f);
|
|
cXyz unkXyz2;
|
|
cXyz unkXyz3(0.0f, -30.0f, 0.0f);
|
|
cXyz unkXyz4;
|
|
|
|
dBgS_LinChk linChk;
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &unkXyz2);
|
|
mDoMtx_stack_c::multVec(&unkXyz3, &unkXyz4);
|
|
|
|
linChk.Set(&unkXyz2, &unkXyz4, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
|
|
cXyz* normal = plane.GetNP();
|
|
cXyz origin(0.0f, 0.0f, 0.0f);
|
|
cXyz normalYZ(0.0f, normal->y, normal->z);
|
|
|
|
f32 magYZ = origin.abs(normalYZ);
|
|
field_0x5cc.z = -cM_atan2s(normal->x, magYZ);
|
|
field_0x5cc.x = cM_atan2s(normal->z, normal->y);
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::UpDeathAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
if (field_0x5ad == 0 && field_0x5ae != 0xff) {
|
|
if (!dComIfGs_isSwitch(field_0x5ae, fopAcM_GetRoomNo(this))) {
|
|
dComIfGs_onSwitch(field_0x5ae, fopAcM_GetRoomNo(this));
|
|
}
|
|
}
|
|
|
|
cLib_chaseAngleS(&field_0x5cc.x, 0, 0x1000);
|
|
cLib_chaseAngleS(&field_0x5cc.y, 0, 0x1000);
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_DIE, -1);
|
|
|
|
attention_info.flags = 0x0;
|
|
mSph.OffAtSetBit();
|
|
mSph.OffTgSetBit();
|
|
mAcch.SetWaterNone();
|
|
|
|
if (mAcch.ChkGroundHit()) {
|
|
DeathSpSet();
|
|
} else {
|
|
gravity = -9.0f;
|
|
}
|
|
|
|
SetAnm(7, 2, kREG_F(10) + 10.0f, nREG_F(12) + 1.0f);
|
|
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_A), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_B), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_C), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
|
|
field_0x5d6++;
|
|
|
|
break;
|
|
case 1:
|
|
cLib_chaseAngleS(&field_0x5cc.x, 0, 0x1000);
|
|
cLib_chaseAngleS(&field_0x5cc.y, 0, 0x1000);
|
|
cLib_chaseAngleS(&shape_angle.x, 0, 0x500);
|
|
cLib_chaseAngleS(&shape_angle.y, 0, 0x500);
|
|
|
|
DeathMotion();
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
static bool hio_set;
|
|
|
|
static daE_HM_HIO_c l_HIO;
|
|
|
|
void daE_HM_c::UpMoveAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
gravity = -9.0f;
|
|
|
|
cLib_chaseAngleS(&shape_angle.x, 0, 0x1000);
|
|
cLib_chaseAngleS(&shape_angle.y, 0, 0x1000);
|
|
cLib_chaseAngleS(&field_0x5cc.x, 0, 0x1000);
|
|
cLib_chaseAngleS(&field_0x5cc.y, 0, 0x1000);
|
|
|
|
SetAnm(9, 2, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
|
|
if (mAcch.ChkGroundHit()) {
|
|
Tyakuchi_Set();
|
|
|
|
mSound.startCreatureSound(Z2SE_EN_HM_LAND, 0, -1);
|
|
|
|
SetAnm(10, 0, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_LANDING_A), ¤t.pos,
|
|
&tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_LANDING_B), ¤t.pos,
|
|
&tevStr, &shape_angle, 0);
|
|
|
|
cXyz unkXyz1(l_HIO.attackRange + yREG_F(4), l_HIO.attackRange + yREG_F(4),
|
|
l_HIO.attackRange + yREG_F(4));
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_ATFIRE2_A), ¤t.pos,
|
|
&tevStr, &field_0x5cc, &unkXyz1);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_ATFIRE2_B), ¤t.pos,
|
|
&tevStr, &field_0x5cc, &unkXyz1);
|
|
|
|
field_0x5d6++;
|
|
|
|
mSph.OnTgSetBit();
|
|
}
|
|
break;
|
|
case 1:
|
|
if (mAnm_p->isStop()) {
|
|
field_0x5b0 = 50.0f;
|
|
field_0x5d2 = 1;
|
|
field_0x5d4 = 4;
|
|
|
|
MemberClear();
|
|
} else {
|
|
if (mAnm_p->getFrame() > 10.0f) {
|
|
cLib_chaseF(&field_0x5b0, 40.0f, l_HIO.attackRange * 5.0f + yREG_F(3));
|
|
} else {
|
|
cLib_chaseF(&field_0x5b0, l_HIO.attackRange * 100.0f + yREG_F(2),
|
|
l_HIO.attackRange * 5.0f + yREG_F(3));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::UpWaitAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
mSound.startCreatureSound(Z2SE_EN_HM_WAIT, 0, -1);
|
|
SetAnm(13, 2, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
field_0x5d6++;
|
|
break;
|
|
case 1:
|
|
if (mAnm_p->getFrame() == 0.0f) {
|
|
mSound.startCreatureSound(Z2SE_EN_HM_WAIT, 0, -1);
|
|
}
|
|
|
|
if (fopAcM_searchPlayerDistanceXZ(this) < l_HIO.searchArea) {
|
|
mSph.OffTgSetBit();
|
|
mSound.startCreatureSound(Z2SE_EN_HM_FALL, 0, -1);
|
|
field_0x5d4 = 3;
|
|
MemberClear();
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::UpExecute() {
|
|
switch (field_0x5d4) {
|
|
case 5:
|
|
ShippuAction();
|
|
break;
|
|
case 4:
|
|
UpWaitAction();
|
|
break;
|
|
case 3:
|
|
UpMoveAction();
|
|
break;
|
|
case 0:
|
|
field_0x5d6 = 1;
|
|
UpMoveAction();
|
|
break;
|
|
case 1:
|
|
UpDeathAction();
|
|
break;
|
|
}
|
|
}
|
|
|
|
int daE_HM_c::WallCheck() {
|
|
cXyz unkXyz1(0.0f, 300.0f, 150.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &unkXyz1);
|
|
fopAcM_gc_c::gndCheck(&unkXyz1);
|
|
if (fopAcM_gc_c::getGroundY() - current.pos.y < -300.0f) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int daE_HM_c::MoveCheck() {
|
|
cXyz unkXyz1(0.0f, 300.0f, 0.0f);
|
|
cXyz unkXyz2(0.0f, -300.0f, (HREG_F(1) + 0.5f) * speedF);
|
|
dBgS_LinChk linChk;
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&unkXyz1, &unkXyz1);
|
|
mDoMtx_stack_c::multVec(&unkXyz2, &unkXyz2);
|
|
linChk.Set(&unkXyz1, &unkXyz2, NULL);
|
|
|
|
cXyz vecToHome;
|
|
|
|
if (!dComIfG_Bgsp().LineCross(&linChk)) {
|
|
vecToHome = home.pos - current.pos;
|
|
vecToHome.x += cM_rndFX(nREG_F(10) + 100.0f);
|
|
vecToHome.z += cM_rndFX(nREG_F(10) + 100.0f);
|
|
field_0x5b4 = (s16)cM_atan2s(vecToHome.x, vecToHome.z);
|
|
field_0x5b8 = (s32)(cM_rndFX(50.0f) + 200.0f);
|
|
|
|
return 1;
|
|
} else {
|
|
s16 yaw;
|
|
s16 pitch;
|
|
{
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
cXyz* normal = plane.GetNP();
|
|
cXyz origin(0.0f, 0.0f, 0.0f);
|
|
cXyz normalYZ(0.0f, normal->y, normal->z);
|
|
f32 magYZ = origin.abs(normalYZ);
|
|
pitch = -cM_atan2s(normal->x, magYZ);
|
|
yaw = cM_atan2s(normal->z, normal->y);
|
|
|
|
current.pos = linChk.GetCross();
|
|
}
|
|
|
|
cLib_chaseAngleS(&field_0x5cc.x, yaw, 0x150);
|
|
cLib_chaseAngleS(&field_0x5cc.z, pitch, 0x150);
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void daE_HM_c::ShippuAction() {
|
|
bool unkFlag1;
|
|
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
mSph.OffAtSetBit();
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_SIPPU, -1);
|
|
SetAnm(12, 0, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
mSph.OffAtSetBit();
|
|
field_0x5d6++;
|
|
field_0x60c = 1;
|
|
break;
|
|
case 1:
|
|
unkFlag1 = false;
|
|
if (mAnm_p->getFrame() < 70.0f) {
|
|
cLib_chaseF(&field_0x5f8, yREG_F(18) + 0.2f, 0.04f);
|
|
field_0x5b8 = (s32)l_HIO.galeStunTime;
|
|
} else if (mAnm_p->getFrame() == 70.0f) {
|
|
if (field_0x5b8 > 0) {
|
|
mAnm_p->setFrame(69.0f);
|
|
}
|
|
} else {
|
|
cLib_chaseF(&field_0x5f8, 1.0f, 0.15f);
|
|
if (field_0x5b8 == 0) {
|
|
mpBrkAnm->setFrame(yREG_F(19));
|
|
unkFlag1 = true;
|
|
}
|
|
}
|
|
|
|
if (mAnm_p->isStop() && (u8)unkFlag1 == true) {
|
|
mSph.OnAtSetBit();
|
|
field_0x5d4 = 4;
|
|
MemberClear();
|
|
field_0x60c = 0;
|
|
field_0x604 = 0;
|
|
mSph.OnAtSetBit();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::ShieldMotion() {
|
|
cLib_addCalc2(&speedF, nREG_F(2), kREG_F(5) + 0.5f, nREG_F(5) + 30.0f);
|
|
|
|
if (!WallCheck()) {
|
|
if (field_0x5d2 == 2) {
|
|
W_MoveCheckWall();
|
|
} else {
|
|
MoveCheck();
|
|
}
|
|
}
|
|
|
|
if (mAnm_p->isStop()) {
|
|
MemberClear();
|
|
field_0x5d4 = 4;
|
|
current.angle.y = shape_angle.y;
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
}
|
|
}
|
|
|
|
namespace {
|
|
static f32 s_dis;
|
|
|
|
static u8 s_gnd[4];
|
|
|
|
static cXyz s_up;
|
|
|
|
static cXyz s_down;
|
|
|
|
static cXyz* sLink_Pos;
|
|
|
|
static s16 s_TargetAngle;
|
|
}
|
|
|
|
void daE_HM_c::ShieldAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
SetAnm(11, 0, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_GUARD, -1);
|
|
current.angle.y = s_TargetAngle;
|
|
speedF = -15.0f;
|
|
field_0x5d6 = field_0x5d6 + 1;
|
|
break;
|
|
case 1:
|
|
ShieldMotion();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::DeathSpSet() {
|
|
current.angle.y = s_TargetAngle + 0x500;
|
|
speedF = l_HIO.flyDirSpeed;
|
|
speed.y = l_HIO.flyDirYSpeed;
|
|
gravity = l_HIO.gravity;
|
|
}
|
|
|
|
void daE_HM_c::DeathMotion() {
|
|
f32 frame = mAnm_p->getFrame();
|
|
if (mAcch.ChkGroundHit() && (field_0x5da++, field_0x5da) == 1) {
|
|
speed.y = yREG_F(11) + 35.0f;
|
|
current.angle.y -= (s16)0x1000;
|
|
SetAnm(8, 0, nREG_F(9) + 1.0f, nREG_F(12) + 1.0f);
|
|
mAnm_p->setPlaySpeed(yREG_F(12) + 2.0f);
|
|
}
|
|
|
|
if (mAcch.ChkWallHit()) {
|
|
speedF = speedF * -0.3;
|
|
}
|
|
|
|
if (field_0x5da > 1) {
|
|
mAnm_p->setPlaySpeed(1.0f);
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
|
|
if (mAnm_p->getFrame() > 30.0f) {
|
|
field_0x5e8 *= 0.8f;
|
|
field_0x60c = 1;
|
|
cLib_chaseF(&field_0x5f8, 0.0f, 0.04f);
|
|
}
|
|
|
|
if (mAnm_p->isStop()) {
|
|
fopAcM_createDisappear(this, ¤t.pos, 10, 0, 0x23);
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::DeathCutDown() {
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
field_0x5e8 *= 0.8f;
|
|
field_0x60c = 1;
|
|
cLib_chaseF(&field_0x5f8, 0.0f, 0.04f);
|
|
if (mAnm_p->isStop()) {
|
|
fopAcM_createDisappear(this, ¤t.pos, 10, 0, 0x23);
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::DeathAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
attention_info.flags = 0x0;
|
|
if (field_0x5ad == 0 && field_0x5ae != 0xff) {
|
|
if (!dComIfGs_isSwitch(field_0x5ae, fopAcM_GetRoomNo(this))) {
|
|
dComIfGs_onSwitch(field_0x5ae, fopAcM_GetRoomNo(this));
|
|
}
|
|
}
|
|
attention_info.flags = 0x0;
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_DIE, -1);
|
|
|
|
SetAnm(7, 0, kREG_F(10) + 10.0f, nREG_F(12) + 1.0f);
|
|
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_A), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_B), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_DEAD_C), ¤t.pos, &tevStr, &shape_angle, 0);
|
|
|
|
DeathSpSet();
|
|
|
|
field_0x5d6++;
|
|
|
|
mSph.OffAtSetBit();
|
|
mSph.OffTgSetBit();
|
|
mSph.OffCoSetBit();
|
|
|
|
if (field_0x60d != 0) {
|
|
SetAnm(8, 0, nREG_F(9) + 1.0f, nREG_F(12) + 1.0f);
|
|
mAnm_p->setFrame(yREG_F(10));
|
|
}
|
|
|
|
break;
|
|
case 1:
|
|
if (field_0x60d != 0) {
|
|
DeathCutDown();
|
|
} else {
|
|
DeathMotion();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::AttackAfter() {
|
|
field_0x5b0 = 50.0f;
|
|
field_0x5bc--;
|
|
if (field_0x5bc == 0) {
|
|
MemberClear();
|
|
field_0x5d4 = 4;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::AttackMotion() {
|
|
f32 frame = mAnm_p->getFrame();
|
|
if (field_0x61c == 14) {
|
|
field_0x5bc = (s16)(cM_rndFX(15.0f) + 40.0f);
|
|
field_0x5d6 = 2;
|
|
} else {
|
|
if (mAnm_p->isStop() && field_0x61c == 6) {
|
|
SetAnm(14, 2, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
} else {
|
|
if (frame == 31.0f) {
|
|
mSound.startCreatureVoice(Z2SE_EN_HM_V_ATTACK, -1);
|
|
mSound.startCreatureSound(Z2SE_EN_HM_ATTACK, 0, -1);
|
|
|
|
cXyz unkXyz1(l_HIO.attackRange + yREG_F(4), l_HIO.attackRange + yREG_F(4),
|
|
l_HIO.attackRange + yREG_F(4));
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_ATFIRE2_A), ¤t.pos, &tevStr, &field_0x5cc, &unkXyz1);
|
|
dComIfGp_particle_set(dPa_RM(ID_ZI_S_HM_ATFIRE2_B), ¤t.pos, &tevStr, &field_0x5cc, &unkXyz1);
|
|
} else if (frame > 32.0f) {
|
|
speedF = 0.0f;
|
|
cLib_chaseF(&field_0x5b0, l_HIO.attackRange * 100.0f + yREG_F(2),
|
|
l_HIO.attackRange * 5.0f + yREG_F(3));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::AttackAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
if (field_0x5c0 == 0) {
|
|
SetAnm(6, 0, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
field_0x5d6++;
|
|
}
|
|
break;
|
|
case 1:
|
|
Particle_Set(field_0x600, 0x84f2);
|
|
AttackMotion();
|
|
break;
|
|
case 2:
|
|
AttackAfter();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::FreeMove() {
|
|
f32 frame = mAnm_p->getFrame();
|
|
if (frame > yREG_F(1) + 21.0f) {
|
|
cLib_addCalc2(&speedF, yREG_F(0) + 0.5f, 0.5f, 5.0f);
|
|
} else {
|
|
cLib_addCalc2(&speedF, 0.0f, 0.5f, 5.0f);
|
|
}
|
|
|
|
cXyz vecToHome;
|
|
if (field_0x5d2 == 2) {
|
|
if (!W_WallCheck()) {
|
|
W_MoveCheckWall();
|
|
if (field_0x5b8 == 0) {
|
|
vecToHome = home.pos - current.pos;
|
|
vecToHome.x += cM_rndFX(nREG_F(10) + 200.0f);
|
|
vecToHome.z += cM_rndFX(nREG_F(10) + 200.0f);
|
|
field_0x5b4 = (s16)cM_atan2s(vecToHome.x, vecToHome.z);
|
|
field_0x5b8 = (s32)(cM_rndFX(50.0f) + 200.0f);
|
|
}
|
|
}
|
|
} else {
|
|
MoveCheck();
|
|
if (field_0x5b8 == 0 || WallCheck()) {
|
|
vecToHome = home.pos - current.pos;
|
|
vecToHome.x += cM_rndFX(nREG_F(10) + 100.0f);
|
|
vecToHome.z += cM_rndFX(nREG_F(10) + 100.0f);
|
|
field_0x5b4 = cM_atan2s(vecToHome.x, vecToHome.z);
|
|
field_0x5b8 = (s32)(cM_rndFX(50.0f) + 200.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::LinkSearch() {
|
|
field_0x5bc--;
|
|
if (field_0x5bc < 0) {
|
|
field_0x5bc = 0;
|
|
}
|
|
|
|
if (s_dis < 500.0f) {
|
|
if (field_0x5bc == 0) {
|
|
MemberClear();
|
|
field_0x5d4 = 2;
|
|
} else {
|
|
FreeMove();
|
|
}
|
|
} else {
|
|
FreeMove();
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::WaitAction() {
|
|
switch (field_0x5d6) {
|
|
case 0:
|
|
mSound.setLinkSearch(false);
|
|
SetAnm(14, 2, nREG_F(9) + 5.0f, nREG_F(12) + 1.0f);
|
|
field_0x5d6 = 1;
|
|
break;
|
|
case 1:
|
|
if (mAnm_p->checkFrame(0.0f)) {
|
|
mSound.startCreatureSound(Z2SE_EN_HM_WALK, 0, -1);
|
|
}
|
|
LinkSearch();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::MemberClear() {
|
|
field_0x5d6 = 0;
|
|
}
|
|
|
|
void daE_HM_c::DownExecute() {
|
|
switch (field_0x5d4) {
|
|
case 5:
|
|
ShippuAction();
|
|
break;
|
|
case 0:
|
|
ShieldAction();
|
|
break;
|
|
case 1:
|
|
mSph.OffAtSetBit();
|
|
DeathAction();
|
|
break;
|
|
case 2:
|
|
AttackAction();
|
|
break;
|
|
case 4:
|
|
WaitAction();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::At_Check() {
|
|
mAtInfo.mpActor = at_power_check(&mAtInfo);
|
|
if (mAtInfo.mpActor != NULL) {
|
|
if (mAtInfo.mpCollider->ChkAtType(0x4000)) {
|
|
mAtInfo.mHitStatus = 2;
|
|
}
|
|
|
|
if ((s16)mAtInfo.mAttackPower > 0) {
|
|
health -= (s16)mAtInfo.mAttackPower;
|
|
}
|
|
|
|
s8 unkByte1 = 0;
|
|
if (mAtInfo.mAttackPower != 0) {
|
|
mAtInfo.mHitStatus = 2;
|
|
unkByte1 = 5;
|
|
} else {
|
|
unkByte1 = 2;
|
|
}
|
|
|
|
dCcD_GObjInf* dObj = static_cast<dCcD_GObjInf*>(mAtInfo.mpCollider);
|
|
u32 unkUint1 = dObj->GetAtSe();
|
|
int unkInt1 = 30;
|
|
if (mAtInfo.mHitStatus == 1) {
|
|
unkInt1 = 31;
|
|
} else if (mAtInfo.mHitStatus == 2) {
|
|
unkInt1 = 32;
|
|
}
|
|
|
|
if (mAtInfo.mpSound != NULL) {
|
|
if (mAtInfo.field_0x18 != 0) {
|
|
mAtInfo.mpSound->startCollisionSE(dCcD_GObjInf::getHitSeID(unkUint1, 0), mAtInfo.field_0x18);
|
|
} else {
|
|
mAtInfo.mpSound->startCollisionSE(dCcD_GObjInf::getHitSeID(unkUint1, 0), unkInt1);
|
|
}
|
|
}
|
|
|
|
if (mAtInfo.mHitType == 1 || mAtInfo.mpCollider->ChkAtType(8)) {
|
|
if (mAtInfo.mpCollider->ChkAtType(8)) {
|
|
unkByte1 = 4;
|
|
}
|
|
|
|
dScnPly_c::setPauseTimer(unkByte1);
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::Obj_Damage() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
if (field_0x5c2 > 0) {
|
|
mSph.ClrTgHit();
|
|
mSph.ClrAtHit();
|
|
} else {
|
|
mStts.Move();
|
|
|
|
if (mSph.ChkAtHit() && (field_0x5d2 == 1 || field_0x5d2 == 3)) {
|
|
field_0x5c2 = 10;
|
|
if (!player->checkPlayerGuard() && field_0x5b0 > 50.0f) {
|
|
player->setThrowDamage(s_TargetAngle, 15.0f, 20.0f, 1, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (checkCutDownHitFlg()) {
|
|
field_0x60d = 1;
|
|
field_0x5d4 = 1;
|
|
MemberClear();
|
|
}
|
|
|
|
if (mSph.ChkTgHit()) {
|
|
mAtInfo.mpCollider = mSph.GetTgHitObj();
|
|
cCcD_ObjHitInf* tgHitObj = mSph.GetTgHitObj();
|
|
if (!tgHitObj->ChkAtType(16)) {
|
|
At_Check();
|
|
}
|
|
|
|
field_0x5c2 = 10;
|
|
|
|
MemberClear();
|
|
|
|
if (tgHitObj->ChkAtType(16)) {
|
|
field_0x5d4 = 0;
|
|
} else if (tgHitObj->ChkAtType(0x10000)) {
|
|
field_0x5d4 = 5;
|
|
} else {
|
|
if (tgHitObj->ChkAtType(0x4000)) {
|
|
mSound.startCollisionSE(0x40000, 31);
|
|
dComIfGp_setHitMark(3, this, mSph.GetTgHitPosP(), NULL, NULL, 0);
|
|
}
|
|
|
|
field_0x5d4 = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::ActionMode() {
|
|
|
|
s16 angleY = current.angle.y;
|
|
if (field_0x5d4 != 5) {
|
|
mSound.startCreatureSoundLevel(Z2SE_EN_HM_FIRE, 0, -1);
|
|
}
|
|
if (field_0x5d4 != 1) {
|
|
Obj_Damage();
|
|
}
|
|
|
|
Vec* ccMoveP;
|
|
switch (field_0x5d2) {
|
|
case 3:
|
|
UpExecute();
|
|
setCcCylinder();
|
|
Yazirushi();
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
break;
|
|
case 1:
|
|
if (dComIfGp_getAttention()->LockonTruth()) {
|
|
daE_HM_c* hm = (daE_HM_c*)dComIfGp_getAttention()->LockonTarget(0);
|
|
if (hm == this) {
|
|
onDownFlg();
|
|
setStabPos();
|
|
if (dComIfGp_checkPlayerStatus1(0, 0x400000) &&
|
|
(field_0x5d4 != 2 || !(mAnm_p->getFrame() > 33.0f)))
|
|
{
|
|
mSph.OffAtSetBit();
|
|
} else if (field_0x5d4 == 2 && mAnm_p->getFrame() > 33.0f) {
|
|
mSph.OnAtSetBit();
|
|
}
|
|
}
|
|
} else {
|
|
offDownFlg();
|
|
if (field_0x5d4 != 5) {
|
|
mSph.OnAtSetBit();
|
|
}
|
|
}
|
|
DownExecute();
|
|
if (mAnm_p->getFrame() > 21.0f) {
|
|
cLib_chaseAngleS(&shape_angle.y, field_0x5b4, 0x300);
|
|
cLib_chaseAngleS(¤t.angle.y, field_0x5b4, 0x300);
|
|
}
|
|
if (mAcch.ChkWaterIn()) {
|
|
field_0x620 = 1;
|
|
if (field_0x620 == 1) {
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
setCcCylinder();
|
|
ccMoveP = mStts.GetCCMoveP();
|
|
if (ccMoveP != NULL) {
|
|
current.pos += *ccMoveP;
|
|
}
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
Yazirushi();
|
|
break;
|
|
case 2:
|
|
WallExecute();
|
|
if (mAnm_p->getFrame() > 21.0f) {
|
|
cLib_chaseAngleS(&shape_angle.y, field_0x5b4, 0x300);
|
|
cLib_chaseAngleS(¤t.angle.y, field_0x5b4, 0x300);
|
|
}
|
|
setCcCylinder();
|
|
if (field_0x5af != 0) {
|
|
eyePos = current.pos;
|
|
eyePos.y += 10.0f;
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += 10.0f;
|
|
} else {
|
|
eyePos = current.pos;
|
|
eyePos.y += 40.0f;
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += 40.0f;
|
|
}
|
|
break;
|
|
case 4:
|
|
CreateExecute();
|
|
break;
|
|
case 5:
|
|
WallCreateExecute();
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
setCcCylinder();
|
|
break;
|
|
}
|
|
|
|
if (field_0x5d4 == 5 || field_0x5d4 == 1) {
|
|
field_0x5fc = 0;
|
|
field_0x608 = 0;
|
|
} else {
|
|
Particle_Set(field_0x5fc, 0x84f6);
|
|
Particle_Set(field_0x608, 0x852a);
|
|
}
|
|
|
|
if (mAnm_p->getFrame() > 21.0f) {
|
|
if (current.angle.y - angleY != 0) {
|
|
cLib_chaseAngleS(&field_0x5c0, (s16)(current.angle.y - angleY), 0x50);
|
|
} else {
|
|
cLib_chaseAngleS(&field_0x5c0, (s16)(current.angle.y - angleY), 32);
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::Yazirushi() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
if (!other_bg_check(this, player) && (field_0x5d4 != 1)) {
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
eyePos = current.pos;
|
|
eyePos.y += 40.0f;
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += 40.0f;
|
|
} else {
|
|
attention_info.flags = 0x0;
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::setStabPos() {
|
|
setDownPos(¤t.pos);
|
|
}
|
|
|
|
int daE_HM_c::Execute() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
sLink_Pos = &fopAcM_GetPosition(player);
|
|
s_dis = current.pos.abs(*sLink_Pos);
|
|
s_TargetAngle = W_TargetAngle(current.pos, *sLink_Pos);
|
|
|
|
field_0x5b8--;
|
|
if (field_0x5b8 < 0) {
|
|
field_0x5b8 = 0;
|
|
}
|
|
|
|
ActionMode();
|
|
|
|
cXyz bindEffectSize(1.0f, 1.0f, 1.0f);
|
|
|
|
u32 cutType = daPy_getPlayerActorClass()->getCutType();
|
|
if (cutType == daPy_py_c::CUT_TYPE_WOLF_LOCK && mSph.ChkAtSet() != 0) {
|
|
mSph.OffAtSetBit();
|
|
field_0x5ac = 1;
|
|
} else if (field_0x5ac != 0) {
|
|
field_0x5ac = 0;
|
|
mSph.OnAtSetBit();
|
|
}
|
|
|
|
setMidnaBindEffect(this, &mSound, ¤t.pos, &bindEffectSize);
|
|
|
|
mAnm_p->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
|
|
if (field_0x5c2 != 0) {
|
|
field_0x5c2--;
|
|
}
|
|
|
|
mpBrkAnm->play();
|
|
mpBtkAnm->play();
|
|
|
|
setBaseMtx();
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daE_HM_c::Draw() {
|
|
J3DModel* model = mAnm_p->getModel();
|
|
|
|
if (field_0x5d2 != 4) {
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
|
|
mpBtkAnm->entry(model->getModelData());
|
|
|
|
if (field_0x60c == 0) {
|
|
mpBrkAnm->entry(model->getModelData());
|
|
}
|
|
|
|
if (field_0x60c != 0) {
|
|
J3DModelData* modelData = model->getModelData();
|
|
J3DMaterial* matNode_p = modelData->getMaterialNodePointer(0);
|
|
matNode_p->getTevKColor(0)->r = field_0x5f8 * 255.0f;
|
|
matNode_p->getTevKColor(0)->g = field_0x5f8 * 100.0f;
|
|
mpBrkAnm->remove(modelData);
|
|
}
|
|
mAnm_p->entryDL();
|
|
}
|
|
|
|
cXyz shadowPos;
|
|
shadowPos.set(current.pos.x, current.pos.y + 100.0f, current.pos.z);
|
|
field_0x62c = dComIfGd_setShadow(field_0x62c, 1, model, &shadowPos, 400.0f, 80.0f, current.pos.y,
|
|
mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f,
|
|
dDlst_shadowControl_c::getSimpleTex());
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daE_HM_c::Delete() {
|
|
dComIfG_resDelete(&mPhase,"E_HM");
|
|
|
|
if (field_0xa84 != 0) {
|
|
hio_set = false;
|
|
mDoHIO_DELETE_CHILD(l_HIO.field_0x04);
|
|
}
|
|
|
|
if (heap != NULL) {
|
|
mAnm_p->stopZelAnime();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void daE_HM_c::setBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x5cc);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mAnm_p->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mAnm_p->modelCalc();
|
|
}
|
|
|
|
static int daE_HM_Draw(daE_HM_c* i_this) {
|
|
return i_this->Draw();
|
|
}
|
|
|
|
static int daE_HM_Execute(daE_HM_c* i_this) {
|
|
return i_this->Execute();
|
|
}
|
|
|
|
static int daE_HM_IsDelete(daE_HM_c* i_this) {
|
|
return TRUE;
|
|
}
|
|
|
|
static int daE_HM_Delete(daE_HM_c* i_this) {
|
|
fopAcM_RegisterDeleteID(i_this, "E_HM");
|
|
return i_this->Delete();
|
|
}
|
|
|
|
void daE_HM_c::CheckRoof() {
|
|
cXyz endPos(current.pos.x, current.pos.y + 300.0f, current.pos.z);
|
|
dBgS_LinChk linChk;
|
|
cXyz startPos(current.pos.x, current.pos.y - 200.0f, current.pos.z);
|
|
linChk.Set(&startPos, &endPos, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
cXyz* normal = plane.GetNP();
|
|
|
|
cXyz unusedXyz1(0.0f, 1.0f, 0.0f);
|
|
cXyz unusedXyz2;
|
|
cXyz origin(0.0f, 0.0f, 0.0f);
|
|
|
|
cXyz normalYZ(0.0f, normal->y, normal->z);
|
|
field_0x5cc.z = -cM_atan2s(normal->x, origin.abs(normalYZ));
|
|
field_0x5cc.x = cM_atan2s(normal->z, normal->y);
|
|
|
|
cXyz linChkCross = linChk.GetCross();
|
|
current.pos = linChk.GetCross();
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::CheckWall() {
|
|
cXyz unkXyz1;
|
|
cXyz unkXyz2(0.0f, 0.0f, 200.0f);
|
|
cXyz unkXyz3(0.0f, 200.0f, 0.0f);
|
|
dBgS_LinChk linChk;
|
|
cLib_offsetPos(&unkXyz1, ¤t.pos, shape_angle.y, &unkXyz3);
|
|
linChk.Set(¤t.pos, &unkXyz1, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
field_0x5af = 1;
|
|
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
cXyz* normal = plane.GetNP();
|
|
cXyz unusedXyz3(0.0f, 1.0f, 0.0f);
|
|
cXyz unusedXyz4;
|
|
cXyz origin(0.0f, 0.0f, 0.0f);
|
|
cXyz normalYZ(0.0f, normal->y, normal->z);
|
|
field_0x5cc.z = -cM_atan2s(normal->x, origin.abs(normalYZ));
|
|
field_0x5cc.x = cM_atan2s(normal->z, normal->y);
|
|
current.pos = linChk.GetCross();
|
|
|
|
return;
|
|
} else {
|
|
unkXyz1.set(0.0f, 0.0f, 0.0f);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
cLib_offsetPos(&unkXyz1, ¤t.pos, shape_angle.y + (i * 16384), &unkXyz2);
|
|
linChk.Set(¤t.pos, &unkXyz1, NULL);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
cXyz* normal = plane.GetNP();
|
|
cXyz unusedXyz1(0.0f, 1.0f, 0.0f);
|
|
cXyz unusedXyz2;
|
|
cXyz origin(0.0f, 0.0f, 0.0f);
|
|
cXyz normalYZ(0.0f, normal->y, normal->z);
|
|
field_0x5cc.z = -cM_atan2s(normal->x, origin.abs(normalYZ));
|
|
field_0x5cc.x = cM_atan2s(normal->z, normal->y);
|
|
current.pos = linChk.GetCross();
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void daE_HM_c::CreateStyle() {
|
|
switch (field_0x5d2) {
|
|
case 1:
|
|
gravity = nREG_F(14) + -9.0f;
|
|
mAcchCir.SetWall(10.0f, KREG_F(3) + 30.0f);
|
|
mAcchCir.SetWallHDirect(50.0f);
|
|
|
|
if (fopAcM_gc_c::gndCheck(¤t.pos)) {
|
|
current.pos.y = nREG_F(4) + fopAcM_gc_c::getGroundY();
|
|
}
|
|
|
|
field_0x5d4 = 4;
|
|
field_0x5d6 = 0;
|
|
MemberClear();
|
|
break;
|
|
case 2:
|
|
gravity = 0.0f;
|
|
mAcchCir.SetWall(0.0f, 60.0f);
|
|
shape_angle.set(0, 0, 0);
|
|
CheckWall();
|
|
field_0x5d4 = 4;
|
|
MemberClear();
|
|
break;
|
|
case 3:
|
|
mSph.OffTgSetBit();
|
|
gravity = 0.0f;
|
|
mAcchCir.SetWall(10.0f, KREG_F(3) + 30.0f);
|
|
mAcchCir.SetWallHDirect(50.0f);
|
|
CheckRoof();
|
|
field_0x5d4 = 4;
|
|
MemberClear();
|
|
break;
|
|
case 4:
|
|
field_0x5c4 = 0xffffffff;
|
|
break;
|
|
case 5:
|
|
gravity = nREG_F(0);
|
|
mAcchCir.SetWall(10.0f, 30.0f);
|
|
CheckRoof();
|
|
shape_angle.x = shape_angle.x + -0x4000;
|
|
field_0x5d4 = 0;
|
|
MemberClear();
|
|
break;
|
|
}
|
|
}
|
|
|
|
int daE_HM_c::Create() {
|
|
fopAcM_ct(this, daE_HM_c);
|
|
|
|
s32 loadResult = dComIfG_resLoad(&mPhase, "E_HM");
|
|
if (loadResult == cPhs_COMPLEATE_e) {
|
|
OS_REPORT("E_HM PARAM %x\n", fopAcM_GetParam(this));
|
|
field_0x5ae = fopAcM_GetParam(this) >> 24;
|
|
if (field_0x5ae != 0xff) {
|
|
if (dComIfGs_isSwitch(field_0x5ae, fopAcM_GetRoomNo(this))) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
if (fopAcM_entrySolidHeap(this, useHeapInit, 0x15a0) == 0) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (hio_set == 0) {
|
|
hio_set = true;
|
|
field_0xa84 = 1;
|
|
l_HIO.field_0x04 = mDoHIO_CREATE_CHILD("E_HM", &l_HIO);
|
|
}
|
|
|
|
field_0x5cc.set(0, 0, 0);
|
|
|
|
field_0x5d2 = (u8)fopAcM_GetParam(this);
|
|
if (field_0x5d2 == 0xff) {
|
|
field_0x5d2 = 1;
|
|
}
|
|
|
|
CreateStyle();
|
|
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
fopAcM_SetMtx(this, mAnm_p->getModel()->getBaseTRMtx());
|
|
fopAcM_SetMin(this, -30.0f, 0.0f, -100.0f);
|
|
fopAcM_SetMax(this, 30.0f, 50.0f, 100.0f);
|
|
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1,
|
|
&mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
|
|
mSound.init(¤t.pos, &eyePos, 3, 1);
|
|
|
|
mAtInfo.mpSound = &mSound;
|
|
mAtInfo.mPowerType = 1;
|
|
mAtInfo.mpSound = &mSound;
|
|
|
|
J3DModel* model = mAnm_p->getModel();
|
|
model->setUserArea((u32)this);
|
|
|
|
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
|
|
if (i != 0) {
|
|
model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack);
|
|
}
|
|
}
|
|
|
|
field_0x5e8.set(1.0f, 1.0f, 1.0f);
|
|
field_0x5f8 = 1.0f;
|
|
field_0x5b0 = 50.0f;
|
|
|
|
initCcCylinder();
|
|
|
|
mSound.startCreatureSound(Z2SE_EN_DF_WAIT, 0, -1);
|
|
mSound.setEnemyName("E_HM");
|
|
|
|
speed.y = 0.0f;
|
|
|
|
daE_HM_Execute(this);
|
|
}
|
|
|
|
return loadResult;
|
|
}
|
|
|
|
static int daE_HM_Create(fopAc_ac_c* i_this) {
|
|
daE_HM_c* hm = (daE_HM_c*)i_this;
|
|
return hm->Create();
|
|
}
|
|
|
|
AUDIO_INSTANCES
|
|
|
|
static actor_method_class l_daE_HM_Method = {
|
|
(process_method_func)daE_HM_Create,
|
|
(process_method_func)daE_HM_Delete,
|
|
(process_method_func)daE_HM_Execute,
|
|
(process_method_func)daE_HM_IsDelete,
|
|
(process_method_func)daE_HM_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_E_HM = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_E_HM, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daE_HM_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
146, // mPriority
|
|
&l_daE_HM_Method, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ENEMY_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|