tp/src/d/actor/d_a_e_ymb.cpp

3347 lines
111 KiB
C++

/**
* @file d_a_e_ymb.cpp
*
*/
#include "d/dolzel_rel.h"
#include "d/actor/d_a_e_ymb.h"
#include "d/actor/d_a_midna.h"
#include "d/actor/d_a_obj_drop.h"
#include "d/actor/d_a_player.h"
#include "d/d_com_inf_game.h"
#include "f_op/f_op_camera_mng.h"
#include <cmath.h>
#include "Z2AudioLib/Z2Instances.h"
struct daE_YMB_HIO_c {
public:
/* 8081610C */ daE_YMB_HIO_c();
/* 80821460 */ virtual ~daE_YMB_HIO_c() {}
/* 0x04 */ s8 field_0x4;
/* 0x08 */ f32 model_size; // モデルサイズ (Model Size)
/* 0x0C */ f32 fly_movement_speed; // 飛行移動速度 (Fly Movement Speed)
/* 0x10 */ f32 swim_attack_speed; // 泳ぎ攻撃速度 (Swim Attack Speed)
/* 0x14 */ f32 fly_attack_speed; // 飛行攻撃速度 (Fly Attack Speed)
/* 0x18 */ f32 rollover_time; // ひっくり返り時間 (Rollover Time)
/* 0x1C */ f32 fly_height_adjust; // 飛行高度-加減値 (Fly Height Adjust)
};
enum E_YB_RES_File_ID {
/* BCK */
/* 0x06 */ BCK_YB_ATTACK_A = 0x6,
/* 0x07 */ BCK_YB_ATTACK_B,
/* 0x08 */ BCK_YB_ATTACK_C,
/* 0x09 */ BCK_YB_CRY,
/* 0x0A */ BCK_YB_DAMAGE,
/* 0x0B */ BCK_YB_DAMAGE_DAWN,
/* 0x0C */ BCK_YB_DAWN_DAMAGE,
/* 0x0D */ BCK_YB_DAWN_IN,
/* 0x0E */ BCK_YB_DAWN_WAIT,
/* 0x0F */ BCK_YB_DEATH,
/* 0x10 */ BCK_YB_DROP,
/* 0x11 */ BCK_YB_FLY_WAIT,
/* 0x12 */ BCK_YB_GUARD,
/* 0x13 */ BCK_YB_RISE,
/* 0x14 */ BCK_YB_SIM_IN,
/* 0x15 */ BCK_YB_SIM_OUT,
/* 0x16 */ BCK_YB_SIM_TO_FLY,
/* BMDR */
/* 0x19 */ BMDR_YB_TW = 0x19,
/* BRK */
/* 0x1C */ BRK_YB_WAIT = 0x1C,
/* DZB */
/* 0x1F */ DZB_YB = 0x1F,
};
enum Action {
/* 0x0 */ ACTION_WAIT,
/* 0x1 */ ACTION_FLY,
/* 0x2 */ ACTION_FLY_ATTACK,
/* 0x3 */ ACTION_RUN_AWAY,
/* 0x4 */ ACTION_GUARD,
/* 0x5 */ ACTION_SWIM,
/* 0x6 */ ACTION_WATER_JUMP,
/* 0x7 */ ACTION_DAMAGE,
/* 0x8 */ ACTION_DOWN,
/* 0x9 */ ACTION_DEATH,
/* 0xA */ ACTION_LAKE_DEMO,
/* 0xB */ ACTION_START_DEMO,
/* 0xC */ ACTION_BATTLE_DEMO,
};
enum Joint {
/* 0x00 */ JNT_WORLD_ROOT,
/* 0x01 */ JNT_BODY1,
/* 0x02 */ JNT_ARM_LB1,
/* 0x03 */ JNT_ARM_LB2,
/* 0x04 */ JNT_ARM_LB3,
/* 0x05 */ JNT_ARM_LC1,
/* 0x06 */ JNT_ARM_LC2,
/* 0x07 */ JNT_ARM_LC3,
/* 0x08 */ JNT_ARM_RB1,
/* 0x09 */ JNT_ARM_RB2,
/* 0x0A */ JNT_ARM_RB3,
/* 0x0B */ JNT_ARM_RC1,
/* 0x0C */ JNT_ARM_RC2,
/* 0x0D */ JNT_ARM_RC3,
/* 0x0E */ JNT_BODY2,
/* 0x0F */ JNT_BODY3,
/* 0x10 */ JNT_BODY4,
/* 0x11 */ JNT_TAIL1,
/* 0x12 */ JNT_TAIL2,
/* 0x13 */ JNT_TUBE_LC1,
/* 0x14 */ JNT_TUBE_LC2,
/* 0x15 */ JNT_TUBE_RC1,
/* 0x16 */ JNT_TUBE_RC2,
/* 0x17 */ JNT_TUBE_LA1,
/* 0x18 */ JNT_TUBE_LA2,
/* 0x19 */ JNT_TUBE_LB1,
/* 0x1A */ JNT_TUBE_LB2,
/* 0x1B */ JNT_TUBE_RA1,
/* 0x1C */ JNT_TUBE_RA2,
/* 0x1D */ JNT_TUBE_RB1,
/* 0x1E */ JNT_TUBE_RB2,
/* 0x1F */ JNT_WING_LA,
/* 0x20 */ JNT_WING_LB1,
/* 0x21 */ JNT_WING_LB2,
/* 0x22 */ JNT_WING_LC1,
/* 0x23 */ JNT_WING_LC2,
/* 0x24 */ JNT_WING_RA,
/* 0x25 */ JNT_WING_RB1,
/* 0x26 */ JNT_WING_RB2,
/* 0x27 */ JNT_WING_RC1,
/* 0x28 */ JNT_WING_RC2,
/* 0x29 */ JNT_BUST,
/* 0x2A */ JNT_ARM_LA1,
/* 0x2B */ JNT_ARM_LA2,
/* 0x2C */ JNT_ARM_LA3,
/* 0x2D */ JNT_ARM_LA4,
/* 0x2E */ JNT_ARM_RA1,
/* 0x2F */ JNT_ARM_RA2,
/* 0x30 */ JNT_ARM_RA3,
/* 0x31 */ JNT_ARM_RA4,
/* 0x32 */ JNT_HEAD,
/* 0x33 */ JNT_JAW_L,
/* 0x34 */ JNT_JAW_R,
};
enum Particle {
/* 0x029D */ ZL2_MIDONAHAIR03_1 = 0x29D,
/* 0x029E */ ZL2_MIDONAHAIR03_2,
/* 0x029F */ ZL2_MIDONAHAIR01,
/* 0x8650 */ ZL2_SAND00_IA_1 = 0x8650,
/* 0x8651 */ ZL2_MIZUTAMA02,
/* 0x8652 */ ZL2_HAMON_1,
/* 0x8653 */ ZL2_FIRE_1,
/* 0x8654 */ ZL2_SAND00_IA_2,
/* 0x8655 */ ZL2_HAMON_2,
/* 0x8656 */ ZL2_BOIL,
/* 0x865D */ ZL2_POLYGON_IA8 = 0x865D,
/* 0x865E */ ZL2_YAMIMOYOU01,
/* 0x8630 */ ZL2_ELEC_1 = 0x8630,
/* 0x8631 */ ZL2_ELECY_1,
/* 0x8632 */ ZL2_ELECY_2,
/* 0x8633 */ ZL2_GLOW02,
/* 0x8634 */ ZL2_HAMON_3,
/* 0x8635 */ ZL2_HAMON_4,
/* 0x865F */ ZL2_HANEBLUR64I4_1 = 0x865F,
/* 0x8660 */ ZL2_HANEBLUR64I4_2,
/* 0x8636 */ ZL2_FIRE_2 = 0x8636,
/* 0x8637 */ ZL2_HAMON_5,
/* 0x8638 */ ZL2_WATER_EFFECT_1,
/* 0x8639 */ ZL2_WATER_EFFECT_2,
/* 0x863A */ ZL2_SMASH_KARI_1,
/* 0x863B */ ZL2_MIZUTAMA_IA,
/* 0x863C */ ZL2_FIRE_3,
/* 0x863D */ ZL2_SMASH_KARI_2,
/* 0x863E */ ZL2_SMASH_KARI_3,
/* 0x863F */ ZL2_SMASH_KARI_4,
/* 0x8640 */ ZL2_WATER_EFFECT_3,
/* 0x8641 */ ZL2_WATER_EFFECT_4,
/* 0x8642 */ ZL2_WATER_EFFECT_5,
/* 0x8661 */ ZL2_LIQUIDANIM_1 = 0x8661,
/* 0x8643 */ ZL2_LIQUIDANIM_2 = 0x8643,
/* 0x8646 */ ZL2_LIQUIDANIM_3 = 0x8646,
};
namespace {
/* 80821B30-80821B70 000020 0040+00 0/1 0/0 0/0 .data cc_ymb_src__23@unnamed@d_a_e_ymb_cpp@ */
static dCcD_SrcSph cc_ymb_src = {
{{0x0, {{AT_TYPE_CSTATUE_SWING, 0x2, 0xD}, {0xD8FBFDFF, 0x3}, 0x75}}, // mObj
{dCcD_SE_METAL, 0x0, 0x1, 0x7, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
/* 80821B70-80821BB0 000060 0040+00 0/1 0/0 0/0 .data cc_ymb_at_src__23@unnamed@d_a_e_ymb_cpp@ */
static dCcD_SrcSph cc_ymb_at_src = {
{{0x0, {{AT_TYPE_CSTATUE_SWING, 0x2, 0xD}, {0xD8FBFDFF, 0x0}, 0x0}}, // mObj
{dCcD_SE_METAL, 0x0, 0x1, 0x7, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f}, // mSph
} // mSphAttr
};
/* 80821BB0-80821BF0 0000A0 0040+00 0/1 0/0 0/0 .data cc_ymb_eye_src__23@unnamed@d_a_e_ymb_cpp@ */
static dCcD_SrcSph cc_ymb_eye_src = {
{{0x0, {{AT_TYPE_0, 0x0, 0x0}, {0x80000000, 0x3}, 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
};
/* 80821BF0-80821C30 0000E0 0040+00 0/1 0/0 0/0 .data cc_ymb_tube_src__23@unnamed@d_a_e_ymb_cpp@ */
static dCcD_SrcSph cc_ymb_tube_src = {
{{0x0, {{AT_TYPE_0, 0x0, 0x0}, {0xD8FBFDFF, 0x2}, 0x75}}, // mObj
{dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x7}, // mGObjTg
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f}, // mSph
} // mSphAttr
};
/* 80821C30-80821C48 000120 0018+00 3/4 0/0 0/0 .data YMB_DOWN_ATT_JNT__23@unnamed@d_a_e_ymb_cpp@ */
static int YMB_DOWN_ATT_JNT[6] = {
JNT_TUBE_LC2, JNT_TUBE_RA2, JNT_TUBE_LB2, JNT_TUBE_RC2, JNT_TUBE_LA2, JNT_TUBE_RB2,
};
/* 80821C48-80821C54 000138 000C+00 0/0 0/0 0/0 .data YMB_DROP_JNT__23@unnamed@d_a_e_ymb_cpp@ */
static int YMB_DROP_JNT[3] = {
JNT_TUBE_LC2, JNT_TUBE_RA2, JNT_BODY1,
};
}
/* 8081610C-8081615C 0000EC 0050+00 1/1 0/0 0/0 .text __ct__13daE_YMB_HIO_cFv */
daE_YMB_HIO_c::daE_YMB_HIO_c() {
field_0x4 = -1;
model_size = 1.0f;
fly_movement_speed = 10.0f;
swim_attack_speed = 70.0f;
fly_attack_speed = 40.0f;
rollover_time = 750.0f;
fly_height_adjust = 400.0f;
}
/* 8081615C-808164B4 00013C 0358+00 1/1 0/0 0/0 .text ctrlJoint__9daE_YMB_cFP8J3DJointP8J3DModel */
int daE_YMB_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
int jntNo = i_joint->getJntNo();
cXyz sp54, sp60;
csXyz local_8c, local_94;
mDoMtx_stack_c::copy(i_model->getAnmMtx(jntNo));
switch (jntNo) {
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E: {
int iVar1 = (jntNo - 0x13) / 2;
if (field_0x668[iVar1] != 0.0f) {
if (((u16)jntNo & 1) != 0) {
mDoMtx_stack_c::multVecZero(&sp54);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &local_8c);
s16 sVar1 = (s16)(0x4000 - local_8c.z) * field_0x668[iVar1];
mDoMtx_stack_c::transS(sp54);
mDoMtx_stack_c::ZXYrotM(local_8c.x, local_8c.y, local_8c.z + sVar1);
mDoMtx_stack_c::scaleM(1.0f, 1.0f, 1.0f);
} else {
mDoMtx_stack_c::multVecZero(&sp54);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &local_8c);
mDoMtx_stack_c::copy(i_model->getAnmMtx(jntNo - 1));
mDoMtx_stack_c::transM(-100.0f, 0.0f, 0.0f);
mDoMtx_stack_c::multVecZero(&sp60);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &local_94);
sp54 = ((sp54 * (1.0f - field_0x668[iVar1])) + (sp60 * field_0x668[iVar1]));
local_8c.set(local_8c.x * (1.0f - field_0x668[iVar1]) + local_94.x * field_0x668[iVar1],
local_8c.y * (1.0f - field_0x668[iVar1]) + local_94.y * field_0x668[iVar1],
local_8c.z * (1.0f - field_0x668[iVar1]) + local_94.z * field_0x668[iVar1]);
mDoMtx_stack_c::transS(sp54);
mDoMtx_stack_c::ZXYrotM(local_8c);
mDoMtx_stack_c::scaleM(1.0f, 1.0f, 1.0f);
}
}
break;
}
}
i_model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
return 1;
}
/* 808164F0-8081653C 0004D0 004C+00 1/1 0/0 0/0 .text JointCallBack__9daE_YMB_cFP8J3DJointi */
int daE_YMB_c::JointCallBack(J3DJoint* i_joint, int param_2) {
if (param_2 == 0) {
J3DModel* model = j3dSys.getModel();
daE_YMB_c* i_this = (daE_YMB_c*)model->getUserArea();
if (i_this != NULL) {
i_this->ctrlJoint(i_joint, model);
}
}
return 1;
}
/* 8081653C-80816554 00051C 0018+00 1/1 0/0 0/0 .text rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
static void rideCallBack(dBgW* param_1, fopAc_ac_c* aActor_p, fopAc_ac_c* param_3) {
if (fopAcM_GetName(param_3) == PROC_ALINK) {
((daE_YMB_c*)aActor_p)->field_0x724 = 20;
}
}
/* 80816554-8081695C 000534 0408+00 1/1 0/0 0/0 .text draw__9daE_YMB_cFv */
int daE_YMB_c::draw() {
g_env_light.settingTevStruct(6, &current.pos, &tevStr);
if (!field_0x6d8 || field_0x710 != 0) {
return 1;
}
J3DModel* model = mpModelMorf->getModel();
J3DShape* shape = model->getModelData()->getMaterialNodePointer(4)->getShape();
if (shape != NULL) {
if (field_0x717 != 0) {
shape->show();
} else {
shape->hide();
}
}
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
J3DModelData* modelData = model->getModelData();
for (u16 i = 0; i < modelData->getMaterialNum(); i++) {
J3DMaterial* matNodeP = modelData->getMaterialNodePointer(i);
if (i == 4) {
matNodeP->getTevKColor(3)->a = field_0x6dc;
} else if (i == 3) {
matNodeP->getTevKColor(3)->a = field_0x6d8;
} else if (field_0x6d8 >= 255.0f) {
matNodeP->setMaterialMode(1);
matNodeP->getZMode()->setUpdateEnable(1);
matNodeP->getBlend()->setType(0);
} else {
matNodeP->setMaterialMode(4);
matNodeP->getZMode()->setUpdateEnable(0);
matNodeP->getBlend()->setType(1);
matNodeP->getTevKColor(3)->a = field_0x6d8;
}
if (i == 0 || i == 1) {
matNodeP->getTevColor(0)->r = field_0x6e0;
matNodeP->getTevColor(0)->b = field_0x6e0;
matNodeP->getTevColor(0)->g = field_0x6e0;
}
}
mpBrkAnm->entry(model->getModelData());
if (field_0x6d8 >= 255.0f) {
dComIfGd_setListDark();
mpModelMorf->entryDL();
dComIfGd_setList();
} else {
mInvisModel.entryDL(NULL);
}
cXyz sp58;
sp58.set(current.pos.x, current.pos.y + 100.0f, current.pos.z);
tevStr.field_0x344 = (tevStr.field_0x344 * field_0x6d8) / 255.0f;
mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &sp58, 2500.0f, 0.0f,
current.pos.y, field_0x6d4, mGndChk, &tevStr, 0,
1.0f, dDlst_shadowControl_c::getSimpleTex());
return 1;
}
/* 8081695C-8081697C 00093C 0020+00 1/0 0/0 0/0 .text daE_YMB_Draw__FP9daE_YMB_c */
static int daE_YMB_Draw(daE_YMB_c* i_this) {
return i_this->draw();
}
/* 8081697C-80816A20 00095C 00A4+00 14/14 0/0 0/0 .text setBck__9daE_YMB_cFiUcff */
void daE_YMB_c::setBck(int i_index, u8 i_attr, f32 i_morf, f32 i_rate) {
mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_YB", i_index), i_attr, i_morf, i_rate, 0.0f, -1.0f);
}
/* 80816A20-80816A7C 000A00 005C+00 5/5 0/0 0/0 .text checkBck__9daE_YMB_cFi */
bool daE_YMB_c::checkBck(int i_index) {
if (mpModelMorf->getAnm() == (J3DAnmTransform*)dComIfG_getObjectRes("E_YB", i_index)) {
return true;
} else {
return false;
}
}
/* 80816A7C-80816A88 000A5C 000C+00 15/15 0/0 0/0 .text setActionMode__9daE_YMB_cFii */
void daE_YMB_c::setActionMode(int i_action, int i_mode) {
mAction = i_action;
mMode = i_mode;
}
/* 80816A88-80816B7C 000A68 00F4+00 1/1 0/0 0/0 .text setLastDamage__9daE_YMB_cFv */
void daE_YMB_c::setLastDamage() {
setRockDamageEffect();
field_0x6f4++;
if (field_0x6f4 > 6) {
health = 0;
}
mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 0x20);
dComIfGp_setHitMark(3, this, &eyePos, NULL, NULL, 0);
field_0x6f8 = 3;
setBck(BCK_YB_DAWN_DAMAGE, 0, 3.0f, 1.0f);
dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f));
}
/* 80816B7C-80816E78 000B5C 02FC+00 1/1 0/0 0/0 .text damage_check__9daE_YMB_cFv */
void daE_YMB_c::damage_check() {
cCcD_Obj* tgHitObj;
daPy_py_c* player = daPy_getPlayerActorClass();
if (field_0x6f8 == 0) {
if (field_0xa9c.ChkTgHit() && field_0x704 == 0) {
mAtInfo.mpCollider = field_0xa9c.GetTgHitObj();
health = 100;
cc_at_check(this, &mAtInfo);
if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_UNK)) {
field_0x6f8 = 20;
} else {
field_0x6f8 = 10;
}
if (mAtInfo.mAttackPower <= 1) {
field_0x6f8 = 10;
}
if (mAction != 8 && player->getCutType() != daPy_py_c::CUT_TYPE_WOLF_B_LEFT && player->getCutType() != daPy_py_c::CUT_TYPE_WOLF_B_RIGHT &&
mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK) && player->onWolfEnemyHangBite(this)) {
setActionMode(7, 0);
return;
}
}
tgHitObj = NULL;
if (field_0x82c[0].ChkTgShield() && field_0x82c[0].ChkTgHit()) {
tgHitObj = field_0x82c[0].GetTgHitObj();
}
if (field_0x82c[1].ChkTgShield() && field_0x82c[1].ChkTgHit()) {
tgHitObj = field_0x82c[1].GetTgHitObj();
}
if (field_0xa9c.ChkTgShield() && field_0xa9c.ChkTgHit()) {
tgHitObj = field_0xa9c.GetTgHitObj();
}
if (tgHitObj != NULL && (mAction == 1 || mAction == 2 || mAction == 4)) {
setActionMode(4, 0);
}
}
int iVar1 = 0;
for (int i = 0; i < 6; i++) {
if (field_0xbd4[i].ChkTgHit()) {
tgHitObj = field_0xbd4[i].GetTgHitObj();
if (!tgHitObj->ChkAtType(AT_TYPE_MIDNA_LOCK)) {
mAtInfo.mpCollider = field_0xbd4[i].GetTgHitObj();
health = 100;
mAtInfo.field_0x18 = 30;
cc_at_check(this, &mAtInfo);
cXyz sp28;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(i * 2 + 20));
mDoMtx_stack_c::multVecZero(&sp28);
dComIfGp_setHitMark(1, this, &sp28, NULL, NULL, 0);
field_0x680[i] = 30;
if (tgHitObj->ChkAtType(AT_TYPE_WOLF_CUT_TURN)) {
iVar1++;
field_0x698 = 30;
}
field_0xbd4[i].ResetTgHit();
if (iVar1 >= 4) {
return;
}
}
}
}
}
/* 80816E78-80817064 000E58 01EC+00 1/1 0/0 0/0 .text setCameraSwitch__9daE_YMB_cFv */
void daE_YMB_c::setCameraSwitch() {
field_0x713 = 0;
daPy_py_c* player = daPy_getPlayerActorClass();
if (field_0x69c.absXZ(player->current.pos) < 3000.0f) {
field_0x713 = 1;
}
if (field_0x713 != 0) {
dComIfGs_onSwitch(5, fopAcM_GetRoomNo(this));
} else {
dComIfGs_offSwitch(5, fopAcM_GetRoomNo(this));
}
if (field_0x714 != 0) {
dComIfGs_onOneZoneSwitch(15, fopAcM_GetRoomNo(this));
} else {
dComIfGs_offOneZoneSwitch(15, fopAcM_GetRoomNo(this));
}
}
/* 80821E54-80821E58 -00001 0004+00 2/2 0/0 0/0 .bss None */
static u8 l_initHIO;
/* 80821E64-80821E84 000054 0020+00 12/20 0/0 0/0 .bss l_HIO */
static daE_YMB_HIO_c l_HIO;
/* 80817064-80817164 001044 0100+00 1/1 0/0 0/0 .text checkWaterPos__9daE_YMB_cFv */
void daE_YMB_c::checkWaterPos() {
Vec pos = current.pos;
pos.y += 1000.0f;
dBgS_ObjGndChk_Spl wtr_chk;
wtr_chk.SetPos(&pos);
f32 wtr_pos = dComIfG_Bgsp().GroundCross(&wtr_chk);
if (wtr_pos != -1000000000.0f) {
field_0x6cc = wtr_pos;
field_0x69c.y = wtr_pos + 1000.0f + l_HIO.fly_height_adjust;
std::fabsf(field_0x6cc - current.pos.y);
if (current.pos.y < (200.0f + field_0x6cc)) {
if (field_0x715 == 0) {
setWaterEffect1();
}
field_0x715 = 1;
} else {
field_0x715 = 0;
}
}
}
/* 80817164-80817200 001144 009C+00 1/1 0/0 0/0 .text checkGroundPos__9daE_YMB_cFv */
void daE_YMB_c::checkGroundPos() {
cXyz pos(current.pos);
pos.y += 500.0f;
field_0x6d0 = field_0x6cc;
mGndChk.SetPos(&pos);
f32 fVar1 = dComIfG_Bgsp().GroundCross(&mGndChk);
field_0x6d4 = fVar1;
if (fVar1 != -1000000000.0f && field_0x6d0 < fVar1) {
field_0x6d0 = fVar1;
}
}
/* 80817200-8081727C 0011E0 007C+00 6/6 0/0 0/0 .text setFlyWaitVoice__9daE_YMB_cFv */
void daE_YMB_c::setFlyWaitVoice() {
if ((u8)checkBck(BCK_YB_FLY_WAIT) && mpModelMorf->checkFrame(0.0f)) {
mSound.startCreatureVoice(Z2SE_EN_YB_V_FLY_WAIT, -1);
}
}
/* 8081727C-808172F8 00125C 007C+00 1/1 0/0 0/0 .text setDownWaitVoice__9daE_YMB_cFv */
void daE_YMB_c::setDownWaitVoice() {
if ((u8)checkBck(BCK_YB_DAWN_WAIT) && mpModelMorf->checkFrame(0.0f)) {
mSound.startCreatureVoice(Z2SE_EN_YB_V_DOWN_WAIT, -1);
}
}
/* 808172F8-808173B0 0012D8 00B8+00 0/0 0/0 1/1 .text setHitBoardSe__9daE_YMB_cFv */
void daE_YMB_c::setHitBoardSe() {
if (field_0x722 == 0 && mAction == 5 && mMode >= 3 && mMode <= 7) {
if (current.pos.y > field_0x6cc - 150.0f - 200.0f) {
mSound.startCreatureSound(Z2SE_EN_YB_HIT_FLOATBOARD, 0, -1);
field_0x722 = 1;
field_0x723 = 10;
}
}
}
/* 808173B0-8081756C 001390 01BC+00 4/4 0/0 0/0 .text setElecEffect1__9daE_YMB_cFv */
void daE_YMB_c::setElecEffect1() {
MtxP mtx = mpModelMorf->getModel()->getAnmMtx(15);
cXyz sp28(mtx[0][3], mtx[1][3], mtx[2][3]);
cXyz sp34(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
mElecParticles[0] = dComIfGp_particle_set(mElecParticles[0], ZL2_ELEC_1, &sp28, &tevStr, &shape_angle, &sp34, 0xFF, NULL, -1, NULL, NULL, NULL);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mElecParticles[0]);
if (emitter != NULL) {
emitter->setRate(0.2f);
emitter->setGlobalAlpha(field_0x6c4);
}
mElecParticles[1] = dComIfGp_particle_set(mElecParticles[1], ZL2_ELECY_1, &sp28, &tevStr, &shape_angle, &sp34, 0xFF, NULL, -1, NULL, NULL, NULL);
emitter = dComIfGp_particle_getEmitter(mElecParticles[1]);
if (emitter != NULL) {
emitter->setRate(20.0f);
emitter->setGlobalAlpha(field_0x6c4);
}
mSound.startCreatureSoundLevel(Z2SE_EN_YB_ELECTRIC, 0, -1);
}
/* 8081756C-80817744 00154C 01D8+00 6/6 0/0 0/0 .text setElecEffect2__9daE_YMB_cFv */
void daE_YMB_c::setElecEffect2() {
static u16 w_eff_id[4] = {
ZL2_ELEC_1, ZL2_ELECY_1, ZL2_ELECY_2, ZL2_GLOW02,
};
field_0x1324.OnAtSetBit();
field_0x82c[0].OnAtSetBit();
field_0x82c[1].OnAtSetBit();
MtxP mtx = mpModelMorf->getModel()->getAnmMtx(15);
cXyz sp34(mtx[0][3], mtx[1][3], mtx[2][3]);
cXyz sp40(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
for (int i = 0; i < 4; i++) {
mElecParticles[i] = dComIfGp_particle_set(mElecParticles[i], w_eff_id[i], &sp34, &tevStr, &shape_angle, &sp40, 0xFF, NULL, -1, NULL, NULL, NULL);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mElecParticles[i]);
if (emitter != NULL) {
emitter->setGlobalAlpha(field_0x6c4);
if (i == 0) {
emitter->setRate(2.0f);
} else if (i == 1) {
emitter->setRate(60.0f);
}
}
}
if (field_0x6c1 == 1) {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_ELECTRIC_LOOP_WTR, 0, -1);
} else {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_ELECTRIC_LOOP, 0, -1);
}
}
namespace {
/* 80821F38-80821FEC 000128 00B4+00 4/5 0/0 0/0 .bss YMB_DOWN_POS__23@unnamed@d_a_e_ymb_cpp@ */
static cXyz YMB_DOWN_POS[15] = {
cXyz(-88457.0f, -18786.0f, 42166.0f),
cXyz(-89307.0f, -18786.0f, 41366.0f),
cXyz(-89389.0f, -18785.0f, 37267.0f),
cXyz(-88442.0f, -18753.0f, 38460.0f),
cXyz(-87864.0f, -18753.0f, 37112.0f),
cXyz(-87639.0f, -18764.0f, 41016.0f),
cXyz(-88977.0f, -18764.0f, 40658.0f),
cXyz(-86467.0f, -18758.0f, 39379.0f),
cXyz(-87372.0f, -18758.0f, 40362.0f),
cXyz(-86980.0f, -18758.0f, 37583.0f),
cXyz(-90195.0f, -18754.0f, 39893.0f),
cXyz(-88342.0f, -18754.0f, 39785.0f),
cXyz(-90200.0f, -18754.0f, 38100.0f),
cXyz(-88442.0f, -18753.0f, 38460.0f),
cXyz(-88442.0f, -18753.0f, 38460.0f),
};
}
/* 80817744-8081785C 001724 0118+00 4/4 0/0 0/0 .text setWaterEffect1__9daE_YMB_cFv */
void daE_YMB_c::setWaterEffect1() {
cXyz sp28(current.pos.x, field_0x6cc, current.pos.z);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[6] = {
ZL2_FIRE_2, ZL2_HAMON_5, ZL2_WATER_EFFECT_1, ZL2_WATER_EFFECT_2, ZL2_SMASH_KARI_1, ZL2_MIZUTAMA_IA,
};
for (int i = 0; i < 6; i++) {
mWaterParticles1[i] = dComIfGp_particle_set(mWaterParticles1[i], w_eff_id[i], &sp28, &tevStr, NULL, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
}
/* 8081785C-80817974 00183C 0118+00 2/2 0/0 0/0 .text setWaterEffect2__9daE_YMB_cFv */
void daE_YMB_c::setWaterEffect2() {
cXyz sp28(current.pos.x, field_0x6cc, current.pos.z);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[7] = {
ZL2_FIRE_3, ZL2_SMASH_KARI_2, ZL2_SMASH_KARI_3, ZL2_SMASH_KARI_4, ZL2_WATER_EFFECT_3, ZL2_WATER_EFFECT_4, ZL2_WATER_EFFECT_5,
};
for (int i = 0; i < 7; i++) {
mWaterParticles2[i] = dComIfGp_particle_set(mWaterParticles2[i], w_eff_id[i], &sp28, &tevStr, &shape_angle, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
}
/* 80817974-80817AEC 001954 0178+00 1/1 0/0 0/0 .text setBoilEffect__9daE_YMB_cFi */
void daE_YMB_c::setBoilEffect(int param_1) {
cXyz sp30(current.pos.x, field_0x6cc, current.pos.z);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[7] = {
ZL2_HAMON_1, ZL2_FIRE_1, ZL2_SAND00_IA_2, ZL2_HAMON_2, ZL2_BOIL, ZL2_SAND00_IA_1, ZL2_MIZUTAMA02,
};
int iVar1 = param_1 == 0 ? 7 : 5;
for (int i = 0; i < iVar1; i++) {
mWaterParticles2[i] = dComIfGp_particle_set(mWaterParticles2[i], w_eff_id[i], &sp30, &tevStr, NULL, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
Z2GetAudioMgr()->seStartLevel(Z2SE_EN_YB_ABUKU, &sp30, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
/* 80817AEC-80817BD8 001ACC 00EC+00 1/1 0/0 0/0 .text setDamageEffect__9daE_YMB_cFi */
void daE_YMB_c::setDamageEffect(int param_1) {
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[2] = {
ZL2_LIQUIDANIM_2, ZL2_LIQUIDANIM_3,
};
cXyz pos;
getBellyBitePos(&pos);
mDamageParticle = dComIfGp_particle_set(mDamageParticle, w_eff_id[param_1], &pos, &tevStr, &shape_angle, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
/* 80817BD8-80817CF0 001BB8 0118+00 2/2 0/0 0/0 .text setDownHamonEffect__9daE_YMB_cFv */
void daE_YMB_c::setDownHamonEffect() {
cXyz pos(current.pos.x, field_0x6cc, current.pos.z);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[2] = {
ZL2_HAMON_3, ZL2_HAMON_4,
};
for (int i = 0; i < 2; i++) {
mDownHamonParticles[i] = dComIfGp_particle_set(mDownHamonParticles[i], w_eff_id[i], &pos, &tevStr, NULL, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
}
/* 80817CF0-80817E7C 001CD0 018C+00 1/1 0/0 0/0 .text setFlyBlurEffect__9daE_YMB_cFv */
void daE_YMB_c::setFlyBlurEffect() {
static u16 w_eff_id[2] = {
ZL2_HANEBLUR64I4_1, ZL2_HANEBLUR64I4_2,
};
if (field_0x717 == 0 || !field_0x6dc) {
return;
}
if (!field_0x6d8 || field_0x710) {
return;
}
J3DModel* model = mpModelMorf->getModel();
cXyz pos;
mDoMtx_stack_c::copy(model->getAnmMtx(1));
mDoMtx_stack_c::multVecZero(&pos);
if (pos.y < field_0x6cc) {
return;
}
for (int i = 0; i < 2; i++) {
mBlurParticles[i] = dComIfGp_particle_set(mBlurParticles[i], w_eff_id[i], &pos, &tevStr);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mBlurParticles[i]);
if (emitter != NULL) {
emitter->setGlobalSRTMatrix(model->getAnmMtx(1));
}
}
}
/* 80817E7C-80817FDC 001E5C 0160+00 1/1 0/0 0/0 .text setRockDamageEffect__9daE_YMB_cFv */
void daE_YMB_c::setRockDamageEffect() {
cXyz pos;
int iVar1 = field_0x6f4 - 1;
if (iVar1 < 0) {
iVar1 = 0;
}
if (iVar1 > 5) {
iVar1 = 5;
}
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(YMB_DOWN_ATT_JNT[iVar1]));
mDoMtx_stack_c::multVecZero(&pos);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
dComIfGp_particle_set(ZL2_LIQUIDANIM_1, &pos, &tevStr, NULL, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
mSound.startCreatureVoice(Z2SE_EN_YB_V_DOWN_DAMAGE, -1);
}
/* 80817FDC-80818158 001FBC 017C+00 1/1 0/0 0/0 .text setDeathEffect__9daE_YMB_cFv */
void daE_YMB_c::setDeathEffect() {
cXyz pos;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&pos);
static cXyz sc(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
static u16 w_eff_id[2] = {
ZL2_POLYGON_IA8, ZL2_YAMIMOYOU01,
};
for (int i = 0; i < 2; i++) {
dComIfGp_particle_set(w_eff_id[i], &pos, &tevStr, NULL, &sc, 0xFF, NULL, -1, NULL, NULL, NULL);
}
fopAcM_seStart(this, Z2SE_DARK_VANISH, 0);
}
/* 80818158-808181F4 002138 009C+00 1/1 0/0 0/0 .text search_drop__FPvPv */
static void* search_drop(void* i_actor, void* i_data) {
if (fopAc_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Obj_Drop) {
if (!fpcM_IsCreating(fopAcM_GetID(i_actor))) {
u8 switchBit = ((daE_YMB_c*)i_data)->getSwitchBit();
if (switchBit == 0xFF) {
return NULL;
}
if (((daObjDrop_c*)i_actor)->getYmSwbit() == switchBit) {
return i_actor;
}
}
}
return NULL;
}
/* 808181F4-80818328 0021D4 0134+00 1/1 0/0 0/0 .text executeWait__9daE_YMB_cFv */
void daE_YMB_c::executeWait() {
switch (mMode) {
case 0:
setActionMode(1, 0);
field_0x70c = cM_rndF(150.0f) + 300.0f;
field_0x708 = cM_rndF(100.0f) + 150.0f;
break;
case 1:
if (field_0x6fc == 0) {
field_0x6fc = 30;
mMode = 2;
}
break;
case 2:
setElecEffect1();
if (field_0x6fc == 0) {
field_0x6fc = 60;
mMode = 3;
}
break;
case 3:
setElecEffect2();
if (field_0x6fc == 0) {
mMode = 1;
field_0x6fc = (s16)(cM_rndF(300.0f) + 300.0f);
}
break;
}
}
/* 80818328-80818370 002308 0048+00 1/1 0/0 0/0 .text setBitePos__9daE_YMB_cFi */
void daE_YMB_c::setBitePos(int param_1) {
cXyz pos;
getBellyBitePos(&pos);
mDownPos = pos;
}
/* 80818370-80818518 002350 01A8+00 1/1 0/0 0/0 .text setInclination__9daE_YMB_cFv */
void daE_YMB_c::setInclination() {
s16 sVar1 = cM_atan2s(speedF, speed.y) - 0x4000;
f32 fVar1 = speed.abs();
if (fVar1 > 50.0f) {
fVar1 = 50.0f;
}
s16 sVar2 = sVar1 * (fVar1 / 50.0f);
if (sVar2 < -6000) {
sVar2 = -6000;
}
if (sVar2 > 6000) {
sVar2 = 6000;
}
cLib_chaseAngleS(&field_0x6ea, sVar2, 0x180);
}
/* 80818518-80818930 0024F8 0418+00 3/3 0/0 0/0 .text setBodyAngle__9daE_YMB_cFv */
void daE_YMB_c::setBodyAngle() {
s16 sVar1 = current.angle.y - shape_angle.y;
cLib_chaseAngleS(&shape_angle.z, std::abs(cM_scos(current.angle.x)) * (speed.abs() * -32.0f * cM_ssin(sVar1)), 0x100);
f32 fVar1 = std::abs(cM_ssin(current.angle.x));
f32 fVar2 = std::abs(cM_scos(current.angle.x));
if (fVar2 >= fVar1) {
cLib_chaseAngleS(&field_0x6ea, std::abs(cM_scos(current.angle.x)) * (speed.abs() * 48.0f * cM_scos(sVar1)), 0x200);
} else {
cLib_chaseAngleS(&field_0x6ea, speed.abs() * 48.0f * std::abs(cM_ssin(current.angle.x)), 0x200);
}
}
/* 80818930-80818AE8 002910 01B8+00 3/3 0/0 0/0 .text checkWolfLockIn__9daE_YMB_cFv */
bool daE_YMB_c::checkWolfLockIn() {
daPy_py_c* player = daPy_getPlayerActorClass();
if (field_0x764 != 0 && dComIfGp_checkPlayerStatus1(0, 0x800000)) {
f32 fVar1 = player->getSearchBallScale() + 100.0f;
if (player->current.pos.absXZ(current.pos) < fVar1) {
return true;
}
}
return false;
}
/* 80818AE8-80819610 002AC8 0B28+00 1/1 0/0 0/0 .text executeFly__9daE_YMB_cFv */
void daE_YMB_c::executeFly() {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp44(player->current.pos);
s16 adj_angle;
s16 playerAngleY = fopAcM_searchPlayerAngleY(this);
cXyz sp50;
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setFlyWaitVoice();
f32 fVar1;
if (!checkStartBattleDemo()) {
field_0x712 = 1;
switch (mMode) {
case 1:
field_0x82c[0].OnTgSetBit();
field_0x82c[1].OnTgSetBit();
field_0xa9c.OnTgSetBit();
if (field_0x70c < 60) {
field_0x70c = 60;
}
// fallthrough
case 0:
if (!checkBck(BCK_YB_FLY_WAIT)) {
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
}
mMode = 2;
// fallthrough
case 2:
fVar1 = current.pos.absXZ(field_0x69c);
if (sp44.absXZ(field_0x69c) > 3000.0f || fVar1 > 3000.0f) {
field_0x6a8 = field_0x69c;
} else {
if (fVar1 > 2200.0f) {
adj_angle = cLib_targetAngleY(&current.pos, &field_0x69c);
} else {
if (fVar1 > 1800.0f) {
adj_angle = playerAngleY + 0x8000 + cM_rndFX(2048.0f);
if ((s16)(cLib_targetAngleY(&current.pos, &field_0x69c) - playerAngleY) > 0) {
adj_angle -= (s16) 0x1800;
} else {
adj_angle += (s16) 0x1800;
}
} else {
adj_angle = playerAngleY + 0x8000 + cM_rndFX(2048.0f);
if (cM_rnd() < 0.5f) {
adj_angle += (s16) 0x1800;
} else {
adj_angle -= (s16) 0x1800;
}
}
}
sp50.set(0.0f, 0.0f, 1000.0f);
cLib_offsetPos(&field_0x6a8, &sp44, adj_angle, &sp50);
field_0x6a8.y = field_0x69c.y;
}
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x6a8);
current.angle.x = cLib_targetAngleX(&current.pos, &field_0x6a8);
speedF = speed.y = 0.0f;
field_0x6c8 = 0.0f;
field_0x6fc = 30;
mMode = 3;
if (std::abs(field_0x69c.y - current.pos.y) < 200.0f) {
field_0x6f0 = 0;
} else {
field_0x6f0 = 1;
}
break;
case 3:
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x6a8);
current.angle.x = cLib_targetAngleX(&current.pos, &field_0x6a8);
if (field_0x6f0 == 0) {
cLib_chaseF(&field_0x6c8, l_HIO.fly_movement_speed, 1.0f);
} else {
cLib_chaseF(&field_0x6c8, l_HIO.fly_movement_speed + 10.0f, 1.0f);
}
cLib_chaseF(&speedF, field_0x6c8 * std::abs(cM_scos(current.angle.x)), 1.0f);
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &sp44), 0x400);
cLib_chaseF(&speed.y, field_0x6c8 * cM_ssin(current.angle.x), 1.0f);
setBodyAngle();
if (std::abs(current.pos.y - field_0x6a8.y) < 50.0f) {
if (field_0x6a8.absXZ(current.pos) < 100.0f || field_0x6fc == 0) {
field_0x6fc = 30;
mMode = 4;
}
}
break;
case 4:
if (current.pos.y < field_0x6d0 + 650.0f) {
current.pos.y = field_0x6d0 + 650.0f;
}
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &sp44), 0x800);
cLib_chaseAngleS(&field_0x6ea, 0, 0x400);
cLib_chaseAngleS(&shape_angle.z, 0, 0x400);
cLib_chaseF(&speedF, 0.0f, 1.0f);
cLib_chaseF(&speed.y, 0.0f, 1.0f);
if (current.pos.y < field_0x6cc) {
current.pos.y = field_0x6cc;
}
if (checkWolfLockIn()) {
setActionMode(3, 0);
break;
}
if (field_0x6fc == 0) {
speedF = speed.y = 0.0f;
mMode = 2;
}
if (field_0x764 == 0) {
break;
}
if (field_0x70c != 0) {
break;
}
if (sp44.absXZ(field_0x69c) < 2000.0f) {
if (sp44.absXZ(current.pos) > 700.0f) {
if (std::abs(field_0x69c.y - current.pos.y) < 200.0f) {
speedF = speed.y = 0.0f;
setActionMode(2, 0);
return;
}
}
}
break;
}
}
}
/* 80819610-80819FD0 0035F0 09C0+00 2/1 0/0 0/0 .text executeFlyAttack__9daE_YMB_cFv */
void daE_YMB_c::executeFlyAttack() {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp28;
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setFlyWaitVoice();
s16 sVar1;
fopAc_ac_c* actor;
switch (mMode) {
case 0:
field_0x70c = cM_rndF(150.0f) + 300.0f;
field_0x6e4 = 0;
mSound.startCreatureVoice(Z2SE_EN_YB_V_ATTACK, -1);
setBck(BCK_YB_ATTACK_A, 0, 5.0f, 1.0f);
mMode = 1;
field_0x6a8 = player->current.pos;
field_0x6a8.y = field_0x6d0 + 650.0f - 100.0f;
sVar1 = fopAcM_searchPlayerAngleY(this);
shape_angle.y = sVar1;
current.angle.y= sVar1;
speed.y = 15.0f;
speedF = -15.0f;
// fallthrough
case 1:
setElecEffect1();
cLib_chaseAngleS(&field_0x6ea, 0, 0x400);
cLib_chaseAngleS(&shape_angle.z, 0, 0x400);
sVar1 = fopAcM_searchPlayerAngleY(this);
shape_angle.y = sVar1;
current.angle.y = sVar1;
cLib_chaseF(&speed.y, 0.0f, 1.0f);
cLib_chaseF(&speedF, 0.0f, 1.0f);
if (mpModelMorf->checkFrame(15.0f)) {
mMode = 2;
setElecEffect2();
field_0x6fc = 10;
}
break;
case 2:
if (mpModelMorf->isStop()) {
setBck(BCK_YB_ATTACK_B, 2, 0.0f, 1.0f);
}
setElecEffect2();
field_0x704 = 3;
sp28 = field_0x6a8 - current.pos;
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &field_0x6a8), 0x800);
current.angle.y = shape_angle.y;
sVar1 = (s16) cM_atan2s(sp28.absXZ(), sp28.y);
cLib_chaseF(&speedF, l_HIO.fly_attack_speed * (cM_ssin(sVar1)), 3.0f);
cLib_chaseF(&speed.y, l_HIO.fly_attack_speed * cM_scos(sVar1), 5.0f);
if (field_0x6fc != 0) {
speed.y += 5.0f;
}
if (current.pos.y < field_0x6d0 + 650.0f - 200.0f) {
current.pos.y += 15.0f;
if (speed.y < 0.0f) {
cLib_chaseF(&speed.y, 0.0f, 7.0f);
}
}
if (field_0x1324.ChkAtHit()) {
actor = dCc_GetAc(field_0x1324.GetAtHitObj()->GetAc());
if (fopAcM_GetName(actor) == PROC_ALINK) {
field_0x6fc = 30;
speed.y = 0.0f;
speedF = 0.0f;
mMode = 5;
setBck(BCK_YB_ATTACK_C, 0, 5.0f, 1.0f);
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x69c);
field_0x6ea = 0;
return;
}
}
if (sp28.abs() < 100.0f) {
mMode = 4;
field_0x6fc = 10;
}
setInclination();
break;
case 4:
setElecEffect2();
field_0x704 = 3;
cLib_chaseF(&speed.y, 0.0f, 3.0f);
cLib_chaseF(&speedF, 10.0f, 3.0f);
if (current.pos.y < field_0x6d0 + 650.0f - 150.0f) {
current.pos.y += 15.0f;
if (speed.y < 0.0f) {
cLib_chaseF(&speed.y, 0.0f, 7.0f);
}
}
if (field_0x6fc == 0) {
setBck(BCK_YB_ATTACK_C, 0, 5.0f, 1.0f);
mMode = 5;
field_0x6fc = 30;
}
setInclination();
break;
case 5:
setElecEffect2();
field_0x704 = 3;
field_0x712 = 1;
field_0x6e4 += 0x800;
cLib_chaseF(&speed.y, 0.0f, 3.0f);
cLib_chaseF(&speedF, 0.0f, 3.0f);
if (current.pos.y < field_0x6d0 + 650.0f) {
current.pos.y += 15.0f;
if (speed.y < 0.0f) {
cLib_chaseF(&speed.y, 0.0f, 7.0f);
}
}
if (checkBck(BCK_YB_ATTACK_C)) {
if (mpModelMorf->isStop()) {
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
}
} else {
cLib_chaseAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x400);
}
static s16 ymb_chance_time[3] = {
110, 80, 50,
};
if (field_0x6fc == 0) {
mMode = 9;
speedF = 0.0f;
speed.y = 0.0f;
field_0x6fc = ymb_chance_time[field_0x6ec];
}
setInclination();
break;
case 9:
case 10:
field_0x712 = 1;
if (checkWolfLockIn()) {
setActionMode(3, 0);
} else {
sVar1 = fopAcM_searchPlayerAngleY(this);
cLib_addCalcAngleS(&current.angle.y, sVar1 + 0x8000, 4, 0x1000, 0x100);
cLib_addCalcAngleS(&shape_angle.y, sVar1, 8, 0x400, 0x80);
if (mMode == 9) {
cLib_chaseF(&speed.y, 0.0f, 1.0f);
cLib_chaseF(&speedF, 0.0f, 1.0f);
} else {
cLib_chaseF(&speed.y, 30.0f, 1.0f);
cLib_chaseF(&speedF, 10.0f, 1.0f);
}
if (current.pos.y < field_0x6d0 + 650.0f) {
current.pos.y += 10.0f;
if (speed.y < 0.0f) {
cLib_chaseF(&speed.y, 0.0f, 5.0f);
}
}
setInclination();
if (checkBck(BCK_YB_ATTACK_C) && mpModelMorf->isStop()) {
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
}
if (mMode == 9) {
if (field_0x6fc == 0) {
mMode = 10;
}
} else if (std::abs(field_0x69c.y - current.pos.y) < 100.0f) {
mMode = 11;
}
}
break;
case 11:
if (cLib_chaseF(&speed.y, 0.0f, 1.0f) != 0) {
setActionMode(1, 0);
}
break;
}
}
/* 80819FD0-8081A718 003FB0 0748+00 1/1 0/0 0/0 .text executeRunAway__9daE_YMB_cFv */
void daE_YMB_c::executeRunAway() {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp34(player->current.pos);
s16 playerAngleY = fopAcM_searchPlayerAngleY(this);
cXyz sp40;
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setFlyWaitVoice();
field_0x712 = 1;
switch (mMode) {
case 0:
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
mMode = 1;
// fallthrough
case 1: {
s16 adj_angle;
if (current.pos.absXZ(field_0x69c) > 2200.0f) {
adj_angle = cLib_targetAngleY(&current.pos, &field_0x69c);
} else if (current.pos.absXZ(field_0x69c) > 1800.0f) {
adj_angle = playerAngleY + 0x8000 + cM_rndFX(2048.0f);
if ((s16)(cLib_targetAngleY(&current.pos, &field_0x69c) - playerAngleY) > 0) {
adj_angle -= 0x1800;
} else {
adj_angle += 0x1800;
}
} else {
adj_angle = playerAngleY + 0x8000 + cM_rndFX(2048.0f);
if (cM_rnd() < 0.5f) {
adj_angle += 0x1800;
} else {
adj_angle -= 0x1800;
}
}
sp40.set(0.0f, 0.0f, 1300.0f);
cLib_offsetPos(&field_0x6a8, &sp34, adj_angle, &sp40);
field_0x6a8.y = field_0x69c.y;
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x6a8);
current.angle.x = cLib_targetAngleX(&current.pos, &field_0x6a8);
speed.y = 0.0f;
speedF = 0.0f;
field_0x6c8 = 0.0f;
field_0x6fc = 30;
mMode = 2;
break;
}
case 2:
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x6a8);
current.angle.x = cLib_targetAngleX(&current.pos, &field_0x6a8);
cLib_chaseF(&field_0x6c8, l_HIO.fly_attack_speed, 5.0f);
cLib_chaseF(&speedF, field_0x6c8 * std::abs(cM_scos(current.angle.x)), 5.0f);
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &sp34), 0x400);
cLib_chaseF(&speed.y, field_0x6c8 * cM_ssin(current.angle.x), 5.0f);
setBodyAngle();
if (field_0x6a8.absXZ(current.pos) < 100.0f || field_0x6fc == 0) {
mMode = 3;
field_0x6fc = 30;
}
break;
case 3:
if (current.pos.y < field_0x6d0 + 650.0f) {
current.pos.y = field_0x6d0 + 650.0f;
}
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &sp34), 0x800);
cLib_chaseAngleS(&field_0x6ea, 0, 0x400);
cLib_chaseAngleS(&shape_angle.z, 0, 0x400);
cLib_chaseF(&speedF, 0.0f, 3.0f);
cLib_chaseF(&speed.y, 0.0f, 3.0f);
if (current.pos.y < field_0x6cc) {
current.pos.y = field_0x6cc;
}
if (checkWolfLockIn()) {
mMode = 1;
}
if (field_0x6fc == 0) {
setActionMode(1, 0);
}
break;
}
}
/* 8081A718-8081A88C 0046F8 0174+00 1/1 0/0 0/0 .text executeGuard__9daE_YMB_cFv */
void daE_YMB_c::executeGuard() {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
switch (mMode) {
case 0:
mSound.startCreatureVoice(Z2SE_EN_YB_V_GUARD, -1);
setBck(BCK_YB_GUARD, 0, 3.0f, 1.0f);
current.angle.y = fopAcM_searchPlayerAngleY(this) - 0x8000;
speedF = 10.0f;
speed.y = 10.0f;
mMode = 1;
// fallthrough
case 1:
cLib_chaseF(&speedF, 0.0f, 0.3f);
cLib_chaseF(&speed.y, 0.0f, 0.3f);
cLib_chaseAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x400);
if (mpModelMorf->isStop()) {
setActionMode(1, 0);
}
break;
}
}
/* 8081A88C-8081B78C 00486C 0F00+00 2/1 0/0 0/0 .text executeSwim__9daE_YMB_cFv */
void daE_YMB_c::executeSwim() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
s16 camAngleY = (s16) fopCamM_GetAngleY(camera);
s16 cam_ply_ang_diff = camAngleY - fopAcM_searchPlayerAngleY(this);
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz player_pos(player->current.pos);
cXyz sp40;
switch (mMode) {
case 0:
setBck(BCK_YB_SIM_IN, 2, 5.0f, 1.0f);
mMode = 1;
field_0x6fc = 60;
// fallthrough
case 1:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
cLib_addCalcAngleS(&field_0x6ea, 0, 8, 0x800, 0x100);
cLib_chaseF(&speedF, 0.0f, 1.0f);
cLib_chaseF(&speed.y, 0.0f, 1.0f);
if (field_0x6fc == 0 && abs(field_0x6ea) < 0x1000) {
mMode = 2;
speedF = 0.0f;
}
break;
case 2:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
setElecEffect1();
cLib_chaseF(&speedF, l_HIO.swim_attack_speed, 5.0f);
cLib_chaseF(&speed.y, 0.0f, 1.0f);
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this) + 0x8000, 8, 0x1000, 0x100);
current.angle.y = shape_angle.y;
if (player_pos.absXZ(current.pos) < 500.0f) {
field_0x6fc = 30;
} else if (field_0x6fc == 0) {
mMode = 3;
field_0x700 = 150;
field_0x6fc = 0;
field_0x6f0 = 0;
field_0x6e6 = cM_rndF(8192.0f) + 16384.0f;
field_0x6e4 = field_0x6e6 + fopAcM_searchPlayerAngleY(this);
field_0x6e8 = cM_rndF(1536.0f) + 512.0f;
}
break;
case 3:
case 4:
field_0x71f = 1;
setElecEffect2();
if (field_0x6f0 == 0) {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
cLib_chaseF(&speed.y, 10.0f, 1.0f);
if (current.pos.y > field_0x6cc - 150.0f) {
field_0x6f0 = 1;
setBck(BCK_YB_SIM_OUT, 2, 5.0f, 1.0f);
}
} else {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_ONWATER, 0, -1);
setWaterEffect2();
cLib_chaseF(&speed.y, -10.0f, 1.0f);
if (current.pos.y < field_0x6cc - 150.0f) {
speed.y = 0.0f;
cLib_chaseF(&current.pos.y, field_0x6cc - 150.0f, 2.0f);
}
}
cLib_chaseF(&speedF, l_HIO.swim_attack_speed, 5.0f);
sp40.set(0.0f, 0.0f, 1000.0f);
cLib_offsetPos(&field_0x6a8, &player_pos, field_0x6e4, &sp40);
if (mMode == 3) {
cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &field_0x6a8), 8, field_0x6e8, 0x40);
current.angle.y = shape_angle.y;
if (abs((s16)(shape_angle.y - cLib_targetAngleY(&current.pos, &field_0x6a8))) > 0x3000) {
field_0x6e4 = field_0x6e6 + fopAcM_searchPlayerAngleY(this);
}
if (current.pos.absXZ(field_0x6a8) < 500.0f) {
mMode = 4;
field_0x6fc = 30;
}
} else if (mMode == 4 && field_0x6fc == 0 && current.pos.absXZ(field_0x6a8) > 500.0f) {
if (field_0x700 != 0) {
mMode = 3;
field_0x6e6 = cM_rndF(8192.0f) + 16384.0f;
field_0x6e4 = field_0x6e6 + fopAcM_searchPlayerAngleY(this);
field_0x6e8 = cM_rndF(1536.0f) + 512.0f;
} else {
mMode = 5;
field_0x6fc = 30;
field_0x6e4 = fopAcM_searchPlayerAngleY(this) + 0x7000;
}
}
break;
case 5:
case 6:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_ONWATER, 0, -1);
setWaterEffect2();
setElecEffect2();
if (abs( s16(field_0x6e4 - s16(fopAcM_searchPlayerAngleY(this) - 0x8000)) ) < 0x1000) {
field_0x6e4 -= 0x180;
}
if (mMode == 5) {
sp40.set(0.0f, 0.0f, 3000.0f);
} else {
sp40.set(0.0f, 0.0f, 4000.0f);
}
cLib_offsetPos(&field_0x6a8, &player_pos, field_0x6e4, &sp40);
cLib_chaseF(&speedF, l_HIO.swim_attack_speed, 5.0f);
cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &field_0x6a8), 8, 0x800, 0x100);
current.angle.y = shape_angle.y;
if (mMode == 5) {
if (field_0x6fc == 0) {
bool bVar1 = false;
if (dComIfGp_getAttention()->LockonTruth()) {
if (dComIfGp_getAttention()->LockonTarget(0) == this) {
bVar1 = true;
}
}
if (bVar1 || abs(cam_ply_ang_diff) > 0x5800) {
mMode = 6;
field_0x6fc = 45;
}
}
} else if (field_0x6fc == 0) {
mMode = 7;
field_0x6a8 = player_pos;
setBck(BCK_YB_ATTACK_A, 0, 10.0f, 1.0f);
}
break;
case 7:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
if (mpModelMorf->isStop()) {
setBck(BCK_YB_ATTACK_B, 2, 3.0f, 1.0f);
}
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_ONWATER, 0, -1);
setWaterEffect2();
setElecEffect2();
cLib_chaseF(&speedF, l_HIO.swim_attack_speed, 5.0f);
cLib_chaseF(&current.pos.y, field_0x6d0 + 650.0f, 10.0f);
cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &field_0x6a8), 8, 0x800, 0x40);
current.angle.y = shape_angle.y;
if (current.pos.absXZ(field_0x6a8) < 500.0f) {
mMode = 8;
field_0x6fc = 10;
field_0x6e4 = 0;
}
break;
case 8:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setElecEffect2();
cLib_chaseF(&current.pos.y, field_0x6d0 + 650.0f, 10.0f);
field_0x6c8 = l_HIO.swim_attack_speed;
cLib_chaseF(&speedF, field_0x6c8 * std::abs(cM_scos(field_0x6e4)), 1.0f);
cLib_chaseF(&speed.y, field_0x6c8 * cM_ssin(field_0x6e4), 1.0f);
cLib_chaseAngleS(&field_0x6e4, 0x4000, 0x400);
if (field_0x6fc == 0) {
mMode = 9;
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
field_0x6c8 = l_HIO.swim_attack_speed;
field_0x714 = 0;
}
break;
case 9:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setFlyWaitVoice();
if (current.pos.y < field_0x69c.y - 500.0f) {
cLib_chaseF(&field_0x6c8, l_HIO.fly_movement_speed, 3.0f);
} else {
cLib_chaseF(&field_0x6c8, 0.0f, 3.0f);
}
cLib_chaseAngleS(&field_0x6e4, 0x4000, 0x400);
cLib_chaseF(&speedF, field_0x6c8 * std::abs(cM_scos(field_0x6e4)), 3.0f);
cLib_chaseF(&speed.y, field_0x6c8 * cM_ssin(field_0x6e4), 3.0f);
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x1000, 0x100);
if (!speedF && !speed.y) {
setActionMode(1, 1);
}
break;
}
}
/* 8081B78C-8081BC10 00576C 0484+00 1/1 0/0 0/0 .text executeWaterJump__9daE_YMB_cFv */
void daE_YMB_c::executeWaterJump() {
switch (mMode) {
case 0:
setBck(BCK_YB_SIM_IN, 2, 5.0f, 1.0f);
mMode = 1;
shape_angle.y += 0x100;
field_0x6a8 = current.pos;
// fallthrough
case 1:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
cLib_addCalcAngleS(&field_0x6ea, 0x4000, 8, 0x400, 0x100);
cLib_chaseF(&speed.y, -50.0f, 5.0f);
if (current.pos.y < field_0x6cc - 1000.0f - 500.0f) {
mMode = 2;
field_0x6fc = 60;
speedF = 0.0f;
}
break;
case 2:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
cLib_addCalcAngleS(&field_0x6ea, -0x4000, 8, 0x400, 0x100);
cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x1000, 0x100);
current.angle.y = shape_angle.y;
cLib_chaseF(&speed.y, 80.0f, 5.0f);
if (field_0x6fc < 30) {
setElecEffect1();
}
if (current.pos.y > field_0x6cc - 1000.0f) {
shape_angle.y = fopAcM_searchPlayerAngleY(this);
current.angle.y = shape_angle.y;
field_0x6ea = 0;
mMode = 3;
speed.y = 80.0f;
field_0x6f0 = 0;
field_0x6fc = 25;
setBck(BCK_YB_RISE, 2, 0.0f, 1.0f);
}
break;
case 3:
setElecEffect2();
if (field_0x6f0 == 0 && current.pos.y > field_0x6cc - 500.0f) {
field_0x6f0 = 1;
setWaterEffect1();
mSound.startCreatureSound(Z2SE_EN_YB_SPLASH, 0, -1);
mSound.startCreatureVoice(Z2SE_EN_YB_V_RISE, -1);
field_0x714 = 0;
}
if (field_0x715 != 0) {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_UNDERWATER, 0, -1);
} else {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
if (field_0x6fc == 0) {
cLib_chaseF(&speed.y, -30.0f, 3.0f);
if (speed.y <= 24.0f) {
setBck(BCK_YB_SIM_TO_FLY, 0, 3.0f, 1.0f);
mMode = 4;
}
}
}
break;
case 4:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
if (cLib_chaseF(&speed.y, -30.0f, 3.0f) != 0) {
field_0x6fc = 10;
mMode = 5;
}
break;
case 5:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
if (field_0x6fc == 0 && cLib_chaseF(&speed.y, 0.0f, 3.0f) != 0 && mpModelMorf->isStop()) {
setActionMode(1, 1);
}
break;
}
}
/* 8081BC10-8081BEE8 005BF0 02D8+00 1/1 0/0 0/0 .text getNearDownPos__9daE_YMB_cFv */
void daE_YMB_c::getNearDownPos() {
s16 sVar2;
int iVar2;
f32 fVar2;
s16 sVar1[3];
f32 fVar1[3];
int iVar1[3];
fVar1[2] = 1500.0f;
fVar1[1] = 1500.0f;
fVar1[0] = 1500.0f;
iVar1[2] = -1;
iVar1[1] = -1;
iVar1[0] = -1;
for (iVar2 = 0; iVar2 < 15; iVar2++) {
sVar2 = abs((s16)(shape_angle.y + 0x8000 - cLib_targetAngleY(&current.pos, &YMB_DOWN_POS[iVar2])));
fVar2 = current.pos.absXZ(YMB_DOWN_POS[iVar2]);
if (sVar2 < 0x3000) {
if (fVar2 < fVar1[0]) {
fVar1[2] = fVar1[1];
sVar1[2] = sVar1[1];
iVar1[2] = iVar1[1];
fVar1[1] = fVar1[0];
sVar1[1] = sVar1[0];
iVar1[1] = iVar1[0];
fVar1[0] = fVar2;
sVar1[1] = sVar2;
iVar1[0] = iVar2;
} else if (fVar2 < fVar1[1]) {
fVar1[2] = fVar1[1];
sVar1[2] = sVar1[1];
iVar1[2] = iVar1[1];
fVar1[1] = fVar2;
sVar1[1] = sVar2;
iVar1[1] = iVar2;
} else if (fVar2 < fVar1[2]) {
fVar1[2] = fVar2;
sVar1[2] = sVar2;
iVar1[2] = iVar2;
}
}
}
for (int i = 0; i < 3; i++) {
if (iVar1[i] != -1 && fVar1[i] < 1000.0f && sVar1[i] < 0x3000) {
field_0x711 = iVar1[i];
return;
}
}
if (iVar1[0] != -1) {
field_0x711 = iVar1[0];
} else {
field_0x711 = 0;
}
}
/* 8081BEE8-8081C4EC 005EC8 0604+00 1/2 0/0 0/0 .text executeDamage__9daE_YMB_cFv */
void daE_YMB_c::executeDamage() {
daPy_py_c* player = daPy_getPlayerActorClass();
setFlyWaitVoice();
switch (mMode) {
case 0:
mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 31);
setBck(BCK_YB_DAMAGE, 0, 3.0f, 1.0f);
mSound.startCreatureVoice(Z2SE_EN_YB_V_DAMAGE, -1);
mSound.startCreatureSound(Z2SE_EN_YB_SHIRU, 0, -1);
mMode = 1;
field_0x6f0 = 0;
field_0x6fc = 20;
speed.y = 0.0f;
speedF = 0.0f;
getNearDownPos();
dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f));
// fallthrough
case 1:
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
field_0x82c[0].OffCoSetBit();
field_0x82c[1].OffCoSetBit();
field_0x82c[0].OffTgShield();
field_0x82c[1].OffTgShield();
if (mpModelMorf->isStop()) {
setBck(BCK_YB_FLY_WAIT, 2, 3.0f, 1.0f);
}
if (!(u8)checkBck(BCK_YB_FLY_WAIT)) {
cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &YMB_DOWN_POS[field_0x711]) + 0x8000, 8, 0x200, 0x80);
}
if (field_0x6fc == 0) {
cLib_chaseF(&speed.y, 0.0f, 5.0f);
}
cLib_addCalcAngleS(&field_0x6ea, 0, 8, 0x1000, 0x10);
if (!field_0x6d8) {
player->offWolfEnemyHangBite();
setActionMode(1, 1);
break;
}
player->setWolfEnemyHangBiteAngle(shape_angle.y - 0x8000);
if (checkWolfBiteDamage()) {
dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f));
offWolfBiteDamage();
field_0x6f0++;
if (field_0x6f0 >= 5) {
field_0x6ec++;
player->offWolfEnemyHangBite();
mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 0x20);
mSound.startCreatureVoice(Z2SE_EN_YB_V_DAMAGE, -1);
if (field_0x6ec >= 3) {
setActionMode(8, 0);
break;
}
mMode = 5;
break;
}
setBck(BCK_YB_DAMAGE, 0, 3.0f, 1.0f);
mSound.startCreatureVoice(Z2SE_EN_YB_V_DAMAGE, -1);
speed.y = 20.0f;
mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 30);
mSound.startCreatureSound(Z2SE_EN_YB_SHIRU, 0, -1);
} else {
if (field_0x720 == 22) {
setDamageEffect(1);
} else {
setDamageEffect(0);
}
}
if (player->checkWolfEnemyHangBiteOwn(this)) {
break;
}
setActionMode(1, 1);
break;
case 5:
mMode = 6;
initDownToWater();
// fallthrough
case 6:
calcDownToWater();
if (current.pos.y < field_0x6cc && field_0x714 == 0) {
mSound.startCreatureSound(Z2SE_EN_YB_SPLASH, 0, -1);
field_0x714 = 1;
}
if (current.pos.y < field_0x6cc - 1000.0f) {
if (speed.y < -20.0f) {
speed.y = -20.0f;
}
mMode = 7;
field_0x6fc = 10;
}
break;
case 7:
if (mpModelMorf->isStop()) {
setBck(BCK_YB_DROP, 2, 3.0f, 1.0f);
}
cLib_addCalcAngleS(&field_0x6ea, -0x8000, 8, 0x1000, 0x10);
cLib_chaseF(&speedF, 0.0f, 1.0f);
cLib_chaseF(&speed.y, -10.0f, 5.0f);
if (field_0x6fc != 0) {
break;
}
setActionMode(5, 0);
break;
}
}
/* 8081C4EC-8081C7D0 0064CC 02E4+00 1/1 0/0 0/0 .text setMidnaBindInit__9daE_YMB_cFP4cXyz */
void daE_YMB_c::setMidnaBindInit(cXyz* i_pos) {
cXyz i_scale(1.0f, 1.0f, 1.0f);
csXyz angle;
cXyz sp30;
MtxP mtx = mDoMtx_stack_c::get();
daMidna_c* midna = daPy_py_c::getMidnaActor();
MtxP mtxHairTop = midna->getMtxHairTop();
MTXCopy(mtxHairTop, mtx);
mDoMtx_stack_c::multVecZero(&sp30);
cXyz sp3c = sp30 - *i_pos;
angle.y = cM_atan2s(sp3c.x, sp3c.z);
angle.x = -cM_atan2s(sp3c.y, JMAFastSqrt(sp3c.x * sp3c.x + sp3c.z * sp3c.z));
angle.z = 0;
static GXColor e_prim = {0xFF, 0x64, 0x78, 0x00};
static GXColor e_env = {0x3C, 0x1E, 0x1E, 0x00};
JPABaseEmitter* emitter = dComIfGp_particle_set(0x29B, i_pos, &tevStr, &angle, &i_scale, 0xFF, NULL, fopAcM_GetRoomNo(this), &e_prim, &e_env, NULL);
if (emitter != NULL) {
emitter->setGlobalParticleHeightScale(0.01f * sp3c.abs());
}
dComIfGp_particle_set(0x29C, i_pos, &tevStr, &shape_angle, &i_scale, 0xFF, NULL, fopAcM_GetRoomNo(this), &e_prim, &e_env, NULL);
mSound.startCreatureSound(Z2SE_MIDNA_BIND_LOCK_ON, 0, -1);
}
/* 8081C7D0-8081C908 0067B0 0138+00 1/1 0/0 0/0 .text setMidnaBindLevel__9daE_YMB_cFi */
void daE_YMB_c::setMidnaBindLevel(int i_index) {
cXyz i_scale(1.0f, 1.0f, 1.0f);
cXyz i_pos;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(YMB_DOWN_ATT_JNT[i_index]));
mDoMtx_stack_c::multVecZero(&i_pos);
static GXColor e_prim = {0xFF, 0x64, 0x78, 0x00};
static GXColor e_env = {0x3C, 0x1E, 0x1E, 0x00};
static u16 eff_id[3] = {
ZL2_MIDONAHAIR03_1, ZL2_MIDONAHAIR03_2, ZL2_MIDONAHAIR01,
};
int iVar1 = i_index * 3;
for (int i = 0; i < 3; i++) {
mMidnaBindParticles[iVar1 + i] = dComIfGp_particle_set(mMidnaBindParticles[iVar1 + i], eff_id[i], &i_pos, &tevStr, &shape_angle, &i_scale, 0xFF, 0, fopAcM_GetRoomNo(this), &e_prim, &e_env, NULL);
}
}
/* 8081C908-8081CC14 0068E8 030C+00 1/1 0/0 0/0 .text setWolfLockEffect__9daE_YMB_cFv */
void daE_YMB_c::setWolfLockEffect() {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz i_pos;
if (!player->checkWolfLock(this)) {
field_0x6f0 = 0;
field_0x700 = 0;
field_0x718 = 0;
} else {
int iVar1 = 0;
f32 fVar1 = 3000.0f;
f32 fVarTemp;
if (field_0x700 == 0 && field_0x6f0 < 6) {
for (int i = 0; i < 6; i++) {
if ((field_0x718 & 1 << i) == 0) {
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(YMB_DOWN_ATT_JNT[i]));
mDoMtx_stack_c::multVecZero(&i_pos);
fVarTemp = i_pos.abs(player->current.pos);
if (fVarTemp < fVar1) {
iVar1 = i;
fVar1 = fVarTemp;
}
}
}
field_0x718 |= 1 << iVar1;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(YMB_DOWN_ATT_JNT[iVar1]));
mDoMtx_stack_c::multVecZero(&i_pos);
setMidnaBindInit(&i_pos);
field_0x700 = 3;
field_0x6f0++;
}
for (int i = 0; i < 6; i++) {
if ((field_0x718 & 1 << i) != 0) {
setMidnaBindLevel(i);
}
}
if (field_0x718 != 0) {
mSound.startCreatureSoundLevel(Z2SE_MIDNA_BIND_LOCK_SUS, 0, -1);
}
}
}
/* 8081CC14-8081CD00 006BF4 00EC+00 2/2 0/0 0/0 .text initDownToWater__9daE_YMB_cFv */
void daE_YMB_c::initDownToWater() {
speed.y = 40.0f;
speedF = 40.0f;
shape_angle.y = cLib_targetAngleY(&current.pos, &YMB_DOWN_POS[field_0x711]) + 0x8000;
current.angle.y = shape_angle.y + 0x8000;
setBck(BCK_YB_DAMAGE_DAWN, 0, 3.0f, 1.0f);
mSound.startCreatureVoice(Z2SE_EN_YB_V_DAMAGE_DOWN, -1);
field_0x6fc = (s16)((current.pos.y - field_0x6cc) / 50.0f + 16.0f);
}
/* 8081CD00-8081CE6C 006CE0 016C+00 2/2 0/0 0/0 .text calcDownToWater__9daE_YMB_cFv */
void daE_YMB_c::calcDownToWater() {
if (mpModelMorf->isStop()) {
setBck(BCK_YB_DROP, 2, 3.0f, 1.0f);
}
cLib_addCalcAngleS(&field_0x6ea, -0x7800, 8, 0x1000, 0x10);
if (field_0x6fc != 0) {
current.pos.absXZ(YMB_DOWN_POS[field_0x711]);
}
f32 fVarTemp = current.pos.y;
cXyz sp48 = YMB_DOWN_POS[field_0x711];
cLib_chasePosXZ(&current.pos, sp48, 40.0f);
current.pos.y = fVarTemp;
cLib_chaseF(&speed.y, -60.0f, 5.0f);
}
/* 8081CE6C-8081D4D8 006E4C 066C+00 1/1 0/0 0/0 .text executeDown__9daE_YMB_cFv */
void daE_YMB_c::executeDown() {
daPy_py_c* player = daPy_getPlayerActorClass();
setDownWaitVoice();
switch (mMode) {
case 0:
mMode = 1;
initDownToWater();
// fallthrough
case 1:
calcDownToWater();
if (current.pos.y < field_0x6cc - 50.0f) {
mSound.startCreatureSound(Z2SE_EN_YB_SPLASH, 0, -1);
field_0x714 = 1;
speedF = 0.0f;
mMode = 2;
mSound.startCreatureVoice(Z2SE_EN_YB_V_DOWN_WAIT, -1);
setBck(BCK_YB_DAWN_WAIT, 2, 3.0f, 1.0f);
field_0x717 = 0;
}
break;
case 2:
if (mpBgW != NULL && !mpBgW->ChkUsed()) {
dComIfG_Bgsp().Regist(mpBgW, this);
}
cLib_chaseF(&speed.y, 20.0f, 3.0f);
if (current.pos.y > field_0x6cc - 50.0f) {
current.pos.y = field_0x6cc - 50.0f;
speed.y = 0.0f;
speedF = 0.0f;
mMode = 3;
field_0x6fc = l_HIO.rollover_time;
field_0x6f4 = 1;
field_0x6f0 = 0;
field_0x700 = 0;
field_0x718 = 0;
dComIfGs_onOneZoneSwitch(1, fopAcM_GetRoomNo(this));
}
break;
case 3:
if (field_0x724 != 0) {
field_0x716 = 1;
} else {
field_0x716 = 0;
}
setWolfLockEffect();
setDownHamonEffect();
field_0x82c[0].OffCoSetBit();
field_0x82c[1].OffCoSetBit();
field_0x82c[0].OffTgSetBit();
field_0x82c[1].OffTgSetBit();
for (int i = 0; i < 6; i++) {
field_0xbd4[i].OnCoSetBit();
if (field_0x680[i] != 0 || field_0x698 != 0) {
field_0xbd4[i].OffTgSetBit();
} else {
field_0xbd4[i].OnTgSetBit();
}
if (player->checkWolfLock(this)) {
field_0xbd4[i].OffTgShield();
}
}
if (mpBgW != NULL && !mpBgW->ChkUsed()) {
dComIfG_Bgsp().Regist(mpBgW, this);
}
cLib_addCalcAngleS(&field_0x6ea, -0x8000, 8, 0x1000, 0x10);
if (field_0x6fc == 0 && !player->checkWolfLock(this)) {
if (mpBgW != NULL) {
dComIfG_Bgsp().Release(mpBgW);
}
for (int i = 0; i < 6; i++) {
field_0xbd4[i].OffTgSetBit();
field_0xbd4[i].OffCoSetBit();
}
setActionMode(6, 0);
field_0x6ec = 2;
field_0x716 = 0;
field_0x6f4 = 0;
field_0x717 = 1;
dComIfGs_offOneZoneSwitch(1, fopAcM_GetRoomNo(this));
}
if (player->getCutType() == daPy_py_c::CUT_TYPE_WOLF_LOCK) {
mMode = 4;
field_0x6fc = 0;
}
break;
case 4:
setDownHamonEffect();
field_0x82c[0].OffCoSetBit();
field_0x82c[1].OffCoSetBit();
field_0x82c[0].OffTgSetBit();
field_0x82c[1].OffTgSetBit();
field_0x82c[0].OffTgShield();
field_0x82c[1].OffTgShield();
for (int i = 0; i < 6; i++) {
field_0xbd4[i].OffTgSetBit();
field_0xbd4[i].OffTgShield();
field_0xbd4[i].OffCoSetBit();
}
if (mpBgW != NULL && mpBgW->ChkUsed()) {
dComIfG_Bgsp().Release(mpBgW);
}
if (field_0x6fc == 0) {
cXyz sp40;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(getDownLockPoint()));
mDoMtx_stack_c::multVecZero(&sp40);
if (sp40.absXZ(player->current.pos) < 150.0f) {
setLastDamage();
field_0x6fc = 3;
}
}
if (player->getCutType() != daPy_py_c::CUT_TYPE_WOLF_LOCK) {
setActionMode(9, 0);
dComIfGs_offOneZoneSwitch(1, fopAcM_GetRoomNo(this));
}
break;
}
}
/* 8081D4D8-8081D594 0074B8 00BC+00 1/1 0/0 0/0 .text setCreateDrop__9daE_YMB_cFv */
void daE_YMB_c::setCreateDrop() {
daObjDrop_c* drop = (daObjDrop_c*)fpcM_Search(search_drop, this);
if (drop != NULL) {
cXyz sp1c;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&sp1c);
drop->setPos(sp1c);
drop->setAppear();
fopAcM_OnStatus(drop, fopAcM_STATUS_UNK_0x4000);
}
field_0x721 = 1;
}
/* 8081D594-8081DBD0 007574 063C+00 1/1 0/0 0/0 .text executeDeath__9daE_YMB_cFv */
void daE_YMB_c::executeDeath() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp24, pos;
switch (mMode) {
case 0:
setDownHamonEffect();
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return;
}
mSound.startCreatureVoice(Z2SE_EN_YB_V_DEATH, -1);
setBck(BCK_YB_DEATH, 0, 3.0f, 1.0f);
attention_info.flags = 0;
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(3);
current.pos.set(-88400.0f, field_0x6cc, 39000.0f);
shape_angle.y = 0x800;
pos.set(-87900.0f, -18800.0f, 38050.0f);
player->setPlayerPosAndAngle(&pos, 0x6500, 0);
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&mDemoCamCenter);
field_0x760 = 0x6F00;
field_0x75c = 1800.0f;
sp24.set(0.0f, 100.0f, field_0x75c);
cLib_offsetPos(&mDemoCamEye, &current.pos, field_0x760, &sp24);
mDemoCamFovy = 60.0f;
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
field_0x6e6 = 0x6500;
field_0x762 = 40;
field_0x6fc = 270;
mMode = 2;
Z2GetAudioMgr()->setBattleBgmOff(true);
break;
case 1:
case 2:
setDownHamonEffect();
cLib_addCalcAngleS(&field_0x6e6, -0x1C00, 8, 0x200, 0x80);
player->setPlayerPosAndAngle(&player->current.pos, field_0x6e6, 0);
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&mDemoCamCenter);
if (field_0x6fc == 0) {
cLib_chaseAngleS(&field_0x762, 0, 4);
}
field_0x760 += field_0x762;
cLib_chaseF(&field_0x75c, 1300.0f, 5.0f);
sp24.set(0.0f, 100.0f, field_0x75c);
cLib_offsetPos(&mDemoCamEye, &current.pos, field_0x760, &sp24);
mDemoCamFovy = 60.0f;
if (mMode == 2) {
if (mpModelMorf->checkFrame(263.0f)) {
setWaterEffect1();
mSound.startCreatureSound(Z2SE_EN_YB_SPLASH, 0, -1);
}
if (mpModelMorf->checkFrame(280.0f)) {
mMode = 3;
field_0x6fc = 60;
mDemoCamCenter = current.pos;
mDemoCamEye.set(-87893.0f, -18731.0f, 37578.0f);
field_0x75c = 30.0f;
}
}
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
break;
case 3:
setDownHamonEffect();
current.pos.y -= 2.0f;
cLib_chaseF(&field_0x6e0, -100.0f, 2.0f);
if ( ((field_0x6fc == 0) & mpModelMorf->isStop()) != 0) {
field_0x710 = 1;
mMode = 4;
field_0x6fc = 90;
setCreateDrop();
setDeathEffect();
}
break;
case 4:
cLib_chaseF(&field_0x75c, -5.0f, 1.0f);
mDemoCamCenter.y += field_0x75c;
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
if (field_0x6fc == 0) {
if (mSwitchBit != 0xFF && !dComIfGs_isSwitch(mSwitchBit, fopAcM_GetRoomNo(this))) {
dComIfGs_onSwitch(mSwitchBit, fopAcM_GetRoomNo(this));
}
camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
dComIfGs_offSwitch(5, fopAcM_GetRoomNo(this));
dComIfGs_offOneZoneSwitch(15, fopAcM_GetRoomNo(this));
fopAcM_delete(this);
}
break;
}
}
/* 8081DBD0-8081DDE0 007BB0 0210+00 1/1 0/0 0/0 .text demo_skip__9daE_YMB_cFi */
void daE_YMB_c::demo_skip(int param_1) {
switch (param_1) {
case 0:
setActionMode(11, 0);
Z2GetAudioMgr()->setBattleBgmOff(true);
break;
case 1:
dComIfGp_getVibration().StopQuake(31);
setActionMode(1, 1);
Z2GetAudioMgr()->subBgmStop();
Z2GetAudioMgr()->setBattleBgmOff(false);
Z2GetAudioMgr()->setForceBattleArea(true, 3000, 4000, 6000);
current.pos.y = field_0x69c.y;
speedF = 0.0f;
speed.y = 0.0f;
shape_angle.y = cLib_targetAngleY(&current.pos, &daPy_getPlayerActorClass()->current.pos);
break;
case 3:
dComIfGp_getVibration().StopQuake(31);
// fallthrough
case 2:
attention_info.flags &= ~fopAc_AttnFlag_UNK_0x400000;
setActionMode(1, 1);
field_0x764 = 1;
speedF = 0.0f;
speed.y = 0.0f;
shape_angle.y = cLib_targetAngleY(&current.pos, &daPy_getPlayerActorClass()->current.pos);
break;
}
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
}
/* 8081DDE0-8081DE14 007DC0 0034+00 3/3 0/0 0/0 .text DemoSkipCallBack__9daE_YMB_cFPvi */
int daE_YMB_c::DemoSkipCallBack(void* i_this, int param_2) {
if (i_this) {
static_cast<daE_YMB_c*>(i_this)->demo_skip(param_2);
return 1;
}
return 0;
}
/* 8081DE14-8081DE84 007DF4 0070+00 1/1 0/0 0/0 .text calcLakeDemoPlayerPos__9daE_YMB_cFv */
void daE_YMB_c::calcLakeDemoPlayerPos() {
cXyz sp1c(field_0x69c.x, 0.0f, field_0x69c.z);
cXyz sp28(0.0f, field_0x6cc + field_0x75c, 2000.0f);
cLib_offsetPos(&current.pos, &sp1c, field_0x6e4, &sp28);
}
/* 8081DE84-8081E5B4 007E64 0730+00 1/1 0/0 0/0 .text executeLakeDemo__9daE_YMB_cFv */
void daE_YMB_c::executeLakeDemo() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp24;
switch (mMode) {
case 0:
field_0x710 = 1;
field_0x82c[0].OffTgSetBit();
field_0x82c[1].OffTgSetBit();
field_0xa9c.OffTgSetBit();
/* dSv_event_flag_c::F_0005 - Misc. - Gathered 14 Tears of Light in area 4 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[9])) {
return;
}
if (dComIfGs_isSaveSwitch(17)) {
field_0x710 = 0;
setActionMode(1, 1);
field_0x764 = 1;
Z2GetAudioMgr()->setBattleBgmOff(false);
Z2GetAudioMgr()->setForceBattleArea(true, 3000, 4000, 6000);
field_0x765 = 1;
return;
}
if (dComIfGs_isSaveSwitch(16)) {
field_0x710 = 0;
setActionMode(1, 1);
Z2GetAudioMgr()->setBattleBgmOff(false);
Z2GetAudioMgr()->setForceBattleArea(true, 3000, 4000, 6000);
return;
}
if (dComIfGs_isSaveSwitch(15)) {
field_0x710 = 0;
setActionMode(11, 0);
Z2GetAudioMgr()->setBattleBgmOff(true);
return;
}
field_0x6f0 = 0;
mMode = 1;
field_0x715 = 1;
field_0x75c = -300.0f;
field_0x6c4 = 0.0f;
break;
case 1:
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return;
}
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(3);
mDemoCamCenter.set(-81000.0f, -17000.0f, 33000.0f);
mDemoCamFovy = 50.0f;
field_0x760 = 0x7000;
field_0x762 = -0x30;
sp24.set(0.0f, 0.0f, 1000.0f);
cLib_offsetPos(&mDemoCamEye, &mDemoCamCenter, field_0x760, &sp24);
mMode = 2;
field_0x6e4 = 0x7FFF;
field_0x710 = 0;
dComIfGs_onSaveSwitch(15);
/* dSv_event_flag_c::M_086 - Twilight Hyrule Field - Show Boss Bug's Tear of Light on the map */
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x77]);
break;
case 2:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 0);
field_0x760 += field_0x762;
mDemoCamCenter.set(-81000.0f, -17000.0f, 33000.0f);
sp24.set(0.0f, 0.0f, 1000.0f);
cLib_offsetPos(&mDemoCamEye, &mDemoCamCenter, field_0x760, &sp24);
mDemoCamFovy = 50.0f;
if (field_0x760 < 0x6800) {
cLib_chaseF(&field_0x75c, 300.0f, 10.0f);
}
if (field_0x760 < 0x6000) {
mMode = 3;
field_0x6fc = 90;
}
break;
case 3:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 0);
cLib_chaseF(&field_0x75c, 300.0f, 10.0f);
cLib_chaseAngleS(&field_0x762, 0, 0x10);
field_0x760 += field_0x762;
sp24.set(0.0f, 0.0f, 1000.0f);
cLib_offsetPos(&mDemoCamEye, &mDemoCamCenter, field_0x760, &sp24);
cLib_chasePos(&mDemoCamCenter, current.pos, 40.0f);
cLib_chasePos(&mDemoCamEye, current.pos, 40.0f);
mDemoCamFovy = 50.0f;
if (field_0x6fc == 0) {
field_0x6e4 = 0;
calcLakeDemoPlayerPos();
mDemoCamCenter = current.pos;
sp24.set(0.0f, -700.0f, 3000.0f);
cLib_offsetPos(&mDemoCamEye, &field_0x69c, 0x6000, &sp24);
mDemoCamFovy = 50.0f;
mMode = 5;
field_0x6fc = 70;
field_0x700 = 170;
}
break;
case 5:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 0);
if (field_0x6fc != 0) {
cXyz sp30(mDemoCamCenter);
mDemoCamCenter = current.pos;
sp24.set(0.0f, -700.0f, 3500.0f);
cLib_offsetPos(&mDemoCamEye, &field_0x69c, 0x6000, &sp24);
mDemoCamFovy = 50.0f;
field_0x740 = mDemoCamCenter - sp30;
} else {
field_0x6f0 = 1;
mDemoCamCenter += field_0x740;
cLib_chasePos(&field_0x740, cXyz(0.0f, 0.0f, 0.0f), 5.0f);
cLib_chaseF(&field_0x75c, 0.0f, 5.0f);
}
if (field_0x700 == 0) {
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
Z2GetAudioMgr()->setBattleBgmOff(true);
setActionMode(11, 0);
return;
}
break;
}
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
if (field_0x6f0 == 0) {
if (field_0x75c >= 200.0f) {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_MOVE_ONWATER, 0, -1);
setWaterEffect2();
}
setElecEffect2();
field_0x6a8 = current.pos;
field_0x6e8 = -0x300;
field_0x6e4 += field_0x6e8;
calcLakeDemoPlayerPos();
speed.y = 0.0f;
speedF = 0.0f;
shape_angle.y = cLib_targetAngleY(&field_0x6a8, &current.pos);
}
}
/* 8081E5B4-8081F140 008594 0B8C+00 2/1 0/0 0/0 .text executeStartDemo__9daE_YMB_cFv */
void daE_YMB_c::executeStartDemo() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp28, sp34;
switch (mMode) {
case 0:
field_0x710 = 1;
if (player->current.pos.absXZ(field_0x69c) > 2500.0f) {
return;
}
if (dComIfGp_checkPlayerStatus0(0, 0x100000) || dComIfGp_checkPlayerStatus0(0, 0x100)) {
return;
}
mMode = 1;
break;
case 1:
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return;
}
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(3);
sp34.set(-89100.0f, -18800.0f, 39410.0f);
player->setPlayerPosAndAngle(&sp34, 0x5400, 0);
player->changeDemoMode(4, 1, 0, 0);
speed.y = 0.0f;
speedF = 0.0f;
current.pos.set(-88463.0f, field_0x6cc - 1500.0f, 38868.0f);
field_0x715 = 1;
field_0x710 = 0;
mDemoCamCenter.set(-88660.0f, -18918.0f, 38981.0f);
mDemoCamEye.set(-89144.0f, -18551.0f, 39753.0f);
mDemoCamFovy = 50.0f;
mMode = 2;
field_0x6fc = 60;
field_0x75c = mDemoCamEye.absXZ(current.pos);
field_0x760 = cLib_targetAngleY(&current.pos, &mDemoCamEye);
dComIfGs_onSaveSwitch(16);
Z2GetAudioMgr()->subBgmStart(Z2BGM_YAMIMUSHI_B_D01);
break;
case 2:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
setBoilEffect(0);
sp34.set(-89100.0f, player->current.pos.y, 39410.0f);
player->setPlayerPosAndAngle(&sp34, 0x5400, 0);
if (field_0x6fc == 0) {
player->changeOriginalDemo();
player->changeDemoMode(0x17, 0, 0, 0);
mMode = 3;
field_0x6fc = 360;
field_0x762 = 16;
u8 uVar1[6] = {0, 32, 1, 0, 32, 4};
dComIfGp_getVibration().StartQuake(uVar1, 1, 1, cXyz(0.0f, 1.0f, 0.0f));
}
break;
case 3:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
setBoilEffect(0);
sp34.set(current.pos.x, field_0x6cc - 120.0f, current.pos.z);
cLib_chasePos(&mDemoCamCenter, sp34, 1.5f);
sp34.set(-88800.0f, -18266.0f, 39412.0f);
cLib_chasePos(&mDemoCamEye, sp34, 1.7f);
cLib_chaseF(&current.pos.y, field_0x6cc - 300.0f, 2.2f);
setElecEffect2();
if (field_0x6fc == 0) {
mMode = 4;
field_0x6fc = 120;
}
break;
case 4:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
if (field_0x6fc >= 95) {
setBoilEffect(1);
if (field_0x6fc == 95) {
dComIfGp_getVibration().StopQuake(31);
}
}
sp34.set(current.pos.x, field_0x6cc - 120.0f, current.pos.z);
cLib_chasePos(&mDemoCamCenter, sp34, 1.5f);
sp34.set(-88800.0f, -18266.0f, 39412.0f);
cLib_chasePos(&mDemoCamEye, sp34, 1.7f);
cLib_chaseF(&current.pos.y, field_0x6cc - 300.0f, 2.2f);
if (field_0x6fc == 0) {
shape_angle.y = fopAcM_searchPlayerAngleY(this);
mMode = 8;
speed.y = 80.0f;
field_0x6fc = 15;
setBck(BCK_YB_RISE, 2, 0.0f, 1.0f);
field_0x6f0 = 0;
}
break;
case 8:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
if (field_0x6f0 == 0) {
if (current.pos.y >= field_0x6cc) {
setWaterEffect1();
mSound.startCreatureSound(Z2SE_EN_YB_SPLASH, 0, -1);
field_0x6f0 = 1;
dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f));
}
} else {
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
}
mDemoCamCenter.set(current.pos.x, current.pos.y - 200.0f, current.pos.z);
if (mDemoCamCenter.y < field_0x6cc - 120.0f) {
mDemoCamCenter.y = field_0x6cc - 120.0f;
}
sp34.set(-89000.0f, -18583.0f, 39350.0f);
cLib_chasePos(&mDemoCamEye, sp34, 10.0f);
setElecEffect2();
if (field_0x6fc == 0) {
cLib_chaseF(&speed.y, -30.0f, 3.0f);
if (speed.y <= 24.0f) {
setBck(BCK_YB_SIM_TO_FLY, 0, 3.0f, 1.0f);
mMode = 9;
}
}
break;
case 9:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
sp34.set(-89000.0f, -18583.0f, 39350.0f);
cLib_chasePos(&mDemoCamEye, sp34, 10.0f);
mDemoCamCenter.set(current.pos.x, current.pos.y - 200.0f, current.pos.z);
setElecEffect2();
if (cLib_chaseF(&speed.y, -30.0f, 3.0f) != 0) {
field_0x6fc = 10;
mMode = 10;
}
break;
case 10:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
sp34.set(-89260.0f, -18650.0f, 39500.0f);
cLib_chasePos(&mDemoCamEye, sp34, 10.0f);
mDemoCamCenter.set(current.pos.x, current.pos.y - 200.0f, current.pos.z);
setElecEffect2();
if (field_0x6fc == 0 && cLib_chaseF(&speed.y, 0.0f, 3.0f) != 0 && mpModelMorf->isStop()) {
mMode = 11;
field_0x6fc = 30;
}
break;
case 11:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 1);
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setElecEffect2();
if (field_0x6fc == 0) {
camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
setActionMode(1, 1);
Z2GetAudioMgr()->setBattleBgmOff(false);
Z2GetAudioMgr()->setForceBattleArea(true, 3000, 4000, 6000);
return;
}
break;
}
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
}
/* 8081F140-8081F2E0 009120 01A0+00 1/1 0/0 0/0 .text checkStartBattleDemo__9daE_YMB_cFv */
bool daE_YMB_c::checkStartBattleDemo() {
if (field_0x764 == 0 && daPy_getPlayerActorClass()->checkNowWolfEyeUp()) {
if (daPy_getPlayerActorClass()->current.pos.absXZ(field_0x69c) < 2500.0f) {
setActionMode(12, 0);
return true;
}
}
return false;
}
/* 8081F2E0-8081FAC8 0092C0 07E8+00 1/1 0/0 0/0 .text executeBattleDemo__9daE_YMB_cFv */
void daE_YMB_c::executeBattleDemo() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp1c(player->current.pos);
cXyz sp28, sp34;
s16 sVar1;
mSound.startCreatureSoundLevel(Z2SE_EN_YB_FLY, 0, -1);
setFlyWaitVoice();
switch (mMode) {
case 0:
mMode = 1;
attention_info.flags |= fopAc_AttnFlag_UNK_0x400000;
// fallthrough
case 1:
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return;
}
dComIfGp_event_setTalkPartner(this);
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(3);
mDemoCamCenter = camera->mCamera.Center();
mDemoCamEye = camera->mCamera.Eye();
mDemoCamFovy = camera->mCamera.Fovy();
player->setPlayerPosAndAngle(&sp1c, fopCamM_GetAngleY(camera), 0);
sp28.set(0.0f, 1000.0f, 2000.0f);
cLib_offsetPos(&current.pos, &sp1c, fopCamM_GetAngleY(camera), &sp28);
shape_angle.y = fopAcM_searchPlayerAngleY(this);
speedF = 0.0f;
speed.y = 0.0f;
setBck(BCK_YB_CRY, 0, 3.0f, 1.0f);
mSound.startCreatureSound(Z2SE_EN_YB_V_CRY, 0, -1);
mMode = 2;
dComIfGp_getVibration().StartQuake(8, 31, cXyz(0.0f, 1.0f, 0.0f));
dComIfGs_onSaveSwitch(17);
field_0x765 = 1;
break;
case 2:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 3);
if (mpModelMorf->checkFrame(30.0f)) {
dComIfGp_getVibration().StopQuake(31);
}
sp34.set(current.pos.x, current.pos.y - 70.0f, current.pos.z);
cLib_chasePos(&mDemoCamCenter, sp34, 200.0f);
sp28.set(0.0f, -200.0f, 500.0f);
cLib_offsetPos(&sp34, &current.pos, shape_angle.y, &sp28);
cLib_chasePos(&mDemoCamEye, sp34, 150.0f);
cLib_chaseF(&mDemoCamFovy, 50.0f, 2.0f);
if (mpModelMorf->isStop()) {
speed.y = 0.0f;
speedF = 0.0f;
field_0x6c8 = 0.0f;
field_0x74c.set(current.pos.x, field_0x69c.y, current.pos.z);
field_0x760 = shape_angle.y;
field_0x6f0 = 0;
setBck(BCK_YB_FLY_WAIT, 2, 5.0f, 1.0f);
mMode = 3;
}
break;
case 3:
sp28.set(0.0f, 0.0f, 600.0f);
if (field_0x6f0 != 1) {
sVar1 = field_0x760 + 0x5800;
} else {
sVar1 = field_0x760 - 0x5800;
}
cLib_offsetPos(&field_0x6a8, &current.pos, sVar1, &sp28);
field_0x6a8.y = field_0x69c.y;
mMode = 4;
field_0x6f0++;
field_0x6fc = 110;
// fallthrough
case 4:
case 5:
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 2);
cLib_chaseF(&mDemoCamCenter.y, current.pos.y - 200.0f, 3.0f);
sp34.set(current.pos.x, mDemoCamCenter.y, current.pos.z);
cLib_chasePosXZ(&mDemoCamCenter, sp34, 5.0f);
cLib_chaseF(&mDemoCamEye.y, current.pos.y - 500.0f, 1.0f);
current.angle.y = cLib_targetAngleY(&current.pos, &field_0x6a8);
current.angle.x = cLib_targetAngleX(&current.pos, &field_0x6a8);
cLib_chaseF(&speedF, field_0x6c8 * std::abs(cM_scos(current.angle.x)), 1.0f);
cLib_chaseAngleS(&shape_angle.y, cLib_targetAngleY(&current.pos, &sp1c), 0x400);
cLib_chaseF(&speed.y, field_0x6c8 * cM_ssin(current.angle.x), 1.0f);
if (mMode == 4) {
cLib_chaseF(&field_0x6c8, l_HIO.fly_movement_speed, 1.0f);
} else {
cLib_chaseF(&field_0x6c8, 0.0f, 1.0f);
}
setBodyAngle();
if (mMode == 4) {
if (field_0x6a8.absXZ(current.pos) < 200.0f) {
mMode = 5;
}
} else if (!field_0x6c8) {
if (field_0x6f0 < 2) {
mMode = 3;
} else if (field_0x6fc == 0) {
camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
attention_info.flags &= ~fopAc_AttnFlag_UNK_0x400000;
setActionMode(1, 1);
field_0x764 = 1;
}
}
break;
}
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamFovy, 0);
}
/* 8081FAC8-8081FF88 009AA8 04C0+00 2/1 0/0 0/0 .text action__9daE_YMB_cFv */
void daE_YMB_c::action() {
daPy_py_c* player = daPy_getPlayerActorClass();
field_0x1324.OffAtSetBit();
field_0x82c[0].OffAtSetBit();
field_0x82c[1].OffAtSetBit();
field_0x82c[0].OnCoSetBit();
field_0x82c[1].OnCoSetBit();
if ((field_0x712 != 0 && player->getCutType() == daPy_py_c::CUT_TYPE_WOLF_JUMP) || !field_0x6d8) {
field_0x82c[0].OffTgShield();
field_0x82c[1].OffTgShield();
field_0xa9c.OffTgShield();
} else {
field_0x82c[0].OnTgShield();
field_0x82c[1].OnTgShield();
field_0xa9c.OnTgShield();
}
checkWaterPos();
checkGroundPos();
damage_check();
setCameraSwitch();
if (field_0x716 == 0) {
if (player->checkWolfLock(this)) {
player->cancelWolfLock(this);
}
onWolfNoLock();
} else {
offWolfNoLock();
}
if (mAction != 5) {
attention_info.distances[2] = 24;
} else {
attention_info.distances[2] = 25;
}
field_0x712 = 0;
field_0x71f = 0;
switch (mAction) {
case ACTION_WAIT:
executeWait();
break;
case ACTION_FLY:
executeFly();
break;
case ACTION_FLY_ATTACK:
executeFlyAttack();
break;
case ACTION_RUN_AWAY:
executeRunAway();
break;
case ACTION_GUARD:
executeGuard();
break;
case ACTION_SWIM:
executeSwim();
break;
case ACTION_WATER_JUMP:
executeWaterJump();
break;
case ACTION_DAMAGE:
executeDamage();
break;
case ACTION_DOWN:
executeDown();
break;
case ACTION_DEATH:
executeDeath();
break;
case ACTION_LAKE_DEMO:
executeLakeDemo();
break;
case ACTION_START_DEMO:
executeStartDemo();
break;
case ACTION_BATTLE_DEMO:
executeBattleDemo();
break;
}
mSound.setLinkSearch(false);
fopAcM_posMoveF(this, NULL);
if (mAction != 10 || mMode != 0) {
if (player->current.pos.absXZ(field_0x69c) < 3000.0f) {
player->onBossRoomWait();
}
if (mAction != 9) {
mSound.startCreatureSoundLevel(Z2SE_EN_YM_NEAR, 0, -1);
}
if (field_0x765 != 0) {
Z2GetAudioMgr()->changeSubBgmStatus(3);
}
f32 fVar1 = mpModelMorf->getModel()->getAnmMtx(15)[1][3] - field_0x6cc;
if (fVar1 > 0.0f) {
cLib_chaseF(&field_0x6c4, 255.0f, 10.0f);
field_0x6c1 = 0;
} else {
fVar1 = fVar1 / 40.0f + 50.0f;
if (fVar1 < 10.0f) {
fVar1 = 10.0f;
}
cLib_chaseF(&field_0x6c4, fVar1, 10.0f);
field_0x6c1 = 1;
}
setFlyBlurEffect();
}
mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
mpBrkAnm->play();
}
/* 8081FF88-808200A0 009F68 0118+00 1/1 0/0 0/0 .text mtx_set__9daE_YMB_cFv */
void daE_YMB_c::mtx_set() {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
mDoMtx_stack_c::transM(0.0f, 0.0f, -250.0f);
mDoMtx_stack_c::XrotM(field_0x6ea);
mDoMtx_stack_c::transM(0.0f, 0.0f, 250.0f);
mpModelMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
mpModelMorf->modelCalc();
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(1));
mDoMtx_stack_c::ZXYrotM(0, -0x4000, 0);
MTXCopy(mDoMtx_stack_c::get(), field_0x768);
if (mpBgW != NULL) {
mpBgW->Move();
}
}
/* 808200A0-80820128 00A080 0088+00 3/3 0/0 0/0 .text getBellyBitePos__9daE_YMB_cFP4cXyz */
void daE_YMB_c::getBellyBitePos(cXyz* i_pos) {
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(16));
mDoMtx_stack_c::transM(80.0f, -120.0f, 0.0f);
mDoMtx_stack_c::multVecZero(i_pos);
}
/* 80820128-808203D8 00A108 02B0+00 2/2 0/0 0/0 .text getDownLockPoint__9daE_YMB_cFv */
int daE_YMB_c::getDownLockPoint() {
// NONMATCHING
if (field_0x6f4 >= 7) {
return 1;
}
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz sp54;
int uVar1 = field_0x6f4 - 1;
int var_r26 = 0;
f32 fVar1 = 3000.0f;
s16 sVar1 = 0x4000;
f32 fVar2;
if (player->getCutType() != daPy_py_c::CUT_TYPE_WOLF_LOCK && field_0x718 == 0) {
for (int i = 0; i < 6; i++) {
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(YMB_DOWN_ATT_JNT[i]));
mDoMtx_stack_c::multVecZero(&sp54);
fVar2 = sp54.abs(player->current.pos);
if (fVar2 < fVar1 || fVar2 < 300.0f) {
fVar1 = fVar2;
if (fVar1 < 500.0f) {
fVar1 = 500.0f;
s16 spd_0x8 = abs((s16)(cLib_targetAngleY(&player->current.pos, &sp54) - player->shape_angle.y));
if (spd_0x8 >= sVar1) {
continue;
}
sVar1 = spd_0x8;
var_r26 = i;
} else {
var_r26 = i;
}
}
}
if (dComIfGp_getAttention()->LockonTruth()) {
if (dComIfGp_getAttention()->LockonTarget(0) == this) {
var_r26 = field_0x725;
}
}
field_0x725 = var_r26;
uVar1 = var_r26;
}
if (uVar1 >= 6) {
uVar1 = 5;
}
return YMB_DOWN_ATT_JNT[uVar1];
}
/* 808203D8-80820668 00A3B8 0290+00 1/1 0/0 0/0 .text setAttentionPos__9daE_YMB_cFv */
void daE_YMB_c::setAttentionPos() {
cXyz sp2c;
cXyz sp38(daPy_getPlayerActorClass()->current.pos);
J3DModel* model = mpModelMorf->getModel();
if (getMaxLockAttack() <= field_0x6f4) {
attention_info.flags = 0;
}
if (field_0x6f4 == 0) {
mDoMtx_stack_c::copy(model->getAnmMtx(1));
if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_WOLF_JUMP || mAction == 7) {
mDoMtx_stack_c::transM(200.0f, 50.0f, 0.0f);
} else {
mDoMtx_stack_c::transM(100.0f, 50.0f, 0.0f);
}
mDoMtx_stack_c::multVecZero(&attention_info.position);
attention_info.position.y += 50.0f;
field_0x720 = 16;
getBellyBitePos(&sp2c);
field_0xa9c.SetC(sp2c);
field_0xa9c.SetR(100.0f);
dComIfG_Ccsp()->Set(&field_0xa9c);
eyePos = sp2c;
} else {
if (field_0x6f4 >= 7) {
mDoMtx_stack_c::copy(model->getAnmMtx(1));
} else {
mDoMtx_stack_c::copy(model->getAnmMtx(getDownLockPoint()));
}
mDoMtx_stack_c::multVecZero(&eyePos);
attention_info.position = eyePos;
attention_info.position.y += 50.0f;
for (int i = 0; i < 6; i++) {
mDoMtx_stack_c::copy(model->getAnmMtx(i * 2 + 20));
mDoMtx_stack_c::multVecZero(&sp2c);
field_0xbd4[i].SetC(sp2c);
field_0xbd4[i].SetR(50.0f);
dComIfG_Ccsp()->Set(&field_0xbd4[i]);
}
}
setBitePos(16);
}
/* 80820668-808207AC 00A648 0144+00 1/1 0/0 0/0 .text cc_set__9daE_YMB_cFv */
void daE_YMB_c::cc_set() {
cXyz sp28;
J3DModel* model = mpModelMorf->getModel();
setAttentionPos();
mDoMtx_stack_c::copy(model->getAnmMtx(1));
mDoMtx_stack_c::multVecZero(&sp28);
field_0x82c[0].SetC(sp28);
field_0x82c[0].SetR(l_HIO.model_size * 180.0f);
dComIfG_Ccsp()->Set(&field_0x82c[0]);
mDoMtx_stack_c::copy(model->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&sp28);
field_0x82c[1].SetC(sp28);
field_0x82c[1].SetR(l_HIO.model_size * 240.0f);
dComIfG_Ccsp()->Set(&field_0x82c[1]);
field_0x1324.SetC(sp28);
field_0x1324.SetR(l_HIO.model_size * 360.0f);
dComIfG_Ccsp()->Set(&field_0x1324);
}
/* 808207AC-80820A18 00A78C 026C+00 1/1 0/0 0/0 .text execute__9daE_YMB_cFv */
int daE_YMB_c::execute() {
BOOL bVar1 = FALSE;
if (mAction == 9 || ((mAction == 8 && mMode >= 3) || daPy_py_c::checkNowWolfEyeUp())) {
bVar1 = TRUE;
}
if (bVar1) {
cLib_chaseF(&field_0x6d8, 255.0f, 8.0f);
cLib_chaseF(&field_0x6dc, 150.0f, 6.0f);
} else {
cLib_chaseF(&field_0x6d8, 0.0f, 20.0f);
cLib_chaseF(&field_0x6dc, 0.0f, 15.0f);
}
if (dComIfGp_event_runCheck() && !eventInfo.checkCommandDemoAccrpt()) {
return 1;
}
if (field_0x6fc != 0) {
field_0x6fc--;
}
if (field_0x700 != 0) {
field_0x700--;
}
if (field_0x6f8 != 0) {
field_0x6f8--;
}
if (field_0x704 != 0) {
field_0x704--;
}
if (field_0x708 != 0) {
field_0x708--;
}
if (field_0x70c != 0) {
field_0x70c--;
}
if (field_0x723 != 0) {
field_0x723--;
if (field_0x723 == 0) {
field_0x722 = 0;
}
}
for (int i = 0; i < 6; i++) {
if (field_0x680[i] != 0) {
field_0x680[i]--;
cLib_addCalc(&field_0x668[i], 1.0f, 0.5f, 0.3f, 0.01f);
} else {
cLib_addCalc(&field_0x668[i], 0.0f, 0.5f, 0.3f, 0.01f);
}
}
if (field_0x698 != 0) {
field_0x698--;
}
if (field_0x724 != 0) {
field_0x724--;
}
if (field_0x764 == 0 || !field_0x6d8 || mAction == 9) {
attention_info.flags &= ~fopAc_AttnFlag_BATTLE_e;
} else {
attention_info.flags |= fopAc_AttnFlag_BATTLE_e;
}
action();
mtx_set();
cc_set();
return 1;
}
/* 80820A18-80820A38 00A9F8 0020+00 2/1 0/0 0/0 .text daE_YMB_Execute__FP9daE_YMB_c */
static int daE_YMB_Execute(daE_YMB_c* i_this) {
return i_this->execute();
}
/* 80820A38-80820A40 00AA18 0008+00 1/0 0/0 0/0 .text daE_YMB_IsDelete__FP9daE_YMB_c */
static int daE_YMB_IsDelete(daE_YMB_c* i_this) {
return 1;
}
/* 80820A40-80820AD0 00AA20 0090+00 1/1 0/0 0/0 .text _delete__9daE_YMB_cFv */
int daE_YMB_c::_delete() {
dComIfG_resDelete(&mPhase, "E_YB");
if (field_0x1520 != 0) {
l_initHIO = 0;
}
if (heap != NULL) {
mSound.deleteObject();
}
if (mpBgW != NULL) {
dComIfG_Bgsp().Release(mpBgW);
}
return 1;
}
/* 80820AD0-80820AF0 00AAB0 0020+00 1/0 0/0 0/0 .text daE_YMB_Delete__FP9daE_YMB_c */
static int daE_YMB_Delete(daE_YMB_c* i_this) {
return i_this->_delete();
}
/* 80820AF0-80820D68 00AAD0 0278+00 1/1 0/0 0/0 .text CreateHeap__9daE_YMB_cFv */
int daE_YMB_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_YB", BMDR_YB_TW);
JUT_ASSERT(4196, modelData != 0);
mpModelMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_YB", BCK_YB_FLY_WAIT),
2, 1.0f, 0, -1, &mSound, 0x80000, 0x31000084);
if (mpModelMorf == NULL || mpModelMorf->getModel() == NULL) {
return 0;
}
if (mInvisModel.create(mpModelMorf->getModel(), 1) == 0) {
return 0;
}
J3DModel* model = mpModelMorf->getModel();
model->setUserArea((uintptr_t)this);
for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) {
model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack);
}
mpBrkAnm = new mDoExt_brkAnm();
if (mpBrkAnm == NULL) {
return 0;
}
if (mpBrkAnm->init(mpModelMorf->getModel()->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("E_YB", BRK_YB_WAIT), 1, 2, 1.0f, 0, -1) == 0) {
return 0;
}
mpBgW = new dBgW();
if (mpBgW == NULL) {
return 0;
}
if (mpBgW->Set((cBgD_t*)dComIfG_getObjectRes("E_YB", DZB_YB), 1, &field_0x768) == 1) {
return 0;
}
mpBgW->SetCrrFunc(dBgS_MoveBGProc_Typical);
return 1;
}
/* 80820DB0-80820DD0 00AD90 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
static int useHeapInit(fopAc_ac_c* a_this) {
daE_YMB_c* i_this = (daE_YMB_c*)a_this;
return i_this->CreateHeap();
}
/* 80820DD0-808211BC 00ADB0 03EC+00 1/1 0/0 0/0 .text create__9daE_YMB_cFv */
cPhs__Step daE_YMB_c::create() {
fopAcM_SetupActor(this, daE_YMB_c);
mSwitchBit = fopAcM_GetParam(this);
if (mSwitchBit != 0xFF) {
if (dComIfGs_isSwitch(mSwitchBit, fopAcM_GetRoomNo(this))) {
// E_YMB I'm not going to reset it because I've been defeated\n
OS_REPORT("E_YMB やられ後なので再セットしません\n");
return cPhs_ERROR_e;
}
}
cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&mPhase, "E_YB");
if (phase == cPhs_COMPLEATE_e) {
OS_REPORT("E_YMB PARAM %x\n", fopAcM_GetParam(this));
if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x5200)) {
return cPhs_ERROR_e;
}
if (mpBgW != NULL) {
if (dComIfG_Bgsp().Regist(mpBgW, this)) {
return cPhs_ERROR_e;
}
}
mpBgW->SetRideCallback(rideCallBack);
if (l_initHIO == 0) {
l_initHIO = 1;
field_0x1520 = 1;
l_HIO.field_0x4 = -1;
}
attention_info.flags = fopAc_AttnFlag_BATTLE_e;
attention_info.field_0xa = 0x50;
fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx());
fopAcM_SetMin(this, -400.0f, -400.0f, -400.0f);
fopAcM_SetMax(this, 400.0f, 400.0f, 400.0f);
health = 100;
field_0x560 = 100;
mStts.Init(0xFF, 0, this);
field_0x82c[0].Set(cc_ymb_src);
field_0x82c[0].SetStts(&mStts);
field_0x82c[1].Set(cc_ymb_src);
field_0x82c[1].SetStts(&mStts);
field_0x1324.Set(cc_ymb_at_src);
field_0x1324.SetStts(&mStts);
field_0xa9c.Set(cc_ymb_eye_src);
field_0xa9c.SetStts(&mStts);
for (int i = 0; i < 6; i++) {
field_0xbd4[i].Set(cc_ymb_tube_src);
field_0xbd4[i].SetStts(&mStts);
}
mSound.init(&current.pos, &eyePos, 5, 1);
mSound.setEnemyName("E_ymb");
mAtInfo.mpSound = &mSound;
mAtInfo.mPowerType = 1;
gravity = 0.0f;
field_0x69c = home.pos;
field_0x717 = 1;
mAction = 10;
if (mpBgW != NULL) {
dComIfG_Bgsp().Release(mpBgW);
}
daE_YMB_Execute(this);
}
return phase;
}
/* 808213F8-80821418 00B3D8 0020+00 1/0 0/0 0/0 .text daE_YMB_Create__FP9daE_YMB_c */
static int daE_YMB_Create(daE_YMB_c* i_this) {
return i_this->create();
}
AUDIO_INSTANCES;
/* 80821D74-80821D94 -00001 0020+00 1/0 0/0 0/0 .data l_daE_YMB_Method */
static actor_method_class l_daE_YMB_Method = {
(process_method_func)daE_YMB_Create,
(process_method_func)daE_YMB_Delete,
(process_method_func)daE_YMB_Execute,
(process_method_func)daE_YMB_IsDelete,
(process_method_func)daE_YMB_Draw,
};
/* 80821D94-80821DC4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_YMB */
extern actor_process_profile_definition g_profile_E_YMB = {
fpcLy_CURRENT_e, // mLayerID
7, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_E_YMB, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(daE_YMB_c), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
196, // mPriority
&l_daE_YMB_Method, // sub_method
0x00044000, // mStatus
fopAc_ENEMY_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};