mirror of
https://github.com/zeldaret/tp
synced 2026-05-25 15:25:25 -04:00
b427ac85cf
* d_a_e_kk equivalent * some docs
1535 lines
49 KiB
C++
1535 lines
49 KiB
C++
/**
|
|
* @file d_a_e_kk.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/actor/d_a_e_kk.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_item.h"
|
|
|
|
UNK_REL_DATA;
|
|
#include "f_op/f_op_actor_enemy.h"
|
|
|
|
enum daE_KK_Action {
|
|
ACTION_WAIT,
|
|
ACTION_ICICLEWAIT,
|
|
ACTION_WALK,
|
|
ACTION_SPEARTHROW,
|
|
ACTION_BACKWALK,
|
|
ACTION_YOROKE,
|
|
ACTION_GUARD,
|
|
ACTION_DAMAGE,
|
|
ACTION_ATTACK,
|
|
ACTION_WEAPONMOVE,
|
|
ACTION_DEAD
|
|
};
|
|
|
|
namespace {
|
|
/* 806FF6FC-806FF740 000038 0044+00 1/1 0/0 0/0 .data cc_kk_src__22@unnamed@d_a_e_kk_cpp@
|
|
*/
|
|
static dCcD_SrcCyl cc_kk_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0xD8FBF9FF, 0x43}, 0x75}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1404}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
40.0f, // mRadius
|
|
0.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
|
|
/* 806FF740-806FF780 00007C 0040+00 1/1 0/0 0/0 .data cc_kk_at_src__22@unnamed@d_a_e_kk_cpp@ */
|
|
static dCcD_SrcSph cc_kk_at_src = {
|
|
{
|
|
{0x0, {{0x400, 0x1, 0xD}, {0xD8FBFDFF, 0x43}, 0x15}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x1, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1404}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
}, // mSphAttr
|
|
};
|
|
} // namespace
|
|
|
|
/* 806FA70C-806FA75C 0000EC 0050+00 1/1 0/0 0/0 .text __ct__12daE_KK_HIO_cFv */
|
|
daE_KK_HIO_c::daE_KK_HIO_c() {
|
|
field_0x4 = -1;
|
|
model_size = 1.0f;
|
|
spear_throw_range = 1500.0f;
|
|
direct_attack_range = 900.0f;
|
|
default_moving_range = 1000.0f;
|
|
escape_time = 100;
|
|
range_display = 0;
|
|
}
|
|
|
|
/* 806FA75C-806FA7FC 00013C 00A0+00 1/1 0/0 0/0 .text ctrlJoint__8daE_KK_cFP8J3DJointP8J3DModel */
|
|
int daE_KK_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
|
|
s32 jntNo = i_joint->getJntNo();
|
|
mDoMtx_stack_c::copy(i_model->getAnmMtx(jntNo));
|
|
|
|
switch (jntNo) {
|
|
case 4:
|
|
mDoMtx_stack_c::YrotM(field_0x758);
|
|
|
|
default:
|
|
i_model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 806FA7FC-806FA848 0001DC 004C+00 1/1 0/0 0/0 .text JointCallBack__8daE_KK_cFP8J3DJointi */
|
|
int daE_KK_c::JointCallBack(J3DJoint* i_joint, int param_1) {
|
|
if (param_1 == 0) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daE_KK_c* kk_p = (daE_KK_c*)model->getUserArea();
|
|
|
|
if (kk_p != NULL) {
|
|
kk_p->ctrlJoint(i_joint, model);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 806FA848-806FAA48 000228 0200+00 1/1 0/0 0/0 .text draw__8daE_KK_cFv */
|
|
int daE_KK_c::draw() {
|
|
if (field_0x679 == 2 && !checkItemGet(fpcNm_ITEM_IRONBALL, 1)) {
|
|
return 1;
|
|
} else {
|
|
cXyz position;
|
|
position.set(current.pos.x, current.pos.y + 10.0f, current.pos.z);
|
|
|
|
if (field_0x679 != 1) {
|
|
J3DModel* model = mpMorfSO->getModel();
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
|
|
J3DShape* shape =
|
|
mpMorfSO->getModel()->getModelData()->getMaterialNodePointer(2)->getShape();
|
|
if (shape != NULL) {
|
|
if (mActionMode == 10 && mMoveMode != 2) {
|
|
shape->hide();
|
|
} else {
|
|
shape->show();
|
|
}
|
|
}
|
|
|
|
fopAcM_setEffectMtx(this, model->getModelData());
|
|
mpMorfSO->entryDL();
|
|
|
|
u32 shadow =
|
|
dComIfGd_setShadow(mModelShadow, 1, model, &position, 1000.0f, 0.0f, current.pos.y,
|
|
mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr, 0, 1.0f,
|
|
dDlst_shadowControl_c::getSimpleTex());
|
|
mModelShadow = shadow;
|
|
}
|
|
|
|
if (field_0x67d == 0) {
|
|
J3DModel* weaponModel = mpWeaponMorfSO->getModel();
|
|
fopAcM_setEffectMtx(this, weaponModel->getModelData());
|
|
mpWeaponMorfSO->entryDL();
|
|
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(weaponModel, &tevStr);
|
|
|
|
u32 shadow =
|
|
dComIfGd_setShadow(mWeaponShadow, 1, weaponModel, &position, 2000.0f, 0.0f,
|
|
current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr, 0,
|
|
1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
mWeaponShadow = shadow;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 806FAA48-806FAA68 000428 0020+00 1/0 0/0 0/0 .text daE_KK_Draw__FP8daE_KK_c */
|
|
static int daE_KK_Draw(daE_KK_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 806FAA68-806FAB14 000448 00AC+00 10/10 0/0 0/0 .text setBck__8daE_KK_cFiUcff */
|
|
void daE_KK_c::setBck(int i_index, u8 i_attr, f32 i_morf, f32 i_rate) {
|
|
J3DAnmTransform* animation = (J3DAnmTransform*)dComIfG_getObjectRes("E_KK", i_index);
|
|
mpMorfSO->setAnm(animation, i_attr, i_morf, i_rate, 0.0f, -1.0f);
|
|
field_0x764 = i_index;
|
|
}
|
|
|
|
/* 806FAB14-806FABC0 0004F4 00AC+00 5/5 0/0 0/0 .text setWeaponBck__8daE_KK_cFiUcff */
|
|
void daE_KK_c::setWeaponBck(int i_index, u8 i_attr, f32 i_morf, f32 i_rate) {
|
|
J3DAnmTransform* animation = (J3DAnmTransform*)dComIfG_getObjectRes("E_KK", i_index);
|
|
mpWeaponMorfSO->setAnm(animation, i_attr, i_morf, i_rate, 0.0f, -1.0f);
|
|
field_0x768 = i_index;
|
|
}
|
|
|
|
/* 806FABC0-806FAC80 0005A0 00C0+00 1/1 0/0 0/0 .text mCutTypeCheck__8daE_KK_cFi */
|
|
bool daE_KK_c::mCutTypeCheck(int param_0) {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
|
|
if (param_0 == 0 && player->getCutCount() >= 4) {
|
|
return 1;
|
|
}
|
|
|
|
if (param_0 != 2) {
|
|
u8 cutType = player->getCutType();
|
|
if (cutType == daPy_py_c::CUT_TYPE_TURN_RIGHT || cutType == daPy_py_c::CUT_TYPE_JUMP ||
|
|
cutType == daPy_py_c::CUT_TYPE_TWIRL || cutType == daPy_py_c::CUT_TYPE_TURN_LEFT)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
if (player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP_FINISH ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_A ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_B)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (player->getCutType() == daPy_py_c::CUT_TYPE_HEAD_JUMP ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_TWIRL)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 806FAC80-806FAC8C 000660 000C+00 7/7 0/0 0/0 .text setActionMode__8daE_KK_cFii */
|
|
void daE_KK_c::setActionMode(int i_action, int i_mode) {
|
|
mActionMode = i_action;
|
|
mMoveMode = i_mode;
|
|
}
|
|
|
|
/* 806FF880-806FF884 000008 0004+00 2/2 0/0 0/0 .bss None */
|
|
static u8 l_initHIO;
|
|
|
|
/* 806FF890-806FF8AC 000018 001C+00 13/13 0/0 0/0 .bss l_HIO */
|
|
static daE_KK_HIO_c l_HIO;
|
|
|
|
/* 806FAC8C-806FB2EC 00066C 0660+00 1/1 0/0 0/0 .text damage_check__8daE_KK_cFv */
|
|
void daE_KK_c::damage_check() {
|
|
if (health <= 1 || field_0x679 == 1 || mActionMode == 10) {
|
|
return;
|
|
}
|
|
cXyz effPos;
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(2));
|
|
mDoMtx_stack_c::multVecZero(&effPos);
|
|
setMidnaBindEffect(this, &mCreatureSound, &effPos, &scale);
|
|
|
|
if (mDamageTimer == 0) {
|
|
if (mSph.ChkAtHit() && mSph.ChkAtShieldHit()) {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
mSph.ClrAtHit();
|
|
mDamageTimer = 8;
|
|
speedF = -70.0f;
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
if (mSpheres[i].ChkAtHit() && mSpheres[i].ChkAtShieldHit()) {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
mSpheres[i].ClrAtHit();
|
|
mDamageTimer = 8;
|
|
speedF = -70.0f;
|
|
}
|
|
}
|
|
|
|
if (field_0x67d == 0) {
|
|
if (fopAcM_searchPlayerDistance(this) <= l_HIO.direct_attack_range) {
|
|
if (mCutTypeCheck(0)) {
|
|
mCyl.OnTgShield();
|
|
} else {
|
|
mCyl.OffTgShield();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (mCyl.ChkTgHit()) {
|
|
cXyz position;
|
|
position.set(current.pos);
|
|
position.y += 100.0f;
|
|
cXyz hioScale(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
current.angle.y = shape_angle.y;
|
|
mDamageTimer = 8;
|
|
mAtInfo.mpCollider = mCyl.GetTgHitObj();
|
|
|
|
if (mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_HOOKSHOT) ||
|
|
mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_ARROW) ||
|
|
mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_BOOMERANG))
|
|
{
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
dComIfGp_setHitMark(2, this, &position, &shape_angle, NULL, 0);
|
|
setActionMode(5, 0);
|
|
} else if (mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SHIELD_ATTACK)) {
|
|
onHeadLockFlg();
|
|
if (field_0x67d == 0) {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
dComIfGp_setHitMark(2, this, &position, &shape_angle, NULL, 0);
|
|
setActionMode(5, 1);
|
|
} else {
|
|
setActionMode(5, 0);
|
|
}
|
|
} else if ((mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_IRON_BALL) &&
|
|
!dComIfGp_checkPlayerStatus0(0, 0x400)) ||
|
|
mCutTypeCheck(2))
|
|
{
|
|
mCyl.OnTgNoHitMark();
|
|
health = 0;
|
|
dScnPly_c::setPauseTimer(5);
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_HAMMER, 0x20);
|
|
setActionMode(10, 0);
|
|
} else {
|
|
dComIfGp_particle_set(0x85BA, &position, &shape_angle, &hioScale);
|
|
if (field_0x67d == 0) {
|
|
at_power_check(&mAtInfo);
|
|
if (mAtInfo.mHitStatus != 0 || dComIfGp_checkPlayerStatus0(0, 0x400) ||
|
|
mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_MIDNA_LOCK))
|
|
{
|
|
def_se_set(&mCreatureSound, mAtInfo.mpCollider, 0x1F, NULL);
|
|
setActionMode(7, 0);
|
|
} else {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 7);
|
|
dComIfGp_setHitMark(2, this, &position, &shape_angle, NULL, 0);
|
|
setActionMode(6, 0);
|
|
}
|
|
} else {
|
|
cc_at_check(this, &mAtInfo);
|
|
if (health <= 1 || mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_BOMB)) {
|
|
if (field_0x67d == 0) {
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &field_0x698, 0, 0, 1.0f,
|
|
1.0f, -1.0f, -1.0f, 0);
|
|
}
|
|
setActionMode(10, 0);
|
|
mCyl.ClrTgHit();
|
|
mStts.Move();
|
|
return;
|
|
}
|
|
|
|
mCyl.OffTgNoHitMark();
|
|
setActionMode(7, 1);
|
|
if (mCyl.GetTgHitObj()->ChkAtType(AT_TYPE_NORMAL_SWORD) && mCutTypeCheck(1)) {
|
|
mDamageTimer = 8;
|
|
mCyl.ClrTgHit();
|
|
mCyl.OnTgStopNoConHit();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mCyl.OffTgStopNoConHit();
|
|
mStts.Move();
|
|
}
|
|
}
|
|
|
|
/* 806FB2EC-806FB4F4 000CCC 0208+00 8/8 0/0 0/0 .text nextActionCheck__8daE_KK_cFv */
|
|
void daE_KK_c::nextActionCheck() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
if (!dComIfGp_event_runCheck() && fopAcM_searchPlayerDistance(this) > l_HIO.direct_attack_range &&
|
|
fopAcM_searchPlayerDistance(this) <= l_HIO.spear_throw_range)
|
|
{
|
|
if (!fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) &&
|
|
eyePos.y + 200.0f >= player->current.pos.y)
|
|
{
|
|
setActionMode(3, 0);
|
|
return;
|
|
}
|
|
}
|
|
if (!dComIfGp_event_runCheck() && fopAcM_searchPlayerDistance(this) <= l_HIO.direct_attack_range &&
|
|
!fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)))
|
|
{
|
|
if (daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 && mActionMode != 0) {
|
|
setActionMode(0, 0);
|
|
return;
|
|
}
|
|
if (!dComIfGp_event_runCheck()) {
|
|
if (!fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) &&
|
|
!dComIfGp_checkPlayerStatus0(0, 0x100) && eyePos.y + 50.0f > player->current.pos.y)
|
|
{
|
|
setActionMode(8, 0);
|
|
return;
|
|
}
|
|
setActionMode(3, 0);
|
|
}
|
|
} else {
|
|
if (field_0x672 == 0 && mActionMode != 0) {
|
|
setActionMode(0, 0);
|
|
} else if (field_0x672 == 0 && mActionMode != 2) {
|
|
setActionMode(2, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806FB4F4-806FB6C0 000ED4 01CC+00 2/2 0/0 0/0 .text way_gake_check__8daE_KK_cFv */
|
|
bool daE_KK_c::way_gake_check() {
|
|
dBgS_GndChk gndChk;
|
|
cXyz position;
|
|
|
|
if (mObjAcch.ChkWallHit()) {
|
|
return false;
|
|
}
|
|
|
|
s16 angle_edit = -0x2000;
|
|
for (int i = 0; i < 3; i++, angle_edit += 0x2000) {
|
|
mDoMtx_YrotS(*calc_mtx, current.angle.y + angle_edit);
|
|
position.x = 0.0f;
|
|
position.y = 300.0f;
|
|
position.z = 200.0f;
|
|
MtxPosition(&position, &field_0x6b0[i]);
|
|
field_0x6b0[i] += current.pos;
|
|
field_0x6d4[i].set(field_0x6b0[i]);
|
|
gndChk.SetPos(&field_0x6d4[i]);
|
|
field_0x6d4[i].y = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
|
|
if (field_0x6d4[i].y == -1000000000.0f) {
|
|
field_0x6d4[i].y = current.pos.y;
|
|
return true;
|
|
}
|
|
|
|
if (current.pos.y - field_0x6d4[i].y > 100.0f) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/* 806FB6C0-806FB7D8 0010A0 0118+00 3/3 0/0 0/0 .text mDeadEffSet__8daE_KK_cFR4cXyz */
|
|
void daE_KK_c::mDeadEffSet(cXyz& param_0) {
|
|
cXyz hioScale(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
|
|
dComIfGp_particle_set(0x85B8, ¶m_0, &shape_angle, &hioScale);
|
|
dComIfGp_particle_set(0x85B9, ¶m_0, &shape_angle, &hioScale);
|
|
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_DEAD, 0, -1);
|
|
}
|
|
|
|
/* 806FB7D8-806FB908 0011B8 0130+00 1/1 0/0 0/0 .text executeWait__8daE_KK_cFv */
|
|
void daE_KK_c::executeWait() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
if (fopAcM_searchPlayerDistance(this) <= l_HIO.direct_attack_range &&
|
|
current.pos.y + 100.0f >= player->current.pos.y &&
|
|
!fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)))
|
|
{
|
|
setBck(0x1A, 2, 3.0f, 1.0f);
|
|
mTimer = 30;
|
|
} else {
|
|
setBck(0x19, 2, 10.0f, 1.0f);
|
|
field_0x672 = (s16)cM_rndF(60.0f) + 0x1E;
|
|
}
|
|
mMoveMode = 1;
|
|
break;
|
|
|
|
case 1:
|
|
if (field_0x672 == 0 && daPy_getPlayerActorClass()->getDamageWaitTimer() == 0) {
|
|
nextActionCheck();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806FB908-806FBB1C 0012E8 0214+00 1/1 0/0 0/0 .text executeIcicleWait__8daE_KK_cFv */
|
|
void daE_KK_c::executeIcicleWait() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
setBck(4, 0, 3.0f, 1.0f);
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_APPEAR, 0, -1);
|
|
mMoveMode = 1;
|
|
break;
|
|
|
|
case 1:
|
|
if (mpMorfSO->isStop()) {
|
|
setBck(0x13, 0, 0.0f, 1.0f);
|
|
setWeaponBck(0x1E, 0, 0.0f, 1.0f);
|
|
mMoveMode++;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if ((s32)mpWeaponMorfSO->getFrame() >= 0x22) {
|
|
if (field_0x67d != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_RESTORE, 0, -1);
|
|
}
|
|
field_0x67d = 0;
|
|
mCyl.OnTgNoHitMark();
|
|
field_0x76c = 0;
|
|
}
|
|
if (mpMorfSO->isStop() && mpWeaponMorfSO->isStop()) {
|
|
mCyl.OnTgNoHitMark();
|
|
field_0x67d = 0;
|
|
field_0x76c = 0;
|
|
nextActionCheck();
|
|
fopAcM_OffStatus(this, 0x4000);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806FBB1C-806FBE98 0014FC 037C+00 1/1 0/0 0/0 .text executeWalk__8daE_KK_cFv */
|
|
void daE_KK_c::executeWalk() {
|
|
dBgS_LinChk linChk;
|
|
cXyz position1;
|
|
cXyz position2;
|
|
|
|
mDoMtx_YrotS(*calc_mtx, current.angle.y);
|
|
position1.x = 0.0f;
|
|
position1.y = 100.0f;
|
|
position1.z = 300.0f;
|
|
MtxPosition(&position1, &position2);
|
|
field_0x6a4 = position2 + current.pos;
|
|
position1.set(current.pos);
|
|
position1.y += 100.0f;
|
|
linChk.Set(&position1, &field_0x6a4, this);
|
|
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
setBck(0x1B, 2, 3.0f, 1.0f);
|
|
position1.x = cM_rndFX(mMovingRange) + field_0x740.x;
|
|
position1.y = field_0x740.y;
|
|
position1.z = cM_rndFX(mMovingRange) + field_0x740.z;
|
|
position1 -= current.pos;
|
|
field_0x674 = position1.atan2sX_Z() - current.angle.y;
|
|
|
|
if (field_0x674 > 0x3000) {
|
|
field_0x674 = 0x3000;
|
|
} else if (field_0x674 < -0x3000) {
|
|
field_0x674 = -0x3000;
|
|
}
|
|
field_0x674 += current.angle.y;
|
|
if (way_gake_check()) {
|
|
position1 = field_0x740 - current.pos;
|
|
field_0x674 = position1.atan2sX_Z();
|
|
}
|
|
field_0x672 = (s16)cM_rndF(100.0f) + 100;
|
|
mMoveMode++;
|
|
break;
|
|
|
|
case 1:
|
|
if (dComIfG_Bgsp().LineCross(&linChk) || way_gake_check()) {
|
|
position1 = field_0x740 - current.pos;
|
|
|
|
if (abs((s16)(current.angle.y - position1.atan2sX_Z())) > 0x100) { // Problem here
|
|
field_0x674 = position1.atan2sX_Z();
|
|
speedF = 0.0f;
|
|
mMoveMode++;
|
|
break;
|
|
}
|
|
}
|
|
nextActionCheck();
|
|
break;
|
|
|
|
case 2:
|
|
if (abs((s16)(shape_angle.y - field_0x674)) <= 0x100) {
|
|
mMoveMode = 1;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (field_0x764 == 0x1B) {
|
|
if ((s32)mpMorfSO->getFrame() == 0x19 || (s32)mpMorfSO->getFrame() == 0x31) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_FOOTNOTE, 0, -1);
|
|
}
|
|
}
|
|
cLib_addCalc2(&speedF, 5.0f, 0.8f, 2.0f);
|
|
cLib_addCalcAngleS2(¤t.angle.y, field_0x674, 8, 0x500);
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 806FBE98-806FC370 001878 04D8+00 1/1 0/0 0/0 .text executeSpearThrow__8daE_KK_cFv */
|
|
void daE_KK_c::executeSpearThrow() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
if (field_0x764 != 0x14) {
|
|
setBck(0x14, 2, 3.0f, 1.0f);
|
|
}
|
|
cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 4, 0x500);
|
|
shape_angle.y = current.angle.y;
|
|
if (abs((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this))) <= 0x100) {
|
|
case 1:
|
|
shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this);
|
|
setBck(0x18, 0, 3.0f, 1.0f);
|
|
mMoveMode++;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (!dComIfGp_event_runCheck() && fopAcM_searchPlayerDistance(this) <= l_HIO.direct_attack_range &&
|
|
!fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) && (s32)mpMorfSO->getFrame() < 0x17 &&
|
|
!dComIfGp_event_runCheck() && !dComIfGp_checkPlayerStatus0(0, 0x100))
|
|
{
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
if (!fopAcM_otherBgCheck(this, player) && eyePos.y + 50.0f > player->current.pos.y) {
|
|
setActionMode(8, 0);
|
|
break;
|
|
}
|
|
}
|
|
if ((s32)mpMorfSO->getFrame() == 0x17) {
|
|
fopAcM_createChild(PROC_E_KK, fopAcM_GetID(this), 0xFF0001, &field_0x698,
|
|
fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
|
|
field_0x67d = 1;
|
|
mCyl.OffTgNoHitMark();
|
|
mCyl.OffTgShield();
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_THROW, 0, -1);
|
|
}
|
|
if ((s32)mpMorfSO->getFrame() == 9 || (s32)mpMorfSO->getFrame() == 0x17 ||
|
|
(s32)mpMorfSO->getFrame() == 0x22 || (s32)mpMorfSO->getFrame() == 0x3D)
|
|
{
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_FOOTNOTE, 0, -1);
|
|
}
|
|
if (mpMorfSO->isStop()) {
|
|
mMoveMode++;
|
|
case 3:
|
|
setBck(0x12, 0, 0.0f, 1.0f);
|
|
setWeaponBck(0x1E, 0, 0.0f, 1.0f);
|
|
mMoveMode++;
|
|
}
|
|
|
|
break;
|
|
|
|
case 4:
|
|
if ((s32)mpWeaponMorfSO->getFrame() >= 0x22) {
|
|
if (field_0x67d != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_RESTORE, 0, -1);
|
|
}
|
|
field_0x67d = 0;
|
|
mCyl.OnTgNoHitMark();
|
|
field_0x76c = 0;
|
|
}
|
|
if (mpMorfSO->isStop()) {
|
|
if (mpWeaponMorfSO->isStop()) {
|
|
mCyl.OnTgNoHitMark();
|
|
field_0x67d = 0;
|
|
field_0x76c = 0;
|
|
nextActionCheck();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (field_0x764 == 0x14 &&
|
|
((s32)mpMorfSO->getFrame() == 9 || (s32)mpMorfSO->getFrame() == 0x12))
|
|
{
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_FOOTNOTE, 0, -1);
|
|
}
|
|
}
|
|
|
|
/* 806FC370-806FC75C 001D50 03EC+00 1/1 0/0 0/0 .text executeBackWalk__8daE_KK_cFv */
|
|
void daE_KK_c::executeBackWalk() {
|
|
dBgS_LinChk linChk;
|
|
cXyz position1;
|
|
cXyz position2;
|
|
mDoMtx_YrotS(*calc_mtx, current.angle.y);
|
|
position1.x = 0.0f;
|
|
position1.y = 100.0f;
|
|
position1.z = 300.0f;
|
|
MtxPosition(&position1, &position2);
|
|
field_0x6a4 = position2 + current.pos;
|
|
position1.set(current.pos);
|
|
position1.y += 100.0f;
|
|
linChk.Set(&position1, &field_0x6a4, this);
|
|
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
setBck(7, 2, 3.0f, 1.0f);
|
|
if (field_0x76c == 0) {
|
|
mTimer = l_HIO.escape_time;
|
|
field_0x76c = 1;
|
|
}
|
|
mCyl.OffTgNoHitMark();
|
|
if (!dComIfG_Bgsp().LineCross(&linChk)) {
|
|
mMoveMode = 1;
|
|
} else {
|
|
if (cM_rndF(1.0f) < 0.5f) {
|
|
current.angle.y += 0x4000;
|
|
} else {
|
|
current.angle.y -= 0x4000;
|
|
}
|
|
mMoveMode = 2;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
current.angle.y = fopAcM_searchPlayerAngleY(this) + 0x8000;
|
|
|
|
case 2:
|
|
speedF = 15.0f;
|
|
if (mTimer == 0 || dComIfG_Bgsp().LineCross(&linChk) || way_gake_check()) {
|
|
setBck(0x13, 0, 0.0f, 1.0f);
|
|
setWeaponBck(0x1E, 0, 0.0f, 1.0f);
|
|
current.angle.y = shape_angle.y;
|
|
speedF = 0.0f;
|
|
mMoveMode = 3;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if ((s32)mpWeaponMorfSO->getFrame() >= 0x22) {
|
|
if (field_0x67d != 0) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_RESTORE, 0, -1);
|
|
}
|
|
field_0x67d = 0;
|
|
mCyl.OnTgNoHitMark();
|
|
field_0x76c = 0;
|
|
}
|
|
if (mpMorfSO->isStop()) {
|
|
if (mpWeaponMorfSO->isStop()) {
|
|
field_0x67d = 0;
|
|
field_0x76c = 0;
|
|
mCyl.OnTgNoHitMark();
|
|
mMoveMode++;
|
|
nextActionCheck();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
cLib_addCalcAngleS2(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 2, 0x200);
|
|
if (field_0x764 == 7 && ((s32)mpMorfSO->getFrame() == 9 || (s32)mpMorfSO->getFrame() == 0x13)) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_FOOTNOTE, 0, -1);
|
|
}
|
|
}
|
|
|
|
/* 806FC75C-806FC8F4 00213C 0198+00 1/1 0/0 0/0 .text executeYoroke__8daE_KK_cFv */
|
|
void daE_KK_c::executeYoroke() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
if (field_0x67d == 0) {
|
|
setBck(9, 0, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(0xB, 0, 3.0f, 1.0f);
|
|
}
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_NO_DAMAGE, 0, -1);
|
|
mMoveMode = 2;
|
|
return;
|
|
|
|
case 1:
|
|
setBck(0xF, 0, 3.0f, 1.0f);
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_NO_DAMAGE, 0, -1);
|
|
mMoveMode = 2;
|
|
return;
|
|
case 2:
|
|
if (mpMorfSO->isStop()) {
|
|
offHeadLockFlg();
|
|
if (field_0x67d == 0) {
|
|
nextActionCheck();
|
|
return;
|
|
}
|
|
current.angle.y = fopAcM_searchPlayerAngleY(this) + 0x8000;
|
|
setActionMode(4, 0);
|
|
} else {
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806FC8F4-806FCA28 0022D4 0134+00 1/1 0/0 0/0 .text executeGuard__8daE_KK_cFv */
|
|
void daE_KK_c::executeGuard() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
setWeaponBck(0x1D, 0, 0.0f, 1.0f);
|
|
field_0x67c &= 1;
|
|
if (field_0x67c == 0) {
|
|
setBck(0x10, 0, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(0x11, 0, 3.0f, 1.0f);
|
|
}
|
|
field_0x67c++;
|
|
mMoveMode = 1;
|
|
break;
|
|
|
|
case 1:
|
|
if (mpMorfSO->isStop()) {
|
|
nextActionCheck();
|
|
}
|
|
break;
|
|
}
|
|
cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x500);
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 806FCA28-806FCC34 002408 020C+00 1/1 0/0 0/0 .text executeDamage__8daE_KK_cFv */
|
|
void daE_KK_c::executeDamage() {
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
setBck(8, 0, 3.0f, 1.0f);
|
|
mDeadEffSet(field_0x698);
|
|
speedF = -80.0f;
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &field_0x698, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
|
|
field_0x67d = 1;
|
|
mCyl.OffTgShield();
|
|
field_0x67c = (s32)cM_rndF(2.0f) & 1;
|
|
mMoveMode = 2;
|
|
return;
|
|
|
|
case 1:
|
|
if (field_0x67c == 0) {
|
|
setBck(0xC, 0, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(0xD, 0, 3.0f, 1.0f);
|
|
}
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_DAMAGE, 0, -1);
|
|
field_0x67c++;
|
|
field_0x67c &= 1;
|
|
mMoveMode = 3;
|
|
return;
|
|
|
|
case 2:
|
|
cLib_addCalc0(&speedF, 0.7f, 2.0f);
|
|
|
|
case 3:
|
|
mCyl.OffTgNoHitMark();
|
|
if (mpMorfSO->isStop()) {
|
|
current.angle.y = fopAcM_searchPlayerAngleY(this) + 0x8000;
|
|
setActionMode(4, 0);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
/* 806FCC34-806FD068 002614 0434+00 1/1 0/0 0/0 .text executeAttack__8daE_KK_cFv */
|
|
void daE_KK_c::executeAttack() {
|
|
dBgS_LinChk linChk;
|
|
cXyz position1;
|
|
cXyz position2;
|
|
|
|
mDoMtx_YrotS(*calc_mtx, current.angle.y);
|
|
position1.x = 0.0f;
|
|
position1.y = 100.0f;
|
|
position1.z = 300.0f;
|
|
MtxPosition(&position1, &position2);
|
|
field_0x74c = position2 + current.pos;
|
|
position1.set(current.pos);
|
|
position1.y += 100.0f;
|
|
linChk.Set(&position1, &field_0x74c, this);
|
|
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
field_0x67c = 0;
|
|
if (fopAcM_searchPlayerDistance(this) > 600.0f) {
|
|
setBck(0x1C, 2, 3.0f, 1.0f);
|
|
mMoveMode = 1;
|
|
} else {
|
|
mMoveMode = 2;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
if (fopAcM_searchPlayerDistance(this) > 600.0f) {
|
|
speedF = 20.0f;
|
|
if (fopAcM_searchPlayerDistance(this) > l_HIO.direct_attack_range) {
|
|
speedF = 0.0f;
|
|
nextActionCheck();
|
|
}
|
|
} else {
|
|
mMoveMode = 2;
|
|
case 2:
|
|
if (cM_rndF(1.0f) < 0.5f) {
|
|
setBck(5, 0, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(6, 0, 3.0f, 1.0f);
|
|
}
|
|
mMoveMode++;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if ((s32)mpMorfSO->getFrame() == 0x18) {
|
|
speedF = 80.0f;
|
|
field_0x67e = 0;
|
|
if (field_0x764 == 6) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_ATTACK03, 0, -1);
|
|
}
|
|
}
|
|
if (field_0x764 == 5 && (s32)mpMorfSO->getFrame() == 0x1B) {
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_ATTACK01, 0, -1);
|
|
}
|
|
if (mpMorfSO->isStop()) {
|
|
nextActionCheck();
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (dComIfG_Bgsp().LineCross(&linChk) && field_0x67c == 0) {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
speedF = -70.0f;
|
|
field_0x67c = 1;
|
|
}
|
|
|
|
if ((s32)mpMorfSO->getFrame() < 0x19) {
|
|
cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 1, 0x500);
|
|
shape_angle.y = current.angle.y;
|
|
} else if ((s32)mpMorfSO->getFrame() >= 0x21) {
|
|
field_0x67e = 1;
|
|
}
|
|
|
|
if (field_0x764 == 0x1C && ((s32)mpMorfSO->getFrame() == 0 || (s32)mpMorfSO->getFrame() == 10))
|
|
{
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_FOOTNOTE, 0, -1);
|
|
}
|
|
}
|
|
|
|
/* 806FD068-806FD294 002A48 022C+00 1/1 0/0 0/0 .text executeDead__8daE_KK_cFv */
|
|
void daE_KK_c::executeDead() {
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(0x11));
|
|
cXyz effect_position;
|
|
mDoMtx_stack_c::multVecZero(&effect_position);
|
|
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
fopAcM_OffStatus(this, 0);
|
|
attention_info.flags &= 0xFFFFFFFB;
|
|
attention_info.distances[2] = 0;
|
|
offHeadLockFlg();
|
|
health = 0;
|
|
speedF = 0.0f;
|
|
mCyl.OffTgSetBit();
|
|
mCyl.OffCoSetBit();
|
|
mSph.OffAtSetBit();
|
|
mDeadEffSet(effect_position);
|
|
mCreatureSound.startCreatureSound(Z2SE_EN_KK_DEAD, 0, -1);
|
|
if (field_0x679 != 1) {
|
|
if (field_0x67b != 0xFF) {
|
|
fopAcM_onSwitch(this, field_0x67b);
|
|
}
|
|
}
|
|
field_0x67d = 1;
|
|
mCyl.OffTgShield();
|
|
setBck(0xE, 0, 3.0f, 1.0f);
|
|
mMoveMode++;
|
|
return;
|
|
|
|
case 1:
|
|
if (mpMorfSO->isStop()) {
|
|
field_0x564 = 0x1A;
|
|
fopAcM_createDisappear(this, ¤t.pos, 8, 0, field_0x564);
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (mTimer == 1 || (mTimer == 0 && mObjAcch.ChkGroundHit())) {
|
|
mDeadEffSet(effect_position);
|
|
fopAcM_delete(this);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806FD294-806FD930 002C74 069C+00 1/1 0/0 0/0 .text executeWeaponMove__8daE_KK_cFv */
|
|
void daE_KK_c::executeWeaponMove() {
|
|
fopAc_ac_c* actor = NULL;
|
|
dBgS_LinChk linChk;
|
|
cXyz position1;
|
|
cXyz position2;
|
|
cXyz new_speed;
|
|
|
|
J3DModel* weaponModel = mpWeaponMorfSO->getModel();
|
|
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(1));
|
|
mDoMtx_stack_c::multVecZero(&position1);
|
|
|
|
if (mMoveMode == 0) {
|
|
if (!fopAcM_SearchByID(parentActorID, &actor) || actor == NULL) {
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
current.angle.y = actor->shape_angle.y + 0x190;
|
|
}
|
|
|
|
switch (mMoveMode) {
|
|
case 0:
|
|
shape_angle.x = home.angle.x + 0x878C;
|
|
shape_angle.y = home.angle.y + 0x4399;
|
|
|
|
current.angle.x = fopAcM_searchPlayerAngleX(this);
|
|
field_0x674 = fopAcM_searchPlayerAngleX(this) - 0x2EE0;
|
|
shape_angle.z = -0x389A;
|
|
|
|
mTimer = 200;
|
|
speedF = 120.0f;
|
|
|
|
mMovingRange = 20.0f - (fopAcM_searchPlayerDistance(this) - l_HIO.direct_attack_range) / 7.0f;
|
|
|
|
mDistance = (fopAcM_searchPlayerDistance(this) - l_HIO.direct_attack_range) * 1.5f;
|
|
|
|
f32 temp = 2000.0f;
|
|
f32 player_distance_y;
|
|
|
|
if (fopAcM_searchPlayerDistanceY(this) < -300.0f) {
|
|
player_distance_y = (fopAcM_searchPlayerDistanceY(this) + 300.0f) * -2.0f;
|
|
temp = player_distance_y + 2000.0f;
|
|
mDistance += player_distance_y;
|
|
}
|
|
if (mDistance > (s16)temp) {
|
|
mDistance = temp;
|
|
}
|
|
mMoveMode = 1;
|
|
goto end;
|
|
|
|
case 1:
|
|
if (mSph.ChkAtHit()) {
|
|
if (mSph.ChkAtShieldHit()) {
|
|
mCreatureSound.startCollisionSE(Z2SE_HIT_SWORD, 0x28);
|
|
}
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &field_0x68c, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
|
|
0);
|
|
mDeadEffSet(field_0x68c);
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
|
|
mDoMtx_YrotS(*calc_mtx, current.angle.y);
|
|
mDoMtx_XrotM(*calc_mtx, current.angle.x);
|
|
|
|
position2.x = 0.0f;
|
|
position2.y = mMovingRange;
|
|
position2.z = speedF;
|
|
|
|
MtxPosition(&position2, &new_speed);
|
|
speed.y = -new_speed.y;
|
|
|
|
cLib_addCalcAngleS2(¤t.angle.x, field_0x674, 1, mDistance);
|
|
if (speed.y < 0.0f) {
|
|
cLib_addCalcAngleS2(&shape_angle.z, -20000, 4, 0x500);
|
|
}
|
|
|
|
linChk.Set(¤t.pos, &field_0x68c, this);
|
|
|
|
if (mTimer == 0 || mObjAcch.ChkGroundHit() || dComIfG_Bgsp().LineCross(&linChk)) {
|
|
speedF = 0.0f;
|
|
gravity = 0.0f;
|
|
speed.zero();
|
|
field_0x67e = 1;
|
|
mSph.OffAtSetBit();
|
|
if (mTimer != 0) {
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_SPEAR_STICK, &field_0x68c, 0, 0, 1.0f, 1.0f,
|
|
-1.0f, -1.0f, 0);
|
|
}
|
|
mStts.Init(0xFF, 0, this);
|
|
mTimer = (s16)cM_rndF(20.0f) + 30;
|
|
mMoveMode = 2;
|
|
}
|
|
goto end;
|
|
|
|
case 2:
|
|
if (mTimer == 0) {
|
|
mDeadEffSet(position1);
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &position1, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
|
|
0);
|
|
fopAcM_delete(this);
|
|
}
|
|
|
|
default:
|
|
end:
|
|
cXyz mult_vec;
|
|
if (mSph.ChkTgHit()) {
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(2));
|
|
mult_vec.set(100.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x680);
|
|
mSph.ClrTgHit();
|
|
mDeadEffSet(field_0x680);
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &field_0x680, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
|
|
0);
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
if (mSpheres[i].ChkTgHit()) {
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(2));
|
|
mult_vec.set(100.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x680);
|
|
mSpheres[i].ClrTgHit();
|
|
mDeadEffSet(field_0x680);
|
|
Z2GetAudioMgr()->seStart(Z2SE_EN_KK_CRASH, &field_0x680, 0, 0, 1.0f, 1.0f, -1.0f,
|
|
-1.0f, 0);
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806FD930-806FDD0C 003310 03DC+00 2/1 0/0 0/0 .text action__8daE_KK_cFv */
|
|
void daE_KK_c::action() {
|
|
BOOL link_search = false;
|
|
damage_check();
|
|
|
|
switch (mActionMode) {
|
|
case ACTION_WAIT:
|
|
executeWait();
|
|
break;
|
|
|
|
case ACTION_ICICLEWAIT:
|
|
executeIcicleWait();
|
|
break;
|
|
|
|
case ACTION_WALK:
|
|
executeWalk();
|
|
break;
|
|
|
|
case ACTION_SPEARTHROW:
|
|
executeSpearThrow();
|
|
link_search = true;
|
|
break;
|
|
|
|
case ACTION_BACKWALK:
|
|
executeBackWalk();
|
|
break;
|
|
|
|
case ACTION_YOROKE:
|
|
executeYoroke();
|
|
break;
|
|
|
|
case ACTION_GUARD:
|
|
executeGuard();
|
|
link_search = true;
|
|
break;
|
|
|
|
case ACTION_DAMAGE:
|
|
executeDamage();
|
|
break;
|
|
|
|
case ACTION_ATTACK:
|
|
executeAttack();
|
|
link_search = true;
|
|
break;
|
|
|
|
case ACTION_DEAD:
|
|
executeDead();
|
|
break;
|
|
|
|
case ACTION_WEAPONMOVE:
|
|
executeWeaponMove();
|
|
break;
|
|
}
|
|
|
|
mCreatureSound.setLinkSearch(link_search);
|
|
if (field_0x679 != 1) {
|
|
if (mActionMode != 8) {
|
|
field_0x67e = 1;
|
|
}
|
|
if (mActionMode != 4 && mActionMode != 2) {
|
|
cLib_addCalc0(&speedF, 0.7f, 10.0f);
|
|
}
|
|
}
|
|
if (mActionMode != 10 || mMoveMode >= 2) {
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
}
|
|
if (field_0x679 != 1) {
|
|
s16 angle = -(shape_angle.y - fopAcM_searchPlayerAngleY(this));
|
|
|
|
if (angle < -10000) {
|
|
angle = -10000;
|
|
} else if (angle > 10000) {
|
|
angle = 10000;
|
|
}
|
|
|
|
if ((mActionMode == 5 || mActionMode == 7) ||
|
|
fopAcM_searchPlayerDistance(this) > l_HIO.spear_throw_range)
|
|
{
|
|
angle = 0;
|
|
}
|
|
|
|
cLib_addCalcAngleS2(&field_0x758, angle, 8, 0x400);
|
|
mAcchCir.SetWall(70.0f, 150.0f);
|
|
mObjAcch.CrrPos(dComIfG_Bgsp());
|
|
if (mActionMode != 10) {
|
|
dBgS_GndChk gndChk;
|
|
cXyz position;
|
|
position.set(current.pos);
|
|
position.y += 300.0f;
|
|
gndChk.SetPos(&position);
|
|
position.y = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
if (position.y == -1000000000.0f) {
|
|
mTimer = 100;
|
|
setActionMode(10, 2);
|
|
} else {
|
|
if (field_0x760 - current.pos.y > 200.0f) {
|
|
setActionMode(10, 2);
|
|
} else {
|
|
if (mObjAcch.ChkGroundHit()) {
|
|
field_0x760 = current.pos.y;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mpMorfSO->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
} else {
|
|
if (speed.y < 0.0f) {
|
|
mAcchCir.SetWall(1.0f, 1.0f);
|
|
mObjAcch.CrrPos(dComIfG_Bgsp());
|
|
}
|
|
}
|
|
if (field_0x679 != 1 && (field_0x67d == 0 || field_0x768 == 0x1E)) {
|
|
mpWeaponMorfSO->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
if (field_0x768 == 0x1E) {
|
|
if (mpWeaponMorfSO->isStop()) {
|
|
setWeaponBck(0x1D, 0, 0.0f, 1.0f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806FDD0C-806FDF0C 0036EC 0200+00 2/2 0/0 0/0 .text mtx_set__8daE_KK_cFv */
|
|
void daE_KK_c::mtx_set() {
|
|
cXyz mult_vec;
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
|
|
J3DModel* morfModel = mpMorfSO->getModel();
|
|
morfModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpMorfSO->modelCalc();
|
|
mDoMtx_stack_c::copy(morfModel->getAnmMtx(0xE));
|
|
|
|
mDoMtx_stack_c::multVecZero(&field_0x698);
|
|
|
|
J3DModel* weaponModel = mpWeaponMorfSO->getModel();
|
|
weaponModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpWeaponMorfSO->modelCalc();
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(2));
|
|
|
|
mDoMtx_stack_c::multVecZero(&field_0x680);
|
|
|
|
mult_vec.set(230.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x68c);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(1));
|
|
mult_vec.set(i * -60.0f + 80.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x6f8[i]);
|
|
}
|
|
}
|
|
|
|
/* 806FDF0C-806FE0B8 0038EC 01AC+00 2/2 0/0 0/0 .text weapon_mtx_set__8daE_KK_cFv */
|
|
void daE_KK_c::weapon_mtx_set() {
|
|
cXyz mult_vec;
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
|
|
|
|
J3DModel* weaponModel = mpWeaponMorfSO->getModel();
|
|
weaponModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpWeaponMorfSO->modelCalc();
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(1));
|
|
|
|
mDoMtx_stack_c::multVecZero(&field_0x680);
|
|
|
|
mult_vec.set(100.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x68c);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mDoMtx_stack_c::copy(weaponModel->getAnmMtx(1));
|
|
mult_vec.set(i * -60.0f + 80.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&mult_vec, &field_0x6f8[i]);
|
|
}
|
|
}
|
|
|
|
/* 806FE0B8-806FE2A8 003A98 01F0+00 1/1 0/0 0/0 .text cc_set__8daE_KK_cFv */
|
|
void daE_KK_c::cc_set() {
|
|
if (field_0x679 != 1) {
|
|
mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(4));
|
|
mDoMtx_stack_c::multVecZero(&attention_info.position);
|
|
eyePos = attention_info.position;
|
|
eyePos.y -= 50.0f;
|
|
setHeadLockPos(&eyePos);
|
|
mCyl.SetC(current.pos);
|
|
mCyl.SetH(250.0f);
|
|
mCyl.SetR(70.0f);
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
if (field_0x67d == 0 && field_0x67e == 0) {
|
|
mSph.SetC(field_0x68c);
|
|
mSph.SetR(40.0f);
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
}
|
|
|
|
if (field_0x679 == 1 || field_0x67d == 0) {
|
|
for (int i = 0; i < 6; i++) {
|
|
if (field_0x679 != 1) {
|
|
if (field_0x67e != 0) {
|
|
mSpheres[i].OffAtSetBit();
|
|
} else {
|
|
mSpheres[i].OnAtSetBit();
|
|
}
|
|
}
|
|
mSpheres[i].SetC(field_0x6f8[i]);
|
|
mSpheres[i].SetR(10.0f);
|
|
dComIfG_Ccsp()->Set(&mSpheres[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806FE2A8-806FE3B8 003C88 0110+00 1/1 0/0 0/0 .text execute__8daE_KK_cFv */
|
|
int daE_KK_c::execute() {
|
|
if (field_0x679 == 2) {
|
|
if (!checkItemGet(fpcNm_ITEM_IRONBALL, 1)) {
|
|
return 1;
|
|
}
|
|
|
|
if (attention_info.distances[2] == 0) {
|
|
attention_info.distances[2] = 0x45;
|
|
fopAcM_SetGroup(this, 2);
|
|
fopAcM_OnStatus(this, 0);
|
|
attention_info.flags |= 4;
|
|
}
|
|
}
|
|
|
|
if (mTimer != 0) {
|
|
mTimer--;
|
|
}
|
|
if (field_0x672 != 0) {
|
|
field_0x672--;
|
|
}
|
|
if (mDamageTimer != 0) {
|
|
mDamageTimer--;
|
|
}
|
|
|
|
action();
|
|
|
|
if (field_0x679 != 1) {
|
|
mtx_set();
|
|
} else {
|
|
weapon_mtx_set();
|
|
}
|
|
|
|
cc_set();
|
|
mCreatureSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
return 1;
|
|
}
|
|
|
|
/* 806FE3B8-806FE3D8 003D98 0020+00 1/0 0/0 0/0 .text daE_KK_Execute__FP8daE_KK_c */
|
|
static int daE_KK_Execute(daE_KK_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 806FE3D8-806FE3E0 003DB8 0008+00 1/0 0/0 0/0 .text daE_KK_IsDelete__FP8daE_KK_c */
|
|
static int daE_KK_IsDelete(daE_KK_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 806FE3E0-806FE460 003DC0 0080+00 1/1 0/0 0/0 .text _delete__8daE_KK_cFv */
|
|
int daE_KK_c::_delete() {
|
|
dComIfG_resDelete(&mPhaseReq, "E_KK");
|
|
|
|
if (mHIOInit != 0) {
|
|
l_initHIO = false;
|
|
mDoHIO_DELETE_CHILD(l_HIO.field_0x4);
|
|
}
|
|
|
|
if (heap != NULL) {
|
|
mCreatureSound.deleteObject();
|
|
offHeadLockFlg();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 806FE460-806FE480 003E40 0020+00 1/0 0/0 0/0 .text daE_KK_Delete__FP8daE_KK_c */
|
|
static int daE_KK_Delete(daE_KK_c* i_this) {
|
|
return i_this->_delete();
|
|
}
|
|
|
|
/* 806FE480-806FE698 003E60 0218+00 1/1 0/0 0/0 .text CreateHeap__8daE_KK_cFv */
|
|
int daE_KK_c::CreateHeap() {
|
|
if (field_0x679 != 1) {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_KK", 0x22);
|
|
JUT_ASSERT(2212, modelData != 0);
|
|
|
|
mpMorfSO = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("E_KK", 0x19), 0,
|
|
1.0f, 0, -1, &mCreatureSound, 0, 0x31000084);
|
|
if (mpMorfSO == NULL || mpMorfSO->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
model = mpMorfSO->getModel();
|
|
model->setUserArea((u32)this);
|
|
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
|
|
if (i != 0) {
|
|
model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack);
|
|
}
|
|
}
|
|
}
|
|
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_KK", 0x23);
|
|
JUT_ASSERT(2247, modelData != 0);
|
|
|
|
mpWeaponMorfSO = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("E_KK", 0x1D), 0,
|
|
1.0f, 0, -1, &mCreatureSound, 0, 0x31000084);
|
|
if (mpWeaponMorfSO == NULL || mpWeaponMorfSO->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 806FE698-806FE6B8 004078 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
return static_cast<daE_KK_c*>(i_this)->CreateHeap();
|
|
}
|
|
|
|
/* 806FE6B8-806FED20 004098 0668+00 1/1 0/0 0/0 .text create__8daE_KK_cFv */
|
|
int daE_KK_c::create() {
|
|
fopAcM_SetupActor(this, daE_KK_c);
|
|
|
|
int phase_state = dComIfG_resLoad(&mPhaseReq, "E_KK");
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
OS_REPORT("E_KK PARAM %x\n", fopAcM_GetParam(this));
|
|
|
|
if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x3e90)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
field_0x679 = fopAcM_GetParam(this);
|
|
field_0x67a = fopAcM_GetParam(this) >> 8;
|
|
field_0x67b = fopAcM_GetParam(this) >> 0x10;
|
|
|
|
if (field_0x679 == 0xFF) {
|
|
field_0x679 = 0;
|
|
}
|
|
|
|
if (field_0x679 != 1 && field_0x67b != 0xFF && fopAcM_isSwitch(this, field_0x67b)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
if (!l_initHIO) {
|
|
l_initHIO = 1;
|
|
mHIOInit = 1;
|
|
l_HIO.field_0x4 = mDoHIO_CREATE_CHILD("氷の剣士", &l_HIO);
|
|
}
|
|
mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1,
|
|
&mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
mAcchCir.SetWall(10.0f, 60.0f);
|
|
mStts.Init(100, 0, this);
|
|
|
|
health = 0x8C;
|
|
field_0x560 = 0x8C;
|
|
|
|
mCyl.Set(cc_kk_src);
|
|
mCyl.SetStts(&mStts);
|
|
mCyl.OnTgNoHitMark();
|
|
|
|
mSph.Set(cc_kk_at_src);
|
|
mSph.SetStts(&mStts);
|
|
mSph.OffTgSetBit();
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mSpheres[i].Set(cc_kk_at_src);
|
|
mSpheres[i].SetStts(&mStts);
|
|
if (field_0x679 == 1) {
|
|
mSpheres[i].OffAtSetBit();
|
|
mSph.OffCoSetBit();
|
|
mSph.OnTgSetBit();
|
|
} else {
|
|
mSpheres[i].OffTgSetBit();
|
|
}
|
|
}
|
|
|
|
mCreatureSound.init(¤t.pos, &eyePos, 3, 1);
|
|
mCreatureSound.setEnemyName("E_kk");
|
|
|
|
mAtInfo.mpSound = &mCreatureSound;
|
|
mAtInfo.mPowerType = 1;
|
|
|
|
field_0x740.set(home.pos);
|
|
|
|
if (field_0x679 == 1) {
|
|
fopAcM_SetMtx(this, mpWeaponMorfSO->getModel()->getBaseTRMtx());
|
|
setActionMode(9, 0);
|
|
} else {
|
|
gravity = -3.0f;
|
|
field_0x67e = 1;
|
|
|
|
fopAcM_SetMtx(this, mpMorfSO->getModel()->getBaseTRMtx());
|
|
|
|
field_0x6a4.set(current.pos);
|
|
field_0x74c.set(current.pos);
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
field_0x6b0[i].set(current.pos);
|
|
field_0x6d4[i].set(current.pos);
|
|
}
|
|
|
|
field_0x760 = current.pos.y;
|
|
|
|
attention_info.flags = 4;
|
|
attention_info.distances[2] = 0x4C;
|
|
|
|
if (field_0x679 != 3) {
|
|
setActionMode(0, 0);
|
|
} else {
|
|
fopAcM_OnStatus(this, 0x4000);
|
|
field_0x67d = 1;
|
|
s16 player_angle = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.y = player_angle;
|
|
current.angle.y = player_angle;
|
|
setActionMode(1, 0);
|
|
}
|
|
}
|
|
|
|
fopAcM_SetMin(this, -600.0f, -600.0f, -600.0f);
|
|
fopAcM_SetMax(this, 600.0f, 600.0f, 600.0f);
|
|
|
|
if (field_0x679 == 2 && !checkItemGet(fpcNm_ITEM_IRONBALL, 1)) {
|
|
attention_info.distances[2] = 0;
|
|
fopAcM_SetGroup(this, 0);
|
|
fopAcM_OffStatus(this, 0);
|
|
attention_info.flags &= 0xFFFFFFFB;
|
|
}
|
|
|
|
if (field_0x67a == 0xFF || field_0x67a == 0) {
|
|
mMovingRange = l_HIO.default_moving_range;
|
|
} else {
|
|
mMovingRange = field_0x67a * 100.0f;
|
|
}
|
|
|
|
if (field_0x679 != 1) {
|
|
mtx_set();
|
|
} else {
|
|
weapon_mtx_set();
|
|
}
|
|
}
|
|
return phase_state;
|
|
}
|
|
|
|
/* 806FF088-806FF0A8 004A68 0020+00 1/0 0/0 0/0 .text daE_KK_Create__FP8daE_KK_c */
|
|
static int daE_KK_Create(daE_KK_c* i_this) {
|
|
return i_this->create();
|
|
}
|
|
|
|
/* 806FF7AC-806FF7CC -00001 0020+00 1/0 0/0 0/0 .data l_daE_KK_Method */
|
|
static actor_method_class l_daE_KK_Method = {
|
|
(process_method_func)daE_KK_Create, (process_method_func)daE_KK_Delete,
|
|
(process_method_func)daE_KK_Execute, (process_method_func)daE_KK_IsDelete,
|
|
(process_method_func)daE_KK_Draw,
|
|
};
|
|
|
|
/* 806FF7CC-806FF7FC -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_KK */
|
|
extern actor_process_profile_definition g_profile_E_KK = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_E_KK, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daE_KK_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
171, // mPriority
|
|
&l_daE_KK_Method, // sub_method
|
|
0x00040120, // mStatus
|
|
fopAc_ENEMY_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|