mirror of https://github.com/zeldaret/tp.git
5728 lines
177 KiB
C++
5728 lines
177 KiB
C++
/**
|
|
* @file d_a_b_zant.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h"
|
|
|
|
#include "d/actor/d_a_b_zant.h"
|
|
#include "d/actor/d_a_b_zant_mobile.h"
|
|
#include "d/actor/d_a_nbomb.h"
|
|
#include "d/actor/d_a_obj_pillar.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/actor/d_a_alink.h"
|
|
#include "d/actor/d_a_mirror.h"
|
|
#include "d/d_s_play.h"
|
|
#include "f_op/f_op_msg_mng.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
#include "JSystem/JAudio2/JAUSectionHeap.h"
|
|
#include <cmath.h>
|
|
|
|
enum Joint {
|
|
/* 0x00 */ JNT_CENTER,
|
|
/* 0x01 */ JNT_BACKBONE,
|
|
/* 0x02 */ JNT_NECK,
|
|
/* 0x03 */ JNT_HEAD,
|
|
/* 0x04 */ JNT_CHIN,
|
|
/* 0x05 */ JNT_HELMET,
|
|
/* 0x06 */ JNT_TONGUE1,
|
|
/* 0x07 */ JNT_TONGUE2,
|
|
/* 0x08 */ JNT_TONGE3,
|
|
/* 0x09 */ JNT_TONGUE4,
|
|
/* 0x0A */ JNT_TONGUE5,
|
|
/* 0x0B */ JNT_MOUTH,
|
|
/* 0x0C */ JNT_SHOULDERL,
|
|
/* 0x0D */ JNT_ARML1,
|
|
/* 0x0E */ JNT_ARML2,
|
|
/* 0x0F */ JNT_ARML3,
|
|
/* 0x10 */ JNT_ARML4,
|
|
/* 0x11 */ JNT_HIRALB1,
|
|
/* 0x12 */ JNT_HIRALB2,
|
|
/* 0x13 */ JNT_HIRALF1,
|
|
/* 0x14 */ JNT_HIRALF2,
|
|
/* 0x15 */ JNT_SPADL,
|
|
/* 0x16 */ JNT_SHOULDERR,
|
|
/* 0x17 */ JNT_ARMR1,
|
|
/* 0x18 */ JNT_ARMR2,
|
|
/* 0x19 */ JNT_ARMR3,
|
|
/* 0x1A */ JNT_ARMR4,
|
|
/* 0x1B */ JNT_HIRARB1,
|
|
/* 0x1C */ JNT_HIRARB2,
|
|
/* 0x1D */ JNT_HIRARF1,
|
|
/* 0x1E */ JNT_HIRARF2,
|
|
/* 0x1F */ JNT_SPADR,
|
|
/* 0x20 */ JNT_WAIST,
|
|
/* 0x21 */ JNT_LEGL1,
|
|
/* 0x22 */ JNT_LEGL2,
|
|
/* 0x23 */ JNT_FOOTL,
|
|
/* 0x24 */ JNT_LEGR1,
|
|
/* 0x25 */ JNT_LEGR2,
|
|
/* 0x26 */ JNT_FOOTR,
|
|
/* 0x27 */ JNT_TAREB1,
|
|
/* 0x28 */ JNT_TAREB2,
|
|
/* 0x29 */ JNT_TAREF1,
|
|
/* 0x2A */ JNT_TAREF2,
|
|
};
|
|
|
|
enum OPENING_MODE {
|
|
MODE_START_DEMO,
|
|
MODE_START_DEMO_WAIT,
|
|
MODE_PAN_GROUND,
|
|
|
|
MODE_MSG_1 = 4,
|
|
MODE_MSG_1_WAIT,
|
|
MODE_WARP_OUT_SE,
|
|
MODE_START_WARP,
|
|
|
|
MODE_WARP_WAIT = 100,
|
|
MODE_PAN_THRONE,
|
|
MODE_ZOOM_THRONE,
|
|
MODE_MSG_2,
|
|
MODE_FLY_UP,
|
|
MODE_CLOSE_UP,
|
|
MODE_SET_BOSS_TITLE,
|
|
|
|
MODE_WARP_IN_SE = 20,
|
|
MODE_WARP_IN_SCALE,
|
|
MODE_WARP_IN_WAIT,
|
|
MODE_ZOOM_OUT_ROOM_CHANGE,
|
|
MODE_START_ROOM_CHANGE,
|
|
MODE_ROOM_CHANGE,
|
|
MODE_END_ROOM_CHANGE,
|
|
MODE_END_DEMO,
|
|
};
|
|
|
|
static u8 const lit_3757[12] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
namespace {
|
|
/* 8064EEAC-8064EEEC 000020 0040+00 0/1 0/0 0/0 .data cc_zant_src__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcSph cc_zant_src = {
|
|
{
|
|
{0x0, {{0x400, 0x1, 0x4}, {0xD8FBFDFF, 0x43}, 0x75}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0x1, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 8064EEEC-8064EF2C 000060 0040+00 0/1 0/0 0/0 .data cc_zant_sword_src__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcSph cc_zant_sword_src = {
|
|
{
|
|
{0x0, {{0x400, 0x1, 0x4}, {0xD8FBFDFF, 0x0}, 0x0}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 8064EF2C-8064EF70 0000A0 0044+00 0/1 0/0 0/0 .data cc_zant_roll_src__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcCyl cc_zant_roll_src = {
|
|
{
|
|
{0x0, {{0x400, 0x2, 0x4}, {0xD8FBFDFF, 0x42}, 0x74}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0x6, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x303}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
40.0f, // mRadius
|
|
40.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
|
|
/* 8064EF70-8064EFB0 0000E4 0040+00 0/1 0/0 0/0 .data cc_zant_foot_src__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcSph cc_zant_foot_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0x400000, 0x3}, 0x0}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0xA, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x106}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 8064EFB0-8064EFF0 000124 0040+00 0/1 0/0 0/0 .data cc_zant_foot_src2__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcSph cc_zant_foot_src2 = {
|
|
{
|
|
{0x0, {{0x400, 0x2, 0x1E}, {0xD8BBFDFF, 0x43}, 0x75}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0xD, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x3}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 8064EFF0-8064F030 000164 0040+00 0/1 0/0 0/0 .data cc_zant_camera_src__24@unnamed@d_a_b_zant_cpp@ */
|
|
dCcD_SrcSph cc_zant_camera_src = {
|
|
{
|
|
{0x0, {{0x400, 0x2, 0x1E}, {0xD8BBFDFF, 0x0}, 0x5}}, // mObj
|
|
{dCcD_SE_METAL, 0x0, 0xD, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x3}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 8064F030-8064F038 0001A4 0007+01 4/4 0/0 0/0 .data warp_next_room__24@unnamed@d_a_b_zant_cpp@ */
|
|
static s8 warp_next_room[] = {
|
|
50,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
60,
|
|
};
|
|
}
|
|
|
|
/* 8063E10C-8063E19C 0000EC 0090+00 1/1 0/0 0/0 .text __ct__14daB_ZANT_HIO_cFv */
|
|
daB_ZANT_HIO_c::daB_ZANT_HIO_c() {
|
|
field_0x4 = -1;
|
|
mModelSize = 1.0f;
|
|
mMahojinWaitTime = 10.0f;
|
|
mBulletNum = 15.0f;
|
|
mAttackAnmSpeed = 1.7f;
|
|
mBulletSpeed = 100.0f;
|
|
mBulletSpeedUnderwater = 40.0f;
|
|
mDemoWarpTime = 22.0f;
|
|
mPlayWarpTime = 0.0f;
|
|
mSwordAttackSize = 1.2f;
|
|
mMahojinSize = 0.5f;
|
|
mMahojinOffsetX = 0.0f;
|
|
mMahojinOffsetY = 200.0f;
|
|
mMahojinOffsetZ = -100.0f;
|
|
mAppearAnmSpeed = 2.0f;
|
|
mDisappearAnmSpeed = 0.5f;
|
|
}
|
|
|
|
/* 8063E19C-8063E264 00017C 00C8+00 1/1 0/0 0/0 .text ctrlJoint__10daB_ZANT_cFP8J3DJointP8J3DModel */
|
|
int daB_ZANT_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
|
|
u16 jnt_no = i_joint->getJntNo();
|
|
|
|
mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no));
|
|
|
|
switch (jnt_no) {
|
|
case JNT_BACKBONE:
|
|
mDoMtx_stack_c::ZrotM(mBackboneRotZ);
|
|
break;
|
|
case JNT_NECK:
|
|
mDoMtx_stack_c::ZXYrotM(mNeckRotX, 0, mNeckRotZ);
|
|
break;
|
|
}
|
|
|
|
i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
return 1;
|
|
}
|
|
|
|
/* 8063E264-8063E2B0 000244 004C+00 1/1 0/0 0/0 .text JointCallBack__10daB_ZANT_cFP8J3DJointi */
|
|
int daB_ZANT_c::JointCallBack(J3DJoint* i_joint, int param_1) {
|
|
if (param_1 == 0) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daB_ZANT_c* actor = (daB_ZANT_c*)model->getUserArea();
|
|
|
|
if (actor != NULL) {
|
|
actor->ctrlJoint(i_joint, model);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
namespace {
|
|
/* 8064EB5C-8064EB74 000040 0018+00 1/4 0/0 0/0 .rodata iron_tg_cc__24@unnamed@d_a_b_zant_cpp@ */
|
|
static int const iron_tg_cc[] = {
|
|
0,
|
|
1,
|
|
2,
|
|
4,
|
|
5,
|
|
6,
|
|
};
|
|
}
|
|
|
|
/* 8063E2B0-8063E568 000290 02B8+00 1/1 0/0 0/0 .text draw__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::draw() {
|
|
J3DModel* model = mpModelMorf->getModel();
|
|
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
|
|
mpModelMorf->entryDL();
|
|
daMirror_c::entry(model);
|
|
|
|
cXyz sp38;
|
|
sp38.set(current.pos.x, current.pos.y + 100.0f, current.pos.z);
|
|
|
|
f32 var_f31;
|
|
if (mFightPhase == PHASE_YO) {
|
|
var_f31 = 2000.0f - current.pos.y;
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
tevStr.field_0x344 = (var_f31 * 3.0f) / 2000.0f;
|
|
if (tevStr.field_0x344 >= 1.0f) {
|
|
tevStr.field_0x344 = 1.0f;
|
|
}
|
|
|
|
mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &sp38, 1500.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
} else {
|
|
mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &sp38, 800.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
}
|
|
|
|
if (mDrawSwords) {
|
|
g_env_light.setLightTevColorType_MAJI(mpSwordLModel, &tevStr);
|
|
mDoExt_modelUpdateDL(mpSwordLModel);
|
|
dComIfGd_addRealShadow(mShadowKey, mpSwordLModel);
|
|
|
|
g_env_light.setLightTevColorType_MAJI(mpSwordRModel, &tevStr);
|
|
mDoExt_modelUpdateDL(mpSwordRModel);
|
|
dComIfGd_addRealShadow(mShadowKey, mpSwordRModel);
|
|
}
|
|
|
|
if (mMahojinAnmMode != 0) {
|
|
g_env_light.setLightTevColorType_MAJI(mpMahojinModel, &tevStr);
|
|
mpMahojinEndBrk->entry(mpMahojinModel->getModelData());
|
|
mpMahojinBtk->entry(mpMahojinModel->getModelData());
|
|
mpMahojinStartBtk->entry(mpMahojinModel->getModelData());
|
|
|
|
mDoExt_modelUpdateDL(mpMahojinModel);
|
|
|
|
if (mMahojin2AnmMode) {
|
|
g_env_light.setLightTevColorType_MAJI(mpMahojinModel2, &tevStr);
|
|
mpMahojinBrk2->entry(mpMahojinModel2->getModelData());
|
|
mpMahojinStartBtk2->entry(mpMahojinModel2->getModelData());
|
|
|
|
mDoExt_modelUpdateDL(mpMahojinModel2);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8063E5A4-8063E5C4 000584 0020+00 1/0 0/0 0/0 .text daB_ZANT_Draw__FP10daB_ZANT_c */
|
|
static int daB_ZANT_Draw(daB_ZANT_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 8063E5C4-8063E668 0005A4 00A4+00 23/23 0/0 0/0 .text setBck__10daB_ZANT_cFiUcff */
|
|
void daB_ZANT_c::setBck(int i_resID, u8 i_attr, f32 i_morf, f32 i_speed) {
|
|
mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("B_zan", i_resID), i_attr, i_morf, i_speed, 0.0f, -1.0f);
|
|
}
|
|
|
|
/* 8063E668-8063E6C4 000648 005C+00 3/3 0/0 0/0 .text checkBck__10daB_ZANT_cFi */
|
|
bool daB_ZANT_c::checkBck(int i_resID) {
|
|
return mpModelMorf->getAnm() == (J3DAnmTransform*)dComIfG_getObjectRes("B_zan", i_resID) ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 8063E6C4-8063E6F8 0006A4 0034+00 24/24 0/0 0/0 .text setActionMode__10daB_ZANT_cFii */
|
|
void daB_ZANT_c::setActionMode(int i_action, int i_mode) {
|
|
mSwordSize = 1.0f;
|
|
field_0x701 = 0;
|
|
field_0x702 = 1;
|
|
field_0x717 = 0;
|
|
|
|
mLastAction = mAction;
|
|
mAction = i_action;
|
|
mMode = i_mode;
|
|
}
|
|
|
|
/* 8063E6F8-8063E79C 0006D8 00A4+00 2/2 0/0 0/0 .text checkBigDamage__10daB_ZANT_cFv */
|
|
bool daB_ZANT_c::checkBigDamage() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
BOOL taken_big_dmg = false;
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_NORMAL_SWORD) && daPy_py_c::checkMasterSwordEquip()) {
|
|
if (mAtInfo.mpCollider->GetAtAtp() >= 4) {
|
|
taken_big_dmg = true;
|
|
} else if (player->getSwordAtUpTime() != 0) {
|
|
taken_big_dmg = true;
|
|
} else if (player->getCutCount() >= 4) {
|
|
taken_big_dmg = true;
|
|
}
|
|
}
|
|
|
|
return taken_big_dmg;
|
|
}
|
|
|
|
/* 8063E79C-8063E810 00077C 0074+00 2/2 0/0 0/0 .text checkDamageType__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::checkDamageType() {
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) && mFightPhase == PHASE_OI) {
|
|
return DMGTYPE_HOOK_OI;
|
|
}
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) ||
|
|
mAtInfo.mpCollider->ChkAtType(AT_TYPE_SPINNER) ||
|
|
mAtInfo.mpCollider->ChkAtType(AT_TYPE_ARROW) ||
|
|
mAtInfo.mpCollider->ChkAtType(AT_TYPE_SHIELD_ATTACK))
|
|
{
|
|
return DMGTYPE_OBJ;
|
|
}
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_40)) {
|
|
return DMGTYPE_BOOMERANG;
|
|
}
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) {
|
|
return DMGTYPE_SWORD;
|
|
}
|
|
|
|
return DMGTYPE_MISC;
|
|
}
|
|
|
|
/* 8063E810-8063E938 0007F0 0128+00 2/2 0/0 0/0 .text setDamageSe__10daB_ZANT_cFP8dCcD_Sphi */
|
|
void daB_ZANT_c::setDamageSe(dCcD_Sph* i_hitSph, int i_dmgAmount) {
|
|
health -= i_dmgAmount;
|
|
if (health < 0) {
|
|
health = 0;
|
|
}
|
|
|
|
BOOL var_r29;
|
|
u8 at_se = ((dCcD_GObjInf*)mAtInfo.mpCollider)->GetAtSe();
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) && !fopAcM_CheckStatus(this, 0x280000)) {
|
|
var_r29 = 1;
|
|
} else {
|
|
var_r29 = 0;
|
|
}
|
|
|
|
u32 var_r30 = 30;
|
|
if (mAtInfo.mHitStatus == 1) {
|
|
var_r30 = 31;
|
|
} else if (mAtInfo.mHitStatus == 2) {
|
|
var_r30 = 32;
|
|
}
|
|
|
|
mSound.startCollisionSE(i_hitSph->getHitSeID(at_se, var_r29), var_r30);
|
|
|
|
if (mAtInfo.mHitStatus == 0) {
|
|
dComIfGp_setHitMark(1, this, i_hitSph->GetTgHitPosP(), NULL, NULL, 0);
|
|
} else {
|
|
dComIfGp_setHitMark(3, this, i_hitSph->GetTgHitPosP(), NULL, NULL, 0);
|
|
}
|
|
}
|
|
|
|
/* 8064F5F4-8064F5F8 -00001 0004+00 2/2 0/0 0/0 .bss None */
|
|
/* 8064F5F5 0003+00 l_initHIO None */
|
|
static u8 l_initHIO;
|
|
|
|
/* 8064F604-8064F648 000054 0044+00 12/13 0/0 0/0 .bss l_HIO */
|
|
static daB_ZANT_HIO_c l_HIO;
|
|
|
|
namespace {
|
|
/* 8064F66C-8064F690 0000BC 0024+00 4/5 0/0 0/0 .bss fly_warp_pos__24@unnamed@d_a_b_zant_cpp@ */
|
|
static cXyz fly_warp_pos[] = {
|
|
cXyz(0.0f, 400.0f, 1000.0f),
|
|
cXyz(1000.0f, 400.0f, 1500.0f),
|
|
cXyz(-1000.0f, 400.0f, 1500.0f),
|
|
};
|
|
}
|
|
|
|
/* 8063E938-8063F0F4 000918 07BC+00 1/1 0/0 0/0 .text damage_check__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::damage_check() {
|
|
field_0x9a4.Move();
|
|
|
|
if (mAction != ACT_ROOM_CHANGE) {
|
|
mAtInfo.mpSound = NULL;
|
|
|
|
if (field_0x702 != 0) {
|
|
mBodySphCc[0].OnTgNoHitMark();
|
|
mBodySphCc[1].OnTgNoHitMark();
|
|
|
|
if (mBodySphCc[0].ChkTgShield()) {
|
|
mAtInfo.mpSound = &mSound;
|
|
}
|
|
}
|
|
|
|
mAtInfo.mpCollider = NULL;
|
|
|
|
dCcD_Sph tg_hit_sph;
|
|
if (mBodySphCc[0].ChkTgHit()) {
|
|
mAtInfo.mpCollider = mBodySphCc[0].GetTgHitObj();
|
|
tg_hit_sph = mBodySphCc[0];
|
|
} else if (mBodySphCc[1].ChkTgHit()) {
|
|
mAtInfo.mpCollider = mBodySphCc[1].GetTgHitObj();
|
|
tg_hit_sph = mBodySphCc[1];
|
|
}
|
|
|
|
if (mAtInfo.mpCollider != NULL) {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
if (tg_hit_sph.ChkTgShield()) {
|
|
mAtInfo.field_0x18 = 42;
|
|
mAtInfo.mpCollider->SetAtAtp(0);
|
|
} else {
|
|
mAtInfo.field_0x18 = 0;
|
|
}
|
|
|
|
s16 prev_hp = health;
|
|
int dmg_amount = 0;
|
|
|
|
if (field_0x702 != 0) {
|
|
health = 280;
|
|
cc_at_check(this, &mAtInfo);
|
|
} else {
|
|
cc_at_check(this, &mAtInfo);
|
|
dmg_amount = prev_hp - health;
|
|
}
|
|
|
|
health = prev_hp;
|
|
|
|
if (!mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) {
|
|
dScnPly_c::setPauseTimer(0);
|
|
}
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK | AT_TYPE_WOLF_CUT_TURN | AT_TYPE_10000000 | AT_TYPE_MIDNA_LOCK)) {
|
|
field_0x6e4 = 20;
|
|
} else {
|
|
field_0x6e4 = 10;
|
|
}
|
|
|
|
if (mAtInfo.mAttackPower <= 1) {
|
|
field_0x6e4 = 10;
|
|
}
|
|
|
|
mTakenBigDmg = checkBigDamage();
|
|
|
|
switch (mFightPhase) {
|
|
case PHASE_BB:
|
|
if (field_0x70c == 0) {
|
|
setActionMode(ACT_FLY, 10);
|
|
} else {
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&tg_hit_sph, dmg_amount);
|
|
|
|
if (mAction != ACT_DAMAGE) {
|
|
field_0x6f4 = 100;
|
|
}
|
|
|
|
setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType()));
|
|
break;
|
|
case DMGTYPE_MISC:
|
|
field_0x70c = 0;
|
|
gravity = 0.0f;
|
|
|
|
mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3];
|
|
field_0x711 = 2;
|
|
|
|
setActionMode(ACT_WARP, 1);
|
|
break;
|
|
case DMGTYPE_BOOMERANG:
|
|
setActionMode(ACT_CONFUSE, 5);
|
|
break;
|
|
case DMGTYPE_OBJ:
|
|
setActionMode(ACT_CONFUSE, 0);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case PHASE_MG:
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&tg_hit_sph, dmg_amount);
|
|
|
|
if (mAction != ACT_DAMAGE) {
|
|
field_0x6f4 = 100;
|
|
}
|
|
|
|
setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType()));
|
|
break;
|
|
case DMGTYPE_MISC:
|
|
setActionMode(ACT_SIMA_JUMP, 11);
|
|
break;
|
|
case DMGTYPE_BOOMERANG:
|
|
setActionMode(ACT_CONFUSE, 5);
|
|
break;
|
|
case DMGTYPE_OBJ:
|
|
setActionMode(ACT_CONFUSE, 0);
|
|
break;
|
|
}
|
|
break;
|
|
case PHASE_OI:
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&tg_hit_sph, dmg_amount);
|
|
|
|
if (mAction != ACT_DAMAGE) {
|
|
field_0x6f4 = 100;
|
|
}
|
|
|
|
setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType()));
|
|
break;
|
|
case DMGTYPE_HOOK_OI:
|
|
setActionMode(ACT_HOOK, 0);
|
|
break;
|
|
}
|
|
break;
|
|
case PHASE_MK:
|
|
if (field_0x707 != 0) {
|
|
if (mAction != ACT_MONKEY_FALL) {
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_40)) {
|
|
setActionMode(ACT_MONKEY_FALL, 20);
|
|
} else {
|
|
setActionMode(ACT_CONFUSE, 0);
|
|
}
|
|
} else {
|
|
setActionMode(ACT_MONKEY_FALL, 10);
|
|
}
|
|
} else {
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&tg_hit_sph, dmg_amount);
|
|
setActionMode(ACT_MONKEY_DAMAGE, 0);
|
|
break;
|
|
case DMGTYPE_MISC:
|
|
setNearPillarPos();
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
break;
|
|
case DMGTYPE_BOOMERANG:
|
|
case DMGTYPE_OBJ:
|
|
field_0x6f0 = 0;
|
|
setActionMode(ACT_MONKEY_DAMAGE, 0);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case PHASE_LAST:
|
|
if (!tg_hit_sph.ChkTgShield()) {
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&tg_hit_sph, dmg_amount);
|
|
|
|
if (mAction == ACT_LAST_ATTACK && mMode == 13) {
|
|
mAction = ACT_LAST_TIRED;
|
|
}
|
|
|
|
setActionMode(ACT_LAST_DAMAGE, pl_cut_LRC(player->getCutType()));
|
|
break;
|
|
case DMGTYPE_MISC:
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
setTgHitBit(0);
|
|
setLastWarp(1, 0);
|
|
break;
|
|
case DMGTYPE_BOOMERANG:
|
|
setActionMode(ACT_LAST_DAMAGE, 20);
|
|
break;
|
|
case DMGTYPE_OBJ:
|
|
setActionMode(ACT_LAST_DAMAGE, 10);
|
|
break;
|
|
case DMGTYPE_HOOK_OI:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
mBodySphCc[0].ClrTgHit();
|
|
mBodySphCc[1].ClrTgHit();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8063F524-8063F84C 001504 0328+00 1/1 0/0 0/0 .text ice_damage_check__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::ice_damage_check() {
|
|
field_0xc74.Move();
|
|
|
|
if (field_0x6e4 == 0) {
|
|
s16 prev_hp = health;
|
|
mAtInfo.mpCollider = NULL;
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
int tg_idx = iron_tg_cc[i];
|
|
|
|
if (mFootCc[tg_idx].ChkTgHit()) {
|
|
field_0x6e4 = 10;
|
|
mAtInfo.mpCollider = mFootCc[tg_idx].GetTgHitObj();
|
|
|
|
if (!mFootCc[tg_idx].ChkTgShield()) {
|
|
if (mAction == ACT_ICE_STEP || mAction == ACT_ICE_JUMP) {
|
|
setDamageSe(&mFootCc[tg_idx], 0);
|
|
|
|
if (i < 2) {
|
|
setActionMode(ACT_ICE_DAMAGE, 0);
|
|
} else {
|
|
setActionMode(ACT_ICE_DAMAGE, 1);
|
|
}
|
|
} else if (mAction == ACT_ICE_DAMAGE) {
|
|
setActionMode(ACT_ICE_DAMAGE, 30);
|
|
mModeTimer = 0;
|
|
}
|
|
}
|
|
|
|
for (int j = 0; j < 6; j++) {
|
|
mFootCc[iron_tg_cc[j]].ClrTgHit();
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 11; i++) {
|
|
if (mFoot2Cc[i].ChkTgHit()) {
|
|
if (field_0x6e4 == 0) {
|
|
mAtInfo.mpCollider = mFoot2Cc[i].GetTgHitObj();
|
|
|
|
if (mFoot2Cc[i].ChkTgShield()) {
|
|
mAtInfo.field_0x18 = 42;
|
|
mAtInfo.mpCollider->SetAtAtp(0);
|
|
} else {
|
|
mAtInfo.field_0x18 = 0;
|
|
}
|
|
|
|
cc_at_check(this, &mAtInfo);
|
|
|
|
int dmg_amount = prev_hp - health;
|
|
health = prev_hp;
|
|
|
|
if (!mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) {
|
|
dScnPly_c::setPauseTimer(0);
|
|
}
|
|
|
|
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK | AT_TYPE_WOLF_CUT_TURN | AT_TYPE_10000000 | AT_TYPE_MIDNA_LOCK)) {
|
|
field_0x6e4 = 20;
|
|
} else {
|
|
field_0x6e4 = 10;
|
|
}
|
|
|
|
if (mAtInfo.mAttackPower <= 1) {
|
|
field_0x6e4 = 10;
|
|
}
|
|
|
|
mTakenBigDmg = checkBigDamage();
|
|
|
|
if (mAction == ACT_ICE_DAMAGE && mAtInfo.field_0x18 != 42) {
|
|
switch (checkDamageType()) {
|
|
case DMGTYPE_BOOMERANG:
|
|
setActionMode(ACT_ICE_DAMAGE, 40);
|
|
mModeTimer = 0;
|
|
break;
|
|
case DMGTYPE_OBJ:
|
|
setActionMode(ACT_ICE_DAMAGE, 20);
|
|
mModeTimer = 0;
|
|
break;
|
|
case DMGTYPE_MISC:
|
|
setActionMode(ACT_ICE_DAMAGE, 30);
|
|
mModeTimer = 0;
|
|
break;
|
|
case DMGTYPE_SWORD:
|
|
setDamageSe(&mFoot2Cc[i], dmg_amount);
|
|
setActionMode(ACT_ICE_DAMAGE, 10);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
mFoot2Cc[i].ClrTgHit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8063F84C-8063F970 00182C 0124+00 3/3 0/0 0/0 .text setNextDamageMode__10daB_ZANT_cFi
|
|
*/
|
|
bool daB_ZANT_c::setNextDamageMode(BOOL i_checkHealth) {
|
|
if (i_checkHealth) {
|
|
if (mFightCycle == 0 && health < 140) {
|
|
mFightCycle++;
|
|
setBaseActionMode(2);
|
|
return true;
|
|
}
|
|
} else if (mFightCycle == 0) {
|
|
if (mTakenBigDmg) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
mFightCycle++;
|
|
setBaseActionMode(2);
|
|
return true;
|
|
}
|
|
} else if (health <= 0 || mTakenBigDmg) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
mFightCycle = 0;
|
|
setActionMode(ACT_ROOM_CHANGE, 0);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 8063F970-8063FAB4 001950 0144+00 1/1 0/0 0/0 .text s_obj_sub__FPvPv */
|
|
static void* s_obj_sub(void* i_actor, void* i_data) {
|
|
if (fopAcM_IsActor(i_actor)) {
|
|
if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && !fopAcM_checkCarryNow((fopAc_ac_c*)i_actor)) {
|
|
f32 obj_dist = fopAcM_searchActorDistanceXZ((fopAc_ac_c*)i_actor, (fopAc_ac_c*)i_data);
|
|
if (obj_dist < 300.0f && fopAcM_GetSpeed((fopAc_ac_c*)i_actor).y) {
|
|
if (fopAcM_GetName(i_actor) == PROC_Obj_Carry) {
|
|
return i_actor;
|
|
}
|
|
|
|
if (fopAcM_GetName(i_actor) == PROC_NBOMB) {
|
|
return i_actor;
|
|
}
|
|
}
|
|
|
|
if (obj_dist < 300.0f && fopAcM_GetName(i_actor) == PROC_NBOMB && ((daNbomb_c*)i_actor)->getExTime() < 10) {
|
|
return i_actor;
|
|
}
|
|
|
|
if (obj_dist < 700.0f && fopAcM_GetName(i_actor) == PROC_ARROW && fopAcM_GetSpeedF((fopAc_ac_c*)i_actor)) {
|
|
s16 actor_angle = ((fopAc_ac_c*)i_actor)->current.angle.y;
|
|
s16 angle_to_boss = fopAcM_searchActorAngleY((fopAc_ac_c*)i_actor, (fopAc_ac_c*)i_data);
|
|
if (abs((s16)(actor_angle - angle_to_boss)) < 0x2000) {
|
|
return i_actor;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 8063FAB4-8063FF6C 001A94 04B8+00 3/3 0/0 0/0 .text checkAvoidWeapon__10daB_ZANT_cFi */
|
|
bool daB_ZANT_c::checkAvoidWeapon(BOOL i_allowBoomerang) {
|
|
if (i_allowBoomerang == 2) {
|
|
return FALSE;
|
|
}
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
// avoid bomb, arrow, carry obj
|
|
fopAc_ac_c* obj = (fopAc_ac_c*)fpcM_Search(s_obj_sub, this);
|
|
if (obj != NULL) {
|
|
return TRUE;
|
|
}
|
|
|
|
// avoid clawshot
|
|
if (dComIfGp_checkPlayerStatus0(0, 0x4000)) {
|
|
cXyz* ppos = player->getHookshotTopPos();
|
|
if (ppos != NULL && ppos->absXZ(current.pos) < 300.0f) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// avoid ball and chain
|
|
cXyz* ppos = player->getIronBallCenterPos();
|
|
if (ppos != NULL) {
|
|
daAlink_c* player_alink = daAlink_getAlinkActorClass();
|
|
if ((player_alink->checkIronBallThrowMode() || player_alink->checkIronBallThrowReturnMode()) && !player->checkIronBallGroundStop()) {
|
|
if (ppos->absXZ(current.pos) < 300.0f) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// avoid boomerang
|
|
if (!i_allowBoomerang && player->getThrowBoomerangActor() != NULL) {
|
|
fopAc_ac_c* pboomerang = (fopAc_ac_c*)player->getThrowBoomerangActor();
|
|
if (pboomerang->current.pos.absXZ(current.pos) < 300.0f) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 8063FF6C-8063FFAC 001F4C 0040+00 18/18 0/0 0/0 .text setTgHitBit__10daB_ZANT_cFi */
|
|
void daB_ZANT_c::setTgHitBit(BOOL i_onBit) {
|
|
if (i_onBit) {
|
|
mBodySphCc[0].OnTgSetBit();
|
|
mBodySphCc[1].OnTgSetBit();
|
|
} else {
|
|
mBodySphCc[0].OffTgSetBit();
|
|
mBodySphCc[1].OffTgSetBit();
|
|
}
|
|
}
|
|
|
|
/* 8063FFAC-8063FFEC 001F8C 0040+00 2/2 0/0 0/0 .text setCoHitBit__10daB_ZANT_cFi */
|
|
void daB_ZANT_c::setCoHitBit(BOOL i_onBit) {
|
|
if (i_onBit) {
|
|
mBodySphCc[0].OnCoSetBit();
|
|
mBodySphCc[1].OnCoSetBit();
|
|
} else {
|
|
mBodySphCc[0].OffCoSetBit();
|
|
mBodySphCc[1].OffCoSetBit();
|
|
}
|
|
}
|
|
|
|
/* 8063FFEC-806400BC 001FCC 00D0+00 2/2 0/0 0/0 .text setTgShield__10daB_ZANT_cFi */
|
|
void daB_ZANT_c::setTgShield(BOOL i_onShield) {
|
|
if (i_onShield) {
|
|
mBodySphCc[0].OnTgShield();
|
|
mBodySphCc[0].OnTgSpinnerReflect();
|
|
mBodySphCc[0].OnTgIronBallRebound();
|
|
|
|
mBodySphCc[1].OnTgShield();
|
|
mBodySphCc[1].OnTgSpinnerReflect();
|
|
mBodySphCc[1].OnTgIronBallRebound();
|
|
|
|
mBodySphCc[0].OffTgNoHitMark();
|
|
mBodySphCc[1].OffTgNoHitMark();
|
|
|
|
mBodySphCc[0].SetTgHitMark(CcG_Tg_UNK_MARK_2);
|
|
mBodySphCc[1].SetTgHitMark(CcG_Tg_UNK_MARK_2);
|
|
} else {
|
|
mBodySphCc[0].OffTgShield();
|
|
mBodySphCc[0].OffTgSpinnerReflect();
|
|
mBodySphCc[0].OffTgIronBallRebound();
|
|
|
|
mBodySphCc[1].OffTgShield();
|
|
mBodySphCc[1].OffTgSpinnerReflect();
|
|
mBodySphCc[1].OffTgIronBallRebound();
|
|
|
|
mBodySphCc[0].SetTgHitMark(CcG_Tg_UNK_MARK_0);
|
|
mBodySphCc[1].SetTgHitMark(CcG_Tg_UNK_MARK_0);
|
|
}
|
|
}
|
|
|
|
/* 806400BC-806400C8 00209C 000C+00 3/3 0/0 0/0 .text setTgType__10daB_ZANT_cFUl */
|
|
void daB_ZANT_c::setTgType(u32 i_type) {
|
|
mBodySphCc[0].SetTgType(i_type);
|
|
mBodySphCc[1].SetTgType(i_type);
|
|
}
|
|
|
|
/* 806400C8-80640104 0020A8 003C+00 1/1 0/0 0/0 .text setZantMessage__10daB_ZANT_cFi */
|
|
void daB_ZANT_c::setZantMessage(int i_msgNo) {
|
|
mMsgNo = i_msgNo;
|
|
mMsgID = fopMsgM_messageSet(i_msgNo, 1000);
|
|
}
|
|
|
|
/* 80640104-80640180 0020E4 007C+00 1/1 0/0 0/0 .text doZantMessage__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::doZantMessage() {
|
|
if (mpMsg != NULL) {
|
|
if (mpMsg->mode == 14) {
|
|
mpMsg->mode = 16;
|
|
} else if (mpMsg->mode == 18) {
|
|
mpMsg->mode = 19;
|
|
mMsgID = fpcM_ERROR_PROCESS_ID_e;
|
|
return 1;
|
|
}
|
|
} else {
|
|
mpMsg = fopMsgM_SearchByID(mMsgID);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 80640180-80640310 002160 0190+00 2/2 0/0 0/0 .text setIceLandingEffect__10daB_ZANT_cFi
|
|
*/
|
|
void daB_ZANT_c::setIceLandingEffect(BOOL i_landFootR) {
|
|
static u16 l_landing_effect_id[] = {
|
|
0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1,
|
|
};
|
|
|
|
cXyz particle_pos;
|
|
if (!i_landFootR) {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL));
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR));
|
|
}
|
|
|
|
mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&particle_pos);
|
|
particle_pos.y = 2.0f;
|
|
|
|
cXyz size(1.0f, 1.0f, 1.0f);
|
|
for (int i = 0; i < 6; i++) {
|
|
dComIfGp_particle_set(l_landing_effect_id[i], &particle_pos, &tevStr, &shape_angle, &size);
|
|
}
|
|
|
|
particle_pos.set(0.0f, 0.0f, 0.0f);
|
|
dComIfGp_particle_set(0x86E2, &particle_pos, &tevStr, &shape_angle, NULL);
|
|
}
|
|
|
|
/* 80640310-806403D4 0022F0 00C4+00 1/1 0/0 0/0 .text setWaterBubble__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::setWaterBubble() {
|
|
cXyz particle_pos;
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_MOUTH));
|
|
mDoMtx_stack_c::multVecZero(&particle_pos);
|
|
|
|
field_0x389c[0] = dComIfGp_particle_set(field_0x389c[0], 0x1E8, &particle_pos, &tevStr);
|
|
}
|
|
|
|
/* 806403D4-80640478 0023B4 00A4+00 1/1 0/0 0/0 .text setMonkeyFallEffect__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::setMonkeyFallEffect() {
|
|
static u16 l_landing_effect_id[] = {0x8901, 0x8902, 0x8903};
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
dComIfGp_particle_set(l_landing_effect_id[i], ¤t.pos, &tevStr, &shape_angle, NULL);
|
|
}
|
|
}
|
|
|
|
/* 80640478-80640584 002458 010C+00 1/1 0/0 0/0 .text setLastRollEffect__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::setLastRollEffect() {
|
|
static u16 l_roll_effect_id[] = {0x8904, 0x8905};
|
|
|
|
mSound.startCreatureSoundLevel(Z2SE_EN_ZAN_CTL_SPIN_ATK, 0, -1);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
field_0x38ac[i] = dComIfGp_particle_set(field_0x38ac[i], l_roll_effect_id[i], ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
fopAcM_effSmokeSet2(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr);
|
|
}
|
|
|
|
/* 8064F690-8064F694 0000E0 0004+00 2/2 0/0 0/0 .bss target_info_count */
|
|
static int target_info_count;
|
|
|
|
/* 80640584-80640654 002564 00D0+00 1/1 0/0 0/0 .text s_pillar_sub__FPvPv */
|
|
static void* s_pillar_sub(void* i_actor, void* i_data) {
|
|
if (fopAcM_IsActor(i_actor)) {
|
|
if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_Obj_Pillar) {
|
|
if (((daPillar_c*)i_actor)->getMdlType() != 0) {
|
|
((daB_ZANT_c*)i_data)->mPillarIDs[8] = fopAcM_GetID(i_actor);
|
|
} else {
|
|
((daB_ZANT_c*)i_data)->mPillarIDs[target_info_count] = fopAcM_GetID(i_actor);
|
|
target_info_count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 80640654-80640664 002634 0010+00 0/0 0/0 1/1 .text getMagicSpeed__10daB_ZANT_cFv */
|
|
f32 daB_ZANT_c::getMagicSpeed() {
|
|
return l_HIO.mBulletSpeed;
|
|
}
|
|
|
|
/* 80640664-80640674 002644 0010+00 0/0 0/0 1/1 .text getMagicWaterSpeed__10daB_ZANT_cFv */
|
|
f32 daB_ZANT_c::getMagicWaterSpeed() {
|
|
return l_HIO.mBulletSpeedUnderwater;
|
|
}
|
|
|
|
/* 80640674-80640C20 002654 05AC+00 1/1 0/0 0/0 .text executeSmallAttack__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeSmallAttack() {
|
|
cXyz sp44;
|
|
s16 aim_target_angle = fopAcM_searchPlayerAngleY(this);
|
|
|
|
if (mFightPhase == PHASE_OI) {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
|
|
if (pmobile != NULL) {
|
|
s16 var_r26 = pmobile->shape_angle.y - aim_target_angle;
|
|
if (abs(var_r26) > 0x1400) {
|
|
if (var_r26 < 0) {
|
|
aim_target_angle = pmobile->shape_angle.y + 0x1000;
|
|
} else {
|
|
aim_target_angle = pmobile->shape_angle.y - 0x1000;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
setTgHitBit(TRUE);
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
mMode = 2;
|
|
field_0x6fd = 0;
|
|
|
|
if (field_0x711 != 0) {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_B_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
field_0x717 = 1;
|
|
break;
|
|
case 2:
|
|
if (field_0x711 != 0) {
|
|
if (mpModelMorf->checkFrame(15)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_ATK_BALL, -1);
|
|
}
|
|
} else {
|
|
if (mpModelMorf->checkFrame(16)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_ATK_BALL, -1);
|
|
}
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.y, aim_target_angle, 8, 0x400, 0x80);
|
|
if (mpModelMorf->isStop()) {
|
|
f32 anm_speed = l_HIO.mAttackAnmSpeed;
|
|
if (mFightPhase == PHASE_OI) {
|
|
anm_speed = 1.0f;
|
|
}
|
|
|
|
if (field_0x711 != 0) {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_C, J3DFrameCtrl::EMode_LOOP, 3.0f, anm_speed);
|
|
} else {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_B_B, J3DFrameCtrl::EMode_LOOP, 3.0f, anm_speed);
|
|
}
|
|
|
|
mMode = 3;
|
|
field_0x6fd = 0;
|
|
}
|
|
break;
|
|
case 3:
|
|
cLib_addCalcAngleS(&shape_angle.y, aim_target_angle, 8, 0x400, 0x80);
|
|
|
|
if (mpModelMorf->checkFrame(3) || mpModelMorf->checkFrame(13)) {
|
|
if (mpModelMorf->checkFrame(13)) {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARML4));
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARMR4));
|
|
}
|
|
|
|
mDoMtx_stack_c::multVecZero(&sp44);
|
|
|
|
u32 parameter = field_0x6fd + 1;
|
|
if (field_0x703 < 10) {
|
|
parameter += 2;
|
|
}
|
|
|
|
if (parameter > 6) {
|
|
parameter = 6;
|
|
}
|
|
|
|
fopAcM_createChild(PROC_B_ZANTM, fopAcM_GetID(this), parameter, &sp44, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
|
|
dComIfGp_particle_set(0x886B, &sp44, &shape_angle, NULL);
|
|
|
|
field_0x6fd++;
|
|
field_0x704++;
|
|
} else if ((mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(19)) && field_0x6fd >= field_0x703) {
|
|
mMode = 4;
|
|
|
|
if (field_0x711 != 0) {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_D, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_MAGICSHOOTA_B_C, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
field_0x717 = 0;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (mpModelMorf->isStop()) {
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
if (mFightPhase == PHASE_BB) {
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 1);
|
|
} else if (mFightPhase == PHASE_MG) {
|
|
setActionMode(ACT_SIMA_JUMP, 0);
|
|
} else if (mFightPhase == PHASE_OI) {
|
|
setActionMode(ACT_WATER, 0);
|
|
} else if (mFightPhase == PHASE_MK) {
|
|
setActionMode(ACT_MONKEY, 0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (mFightPhase == PHASE_BB && checkAvoidWeapon(TRUE)) {
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
}
|
|
|
|
/* 80640C20-80640D14 002C00 00F4+00 3/3 0/0 0/0 .text calcScale__10daB_ZANT_cFi */
|
|
bool daB_ZANT_c::calcScale(BOOL param_0) {
|
|
if (!param_0) {
|
|
cLib_addCalc(&mModelScaleXZ, 0.0f, 0.5f, 0.25f, 0.1f);
|
|
cLib_addCalc(&mModelScaleY, 1.2f, 0.5f, 0.1f, 0.1f);
|
|
|
|
if (!mModelScaleXZ) {
|
|
mModelScaleY = 0.0f;
|
|
mModelScaleXZ = 0.0f;
|
|
return true;
|
|
}
|
|
} else {
|
|
cLib_addCalc(&mModelScaleY, 1.0f, 0.5f, 0.2f, 0.1f);
|
|
|
|
if (mModelScaleY > 0.5f) {
|
|
cLib_addCalc(&mModelScaleXZ, 1.0f, 0.5f, 0.2f, 0.1f);
|
|
}
|
|
|
|
if (mModelScaleY == 1.0f && mModelScaleXZ == 1.0f) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 80640D14-80641230 002CF4 051C+00 1/1 0/0 0/0 .text executeWarp__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeWarp() {
|
|
switch (mMode) {
|
|
case 0:
|
|
case 1:
|
|
attention_info.flags = 0;
|
|
setTgHitBit(FALSE);
|
|
setCoHitBit(FALSE);
|
|
|
|
if (mFightPhase != PHASE_MK && mFightPhase != PHASE_YO && mFightPhase != PHASE_LAST) {
|
|
if (field_0x711 & 1) {
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
}
|
|
|
|
mMode += 2;
|
|
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
|
|
dComIfGp_particle_set(0x88FF, ¤t.pos, &shape_angle, NULL);
|
|
dComIfGp_particle_set(0x8900, ¤t.pos, &shape_angle, NULL);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1);
|
|
case 2:
|
|
case 3:
|
|
if (calcScale(0)) {
|
|
mMode += 2;
|
|
|
|
switch (mFightPhase) {
|
|
case PHASE_BB:
|
|
if (field_0x70b == 0) {
|
|
field_0x70b = 1;
|
|
mModeTimer = 120;
|
|
} else if (mFightCycle == 0) {
|
|
mModeTimer = 40;
|
|
} else {
|
|
mModeTimer = 15;
|
|
}
|
|
break;
|
|
case PHASE_MG:
|
|
mModeTimer = 15;
|
|
break;
|
|
case PHASE_OI:
|
|
mModeTimer = 60;
|
|
break;
|
|
case PHASE_MK:
|
|
if (mLastAction == ACT_MONKEY) {
|
|
mModeTimer = 15;
|
|
} else {
|
|
mModeTimer = 60;
|
|
}
|
|
break;
|
|
case PHASE_YO:
|
|
mModeTimer = 60;
|
|
break;
|
|
case PHASE_LAST:
|
|
if (mFlyWarpPosID != 0) {
|
|
mModeTimer = 60;
|
|
} else {
|
|
mModeTimer = 15;
|
|
}
|
|
break;
|
|
}
|
|
|
|
mModeTimer += (int)l_HIO.mPlayWarpTime;
|
|
}
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
if (mModeTimer == 0) {
|
|
if (mMode == 4) {
|
|
dBgS_ObjGndChk gndchk;
|
|
gndchk.SetPos(&mFlyWarpPos);
|
|
|
|
f32 gnd_y = dComIfG_Bgsp().GroundCross(&gndchk);
|
|
if (gnd_y != -1000000000.0f) {
|
|
mFlyWarpPos.y = gnd_y;
|
|
}
|
|
|
|
shape_angle.y = field_0x6b8;
|
|
shape_angle.x = 0;
|
|
current.pos = mFlyWarpPos;
|
|
} else {
|
|
current.pos = mFlyWarpPos;
|
|
shape_angle.x = 0;
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
}
|
|
|
|
old.pos = current.pos;
|
|
mMode = 6;
|
|
|
|
if (field_0x711 & 2) {
|
|
field_0x711 = (field_0x711 & 1) ^ 1;
|
|
} else {
|
|
field_0x711 &= 1;
|
|
}
|
|
|
|
if (field_0x711 != 0) {
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
|
|
dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1);
|
|
}
|
|
break;
|
|
case 6:
|
|
if (calcScale(1)) {
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
setCoHitBit(TRUE);
|
|
setBaseActionMode(0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806412A8-806414E4 003288 023C+00 1/1 0/0 0/0 .text executeDamage__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeDamage() {
|
|
switch (mMode) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
if (setNextDamageMode(FALSE)) {
|
|
setTgHitBit(FALSE);
|
|
return;
|
|
} else if (mFightPhase == PHASE_OI && setNextDamageMode(TRUE)) {
|
|
setTgHitBit(FALSE);
|
|
return;
|
|
}
|
|
|
|
field_0x702 = 0;
|
|
speedF = 0.0f;
|
|
setTgHitBit(TRUE);
|
|
|
|
if (mMode == 0) {
|
|
if (cM_rnd() < 0.5f) {
|
|
mMode = 1;
|
|
} else {
|
|
mMode = 2;
|
|
}
|
|
}
|
|
|
|
if (mFightPhase == PHASE_OI) {
|
|
if (mMode == 1) {
|
|
setBck(BCK_ZAN_FLOAT_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_FLOAT_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
} else if (mMode == 1) {
|
|
setBck(BCK_ZAN_DAMAGEL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_DAMAGER_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
mMode = 5;
|
|
mModeTimer = 40;
|
|
case 5:
|
|
if (field_0x6f4 == 0) {
|
|
setTgHitBit(FALSE);
|
|
}
|
|
|
|
if (mpModelMorf->isStop() && !setNextDamageMode(TRUE)) {
|
|
setBaseActionMode(0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806414E4-80641640 0034C4 015C+00 1/1 0/0 0/0 .text executeConfuse__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeConfuse() {
|
|
switch (mMode) {
|
|
case 0:
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
mMode = 1;
|
|
|
|
setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1);
|
|
field_0x702 = 0;
|
|
case 1:
|
|
if (mpModelMorf->isStop()) {
|
|
setBaseActionMode(0);
|
|
}
|
|
break;
|
|
case 5:
|
|
setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
field_0x702 = 0;
|
|
mModeTimer = 20;
|
|
mMode = 6;
|
|
case 6:
|
|
if (mModeTimer == 0) {
|
|
setBaseActionMode(0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80641640-806427EC 003620 11AC+00 2/2 0/0 0/0 .text executeOpening__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeOpening() {
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
cXyz sp34(0.0f, 0.0f, 0.0f);
|
|
cXyz sp40;
|
|
cXyz sp4C;
|
|
|
|
switch (mMode) {
|
|
case MODE_START_DEMO:
|
|
current.pos.set(0.0f, 0.0f, 160.0f);
|
|
shape_angle.y = -0x8000;
|
|
|
|
if (!eventInfo.checkCommandDemoAccrpt()) {
|
|
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 4);
|
|
eventInfo.onCondition(2);
|
|
return;
|
|
}
|
|
|
|
Z2GetAudioMgr()->setDemoName("force_start");
|
|
fopAcM_OffStatus(this, 0x4000);
|
|
|
|
sp34.set(0.0f, 0.0f, -700.0f);
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
|
|
setBck(BCK_ZAN_OP_1, J3DFrameCtrl::EMode_LOOP, 0.0f, 1.0f);
|
|
mMode = MODE_START_DEMO_WAIT;
|
|
mModeTimer = 30;
|
|
|
|
camera->mCamera.Stop();
|
|
camera->mCamera.SetTrimSize(3);
|
|
field_0x77c = 220.0f;
|
|
case MODE_START_DEMO_WAIT:
|
|
sp4C.set(0.0f, 175.0f, 3.0f);
|
|
sp40.set(0.0f, 270.0f, -194.0f);
|
|
mDemoCamCenter = sp4C;
|
|
mDemoCamEye = sp40;
|
|
mDemoCamBank = 30.0f;
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_PAN_GROUND;
|
|
mModeTimer = 80;
|
|
}
|
|
break;
|
|
case MODE_PAN_GROUND:
|
|
sp4C.set(0.0f, 81.0f, -187.0f);
|
|
sp40.set(0.0f, 67.0f, -408.0f);
|
|
cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.1f, 4.3f);
|
|
cLib_addCalcPos2(&mDemoCamEye, sp40, 0.1f, 6.0f);
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_MSG_1;
|
|
setBck(BCK_ZAN_OP_2, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_OP_V_WAKEUP, -1);
|
|
}
|
|
break;
|
|
case MODE_MSG_1:
|
|
if (mpModelMorf->getFrame() > 5.0f) {
|
|
sp4C.set(0.0f, 86.0f, -9.0f);
|
|
sp40.set(0.0f, 10.0f, -209.0f);
|
|
cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.5f, 26.0f);
|
|
cLib_addCalcPos2(&mDemoCamEye, sp40, 0.5f, 30.0f);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
mMode = MODE_MSG_1_WAIT;
|
|
mModeTimer = 20;
|
|
setBck(BCK_ZAN_OP_3, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
setZantMessage(0xE3B); // My god had only one wish...
|
|
}
|
|
break;
|
|
case MODE_MSG_1_WAIT:
|
|
if (doZantMessage() == true) {
|
|
mModeTimer = 20;
|
|
mMode = MODE_WARP_OUT_SE;
|
|
}
|
|
break;
|
|
case MODE_WARP_OUT_SE:
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_START_WARP;
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1);
|
|
}
|
|
break;
|
|
case MODE_START_WARP:
|
|
if (calcScale(0)) {
|
|
current.pos.set(0.0f, 225.0f, -1700.0f);
|
|
sp34.set(0.0f, 0.0f, -500.0f);
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
player->changeOriginalDemo();
|
|
player->changeDemoMode(1, 0, 0, 0);
|
|
|
|
mMode = MODE_WARP_WAIT;
|
|
mDemoCamCenter.set(0.0f, 200.0f, -1700.0f);
|
|
mDemoCamEye.set(0.0f, 70.0f, -300.0f);
|
|
mDemoCamBank = 68.0f;
|
|
mModeTimer = 15;
|
|
}
|
|
break;
|
|
case MODE_WARP_WAIT:
|
|
if (mModeTimer == 0) {
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
player->changeDemoMode(0x48, 0, 0, 0);
|
|
mMode = MODE_PAN_THRONE;
|
|
mModeTimer = 105;
|
|
}
|
|
break;
|
|
case MODE_PAN_THRONE:
|
|
sp4C.set(32.0f, 290.0f, -1678.0f);
|
|
sp40.set(100.0f, 70.0f, -300.0f);
|
|
cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.1f, 1.0f);
|
|
cLib_addCalcPos2(&mDemoCamEye, sp40, 0.1f, 1.0f);
|
|
|
|
if (mModeTimer <= 30) {
|
|
if (mModeTimer == 30) {
|
|
current.angle.y = 0;
|
|
shape_angle.y = 0;
|
|
dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1);
|
|
}
|
|
calcScale(1);
|
|
}
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_ZOOM_THRONE;
|
|
mModeTimer = 30;
|
|
}
|
|
break;
|
|
case MODE_ZOOM_THRONE:
|
|
calcScale(1);
|
|
sp4C.set(32.0f, 290.0f, -1678.0f);
|
|
sp40.set(66.0f, 180.0f, -989.0f);
|
|
cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.5f, 60.0f);
|
|
cLib_addCalcPos2(&mDemoCamEye, sp40, 0.5f, 60.0f);
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_MSG_2;
|
|
setZantMessage(0xE3C);
|
|
}
|
|
break;
|
|
case MODE_MSG_2:
|
|
if (doZantMessage() == true) {
|
|
setBck(BCK_ZAN_OP_RISE, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f);
|
|
mMode = MODE_FLY_UP;
|
|
mModeTimer = 90;
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_OP_FLY, 0, -1);
|
|
}
|
|
break;
|
|
case MODE_FLY_UP:
|
|
current.pos.y += 3.0f;
|
|
mDemoCamCenter.y += 2.0f;
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_CLOSE_UP;
|
|
}
|
|
break;
|
|
case MODE_CLOSE_UP:
|
|
if (mModeTimer == 0) {
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(0.0f, 300.0f, 700.0f);
|
|
mDoMtx_stack_c::multVecZero(¤t.pos);
|
|
current.pos.y += 100.0f;
|
|
current.pos.z -= 800.0f;
|
|
old.pos = current.pos;
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
gravity = 0.0f;
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
setBck(BCK_ZAN_OP_RISE, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
sp34.x = -140.0f;
|
|
sp34.y += 250.0f;
|
|
sp34.z = -800.0f;
|
|
player->setPlayerPosAndAngle(&sp34, 0x8000, 0);
|
|
player->changeOriginalDemo();
|
|
player->changeDemoPos0(&sp34);
|
|
player->changeDemoMode(0x17, 1, 4, 0);
|
|
mDemoCamBank = 58.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(-85.0f, 344.0f, 382.0f);
|
|
mDoMtx_stack_c::multVecZero(&mDemoCamEye);
|
|
mDemoCamEye.y += 250.0f;
|
|
mDemoCamEye.z -= 800.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(258.0f, 672.0f, 1374.0f);
|
|
mDoMtx_stack_c::multVecZero(&mDemoCamCenter);
|
|
mDemoCamCenter.y += 200.0f;
|
|
mDemoCamCenter.z -= 800.0f;
|
|
|
|
Z2GetAudioMgr()->bgmStart(Z2BGM_BOSS_ZANT, 0, 0);
|
|
field_0x77c = 0.0f;
|
|
field_0x6fc = 1;
|
|
mMode = MODE_SET_BOSS_TITLE;
|
|
mModeTimer = 160;
|
|
}
|
|
break;
|
|
case MODE_SET_BOSS_TITLE:
|
|
if (mModeTimer == 100) {
|
|
fopMsgM_messageSetDemo(0x486);
|
|
}
|
|
|
|
cLib_addCalc(¤t.pos.y, 250.0f + 300.0f, 0.1f, 3.0f, 0.9f);
|
|
cLib_addCalc(&mDemoCamCenter.y, 250.0f + 672.0f, 0.1f, 1.0f, 0.3f);
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_WARP_IN_WAIT;
|
|
mModeTimer = 20;
|
|
}
|
|
break;
|
|
case MODE_WARP_IN_SE:
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (mModeTimer == 0) {
|
|
dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL);
|
|
mMode = MODE_WARP_IN_SCALE;
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1);
|
|
}
|
|
break;
|
|
case MODE_WARP_IN_SCALE:
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (calcScale(1)) {
|
|
mMode = MODE_WARP_IN_WAIT;
|
|
mModeTimer = 20;
|
|
}
|
|
break;
|
|
case MODE_WARP_IN_WAIT:
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_ZOOM_OUT_ROOM_CHANGE;
|
|
mModeTimer = 50;
|
|
}
|
|
break;
|
|
case MODE_ZOOM_OUT_ROOM_CHANGE:
|
|
calcRoomChangeCamera(0);
|
|
if (mModeTimer == 0) {
|
|
mMode = MODE_START_ROOM_CHANGE;
|
|
setBck(BCK_ZAN_FLOAT_APPEAR, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_MAHOJIN_BB, 0, -1);
|
|
field_0x714 = 1;
|
|
mKankyoBlend = 0.0f;
|
|
}
|
|
break;
|
|
case MODE_START_ROOM_CHANGE:
|
|
cLib_chaseF(&mKankyoBlend, 1.0f, 0.006f);
|
|
if (mpModelMorf->checkFrame(110)) {
|
|
mMahojinAnmMode = 1;
|
|
field_0x715 = 30;
|
|
}
|
|
|
|
if (mpModelMorf->getFrame() > 110.0f) {
|
|
cLib_chaseF(&mKankyoBlend, 1.0f, 0.01f);
|
|
}
|
|
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
dComIfGp_getVibration().StopQuake(31);
|
|
setBck(BCK_ZAN_FLOAT_APPEARWAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = MODE_ROOM_CHANGE;
|
|
mModeTimer = l_HIO.mMahojinWaitTime;
|
|
|
|
cXyz pos(0.0f, 0.0f, 0.0f);
|
|
dComIfGs_setRestartRoom(pos, 0, warp_next_room[1]);
|
|
return;
|
|
}
|
|
break;
|
|
case MODE_ROOM_CHANGE:
|
|
mFightPhase++;
|
|
if (mFightPhase >= PHASE_MAX) {
|
|
mFightPhase = PHASE_OP;
|
|
}
|
|
|
|
current.pos.set(-140.0f, 300.0f, 700.0f);
|
|
|
|
sp34.set(0.0f, 0.0f, 0.0f);
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
player->changeDemoMode(0x17, 1, 4, 0);
|
|
|
|
mDemoCamEye.x += 140.0f;
|
|
mDemoCamEye.y -= 250.0f;
|
|
mDemoCamEye.z += 800.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(mDemoCamEye);
|
|
mDoMtx_stack_c::multVecZero(&mDemoCamEye);
|
|
|
|
mDemoCamCenter.x += 140.0f;
|
|
mDemoCamCenter.y -= 250.0f;
|
|
mDemoCamCenter.z += 800.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(mDemoCamCenter);
|
|
mDoMtx_stack_c::multVecZero(&mDemoCamCenter);
|
|
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
initNextRoom();
|
|
mMode = MODE_END_ROOM_CHANGE;
|
|
case MODE_END_ROOM_CHANGE:
|
|
if (mModeTimer == 0 && dComIfGp_roomControl_checkStatusFlag(warp_next_room[mFightPhase], 0x10)) {
|
|
mMode = MODE_END_DEMO;
|
|
field_0x714 = 0;
|
|
mKankyoBlend = 0.0f;
|
|
setBck(BCK_ZAN_FLOAT_WAITRETURN, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f);
|
|
mMahojinAnmMode = 4;
|
|
}
|
|
break;
|
|
case MODE_END_DEMO:
|
|
cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f);
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye);
|
|
camera->mCamera.Start();
|
|
camera->mCamera.SetTrimSize(0);
|
|
dComIfGp_event_reset();
|
|
|
|
field_0x6fc = 0;
|
|
setTgHitBit(TRUE);
|
|
setBaseActionMode(1);
|
|
Z2GetAudioMgr()->setDemoName("force_end");
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (field_0x715 != 0) {
|
|
calcRoomChangeCamera(1);
|
|
field_0x715--;
|
|
}
|
|
|
|
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0);
|
|
}
|
|
|
|
/* 806427EC-80642EC8 0047CC 06DC+00 2/1 0/0 0/0 .text executeFly__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeFly() {
|
|
dBgS_ObjGndChk_All gndchk;
|
|
cXyz sp9C;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
setTgHitBit(TRUE);
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mModeTimer = 0;
|
|
mMode = 1;
|
|
gravity = 0.0f;
|
|
field_0x70c = 0;
|
|
setTgType(0x10040);
|
|
case 1:
|
|
if (mModeTimer == 0) {
|
|
if (mFightCycle == 0) {
|
|
field_0x703 = l_HIO.mBulletNum;
|
|
} else {
|
|
field_0x703 = 8;
|
|
}
|
|
|
|
mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3];
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_SMALL_ATTACK, 0);
|
|
return;
|
|
}
|
|
break;
|
|
case 10:
|
|
setBck(BCK_ZAN_SWAMP_FALL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_FALL, -1);
|
|
mMode = 11;
|
|
|
|
speedF = 0.0f;
|
|
speed.y = 45.0f;
|
|
current.angle.y = shape_angle.y;
|
|
gravity = -5.0f;
|
|
field_0x6f8 = 0x1000;
|
|
setTgHitBit(FALSE);
|
|
case 11:
|
|
case 12:
|
|
if (mMode == 11) {
|
|
if (mpModelMorf->isStop()) {
|
|
setBck(BCK_ZAN_SWAMP_FALL_LOOP, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 12;
|
|
}
|
|
} else if (speed.y < -10.0f) {
|
|
setBck(BCK_ZAN_SWAMP_FALL_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 13;
|
|
}
|
|
case 13:
|
|
if (speed.y < 5.0f) {
|
|
gravity = -2.0f;
|
|
} else {
|
|
gravity = -5.0f;
|
|
}
|
|
|
|
if (field_0x6f8 != 0) {
|
|
shape_angle.y += field_0x6f8;
|
|
cLib_chaseAngleS(&field_0x6f8, 0, 0x40);
|
|
} else {
|
|
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 4, 0x1000);
|
|
}
|
|
|
|
sp9C = current.pos;
|
|
sp9C.y += 100.0f;
|
|
gndchk.SetPos(&sp9C);
|
|
{
|
|
f32 gnd_pos = dComIfG_Bgsp().GroundCross(&gndchk);
|
|
if (gnd_pos != -1000000000.0f && current.pos.y <= gnd_pos) {
|
|
if (dComIfG_Bgsp().GetPolyAtt0(gndchk) == 11) {
|
|
speed.y = 50.0f;
|
|
speedF = 15.0f;
|
|
current.angle.y = (cM_rndFX(2.9f) * (f32)0x1000) - (f32)0x8000;
|
|
|
|
mMode = 11;
|
|
setBck(BCK_ZAN_SWAMP_FALL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_JUMP, -1);
|
|
|
|
cXyz pos(current.pos.x, gnd_pos, current.pos.z);
|
|
cXyz size(1.5f, 1.5f, 1.5f);
|
|
for (int i = 0; i < 4; i++) {
|
|
static u16 w_eff_id[] = {0x01B8, 0x01B9, 0x01BA, 0x01BB};
|
|
field_0x389c[i] = dComIfGp_particle_setPolyColor(field_0x389c[i], w_eff_id[i], gndchk, &pos, &tevStr, &shape_angle, &size, 0, NULL, -1, NULL);
|
|
}
|
|
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_BB_WTR, 0, -1);
|
|
} else {
|
|
fopAcM_effSmokeSet1(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr, 1);
|
|
speedF = 0.0f;
|
|
setBck(BCK_ZAN_SWAMP_LANDING, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f);
|
|
mMode = 14;
|
|
setTgHitBit(TRUE);
|
|
setTgType(0xD8FBFDFF);
|
|
field_0x702 = 0;
|
|
field_0x6f0 = 150;
|
|
field_0x70c = 1;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 14:
|
|
if (mpModelMorf->checkFrame(3)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_BB_LAND, 0, -1);
|
|
} else if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(23)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_BB_FOOT, 0, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(5)) {
|
|
speedF = 3.0f;
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
setActionMode(ACT_FLY_GROUND, 0);
|
|
field_0x702 = 0;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80642EC8-806430E0 004EA8 0218+00 1/1 0/0 0/0 .text executeFlyGround__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeFlyGround() {
|
|
switch (mMode) {
|
|
case 0:
|
|
if (mLastAction == ACT_DAMAGE || mLastAction == ACT_CONFUSE) {
|
|
field_0x70c = 0;
|
|
gravity = 0.0f;
|
|
mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3];
|
|
field_0x711 = 2;
|
|
setActionMode(ACT_WARP, 1);
|
|
break;
|
|
}
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
setBck(BCK_ZAN_LV1_FATIGUE, J3DFrameCtrl::EMode_LOOP, 5.0f, 1.0f);
|
|
mMode = 1;
|
|
field_0x702 = 0;
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_ZEIZEI, -1);
|
|
case 1:
|
|
if (field_0x6f0 == 0) {
|
|
field_0x70c = 0;
|
|
gravity = 0.0f;
|
|
mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3];
|
|
field_0x711 = 2;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806430E0-806432F8 0050C0 0218+00 1/1 0/0 0/0 .text checkSwimLinkNearMouth__10daB_ZANT_cFv */
|
|
bool daB_ZANT_c::checkSwimLinkNearMouth() {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
if (pmobile == NULL) {
|
|
return false;
|
|
}
|
|
|
|
s16 mobile_angle = pmobile->shape_angle.y;
|
|
cXyz check_area(cM_ssin(mobile_angle) * 900.0f, 0.0f, cM_scos(mobile_angle) * 900.0f);
|
|
check_area += pmobile->current.pos;
|
|
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
if (check_area.absXZ(player_pos) < 400.0f && check_area.y - 300.0f < player_pos.y && check_area.y + 800.0f > player_pos.y) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 806432F8-8064350C 0052D8 0214+00 1/1 0/0 0/0 .text checkSwimLinkNear__10daB_ZANT_cFv
|
|
*/
|
|
bool daB_ZANT_c::checkSwimLinkNear() {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
if (pmobile == NULL) {
|
|
return false;
|
|
}
|
|
|
|
if (checkSwimLinkNearMouth()) {
|
|
if (field_0x706 != 0 && ((daB_ZANTZ_c*)pmobile)->getMouthMode() == 1) {
|
|
s16 mobile_angle = pmobile->shape_angle.y;
|
|
cXyz check_area(cM_ssin(mobile_angle) * 300.0f, 0.0f, cM_scos(mobile_angle) * 300.0f);
|
|
check_area += pmobile->current.pos;
|
|
|
|
if (check_area.abs(current.pos) < 300.0f) {
|
|
setTgHitBit(FALSE);
|
|
((daB_ZANTZ_c*)pmobile)->setMouthMode(2);
|
|
setActionMode(ACT_WATER, 27);
|
|
}
|
|
}
|
|
|
|
((daB_ZANTZ_c*)pmobile)->setSnortEffect(30);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 8064350C-80643690 0054EC 0184+00 1/1 0/0 0/0 .text executeHook__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeHook() {
|
|
switch (mMode) {
|
|
case 0:
|
|
setTgHitBit(FALSE);
|
|
setCoHitBit(FALSE);
|
|
gravity = 0.0f;
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
field_0x705 = 0;
|
|
field_0x706 = 0;
|
|
|
|
setBck(BCK_ZAN_HOOK_HIT, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 2;
|
|
field_0x6ff++;
|
|
break;
|
|
case 2:
|
|
if (mpModelMorf->checkFrame(2)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_OI_V_CAUGHT, -1);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
mMode = 3;
|
|
setBck(BCK_ZAN_HOOK_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
case 3:
|
|
if (!fopAcM_CheckStatus(this, 0x100000)) {
|
|
setTgHitBit(TRUE);
|
|
setCoHitBit(TRUE);
|
|
setActionMode(ACT_SWIM, 10);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80643690-80644074 005670 09E4+00 2/1 0/0 0/0 .text executeWater__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeWater() {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
if (pmobile != NULL) {
|
|
s16 mobile_angle = pmobile->shape_angle.y;
|
|
cXyz sp58(cM_ssin(mobile_angle) * 300.0f, 0.0f, cM_scos(mobile_angle) * 300.0f);
|
|
sp58 += pmobile->current.pos;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
if (mLastAction == ACT_SMALL_ATTACK) {
|
|
mMode = 0x19;
|
|
field_0x6f0 = 0x78;
|
|
field_0x705 = 1;
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
} else if (field_0x705 != 0) {
|
|
if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 3) {
|
|
mMode = 15;
|
|
} else {
|
|
((daB_ZANTZ_c*)pmobile)->setMouthMode(2);
|
|
mMode = 27;
|
|
}
|
|
|
|
attention_info.flags = 0;
|
|
} else {
|
|
setActionMode(ACT_SWIM, 0);
|
|
}
|
|
break;
|
|
case 15:
|
|
{
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
if (player->current.pos.y < 1000.0f) {
|
|
mMode = 20;
|
|
|
|
if (mFightCycle == 0) {
|
|
((daB_ZANTZ_c*)pmobile)->setAppearMode(0);
|
|
} else {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL) {
|
|
((daB_ZANTZ_c*)pmobile)->setAppearMode(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
field_0x704 = 0;
|
|
}
|
|
}
|
|
break;
|
|
case 20:
|
|
old.pos = sp58;
|
|
current.pos = old.pos;
|
|
shape_angle.y = mobile_angle;
|
|
|
|
if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) {
|
|
mModeTimer = 30;
|
|
mMode = 21;
|
|
|
|
if (mFightCycle != 0) {
|
|
// set zant to farthest mobile from player
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
f32 farthest_dist = 0.0f;
|
|
int correct_no = 0;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL && farthest_dist < pmobile->current.pos.abs(player_pos)) {
|
|
farthest_dist = pmobile->current.pos.abs(player_pos);
|
|
correct_no = i;
|
|
}
|
|
}
|
|
|
|
mCorrectMobileNo = correct_no;
|
|
}
|
|
}
|
|
break;
|
|
case 21:
|
|
if (mModeTimer == 0) {
|
|
field_0x6fd = 1;
|
|
|
|
if (mFightCycle == 0) {
|
|
((daB_ZANTZ_c*)pmobile)->setAppearMode(4);
|
|
} else {
|
|
int sp78 = 0;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL && abs((s16)(fopAcM_searchPlayerAngleY(pmobile) - pmobile->shape_angle.y)) > 0x1000) {
|
|
sp78++;
|
|
}
|
|
}
|
|
|
|
if (sp78 != 0) {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL) {
|
|
((daB_ZANTZ_c*)pmobile)->setAppearMode(5);
|
|
}
|
|
}
|
|
|
|
field_0x6fd = 0;
|
|
}
|
|
}
|
|
|
|
mMode = 22;
|
|
}
|
|
break;
|
|
case 22:
|
|
if (mFightCycle == 0) {
|
|
if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) {
|
|
((daB_ZANTZ_c*)pmobile)->setSnortEffect(30);
|
|
mModeTimer = 30;
|
|
mMode = 23;
|
|
}
|
|
} else {
|
|
int sp84 = 0;
|
|
|
|
if (field_0x6fd == 0) {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL && ((daB_ZANTZ_c*)pmobile)->isSearchContinue()) {
|
|
if (abs((s16)(fopAcM_searchPlayerAngleY(pmobile) - pmobile->shape_angle.y)) < 0xC00) {
|
|
sp84++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sp84 == 4) {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL) {
|
|
((daB_ZANTZ_c*)pmobile)->offSearchContinue();
|
|
}
|
|
}
|
|
field_0x6fd++;
|
|
}
|
|
} else {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL && ((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) {
|
|
sp84++;
|
|
}
|
|
}
|
|
|
|
if (sp84 == 4) {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
if (pmobile != NULL) {
|
|
((daB_ZANTZ_c*)pmobile)->setSnortEffect(30);
|
|
}
|
|
}
|
|
mModeTimer = 30;
|
|
mMode = 23;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 23:
|
|
if (mModeTimer == 0) {
|
|
old.pos = sp58;
|
|
current.pos = old.pos;
|
|
((daB_ZANTZ_c*)pmobile)->setMouthMode(0);
|
|
mMode = 24;
|
|
setTgHitBit(TRUE);
|
|
field_0x706 = 1;
|
|
}
|
|
break;
|
|
case 24:
|
|
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x400, 0x80);
|
|
if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 1) {
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
field_0x703 = 8;
|
|
field_0x6ff = 0;
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_SMALL_ATTACK, 0);
|
|
}
|
|
break;
|
|
case 25:
|
|
if (field_0x6f0 == 0) {
|
|
field_0x706 = 0;
|
|
setTgHitBit(FALSE);
|
|
((daB_ZANTZ_c*)pmobile)->setMouthMode(2);
|
|
mMode = 27;
|
|
}
|
|
break;
|
|
case 27:
|
|
if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 3) {
|
|
current.pos = sp58;
|
|
field_0x705 = 1;
|
|
attention_info.flags = 0;
|
|
|
|
if (mFightCycle == 0) {
|
|
mMode = 30;
|
|
mModeTimer = cM_rndF(30.0f) + 100.0f;
|
|
} else if (field_0x712 == 0) {
|
|
field_0x712++;
|
|
mMode = 28;
|
|
mModeTimer = 30;
|
|
} else {
|
|
mMode = 30;
|
|
mModeTimer = cM_rndF(30.0f) + 100.0f;
|
|
mCorrectMobileNo = (int)((f32)mCorrectMobileNo + cM_rndF(2.9f) + 1.0f) & 3;
|
|
}
|
|
}
|
|
break;
|
|
case 28:
|
|
if (mModeTimer == 0) {
|
|
((daB_ZANTZ_c*)pmobile)->setAppearMode(2);
|
|
mMode = 29;
|
|
}
|
|
break;
|
|
case 29:
|
|
current.pos = sp58;
|
|
shape_angle.y = mobile_angle;
|
|
|
|
if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 3) {
|
|
mMode = 15;
|
|
}
|
|
break;
|
|
case 30:
|
|
if (mModeTimer == 0) {
|
|
mModeTimer = 30;
|
|
mMode = 21;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80644074-80644A3C 006054 09C8+00 2/1 0/0 0/0 .text executeSwim__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeSwim() {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
|
|
if (pmobile != NULL) {
|
|
s16 mobile_angle = pmobile->shape_angle.y;
|
|
cXyz sp50(cM_ssin(mobile_angle) * 300.0f, 300.0f, cM_scos(mobile_angle) * 300.0f);
|
|
sp50 += pmobile->current.pos;
|
|
|
|
s16 sp10 = cLib_targetAngleY(&pmobile->current.pos, ¤t.pos);
|
|
s16 spE = mobile_angle - sp10;
|
|
|
|
switch (mMode) {
|
|
case 10:
|
|
if (field_0x6ff > 5) {
|
|
field_0x6b8 = mobile_angle;
|
|
mFlyWarpPos = sp50;
|
|
field_0x705 = 1;
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 0);
|
|
return;
|
|
}
|
|
|
|
setBck(BCK_ZAN_HOOK_RELEASE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 11;
|
|
case 11:
|
|
if (current.pos.y < 50.0f) {
|
|
cLib_addCalc2(¤t.pos.y, 50.0f, 0.1f, 10.0f);
|
|
} else if (current.pos.y > 100.0f) {
|
|
cLib_addCalc2(¤t.pos.y, 100.0f, 0.1f, 10.0f);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
mMode = 0;
|
|
}
|
|
break;
|
|
case 0:
|
|
setBck(BCK_ZAN_SWIM, J3DFrameCtrl::EMode_LOOP, 5.0f, 1.0f);
|
|
mpModelMorf->setFrame(10.0f);
|
|
field_0x6cc = 0.0f;
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
mMode = 1;
|
|
field_0x702 = 0;
|
|
case 1:
|
|
case 2:
|
|
if (abs(spE) < 0x1000) {
|
|
if (mMode == 1) {
|
|
field_0x6ac.set(cM_ssin(mobile_angle) * 600.0f, 300.0f, cM_scos(mobile_angle) * 600.0f);
|
|
field_0x6ac += pmobile->current.pos;
|
|
} else {
|
|
field_0x6ac = sp50;
|
|
}
|
|
|
|
mMode = 4;
|
|
} else {
|
|
s16 spC;
|
|
if (spE < 0) {
|
|
spC = sp10 - 0x1000;
|
|
} else {
|
|
spC = sp10 + 0x1000;
|
|
}
|
|
|
|
field_0x6ac.set(cM_ssin(spC) * 1200.0f, 250.0f, cM_scos(spC) * 1200.0f);
|
|
field_0x6ac += pmobile->current.pos;
|
|
mMode = 3;
|
|
}
|
|
|
|
mModeTimer = 60;
|
|
case 3:
|
|
case 4:
|
|
{
|
|
if (current.pos.y < 50.0f) {
|
|
cLib_addCalc2(¤t.pos.y, 50.0f, 0.1f, 10.0f);
|
|
}
|
|
|
|
f32 player_dist = fopAcM_searchPlayerDistance(this);
|
|
s16 spA = -cLib_targetAngleX(¤t.pos, &field_0x6ac) + 0x4000;
|
|
s16 sp8 = cLib_targetAngleY(¤t.pos, &field_0x6ac);
|
|
f32 anm_frame = mpModelMorf->getFrame();
|
|
|
|
int sp64 = 0;
|
|
if (anm_frame < 13.0f || anm_frame >= 45.0f) {
|
|
sp64 = 1;
|
|
}
|
|
|
|
if ((13.0f <= anm_frame && anm_frame <= 19.0f) || (29.0f <= anm_frame && anm_frame <= 45.0f)) {
|
|
sp64 = 2;
|
|
}
|
|
|
|
if (abs((s16)(sp8 - shape_angle.y)) < 0x2000) {
|
|
switch (sp64) {
|
|
case 0:
|
|
cLib_chaseF(&field_0x6cc, 0.0f, 2.0f);
|
|
break;
|
|
case 1:
|
|
cLib_chaseF(&field_0x6cc, 0.0f, 0.5f);
|
|
break;
|
|
case 2:
|
|
cLib_chaseF(&field_0x6cc, 15.0f, 3.0f);
|
|
break;
|
|
}
|
|
} else {
|
|
switch (sp64) {
|
|
case 0:
|
|
cLib_chaseF(&field_0x6cc, 0.0f, 1.0f);
|
|
break;
|
|
case 1:
|
|
cLib_chaseF(&field_0x6cc, 0.0f, 0.3f);
|
|
break;
|
|
case 2:
|
|
cLib_chaseF(&field_0x6cc, 5.0f, 1.0f);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (sp64 == 2) {
|
|
cLib_addCalcAngleS2(&shape_angle.y, sp8, 0x10, 0x180);
|
|
cLib_addCalcAngleS2(&shape_angle.x, spA, 0x10, 0x400);
|
|
} else {
|
|
cLib_addCalcAngleS2(&shape_angle.y, sp8, 0x10, 0x80);
|
|
cLib_addCalcAngleS2(&shape_angle.x, spA, 0x10, 0x200);
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
current.angle.x = cLib_targetAngleX(¤t.pos, &field_0x6ac);
|
|
|
|
if (mModeTimer != 0) {
|
|
speed.y = (field_0x6cc / 2) * cM_ssin(current.angle.x);
|
|
speedF = std::abs((field_0x6cc / 2) * cM_scos(current.angle.x));
|
|
} else {
|
|
speed.y = field_0x6cc * cM_ssin(current.angle.x);
|
|
speedF = std::abs(field_0x6cc * cM_scos(current.angle.x));
|
|
}
|
|
|
|
if (current.pos.absXZ(sp50) < 200.0f) {
|
|
mMode = 6;
|
|
attention_info.flags = 0;
|
|
setTgHitBit(FALSE);
|
|
((daB_ZANTZ_c*)pmobile)->setMouthMode(2);
|
|
mModeTimer = 60;
|
|
} else if (current.pos.abs(field_0x6ac) < 200.0f) {
|
|
if (mMode == 3) {
|
|
mMode = 1;
|
|
} else {
|
|
mMode = 2;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
cLib_chaseF(&speedF, 0.0f, 0.5f);
|
|
cLib_chaseF(&speed.y, 5.0f, 0.5f);
|
|
cLib_addCalcAngleS2(&shape_angle.y, mobile_angle, 0x10, 0x200);
|
|
cLib_addCalcAngleS2(&shape_angle.x, 0, 0x10, 0x200);
|
|
|
|
if (!speedF && speed.y == 5.0f) {
|
|
mMode = 7;
|
|
gravity = -1.0f;
|
|
maxFallSpeed = -5.0f;
|
|
}
|
|
break;
|
|
case 7:
|
|
{
|
|
field_0x706 = 1;
|
|
maxFallSpeed = -100.0f;
|
|
|
|
cXyz target(sp50.x, current.pos.y, sp50.z);
|
|
cLib_chasePosXZ(¤t.pos, target, 3.0f);
|
|
|
|
if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 3) {
|
|
field_0x705 = 1;
|
|
mModeTimer = 30;
|
|
setActionMode(ACT_WATER, 27);
|
|
|
|
shape_angle.x = 0;
|
|
shape_angle.y = 0;
|
|
gravity = 0.0f;
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (checkBck(BCK_ZAN_SWIM)) {
|
|
if (mpModelMorf->checkFrame(12)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_OI_SWIM1, 0, -1);
|
|
} else if (mpModelMorf->checkFrame(28)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_OI_SWIM2, 0, -1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80644A3C-80645014 006A1C 05D8+00 1/1 0/0 0/0 .text executeSimaJump__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeSimaJump() {
|
|
switch (mMode) {
|
|
case 0:
|
|
setTgHitBit(TRUE);
|
|
mBodySphCc[0].OnTgNoHitMark();
|
|
mBodySphCc[1].OnTgNoHitMark();
|
|
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
if (mLastAction == ACT_SMALL_ATTACK) {
|
|
field_0x702 = 0;
|
|
mMode = 10;
|
|
|
|
if (mFightCycle == 0) {
|
|
field_0x6f0 = 120;
|
|
} else {
|
|
field_0x6f0 = 105;
|
|
}
|
|
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
setBck(BCK_ZAN_LV1_FATIGUE, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MG_V_ZEIZEI, -1);
|
|
return;
|
|
}
|
|
|
|
if (mLastAction == ACT_CONFUSE || mLastAction == ACT_DAMAGE) {
|
|
mMode = 11;
|
|
return;
|
|
}
|
|
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
field_0x6ec = 0;
|
|
mMode = 1;
|
|
gravity = -5.0f;
|
|
field_0x6fd = 0;
|
|
|
|
if (field_0x70f < 2) {
|
|
if (field_0x70f == 0) {
|
|
mModeTimer = 150;
|
|
}
|
|
|
|
field_0x70f++;
|
|
} else {
|
|
mModeTimer = cM_rndF(50.0f) + 100.0f;
|
|
|
|
if (field_0x70b >= 4) {
|
|
mModeTimer = 0;
|
|
} else if (field_0x70b < 2 && mModeTimer < 120) {
|
|
mModeTimer = 120;
|
|
}
|
|
|
|
if (mModeTimer < 120) {
|
|
field_0x70b = 0;
|
|
mModeTimer = 0;
|
|
|
|
if (mFightCycle == 0) {
|
|
field_0x703 = l_HIO.mBulletNum;
|
|
} else {
|
|
field_0x703 = 8;
|
|
}
|
|
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_SMALL_ATTACK, 0);
|
|
field_0x702 = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
field_0x70b++;
|
|
if (mFightCycle != 0) {
|
|
mModeTimer -= 50;
|
|
}
|
|
|
|
setTgHitBit(FALSE);
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80);
|
|
|
|
if (fopAcM_searchPlayerDistance(this) < 550.0f) {
|
|
if (mAcch.ChkGroundHit()) {
|
|
mMode = 11;
|
|
return;
|
|
}
|
|
} else {
|
|
if (checkAvoidWeapon(FALSE)) {
|
|
mMode = 11;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (mMode == 1) {
|
|
if (mAcch.ChkGroundHit() && field_0x6ec == 0) {
|
|
setBck(BCK_ZAN_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 2;
|
|
}
|
|
} else if (mMode == 2) {
|
|
if (mpModelMorf->checkFrame(6)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MG_V_JUMP, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(10)) {
|
|
speed.y = 55.0f;
|
|
mMode = 3;
|
|
}
|
|
} else if (mMode == 3) {
|
|
if (speed.y <= 0.0f) {
|
|
setBck(BCK_ZAN_JUMP_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 4;
|
|
}
|
|
} else if (mMode == 4) {
|
|
if (mpModelMorf->checkFrame(7)) {
|
|
mpModelMorf->setPlaySpeed(0.0f);
|
|
}
|
|
|
|
if (mAcch.ChkGroundHit()) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_MG_LAND, 0, -1);
|
|
mpModelMorf->setPlaySpeed(1.0f);
|
|
mpModelMorf->setFrame(8.0f);
|
|
mMode = 5;
|
|
}
|
|
} else if (mpModelMorf->isStop()) {
|
|
fopAcM_effSmokeSet1(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr, 1);
|
|
mMode = 1;
|
|
field_0x6ec = 5;
|
|
}
|
|
|
|
if (mAcch.ChkGroundHit() && mModeTimer == 0) {
|
|
mMode = 11;
|
|
}
|
|
break;
|
|
case 10:
|
|
if (field_0x6f0 != 0) {
|
|
return;
|
|
}
|
|
case 11:
|
|
s16 var_r27 = cM_atan2s(daPy_getPlayerActorClass()->current.pos.x, daPy_getPlayerActorClass()->current.pos.z);
|
|
s16 sp1C = (f32)(var_r27 + 0x8000) + cM_rndFX(4.0f) * (f32)0x800;
|
|
|
|
mFlyWarpPos.set(cM_ssin(sp1C) * 1100.0f, 1000.0f, cM_scos(sp1C) * 1100.0f);
|
|
field_0x6b8 = sp1C + 0x8000;
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80645014-8064524C 006FF4 0238+00 1/1 0/0 0/0 .text executeIceDemo__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeIceDemo() {
|
|
switch (mMode) {
|
|
case 0:
|
|
current.pos.set(-140.0f, 300.0f, 700.0f);
|
|
old.pos = current.pos;
|
|
case 100:
|
|
for (int i = 0; i < 11; i++) {
|
|
mFoot2Cc[i].OnTgSetBit();
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OnTgSetBit();
|
|
mFootCc[iron_tg_cc[i]].OnTgShield();
|
|
mFootCc[iron_tg_cc[i]].OnTgIronBallRebound();
|
|
}
|
|
|
|
setBck(BCK_ZAN_HUGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
speedF = 0.0f;
|
|
gravity = 0.0f;
|
|
shape_angle.z = 0;
|
|
shape_angle.x = 0;
|
|
attention_info.flags = 0;
|
|
maxFallSpeed = -100.0f;
|
|
|
|
mMode = 1;
|
|
field_0x70e = 0;
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(8)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_HUGE, -1);
|
|
}
|
|
|
|
cLib_chaseF(&mModelScaleXZ, 10.0f, 0.1f);
|
|
cLib_chaseF(&mModelScaleY, 10.0f, 0.1f);
|
|
|
|
if (mpModelMorf->checkFrame(115)) {
|
|
mMode = 2;
|
|
}
|
|
break;
|
|
case 2:
|
|
cLib_chaseF(&speed.y, 50.0f, 5.0f);
|
|
if (mpModelMorf->isStop()) {
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
setActionMode(ACT_ICE_JUMP, 3);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064524C-80645DA4 00722C 0B58+00 2/1 0/0 0/0 .text executeIceJump__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeIceJump() {
|
|
cXyz sp44(daPy_getPlayerActorClass()->current.pos);
|
|
f32 var_f31 = sp44.absXZ(current.pos);
|
|
cXyz sp50;
|
|
cXyz sp5C;
|
|
cXyz sp68;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
setBck(BCK_ZAN_HUGE_LANDING, J3DFrameCtrl::EMode_NONE, 3.0f, -1.0f);
|
|
mMode = 1;
|
|
attention_info.flags = 0;
|
|
field_0x70e = 0;
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_JUMP, -1);
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(10)) {
|
|
mMode = 2;
|
|
speed.y = 130.0f;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (mpModelMorf->isStop()) {
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 3;
|
|
}
|
|
case 3:
|
|
cLib_chaseF(&speed.y, 15.0f, 5.0f);
|
|
if (current.pos.y > 1500.0f) {
|
|
field_0x70e = 3;
|
|
}
|
|
|
|
if (current.pos.y > 2000.0f) {
|
|
mMode = 4;
|
|
mModeTimer = 90;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
break;
|
|
case 4:
|
|
cLib_chaseF(&speed.y, 0.0f, 1.0f);
|
|
if (var_f31 < 300.0f) {
|
|
var_f31 -= 50.0f;
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
cLib_chaseF(&speedF, var_f31 / 10.0f, 1.0f);
|
|
} else {
|
|
cLib_chaseF(&speedF, 30.0f, 1.0f);
|
|
cLib_addCalcAngleS(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x400, 0x80);
|
|
}
|
|
|
|
shape_angle.y = current.angle.y;
|
|
|
|
if (mModeTimer == 0 && sp44.absXZ(current.pos) < 550.0f) {
|
|
mMode = 5;
|
|
gravity = -5.0f;
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
|
|
setBck(BCK_ZAN_HUGE_LANDING, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_LAND, -1);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL));
|
|
mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp50);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR));
|
|
mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp5C);
|
|
|
|
if (sp44.absXZ(sp50) < sp44.absXZ(sp5C)) {
|
|
field_0x70f = 0;
|
|
} else {
|
|
field_0x70f = 1;
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
if (field_0x70f == 0) {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL));
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR));
|
|
}
|
|
|
|
mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp5C);
|
|
sp68 = sp5C - sp44;
|
|
current.pos -= sp68 * (20.0f / sp68.abs());
|
|
|
|
if (mMode == 5) {
|
|
if (mpModelMorf->checkFrame(10)) {
|
|
mpModelMorf->setPlaySpeed(0.0f);
|
|
mMode = 6;
|
|
mFoot2Cc[0].OnAtSetBit();
|
|
mFoot2Cc[4].OnAtSetBit();
|
|
mFoot2Cc[0].SetAtAtp(4);
|
|
mFoot2Cc[4].SetAtAtp(4);
|
|
}
|
|
} else {
|
|
if (mAcch.ChkGroundHit()) {
|
|
field_0x70e = 1;
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_LAND_HUGE, 0, -1);
|
|
dComIfGp_getVibration().StartShock(8, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
setIceLandingEffect(0);
|
|
setIceLandingEffect(1);
|
|
|
|
mFoot2Cc[0].OffAtSetBit();
|
|
mFoot2Cc[4].OffAtSetBit();
|
|
mFoot2Cc[0].SetAtAtp(2);
|
|
mFoot2Cc[4].SetAtAtp(2);
|
|
|
|
gravity = 0.0f;
|
|
|
|
mpModelMorf->setPlaySpeed(1.0f);
|
|
mMode = 7;
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
if (mpModelMorf->checkFrame(15)) {
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OffTgShield();
|
|
}
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
setActionMode(ACT_ICE_STEP, 0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80645DA4-8064687C 007D84 0AD8+00 1/1 0/0 0/0 .text executeIceStep__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeIceStep() {
|
|
s16 var_r29 = shape_angle.y;
|
|
int var_r28;
|
|
cXyz sp60;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
mModeTimer = cM_rndFX(50.0f) + 600.0f;
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OffTgShield();
|
|
}
|
|
case 1:
|
|
{
|
|
f32 var_f30 = cM_rnd();
|
|
s16 sp8 = shape_angle.y - fopAcM_searchPlayerAngleY(this);
|
|
f32 var_f29 = fopAcM_searchPlayerDistance(this);
|
|
|
|
if (var_f29 < 300.0f) {
|
|
if (sp8 < 0) {
|
|
if (var_f30 < 0.5f) {
|
|
var_r28 = 4;
|
|
} else {
|
|
var_r28 = 5;
|
|
}
|
|
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x1000;
|
|
} else {
|
|
if (var_f30 < 0.5f) {
|
|
var_r28 = 2;
|
|
} else {
|
|
var_r28 = 3;
|
|
}
|
|
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x1000;
|
|
}
|
|
} else if (var_f29 < 400.0f) {
|
|
if (sp8 > 0) {
|
|
if (var_f30 < 0.5f) {
|
|
var_r28 = 2;
|
|
} else {
|
|
var_r28 = 3;
|
|
}
|
|
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x4000;
|
|
} else {
|
|
if (var_f30 < 0.5f) {
|
|
var_r28 = 4;
|
|
} else {
|
|
var_r28 = 5;
|
|
}
|
|
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x4000;
|
|
}
|
|
} else if (abs(sp8) > 0x4000) {
|
|
if (sp8 < 0) {
|
|
var_r28 = 4;
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x1000;
|
|
} else {
|
|
var_r28 = 2;
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x1000;
|
|
}
|
|
} else {
|
|
if (sp8 < 0) {
|
|
var_r28 = 2;
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x4000;
|
|
} else {
|
|
var_r28 = 4;
|
|
field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x4000;
|
|
}
|
|
}
|
|
|
|
switch (var_r28) {
|
|
case 2:
|
|
setBck(BCK_ZAN_TRAMPLEA, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 2;
|
|
break;
|
|
case 3:
|
|
setBck(BCK_ZAN_TRAMPLEC, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 3;
|
|
break;
|
|
case 4:
|
|
setBck(BCK_ZAN_TRAMPLEB, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 4;
|
|
break;
|
|
case 5:
|
|
setBck(BCK_ZAN_TRAMPLED, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 5;
|
|
break;
|
|
}
|
|
}
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
f32 anm_frame = mpModelMorf->getFrame();
|
|
int sp98 = 0;
|
|
|
|
if (mMode == 2) {
|
|
if (8.0f <= anm_frame && anm_frame <= 24.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(23)) {
|
|
mFoot2Cc[4].OnAtSetBit();
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_1, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(28)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1);
|
|
dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
setIceLandingEffect(1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(30)) {
|
|
mFoot2Cc[4].OffAtSetBit();
|
|
}
|
|
} else if (mMode == 3) {
|
|
if (7.0f <= anm_frame && anm_frame <= 14.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (22.0f <= anm_frame && anm_frame <= 28.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(13) || mpModelMorf->checkFrame(27)) {
|
|
mFoot2Cc[4].OnAtSetBit();
|
|
|
|
if (mpModelMorf->checkFrame(13)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_2, -1);
|
|
} else {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_3, -1);
|
|
}
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(17) || mpModelMorf->checkFrame(30)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1);
|
|
dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
setIceLandingEffect(1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(31)) {
|
|
mFoot2Cc[4].OffAtSetBit();
|
|
}
|
|
} else if (mMode == 4) {
|
|
if (8.0f <= anm_frame && anm_frame <= 23.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(22)) {
|
|
mFoot2Cc[0].OnAtSetBit();
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_1, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(28)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1);
|
|
dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
setIceLandingEffect(0);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(30)) {
|
|
mFoot2Cc[0].OffAtSetBit();
|
|
}
|
|
} else {
|
|
if (7.0f <= anm_frame && anm_frame <= 13.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (21.0f <= anm_frame && anm_frame <= 27.0f) {
|
|
sp98 = 1;
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(11) || mpModelMorf->checkFrame(26)) {
|
|
mFoot2Cc[0].OnAtSetBit();
|
|
|
|
if (mpModelMorf->checkFrame(11)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_2, -1);
|
|
} else {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_3, -1);
|
|
}
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(16) || mpModelMorf->checkFrame(31)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1);
|
|
dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
setIceLandingEffect(0);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(32)) {
|
|
mFoot2Cc[0].OffAtSetBit();
|
|
}
|
|
}
|
|
|
|
if (sp98 != 0) {
|
|
cLib_addCalcAngleS2(&shape_angle.y, field_0x6ba, 0x10, 0x400);
|
|
}
|
|
|
|
if (mMode <= 3) {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(var_r29);
|
|
mDoMtx_stack_c::transM(mModelScaleXZ * 35.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp60);
|
|
mDoMtx_stack_c::transS(sp60);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::transM(mModelScaleXZ * -35.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¤t.pos);
|
|
} else {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(var_r29);
|
|
mDoMtx_stack_c::transM(mModelScaleXZ * -30.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp60);
|
|
mDoMtx_stack_c::transS(sp60);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::transM(mModelScaleXZ * 30.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¤t.pos);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
if (mModeTimer != 0) {
|
|
mMode = 1;
|
|
} else {
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OnTgShield();
|
|
}
|
|
|
|
setActionMode(ACT_ICE_JUMP, 0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064687C-806471CC 00885C 0950+00 2/1 0/0 0/0 .text executeIceDamage__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeIceDamage() {
|
|
static f32 const damage_scale[] = {
|
|
10.0f, 8.0f, 7.5f, 6.0f, 4.5f, 3.0f, 2.0f, 1.4f, 1.0f, 0.69999999f, 0.5f,
|
|
};
|
|
|
|
static f32 const damage_jump_speed[] = {
|
|
100.0f, 95.0f, 90.0f, 85.0f, 80.0f, 75.0f, 70.0f, 65.0f, 60.0f, 55.0f, 50.0f
|
|
};
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
if (mMode >= 10 && mModeTimer == 0) {
|
|
for (int i = 0; i < 11; i++) {
|
|
mFoot2Cc[i].OnTgShield();
|
|
mFoot2Cc[i].OffTgSetBit();
|
|
mFoot2Cc[i].OffTgNoHitMark();
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OffTgSetBit();
|
|
mFootCc[iron_tg_cc[i]].OnTgShield();
|
|
mFootCc[iron_tg_cc[i]].OnTgIronBallRebound();
|
|
}
|
|
}
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
case 1:
|
|
field_0x70e = 2;
|
|
|
|
if (mMode == 0) {
|
|
setBck(BCK_ZAN_SHIND_L, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_SHIND_R, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f);
|
|
}
|
|
|
|
mFoot2Cc[0].OffAtSetBit();
|
|
mFoot2Cc[4].OffAtSetBit();
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OnTgShield();
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
mMode = 2;
|
|
mModeTimer = 300;
|
|
field_0x70b = 0;
|
|
field_0x70b++;
|
|
field_0x6cc = (mModelScaleXZ - damage_scale[field_0x70b]) / 3.0f;
|
|
case 2:
|
|
if (mpModelMorf->checkFrame(6) || mpModelMorf->checkFrame(19)) {
|
|
if (mpModelMorf->getFrame() < 14) {
|
|
mpModelMorf->setFrame(6);
|
|
} else {
|
|
mpModelMorf->setFrame(19);
|
|
}
|
|
|
|
if (field_0x70b <= 8) {
|
|
speedF = 25.0f;
|
|
} else if (field_0x70b == 9) {
|
|
if (mFightCycle == 0) {
|
|
speedF = 20.0f;
|
|
} else {
|
|
speedF = 23.0f;
|
|
}
|
|
} else if (mFightCycle == 0) {
|
|
speedF = 15.0f;
|
|
} else {
|
|
speedF = 22.0f;
|
|
}
|
|
|
|
speed.y = damage_jump_speed[field_0x70b];
|
|
gravity = -15.0f;
|
|
mMode = 3;
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_KENKEN, -1);
|
|
} else {
|
|
if (field_0x70b <= 10) {
|
|
cLib_addCalc2(&mModelScaleXZ, damage_scale[field_0x70b], 0.5f, field_0x6cc);
|
|
} else {
|
|
cLib_chaseF(&mModelScaleXZ, 0.5f, 0.1f);
|
|
}
|
|
|
|
mModelScaleY = mModelScaleXZ;
|
|
cLib_addCalcAngleS2(&shape_angle.y, field_0x6ba, 8, 0x1000);
|
|
current.angle.y = shape_angle.y;
|
|
speedF = 0.0f;
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = 30;
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
if (mpModelMorf->checkFrame(12) || mpModelMorf->checkFrame(25)) {
|
|
if (mpModelMorf->getFrame() < 14) {
|
|
mpModelMorf->setFrame(12);
|
|
} else {
|
|
mpModelMorf->setFrame(25);
|
|
}
|
|
|
|
mpModelMorf->setPlaySpeed(0.0f);
|
|
mMode = 4;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (mAcch.ChkGroundHit()) {
|
|
s16 sp8 = fopAcM_searchPlayerAngleY(this) + (4096.0f * cM_rndFX(4.9f)) + 32768.0f;
|
|
|
|
if (current.pos.absXZ() > 1200.0f) {
|
|
sp8 = cM_atan2s(-current.pos.x, -current.pos.z);
|
|
}
|
|
|
|
field_0x6ba = sp8;
|
|
|
|
if (field_0x70b < 10) {
|
|
field_0x70b++;
|
|
}
|
|
|
|
field_0x6cc = (mModelScaleXZ - damage_scale[field_0x70b]) / 3.0f;
|
|
mpModelMorf->setPlaySpeed((10.0f - mModelScaleXZ) / 10.0f + 1.0f);
|
|
|
|
if (field_0x70b == 8) {
|
|
for (int i = 0; i < 11; i++) {
|
|
mFoot2Cc[i].OffTgShield();
|
|
mFoot2Cc[i].OnTgNoHitMark();
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OffTgShield();
|
|
mFootCc[iron_tg_cc[i]].OffTgIronBallRebound();
|
|
}
|
|
}
|
|
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_LAND, 0, -1);
|
|
mMode = 2;
|
|
}
|
|
break;
|
|
case 10:
|
|
if (setNextDamageMode(0)) {
|
|
return;
|
|
}
|
|
|
|
if (cM_rnd() < 0.5f) {
|
|
setBck(BCK_ZAN_DAMAGEL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_DAMAGER_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
mMode = 11;
|
|
case 11:
|
|
cLib_chaseF(&mModelScaleXZ, 0.5f, 0.1f);
|
|
mModelScaleY = mModelScaleXZ;
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
mMode = 12;
|
|
if (mModeTimer >= 30) {
|
|
mModeTimer = 30;
|
|
}
|
|
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
break;
|
|
case 12:
|
|
if (mModeTimer == 0) {
|
|
mMode = 30;
|
|
}
|
|
break;
|
|
case 20:
|
|
setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1);
|
|
mMode = 21;
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
case 21:
|
|
if (mpModelMorf->isStop()) {
|
|
mMode = 30;
|
|
}
|
|
break;
|
|
case 40:
|
|
setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 41;
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
mModeTimer = 30;
|
|
case 41:
|
|
if (mModeTimer == 0) {
|
|
mMode = 30;
|
|
}
|
|
break;
|
|
case 30:
|
|
for (int i = 0; i < 11; i++) {
|
|
mFoot2Cc[i].OnTgShield();
|
|
mFoot2Cc[i].OffTgSetBit();
|
|
mFoot2Cc[i].OffTgNoHitMark();
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mFootCc[iron_tg_cc[i]].OffTgSetBit();
|
|
mFootCc[iron_tg_cc[i]].OnTgShield();
|
|
mFootCc[iron_tg_cc[i]].OnTgIronBallRebound();
|
|
}
|
|
|
|
if (!setNextDamageMode(1)) {
|
|
mFlyWarpPos.set(0.0f, 300.0f, 0.0f);
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 1);
|
|
gravity = 0.0f;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806471CC-806473E4 0091AC 0218+00 1/1 0/0 0/0 .text setFarPillarPos__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::setFarPillarPos() {
|
|
fopAc_ac_c* ppillar;
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
int pillar_no = -1;
|
|
f32 farthest_dist = 0.0f;
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (i != field_0x70a) {
|
|
fopAcM_SearchByID(mPillarIDs[i], &ppillar);
|
|
if (ppillar != NULL) {
|
|
f32 dist = player_pos.abs(ppillar->current.pos);
|
|
if (dist > farthest_dist) {
|
|
pillar_no = i;
|
|
farthest_dist = dist;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pillar_no != -1) {
|
|
fopAcM_SearchByID(mPillarIDs[pillar_no], &ppillar);
|
|
if (ppillar != NULL) {
|
|
mFlyWarpPos = ppillar->current.pos;
|
|
mFlyWarpPos.y += 500.0f;
|
|
field_0x709 = pillar_no;
|
|
field_0x708 = pillar_no;
|
|
field_0x70a = pillar_no;
|
|
field_0x71b = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 806473E4-80647468 0093C4 0084+00 4/4 0/0 0/0 .text setNearPillarPos__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::setNearPillarPos() {
|
|
fopAc_ac_c* ppillar;
|
|
fopAcM_SearchByID(mPillarIDs[8], &ppillar);
|
|
|
|
if (ppillar != NULL) {
|
|
mFlyWarpPos = ppillar->current.pos;
|
|
mFlyWarpPos.y += 500.0f;
|
|
field_0x709 = 8;
|
|
field_0x708 = 8;
|
|
field_0x70a = 8;
|
|
field_0x71b = 0;
|
|
}
|
|
}
|
|
|
|
/* 80647468-806474F4 009448 008C+00 1/1 0/0 0/0 .text setNextPillarInfo__10daB_ZANT_cFi
|
|
*/
|
|
void daB_ZANT_c::setNextPillarInfo(int i_pillarNo) {
|
|
fopAc_ac_c* ppillar;
|
|
fopAcM_SearchByID(mPillarIDs[i_pillarNo], &ppillar);
|
|
|
|
if (ppillar != NULL) {
|
|
field_0x6ac = ppillar->current.pos;
|
|
field_0x6ac.y += 500.0f;
|
|
field_0x708 = field_0x709;
|
|
field_0x709 = i_pillarNo;
|
|
}
|
|
}
|
|
|
|
/* 806474F4-80647A34 0094D4 0540+00 1/1 0/0 0/0 .text setNextPillarPos__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::setNextPillarPos() {
|
|
fopAc_ac_c* ppillar;
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
int pillar_no = -1;
|
|
f32 nearest_dist = 10000.0f;
|
|
|
|
if (field_0x708 != 8 && field_0x709 != 8 && cM_rnd() < 0.5) {
|
|
fopAcM_SearchByID(mPillarIDs[8], &ppillar);
|
|
|
|
if (ppillar != NULL && player_pos.absXZ(ppillar->current.pos) > 500.0f) {
|
|
setNextPillarInfo(8);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (field_0x709 == 8) {
|
|
fopAcM_SearchByID(mPillarIDs[8], &ppillar);
|
|
if (ppillar != NULL) {
|
|
cXyz pillar_pos(ppillar->current.pos);
|
|
s16 sp8 = cLib_targetAngleY(&pillar_pos, &player_pos);
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (i != field_0x708 && i != field_0x709) {
|
|
fopAcM_SearchByID(mPillarIDs[i], &ppillar);
|
|
if (ppillar != NULL && abs((s16)(cLib_targetAngleY(&pillar_pos, &ppillar->current.pos) - sp8)) > 0x6000) {
|
|
setNextPillarInfo(i);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (i != field_0x708 && i != field_0x709) {
|
|
fopAcM_SearchByID(mPillarIDs[i], &ppillar);
|
|
if (ppillar != NULL && player_pos.absXZ(ppillar->current.pos) > 500.0f) {
|
|
f32 dist = current.pos.abs(ppillar->current.pos);
|
|
if (dist < nearest_dist) {
|
|
pillar_no = i;
|
|
nearest_dist = dist;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pillar_no != -1) {
|
|
setNextPillarInfo(pillar_no);
|
|
}
|
|
}
|
|
|
|
/* 80647A34-80647AC8 009A14 0094+00 1/1 0/0 0/0 .text checkPillarSwing__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::checkPillarSwing() {
|
|
if (field_0x707 != 0) {
|
|
fopAc_ac_c* ppillar;
|
|
fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar);
|
|
|
|
if (ppillar != NULL && ((daPillar_c*)ppillar)->checkRollAttack()) {
|
|
if (mAction != ACT_MONKEY_FALL) {
|
|
setActionMode(ACT_MONKEY_FALL, 0);
|
|
} else {
|
|
setActionMode(ACT_MONKEY_FALL, 10);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80647AC8-806481F4 009AA8 072C+00 1/1 0/0 0/0 .text executeMonkey__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeMonkey() {
|
|
fopAc_ac_c* ppillar;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
gravity = -5.0f;
|
|
field_0x707 = 1;
|
|
setTgHitBit(FALSE);
|
|
mBodySphCc[0].OnTgNoHitMark();
|
|
mBodySphCc[1].OnTgNoHitMark();
|
|
field_0x708 = field_0x709 = field_0x70a;
|
|
|
|
if (mLastAction == ACT_WARP) {
|
|
if (field_0x71b != 0) {
|
|
field_0x71b = 0;
|
|
field_0x703 = l_HIO.mBulletNum;
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_SMALL_ATTACK, 0);
|
|
setNextPillarPos();
|
|
return;
|
|
}
|
|
|
|
setNextPillarPos();
|
|
setBck(BCK_ZAN_LV1_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 8;
|
|
} else if (mLastAction == ACT_SMALL_ATTACK) {
|
|
mMode = 5;
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mModeTimer = 0;
|
|
} else {
|
|
mMode = 5;
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
|
|
field_0x70b = cM_rndF(2.9f) + 3.0f;
|
|
field_0x6fd = 0;
|
|
field_0x71b = 0;
|
|
break;
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(10) || mpModelMorf->checkFrame(14)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_LAND, -1);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
field_0x6fd++;
|
|
|
|
if (field_0x6fd >= field_0x70b) {
|
|
if (mFightCycle != 0) {
|
|
setFarPillarPos();
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
} else {
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 2;
|
|
}
|
|
} else {
|
|
mMode = 5;
|
|
setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80);
|
|
if (abs((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this))) < 0x2000) {
|
|
field_0x703 = l_HIO.mBulletNum;
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_SMALL_ATTACK, 0);
|
|
}
|
|
break;
|
|
case 5:
|
|
setTgHitBit(FALSE);
|
|
setNextPillarPos();
|
|
mMode = 6;
|
|
case 6:
|
|
cLib_addCalcAngleS2(&shape_angle.y, cLib_targetAngleY(¤t.pos, &field_0x6ac), 8, 0x800);
|
|
|
|
if (mModeTimer == 0 && mAcch.ChkGroundHit()) {
|
|
setBck(BCK_ZAN_LV1_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 8;
|
|
}
|
|
break;
|
|
case 8:
|
|
cLib_addCalcAngleS2(&shape_angle.y, cLib_targetAngleY(¤t.pos, &field_0x6ac), 8, 0x800);
|
|
|
|
if (mpModelMorf->checkFrame(13)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_JUMP, -1);
|
|
mModeTimer = 18;
|
|
speed.y = 45.0f;
|
|
mMode = 9;
|
|
field_0x707 = 0;
|
|
|
|
fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar);
|
|
if (ppillar != NULL) {
|
|
((daPillar_c*)ppillar)->setShake(daPillar_c::SHAKE_WEAK);
|
|
}
|
|
}
|
|
break;
|
|
case 9:
|
|
if (mModeTimer != 0) {
|
|
cXyz sp2C(field_0x6ac.x, current.pos.y, field_0x6ac.z);
|
|
cLib_chasePosXZ(¤t.pos, sp2C, field_0x6ac.absXZ(current.pos) / mModeTimer);
|
|
}
|
|
|
|
if (mModeTimer == 8) {
|
|
setBck(BCK_ZAN_LV1_JUMP_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
if (mAcch.ChkGroundHit()) {
|
|
current.pos = field_0x6ac;
|
|
field_0x707 = 1;
|
|
field_0x70a = field_0x709;
|
|
|
|
fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar);
|
|
if (ppillar != NULL) {
|
|
((daPillar_c*)ppillar)->setShake(daPillar_c::SHAKE_WEAK);
|
|
}
|
|
|
|
mMode = 1;
|
|
field_0x6fd++;
|
|
}
|
|
break;
|
|
case 100:
|
|
target_info_count = 0;
|
|
fpcM_Search(s_pillar_sub, this);
|
|
|
|
if (target_info_count < 8 || mPillarIDs[8] == fpcM_ERROR_PROCESS_ID_e) {
|
|
for (int i = 0; i < 9; i++) {
|
|
mPillarIDs[i] = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
} else {
|
|
setNearPillarPos();
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 806481F4-80648544 00A1D4 0350+00 2/1 0/0 0/0 .text executeMonkeyFall__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeMonkeyFall() {
|
|
switch (mMode) {
|
|
case 0:
|
|
case 20:
|
|
setTgHitBit(TRUE);
|
|
mModeTimer = 90;
|
|
|
|
if (mMode == 20) {
|
|
mModeTimer = 30;
|
|
}
|
|
|
|
setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 1;
|
|
|
|
mBodySphCc[0].OffTgNoHitMark();
|
|
mBodySphCc[1].OffTgNoHitMark();
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_OTT, -1);
|
|
case 1:
|
|
if (mModeTimer == 0) {
|
|
setActionMode(ACT_MONKEY, 0);
|
|
}
|
|
break;
|
|
case 10:
|
|
setBck(BCK_ZAN_FALL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mMode = 11;
|
|
field_0x707 = 0;
|
|
setTgHitBit(FALSE);
|
|
speedF = 0.0f;
|
|
case 11:
|
|
if (mpModelMorf->checkFrame(5)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_FALL, -1);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
cXyz offset(-30.0f, -170.0f, -175.0f);
|
|
cLib_offsetPos(¤t.pos, ¤t.pos, shape_angle.y, &offset);
|
|
old.pos = current.pos;
|
|
speed.y = -15.0f;
|
|
speedF = 8.0f;
|
|
current.angle.y = shape_angle.y + 0x8000;
|
|
|
|
setBck(BCK_ZAN_LANDING, J3DFrameCtrl::EMode_NONE, 0.0f, 0.0f);
|
|
mMode = 12;
|
|
|
|
mBodySphCc[0].OnAtSetBit();
|
|
mBodySphCc[1].OnAtSetBit();
|
|
}
|
|
break;
|
|
case 12:
|
|
if (mAcch.ChkGroundHit()) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_MK_UMARU, 0, -1);
|
|
setMonkeyFallEffect();
|
|
dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
mBodySphCc[0].OffAtSetBit();
|
|
mBodySphCc[1].OffAtSetBit();
|
|
|
|
speedF = 0.0f;
|
|
mpModelMorf->setPlaySpeed(1.0f);
|
|
mMode = 13;
|
|
field_0x702 = 0;
|
|
setTgHitBit(TRUE);
|
|
field_0x6f0 = 120;
|
|
}
|
|
break;
|
|
case 13:
|
|
if (mpModelMorf->isStop()) {
|
|
setActionMode(ACT_MONKEY_DAMAGE, 5);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80648544-80648778 00A524 0234+00 1/1 0/0 0/0 .text executeMonkeyDamage__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeMonkeyDamage() {
|
|
switch (mMode) {
|
|
case 0:
|
|
if (setNextDamageMode(0)) {
|
|
setTgHitBit(FALSE);
|
|
return;
|
|
}
|
|
|
|
setBck(BCK_ZAN_LANDING_DAMAGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
mMode = 1;
|
|
field_0x702 = 0;
|
|
case 1:
|
|
if (field_0x6f0 == 0) {
|
|
setTgHitBit(FALSE);
|
|
}
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
setBck(BCK_ZAN_LANDING_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 10;
|
|
}
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
if (mMode == 5) {
|
|
field_0x6f0 = 100;
|
|
field_0x6ff = 0;
|
|
} else if (field_0x6f0 < 30) {
|
|
field_0x6f0 = 30;
|
|
}
|
|
|
|
setBck(BCK_ZAN_LANDING_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mMode = 10;
|
|
field_0x702 = 0;
|
|
case 10:
|
|
if (mpModelMorf->checkFrame(1)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_MGGG, -1);
|
|
}
|
|
|
|
if (field_0x6f0 == 0) {
|
|
setTgHitBit(FALSE);
|
|
|
|
if (!setNextDamageMode(1)) {
|
|
setNearPillarPos();
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 80648778-80648F64 00A758 07EC+00 5/5 0/0 0/0 .text setLastWarp__10daB_ZANT_cFii */
|
|
void daB_ZANT_c::setLastWarp(int param_0, int i_warpID) {
|
|
mFlyWarpPosID = i_warpID;
|
|
|
|
if (mFightCycle == 0) {
|
|
if (health <= 400) {
|
|
mFightCycle = 1;
|
|
}
|
|
} else if (mFightCycle == 1 && health <= 200) {
|
|
mFightCycle = 2;
|
|
}
|
|
|
|
if (field_0x713 != mFightCycle) {
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
|
|
if (mFightCycle == 2) {
|
|
field_0x6ec = 450;
|
|
field_0x71d = 1;
|
|
field_0x6ff = 0;
|
|
}
|
|
}
|
|
|
|
field_0x713 = mFightCycle;
|
|
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
s16 var_r28;
|
|
|
|
if (field_0x713 == 2 && param_0) {
|
|
if (field_0x703 <= 1 || field_0x6ff >= 3) {
|
|
if (field_0x71d == 1) {
|
|
param_0 = 3;
|
|
} else {
|
|
param_0 = 1;
|
|
}
|
|
} else {
|
|
if (cM_rnd() < 0.5f) {
|
|
param_0 = 3;
|
|
} else {
|
|
param_0 = 1;
|
|
}
|
|
|
|
if (field_0x71d == param_0) {
|
|
field_0x6ff++;
|
|
} else {
|
|
field_0x6ff = 0;
|
|
}
|
|
}
|
|
|
|
field_0x71d = param_0;
|
|
}
|
|
|
|
switch (param_0) {
|
|
case 0:
|
|
mFlyWarpPos.set(0.0f, 0.0f, 1000.0f);
|
|
field_0x70f = 0;
|
|
mDrawSwords = true;
|
|
mSwordSize = 1.0f;
|
|
break;
|
|
case 1:
|
|
if (field_0x713 == 0) {
|
|
field_0x70f = 0;
|
|
|
|
field_0x703++;
|
|
if (field_0x703 >= 3 && cM_rnd() < (field_0x703 / 10.0f) + 0.3f) {
|
|
field_0x70f = 10;
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
}
|
|
|
|
field_0x704 = 0;
|
|
|
|
var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z);
|
|
mFlyWarpPos.set(cM_ssin(var_r28) * 1000.0f, 0.0f, cM_scos(var_r28) * 1000.0f - 200.0f);
|
|
} else {
|
|
field_0x70f = 0;
|
|
field_0x703++;
|
|
|
|
if (field_0x713 != 2 && field_0x703 >= 3 && cM_rnd() < (field_0x703 / 10.0f) + 0.3f) {
|
|
field_0x70f = 10;
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
}
|
|
|
|
field_0x704 = 0;
|
|
f32 var_f31 = cM_rndF(200.0f) + 300.0f;
|
|
var_r28 = daPy_getPlayerActorClass()->shape_angle.y + 0x8000;
|
|
|
|
if (field_0x70f == 10) {
|
|
var_f31 += 400.0f;
|
|
var_r28 = daPy_getPlayerActorClass()->shape_angle.y + cM_rndFX(2.9f) * 8192.0f;
|
|
} else if (dComIfGp_checkPlayerStatus0(0, 0x400)) {
|
|
var_f31 += 400.0f;
|
|
}
|
|
|
|
mFlyWarpPos.set(cM_ssin(var_r28) * var_f31, 0.0f, cM_scos(var_r28) * var_f31);
|
|
mFlyWarpPos += player_pos;
|
|
|
|
if (mFlyWarpPos.z > 1000.0f || mFlyWarpPos.z < -1400.0f || std::abs(mFlyWarpPos.x) > 1200.0f) {
|
|
var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z);
|
|
mFlyWarpPos.set(cM_ssin(var_r28) * var_f31, 0.0f, cM_scos(var_r28) * var_f31);
|
|
mFlyWarpPos += player_pos;
|
|
}
|
|
}
|
|
break;
|
|
case 2: {
|
|
f32 var_f29 = player_pos.absXZ(current.pos);
|
|
s16 spE = cLib_targetAngleY(&player_pos, ¤t.pos);
|
|
s16 spC = cM_atan2s(-player_pos.x, -player_pos.z);
|
|
|
|
if ((s16)(spE - spC) < 0) {
|
|
var_r28 = spE + 0x2000;
|
|
} else {
|
|
var_r28 = spE - 0x2000;
|
|
}
|
|
|
|
if (var_f29 < 400.0f) {
|
|
var_f29 = 400.0f;
|
|
}
|
|
|
|
mFlyWarpPos.set(var_f29 * cM_ssin(var_r28), 0.0f, var_f29 * cM_scos(var_r28));
|
|
mFlyWarpPos += player_pos;
|
|
field_0x70f = 20;
|
|
break;
|
|
}
|
|
case 3:
|
|
f32 var_f30 = cM_rndF(200.0f) + 700.0f;
|
|
if (field_0x713 == 0) {
|
|
var_f30 += 400.0f;
|
|
var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z);
|
|
} else {
|
|
var_f30 += 400.0f;
|
|
var_r28 = daPy_getPlayerActorClass()->shape_angle.y + cM_rndFX(3.9f) * 8192.0f;
|
|
}
|
|
|
|
mFlyWarpPos.set(cM_ssin(var_r28) * var_f30, 0.0f, cM_scos(var_r28) * var_f30);
|
|
mFlyWarpPos += player_pos;
|
|
|
|
if (mFlyWarpPos.z > 1000.0f || mFlyWarpPos.z < -1400.0f || std::abs(mFlyWarpPos.x) > 1200.0f) {
|
|
var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z);
|
|
mFlyWarpPos.set(cM_ssin(var_r28) * var_f30, 0.0f, cM_scos(var_r28) * var_f30);
|
|
mFlyWarpPos += player_pos;
|
|
}
|
|
|
|
field_0x70f = 10;
|
|
field_0x704 = 1;
|
|
break;
|
|
}
|
|
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
|
|
/* 80648F64-806494A8 00AF44 0544+00 2/1 0/0 0/0 .text executeLastStartDemo__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeLastStartDemo() {
|
|
dCamera_c* camera = dCam_getBody();
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz sp1C;
|
|
cXyz sp28(0.0f, 0.0f, 0.0f);
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
if (!eventInfo.checkCommandDemoAccrpt()) {
|
|
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
|
|
eventInfo.onCondition(2);
|
|
} else {
|
|
camera->Stop();
|
|
camera->SetTrimSize(3);
|
|
setBck(BCK_ZAN_LAST_DEMO, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_OP, 0, -1);
|
|
mpModelMorf->setPlaySpeed(0.0f);
|
|
|
|
gravity = -5.0f;
|
|
mModeTimer = 10;
|
|
mMode = 1;
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (mModeTimer == 0) {
|
|
current.pos.set(0.0f, 480.0f, -1000.0f);
|
|
shape_angle.y = 0;
|
|
shape_angle.z = 0;
|
|
shape_angle.x = 0;
|
|
current.angle.y = -0x8000;
|
|
speedF = 0.0f;
|
|
|
|
mDemoCamEye.set(0.0f, 50.0f, -600.0f);
|
|
mDemoCamCenter.set(0.0f, 200.0f, -1000.0f);
|
|
mDemoCamBank = 60.0f;
|
|
mMode = 2;
|
|
return;
|
|
}
|
|
break;
|
|
case 2:
|
|
player->setPlayerPosAndAngle(&sp28, 0x8000, 0);
|
|
|
|
sp1C.set(0.0f, 90.0f, -900.0f);
|
|
cLib_addCalcPos(&mDemoCamCenter, sp1C, 0.2f, 5.0f, 1.0f);
|
|
|
|
if (mAcch.ChkGroundHit()) {
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
mpModelMorf->setPlaySpeed(1.0f);
|
|
mMode = 3;
|
|
}
|
|
break;
|
|
case 3:
|
|
sp1C = eyePos;
|
|
sp1C.y -= 30.0f;
|
|
|
|
cLib_addCalcPos(&mDemoCamCenter, sp1C, 0.5f, 50.0f, 1.0f);
|
|
if (mpModelMorf->checkFrame(97)) {
|
|
mMode = 4;
|
|
}
|
|
break;
|
|
case 4:
|
|
cLib_addCalc2(&mDemoCamBank, 72.0f, 0.3f, 1.0f);
|
|
sp1C = eyePos;
|
|
sp1C.y -= 30.0f;
|
|
|
|
cLib_addCalc2(&mDemoCamCenter.y, sp1C.y, 0.5f, 50.0f);
|
|
sp1C.y = mDemoCamCenter.y;
|
|
|
|
cLib_addCalcPosXZ(&mDemoCamCenter, sp1C, 0.5f, 3.0f, 1.0f);
|
|
if (mpModelMorf->checkFrame(103)) {
|
|
dComIfGp_getVibration().StartShock(2, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
mMode = 5;
|
|
}
|
|
break;
|
|
case 5:
|
|
cLib_addCalc2(&mDemoCamBank, 72.0f, 0.3f, 1.0f);
|
|
sp1C = eyePos;
|
|
sp1C.y = mDemoCamCenter.y;
|
|
|
|
cLib_addCalcPosXZ(&mDemoCamCenter, sp1C, 0.5f, 3.0f, 1.0f);
|
|
if (mpModelMorf->checkFrame(134)) {
|
|
mDrawSwords = true;
|
|
mMode = 6;
|
|
}
|
|
break;
|
|
case 6:
|
|
cLib_addCalc2(&mDemoCamCenter.y, 128.0f, 0.3f, 3.0f);
|
|
cLib_addCalc2(&mDemoCamBank, 55.0f, 0.3f, 3.0f);
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
mFightCycle = 0;
|
|
field_0x713 = 0;
|
|
setActionMode(ACT_LAST_ATTACK, 0);
|
|
field_0x70b = 0;
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
mDemoCamEye.set(0.0f, 300.0f, 200.0f);
|
|
camera->Reset(mDemoCamCenter, mDemoCamEye);
|
|
camera->Start();
|
|
camera->SetTrimSize(0);
|
|
dComIfGp_event_reset();
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0);
|
|
}
|
|
|
|
/* 806494A8-8064A58C 00B488 10E4+00 2/1 0/0 0/0 .text executeLastAttack__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeLastAttack() {
|
|
s16 angle_to_player = fopAcM_searchPlayerAngleY(this);
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
gravity = -5.0f;
|
|
|
|
if (field_0x713 == 0) {
|
|
mMode = 1;
|
|
setBck(BCK_ZAN_SW_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mModeTimer = 60;
|
|
} else {
|
|
mMode = 5;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (mpModelMorf->checkFrame(2) || mpModelMorf->checkFrame(17)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SWD_RUB, 0, -1);
|
|
}
|
|
|
|
if (checkAvoidWeapon(0)) {
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
setTgHitBit(FALSE);
|
|
|
|
field_0x71c++;
|
|
if (field_0x71c < 5) {
|
|
setLastWarp(2, 0);
|
|
} else {
|
|
field_0x703 = 7;
|
|
setLastWarp(1, 0);
|
|
}
|
|
} else {
|
|
cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 0x10, 0x400);
|
|
current.angle.y = shape_angle.y;
|
|
|
|
if (fopAcM_searchPlayerDistance(this) < 800.0f || mModeTimer == 0) {
|
|
mMode = 2;
|
|
setBck(BCK_ZAN_SW_WALK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
if (mpModelMorf->checkFrame(10) || mpModelMorf->checkFrame(26)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT, 0, -1);
|
|
}
|
|
|
|
if (checkAvoidWeapon(0)) {
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
setTgHitBit(FALSE);
|
|
|
|
field_0x71c++;
|
|
if (field_0x71c < 5) {
|
|
setLastWarp(2, 0);
|
|
} else {
|
|
field_0x703 = 7;
|
|
setLastWarp(1, 0);
|
|
}
|
|
} else {
|
|
cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 0x10, 0x400);
|
|
current.angle.y = shape_angle.y;
|
|
cLib_chaseF(&speedF, 5.0f, 1.0f);
|
|
|
|
if (fopAcM_searchPlayerDistance(this) < 500.0f) {
|
|
mMode = 5;
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
if (field_0x713 == 0) {
|
|
setBck(BCK_ZAN_SW_ATTACK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
mModeTimer = 200;
|
|
speedF = 5.0f;
|
|
} else {
|
|
setBck(BCK_ZAN_SW_ATTACKB, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
if (field_0x713 != 2) {
|
|
mModeTimer = cM_rndF(60.0f) + 60.0f;
|
|
} else {
|
|
mModeTimer = cM_rndF(15.0f) + 30.0f;
|
|
}
|
|
|
|
speedF = 10.0f;
|
|
}
|
|
|
|
mMode = 6;
|
|
field_0x6f8 = 0;
|
|
current.angle.y = shape_angle.y;
|
|
|
|
setTgType(2);
|
|
setTgHitBit(TRUE);
|
|
setTgShield(FALSE);
|
|
field_0x702 = 0;
|
|
case 6:
|
|
if (checkAvoidWeapon(FALSE)) {
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
setTgHitBit(FALSE);
|
|
|
|
field_0x71c++;
|
|
if (field_0x71c < 10) {
|
|
setLastWarp(2, 0);
|
|
} else {
|
|
field_0x703 = 7;
|
|
setLastWarp(1, 0);
|
|
}
|
|
} else {
|
|
cLib_chaseF(&mSwordSize, l_HIO.mSwordAttackSize, 0.1f);
|
|
cLib_addCalcAngleS2(¤t.angle.y, angle_to_player, 8, 0x400);
|
|
cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 8, 0x400);
|
|
|
|
if (field_0x713 == 0) {
|
|
if (mpModelMorf->checkFrame(4) || mpModelMorf->checkFrame(24)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_L, 0, -1);
|
|
} else if (mpModelMorf->checkFrame(7) || mpModelMorf->checkFrame(28)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT_L, 0, -1);
|
|
} else if (mpModelMorf->checkFrame(5)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_A1, -1);
|
|
} else if (mpModelMorf->checkFrame(22)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_A2, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(1)) {
|
|
mSwordCc[1].OnAtSetBit();
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(12)) {
|
|
mSwordCc[1].OffAtSetBit();
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(22)) {
|
|
mSwordCc[0].OnAtSetBit();
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(33)) {
|
|
mSwordCc[0].OffAtSetBit();
|
|
}
|
|
} else {
|
|
if (mpModelMorf->checkFrame(2) || mpModelMorf->checkFrame(20)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_S1, 0, -1);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_B1, -1);
|
|
} else if (mpModelMorf->checkFrame(11) || mpModelMorf->checkFrame(28)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_S2, 0, -1);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_B2, -1);
|
|
} else if (mpModelMorf->checkFrame(0) || mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(17) || mpModelMorf->checkFrame(26)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT, 0, -1);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(1) || mpModelMorf->checkFrame(19)) {
|
|
mSwordCc[1].OnAtSetBit();
|
|
mSwordCc[0].OffAtSetBit();
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(28)) {
|
|
mSwordCc[0].OnAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
}
|
|
}
|
|
|
|
if (mModeTimer == 0 && mpModelMorf->checkFrame(1)) {
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
setTgHitBit(FALSE);
|
|
setLastWarp(1, 0);
|
|
}
|
|
}
|
|
break;
|
|
case 20:
|
|
if (fopAcM_searchPlayerDistance(this) < 500.0f) {
|
|
mMode = 5;
|
|
} else {
|
|
mMode = 2;
|
|
setBck(BCK_ZAN_SW_WALK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
break;
|
|
case 10:
|
|
case 30:
|
|
dComIfGs_onOneZoneSwitch(1, fopAcM_GetRoomNo(this));
|
|
setBck(BCK_ZAN_SPIN, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
if (field_0x704 == 0) {
|
|
if (field_0x713 != 2) {
|
|
field_0x6ec = 300;
|
|
field_0x71d = 1;
|
|
field_0x6ff = 0;
|
|
}
|
|
} else if (field_0x6ec < 30) {
|
|
field_0x6ec = 30;
|
|
}
|
|
|
|
if (field_0x713 == 0) {
|
|
mMode = 11;
|
|
} else {
|
|
mMode = 31;
|
|
}
|
|
|
|
current.angle.y = angle_to_player;
|
|
|
|
mRollCc.OnAtSetBit();
|
|
mRollCc.OnTgSetBit();
|
|
mRollCc.OnCoSetBit();
|
|
setTgType(0xD8FBFDFF);
|
|
setTgShield(TRUE);
|
|
setTgHitBit(TRUE);
|
|
field_0x6f8 = 0x3000;
|
|
speedF = 30.0f;
|
|
field_0x6fd = 0;
|
|
field_0x70b = 0;
|
|
case 11:
|
|
case 31: {
|
|
mSound.startCreatureVoiceLevel(Z2SE_EN_ZAN_CTL_V_SPIN_ATK, -1);
|
|
setLastRollEffect();
|
|
|
|
cLib_chaseF(&mSwordSize, l_HIO.mSwordAttackSize, 0.1f);
|
|
|
|
f32 var_f31 = 1.2f;
|
|
if (field_0x713 != 0) {
|
|
var_f31 = 1.5f;
|
|
}
|
|
|
|
if (field_0x70b != 0) {
|
|
if (mAcch.ChkGroundHit()) {
|
|
field_0x70b--;
|
|
|
|
if (field_0x70b != 0) {
|
|
speedF = 0.0f;
|
|
speed.y = 30.0f;
|
|
field_0x6ec = 0;
|
|
}
|
|
}
|
|
} else if (mMode == 11) {
|
|
int sp48 = abs((s16)(angle_to_player - current.angle.y));
|
|
if (sp48 > 0x4000) {
|
|
if (sp48 > 0x6800) {
|
|
cLib_chaseF(&speedF, -30.0f, var_f31 * 0.2f);
|
|
} else {
|
|
cLib_chaseF(&speedF, 5.0f, var_f31 * 0.2f);
|
|
}
|
|
|
|
cLib_addCalcAngleS2(¤t.angle.y, angle_to_player + 0x8000, 0x10, var_f31 * 512.0f);
|
|
if (speedF < 0.0f && sp48 > 0x6000) {
|
|
current.angle.y += 0x8000;
|
|
speedF = -speedF;
|
|
}
|
|
} else {
|
|
if (sp48 > 0x1800) {
|
|
cLib_chaseF(&speedF, 10.0f, var_f31);
|
|
} else {
|
|
cLib_chaseF(&speedF, var_f31 * 30.0f, var_f31);
|
|
}
|
|
|
|
cLib_addCalcAngleS2(¤t.angle.y, angle_to_player, 0x10, var_f31 * 768.0f);
|
|
}
|
|
} else {
|
|
cLib_chaseF(&speedF, var_f31 * 30.0f, var_f31 * 2.0f);
|
|
}
|
|
|
|
int sp3C = 0;
|
|
int sp40 = 0;
|
|
int sp44 = 0;
|
|
cCcD_Obj* sp48 = NULL;
|
|
|
|
if (mRollCc.ChkTgHit()) {
|
|
sp48 = mRollCc.GetTgHitObj();
|
|
|
|
if (sp48->ChkAtType(AT_TYPE_IRON_BALL)) {
|
|
sp40 = 1;
|
|
} else if (sp48->ChkAtType(AT_TYPE_NORMAL_SWORD)) {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
if (player->getCutType() == daPy_py_c::CUT_TYPE_TURN_RIGHT || player->getCutType() == daPy_py_c::CUT_TYPE_TURN_LEFT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT)
|
|
{
|
|
sp40 = 1;
|
|
}
|
|
}
|
|
|
|
def_se_set(&mSound, mRollCc.GetTgHitObj(), 0x2A, this);
|
|
mRollCc.ClrTgHit();
|
|
} else if (mRollCc.ChkAtHit()) {
|
|
sp48 = mRollCc.GetAtHitObj();
|
|
if (!mRollCc.ChkAtShieldHit()) {
|
|
sp44 = 1;
|
|
}
|
|
|
|
mRollCc.ClrAtHit();
|
|
}
|
|
|
|
if (sp48 != NULL && fopAcM_GetName(dCc_GetAc(sp48->GetAc())) == PROC_ALINK) {
|
|
sp3C = 1;
|
|
field_0x6fd++;
|
|
|
|
if (sp40 != 0) {
|
|
speedF = -speedF;
|
|
field_0x70b = 2;
|
|
speed.y = 40.0f;
|
|
} else if (sp44 != 0) {
|
|
field_0x6fd += 5;
|
|
speedF = -45.0f;
|
|
} else {
|
|
speedF = -2.0f;
|
|
}
|
|
} else {
|
|
if (mAcch.ChkWallHit()) {
|
|
s16 sp8 = mAcchCir.GetWallAngleY();
|
|
|
|
if (speedF > 0.0f) {
|
|
if ((s16)cLib_distanceAngleS(sp8, current.angle.y) > 0x5800) {
|
|
current.angle.y = sp8 - 0x8000;
|
|
speedF *= 0.8f;
|
|
sp3C = 1;
|
|
field_0x6fd += 5;
|
|
}
|
|
} else {
|
|
if ((s16)cLib_distanceAngleS(sp8, current.angle.y) < 0x2800) {
|
|
current.angle.y = sp8 - (s16)(current.angle.y - sp8);
|
|
speedF *= 0.8f;
|
|
sp3C = 1;
|
|
field_0x6fd += 5;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sp3C != 0) {
|
|
if (mMode == 31 && field_0x6fd >= 5) {
|
|
mRollCc.OffAtSetBit();
|
|
mRollCc.OffTgSetBit();
|
|
mRollCc.OffCoSetBit();
|
|
setTgHitBit(FALSE);
|
|
setLastWarp(3, sp44);
|
|
return;
|
|
}
|
|
|
|
if (field_0x6ec < 10) {
|
|
field_0x6ec = 10;
|
|
mMode = 12;
|
|
}
|
|
}
|
|
|
|
cLib_chaseAngleS(&field_0x6f8, 0x3000, 0x80);
|
|
shape_angle.y += field_0x6f8;
|
|
|
|
if (field_0x6ec == 0) {
|
|
mMode = 12;
|
|
}
|
|
break;
|
|
}
|
|
case 12:
|
|
mSound.startCreatureVoiceLevel(Z2SE_EN_ZAN_CTL_V_SPIN_ATK, -1);
|
|
setLastRollEffect();
|
|
|
|
cLib_chaseF(&speedF, 0.0f, 1.0f);
|
|
cLib_chaseAngleS(&field_0x6f8, 0, 0x80);
|
|
shape_angle.y += field_0x6f8;
|
|
|
|
if (field_0x6f8 < 0x1000) {
|
|
mRollCc.OffAtSetBit();
|
|
mRollCc.OffTgSetBit();
|
|
mRollCc.OffCoSetBit();
|
|
|
|
setBck(BCK_ZAN_SW_FATIGUE, J3DFrameCtrl::EMode_LOOP, 30.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_ZEIZEI, -1);
|
|
mMode = 13;
|
|
dComIfGs_offOneZoneSwitch(1, fopAcM_GetRoomNo(this));
|
|
|
|
if (field_0x713 == 2) {
|
|
field_0x6ec = 450;
|
|
}
|
|
}
|
|
break;
|
|
case 13:
|
|
if (field_0x6f8 < 0x800) {
|
|
field_0x702 = 0;
|
|
setTgShield(FALSE);
|
|
setTgHitBit(TRUE);
|
|
|
|
field_0x6f0 = 60;
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
}
|
|
|
|
cLib_chaseF(&mSwordSize, 1.0f, 0.1f);
|
|
cLib_chaseF(&speedF, 0.0f, 1.0f);
|
|
cLib_chaseAngleS(&field_0x6f8, 0, 0x80);
|
|
shape_angle.y += field_0x6f8;
|
|
|
|
if (field_0x6f8 == 0) {
|
|
setActionMode(ACT_LAST_TIRED, 0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064A58C-8064A688 00C56C 00FC+00 1/1 0/0 0/0 .text executeLastTired__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::executeLastTired() {
|
|
switch (mMode) {
|
|
case 0:
|
|
if (field_0x713 == 0) {
|
|
mModeTimer = 120;
|
|
} else if (field_0x713 == 1) {
|
|
mModeTimer = 90;
|
|
} else {
|
|
mModeTimer = 60;
|
|
}
|
|
|
|
field_0x6f0 = mModeTimer;
|
|
mMode = 5;
|
|
field_0x702 = 0;
|
|
|
|
setTgShield(FALSE);
|
|
setTgHitBit(TRUE);
|
|
field_0x71d = 0;
|
|
field_0x703 = 0;
|
|
field_0x71c = 0;
|
|
field_0x712 = 0;
|
|
case 5:
|
|
cLib_chaseF(&speedF, 0.0f, 1.0f);
|
|
if (mModeTimer == 0) {
|
|
setTgHitBit(FALSE);
|
|
setLastWarp(1, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8064A688-8064AC20 00C668 0598+00 2/1 0/0 0/0 .text executeLastDamage__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeLastDamage() {
|
|
switch (mMode) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
if (mLastAction == ACT_LAST_ATTACK) {
|
|
field_0x6f0 = 0;
|
|
}
|
|
|
|
if (field_0x6f0 == 0) {
|
|
setTgHitBit(FALSE);
|
|
} else {
|
|
setTgHitBit(TRUE);
|
|
}
|
|
|
|
mSwordCc[0].OffAtSetBit();
|
|
mSwordCc[1].OffAtSetBit();
|
|
|
|
speedF = 0.0f;
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
|
|
if (mTakenBigDmg) {
|
|
if (mFightCycle == 0) {
|
|
if (health < 400) {
|
|
health = 400;
|
|
}
|
|
} else if (mFightCycle == 1 && health < 200) {
|
|
health = 200;
|
|
}
|
|
|
|
mFightCycle++;
|
|
setTgHitBit(FALSE);
|
|
}
|
|
|
|
if (health <= 0 || mFightCycle >= 3) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
setActionMode(ACT_LAST_END_DEMO, 0);
|
|
return;
|
|
}
|
|
|
|
field_0x702 = 0;
|
|
|
|
if (mMode == 1) {
|
|
setBck(BCK_ZAN_SW_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else if (mMode == 2) {
|
|
setBck(BCK_ZAN_SW_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else if (cM_rnd() < 0.5f) {
|
|
setBck(BCK_ZAN_SW_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
} else {
|
|
setBck(BCK_ZAN_SW_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
}
|
|
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1);
|
|
mMode = 5;
|
|
case 5: {
|
|
BOOL var_r28 = false;
|
|
if (checkBck(BCK_ZAN_SW_DAMAGEL)) {
|
|
if (mpModelMorf->checkFrame(17)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG_JITANDA, -1);
|
|
}
|
|
|
|
if (mLastAction == ACT_LAST_ATTACK) {
|
|
if (mpModelMorf->checkFrame(18)) {
|
|
var_r28 = true;
|
|
}
|
|
} else {
|
|
if (mpModelMorf->checkFrame(38)) {
|
|
var_r28 = true;
|
|
}
|
|
}
|
|
|
|
if (var_r28) {
|
|
setTgHitBit(FALSE);
|
|
field_0x71c++;
|
|
field_0x712++;
|
|
|
|
if (field_0x71c >= 5 || field_0x712 >= 3) {
|
|
field_0x703 = 7;
|
|
setLastWarp(1, 0);
|
|
} else if (mLastAction == ACT_LAST_ATTACK) {
|
|
setLastWarp(2, 0);
|
|
} else {
|
|
setLastWarp(1, 0);
|
|
}
|
|
}
|
|
} else {
|
|
if (mpModelMorf->checkFrame(19)) {
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG_SHINARU, -1);
|
|
}
|
|
|
|
if (mLastAction == ACT_LAST_ATTACK) {
|
|
if (mpModelMorf->checkFrame(20)) {
|
|
var_r28 = true;
|
|
}
|
|
} else {
|
|
if (mpModelMorf->checkFrame(30)) {
|
|
var_r28 = true;
|
|
}
|
|
}
|
|
|
|
if (var_r28) {
|
|
setTgHitBit(FALSE);
|
|
field_0x71c++;
|
|
field_0x712++;
|
|
|
|
if (field_0x71c >= 5 || field_0x712 >= 3) {
|
|
field_0x703 = 7;
|
|
setLastWarp(1, 0);
|
|
} else if (mLastAction == ACT_LAST_ATTACK) {
|
|
setLastWarp(2, 0);
|
|
} else {
|
|
setLastWarp(1, 0);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 10:
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1);
|
|
mMode = 11;
|
|
speedF = 0.0f;
|
|
break;
|
|
case 11:
|
|
if (mpModelMorf->isStop()) {
|
|
setTgHitBit(FALSE);
|
|
setLastWarp(1, 0);
|
|
}
|
|
break;
|
|
case 20:
|
|
setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
field_0x702 = 0;
|
|
mModeTimer = 20;
|
|
mMode = 21;
|
|
case 21:
|
|
if (mModeTimer == 0) {
|
|
setTgHitBit(FALSE);
|
|
setLastWarp(1, 0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064AC20-8064AC8C 00CC00 006C+00 1/1 0/0 0/0 .text s_del_tp__FPvPv */
|
|
static void* s_del_tp(void* i_actor, void* i_data) {
|
|
if (fopAcM_IsActor(i_actor)) {
|
|
if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_TP) {
|
|
fopAcM_delete((fopAc_ac_c*)i_actor);
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 8064AC8C-8064B270 00CC6C 05E4+00 1/1 0/0 0/0 .text executeLastEndDemo__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeLastEndDemo() {
|
|
dCamera_c* camera = dCam_getBody();
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz sp34;
|
|
cXyz sp40;
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
if (!eventInfo.checkCommandDemoAccrpt()) {
|
|
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
|
|
eventInfo.onCondition(2);
|
|
return;
|
|
}
|
|
|
|
mDrawSwords = false;
|
|
camera->Stop();
|
|
camera->SetTrimSize(3);
|
|
|
|
setBck(BCK_ZAN_DIE_DEMO, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_END, 0, -1);
|
|
Z2GetAudioMgr()->bgmStop(30, 0);
|
|
fpcM_Search(s_del_tp, this);
|
|
speedF = 0.0f;
|
|
|
|
mDemoCamCenter.set(0.0f, 120.0f, -1000.0f);
|
|
mDemoCamEye.set(0.0f, 50.0f, -750.0f);
|
|
mDemoCamBank = 80.0f;
|
|
|
|
mMode = 1;
|
|
field_0x6ba = 0x2F00;
|
|
field_0x6bc = 0.0f;
|
|
dComIfGs_onStageBossEnemy();
|
|
return;
|
|
case 1:
|
|
case 2:
|
|
if (mMode == 1) {
|
|
cXyz sp4C(0.0f, 0.0f, 0.0f);
|
|
player->setPlayerPosAndAngle(&sp4C, 0x8000, 0);
|
|
|
|
current.pos.set(0.0f, 0.0f, -1000.0f);
|
|
shape_angle.z = 0;
|
|
shape_angle.x = 0;
|
|
shape_angle.y = 0;
|
|
sp34 = mDemoCamCenter;
|
|
mMode = 2;
|
|
} else {
|
|
sp34 = eyePos;
|
|
sp34.y -= 44.0f;
|
|
}
|
|
|
|
{
|
|
f32 var_f31 = mpModelMorf->getFrame();
|
|
if ((80 <= var_f31 && var_f31 <= 120) || (175 <= var_f31 && var_f31 <= 205)) {
|
|
cLib_addCalcPos(&mDemoCamCenter, sp34, 0.1f, 3.0f, 1.0f);
|
|
} else {
|
|
cLib_addCalcPos(&mDemoCamCenter, sp34, 0.5f, 30.0f, 1.0f);
|
|
}
|
|
}
|
|
|
|
cLib_addCalcAngleS(&field_0x6ba, 0, 0x10, 0x40, 0x10);
|
|
|
|
sp34.set(0.0f, 50.0f, -1000.0f);
|
|
sp40.set(0.0f, field_0x6bc, 250.0f);
|
|
cLib_offsetPos(&mDemoCamEye, &sp34, field_0x6ba, &sp40);
|
|
|
|
if (mpModelMorf->checkFrame(230)) {
|
|
dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(250)) {
|
|
mMode = 3;
|
|
}
|
|
break;
|
|
case 3:
|
|
cLib_addCalcAngleS(&field_0x6ba, 0, 0x10, 0x40, 0x10);
|
|
cLib_addCalc2(&field_0x6bc, 250.0f, 0.1f, 3.0f);
|
|
sp34.set(0.0f, 300.0f, -1000.0f);
|
|
sp40.set(0.0f, 0.0f, 150.0f);
|
|
|
|
{
|
|
cXyz sp58;
|
|
cLib_offsetPos(&sp58, &sp34, field_0x6ba, &sp40);
|
|
cLib_addCalcPos(&mDemoCamEye, sp58, 0.1f, 4.0f, 1.0f);
|
|
}
|
|
|
|
sp34 = eyePos;
|
|
cLib_addCalcPos(&mDemoCamCenter, sp34, 0.1f, 0.8f, 1.0f);
|
|
|
|
if (mpModelMorf->checkFrame(340)) {
|
|
mpModelMorf->setFrame(300);
|
|
mMode = 14;
|
|
|
|
mDemoCamEye.set(0.0f, 5.0f, -800.0f);
|
|
field_0x6bc = 30.0f;
|
|
mDemoCamCenter = eyePos;
|
|
mDemoCamCenter.y -= field_0x6bc;
|
|
mDemoCamBank = 80.0f;
|
|
}
|
|
break;
|
|
case 14:
|
|
mDemoCamCenter = eyePos;
|
|
mDemoCamCenter.y -= field_0x6bc;
|
|
|
|
if (mpModelMorf->checkFrame(360)) {
|
|
mpModelMorf->setPlaySpeed(0.5f);
|
|
mMode = 15;
|
|
}
|
|
break;
|
|
case 15:
|
|
if (mpModelMorf->checkFrame(375)) {
|
|
dComIfGp_setNextStage("D_MN08A", 25, 10, 9);
|
|
}
|
|
|
|
mDemoCamCenter = eyePos;
|
|
mDemoCamCenter.y -= field_0x6bc;
|
|
|
|
cLib_chaseF(&field_0x6bc, 0.0f, 1.0f);
|
|
cLib_chaseF(&mDemoCamBank, 80.0f, 0.5f);
|
|
break;
|
|
}
|
|
|
|
camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0);
|
|
}
|
|
|
|
/* 8064B270-8064B49C 00D250 022C+00 1/1 0/0 0/0 .text calcMahojinAnime__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::calcMahojinAnime() {
|
|
switch (mMahojinAnmMode) {
|
|
case 1:
|
|
mpMahojinStartBtk->setPlaySpeed(1.0f);
|
|
mpMahojinStartBtk->setFrame(0);
|
|
mpMahojinEndBrk->setPlaySpeed(0.0f);
|
|
mpMahojinEndBrk->setFrame(0);
|
|
mMahojinAnmMode = 2;
|
|
case 2:
|
|
if (mpMahojinStartBtk->checkFrame(9)) {
|
|
mMahojin2AnmMode = 1;
|
|
}
|
|
|
|
if (mpMahojinStartBtk->isStop()) {
|
|
mMahojinAnmMode = 3;
|
|
}
|
|
break;
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
mpMahojinEndBrk->setPlaySpeed(1.0f);
|
|
mMahojinAnmMode = 5;
|
|
case 5:
|
|
if (mpMahojinEndBrk->isStop()) {
|
|
mMahojinAnmMode = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
switch (mMahojin2AnmMode) {
|
|
case 0:
|
|
mpMahojinBrk2->setPlaySpeed(0.0f);
|
|
mpMahojinBrk2->setFrame(30);
|
|
mpMahojinStartBtk2->setFrame(19);
|
|
mMahojin2Size = 1.0f;
|
|
break;
|
|
case 1:
|
|
mpMahojinBrk2->setPlaySpeed(0.5f);
|
|
cLib_chaseF(&mMahojin2Size, 10.0f, 0.1f);
|
|
|
|
if (mpMahojinBrk2->isStop()) {
|
|
mMahojin2AnmMode = 0;
|
|
mpMahojinBrk2->init(mpMahojinModel2->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", 0x4F), TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8064B49C-8064B69C 00D47C 0200+00 2/2 0/0 0/0 .text calcRoomChangeCamera__10daB_ZANT_cFi */
|
|
void daB_ZANT_c::calcRoomChangeCamera(int param_0) {
|
|
cXyz eye_target(-100.0f, 87.0f, -160.0f);
|
|
cXyz center_target(106.0f, 483.0f, 843.0f);
|
|
|
|
if (param_0 == 1) {
|
|
cXyz sp38(-20.0f, -40.0f, -100.0f);
|
|
eye_target += sp38;
|
|
center_target += sp38;
|
|
}
|
|
|
|
if (mFightPhase == PHASE_OP) {
|
|
eye_target.x += 140.0f;
|
|
center_target.x += 140.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(eye_target);
|
|
mDoMtx_stack_c::multVecZero(&eye_target);
|
|
|
|
eye_target.y += 250.0f;
|
|
eye_target.z -= 800.0f;
|
|
|
|
mDoMtx_stack_c::YrotS(-0x8000);
|
|
mDoMtx_stack_c::transM(center_target);
|
|
mDoMtx_stack_c::multVecZero(¢er_target);
|
|
|
|
center_target.y += 250.0f;
|
|
center_target.z -= 800.0f;
|
|
}
|
|
|
|
switch (param_0) {
|
|
case 0:
|
|
mDemoCamBank = 58.0f;
|
|
cLib_chaseF(&field_0x77c, 30.0f, 1.0f);
|
|
cLib_addCalcPos(&mDemoCamEye, eye_target, 0.3f, field_0x77c * 1.1f, 3.0f);
|
|
cLib_addCalcPos(&mDemoCamCenter, center_target, 0.3f, field_0x77c, 3.0f);
|
|
break;
|
|
case 1:
|
|
cLib_addCalcPos(&mDemoCamEye, eye_target, 0.2f, 15.0f, 3.0f);
|
|
cLib_addCalcPos(&mDemoCamCenter, center_target, 0.2f, 15.0f, 3.0f);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064B69C-8064B868 00D67C 01CC+00 3/3 0/0 0/0 .text initNextRoom__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::initNextRoom() {
|
|
field_0x70f = 0;
|
|
field_0x6f0 = 0;
|
|
field_0x70e = 0;
|
|
mDrawSwords = false;
|
|
|
|
setTgType(0xD8FBFDFF);
|
|
mBodySphCc[0].OffTgNoHitMark();
|
|
mBodySphCc[1].OffTgNoHitMark();
|
|
|
|
dComIfGs_offSaveDunSwitch(20);
|
|
dComIfGs_offSaveDunSwitch(21);
|
|
dComIfGs_offSaveDunSwitch(22);
|
|
|
|
if (mFightPhase != PHASE_LAST) {
|
|
health = 280;
|
|
} else {
|
|
health = field_0x560;
|
|
}
|
|
|
|
mAcchCir.SetWall(100.0f, 100.f);
|
|
|
|
if (mFightPhase == PHASE_MG) {
|
|
attention_info.distances[fopAc_attn_BATTLE_e] = 4;
|
|
} else {
|
|
attention_info.distances[fopAc_attn_BATTLE_e] = 24;
|
|
}
|
|
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[0], &pmobile);
|
|
|
|
if (mFightPhase == PHASE_OI) {
|
|
fopAcM_OnStatus(this, 0x80000);
|
|
|
|
if (pmobile == NULL) {
|
|
cXyz pos(0.0f, -3300.0f, 0.0f);
|
|
for (int i = 0; i < 4; i++) {
|
|
mMobileIDs[i] = fopAcM_create(PROC_B_ZANTZ, i | 0xFFFFFF00, &pos, warp_next_room[mFightPhase], &shape_angle, NULL, -1);
|
|
}
|
|
|
|
mCorrectMobileNo = 0;
|
|
}
|
|
} else {
|
|
fopAcM_OffStatus(this, 0x80000);
|
|
|
|
if (pmobile != NULL) {
|
|
fopAcM_delete(pmobile);
|
|
mMobileIDs[0] = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
}
|
|
|
|
tevStr.room_no = warp_next_room[mFightPhase];
|
|
}
|
|
|
|
/* 8064B868-8064C1C0 00D848 0958+00 2/1 0/0 0/0 .text executeRoomChange__10daB_ZANT_cFv
|
|
*/
|
|
void daB_ZANT_c::executeRoomChange() {
|
|
dCamera_c* camera = dCam_getBody();
|
|
cXyz sp34(0.0f, 0.0f, 0.0f);
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
switch (mMode) {
|
|
case 0:
|
|
setTgHitBit(FALSE);
|
|
if (!eventInfo.checkCommandDemoAccrpt()) {
|
|
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
|
|
eventInfo.onCondition(2);
|
|
return;
|
|
}
|
|
|
|
camera->Stop();
|
|
camera->SetTrimSize(3);
|
|
|
|
mDemoCamCenter = dCam_getBody()->Center();
|
|
mDemoCamEye = dCam_getBody()->Eye();
|
|
mDemoCamBank = dCam_getBody()->Fovy();
|
|
|
|
field_0x705 = 0;
|
|
mMode = 1;
|
|
|
|
if (mFightPhase != PHASE_MK) {
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
}
|
|
|
|
dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1);
|
|
break;
|
|
case 1:
|
|
if (calcScale(0)) {
|
|
mMode = 4;
|
|
mModeTimer = l_HIO.mDemoWarpTime;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (mModeTimer == 0) {
|
|
mMode = 10;
|
|
mModeTimer = 15;
|
|
|
|
current.pos.set(-140.0f, 300.0f, 700.0f);
|
|
old.pos = current.pos;
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
gravity = 0.0f;
|
|
|
|
shape_angle.x = 0;
|
|
current.angle.y = 0x8000;
|
|
shape_angle.y = 0x8000;
|
|
|
|
setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
player->changeOriginalDemo();
|
|
player->changeDemoPos0(&sp34);
|
|
player->changeDemoMode(0x17, 1, 4, 0);
|
|
|
|
mDemoCamBank = 65.0f;
|
|
mDemoCamEye.set(-225.0f, 344.0f, 382.0f);
|
|
mDemoCamCenter.set(118.0f, 672.0f, 1374.0f);
|
|
|
|
Z2GetAudioMgr()->changeBgmStatus(13);
|
|
field_0x77c = 0.0f;
|
|
|
|
calcRoomChangeCamera(0);
|
|
|
|
if (mFightPhase == PHASE_OI) {
|
|
for (int i = 0; i < 4; i++) {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[i], &pmobile);
|
|
|
|
if (pmobile != NULL) {
|
|
fopAcM_delete(pmobile);
|
|
mMobileIDs[i] = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
}
|
|
}
|
|
field_0x6fc = 1;
|
|
}
|
|
break;
|
|
case 10:
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (mModeTimer == 0) {
|
|
dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL);
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1);
|
|
mMode = 11;
|
|
}
|
|
break;
|
|
case 11:
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (calcScale(1)) {
|
|
mMode = 12;
|
|
mModeTimer = 20;
|
|
}
|
|
break;
|
|
case 12:
|
|
if (mModeTimer == 0) {
|
|
mMode = 13;
|
|
mModeTimer = 50;
|
|
}
|
|
break;
|
|
case 13:
|
|
calcRoomChangeCamera(0);
|
|
|
|
if (mModeTimer == 0) {
|
|
mMode = 14;
|
|
setBck(BCK_ZAN_FLOAT_APPEARSHORT, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f);
|
|
field_0x714 = 1;
|
|
mKankyoBlend = 0.0f;
|
|
|
|
static u32 mahojin_se[] = {
|
|
Z2SE_EN_ZAN_MAHOJIN_BB,
|
|
Z2SE_EN_ZAN_MAHOJIN_MG,
|
|
Z2SE_EN_ZAN_MAHOJIN_OI,
|
|
Z2SE_EN_ZAN_MAHOJIN_MK,
|
|
Z2SE_EN_ZAN_MAHOJIN_YO,
|
|
Z2SE_EN_ZAN_MAHOJIN_CTL,
|
|
};
|
|
|
|
mSound.startCreatureSound(mahojin_se[mFightPhase], 0, -1);
|
|
}
|
|
break;
|
|
case 14:
|
|
cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f);
|
|
|
|
if (mpModelMorf->checkFrame(42)) {
|
|
mMahojinAnmMode = 1;
|
|
Z2GetAudioMgr()->changeBgmStatus(mFightPhase + PHASE_MAX);
|
|
}
|
|
|
|
if (mpModelMorf->checkFrame(42)) {
|
|
field_0x715 = 30;
|
|
}
|
|
|
|
shape_angle.y = fopAcM_searchPlayerAngleY(this);
|
|
shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f;
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
dComIfGp_getVibration().StopQuake(0x1F);
|
|
setBck(BCK_ZAN_FLOAT_APPEARWAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f);
|
|
|
|
mFightPhase++;
|
|
if (mFightPhase >= PHASE_MAX) {
|
|
mFightPhase = PHASE_OP;
|
|
}
|
|
|
|
mMode = 15;
|
|
mModeTimer = l_HIO.mMahojinWaitTime;
|
|
|
|
initNextRoom();
|
|
cXyz pos(0.0f, 0.0f, 0.0f);
|
|
dComIfGs_setRestartRoom(pos, 0, warp_next_room[mFightPhase]);
|
|
}
|
|
break;
|
|
case 15:
|
|
if (mModeTimer == 0 && dComIfGp_roomControl_checkStatusFlag(warp_next_room[mFightPhase], 0x10)) {
|
|
mMode = 16;
|
|
field_0x714 = 0;
|
|
mKankyoBlend = 0.0f;
|
|
|
|
setBck(BCK_ZAN_FLOAT_WAITRETURN, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f);
|
|
mMahojinAnmMode = 4;
|
|
}
|
|
break;
|
|
case 16:
|
|
cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f);
|
|
player->setPlayerPosAndAngle(&sp34, 0, 0);
|
|
|
|
if (mpModelMorf->isStop()) {
|
|
if (mFightPhase != PHASE_LAST) {
|
|
camera->Reset(mDemoCamCenter, mDemoCamEye);
|
|
camera->Start();
|
|
camera->SetTrimSize(0);
|
|
dComIfGp_event_reset();
|
|
}
|
|
|
|
field_0x6fc = 0;
|
|
setTgHitBit(TRUE);
|
|
setBaseActionMode(1);
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (field_0x715 != 0) {
|
|
calcRoomChangeCamera(1);
|
|
field_0x715--;
|
|
}
|
|
|
|
camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0);
|
|
}
|
|
|
|
/* 8064C1C0-8064C5A8 00E1A0 03E8+00 8/7 0/0 0/0 .text setBaseActionMode__10daB_ZANT_cFi
|
|
*/
|
|
void daB_ZANT_c::setBaseActionMode(int param_0) {
|
|
switch (mFightPhase) {
|
|
case PHASE_BB:
|
|
if (param_0 == 0) {
|
|
if (field_0x70c == 0) {
|
|
setActionMode(ACT_FLY, 0);
|
|
} else {
|
|
setActionMode(ACT_FLY_GROUND, 0);
|
|
}
|
|
} else if (param_0 == 1) {
|
|
field_0x70b = 1;
|
|
mFlyWarpPosID = 0;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID];
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 1);
|
|
} else {
|
|
field_0x70c = 0;
|
|
gravity = 0.0f;
|
|
mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f;
|
|
mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3];
|
|
field_0x711 = 2;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
break;
|
|
case PHASE_MG:
|
|
if (param_0 == 0) {
|
|
setActionMode(ACT_SIMA_JUMP, 0);
|
|
} else if (param_0 == 1) {
|
|
gravity = -5.0f;
|
|
mFlyWarpPosID = 0;
|
|
mFlyWarpPos.set(0.0f, 1000.0f, 1100.0f);
|
|
field_0x6b8 = 0x8000;
|
|
field_0x711 = 3;
|
|
setActionMode(ACT_WARP, 0);
|
|
} else {
|
|
setActionMode(ACT_SIMA_JUMP, 11);
|
|
}
|
|
break;
|
|
case PHASE_YO:
|
|
if (param_0 == 0) {
|
|
setActionMode(ACT_ICE_DEMO, 100);
|
|
} else if (param_0 == 1) {
|
|
setActionMode(ACT_ICE_DEMO, 0);
|
|
} else {
|
|
setActionMode(ACT_ICE_DAMAGE, 30);
|
|
}
|
|
|
|
mModeTimer = 0;
|
|
break;
|
|
case PHASE_OI:
|
|
if (param_0 == 0) {
|
|
setActionMode(ACT_WATER, 0);
|
|
} else {
|
|
fopAc_ac_c* pmobile;
|
|
fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile);
|
|
|
|
s16 var_r27 = shape_angle.y;
|
|
cXyz sp44(current.pos);
|
|
sp44.y = -4000.0f;
|
|
|
|
if (pmobile != NULL) {
|
|
var_r27 = pmobile->shape_angle.y;
|
|
sp44.set(cM_ssin(var_r27) * 300.0f, 300.0f, cM_scos(var_r27) * 300.0f);
|
|
sp44 += pmobile->current.pos;
|
|
}
|
|
|
|
attention_info.flags = 0;
|
|
field_0x6b8 = var_r27;
|
|
mFlyWarpPos = sp44;
|
|
field_0x705 = 1;
|
|
field_0x711 = 1;
|
|
setActionMode(ACT_WARP, 0);
|
|
}
|
|
break;
|
|
case PHASE_MK:
|
|
if (param_0 == 0) {
|
|
setActionMode(ACT_MONKEY, 0);
|
|
} else if (param_0 == 1) {
|
|
setActionMode(ACT_MONKEY, 100);
|
|
} else {
|
|
setNearPillarPos();
|
|
field_0x711 = 0;
|
|
setActionMode(ACT_WARP, 1);
|
|
}
|
|
break;
|
|
case PHASE_LAST:
|
|
if (param_0 == 0) {
|
|
setActionMode(ACT_LAST_ATTACK, field_0x70f);
|
|
} else if (param_0 == 1) {
|
|
if (field_0x718 == 0) {
|
|
setActionMode(ACT_LAST_START_DEMO, 0);
|
|
} else {
|
|
setLastWarp(0, 0);
|
|
}
|
|
}
|
|
break;
|
|
case PHASE_OP:
|
|
setActionMode(ACT_OPENING, 0);
|
|
executeOpening();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8064C5A8-8064CB1C 00E588 0574+00 2/1 0/0 0/0 .text action__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::action() {
|
|
if (mFightPhase == PHASE_YO) {
|
|
ice_damage_check();
|
|
} else {
|
|
damage_check();
|
|
}
|
|
|
|
switch (mAction) {
|
|
case ACT_SMALL_ATTACK:
|
|
executeSmallAttack();
|
|
break;
|
|
case ACT_WARP:
|
|
executeWarp();
|
|
break;
|
|
case ACT_DAMAGE:
|
|
executeDamage();
|
|
break;
|
|
case ACT_CONFUSE:
|
|
executeConfuse();
|
|
break;
|
|
case ACT_OPENING:
|
|
executeOpening();
|
|
break;
|
|
case ACT_FLY:
|
|
executeFly();
|
|
break;
|
|
case ACT_FLY_GROUND:
|
|
executeFlyGround();
|
|
break;
|
|
case ACT_WATER:
|
|
executeWater();
|
|
break;
|
|
case ACT_HOOK:
|
|
executeHook();
|
|
break;
|
|
case ACT_SWIM:
|
|
executeSwim();
|
|
break;
|
|
case ACT_SIMA_JUMP:
|
|
executeSimaJump();
|
|
break;
|
|
case ACT_ICE_DEMO:
|
|
executeIceDemo();
|
|
break;
|
|
case ACT_ICE_JUMP:
|
|
executeIceJump();
|
|
break;
|
|
case ACT_ICE_STEP:
|
|
executeIceStep();
|
|
break;
|
|
case ACT_ICE_DAMAGE:
|
|
executeIceDamage();
|
|
break;
|
|
case ACT_MONKEY:
|
|
executeMonkey();
|
|
break;
|
|
case ACT_MONKEY_FALL:
|
|
executeMonkeyFall();
|
|
break;
|
|
case ACT_MONKEY_DAMAGE:
|
|
executeMonkeyDamage();
|
|
break;
|
|
case ACT_LAST_START_DEMO:
|
|
executeLastStartDemo();
|
|
break;
|
|
case ACT_LAST_ATTACK:
|
|
executeLastAttack();
|
|
break;
|
|
case ACT_LAST_TIRED:
|
|
executeLastTired();
|
|
break;
|
|
case ACT_LAST_DAMAGE:
|
|
executeLastDamage();
|
|
break;
|
|
case ACT_LAST_END_DEMO:
|
|
executeLastEndDemo();
|
|
break;
|
|
case ACT_ROOM_CHANGE:
|
|
executeRoomChange();
|
|
break;
|
|
}
|
|
|
|
if (mAction != ACT_OPENING) {
|
|
daPy_getPlayerActorClass()->onBossRoomWait();
|
|
}
|
|
|
|
cXyz sp40(0.0f, 0.0f, 0.0f);
|
|
|
|
switch (mFightPhase) {
|
|
case PHASE_BB:
|
|
if (field_0x70c == 0) {
|
|
dComIfGs_onOneZoneSwitch(0, fopAcM_GetRoomNo(this));
|
|
} else {
|
|
dComIfGs_offOneZoneSwitch(0, fopAcM_GetRoomNo(this));
|
|
}
|
|
break;
|
|
case PHASE_MG:
|
|
break;
|
|
case PHASE_YO:
|
|
if (checkBck(BCK_ZAN_FLOAT_WAIT) && mpModelMorf->checkFrame(1)) {
|
|
mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FLOAT_WAIT, 0, -1);
|
|
}
|
|
|
|
{
|
|
f32 wall_r = mModelScaleXZ * 50.0f;
|
|
if (wall_r < 100.0f) {
|
|
wall_r = 100.0f;
|
|
}
|
|
|
|
mAcchCir.SetWall(100.0f, wall_r);
|
|
}
|
|
|
|
dComIfGs_offSaveDunSwitch(20);
|
|
dComIfGs_offSaveDunSwitch(21);
|
|
dComIfGs_offSaveDunSwitch(22);
|
|
|
|
switch (field_0x70e) {
|
|
case 1:
|
|
dComIfGs_onSaveDunSwitch(20);
|
|
break;
|
|
case 2:
|
|
dComIfGs_onSaveDunSwitch(21);
|
|
break;
|
|
case 3:
|
|
dComIfGs_onSaveDunSwitch(22);
|
|
break;
|
|
}
|
|
|
|
field_0x38b4 = dComIfGp_particle_set(field_0x38b4, 0x87B0, &sp40, &tevStr);
|
|
break;
|
|
case PHASE_OI:
|
|
setWaterBubble();
|
|
checkSwimLinkNear();
|
|
dComIfGs_onOneZoneSwitch(0, fopAcM_GetRoomNo(this));
|
|
break;
|
|
case PHASE_MK:
|
|
checkPillarSwing();
|
|
break;
|
|
case PHASE_LAST:
|
|
break;
|
|
}
|
|
|
|
s16 var_r29 = fopAcM_searchPlayerAngleX(this);
|
|
s16 neck_rot_z = 0;
|
|
s16 body_rot_x = 0;
|
|
|
|
if (field_0x717 != 0) {
|
|
if (var_r29 > 0x2800) {
|
|
var_r29 = 0x2800;
|
|
}
|
|
|
|
if (var_r29 < -0x2800) {
|
|
var_r29 = -0x2800;
|
|
}
|
|
|
|
if (abs(var_r29) < 0x1800) {
|
|
neck_rot_z = 0;
|
|
body_rot_x = var_r29;
|
|
} else if (var_r29 > 0) {
|
|
body_rot_x = 0x1800;
|
|
neck_rot_z = (s16)(var_r29 - 0x1800);
|
|
} else {
|
|
body_rot_x = -0x1800;
|
|
neck_rot_z = (s16)(var_r29 + 0x1800);
|
|
}
|
|
}
|
|
|
|
var_r29 = fopAcM_searchPlayerAngleY(this);
|
|
s16 neck_rot_x = 0;
|
|
|
|
if (field_0x716 != 0) {
|
|
if (var_r29 > 0x2000) {
|
|
var_r29 = 0x2000;
|
|
}
|
|
|
|
if (var_r29 < -0x2000) {
|
|
var_r29 = -0x2000;
|
|
}
|
|
|
|
neck_rot_x = var_r29;
|
|
}
|
|
|
|
cLib_addCalcAngleS(&mNeckRotZ, neck_rot_z, 8, 0x400, 0x80);
|
|
cLib_addCalcAngleS(&mNeckRotX, neck_rot_x, 8, 0x400, 0x80);
|
|
cLib_addCalcAngleS(&mBackboneRotZ, body_rot_x, 8, 0x400, 0x80);
|
|
|
|
calcMahojinAnime();
|
|
|
|
dStage_roomControl_c::onNoChangeRoom();
|
|
dStage_roomControl_c::setRoomReadId(warp_next_room[mFightPhase]);
|
|
|
|
if (field_0x6fc != 0) {
|
|
dStage_RoomCheck(NULL);
|
|
}
|
|
|
|
fopAcM_posMoveF(this, field_0x9a4.GetCCMoveP());
|
|
|
|
if (field_0x705 == 0) {
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
}
|
|
|
|
u32 sp44 = mModelScaleY * 100.0f;
|
|
mpModelMorf->play(sp44, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
|
|
/* 8064CB1C-8064CD0C 00EAFC 01F0+00 2/2 0/0 0/0 .text mtx_set__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::mtx_set() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(l_HIO.mModelSize * mModelScaleXZ, l_HIO.mModelSize * mModelScaleY, l_HIO.mModelSize * mModelScaleXZ);
|
|
|
|
J3DModel* model = mpModelMorf->getModel();
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpModelMorf->modelCalc();
|
|
|
|
if (mDrawSwords) {
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(JNT_ARML3));
|
|
mDoMtx_stack_c::scaleM(mSwordSize, mSwordSize, mSwordSize);
|
|
mpSwordLModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(JNT_ARMR3));
|
|
mDoMtx_stack_c::scaleM(mSwordSize, mSwordSize, mSwordSize);
|
|
mpSwordRModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
if (mMahojinAnmMode != 0) {
|
|
cXyz offset(l_HIO.mMahojinOffsetX, l_HIO.mMahojinOffsetY, l_HIO.mMahojinOffsetZ);
|
|
cXyz pos;
|
|
cLib_offsetPos(&pos, ¤t.pos, shape_angle.y, &offset);
|
|
|
|
mDoMtx_stack_c::transS(pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(l_HIO.mMahojinSize, l_HIO.mMahojinSize, l_HIO.mMahojinSize);
|
|
mpMahojinModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
mpMahojinEndBrk->play();
|
|
mpMahojinBtk->play();
|
|
mpMahojinStartBtk->play();
|
|
|
|
if (mMahojin2AnmMode != 0) {
|
|
mDoMtx_stack_c::copy(mpMahojinModel->getBaseTRMtx());
|
|
mDoMtx_stack_c::scaleM(mMahojin2Size, mMahojin2Size, mMahojin2Size);
|
|
mpMahojinModel2->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpMahojinBrk2->play();
|
|
mpMahojinStartBtk2->play();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8064CD0C-8064CFA8 00ECEC 029C+00 1/1 0/0 0/0 .text cc_set__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::cc_set() {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_NECK));
|
|
mDoMtx_stack_c::multVecZero(&eyePos);
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += mModelScaleY * 100.0f;
|
|
|
|
cXyz center;
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_BACKBONE));
|
|
mDoMtx_stack_c::transM(30.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¢er);
|
|
mBodySphCc[0].SetC(center);
|
|
mBodySphCc[0].SetR(70.0f);
|
|
dComIfG_Ccsp()->Set(&mBodySphCc[0]);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_WAIST));
|
|
mDoMtx_stack_c::transM(50.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¢er);
|
|
mBodySphCc[1].SetC(center);
|
|
mBodySphCc[1].SetR(70.0f);
|
|
dComIfG_Ccsp()->Set(&mBodySphCc[1]);
|
|
|
|
if (mFightPhase == PHASE_LAST) {
|
|
mRollCc.SetC(current.pos);
|
|
mRollCc.SetR(200.0f);
|
|
mRollCc.SetH(250.0f);
|
|
dComIfG_Ccsp()->Set(&mRollCc);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARML3));
|
|
mDoMtx_stack_c::transM(100.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¢er);
|
|
mSwordCc[0].SetC(center);
|
|
mSwordCc[0].SetR(50.0f);
|
|
dComIfG_Ccsp()->Set(&mSwordCc[0]);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARMR3));
|
|
mDoMtx_stack_c::transM(-100.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(¢er);
|
|
mSwordCc[1].SetC(center);
|
|
mSwordCc[1].SetR(50.0f);
|
|
dComIfG_Ccsp()->Set(&mSwordCc[1]);
|
|
}
|
|
}
|
|
|
|
/* 8064CFA8-8064DA48 00EF88 0AA0+00 1/1 0/0 0/0 .text cc_ice_set__10daB_ZANT_cFv */
|
|
void daB_ZANT_c::cc_ice_set() {
|
|
class dZantSph_c {
|
|
public:
|
|
int joint_no;
|
|
f32 offset_x;
|
|
f32 radius;
|
|
};
|
|
|
|
static dZantSph_c ice_sph_jnt[] = {
|
|
{JNT_FOOTL, 10.0f, 15.0f},
|
|
{JNT_LEGL2, 20.0f, 20.0f},
|
|
{JNT_LEGL2, 0.0f, 25.0f},
|
|
{JNT_LEGL1, 20.0f, 30.0f},
|
|
{JNT_FOOTR, 10.0f, 15.0f},
|
|
{JNT_LEGR2, 20.0f, 20.0f},
|
|
{JNT_LEGR2, 0.0f, 25.0f},
|
|
{JNT_LEGR1, 20.0f, 30.0f},
|
|
{JNT_WAIST, 0.0f, 45.0f},
|
|
{JNT_BACKBONE, 20.0f, 45.0f},
|
|
{JNT_HEAD, 20.0f, 25.0f},
|
|
};
|
|
|
|
cXyz sp34;
|
|
cXyz sp40;
|
|
|
|
if (mAction == ACT_ICE_STEP || mAction == ACT_ICE_JUMP) {
|
|
if (!dComIfGp_getAttention()->LockonTruth() || dComIfGp_getAttention()->LockonTarget(0) != this) {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL));
|
|
mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp34);
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR));
|
|
mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp40);
|
|
|
|
cXyz player_pos(daPy_getPlayerActorClass()->current.pos);
|
|
s16 player_angle = daPy_getPlayerActorClass()->shape_angle.y;
|
|
|
|
if (sp34.absXZ(player_pos) < 700.0f) {
|
|
field_0x70d = 0;
|
|
if (sp40.absXZ(player_pos) < 700.0f && abs((s16)(player_angle - cLib_targetAngleY(&player_pos, &sp40))) < abs((s16)(player_angle - cLib_targetAngleY(&player_pos, &sp34)))) {
|
|
field_0x70d = 1;
|
|
}
|
|
} else if (sp40.absXZ(player_pos) < 700.0f) {
|
|
field_0x70d = 1;
|
|
} else if (sp34.absXZ(player_pos) < sp40.absXZ(player_pos)) {
|
|
field_0x70d = 0;
|
|
} else {
|
|
field_0x70d = 1;
|
|
}
|
|
|
|
if (field_0x70d == 0) {
|
|
eyePos = sp34;
|
|
} else {
|
|
eyePos = sp40;
|
|
}
|
|
} else {
|
|
if (field_0x70d == 0) {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL));
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR));
|
|
}
|
|
|
|
mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&eyePos);
|
|
}
|
|
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += 120.0f;
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_NECK));
|
|
mDoMtx_stack_c::multVecZero(&eyePos);
|
|
attention_info.position = eyePos;
|
|
attention_info.position.y += mModelScaleY * 120.0f;
|
|
}
|
|
|
|
cXyz sp64;
|
|
dZantSph_c sph;
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
sph = ice_sph_jnt[i];
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(sph.joint_no));
|
|
mDoMtx_stack_c::transM(sph.offset_x, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp64);
|
|
|
|
mFootCc[i].SetC(sp64);
|
|
mFootCc[i].SetR(sph.radius * mModelScaleY);
|
|
dComIfG_Ccsp()->Set(&mFootCc[i]);
|
|
}
|
|
|
|
for (int i = 0; i < 11; i++) {
|
|
sph = ice_sph_jnt[i];
|
|
|
|
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(sph.joint_no));
|
|
mDoMtx_stack_c::transM(sph.offset_x, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::multVecZero(&sp64);
|
|
|
|
mFoot2Cc[i].SetC(sp64);
|
|
mFoot2Cc[i].SetR(sph.radius * mModelScaleY);
|
|
dComIfG_Ccsp()->Set(&mFoot2Cc[i]);
|
|
|
|
mCameraCc[i].SetC(sp64);
|
|
mCameraCc[i].SetR((sph.radius + 10.0f) * mModelScaleY);
|
|
dComIfG_Ccsp()->Set(&mCameraCc[i]);
|
|
}
|
|
}
|
|
|
|
/* 8064DA48-8064DB48 00FA28 0100+00 1/1 0/0 0/0 .text execute__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::execute() {
|
|
if (mModeTimer != 0) {
|
|
mModeTimer--;
|
|
}
|
|
|
|
if (field_0x6ec != 0) {
|
|
field_0x6ec--;
|
|
}
|
|
|
|
if (field_0x6e4 != 0) {
|
|
field_0x6e4--;
|
|
}
|
|
|
|
if (field_0x6f0 != 0) {
|
|
field_0x6f0--;
|
|
}
|
|
|
|
if (field_0x6f4 != 0) {
|
|
field_0x6f4--;
|
|
}
|
|
|
|
switch (field_0x714) {
|
|
case 0:
|
|
dKy_custom_colset(10, 0, mKankyoBlend);
|
|
break;
|
|
case 1:
|
|
dKy_custom_colset(0, 10, mKankyoBlend);
|
|
break;
|
|
}
|
|
|
|
action();
|
|
mtx_set();
|
|
|
|
if (mFightPhase == PHASE_YO) {
|
|
cc_ice_set();
|
|
} else {
|
|
cc_set();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8064DB48-8064DB68 00FB28 0020+00 1/0 0/0 0/0 .text daB_ZANT_Execute__FP10daB_ZANT_c */
|
|
static int daB_ZANT_Execute(daB_ZANT_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 8064DB68-8064DB70 00FB48 0008+00 1/0 0/0 0/0 .text daB_ZANT_IsDelete__FP10daB_ZANT_c
|
|
*/
|
|
static int daB_ZANT_IsDelete(daB_ZANT_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 8064DB70-8064DBE4 00FB50 0074+00 1/1 0/0 0/0 .text _delete__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::_delete() {
|
|
dComIfG_resDelete(&mPhase, "B_zan");
|
|
|
|
if (mInitHIO) {
|
|
l_initHIO = false;
|
|
}
|
|
|
|
if (heap != NULL) {
|
|
mSound.deleteObject();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8064DBE4-8064DC04 00FBC4 0020+00 1/0 0/0 0/0 .text daB_ZANT_Delete__FP10daB_ZANT_c */
|
|
static int daB_ZANT_Delete(daB_ZANT_c* i_this) {
|
|
return i_this->_delete();
|
|
}
|
|
|
|
/* 8064DC04-8064E128 00FBE4 0524+00 1/1 0/0 0/0 .text CreateHeap__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN);
|
|
JUT_ASSERT(0, modelData != 0);
|
|
mpModelMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("B_zan", BCK_ZAN_FLOAT_WAIT), 2, 1.0f, 0, -1, &mSound, 0, 0x11000084);
|
|
if (mpModelMorf == NULL || mpModelMorf->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
J3DModel* model = mpModelMorf->getModel();
|
|
model->setUserArea((uintptr_t)this);
|
|
model->getModelData()->getJointNodePointer(1)->setCallBack(JointCallBack);
|
|
model->getModelData()->getJointNodePointer(2)->setCallBack(JointCallBack);
|
|
|
|
mpMahojinModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_MAHOJIN), 0x80000, 0x11000284);
|
|
if (mpMahojinModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinEndBrk = new mDoExt_brkAnm();
|
|
if (mpMahojinEndBrk == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpMahojinEndBrk->init(mpMahojinModel->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", BRK_ZAN_MAHOJIN_END), 1, 0, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinBtk = new mDoExt_btkAnm();
|
|
if (mpMahojinBtk == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpMahojinBtk->init(mpMahojinModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN), 1, 2, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinStartBtk = new mDoExt_btkAnm();
|
|
if (mpMahojinStartBtk == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpMahojinStartBtk->init(mpMahojinModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN_START), 1, 0, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinModel2 = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_MAHOJIN), 0x80000, 0x11000284);
|
|
if (mpMahojinModel2 == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinBrk2 = new mDoExt_brkAnm();
|
|
if (mpMahojinBrk2 == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpMahojinBrk2->init(mpMahojinModel2->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", BRK_ZAN_MAHOJIN_END), 1, 0, 0.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
mpMahojinStartBtk2 = new mDoExt_btkAnm();
|
|
if (mpMahojinStartBtk2 == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpMahojinStartBtk2->init(mpMahojinModel2->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN_START), 1, 0, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_SWORD_L);
|
|
JUT_ASSERT(0, modelData != 0);
|
|
mpSwordLModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (mpSwordLModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_SWORD_R);
|
|
JUT_ASSERT(0, modelData != 0);
|
|
mpSwordRModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (mpSwordRModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8064E170-8064E190 010150 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
return ((daB_ZANT_c*)i_this)->CreateHeap();
|
|
}
|
|
|
|
/* 8064E190-8064E724 010170 0594+00 1/1 0/0 0/0 .text create__10daB_ZANT_cFv */
|
|
int daB_ZANT_c::create() {
|
|
fopAcM_SetupActor(this, daB_ZANT_c);
|
|
OS_REPORT("B_ZANT PARAM %x\n", fopAcM_GetParam(this));
|
|
|
|
mSwbit = fopAcM_GetParam(this);
|
|
if (mSwbit != 0xFF) {
|
|
if (dComIfGs_isSwitch(mSwbit, fopAcM_GetRoomNo(this))) {
|
|
OS_REPORT("B_ZANT やられ後なので再セットしません\n");
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
fopAcM_setStageLayer(this);
|
|
|
|
int phase_state = dComIfG_resLoad(&mPhase, "B_zan");
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x8F80)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (!l_initHIO) {
|
|
l_initHIO = true;
|
|
mInitHIO = true;
|
|
l_HIO.field_0x4 = -1;
|
|
}
|
|
|
|
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
attention_info.distances[fopAc_attn_BATTLE_e] = 24;
|
|
|
|
fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx());
|
|
fopAcM_SetMin(this, -200.0f, -200.0f, -200.0f);
|
|
fopAcM_SetMax(this, 200.0f, 200.0f, 200.0f);
|
|
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
mAcchCir.SetWall(100.0f, 100.0f);
|
|
|
|
health = 600;
|
|
field_0x560 = 600;
|
|
|
|
field_0x9a4.Init(0xFE, 0, this);
|
|
|
|
mBodySphCc[0].Set(cc_zant_src);
|
|
mBodySphCc[0].SetStts(&field_0x9a4);
|
|
|
|
mBodySphCc[1].Set(cc_zant_src);
|
|
mBodySphCc[1].SetStts(&field_0x9a4);
|
|
|
|
mRollCc.Set(cc_zant_roll_src);
|
|
mRollCc.SetStts(&field_0x9a4);
|
|
|
|
mSwordCc[0].Set(cc_zant_sword_src);
|
|
mSwordCc[0].SetStts(&field_0x9a4);
|
|
mSwordCc[1].Set(cc_zant_sword_src);
|
|
mSwordCc[1].SetStts(&field_0x9a4);
|
|
|
|
field_0xc74.Init(0xFE, 0, this);
|
|
for (int i = 0; i < 11; i++) {
|
|
mFoot2Cc[i].Set(cc_zant_foot_src2);
|
|
mFoot2Cc[i].SetStts(&field_0xc74);
|
|
|
|
mFootCc[i].Set(cc_zant_foot_src);
|
|
mFootCc[i].SetStts(&field_0xc74);
|
|
|
|
mCameraCc[i].Set(cc_zant_camera_src);
|
|
mCameraCc[i].SetStts(&field_0xc74);
|
|
}
|
|
|
|
mSound.init(¤t.pos, &eyePos, 3, 1);
|
|
mSound.setEnemyName("B_zant");
|
|
|
|
mAtInfo.mpSound = &mSound;
|
|
mAtInfo.mPowerType = 0;
|
|
gravity = 0.0f;
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mPillarIDs[i] = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
mMobileIDs[i] = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
field_0x724 = -1;
|
|
|
|
if (dComIfGp_roomControl_getStayNo() == 60) {
|
|
mFightPhase = PHASE_LAST;
|
|
field_0x718 = 1;
|
|
} else if (dComIfGp_roomControl_getStayNo() == 50) {
|
|
mFightPhase = PHASE_OP;
|
|
} else {
|
|
mFightPhase = dComIfGp_roomControl_getStayNo() - 52;
|
|
if (mFightPhase >= PHASE_MAX) {
|
|
mFightPhase = PHASE_BB;
|
|
}
|
|
}
|
|
|
|
if (mFightPhase != PHASE_OP) {
|
|
Z2GetAudioMgr()->bgmStart(Z2BGM_BOSS_ZANT, 0, 0);
|
|
Z2GetAudioMgr()->changeBgmStatus(mFightPhase);
|
|
}
|
|
|
|
initNextRoom();
|
|
mKankyoBlend = 1.0f;
|
|
setBaseActionMode(1);
|
|
|
|
if (mFightPhase == PHASE_BB) {
|
|
field_0x70b = 0;
|
|
}
|
|
|
|
mModelScaleXZ = 1.0f;
|
|
mModelScaleY = 1.0f;
|
|
|
|
onWolfNoLock();
|
|
mtx_set();
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
/* 8064E92C-8064E94C 01090C 0020+00 1/0 0/0 0/0 .text daB_ZANT_Create__FP10daB_ZANT_c */
|
|
static int daB_ZANT_Create(daB_ZANT_c* i_this) {
|
|
return i_this->create();
|
|
}
|
|
|
|
/* 8064F4AC-8064F4CC -00001 0020+00 1/0 0/0 0/0 .data l_daB_ZANT_Method */
|
|
static actor_method_class l_daB_ZANT_Method = {
|
|
(process_method_func)daB_ZANT_Create,
|
|
(process_method_func)daB_ZANT_Delete,
|
|
(process_method_func)daB_ZANT_Execute,
|
|
(process_method_func)daB_ZANT_IsDelete,
|
|
(process_method_func)daB_ZANT_Draw,
|
|
};
|
|
|
|
/* 8064F4CC-8064F4FC -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_ZANT */
|
|
extern actor_process_profile_definition g_profile_B_ZANT = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
4, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_B_ZANT, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daB_ZANT_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
226, // mPriority
|
|
&l_daB_ZANT_Method, // sub_method
|
|
0x00040000, // mStatus
|
|
fopAc_ENEMY_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
AUDIO_INSTANCES;
|
|
JAUSectionHeap* JASGlobalInstance<JAUSectionHeap>::sInstance;
|