Files
dusklight/src/d/actor/d_a_b_dr.cpp
T
LagoLunatic 4dc0cd9d09 Debug version now builds OK and all_source compiles (#2343)
* Fix missing arg to JUT_ASSERT

* Fix some MWCC version diff errors

* Compile m_Do_ext, d_demo, actor_mng

* Add VSCode task to quickly switch between versions

* Unlink magLift for debug

* Update the hash of the debug dol

The old cbea5fa... hash here was for the dol generated by the alf2dol.py script, which produces incorrect alignment.

The dol with the new hash can be obtained by using `dtk elf2dol` to convert the debug .alf file to a dol.

The DOL now builds OK.

* Fix all debug REL dtor splits

All RELs now also build OK, meaning `ninja build/ShieldD/ok` now succeeds.

* Add genMessage declarations to all HIO subclasses

* Fixing more compilation errors

* m_Do_mtx 100% on debug

Cannot be linked due to weak function name mangling?

* Improve various matches

* Fix all remaining compilation errors

* Fix new compilation errors from main

* Fix retail regression

* Link f_pc_profile_lst
2025-03-22 18:00:51 -07:00

4337 lines
132 KiB
C++

/**
* @file d_a_b_dr.cpp
*
*/
#include "d/actor/d_a_b_dr.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_player.h"
#include "d/d_menu_window.h"
#include "d/d_s_play.h"
#include "d/d_debug_viewer.h"
#include "d/actor/d_a_npc.h"
#include "d/d_camera.h"
#include "c/c_damagereaction.h"
#include "Z2AudioLib/Z2Instances.h"
#define ANM_DR_BOOT_A 0x10
#define ANM_DR_BOOT_A_DEMO 0x11
#define ANM_DR_BOOT_B 0x12
#define ANM_DR_BOOT_C 0x13
#define ANM_DR_BRAKE_TO_HOVER 0x14
#define ANM_DR_BRIDG_DESTROYA 0x15
#define ANM_DR_BRIDG_DESTROYB 0x16
#define ANM_DR_BURU 0x17
#define ANM_DR_CATCH 0x18
#define ANM_DR_CRAZY 0x19
#define ANM_DR_DAMAGE_L 0x1A
#define ANM_DR_DAMAGE_LAST 0x1B
#define ANM_DR_DAMAGE_R 0x1C
#define ANM_DR_DEATH 0x1D
#define ANM_DR_DEMO_DESTROY 0x1E
#define ANM_DR_DOWN_WAIT 0x1F
#define ANM_DR_FALL 0x20
#define ANM_DR_FALL_DEATH 0x21
#define ANM_DR_FALL_DOWN 0x22
#define ANM_DR_FALL_REVIVE 0x23
#define ANM_DR_FALL_SCREAM 0x24
#define ANM_DR_FEINT_A 0x25
#define ANM_DR_FEINT_B 0x26
#define ANM_DR_FEINT_C 0x27
#define ANM_DR_FIREA 0x28
#define ANM_DR_FIREB 0x29
#define ANM_DR_FIREC 0x2A
#define ANM_DR_FIRED 0x2B
#define ANM_DR_FIREE 0x2C
#define ANM_DR_FLAP 0x2D
#define ANM_DR_FLAP_TO_FLY 0x2E
#define ANM_DR_FLY 0x2F
#define ANM_DR_FLY_TO_GLIDE 0x30
#define ANM_DR_GLIDE 0x31
#define ANM_DR_GLIDE_BRAKE 0x32
#define ANM_DR_GLIDE_TO_FLY 0x33
#define ANM_DR_HOVER_TO_FLY 0x34
#define ANM_DR_HOVERING 0x35
#define ANM_DR_HOVERING_B 0x36
#define ANM_DR_IMPACT 0x37
#define ANM_DR_MID_WAKEUP 0x38
#define ANM_DR_OP_SCREAM 0x39
#define ANM_DR_POLE_STAYA 0x3A
#define ANM_DR_POLE_STAYB 0x3B
#define ANM_DR_POLE_STAYC 0x3C
#define ANM_DR_POLE_STAYD 0x3D
#define ANM_DR_RIDE 0x3E
#define ANM_DR_SHAKEA 0x3F
#define ANM_DR_SHAKEB 0x40
#define ANM_DR_TAKE_OFF 0x41
#define ANM_DR_TURN 0x42
#define ANM_DR_WIND_ATTACKA 0x43
#define ANM_DR_WIND_ATTACKATOB 0x44
#define ANM_DR_WIND_ATTACKB 0x45
#define ANM_DR_WIND_ATTACKBTOFLY 0x46
enum daB_DR_Action {
ACTION_WAIT,
ACTION_FLY_WAIT,
ACTION_TAIL_HIT,
ACTION_WEEK_HIT,
ACTION_WIND_ATTACK,
ACTION_BREATH_ATTACK,
ACTION_BREATH_ATTACK2,
ACTION_GLIDER_ATTACK,
ACTION_PILLAR_SEARCH,
ACTION_PILLAR_WAIT,
ACTION_DAMAGE_DEMO = 11,
ACTION_MIDDLE_DEMO,
ACTION_DEAD,
};
UNK_REL_DATA
namespace {
/* 805C7268-805C72AC 000020 0044+00 0/1 0/0 0/0 .data cc_dr_week_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcCyl cc_dr_week_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x4002, 0x43}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x302}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
40.0f, // mRadius
0.0f // mHeight
} // mCyl
};
/* 805C72AC-805C72EC 000064 0040+00 0/1 0/0 0/0 .data cc_dr_tail_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcSph cc_dr_tail_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x4000, 0x43}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x302}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
/* 805C72EC-805C732C 0000A4 0040+00 0/1 0/0 0/0 .data
* cc_dr_breath_at_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcSph cc_dr_breath_at_src = {
{
{0x0, {{0x100000, 0x4, 0xD}, {0x0, 0x0}, 0x0}}, // mObj
{dCcD_SE_13, 0x0, 0xD, dCcD_MTRL_FIRE, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
/* 805C732C-805C736C 0000E4 0040+00 0/1 0/0 0/0 .data cc_dr_wind_at_src__22@unnamed@d_a_b_dr_cpp@
*/
static dCcD_SrcSph cc_dr_wind_at_src = {
{
{0x0, {{0x200, 0x0, 0x1D}, {0x0, 0x0}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, dCcD_MTRL_WIND, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
/* 805C736C-805C73AC 000124 0040+00 0/1 0/0 0/0 .data cc_dr_foot_at_src__22@unnamed@d_a_b_dr_cpp@
*/
static dCcD_SrcSph cc_dr_foot_at_src = {
{
{0x0, {{0x400, 0x4, 0xD}, {0x0, 0x0}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0xD, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
/* 805C73AC-805C73F0 000164 0044+00 0/1 0/0 0/0 .data cc_pillar_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcCyl cc_pillar_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x4000, 0x43}, 0x15}}, // mObj
{dCcD_SE_NONE, 0x0, 0xD, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1407}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
40.0f, // mRadius
0.0f // mHeight
} // mCyl
};
/* 805C73F0-805C7434 0001A8 0044+00 0/1 0/0 0/0 .data cc_down_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcCyl cc_down_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0xD8FBFDFF, 0x43}, 0x15}}, // mObj
{dCcD_SE_13, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x1407}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
50.0f, // mRadius
300.0f // mHeight
} // mCyl
};
/* 805C7434-805C7474 0001EC 0040+00 0/1 0/0 0/0 .data cc_downSph_src__22@unnamed@d_a_b_dr_cpp@ */
static dCcD_SrcSph cc_downSph_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0xD8FBFDFF, 0x43}, 0x15}}, // mObj
{dCcD_SE_13, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x1407}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
}
/* 805BAE6C-805BAF80 0000EC 0114+00 1/1 0/0 0/0 .text __ct__12daB_DR_HIO_cFv */
daB_DR_HIO_c::daB_DR_HIO_c() {
field_0x4 = -1;
model_size = 0.8f;
fall_accel = 2.0f;
fall_accel_max = 50.0f;
wind_large_attack_lockon_range = 2000.0f;
wind_small_attack_power = 15.0f;
wind_attack_power = 25.0f;
glide_wind_power = 50.0f;
breath_attack_threshold = 1000.0f;
breath_move_speed_max = 20.0f;
breath_move_speed_min = 5.0f;
unk_0x2c = 10.0f;
unk_0x18 = 1800.0f;
tail_hit_chance_time = 180;
breath_continue_time = 50;
breath_continue_no_armor_time = 300;
unk_0x4c = 100;
breath_feint1_time = 240;
breath_feint2_time = 200;
breath_feint3_time = 300;
no_attack_time = 300;
no_attack_no_armor_time = 300;
center_wind_time = 450;
unk_0x48 = 450;
back_hit_chance_time = 150;
after_breath_chance_time = 390;
neck_search_speed = 450;
neck_search2_speed = 400;
neck_search_speed_max = 500;
body_search_speed = 15;
body_search2_speed = 1;
body_search_speed_max = 100;
body_search_feint_speed_max = 500;
feint_angle = 180;
unk_0x62 = 300;
display_range = false;
breath_feint2_OFF = true;
}
UNK_REL_BSS
/* 805C78FD 0003+00 l_initHIO None */
static u8 l_initHIO;
/* 805C790C-805C7974 000054 0068+00 18/18 0/0 0/0 .bss l_HIO */
static daB_DR_HIO_c l_HIO;
/* 805BAF80-805BB0E4 000200 0164+00 1/1 0/0 0/0 .text ctrlJoint__8daB_DR_cFP8J3DJointP8J3DModel */
int daB_DR_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
cXyz unused_sp20;
cXyz unused_sp14;
csXyz unused_spC;
int jnt_no = i_joint->getJntNo();
mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no));
switch (jnt_no) {
case 19:
mDoMtx_stack_c::YrotM(mHeadAngle.y);
mDoMtx_stack_c::ZrotM(mHeadAngle.x);
break;
case 18:
mDoMtx_stack_c::YrotM(mHeadAngle.y >> 1);
mDoMtx_stack_c::ZrotM(mHeadAngle.x >> 1);
break;
case 17:
mDoMtx_stack_c::YrotM(mHeadAngle.y >> 1);
mDoMtx_stack_c::ZrotM(mHeadAngle.x >> 1);
break;
}
if (jnt_no == TREG_S(0)) {
mDoMtx_stack_c::XrotM(TREG_S(1));
mDoMtx_stack_c::YrotM(TREG_S(2));
mDoMtx_stack_c::ZrotM(TREG_S(3));
}
i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
return 1;
}
/* 805BB120-805BB16C 0003A0 004C+00 1/1 0/0 0/0 .text JointCallBack__8daB_DR_cFP8J3DJointi */
int daB_DR_c::JointCallBack(J3DJoint* i_joint, int param_1) {
if (param_1 == 0) {
J3DModel* model_p = j3dSys.getModel();
daB_DR_c* dr_p = (daB_DR_c*)model_p->getUserArea();
if (dr_p != NULL) {
dr_p->ctrlJoint(i_joint, model_p);
}
}
return 1;
}
/* 805BB16C-805BB3E8 0003EC 027C+00 1/1 0/0 0/0 .text draw__8daB_DR_cFv */
int daB_DR_c::draw() {
if (BREG_S(6) == 0 && (arg0 == 0xA || arg0 == 0xFF || arg0 == 0xFE)) {
return 1;
}
if (arg0 == 0x14 || arg0 == 0x15) {
g_env_light.settingTevStruct(0, &current.pos, &tevStr);
g_env_light.setLightTevColorType_MAJI(mpPartModel, &tevStr);
if (mPartNo < 2) {
J3DShape* shape_p;
shape_p = mpPartModel->getModelData()->getMaterialNodePointer((u8)(mPartNo ^ 1))->getShape();
if (shape_p != NULL) {
shape_p->hide();
}
shape_p = mpPartModel->getModelData()->getMaterialNodePointer(mPartNo)->getShape();
if (shape_p != NULL) {
shape_p->show();
}
}
mDoExt_modelUpdateDL(mpPartModel);
return 1;
}
#ifdef DEBUG
if (WREG_S(0) != 0 || l_HIO.display_range) {
cXyz sp24;
cXyz sp18;
GXColor color;
color.r = 0x82;
color.g = 0xFA;
color.b = 0xFA;
color.a = 0xFA;
sp24.set(home.pos);
sp24.y += 40.0f;
sp24.x = -l_HIO.unk_0x18;
sp18.set(home.pos);
sp18.y += 40.0f;
sp18.x = l_HIO.unk_0x18;
dDbVw_drawLineXlu(sp24, sp18, color, TRUE, 12);
if (field_0x7d1 == 2 ||
mActionMode == ACTION_BREATH_ATTACK ||
mActionMode == ACTION_BREATH_ATTACK2 ||
mActionMode == ACTION_FLY_WAIT ||
mActionMode == ACTION_PILLAR_SEARCH ||
mActionMode == ACTION_PILLAR_WAIT ||
mActionMode == ACTION_GLIDER_ATTACK)
{
color.r = 0xFF;
color.g = 0x82;
color.b = 0x82;
color.a = 0xFA;
sp24.set(home.pos);
if (mActionMode == ACTION_FLY_WAIT || mActionMode == ACTION_PILLAR_WAIT || mActionMode == ACTION_GLIDER_ATTACK) {
sp24.set(current.pos);
}
if (mActionMode == ACTION_BREATH_ATTACK || mActionMode == ACTION_BREATH_ATTACK2) {
sp24.set(field_0x790);
field_0x7a8.set(field_0x784);
}
dDbVw_drawLineXlu(sp24, field_0x7a8, color, TRUE, 12);
color.r = 0x9B;
color.g = 0x82;
color.b = 0x82;
color.a = 0xFA;
dDbVw_drawLineXlu(field_0x7b4, field_0x7a8, color, TRUE, 12);
} else if (mActionMode == ACTION_WIND_ATTACK) {
color.r = 0xFF;
color.g = 0x82;
color.b = 0xFF;
color.a = 0xFA;
sp24.set(current.pos);
sp24.y = 10.0f + mAcch.GetGroundH();
dDbVw_drawCircleXlu(sp24, l_HIO.wind_large_attack_lockon_range, color, TRUE, 12);
}
color.r = 0xAA;
color.g = 0xAA;
color.b = 0xFA;
color.a = 0xFA;
sp24.set(home.pos);
sp24.y = l_HIO.breath_attack_threshold;
dDbVw_drawLineXlu(home.pos, sp24, color, TRUE, 12);
}
mAcch.DrawWall(dComIfG_Bgsp());
#endif
J3DModel* model_p = mpModelMorf->getModel();
g_env_light.settingTevStruct(0, &current.pos, &tevStr);
g_env_light.setLightTevColorType_MAJI(model_p, &tevStr);
if (field_0x7d1 != 0) {
for (int i = 1; i < mBreakPartsNo + 1; i++) {
static u8 mBreakDt[4] = {0, 3, 4, 2};
J3DShape* shape_p = mpModelMorf->getModel()->getModelData()->getMaterialNodePointer(mBreakDt[i])->getShape();
if (shape_p != NULL) {
shape_p->hide();
}
}
} else {
for (int i = 1; i < 4; i++) {
J3DShape* shape_p = mpModelMorf->getModel()->getModelData()->getMaterialNodePointer((u8)i)->getShape();
if (shape_p != NULL) {
shape_p->show();
}
}
}
mpCoreBrk->entry(model_p->getModelData());
mpModelMorf->entryDL();
cXyz pos;
pos.set(current.pos.x, 10.0f + current.pos.y, current.pos.z);
mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model_p, &pos, 6000.0f + BREG_F(19), 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
return 1;
}
/* 805BB3E8-805BB408 000668 0020+00 1/0 0/0 0/0 .text daB_DR_Draw__FP8daB_DR_c */
static int daB_DR_Draw(daB_DR_c* i_this) {
return i_this->draw();
}
/* 805BB408-805BB4B4 000688 00AC+00 11/11 0/0 0/0 .text setBck__8daB_DR_cFiUcff */
void daB_DR_c::setBck(int i_anm, u8 i_mode, f32 i_morf, f32 i_speed) {
mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("B_DR", i_anm), i_mode, i_morf, i_speed, 0.0f, -1.0f);
mAnm = i_anm;
}
/* 805BB4B4-805BB4CC 000734 0018+00 13/13 0/0 0/0 .text setActionMode__8daB_DR_cFii */
void daB_DR_c::setActionMode(int i_action, int i_mode) {
if (mActionMode != i_action) {
mActionMode = i_action;
mMoveMode = i_mode;
}
}
/* 805BB4CC-805BB540 00074C 0074+00 1/1 0/0 0/0 .text mGlider_WindPosSet__8daB_DR_cFv */
void daB_DR_c::mGlider_WindPosSet() {
cXyz mae;
cMtx_YrotS(*calc_mtx, shape_angle.y);
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = JREG_F(2) + -1000.0f;
MtxPosition(&mae, &mGlider_WindPos);
mGlider_WindPos += current.pos;
}
/* 805BB540-805BB64C 0007C0 010C+00 2/2 0/0 0/0 .text mBoot_c_tranceSet__8daB_DR_cFb */
void daB_DR_c::mBoot_c_tranceSet(bool param_0) {
cXyz mae;
cXyz ato;
if (!param_0) {
if (mAnm == ANM_DR_BOOT_C && (int)mpModelMorf->getFrame() <= 45) {
cMtx_YrotS(*calc_mtx, shape_angle.y);
mae.x = -500.0f;
mae.y = 0.0f;
mae.z = 500.0f;
MtxPosition(&mae, &ato);
mBoot_c_trance.x += ato.x / 45.0f;
mBoot_c_trance.y += ato.y / 45.0f;
mBoot_c_trance.z += ato.z / 45.0f;
}
} else {
ato.zero();
cLib_addCalcPos(&mBoot_c_trance, ato, 0.8f, 20.0f, 5.0f);
}
}
/* 805BB64C-805BB6E8 0008CC 009C+00 9/9 0/0 0/0 .text mStatusONOFF__8daB_DR_cFi */
void daB_DR_c::mStatusONOFF(int i_status) {
switch (i_status) {
case 0:
attention_info.distances[fopAc_attn_BATTLE_e] = 0;
attention_info.flags &= ~4;
fopAcM_OffStatus(this, 0);
fopAcM_OffStatus(this, 0x200000);
return;
case 1:
attention_info.distances[fopAc_attn_BATTLE_e] = 85;
attention_info.flags |= 4;
fopAcM_OnStatus(this, 0);
fopAcM_OnStatus(this, 0x200000);
return;
case 2:
attention_info.distances[fopAc_attn_BATTLE_e] = 60;
fopAcM_OnStatus(this, 0);
fopAcM_OffStatus(this, 0x200000);
attention_info.flags |= 4;
return;
}
}
/* 805BB6E8-805BBFC0 000968 08D8+00 2/1 0/0 0/0 .text setSe__8daB_DR_cFv */
void daB_DR_c::setSe() {
bool play_wing_se = false;
switch (mAnm) {
case ANM_DR_FEINT_A:
if (mpModelMorf->checkFrame(14)) {
play_wing_se = true;
}
break;
case ANM_DR_FEINT_B:
if (mpModelMorf->checkFrame(3)) {
play_wing_se = true;
}
break;
case ANM_DR_FEINT_C:
if (mpModelMorf->checkFrame(18)) {
play_wing_se = true;
}
break;
case ANM_DR_RIDE:
if (mpModelMorf->checkFrame(1)) {
play_wing_se = true;
}
break;
case ANM_DR_HOVERING_B:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_HOVERING, -1);
}
if (mpModelMorf->checkFrame(5) || mpModelMorf->checkFrame(30)) {
play_wing_se = true;
}
break;
case ANM_DR_POLE_STAYD:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_POLE_STAY, -1);
}
if (mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(76)) {
play_wing_se = true;
}
break;
case ANM_DR_FIREB:
if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(42)) {
play_wing_se = true;
}
break;
case ANM_DR_FIREA:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_FIRE_A, -1);
}
if (mpModelMorf->checkFrame(12) || mpModelMorf->checkFrame(55) || mpModelMorf->checkFrame(103) || mpModelMorf->checkFrame(143)) {
play_wing_se = true;
}
break;
case ANM_DR_BURU:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureSound(Z2SE_EN_DR_BREAK_ARMOR, 0, -1);
}
if (mpModelMorf->checkFrame(7) || mpModelMorf->checkFrame(40) || mpModelMorf->checkFrame(75) || mpModelMorf->checkFrame(143) || mpModelMorf->checkFrame(177) || mpModelMorf->checkFrame(210) || mpModelMorf->checkFrame(243) || mpModelMorf->checkFrame(270) || mpModelMorf->checkFrame(309)) {
play_wing_se = true;
}
break;
case ANM_DR_DAMAGE_L:
case ANM_DR_DAMAGE_R:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_DAMAGE, -1);
}
break;
case ANM_DR_DAMAGE_LAST:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_DAMAGE_LAST, -1);
}
break;
case ANM_DR_FALL:
mSound.startCreatureSoundLevel(Z2SE_EN_DR_FALL, 0, -1);
break;
case ANM_DR_GLIDE:
case ANM_DR_GLIDE_BRAKE:
case ANM_DR_WIND_ATTACKB:
mSound.startCreatureSoundLevel(Z2SE_EN_DR_GLIDE, 0, -1);
break;
case ANM_DR_FLAP:
if (mpModelMorf->checkFrame(5)) {
if (field_0x7da == 0) {
play_wing_se = true;
field_0x7da = 1;
}
} else {
field_0x7da = 0;
}
break;
case ANM_DR_BOOT_A:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_BOOT_A, -1);
}
case ANM_DR_BRAKE_TO_HOVER:
case ANM_DR_FIREE:
case ANM_DR_GLIDE_TO_FLY:
case ANM_DR_POLE_STAYA:
case ANM_DR_WIND_ATTACKA:
case ANM_DR_WIND_ATTACKATOB:
if (mpModelMorf->checkFrame(5)) {
play_wing_se = true;
}
break;
case ANM_DR_BOOT_A_DEMO:
if (mpModelMorf->checkFrame(53)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_BOOT_A, -1);
}
if (mpModelMorf->checkFrame(76) || mpModelMorf->checkFrame(95) || mpModelMorf->checkFrame(115)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_BOOT_B, -1);
}
if (mpModelMorf->checkFrame(14) || mpModelMorf->checkFrame(55) || mpModelMorf->checkFrame(72) || mpModelMorf->checkFrame(88) || mpModelMorf->checkFrame(107)) {
play_wing_se = true;
}
break;
case ANM_DR_BOOT_B:
if (mpModelMorf->checkFrame(0)) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_BOOT_B, -1);
}
if (mpModelMorf->checkFrame(1) || mpModelMorf->checkFrame(17)) {
play_wing_se = true;
}
break;
case ANM_DR_CATCH:
if (mpModelMorf->checkFrame(10)) {
play_wing_se = true;
}
break;
case ANM_DR_FIREC:
if (mpModelMorf->checkFrame(14)) {
play_wing_se = true;
}
break;
case ANM_DR_FIRED:
if (mpModelMorf->checkFrame(6) || mpModelMorf->checkFrame(36)) {
play_wing_se = true;
}
break;
case ANM_DR_FLY:
case ANM_DR_FLY_TO_GLIDE:
if (mpModelMorf->checkFrame(8)) {
play_wing_se = true;
}
break;
case ANM_DR_HOVERING:
case ANM_DR_TURN:
if (mpModelMorf->checkFrame(7)) {
play_wing_se = true;
}
break;
case ANM_DR_POLE_STAYC:
if (mpModelMorf->checkFrame(9)) {
play_wing_se = true;
}
break;
case ANM_DR_SHAKEA:
if (mpModelMorf->checkFrame(5) || mpModelMorf->checkFrame(21)) {
play_wing_se = true;
}
break;
case ANM_DR_SHAKEB:
if (mpModelMorf->checkFrame(5) || mpModelMorf->checkFrame(26)) {
play_wing_se = true;
}
break;
case ANM_DR_TAKE_OFF:
if (mpModelMorf->checkFrame(31) || mpModelMorf->checkFrame(53)) {
play_wing_se = true;
}
break;
case ANM_DR_WIND_ATTACKBTOFLY:
if (mpModelMorf->checkFrame(10)) {
play_wing_se = true;
}
break;
}
if (play_wing_se) {
mSound.startCreatureSound(Z2SE_EN_DR_WING, 0, -1);
}
}
/* 805BBFC0-805BC0B8 001240 00F8+00 1/1 0/0 0/0 .text setDeathLightEffect__8daB_DR_cFv */
void daB_DR_c::setDeathLightEffect() {
for (int i = 0; i < 4; i++) {
static u16 w_eff_id[] = {0x854C, 0x854D, 0x854E, 0x854F};
dComIfGp_particle_set(w_eff_id[i], &current.pos, &tevStr, NULL, NULL);
}
fopAcM_seStart(this, JA_SE_CM_MONS_EXPLODE, 0);
}
/* 805BC0B8-805BC248 001338 0190+00 3/3 0/0 0/0 .text chkPartCreate__8daB_DR_cFb */
void daB_DR_c::chkPartCreate(bool param_0) {
static const struct {
int jnt_no;
int prm;
f32 size;
} BREAK_PARTS_DT[] = {
{17, 0, 1.0f},
{17, 1, 1.0f},
{18, 0, 1.0f},
{18, 1, 1.0f},
{19, 0, 1.0f},
{19, 1, 1.0f},
{2, 0, 1.0f},
{2, 1, 1.0f},
{43, 0, 1.0f},
{43, 1, 1.0f},
{44, 0, 0.5f},
{44, 1, 0.5f},
{45, 0, 0.5f},
{45, 1, 0.5f},
{46, 0, 0.5f},
{46, 1, 0.5f},
{6, 4, 1.0f},
{18, 0, 1.0f},
{18, 1, 1.0f},
{19, 0, 1.0f},
{19, 1, 1.0f},
{16, 0, 1.0f},
{16, 1, 1.0f},
{26, 0, 1.0f},
{26, 1, 1.0f},
{43, 0, 1.0f},
{43, 1, 1.0f},
{46, 0, 0.5f},
{46, 1, 0.5f},
{12, 5, 1.0f},
{19, 2, 1.0f},
{18, 0, 1.0f},
{18, 1, 1.0f},
{17, 0, 1.0f},
{17, 1, 1.0f},
{16, 0, 1.0f},
{16, 1, 1.0f},
{16, 0, 1.0f},
{16, 1, 1.0f},
{26, 0, 1.0f},
{26, 1, 1.0f},
{26, 0, 1.0f},
{26, 1, 1.0f},
{26, 0, 1.0f},
{26, 1, 1.0f},
{43, 0, 1.0f},
{43, 1, 1.0f},
{44, 0, 0.5f},
{44, 1, 0.5f},
{45, 0, 0.5f},
{45, 1, 0.5f},
{46, 0, 0.5f},
{46, 1, 0.5f},
{47, 3, 1.0f},
};
cXyz pos;
cXyz size;
csXyz rot;
int part_no = 0;
int var_r27 = 0;
int part_max = 0;
if (param_0 || field_0x7d1 != 2) {
int break_no = mBreakPartsNo;
if (param_0) {
break_no = 3;
}
switch (break_no) {
case 1:
part_no = field_0x7e0;
part_max = 17;
break;
case 2:
part_no = field_0x7e0 + 17;
part_max = 30;
break;
case 3:
part_no = field_0x7e0 + 30;
part_max = 54;
break;
}
if (part_no >= part_max) {
return;
}
for (; part_no < part_max && var_r27 < 4; var_r27++) {
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(BREAK_PARTS_DT[part_no].jnt_no));
mDoMtx_stack_c::multVecZero(&pos);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &rot);
int prm = 0x14;
if (break_no == 3) {
prm = 0x15;
}
prm |= (BREAK_PARTS_DT[part_no].prm << 8);
size.x = size.y = size.z = BREAK_PARTS_DT[part_no].size;
fopAcM_create(PROC_B_DR, prm, &pos, fopAcM_GetRoomNo(this), &rot, &size, -1);
field_0x7e0++;
part_no++;
}
}
}
/* 805BC248-805BC57C 0014C8 0334+00 7/6 0/0 0/0 .text mHabatakiAnmSet__8daB_DR_cFi */
void daB_DR_c::mHabatakiAnmSet(int param_0) {
switch (mAnm) {
case ANM_DR_FLY_TO_GLIDE:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_GLIDE, 2, 3.0f, 1.0f);
}
break;
case ANM_DR_GLIDE_TO_FLY:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_BRAKE_TO_HOVER, 0, 3.0f, 1.0f);
}
break;
case ANM_DR_GLIDE:
setBck(ANM_DR_BRAKE_TO_HOVER, 0, 3.0f, 1.0f);
break;
case ANM_DR_FLY:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
setBck(ANM_DR_BRAKE_TO_HOVER, 0, l_HIO.unk_0x2c, 1.0f);
}
break;
case ANM_DR_FLAP:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
if (param_0 != 5 && param_0 != 6) {
setBck(ANM_DR_FLAP_TO_FLY, 0, 3.0f, 1.0f);
} else {
setBck(ANM_DR_HOVERING, 2, 3.0f, 1.0f);
}
}
break;
case ANM_DR_FLAP_TO_FLY:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_FLY, 2, 10.0f, 1.0f);
}
break;
case ANM_DR_BRAKE_TO_HOVER:
if (mpModelMorf->isStop()) {
if (param_0 != 4) {
goto lbl_805bc4e0; // fakematch?
}
setBck(ANM_DR_FLAP, 2, 3.0f, 1.0f);
}
break;
default:
lbl_805bc4e0:
setBck(ANM_DR_HOVERING, 2, 3.0f, 1.0f);
case ANM_DR_HOVERING:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f) && param_0 == 4) {
setBck(ANM_DR_FLAP, 2, 3.0f, 1.0f);
}
break;
}
}
/* 805BC57C-805BC8B4 0017FC 0338+00 3/2 0/0 0/0 .text mGlider_AniSet__8daB_DR_cFb */
void daB_DR_c::mGlider_AniSet(bool param_0) {
if (param_0 && mTimer[0] != 0 && mAnm == ANM_DR_FLY) {
mTimer[0] = 0;
}
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
switch (mAnm) {
case ANM_DR_WIND_ATTACKB:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
setBck(ANM_DR_WIND_ATTACKBTOFLY, 2, 3.0f, 1.0f);
}
break;
case ANM_DR_HOVERING:
case ANM_DR_WIND_ATTACKBTOFLY:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
if (mAnm == ANM_DR_WIND_ATTACKBTOFLY) {
setBck(ANM_DR_FLY, 2, 5.0f, 1.0f);
} else {
setBck(ANM_DR_FLY, 2, 20.0f, 1.0f);
}
}
break;
case ANM_DR_FLY:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
setBck(ANM_DR_FLY_TO_GLIDE, 0, 3.0f, 1.0f);
}
break;
case ANM_DR_FLY_TO_GLIDE:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_GLIDE, 2, 3.0f, 1.0f);
mTimer[0] = cM_rndF(50.0f) + 50.0f;
}
break;
case ANM_DR_GLIDE:
if (!param_0) {
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
setBck(ANM_DR_GLIDE_TO_FLY, 0, 3.0f, 1.0f);
}
}
break;
case ANM_DR_FLAP_TO_FLY:
case ANM_DR_GLIDE_TO_FLY:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_FLY, 2, 3.0f, 1.0f);
mTimer[0] = cM_rndF(34.0f) + 34.0f;
}
break;
}
}
}
/* 805BC8B4-805BCA10 001B34 015C+00 2/1 0/0 0/0 .text mGliderAtAniSet__8daB_DR_cFv */
void daB_DR_c::mGliderAtAniSet() {
switch (mAnm) {
case ANM_DR_FLY_TO_GLIDE:
case ANM_DR_GLIDE_TO_FLY:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_WIND_ATTACKATOB, 0, 3.0f, 1.0f);
}
break;
case ANM_DR_GLIDE:
setBck(ANM_DR_WIND_ATTACKATOB, 0, 3.0f, 1.0f);
break;
case ANM_DR_FLY:
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f)) {
setBck(ANM_DR_WIND_ATTACKATOB, 0, 3.0f, 1.0f);
}
break;
case ANM_DR_WIND_ATTACKATOB:
if (mpModelMorf->isStop()) {
field_0x7d8 = 0;
setBck(ANM_DR_WIND_ATTACKB, 2, 3.0f, 1.0f);
}
break;
}
}
/* 805BCA10-805BCAD4 001C90 00C4+00 1/1 0/0 0/0 .text tail_hit_check__8daB_DR_cFv */
void daB_DR_c::tail_hit_check() {
if (health > 0) {
daPy_getPlayerActorClass()->onBossRoomWait();
if (fopAcM_checkStatus(this, 0x200000) && cLib_calcTimer<u8>(&field_0x7d0) == 0 && mActionMode != ACTION_TAIL_HIT && field_0x7d1 != 2) {
if (mTailCc.ChkTgHit()) {
speedF = 0.0f;
dComIfGs_onZoneSwitch(21, fopAcM_GetRoomNo(this));
setActionMode(ACTION_TAIL_HIT, 0);
}
mColliderStts.Move();
}
}
}
/* 805BCAD4-805BCBD0 001D54 00FC+00 1/1 0/0 0/0 .text week_hit_check__8daB_DR_cFv */
void daB_DR_c::week_hit_check() {
if (mWeekCc.ChkTgSet()) {
daPy_getPlayerActorClass()->onBossRoomWait();
if (health > 0 && fopAcM_checkStatus(this, 0x200000) && cLib_calcTimer<u8>(&field_0x7d0) == 0 && mActionMode != ACTION_WEEK_HIT && field_0x7d1 == 2) {
if (mWeekCc.ChkTgHit() && mWeekCc.GetTgHitObj()->ChkAtType(AT_TYPE_HOOKSHOT)) {
speedF = 0.0f;
Z2GetAudioMgr()->changeBgmStatus(2);
field_0x560 = health;
field_0x7e8 = 0;
setActionMode(ACTION_WEEK_HIT, 0);
}
mColliderStts.Move();
}
}
}
/* 805BCBD0-805BCBF4 001E50 0024+00 1/1 0/0 0/0 .text mTimerClr__8daB_DR_cFv */
void daB_DR_c::mTimerClr() {
for (int i = 0; i < 4; i++) {
mTimer[i] = 0;
}
}
/* 805BCBF4-805BCC18 001E74 0024+00 1/1 0/0 0/0 .text mCountClr__8daB_DR_cFv */
void daB_DR_c::mCountClr() {
for (int i = 0; i < 4; i++) {
mCount[i] = 0;
}
}
/* 805BCC18-805BCC4C 001E98 0034+00 12/12 0/0 0/0 .text mAllClr__8daB_DR_cFv */
void daB_DR_c::mAllClr() {
mTimerClr();
mCountClr();
}
/* 805BCC4C-805BCD7C 001ECC 0130+00 1/1 0/0 0/0 .text mHeadAngleSet__8daB_DR_cFv */
void daB_DR_c::mHeadAngleSet() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz unused;
if (field_0x7d6 == 0) {
s16 target_angle_y = -(cLib_targetAngleY(&field_0x760, &player->current.pos) - shape_angle.y);
s16 target_angle_x = -cLib_targetAngleX(&field_0x760, &player->current.pos);
if (mActionMode != ACTION_PILLAR_WAIT) {
if (target_angle_y > 0x1000) {
target_angle_y = 0x1000;
}
if (target_angle_y < -0x1000) {
target_angle_y = -0x1000;
}
} else {
if (target_angle_y > 0x2000) {
target_angle_y = 0x2000;
}
if (target_angle_y < -0x2000) {
target_angle_y = -0x2000;
}
}
if (target_angle_x > 0x1000) {
target_angle_x = 0x1000;
}
if (target_angle_x < -0x1000) {
target_angle_x = -0x1000;
}
cLib_addCalcAngleS2(&mHeadAngle.y, target_angle_y, 8, 0x500);
cLib_addCalcAngleS2(&mHeadAngle.x, target_angle_x, 8, 0x500);
} else {
cLib_addCalcAngleS2(&mHeadAngle.y, 0, 8, 0x500);
cLib_addCalcAngleS2(&mHeadAngle.x, 0, 8, 0x500);
}
}
/* 805BCD7C-805BCEA4 001FFC 0128+00 2/2 0/0 0/0 .text flapMove__8daB_DR_cFb */
bool daB_DR_c::flapMove(bool param_0) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
f32 target_y = 2000.0f + NREG_F(1);
if (field_0x7d1 == 1) {
target_y = 4000.0f + NREG_F(2);
if (target_y < player->current.pos.y) {
target_y = 1000.0f + player->current.pos.y;
}
}
if (-1000000000.0f == mAcch.GetGroundH()) {
target_y += home.pos.y;
} else {
target_y += mAcch.GetGroundH();
}
if (fabsf(current.pos.y - target_y) > 300.0f && field_0x724 < 20.0f) {
field_0x724 = 20.0f;
}
cLib_addCalc2(&current.pos.y, target_y, 0.8f, field_0x724);
if (!param_0) {
cLib_addCalc2(&field_0x724, 4.0f, 0.8f, 2.0f);
}
if (fabsf(current.pos.y - target_y) < 100.0f) {
return true;
}
return false;
}
/* 805BCEA4-805BD05C 002124 01B8+00 3/3 0/0 0/0 .text revolutionMove__8daB_DR_cFv */
bool daB_DR_c::revolutionMove() {
cXyz mae;
cXyz unused;
if (NREG_S(0) != 0) {
OS_REPORT("\n\n");
OS_REPORT("どこ? %d\n", mActionMode);
OS_REPORT("地面+高さ %f\n", mTargetHeight);
OS_REPORT("現在高さ %f\n", fabsf(mTargetHeight - current.pos.y));
}
arg0 = 1;
if (fabsf(current.pos.y - mTargetHeight) > 100.0f) {
cLib_addCalc2(&current.pos.y, mTargetHeight, 0.8f, 50.0f);
mae = current.pos - home.pos;
mae.y = 0.0f;
field_0x750 = 200;
field_0x74c = (mae.atan2sX_Z() & 0xF000) + 0x1000;
return false;
}
cLib_addCalc0(&speed.y, 0.7f, 5.0f);
cMtx_YrotS(*calc_mtx, field_0x74c);
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = 1500.0f;
MtxPosition(&mae, &field_0x7a8);
field_0x7a8 += home.pos;
field_0x7a8.y = mTargetHeight;
mae = field_0x7a8 - current.pos;
mae.y = 0.0f;
cLib_addCalcAngleS2(&current.angle.y, (s16)mae.atan2sX_Z(), field_0x750, 0x400);
cLib_addCalcAngleS2(&field_0x750, 8, 10, 40);
shape_angle.y = current.angle.y;
if (abs((s16)((s16)mae.atan2sX_Z() - shape_angle.y)) > 0x1000) {
return false;
}
return true;
}
/* 805BD05C-805BD15C 0022DC 0100+00 11/11 0/0 0/0 .text mPlayerHighCheck__8daB_DR_cFv */
bool daB_DR_c::mPlayerHighCheck() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
dBgS_GndChk gndchk;
cXyz chk_pos;
chk_pos.set(current.pos);
chk_pos.y += 300.0f;
gndchk.SetPos(&chk_pos);
field_0x734 = dComIfG_Bgsp().GroundCross(&gndchk);
if (-1000000000.0f == field_0x734 || field_0x734 < 0.0f) {
field_0x734 = home.pos.y;
}
if (field_0x734 + l_HIO.breath_attack_threshold <= player->current.pos.y) {
return true;
}
return false;
}
/* 805BD15C-805BD3E4 0023DC 0288+00 3/3 0/0 0/0 .text mBgFallGroundCheck__8daB_DR_cFv */
bool daB_DR_c::mBgFallGroundCheck() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
dBgS_GndChk gndchk;
cXyz chkpos;
cXyz sp34;
chkpos.set(current.pos);
chkpos.y += 300.0f;
gndchk.SetPos(&chkpos);
chkpos.y = dComIfG_Bgsp().GroundCross(&gndchk);
if (-1000000000.0f == chkpos.y) {
chkpos.y = home.pos.y;
}
if (chkpos.y < home.pos.y) {
chkpos.y = home.pos.y;
}
if (!mAcch.ChkGroundHit() && !(80.0f + chkpos.y > current.pos.y)) {
return false;
}
speed.y = 0.0f;
if (current.pos.y < 80.0f + home.pos.y) {
current.pos.y = 80.0f + home.pos.y;
}
if (current.pos.y < 80.0f + chkpos.y) {
current.pos.y = 80.0f + chkpos.y;
}
gravity = 0.0f;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&sp34);
sp34.y = field_0x734;
cXyz size(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
field_0x280c = dComIfGp_particle_setPolyColor(field_0x280c, 0x899F, mAcch.m_gnd, &sp34, &tevStr, &shape_angle, &size, 0, NULL, -1, NULL);
if (mAnm == ANM_DR_BOOT_B || mAnm == ANM_DR_FALL_DOWN) {
mSound.startCreatureSound(Z2SE_EN_DR_LAND, 0, -1);
}
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER7, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
mStatusONOFF(0);
if (bitSw != 0xFF) {
fopAcM_offSwitch(this, bitSw);
}
return true;
}
/* 805BD3E4-805BD5FC 002664 0218+00 3/3 0/0 0/0 .text normalHoverMove__8daB_DR_cFv */
void daB_DR_c::normalHoverMove() {
cXyz target_pos;
cXyz target_vec;
target_pos.set(400.0f * cM_ssin(mCount[3] * field_0x752), 0.0f, 400.0f * cM_scos(mCount[3] * field_0x752));
target_pos += home.pos;
target_pos.y = current.pos.y;
cLib_addCalcPos(&current.pos, target_pos, 0.4f, 5.0f, field_0x744);
cLib_addCalc2(&field_0x744, 1.0f, 0.3f, 0.1f);
target_vec = target_pos - current.pos;
target_vec.y = 0.0f;
if (target_vec.abs() < 100.0f) {
field_0x744 = 0.0f;
field_0x752 = 4096.0f + cM_rndFX(2048.0f);
mCount[3]++;
}
}
/* 805BD5FC-805BD98C 00287C 0390+00 1/1 0/0 0/0 .text executeWait__8daB_DR_cFv */
void daB_DR_c::executeWait() {
cXyz sp20;
cXyz sp14;
#ifdef DEBUG
dDbVw_Report(30, 100, "wait tyuu No Attack Timer:%d ", mTimer[2]);
#endif
bool temp_r27 = flapMove(0);
mHabatakiAnmSet(0);
switch (mMoveMode) {
case 0:
mAllClr();
mTimer[2] = l_HIO.no_attack_time;
field_0x750 = JREG_S(8) + 200;
mMoveMode++;
/* fallthrough */
case 1:
sp20.set(home.pos);
sp20.y = current.pos.y;
cLib_addCalcPos(&current.pos, sp20, 0.8f, 20.0f, 5.0f);
sp14 = sp20 - current.pos;
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), 10, 0x800);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, 0x400);
cLib_addCalcAngleS2(&field_0x750, 8, 8, 20);
if (daPy_getPlayerActorClass()->getDamageWaitTimer() == 0 && temp_r27 && sp14.abs() < 100.0f) {
if (mBreakPartsNo == 0) {
mStatusONOFF(1);
}
speed.y = 0.0f;
gravity = 0.0f;
mMoveMode++;
}
break;
case 2:
normalHoverMove();
break;
}
if (mBreakPartsNo == 1) {
if (dComIfGp_getPlayer(0)->current.pos.y < l_HIO.breath_attack_threshold) {
mStatusONOFF(0);
} else {
mStatusONOFF(1);
}
}
cLib_addCalc0(&speedF, 0.8f, 10.0f);
cLib_addCalc0(&speed.y, 0.8f, 10.0f);
if (mMoveMode == 2 && (cLib_calcTimer<int>(&mTimer[2]) == 0 || dComIfGp_checkPlayerStatus0(0, 0x100))) {
if (mPlayerHighCheck()) {
setActionMode(ACTION_BREATH_ATTACK, 0);
} else if (field_0x7d1 != 0) {
setActionMode(ACTION_GLIDER_ATTACK, 0);
} else {
setActionMode(ACTION_WIND_ATTACK, 0);
}
}
}
/* 805BD98C-805BDBC4 002C0C 0238+00 1/1 0/0 0/0 .text executeFlyWait__8daB_DR_cFv */
void daB_DR_c::executeFlyWait() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz sp8;
#ifdef DEBUG
if (mMoveMode > 1) {
if (mTimer[2] != 0) {
dDbVw_Report(30, 100, "wait tyuu No Attack Timer:%d ", mTimer[2]);
}
} else {
dDbVw_Report(30, 100, "JYOU SYOU TYU ");
}
#endif
cLib_addCalc0(&speedF, 0.8f, 10.0f);
mHabatakiAnmSet(0);
switch (mMoveMode) {
case 0:
mWeekCc.OffTgSetBit();
mStatusONOFF(0);
mAllClr();
field_0x724 = 0.0f;
if (revolutionMove()) {
field_0x750 = JREG_S(8) + 200;
mTimer[2] = l_HIO.no_attack_no_armor_time;
mMoveMode = 2;
} else {
mMoveMode = 1;
}
break;
case 1:
if (!revolutionMove()) {
break;
}
field_0x750 = JREG_S(8) + 200;
mTimer[2] = l_HIO.no_attack_no_armor_time;
mpModelMorf->setPlaySpeed(1.0f);
mMoveMode = 2;
// fallthrough
case 2:
field_0x7d6 = 0;
normalHoverMove();
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), field_0x750, 0x200);
sp8.set(home.pos);
sp8.y = current.pos.y;
cLib_addCalcPos(&current.pos, sp8, 0.8f, 20.0f, 5.0f);
if (mTargetHeight < player->current.pos.y || mPlayerHighCheck()) {
setActionMode(ACTION_BREATH_ATTACK, 0);
return;
}
if (cLib_calcTimer<int>(&mTimer[2]) == 0) {
setActionMode(ACTION_GLIDER_ATTACK, 0);
return;
}
}
if (mMoveMode < 10) {
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, 0x400);
} else {
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, 0x200);
}
cLib_addCalcAngleS2(&field_0x750, 8, 10, 20);
}
/* 805BDBC4-805BE9B4 002E44 0DF0+00 1/1 0/0 0/0 .text executeTailHit__8daB_DR_cFv */
void daB_DR_c::executeTailHit() {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
cXyz mae;
cXyz ato;
#ifdef DEBUG
if (mTimer[0] != 0) {
if (mMoveMode < 13) {
dDbVw_Report(30, 100, "Tail Hit chance Timer:%d ", mTimer[0]);
} else {
dDbVw_Report(30, 100, "wait tyuu:%d ", mTimer[0]);
}
}
#endif
bool sp10 = mPlayerHighCheck();
if (daPy_getPlayerActorClass()->getDamageWaitTimer() != 0) {
dMw_onPauseWindow();
if (field_0x7d1 != 2) {
field_0x724 = 50.0f;
setActionMode(ACTION_WAIT, 0);
} else {
setActionMode(ACTION_FLY_WAIT, 0);
}
return;
}
if ((mMoveMode == 0 || mMoveMode == 1) && current.pos.y < (1000.0f + l_HIO.breath_attack_threshold)) {
cLib_addCalc2(&current.pos.y, 1000.0f + l_HIO.breath_attack_threshold, 0.7f, 20.0f);
}
switch (mMoveMode) {
case 0:
if (mAnm != ANM_DR_HOVERING) {
setBck(ANM_DR_HOVERING, 2, 10.0f, 1.0f);
}
mAllClr();
dMw_offPauseWindow();
speedF = 0.0f;
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
field_0x728 = 0.0f;
mTimer[0] = l_HIO.tail_hit_chance_time;
mMoveMode++;
}
break;
case 1:
if (cLib_calcTimer<int>(&mTimer[0]) != 0) {
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
if (player->checkBootsOrArmorHeavy()) {
field_0x7d6 = 1;
if (mBreakPartsNo == 0) {
mTimer[0] = 0;
setActionMode(ACTION_DAMAGE_DEMO, 0);
return;
}
if (bitSw != 0xFF) {
fopAcM_onSwitch(this, bitSw);
}
if (mAnm != ANM_DR_BOOT_A) {
setBck(ANM_DR_BOOT_A, 0, 10.0f, 1.0f);
}
mTimer[0] = 0;
mMoveMode = 10;
}
} else {
mTimer[0] = 0;
}
} else {
if (bitSw != 0xFF) {
fopAcM_offSwitch(this, bitSw);
}
setBck(ANM_DR_SHAKEA, 0, 20.0f, 1.0f);
mMoveMode++;
}
break;
case 2:
if ((int)mpModelMorf->getFrame() < 28) {
if (player->checkBootsOrArmorHeavy() && dComIfGp_checkPlayerStatus1(0, 0x10000)) {
field_0x7d6 = 1;
if (mBreakPartsNo == 0) {
setActionMode(ACTION_DAMAGE_DEMO, 0);
return;
}
if (bitSw != 0xFF) {
fopAcM_onSwitch(this, bitSw);
}
field_0x7d7 = 0;
if (mAnm != ANM_DR_BOOT_A) {
setBck(ANM_DR_BOOT_A, 0, 10.0f, 1.0f);
}
mMoveMode = 10;
}
} else {
if (mpModelMorf->checkFrame(28)) {
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER5, 0x4F, cXyz(0.0f, 1.0f, 0.0f));
}
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
fopAcM_cancelHookCarryNow(this);
}
if (mpModelMorf->isStop()) {
dMw_onPauseWindow();
if (field_0x7d1 != 2) {
if (field_0x7d1 != 0) {
setActionMode(ACTION_GLIDER_ATTACK, 0);
} else {
setActionMode(ACTION_WIND_ATTACK, 0);
}
} else {
field_0x750 = JREG_S(8) + 200;
setActionMode(ACTION_FLY_WAIT, 0);
}
}
}
break;
case 10:
mStatusONOFF(0);
dComIfGs_onZoneSwitch(22, fopAcM_GetRoomNo(this));
if (mBreakPartsNo == 0) {
dCam_getBody()->SetTrimTypeForce(2);
}
if (!mpModelMorf->isStop()) {
break;
}
setBck(ANM_DR_BOOT_B, 2, 3.0f, 1.0f);
mBgFallGroundCheck();
mMoveMode++;
case 11:
if (mBreakPartsNo == 0) {
dCam_getBody()->SetTrimTypeForce(2);
}
field_0x728 += l_HIO.fall_accel;
if (field_0x728 >= l_HIO.fall_accel_max) {
field_0x728 = l_HIO.fall_accel_max;
}
cLib_addCalc2(&current.pos.y, field_0x734, 0.8f, field_0x728);
cLib_addCalc2(&current.pos.x, home.pos.x, 0.8f, 8.0f);
cLib_addCalc2(&current.pos.z, home.pos.z, 0.8f, 8.0f);
mAcch.SetWallNone();
mAcch.SetGroundUpY(75.0f);
mAcch.CrrPos(dComIfG_Bgsp());
if (player->getFootOnGround() || player->current.pos.y < 10.0f + field_0x734) {
mSound.startCreatureSound(Z2SE_EN_DR_LAND, 0, -1);
if (mBreakPartsNo != 0) {
Z2GetAudioMgr()->bgmStop(0x1E, 0);
}
shape_angle.x = 0;
mBoot_c_trance.zero();
if (bitSw != 0xFF) {
fopAcM_offSwitch(this, bitSw);
}
mStatusONOFF(0);
if (mBreakPartsNo == 0) {
mTimer[0] = 0;
setActionMode(ACTION_DAMAGE_DEMO, 10);
return;
}
mBreakPartsNo++;
mTailCc.OffTgSetBit();
mMoveMode++;
}
break;
case 12:
if (startDemoCheck()) {
shape_angle.y = current.angle.y = home.angle.y;
current.pos.x = home.pos.x;
current.pos.z = home.pos.z;
setBck(ANM_DR_IMPACT, 0, 3.0f, 1.0f);
mMoveMode++;
}
break;
case 13:
if (mAnm == ANM_DR_BOOT_C) {
if ((int)mpModelMorf->getFrame() >= 34) {
cLib_addCalc2(&mDemoCamCenter.y, player->current.pos.y, 0.7f, 150.0f);
}
if (mpModelMorf->isStop()) {
setBck(ANM_DR_DOWN_WAIT, 2, 3.0f, 1.0f);
mTimer[0] = 35;
}
}
if (mAnm == ANM_DR_IMPACT && mpModelMorf->isStop()) {
setBck(ANM_DR_BOOT_C, 0, 3.0f, 1.0f);
gravity = -1.0f;
}
if (!mBgFallGroundCheck()) {
break;
}
dMw_onPauseWindow();
mMoveMode++;
case 14:
if (mAnm == ANM_DR_BOOT_C) {
if ((int)mpModelMorf->getFrame() >= 34) {
cLib_addCalc2(&mDemoCamCenter.y, player->current.pos.y, 0.7f, 150.0f);
}
if (!mpModelMorf->isStop()) {
break;
}
}
if (mAnm != ANM_DR_DOWN_WAIT) {
setBck(ANM_DR_DOWN_WAIT, 2, 3.0f, 1.0f);
mTimer[0] = 35;
}
if (cLib_calcTimer<int>(&mTimer[0]) != 0) {
break;
}
mMoveMode++;
case 15:
ato = current.pos + mBoot_c_trance;
parentActorID = fopAcM_createChild(PROC_B_DRE, fopAcM_GetID(this), 1, &ato, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
Z2GetAudioMgr()->subBgmStart(Z2BGM_DRAGON_D02);
dComIfGs_onZoneSwitch(23, fopAcM_GetRoomNo(this));
field_0x7e0 = 0;
mTimer[0] = BREG_S(3) + 100;
mMoveMode = 1000;
break;
case 20:
if (mAnm == ANM_DR_DOWN_WAIT && cLib_calcTimer<int>(&mTimer[0]) == 0) {
dMw_onPauseWindow();
mTargetHeight = 6000.0f + home.pos.y;
setBck(ANM_DR_TAKE_OFF, 0, 10.0f, 1.0f);
field_0x724 = 50.0f;
mMoveMode++;
}
break;
case 21:
if (mAnm == ANM_DR_TAKE_OFF) {
if (mpModelMorf->getFrame() >= 27.0f) {
field_0x7d7 = 0;
mBoot_c_tranceSet(1);
if (field_0x7d1 != 2) {
flapMove(1);
} else {
revolutionMove();
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 8, 0x400);
}
}
}
/* fallthrough */
case 100:
if (mAnm != ANM_DR_HOVERING) {
if (!mpModelMorf->isStop()) {
break;
}
dMw_onPauseWindow();
setBck(ANM_DR_HOVERING, 2, 10.0f, 1.0f);
if (mPlayerHighCheck() != 0) {
setActionMode(ACTION_BREATH_ATTACK, 0);
} else {
setActionMode(ACTION_GLIDER_ATTACK, 0);
}
}
if (WREG_S(1) != 0) {
setActionMode(ACTION_WIND_ATTACK, 0);
}
break;
case 1000:
mMoveMode = 10000;
/* fallthrough */
case 10000:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
arg0 = 0xFE;
}
break;
}
if (mMoveMode >= 12 && mMoveMode <= 14) {
if (mAnm != ANM_DR_BOOT_C && mAnm != ANM_DR_DOWN_WAIT) {
ato.set(home.pos);
ato.y += 1200.0f + JREG_F(10);
mDemoCamCenter.set(ato);
} else {
ato.set(-1500.0f, 0.0f, -1500.0f);
daPy_getPlayerActorClass()->setPlayerPosAndAngle(&ato, -0x8000, 0);
}
cMtx_YrotS(*calc_mtx, shape_angle.y - (JREG_S(8) + 0x1000));
mae.x = 0.0f;
mae.y = 200.0f + JREG_F(11);
mae.z = 1000.0f + JREG_F(12);
MtxPosition(&mae, &ato);
mDemoCamEye = (ato + current.pos) + mBoot_c_trance;
daPy_getPlayerActorClass()->onBossRoomWait();
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye);
}
if (mMoveMode != 1000 && mAnm == ANM_DR_BOOT_C) {
if (mpModelMorf->checkFrame(45.0f)) {
field_0x7e0 = 0;
mSound.startCreatureSound(Z2SE_EN_DR_CRASH, 0, -1);
}
mBoot_c_tranceSet(0);
if ((int)mpModelMorf->getFrame() >= 45) {
chkPartCreate(0);
}
}
if (mMoveMode >= 10 && mMoveMode <= 11) {
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), 40, 0x200);
shape_angle.y = current.angle.y;
}
if (mMoveMode <= 11) {
cXyz offset;
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::multVec(&eyePos, &offset);
daPy_getPlayerActorClass()->setHookshotCarryOffset(fopAcM_GetID(this), &offset);
}
}
/* 805BE9B4-805BF4C8 003C34 0B14+00 1/1 0/0 0/0 .text executeWeekHit__8daB_DR_cFv */
void daB_DR_c::executeWeekHit() {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
cXyz sp50;
#ifdef DEBUG
if (mTimer[2] != 0) {
dDbVw_Report(30, 100, "week HIT chance Timer:%d ", mTimer[2]);
}
if (mTimer[0] != 0) {
dDbVw_Report(30, 100, "wait tyuu:%d ", mTimer[0]);
}
#endif
switch (mMoveMode) {
case 0:
setBck(ANM_DR_CATCH, 0, 7.0f, 1.0f);
if (bitSw2 != 0xFF) {
fopAcM_onSwitch(this, bitSw2);
}
mAllClr();
mCount[0] = cM_rndF(2.0f);
mCount[1] = 0;
mTimer[2] = l_HIO.back_hit_chance_time;
field_0x7d0 = 0;
field_0x7d6 = 1;
mMoveMode++;
/* fallthrough */
case 1:
if (cLib_calcTimer<int>(&mTimer[2]) == 0) {
setBck(ANM_DR_SHAKEB, 0, 10.0f, 1.0f);
Z2GetAudioMgr()->changeBgmStatus(1);
mMoveMode = 100;
field_0x744 = 0.0f;
break;
} else {
if (mCount[1] == 0 && player->checkDragonHangRide()) {
setBck(ANM_DR_RIDE, 0, 3.0f, 1.0f);
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER2, 0x4F, cXyz(0.0f, 1.0f, 0.0f));
mCount[1] = 1;
}
if ((mAnm == ANM_DR_RIDE || mAnm == ANM_DR_DAMAGE_L || mAnm == ANM_DR_DAMAGE_R || mAnm == ANM_DR_CATCH) && mpModelMorf->isStop()) {
setBck(ANM_DR_HOVERING_B, 2, 3.0f, 1.0f);
}
if (!checkCutDownHitFlg() || cLib_calcTimer<u8>(&field_0x7d0) != 0) {
break;
}
offCutDownHitFlg();
field_0x7d0 = 4;
mSound.startCreatureExtraSound(Z2SE_EN_DR_CORE_HIT, 0, -1);
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER5, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
if (player->checkNormalSwordEquip()) {
health--;
if (player->getSwordAtUpTime()) {
health--;
}
} else if (player->checkMasterSwordEquip()) {
health -= 2;
if (player->getSwordAtUpTime()) {
health -= 2;
}
}
field_0x7e8++;
mTimer[2] = l_HIO.back_hit_chance_time;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&sp50);
dComIfGp_particle_set(0x8999, &sp50, NULL, NULL);
dComIfGp_particle_set(0x899A, &sp50, NULL, NULL);
if (health <= 0 || player->getCutType() == 0x20) {
health = 0;
mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x20);
gravity = -1.0f;
setBck(ANM_DR_DAMAGE_LAST, 0, 3.0f, 1.0f);
mTimer[2] = 0;
if (bitSw2 != 0xFF) {
fopAcM_offSwitch(this, bitSw2);
}
if (bitSw3 != 0xFF) {
fopAcM_onSwitch(this, bitSw3);
}
Z2GetAudioMgr()->bgmStop(0x1E, 0);
Z2GetAudioMgr()->bgmStreamPrepare(0x2000049);
Z2GetAudioMgr()->bgmStreamPlay();
cXyz sp44(current.pos);
sp44.z = 0.0f;
sp44.x = 0.0f;
parentActorID = fopAcM_createChild(PROC_B_DRE, fopAcM_GetID(this), 0, &sp44, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
mTimer[0] = BREG_S(3) + 20;
mMoveMode = 1000;
return;
}
if (field_0x7e8 >= 4) {
mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x20);
if (bitSw2 != 0xFF) {
fopAcM_offSwitch(this, bitSw2);
}
if (bitSw3 != 0xFF) {
fopAcM_onSwitch(this, bitSw3);
}
if (health <= 8) {
onDownFlg();
}
gravity = -1.0f;
setBck(ANM_DR_DAMAGE_LAST, 0, 3.0f, 1.0f);
mTimer[2] = 0;
Z2GetAudioMgr()->changeBgmStatus(1);
dComIfGs_onZoneSwitch(0x19, fopAcM_GetRoomNo(this));
mMoveMode++;
} else {
if (mCount[0] == 0) {
setBck(ANM_DR_DAMAGE_L, 0, 3.0f, 1.0f);
} else {
setBck(ANM_DR_DAMAGE_R, 0, 3.0f, 1.0f);
}
mCount[0]++;
mCount[0] &= 1;
mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1F);
}
break;
}
case 2:
if (mAnm == ANM_DR_DAMAGE_LAST && mpModelMorf->isStop()) {
setBck(ANM_DR_FALL, 2, 3.0f, 1.0f);
}
if (current.pos.y < 870.0f && mAnm != ANM_DR_FALL_DOWN) {
player->cancelDragonHangBackJump();
gravity = -13.0f;
setBck(ANM_DR_FALL_DOWN, 0, 10.0f, 1.0f);
}
if (mBgFallGroundCheck()) {
if (bitSw3 != 0xFF) {
fopAcM_offSwitch(this, bitSw3);
}
if (mAnm != ANM_DR_FALL_DOWN) {
setBck(ANM_DR_FALL_DOWN, 0, 10.0f, 1.0f);
}
mMoveMode++;
}
break;
case 3:
if (mAnm == ANM_DR_FALL_DOWN && mpModelMorf->isStop()) {
setBck(ANM_DR_DOWN_WAIT, 2, 10.0f, 1.0f);
field_0x7d7 = 1;
mTimer[0] = 35;
}
if (mAnm == ANM_DR_DOWN_WAIT && cLib_calcTimer<int>(&mTimer[0]) == 0) {
setBck(ANM_DR_TAKE_OFF, 0, 10.0f, 1.0f);
field_0x724 = 50.0f;
mMoveMode++;
}
break;
case 4:
if (mAnm == ANM_DR_TAKE_OFF) {
if (mpModelMorf->getFrame() >= 27.0f) {
revolutionMove();
field_0x7d7 = 0;
}
}
if (mAnm != ANM_DR_HOVERING) {
if (!mpModelMorf->isStop()) {
break;
}
setBck(ANM_DR_HOVERING, 2, 10.0f, 1.0f);
}
if (mPlayerHighCheck()) {
setActionMode(ACTION_BREATH_ATTACK, 0);
} else {
setActionMode(ACTION_FLY_WAIT, 0);
}
break;
case 100:
if (mpModelMorf->checkFrame(30.0f)) {
player->cancelOctaIealHang();
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER5, 0x4F, cXyz(0.0f, 1.0f, 0.0f));
if (bitSw2 != 0xFF) {
fopAcM_offSwitch(this, bitSw2);
}
if (bitSw3 != 0xFF) {
fopAcM_offSwitch(this, bitSw3);
}
}
if (mpModelMorf->isStop()) {
setBck(ANM_DR_HOVERING, 2, 10.0f, 1.0f);
setActionMode(ACTION_FLY_WAIT, 0);
}
break;
case 1000:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
dComIfGs_onEventBit(dSv_event_flag_c::F_0268);
dComIfGs_onStageBossEnemy(0x16);
fopAcM_onSwitch(this, 0x38);
fopAcM_delete(this);
}
break;
}
cXyz offset;
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::multVec(&eyePos, &offset);
daPy_getPlayerActorClass()->setHookshotCarryOffset(fopAcM_GetID(this), &offset);
}
/* 805C7974-805C7978 0000BC 0004+00 2/2 0/0 0/0 .bss None */
static u8 data_805C7974;
/* 805BF4C8-805BF768 004748 02A0+00 2/2 0/0 0/0 .text mBreathSet__8daB_DR_cFv */
void daB_DR_c::mBreathSet() {
cXyz mae;
cXyz ato;
cLib_addCalc2(&field_0x72c, 50.0f, 0.7f, 4.0f);
data_805C7974 = field_0x72c;
csXyz sp1C(shape_angle);
for (int i = 0; i < 4; i++) {
static u16 effId[] = {0x899B, 0x899C, 0x899D, 0x899E};
field_0x27dc[i] = dComIfGp_particle_set(field_0x27dc[i], effId[i], &field_0x760, &sp1C, NULL);
JPABaseEmitter* emitter_p = dComIfGp_particle_getEmitter(field_0x27dc[i]);
if (emitter_p != NULL) {
emitter_p->setGlobalSRTMatrix(mpModelMorf->getModel()->getAnmMtx(0x13));
cMtx_YrotS(*calc_mtx, fopAcM_searchPlayerAngleY(this));
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = 2200.0f;
MtxPosition(&mae, &ato);
ato += field_0x790;
field_0x784.set(ato);
mSound.startCreatureVoiceLevel(Z2SE_EN_DR_V_FIRE, -1);
mSound2.startCreatureSoundLevel(Z2SE_EN_DR_V_FIRE, 0, -1);
}
}
if (cLib_calcTimer<int>(&mTimer[1]) == 0) {
if (mActionMode == ACTION_BREATH_ATTACK2) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
ato = field_0x778 - field_0x760;
sp1C.y = ato.atan2sX_Z();
}
sp1C.x = NREG_S(8) - 1000;
mTimer[1] = 3;
fopAcM_createChild(PROC_B_DR, fopAcM_GetID(this), 10, &field_0x760, fopAcM_GetRoomNo(this), &sp1C, NULL, -1, NULL);
}
}
/* 805BF768-805BFA6C 0049E8 0304+00 1/1 0/0 0/0 .text mBreathHighSet__8daB_DR_cFb */
bool daB_DR_c::mBreathHighSet(bool param_0) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz mae;
cXyz ato;
if (param_0 == 0) {
mHabatakiAnmSet(mActionMode);
if (mAnm != ANM_DR_HOVERING) {
return false;
}
}
cMtx_YrotS(*calc_mtx, fopAcM_searchPlayerAngleY(this));
mae.x = 0.0f;
mae.y = 1200.0f;
mae.z = 1200.0f;
MtxPosition(&mae, &ato);
if (mActionMode != ACTION_BREATH_ATTACK2) {
field_0x7a8.x = ato.x + home.pos.x;
field_0x7a8.y = player->current.pos.y + BREG_F(7);
field_0x7a8.z = ato.z + home.pos.z;
} else {
field_0x7a8.x = home.pos.x;
if (player->current.pos.y >= 0.0f) {
field_0x7a8.y = (player->current.pos.y - 200.0f) + BREG_F(7);
} else {
field_0x7a8.y = 0.0f;
}
field_0x7a8.z = home.pos.z;
}
if (param_0 == 0) {
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), field_0x750, 0x800);
cLib_addCalcAngleS2(&field_0x750, 4, 4, 40);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 8, 0x300);
}
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, l_HIO.breath_move_speed_max, l_HIO.breath_move_speed_min);
ato = field_0x7a8 - current.pos;
if (ato.abs() < 100.0f && fabsf(field_0x7a8.y - current.pos.y) < 40.0f && (param_0 || abs((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this))) < 0x200)) {
return true;
}
return false;
}
/* 805BFA6C-805BFD88 004CEC 031C+00 1/1 0/0 0/0 .text mFeintBreath__8daB_DR_cFv */
bool daB_DR_c::mFeintBreath() {
s16 temp_r30 = field_0x754;
switch (field_0x718) {
case 0:
mTimer[2] = l_HIO.breath_feint1_time;
field_0x718++;
/* fallthrough */
case 1:
if (cLib_calcTimer<int>(&mTimer[2]) == 0) {
setBck(ANM_DR_FEINT_A, 0, 3.0f, 1.0f);
mTimer[2] = l_HIO.breath_feint2_time;
field_0x718++;
} else {
mBreathSet();
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), l_HIO.body_search2_speed, l_HIO.body_search_speed_max);
field_0x756 = current.angle.y - shape_angle.y;
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 4, 0x400);
field_0x754 = current.angle.y;
}
break;
case 2:
if (mAnm == ANM_DR_FEINT_A && mpModelMorf->isStop()) {
setBck(ANM_DR_FEINT_B, 2, 3.0f, 1.0f);
}
if (cLib_calcTimer<int>(&mTimer[2]) == 0) {
field_0x718++;
} else {
if (field_0x756 > 0) {
temp_r30 += (s16)(l_HIO.feint_angle * 0xB6);
} else {
temp_r30 -= (s16)(l_HIO.feint_angle * 0xB6);
}
if (abs((s16)(current.angle.y - temp_r30)) > 0x100) {
cLib_addCalcAngleS2(&current.angle.y, temp_r30, 1, l_HIO.body_search_feint_speed_max);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 2, 0x800);
} else {
mTimer[2] = 0;
}
}
break;
case 3:
if (mAnm == ANM_DR_FEINT_B && (int)mpModelMorf->getFrame() >= 23) {
setBck(ANM_DR_FEINT_C, 0, 3.0f, 1.0f);
field_0x718++;
}
break;
case 4:
if (mpModelMorf->isStop()) {
setBck(ANM_DR_FIREB, 2, 3.0f, 1.0f);
mTimer[2] = l_HIO.breath_feint3_time;
field_0x718++;
}
break;
case 5:
break;
}
if (field_0x718 < 5) {
return false;
}
return true;
}
/* 805BFD88-805C062C 005008 08A4+00 1/1 0/0 0/0 .text executeBreathAttack__8daB_DR_cFv */
void daB_DR_c::executeBreathAttack() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz sp1C;
cXyz sp10;
s16 var_r28 = 0;
s16 spC = 10;
s16 spA = 0;
bool sp8 = false;
#ifdef DEBUG
if (mTimer[3] != 0) {
if (mMoveMode < 100) {
dDbVw_Report(30, 100, "Breath tyuu No Attack Timer:%d ", mTimer[3]);
} else {
dDbVw_Report(30, 100, "Breath after chance timer:%d ", mTimer[3]);
}
}
if (mTimer[2] != 0) {
dDbVw_Report(30, 130, "Breath Timer:%d ", mTimer[2]);
}
#endif
if ((daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 || !mPlayerHighCheck()) && (mMoveMode == 4 || mMoveMode == 20)) {
mStatusONOFF(0);
mAllClr();
mMoveMode = 10;
setBck(ANM_DR_FIREC, 0, 3.0f, 1.0f);
return;
}
cLib_addCalc0(&speedF, 0.5f, 2.0f);
cLib_addCalc0(&speed.y, 0.5f, 2.0f);
switch (mMoveMode) {
case 0:
mAllClr();
gravity = 0.0f;
field_0x750 = 200;
if (dComIfGp_checkPlayerStatus1(0, 0x2000000)) {
mTimer[3] = l_HIO.unk_0x4c;
}
mMoveMode++;
/* fallthrough */
case 1:
mBreathHighSet(0);
if (cLib_calcTimer<int>(&mTimer[3]) != 0) {
if (mAnm == ANM_DR_HOVERING && field_0x7d1 != 2) {
mStatusONOFF(1);
}
break;
}
mMoveMode++;
case 2:
sp8 = mBreathHighSet(0);
if (mAnm == ANM_DR_HOVERING) {
if (field_0x7d1 != 2) {
mStatusONOFF(1);
}
if ((int)mpModelMorf->getFrame() >= 33 && sp8) {
setBck(ANM_DR_FIREA, 0, 3.0f, 1.0f);
mMoveMode++;
}
}
break;
case 3:
mBreathHighSet(1);
if (!mpModelMorf->isStop()) {
break;
}
if (field_0x7d1 != 2 || mTargetHeight > player->current.pos.y || dComIfGp_checkPlayerStatus1(0, 0x2000000)) {
mTimer[2] = l_HIO.breath_continue_time;
} else {
mTimer[2] = l_HIO.breath_continue_no_armor_time;
if (health <= 8) {
mTimer[2] = l_HIO.breath_feint1_time;
}
mActionMode = ACTION_BREATH_ATTACK2;
}
if (BREG_S(0) != 0) {
mTimer[2] = 10;
}
field_0x72c = 0.0f;
setBck(ANM_DR_FIREB, 2, 3.0f, 1.0f);
mMoveMode++;
mCount[3] = 0;
field_0x718 = 0;
if (l_HIO.breath_feint2_OFF) {
mMoveMode = 20;
}
case 20:
case 4:
mBreathHighSet(1);
if (mActionMode == ACTION_BREATH_ATTACK2) {
var_r28 = -(cLib_targetAngleY(&field_0x760, &player->current.pos) - shape_angle.y);
if (var_r28 > 0x2000) {
var_r28 = 0x2000;
}
if (var_r28 < -0x2000) {
var_r28 = -0x2000;
}
if (health <= 0x10) {
spC = l_HIO.neck_search2_speed;
spA = l_HIO.body_search2_speed;
} else {
spC = l_HIO.neck_search_speed;
spA = l_HIO.body_search_speed;
}
if (mMoveMode == 20 && mActionMode == ACTION_BREATH_ATTACK2 && health <= 8 && !mFeintBreath()) {
break;
}
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), spA, l_HIO.body_search_speed_max);
field_0x756 = current.angle.y - shape_angle.y;
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 4, 0x400);
if (mTargetHeight - 300.0f > player->current.pos.y) {
mTimer[2] = 0;
}
}
if (mAnm == ANM_DR_FIREB) {
mBreathSet();
}
case 9:
if (cLib_calcTimer<int>(&mTimer[2]) == 0 && (int)mpModelMorf->getFrame() >= 48) {
setBck(ANM_DR_FIREC, 0, 3.0f, 1.0f);
mMoveMode = 10;
}
break;
case 10:
mBreathHighSet(1);
if (!mpModelMorf->isStop()) {
cLib_addCalcAngleS2(&mHeadAngle.y, 0, 100, 0x200);
} else if (mActionMode == ACTION_BREATH_ATTACK2 && field_0x7d1 == 2 && mTargetHeight < player->current.pos.y) {
setBck(ANM_DR_FIRED, 2, 10.0f, 1.0f);
mTimer[3] = l_HIO.after_breath_chance_time;
mWeekCc.OnTgSetBit();
mStatusONOFF(1);
mMoveMode = 100;
} else {
setBck(ANM_DR_FIREE, 0, 3.0f, 1.0f);
mMoveMode++;
}
break;
case 11:
if (!mpModelMorf->isStop()) {
break;
}
setBck(ANM_DR_HOVERING, 2, 3.0f, 1.0f);
mMoveMode++;
case 12:
field_0x724 = 20.0f;
field_0x7d6 = 1;
if (!mPlayerHighCheck()) {
if (field_0x7d1 != 2) {
field_0x724 = 100.0f;
if (field_0x7d1 != 0) {
setActionMode(ACTION_WAIT, 0);
} else {
setActionMode(ACTION_WIND_ATTACK, 0);
}
} else {
field_0x750 = JREG_S(8) + 200;
setActionMode(ACTION_FLY_WAIT, 0);
}
return;
}
if (field_0x7d1 != 2) {
mStatusONOFF(1);
}
if (field_0x7d1 != 2) {
mTimer[3] = l_HIO.no_attack_time;
} else {
mTimer[3] = l_HIO.no_attack_no_armor_time;
}
mMoveMode = 1;
break;
case 100:
mBreathHighSet(1);
if (BREG_S(7) != 0) {
mTimer[3] = 1000;
}
attention_info.flags |= 4;
if (cLib_calcTimer<int>(&mTimer[3]) != 0 && mTargetHeight - 300.0f < player->current.pos.y) {
if (abs((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y)) < ZREG_S(0) + 0x5000) {
mWeekCc.OffTgSetBit();
attention_info.flags &= ~0x4;
} else {
mWeekCc.OnTgSetBit();
if (mTarget != 0 || (dComIfGp_getAttention().GetLockonList(0) != NULL && dComIfGp_getAttention().LockonTruth() && dComIfGp_getAttention().GetLockonList(0)->getActor() == this)) {
mTarget = 0;
} else {
attention_info.flags &= ~0x4;
mTarget = 0;
}
}
} else {
mWeekCc.OffTgSetBit();
mStatusONOFF(0);
setBck(ANM_DR_FIREE, 0, 3.0f, 1.0f);
mMoveMode = 11;
}
break;
}
cLib_addCalcAngleS2(&mHeadAngle.x, 0, 100, 0x200);
cLib_addCalcAngleS2(&mHeadAngle.y, var_r28, spC, l_HIO.neck_search_speed_max);
if (mMoveMode < 9 && !mPlayerHighCheck()) {
if (mAnm == ANM_DR_FIREB) {
mTimer[2] = 0;
mMoveMode = 9;
} else {
mMoveMode = 12;
}
}
}
/* 805C062C-805C0CAC 0058AC 0680+00 1/1 0/0 0/0 .text executeWindAttack__8daB_DR_cFv */
void daB_DR_c::executeWindAttack() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz sp30;
cXyz sp24;
bool sp8 = 0;
#ifdef DEBUG
dDbVw_Report(30, 100, "normal Timer:%d center Timer:%d ", mTimer[1], mTimer[2]);
#endif
if (mAnm != ANM_DR_FLAP) {
mHabatakiAnmSet(mActionMode);
}
cLib_addCalc0(&speedF, 0.5f, 5.0f + WREG_F(7));
cLib_addCalc0(&speed.y, 0.5f, 5.0f);
switch (mMoveMode) {
case 0:
field_0x7d6 = 0;
mAllClr();
field_0x7b4.set(player->current.pos);
if (field_0x7b4.z < 0.0f) {
field_0x7b4.z = 3000.0f;
} else {
field_0x7b4.z = -3000.0f;
}
gravity = 0.0f;
field_0x750 = 400;
mMoveMode++;
/* fallthrough */
case 1:
field_0x7a8.set(home.pos);
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, 40.0f, 20.0f);
sp30 = field_0x7a8 - current.pos;
sp30.y = 0.0f;
if (!(sp30.abs() > 1000.0f)) {
mMoveMode++;
case 2:
normalHoverMove();
}
break;
}
if (mMoveMode == 2 && mPlayerHighCheck() && !daPy_getPlayerActorClass()->getDamageWaitTimer()) {
setActionMode(ACTION_BREATH_ATTACK, 0);
return;
}
if (dComIfGp_checkPlayerStatus0(0, 0x100)) {
mCount[1] = 0;
mTimer[1] = 0;
mCount[2] = 0;
mTimer[2] = 0;
setActionMode(ACTION_GLIDER_ATTACK, 0);
return;
}
sp24 = home.pos - player->current.pos;
sp24.y = 0.0f;
if (mAnm == ANM_DR_FLAP) {
if (sp24.abs() > 100.0f + l_HIO.wind_large_attack_lockon_range) {
mpModelMorf->setPlaySpeed(1.0f);
mCount[2] = 0;
mTimer[2] = 0;
if (mCount[1] == 0 && mTimer[1] == 0) {
mTimer[1] = l_HIO.unk_0x48;
mCount[1] = 1;
if (WREG_S(1) != 0) {
mTimer[1] = 200;
}
}
} else {
field_0x7d3 = 2;
mpModelMorf->setPlaySpeed(1.25f);
if (mCount[2] == 0) {
mCount[2] = 1;
mTimer[2] = l_HIO.center_wind_time;
if (WREG_S(1) != 0) {
mTimer[2] = 200;
}
}
}
if (NREG_S(0) != 0) {
OS_REPORT("mCount[1] %d\n", mCount[1]);
OS_REPORT("mCount[2] %d\n", mCount[2]);
OS_REPORT("mTimer[1] %d\n", mTimer[1]);
OS_REPORT("mTimer[2] %d\n\n", mTimer[2]);
}
if (WREG_S(1) == 0 && ((mCount[2] != 0 && cLib_calcTimer<int>(&mTimer[2]) == 0) || (mCount[1] != 0 && cLib_calcTimer<int>(&mTimer[1]) == 0))) {
mCount[1] = 0;
mTimer[1] = 0;
mCount[2] = 0;
mTimer[2] = 0;
setActionMode(ACTION_GLIDER_ATTACK, 0);
return;
}
if (sp24.abs() < l_HIO.wind_large_attack_lockon_range) {
mStatusONOFF(1);
} else {
mStatusONOFF(0);
}
}
cLib_addCalcAngleS2(&current.angle.y, fopAcM_searchPlayerAngleY(this), field_0x750, 0x400);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, 0x400);
cLib_addCalcAngleS2(&field_0x750, 8, 8, 20);
if (WREG_S(1) != 0) {
mTargetHeight = 1500.0f + mAcch.GetGroundH();
}
cLib_addCalc2(&current.pos.y, 400.0f + mTargetHeight, 0.8f, 20.0f);
}
/* 805C0CAC-805C0EF8 005F2C 024C+00 1/1 0/0 0/0 .text mGliderMoveSub__8daB_DR_cFf */
bool daB_DR_c::mGliderMoveSub(f32 param_0) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz sp18;
field_0x7a8.set(field_0x73c * cM_ssin(mCount[0] * (NREG_S(5) + 0x1000)), 0.0f, field_0x73c * cM_scos(mCount[0] * (NREG_S(5) + 0x1000)));
field_0x7a8 += field_0x7b4;
field_0x7a8.y = player->current.pos.y;
if (player->current.pos.y < 0.0f) {
field_0x7a8.y = 0.0f;
}
if (mPlayerHighCheck()) {
field_0x7a8.y = home.pos.y;
}
field_0x7a8.y += field_0x740;
cLib_addCalc2(&field_0x740, param_0, 0.8f, 25.0f + WREG_F(0));
sp18 = field_0x7a8 - current.pos;
if (sp18.abs() > 1300.0f + NREG_F(6)) {
return false;
}
if (field_0x7e9 == 0) {
mCount[0]++;
} else {
mCount[0]--;
}
return true;
}
/* 805C0EF8-805C1E0C 006178 0F14+00 2/1 0/0 0/0 .text executeGliderAttack__8daB_DR_cFv */
void daB_DR_c::executeGliderAttack() {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz mae;
cXyz ato;
f32 var_f31 = 0.0f;
switch (mMoveMode) {
case 0:
mStatusONOFF(0);
field_0x750 = 8;
field_0x740 = 4000.0f;
mAllClr();
if (cM_rnd() < 0.5f) {
field_0x7e9 = 0;
mCount[0] = 1;
} else {
field_0x7e9 = 1;
mCount[0] = 79;
}
if (BREG_S(4) != 0) {
field_0x7e9 = BREG_S(4) - 1;
if (field_0x7e9 == 0) {
mCount[0] = 1;
} else {
mCount[0] = 79;
}
}
field_0x7d6 = 1;
field_0x7a8.set((14000.0f + NREG_F(3)) * cM_ssin(mCount[0] * (NREG_S(5) + 0x1000)), 0.0f, (14000.0f + NREG_F(3)) * cM_scos(mCount[0] * (NREG_S(5) + 0x1000)));
field_0x7dc = 0;
field_0x7a8 += home.pos;
field_0x7a8.y += field_0x740;
mMoveMode++;
case 1:
ato = field_0x7a8 - current.pos;
ato.y = 0.0f;
if (abs((s16)(current.angle.y - (s16)ato.atan2sX_Z())) > 0x200) {
break;
}
mTimer[0] = 0;
mMoveMode++;
case 2:
case 3:
if (mMoveMode == 2 && mAnm != ANM_DR_HOVERING) {
mHabatakiAnmSet(0);
if (mAnm == ANM_DR_FLY || (mAnm == ANM_DR_FLAP_TO_FLY && (int)mpModelMorf->getFrame() >= 15)) {
mMoveMode++;
break;
}
} else {
mGlider_AniSet(0);
}
ato = field_0x7a8 - current.pos;
if (ato.abs() < 3000.0f + NREG_F(5)) {
if (field_0x7e9 == 0) {
mCount[0]++;
} else {
mCount[0]--;
}
if (mCount[3] == 0) {
field_0x750 = JREG_S(8) + 400;
mCount[3] = 1;
}
field_0x7a8.set((14000.0f + NREG_F(3)) * cM_ssin(mCount[0] * (NREG_S(5) + 0x1000)), 0.0f, (14000.0f + NREG_F(3)) * cM_scos(mCount[0] * (NREG_S(5) + 0x1000)));
field_0x7a8 += home.pos;
field_0x7a8.y += field_0x740;
}
if (NREG_S(0) != 0) {
OS_REPORT("mCount[0] %d\n", mCount[0]);
OS_REPORT("ato.abs() %f\n", ato.abs());
OS_REPORT(" current.pos.z %f\n", current.pos.z);
OS_REPORT("\n");
}
if (mCount[3] != 0) {
if (current.pos.z <= 9000.0f + BREG_F(4) && (field_0x7d1 == 0 || mPlayerHighCheck() || !dComIfGp_checkPlayerStatus0(0, 0x100))) {
mTimer[0] = 0;
ato = home.pos - player->current.pos;
ato.y = 0.0f;
if ((field_0x7d1 == 0 || !mPlayerHighCheck()) && player->current.pos.x >= -l_HIO.unk_0x18 && player->current.pos.x <= l_HIO.unk_0x18) {
ato = home.pos - current.pos;
ato.y = 0.0f;
field_0x73c = ato.abs() / (1.0f + WREG_F(2));
field_0x7b4.set(home.pos);
if (field_0x7e9 == 0) {
mCount[0]++;
} else {
mCount[0]--;
}
mMoveMode = 10;
field_0x748 = 350.0f;
} else {
ato = home.pos - current.pos;
ato.y = 0.0f;
field_0x73c = ato.abs() / (1.0f + WREG_F(2));
field_0x7b4.set(home.pos);
field_0x748 = mTargetHeight;
mMoveMode = 0xB;
}
if (field_0x7e9 == 0) {
mCount[0]++;
} else {
mCount[0]--;
}
field_0x7d6 = 0;
field_0x7a8.set(field_0x73c * cM_ssin(mCount[0] * (NREG_S(5) + 0x1000)), 0.0f, field_0x73c * cM_scos(mCount[0] * (NREG_S(5) + 0x1000)));
field_0x7a8 += home.pos;
if (player->current.pos.y >= 0.0f) {
field_0x7a8.y = player->current.pos.y + field_0x740;
} else {
field_0x7a8.y = field_0x740;
}
}
}
break;
case 11:
var_f31 = 200.0f + mTargetHeight;
ato = home.pos - current.pos;
ato.y = 0.0f;
if (field_0x73c < 6000.0f + BREG_F(12)) {
field_0x7dc = 1;
mGlider_AniSet(1);
}
if (field_0x73c < 8000.0f + BREG_F(13) && field_0x7d1 != 0 && !mPlayerHighCheck()) {
setActionMode(ACTION_PILLAR_SEARCH, 0);
return;
}
if (field_0x7dc != 0) {
mGlider_AniSet(1);
} else {
mGlider_AniSet(0);
}
case 10:
if (mMoveMode == 10) {
var_f31 = 5000.0f + WREG_F(1);
if (field_0x73c > 14000.0f || mAnm == ANM_DR_FLY_TO_GLIDE || mAnm == ANM_DR_GLIDE_TO_FLY) {
mGlider_AniSet(1);
} else if (current.pos.x >= -(4000.0f + WREG_F(10)) && current.pos.x <= (4000.0f + WREG_F(10))) {
mGliderAtAniSet();
field_0x7dc = 1;
}
if (-1000000000.0f != mAcch.GetGroundH()) {
if (mAnm == ANM_DR_WIND_ATTACKB) {
mCount[1]++;
if (mCount[1] > WREG_S(9)) {
var_f31 = 350.0f;
mCount[1] = WREG_S(9) + 1;
}
}
field_0x7dc = 1;
}
if (field_0x7dc != 0) {
mGliderAtAniSet();
}
}
cLib_addCalc2(&field_0x748, var_f31, 0.1f, 0.025f);
if (mGliderMoveSub(field_0x748) != 0) {
if (field_0x73c < 3000.0f + BREG_F(14)) {
if (mMoveMode == 11) {
if (mPlayerHighCheck() != 0) {
setActionMode(ACTION_BREATH_ATTACK, 0);
} else if (field_0x7d1 == 2) {
setActionMode(ACTION_FLY_WAIT, 0);
} else if (field_0x7d1 == 0) {
setActionMode(ACTION_WIND_ATTACK, 0);
}
return;
}
if (field_0x7e9 == 0) {
mCount[0] = 1;
} else {
mCount[0] = 0x4F;
}
field_0x73c = 14000.0f + NREG_F(3);
field_0x740 = 350.0f;
field_0x7a8.set(field_0x73c * cM_ssin(mCount[0] * (NREG_S(5) + 0x1000)), 0.0f, field_0x73c * cM_scos(mCount[0] * (NREG_S(5) + 0x1000)));
field_0x7a8 += home.pos;
field_0x7a8.y += field_0x740;
mTimer[0] = 0;
mCount[2] = 0;
mMoveMode = 20;
} else {
field_0x73c -= 4000.0f + BREG_F(15);
}
}
break;
case 20:
mGlider_WindPosSet();
var_f31 = 350.0f;
if (mCount[2] == 0 && current.pos.z > 3000.0f + BREG_F(16)) {
mCount[2] = 1;
}
if (mCount[2] != 0) {
var_f31 = 5000.0f + WREG_F(1);
mGlider_AniSet(0);
}
cLib_addCalc2(&field_0x748, var_f31, 0.1f, 0.025f);
if (mGliderMoveSub(field_0x748) != 0) {
mStatusONOFF(0);
attention_info.distances[fopAc_attn_BATTLE_e] = 0;
attention_info.flags &= ~0x4;
fopAcM_OffStatus(this, 0);
mCount[2] = 0;
mTimer[1] = 20;
mMoveMode++;
}
break;
case 21:
mGliderMoveSub(4000.0f);
mGlider_AniSet(0);
if (cLib_calcTimer<int>(&mTimer[1]) != 0) {
mGlider_WindPosSet();
if (mTimer[1] == 1) {
mGlider_WindPos.zero();
}
break;
}
field_0x73c = 14000.0f;
mMoveMode++;
case 22:
mGliderMoveSub(4000.0f);
if (current.pos.z < -4000.0f) {
ato = home.pos - current.pos;
ato.y = 0.0f;
field_0x73c = ato.abs() / (1.0f + WREG_F(2));
if (field_0x7e9 == 0) {
mCount[0]++;
} else {
mCount[0]--;
}
field_0x7b4.set(home.pos);
field_0x748 = mTargetHeight;
mMoveMode = 0xB;
} else {
mGlider_AniSet(0);
}
}
ato = field_0x7a8 - current.pos;
cLib_addCalcAngleS2(&current.angle.y, (s16)ato.atan2sX_Z(), field_0x750, JREG_S(2) + 0x500);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, JREG_S(3) + 0x500);
cLib_addCalcAngleS2(&field_0x750, JREG_S(4) + 8, JREG_S(5) + 20, JREG_S(6) + 40);
cLib_addCalcAngleS2(&current.angle.x, ato.atan2sY_XZ(), 20, NREG_S(3) + 0x400);
cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, NREG_S(2) + 20, NREG_S(3) + 0x400);
if (mMoveMode >= 2) {
f32 var_f30 = 90.0f + NREG_F(9);
if (mAnm == ANM_DR_FLY) {
var_f30 = 120.0f + NREG_F(9);
}
cLib_addCalc2(&speedF, var_f30, 0.5f, 2.0f);
}
if (mMoveMode < 10 || mMoveMode > 22) {
cMtx_YrotS(*calc_mtx, current.angle.y);
cMtx_XrotM(*calc_mtx, current.angle.x);
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = speedF;
MtxPosition(&mae, &ato);
cLib_addCalc2(&speed.y, ato.y, 0.8f, 10.0f);
} else {
cLib_addCalc0(&speed.y, 0.8f, 10.0f);
cLib_addCalc2(&current.pos.y, field_0x7a8.y, 0.8f, 25.0f);
}
}
/* 805C1E0C-805C24BC 00708C 06B0+00 1/1 0/0 0/0 .text executePillarSearch__8daB_DR_cFv */
void daB_DR_c::executePillarSearch() {
static cXyz mPillarTop_dt[] = {
cXyz(3100.0f, 5500.0f, 1500.0f),
cXyz(3100.0f, 5500.0f, -1500.0f),
cXyz(-3100.0f, 5500.0f, 1500.0f),
cXyz(-3100.0f, 5500.0f, -1500.0f),
};
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz sp30;
switch (mMoveMode) {
case 0:
mTimer[0] = 0;
field_0x750 = JREG_S(8) + 800;
if (field_0x7e9 == 0) {
mCount[1] = 2;
} else {
mCount[1] = 0;
}
mCount[1] += (int)cM_rndF(2.0f);
mCount[1] &= 3;
field_0x73c = 14000.0f;
mMoveMode++;
break;
case 1:
mGlider_AniSet(1);
field_0x7a8.set(mPillarTop_dt[mCount[1]]);
field_0x7b4.set(mPillarTop_dt[mCount[1]]);
field_0x7b4.y = 6000.0f;
sp30 = field_0x7a8 - current.pos;
sp30.y = 0.0f;
if (sp30.abs() > 2000.0f + NREG_F(12)) {
break;
}
mMoveMode++;
case 2:
cLib_addCalc2(&current.pos.y, field_0x7b4.y, 0.8f + NREG_F(10), 5.0f + NREG_F(11));
cLib_addCalc2(&speedF, 20.0f + NREG_F(14), 0.8f + NREG_F(15), 4.0f + NREG_F(16));
if (!(fabsf(current.pos.y - field_0x7b4.y) > 20.0f) && !(speedF > 22.0f + NREG_F(14))) {
mHabatakiAnmSet(0);
field_0x7a8.set(home.pos);
cLib_addCalc2(&current.pos.x, field_0x7b4.x, 0.8f + NREG_F(10), speedF);
cLib_addCalc2(&current.pos.z, field_0x7b4.z, 0.8f + NREG_F(10), speedF);
sp30 = field_0x7b4 - current.pos;
if (mAnm == ANM_DR_HOVERING) {
if ((int)mpModelMorf->getFrame() >= (int)(mpModelMorf->getEndFrame() - 1.0f) && sp30.abs() < 20.0f) {
speedF = 0.0f;
field_0x7a8.set(mPillarTop_dt[mCount[1]]);
field_0x7a8.y = 6000.0f;
setActionMode(ACTION_PILLAR_WAIT, 0);
}
}
}
break;
}
if (mActionMode != ACTION_PILLAR_WAIT) {
sp30 = field_0x7a8 - current.pos;
cLib_addCalcAngleS2(&current.angle.y, (s16)sp30.atan2sX_Z(), field_0x750, JREG_S(2) + 0x400);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, field_0x750, JREG_S(3) + 0x400);
cLib_addCalcAngleS2(&field_0x750, JREG_S(4) + 10, JREG_S(5) + 10, JREG_S(6) + 20);
cLib_addCalcAngleS2(&current.angle.x, sp30.atan2sY_XZ(), 20, NREG_S(3) + 0x400);
cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, NREG_S(2) + 20, NREG_S(3) + 0x400);
if (mPlayerHighCheck() && -1000000000.0f != mAcch.GetGroundH()) {
setActionMode(ACTION_BREATH_ATTACK, 0);
}
}
}
/* 805C24BC-805C2BE8 00773C 072C+00 1/1 0/0 0/0 .text executePillarWait__8daB_DR_cFv */
void daB_DR_c::executePillarWait() {
#ifdef DEBUG
dDbVw_Report(30, 100, "Pole wait tyuu Timer:%d ", mTimer[0]);
if (mTimer[1] != 0) {
dDbVw_Report(30, 100, "sukosi zensin :%d ", mTimer[1]);
}
#endif
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
cXyz at_vec((40.0f + JREG_F(3)) * cM_ssin(shape_angle.y), 0.0f, (40.0f + JREG_F(3)) * cM_scos(shape_angle.y));
cXyz sp14;
switch (mMoveMode) {
case 0:
mStatusONOFF(2);
dComIfGs_onSaveDunSwitch(22);
field_0x7d6 = 0;
mAllClr();
mTimer[2] = 50;
mTimer[0] = l_HIO.unk_0x62;
mPillarCc.OnCoSetBit();
speed.y = 0.0f;
gravity = 0.0f;
setBck(ANM_DR_POLE_STAYA, 0, 3.0f, 1.0f);
mMoveMode++;
break;
case 1:
if (!(fabsf(current.pos.y - field_0x7a8.y) > 2.0f) && mpModelMorf->isStop()) {
current.pos.y = field_0x7a8.y;
setBck(ANM_DR_POLE_STAYB, 2, 20.0f, 1.0f);
mMoveMode++;
}
break;
case 2:
if (mAnm == ANM_DR_POLE_STAYD && mpModelMorf->isStop()) {
setBck(ANM_DR_POLE_STAYB, 2, 20.0f, 1.0f);
}
if (cLib_calcTimer<int>(&mTimer[2]) == 0 && mCount[0] == 0) {
setBck(ANM_DR_POLE_STAYD, 0, 10.0f, 1.0f);
mCount[0] = 1;
}
if (player->getHookshotTopPos()) {
sp14.set(current.pos);
sp14.y -= 500.0f;
if (player->getHookshotTopPos()->abs(sp14) < 500.0f) {
mStatusONOFF(0);
mPillarCc.ClrTgHit();
mPillarCc.OffCoSetBit();
field_0x7a8.y = mTargetHeight;
setBck(ANM_DR_POLE_STAYC, 0, 3.0f, 1.0f);
mMoveMode++;
break;
}
}
if (mPlayerHighCheck()) {
mTimer[0] = l_HIO.unk_0x62;
}
if ((fopAcM_searchPlayerDistanceXZ(this) < 350.0f && player->current.pos.y > 4500.0f) || mTargetHeight < player->current.pos.y || cLib_calcTimer<int>(&mTimer[0]) == 0 || (player->current.pos.y >= 5000.0f && fopAcM_searchPlayerDistanceXZ(this) > 3100.0f) || mPillarCc.ChkTgHit()) {
mStatusONOFF(0);
mPillarCc.ClrTgHit();
mPillarCc.OffCoSetBit();
field_0x7a8.set(current.pos);
field_0x7a8.y = 100.0f + mTargetHeight;
setBck(ANM_DR_POLE_STAYC, 0, 3.0f, 1.0f);
mMoveMode++;
}
break;
case 3:
if ((int)mpModelMorf->getFrame() >= 14) {
field_0x7a8.y = 6150.0f;
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, 40.0f, 10.0f);
}
if (!mpModelMorf->isStop()) {
break;
}
field_0x7a8.set(home.pos);
field_0x7a8.y = mTargetHeight;
dComIfGs_offSaveDunSwitch(22);
setBck(ANM_DR_HOVERING, 2, 3.0f, 1.0f);
mMoveMode++;
case 4:
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, 20.0f, 5.0f);
if (!(mAcch.GetGroundH() > 1000.0f)) {
if (home.pos.y + l_HIO.breath_attack_threshold <= player->current.pos.y) {
setActionMode(ACTION_BREATH_ATTACK, 0);
} else if (field_0x7d1 != 2) {
setActionMode(ACTION_WAIT, 0);
} else {
setActionMode(ACTION_FLY_WAIT, 0);
}
}
break;
}
sp14.set(current.pos);
sp14.y += -200.0f;
mPillarCc.SetC(sp14);
mPillarCc.SetH(1000.0f);
mPillarCc.SetR(400.0f);
mPillarCc.SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mPillarCc);
cLib_addCalc0(&speedF, 0.8f, 5.0f);
sp14 = home.pos - current.pos;
cLib_addCalcAngleS2(&current.angle.y, (s16)sp14.atan2sX_Z(), 10, 0x400);
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 10, 0x400);
}
/* 805C2BE8-805C2CD0 007E68 00E8+00 4/4 0/0 0/0 .text startDemoCheck__8daB_DR_cFv */
bool daB_DR_c::startDemoCheck() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
camera_class* camera0 = dComIfGp_getCamera(0);
if (!eventInfo.i_checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0);
eventInfo.i_onCondition(2);
mDemoCamEye = camera0->lookat.eye;
mDemoCamCenter = camera0->lookat.center;
return false;
} else {
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(3);
daPy_getPlayerActorClass()->changeOriginalDemo();
return true;
}
}
/* 805C2CD0-805C3558 007F50 0888+00 2/1 0/0 0/0 .text executeDamageDemo__8daB_DR_cFv */
void daB_DR_c::executeDamageDemo() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz unused;
cXyz unused2;
cXyz mae;
cXyz ato;
switch (mMoveMode) {
case 0:
if (startDemoCheck()) {
mAllClr();
current.pos.x = home.pos.x;
current.pos.z = home.pos.z;
setBck(ANM_DR_BOOT_A_DEMO, 0, 0.0f, 1.0f);
mMoveMode++;
}
break;
case 1:
cMtx_YrotS(*calc_mtx, (shape_angle.y + 0x8000));
mae.x = -500.0f + ZREG_F(0);
mae.y = -1400.0f + ZREG_F(1);
mae.z = 1100.0f + ZREG_F(2);
MtxPosition(&mae, &ato);
ato += current.pos;
if (ato.y < 200.0f) {
ato.y = 200.0f;
}
mDemoCamEye.set(ato);
cMtx_YrotS(*calc_mtx, (shape_angle.y + 0x8000));
mae.x = ZREG_F(3);
mae.y = -850.0f + ZREG_F(4);
mae.z = ZREG_F(5);
MtxPosition(&mae, &ato);
ato += current.pos;
if (ato.y < 200.0f) {
ato.y = 200.0f;
}
mDemoCamCenter.set(ato);
if ((int)mpModelMorf->getFrame() < 50) {
break;
}
mMoveMode++;
case 2:
cMtx_YrotS(*calc_mtx, (shape_angle.y + 0x8000));
mae.x = 400.0f + ZREG_F(0);
mae.y = 700.0f + ZREG_F(1);
mae.z = -1200.0f + ZREG_F(2);
MtxPosition(&mae, &ato);
ato += current.pos;
mDemoCamEye.set(ato);
cMtx_YrotS(*calc_mtx, (shape_angle.y + 0x8000));
mae.x = ZREG_F(3);
mae.y = 400.0f + ZREG_F(4);
mae.z = ZREG_F(5);
MtxPosition(&mae, &ato);
ato += current.pos;
mDemoCamCenter.set(ato);
if (mpModelMorf->isStop() && BREG_S(2) == 0) {
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
if (bitSw != 0xFF) {
fopAcM_onSwitch(this, bitSw);
}
setActionMode(ACTION_TAIL_HIT, 10);
if (mAnm != ANM_DR_BOOT_A) {
setBck(ANM_DR_BOOT_A, 0, 10.0f, 1.0f);
}
}
break;
case 10:
if (startDemoCheck()) {
shape_angle.y = current.angle.y = home.angle.y;
current.pos.x = home.pos.x;
current.pos.z = home.pos.z;
daPy_getPlayerActorClass()->setPlayerPosAndAngle(&player->current.pos, home.angle.y, 0);
setBck(ANM_DR_IMPACT, 0, 3.0f, 1.0f);
mMoveMode++;
}
break;
case 11:
if (mAnm == ANM_DR_BOOT_C) {
if ((int)mpModelMorf->getFrame() >= 34) {
cLib_addCalc2(&mDemoCamCenter.y, player->current.pos.y, 0.7f, 150.0f);
}
if (mpModelMorf->isStop()) {
setBck(ANM_DR_DOWN_WAIT, 2, 3.0f, 1.0f);
mTimer[0] = 35;
}
}
if (mAnm == ANM_DR_IMPACT && mpModelMorf->isStop()) {
setBck(ANM_DR_BOOT_C, 0, 3.0f, 1.0f);
gravity = -1.0f;
}
if (!mBgFallGroundCheck()) {
break;
}
dComIfGs_onZoneSwitch(1, fopAcM_GetRoomNo(this));
mMoveMode++;
case 12:
if (mAnm == ANM_DR_BOOT_C) {
if ((int)mpModelMorf->getFrame() >= 34) {
cLib_addCalc2(&mDemoCamCenter.y, player->current.pos.y, 0.7f, 150.0f);
}
mTimer[0] = 50;
if (!mpModelMorf->isStop()) {
break;
}
}
if (mAnm != ANM_DR_DOWN_WAIT) {
setBck(ANM_DR_DOWN_WAIT, 2, 10.0f, 1.0f);
mTimer[0] = 35;
}
if (cLib_calcTimer<int>(&mTimer[0]) != 0) {
break;
}
mTimer[0] = 70;
mMoveMode++;
case 13:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
field_0x7d7 = 1;
mTimer[0] = 35;
setActionMode(ACTION_TAIL_HIT, 20);
}
}
if (mMoveMode >= 10 && mMoveMode <= 12) {
if (mAnm != ANM_DR_BOOT_C && mAnm != ANM_DR_DOWN_WAIT) {
ato.set(home.pos);
ato.y += 1200.0f + JREG_F(10);
mDemoCamCenter.set(ato);
} else {
ato.set(1500.0f, 0.0f, 1500.0f);
daPy_getPlayerActorClass()->setPlayerPosAndAngle(&ato, -0x8000, 0);
}
cMtx_YrotS(*calc_mtx, shape_angle.y - (JREG_S(8) + 0x1000));
mae.x = 0.0f;
mae.y = 200.0f + JREG_F(11);
mae.z = 1000.0f + JREG_F(12);
MtxPosition(&mae, &ato);
mDemoCamEye = (ato + current.pos) + mBoot_c_trance;
daPy_getPlayerActorClass()->onBossRoomWait();
}
if (mMoveMode != 0 && mMoveMode != 10) {
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye);
}
if (mAnm == ANM_DR_BOOT_C) {
if (mpModelMorf->checkFrame(45.0f)) {
if (field_0x7d1 == 0) {
mSound.startCreatureSound(Z2SE_EN_DR_CRASH, 0, -1);
field_0x7d1 = 1;
mBreakPartsNo++;
}
field_0x7e0 = 0;
}
mBoot_c_tranceSet(0);
if ((int)mpModelMorf->getFrame() >= 45) {
chkPartCreate(0);
}
}
cXyz offset;
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::multVec(&eyePos, &offset);
daPy_getPlayerActorClass()->setHookshotCarryOffset(fopAcM_GetID(this), &offset);
}
/* 805C3558-805C36A4 0087D8 014C+00 1/1 0/0 0/0 .text executeMiddleDemo__8daB_DR_cFv */
void daB_DR_c::executeMiddleDemo() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz unused;
cXyz unused2;
cXyz mae;
cXyz ato;
switch (mMoveMode) {
case 0:
if (startDemoCheck()) {
mAllClr();
mMoveMode++;
}
break;
case 1:
cMtx_YrotS(*calc_mtx, fopAcM_searchPlayerAngleY(this) + 0x8000);
mae.x = ZREG_F(0);
mae.y = ZREG_F(1);
mae.z = ZREG_F(2);
MtxPosition(&mae, &ato);
ato += player->current.pos;
mDemoCamCenter.set(ato);
break;
}
if (mMoveMode >= 1) {
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye);
}
}
/* 805C36A4-805C382C 008924 0188+00 1/1 0/0 0/0 .text executeDead__8daB_DR_cFv */
void daB_DR_c::executeDead() {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
fopAc_ac_c* player = dComIfGp_getPlayer(0);
cXyz unused;
cXyz unused2;
cXyz mae;
cXyz ato;
switch (mMoveMode) {
case 0:
if (!startDemoCheck()) {
break;
}
mAllClr();
case 1:
cMtx_YrotS(*calc_mtx, shape_angle.y);
mae.x = ZREG_F(0);
mae.y = ZREG_F(1);
mae.z = ZREG_F(2);
MtxPosition(&mae, &ato);
ato += current.pos;
mDemoCamCenter.set(ato);
cMtx_YrotS(*calc_mtx, shape_angle.y);
mae.x = ZREG_F(3);
mae.y = ZREG_F(4);
mae.z = 100.0f + ZREG_F(5);
MtxPosition(&mae, &ato);
ato += current.pos;
mDemoCamEye.set(ato);
break;
}
if (mMoveMode >= 1) {
camera->mCamera.Set(mDemoCamCenter, mDemoCamEye);
}
}
/* 805C382C-805C39D8 008AAC 01AC+00 1/1 0/0 0/0 .text executeBullet__8daB_DR_cFv */
void daB_DR_c::executeBullet() {
cXyz mae;
switch (mMoveMode) {
case 0:
field_0x730 = 100.0f;
speedF = 100.0f;
mAllClr();
mTimer[0] = data_805C7974;
mMoveMode++;
return;
case 1:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
fopAcM_delete(this);
return;
}
if (parentActorID != 0) {
daB_DR_c* dr_p = (daB_DR_c*)fopAcM_SearchByID(fopAcM_GetLinkId(this));
if (dr_p != NULL) {
current.angle.y -= (s16)((s16)(dr_p->mHeadAngle.y - home.angle.y) * (0.002f + JREG_F(13)));
}
}
cMtx_YrotS(*calc_mtx, current.angle.y);
cMtx_XrotM(*calc_mtx, current.angle.x);
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = speedF;
MtxPosition(&mae, &speed);
field_0x730 += 10.0f;
if (field_0x730 > 100.0f) {
field_0x730 = 100.0f;
}
mBreathAtCc.SetC(current.pos);
mBreathAtCc.SetR(field_0x730);
dComIfG_Ccsp()->Set(&mBreathAtCc);
}
}
/* 805C39D8-805C3CB0 008C58 02D8+00 2/1 0/0 0/0 .text executeParts__8daB_DR_cFv */
void daB_DR_c::executeParts() {
camera_class* camera = dComIfGp_getCamera(0);
cXyz mae;
cXyz ato;
switch (mMoveMode) {
case 0:
speedF = 20.0f + ZREG_F(13) + cM_rndF(10.0f + ZREG_F(14));
current.angle.y += (s16)cM_rndFX(65536.0f);
speed.y = 30.0f + ZREG_F(10);
speed.y += cM_rndFX(10.0f + ZREG_F(11));
field_0x752 = cM_rndF(2048.0f + ZREG_F(9));
mTimer[0] = 100;
gravity = -3.0f + ZREG_F(12);
mMoveMode++;
break;
case 1:
shape_angle.x += field_0x752;
if (!mAcch.ChkGroundHit()) {
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
fopAcM_delete(this);
}
break;
}
field_0x752 *= 2;
mMoveMode++;
case 2:
shape_angle.x += field_0x752;
cLib_addCalc0(&speedF, 0.7f, 1.0f + ZREG_F(15));
cLib_addCalcAngleS2(&field_0x752, 0, 8, speedF);
if (speedF > 0.2f) {
break;
}
speedF = 0.0f;
mTimer[0] = 10;
mMoveMode++;
case 3:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
setDeathLightEffect();
fopAcM_delete(this);
}
break;
case 10:
speedF = 40.0f + ZREG_F(13) + cM_rndF(10.0f + ZREG_F(14));
mTimer[0] = 50;
current.angle.x += (s16)cM_rndFX(16384.0f);
mae = camera->lookat.center - current.pos;
current.angle.y = mae.atan2sX_Z();
current.angle.y += (s16)cM_rndFX(16384.0f);
cMtx_YrotS(*calc_mtx, current.angle.y);
cMtx_XrotM(*calc_mtx, current.angle.x);
mae.x = 0.0f;
mae.y = 0.0f;
mae.z = speedF;
MtxPosition(&mae, &ato);
speed.y = ato.y;
mMoveMode++;
break;
case 11:
if (cLib_calcTimer<int>(&mTimer[0]) == 0) {
fopAcM_delete(this);
}
break;
}
}
/* 805C3CB0-805C40E0 008F30 0430+00 2/1 0/0 0/0 .text action__8daB_DR_cFv */
void daB_DR_c::action() {
tail_hit_check();
week_hit_check();
field_0x7d4 = 0;
field_0x7d3 = 0;
switch (mActionMode) {
case ACTION_WAIT:
executeWait();
break;
case ACTION_FLY_WAIT:
executeFlyWait();
break;
case ACTION_TAIL_HIT:
field_0x7d4 = 1;
executeTailHit();
break;
case ACTION_WEEK_HIT:
field_0x7d4 = 1;
executeWeekHit();
break;
case ACTION_WIND_ATTACK:
field_0x7d3 = 2;
executeWindAttack();
break;
case ACTION_BREATH_ATTACK:
case ACTION_BREATH_ATTACK2:
executeBreathAttack();
break;
case ACTION_GLIDER_ATTACK:
field_0x7d4 = 1;
executeGliderAttack();
break;
case ACTION_PILLAR_SEARCH:
field_0x7d4 = 1;
executePillarSearch();
break;
case ACTION_PILLAR_WAIT:
field_0x7d4 = 1;
executePillarWait();
break;
case ACTION_DAMAGE_DEMO:
field_0x7d4 = 1;
executeDamageDemo();
break;
case ACTION_MIDDLE_DEMO:
field_0x7d4 = 1;
executeMiddleDemo();
break;
case ACTION_DEAD:
field_0x7d4 = 1;
executeDead();
break;
}
if (NREG_S(1) != 0) {
OS_REPORT("mActionMode %d\n", mActionMode);
OS_REPORT("mMoveMode %d\n", mMoveMode);
}
if (mAnm == ANM_DR_TAKE_OFF) {
if ((int)mpModelMorf->getFrame() >= 30) {
field_0x7d3 = 2;
}
}
if (mAnm == ANM_DR_BOOT_A_DEMO) {
if (mpModelMorf->checkFrame(8.0f)) {
dComIfGp_getVibration().StartShock(5, 0x4F, cXyz(0.0f, 1.0f, 0.0f));
}
if (mpModelMorf->checkFrame(50.0f)) {
field_0x7db = 1;
dComIfGp_getVibration().StartQuake(7, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
}
} else if (field_0x7db == 1) {
field_0x7db = 0;
dComIfGp_getVibration().StopQuake(0x1F);
}
setSe();
if (daPy_getPlayerActorClass()->checkWolfLock(this)) {
daPy_getPlayerActorClass()->cancelWolfLock(this);
}
if (mActionMode != ACTION_GLIDER_ATTACK || mMoveMode == 1000) {
if (current.angle.x != 0 || shape_angle.x != 0) {
cLib_addCalcAngleS2(&current.angle.x, 0, 8, 0x400);
cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 8, 0x400);
}
field_0x74e = 0;
} else {
s16 temp_r28 = -3.0f * (current.angle.y - shape_angle.y);
if (abs(temp_r28) < 0x2000) {
field_0x74e = temp_r28;
}
if (mAnm == ANM_DR_WIND_ATTACKATOB || mAnm == ANM_DR_WIND_ATTACKB || -1000000000.0f != mAcch.GetGroundH() || mCount[3] == 0) {
field_0x74e = 0;
}
}
cLib_addCalcAngleS2(&shape_angle.z, field_0x74e, NREG_S(6) + 40, NREG_S(7) + 0x400);
if (BREG_S(1) != 0) {
mWeekCc.OnTgSetBit();
speedF = 0.0f;
speed.zero();
}
fopAcM_posMoveF(this, mColliderStts.GetCCMoveP());
if (mActionMode != ACTION_BREATH_ATTACK && mActionMode != ACTION_BREATH_ATTACK2) {
mHeadAngleSet();
}
mAcch.SetWallNone();
mAcch.SetGroundUpY(75.0f);
mAcch.CrrPos(dComIfG_Bgsp());
mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
mSound2.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
mpCoreBrk->play();
}
/* 805C40E0-805C4130 009360 0050+00 1/1 0/0 0/0 .text action_fire__8daB_DR_cFv */
void daB_DR_c::action_fire() {
executeBullet();
shape_angle = current.angle;
fopAcM_posMove(this, mColliderStts.GetCCMoveP());
}
/* 805C4130-805C41A4 0093B0 0074+00 1/1 0/0 0/0 .text action_parts__8daB_DR_cFv */
void daB_DR_c::action_parts() {
executeParts();
fopAcM_posMoveF(this, mColliderStts.GetCCMoveP());
mAcch.CrrPos(dComIfG_Bgsp());
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
}
/* 805C41A4-805C4684 009424 04E0+00 2/2 0/0 0/0 .text mtx_set__8daB_DR_cFv */
void daB_DR_c::mtx_set() {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::transM(mBoot_c_trance.x, mBoot_c_trance.y, mBoot_c_trance.z);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
mpModelMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
mpModelMorf->modelCalc();
if (mAnm == ANM_DR_POLE_STAYA) {
cXyz sp1C;
dBgS_GndChk sp28;
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(0x22));
mDoMtx_stack_c::multVecZero(&sp1C);
sp28.SetPos(&sp1C);
f32 var_f31 = dComIfG_Bgsp().GroundCross(&sp28);
if (-1000000000.0f == var_f31 || var_f31 < 5250.0f + JREG_F(4)) {
var_f31 = 5250.0f + JREG_F(4);
}
field_0x7a8.y = var_f31;
if ((int)mpModelMorf->getFrame() < 35.0f + JREG_F(5)) {
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, 10.0f + JREG_F(6), 5.0f + JREG_F(7));
} else {
cLib_addCalcPos(&current.pos, field_0x7a8, 0.8f, 20.0f + JREG_F(8), 5.0f + JREG_F(9));
}
if (current.pos.y < field_0x7a8.y) {
current.pos.y = field_0x7a8.y;
}
}
if (mAnm == ANM_DR_WIND_ATTACKB && -1000000000.0f != mAcch.GetGroundH()) {
cXyz sp10 = current.pos - home.pos;
if (sp10.abs() > 3000.0f || current.pos.y > 370.0f) {
if (field_0x7d8 == 0) {
mSound.startCreatureVoice(Z2SE_EN_DR_V_TUME, -1);
field_0x7d8 = 1;
}
} else {
for (int i = 0; i < 4; i++) {
static u16 effLId[] = {0x89E4, 0x89E5, 0x89E6, 0x89E7};
field_0x27ec[i] = dComIfGp_particle_set(field_0x27ec[i], effLId[i], &current.pos, NULL, NULL);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x27ec[i]);
if (emitter != NULL) {
emitter->setGlobalSRTMatrix(mpModelMorf->getModel()->getAnmMtx(0x22));
}
mSound.startCreatureSoundLevel(Z2SE_EN_DR_TUME, 0, -1);
static u16 effRId[] = {0x89E8, 0x89E9, 0x89EA, 0x89EB};
field_0x27fc[i] = dComIfGp_particle_set(field_0x27fc[i], effRId[i], &current.pos, NULL, NULL);
emitter = dComIfGp_particle_getEmitter(field_0x27fc[i]);
if (emitter != NULL) {
emitter->setGlobalSRTMatrix(mpModelMorf->getModel()->getAnmMtx(0x2A));
}
}
}
}
}
/* 805C4684-805C46E0 009904 005C+00 1/1 0/0 0/0 .text parts_mtx_set__8daB_DR_cFv */
void daB_DR_c::parts_mtx_set() {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::scaleM(scale.x, scale.y, scale.z);
mpPartModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
/* 805C46E0-805C4E14 009960 0734+00 1/1 0/0 0/0 .text cc_set__8daB_DR_cFv */
void daB_DR_c::cc_set() {
cXyz mae;
cXyz ato;
cXyz at_vec;
J3DModel* model_p = mpModelMorf->getModel();
if (mActionMode == ACTION_PILLAR_WAIT || mActionMode == ACTION_GLIDER_ATTACK) {
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x13));
mDoMtx_stack_c::multVecZero(&eyePos);
} else if (field_0x7d1 != 2) {
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x31));
mDoMtx_stack_c::multVecZero(&eyePos);
} else if (mWeekCc.ChkTgSet()) {
mDoMtx_stack_c::copy(model_p->getAnmMtx(15));
mDoMtx_stack_c::multVecZero(&eyePos);
}
attention_info.position = eyePos;
attention_info.position.y += 100.0f;
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x31));
mae.set(0.0f, 0.0f, 50.0f);
mDoMtx_stack_c::multVec(&mae, &ato);
mTailCc.SetC(ato);
mTailCc.SetR(250.0f);
dComIfG_Ccsp()->Set(&mTailCc);
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x13));
mDoMtx_stack_c::multVecZero(&field_0x760);
mDoMtx_stack_c::multVecZero(&field_0x790);
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x14));
mae.set(100.0f + ZREG_F(17), -200.0f + ZREG_F(18), ZREG_F(19));
mDoMtx_stack_c::multVec(&mae, &field_0x778);
at_vec.set(l_HIO.wind_small_attack_power * cM_ssin(shape_angle.y), 0.0f, l_HIO.wind_small_attack_power * cM_scos(shape_angle.y));
f32 wind_at_radius = 1000.0f;
bool var_r27 = false;
if (field_0x7d4 == 0) {
mDoMtx_stack_c::copy(model_p->getAnmMtx(0));
mDoMtx_stack_c::multVecZero(&ato);
mWindAtCc.SetC(ato);
mWindAtCc.SetR(wind_at_radius);
mWindAtCc.SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mWindAtCc);
}
if (mActionMode == ACTION_GLIDER_ATTACK) {
ato.set(mGlider_WindPos);
if (!mGlider_WindPos.x && !mGlider_WindPos.y && !mGlider_WindPos.z) {
wind_at_radius = 0.0f;
} else {
at_vec.set(l_HIO.glide_wind_power * cM_ssin(shape_angle.y), 0.0f, l_HIO.glide_wind_power * cM_scos(shape_angle.y));
wind_at_radius = 2000.0f;
field_0x784.set(mGlider_WindPos);
mSound2.startCreatureSoundLevel(Z2SE_EN_DR_WIND_ATTACK, 0, -1);
}
if (mAnm == ANM_DR_WIND_ATTACKB && -1000000000.0f != mAcch.GetGroundH() && mCount[1] > WREG_S(9)) {
var_r27 = 1;
}
mWindAtCc2.SetC(ato);
mWindAtCc2.SetR(wind_at_radius);
mWindAtCc2.SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mWindAtCc2);
}
if (field_0x7d3 != 0) {
mPlayerHighCheck();
ato.set(current.pos);
ato.y = 600.0f + field_0x734;
mWindAtCc3.SetC(ato);
mWindAtCc3.SetR(4500.0f);
if (field_0x7d3 == 2) {
at_vec.set(l_HIO.wind_attack_power * cM_ssin(shape_angle.y), 0.0f, l_HIO.wind_attack_power * cM_scos(shape_angle.y));
var_r27 = 1;
}
mSound.startCreatureSoundLevel(Z2SE_EN_DR_FLAP, 0, -1);
mWindAtCc3.SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mWindAtCc3);
}
if (var_r27 == 0) {
cLib_addCalc(&field_0x738, 0.6f, 0.05f, 0.003f, 0.00001f);
} else {
cLib_addCalc(&field_0x738, 0.9f, 0.5f, 0.2f, 0.001f);
dKyw_evt_wind_set(0, shape_angle.y);
}
dKyw_custom_windpower(field_0x738);
if (mAnm == ANM_DR_WIND_ATTACKB) {
at_vec.set((40.0f + JREG_F(3)) * cM_ssin(shape_angle.y), 0.0f, (40.0f + JREG_F(3)) * cM_scos(shape_angle.y));
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x1D));
mae.set(200.0f, 0.0f, 0.0f);
mDoMtx_stack_c::multVec(&mae, &ato);
mFootAtCc[0].SetC(ato);
mFootAtCc[0].SetR(150.0f);
mFootAtCc[0].SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mFootAtCc[0]);
mDoMtx_stack_c::copy(model_p->getAnmMtx(0x25));
mae.set(200.0f, 0.0f, 0.0f);
mDoMtx_stack_c::multVec(&mae, &ato);
mFootAtCc[1].SetC(ato);
mFootAtCc[1].SetR(150.0f);
mFootAtCc[1].SetAtVec(at_vec);
dComIfG_Ccsp()->Set(&mFootAtCc[1]);
}
mDoMtx_stack_c::copy(model_p->getAnmMtx(0xF));
mae.set(-200.0f + WREG_F(2), WREG_F(3), WREG_F(4));
mDoMtx_stack_c::multVec(&mae, &ato);
mWeekCc.SetC(ato);
mWeekCc.SetH(300.0f + WREG_F(5));
mWeekCc.SetR(150.0f + WREG_F(6));
dComIfG_Ccsp()->Set(&mWeekCc);
}
/* 805C4E14-805C4FB4 00A094 01A0+00 1/1 0/0 0/0 .text down_cc_set__8daB_DR_cFv */
void daB_DR_c::down_cc_set() {
cXyz mae;
cXyz ato;
for (int i = 0; i < 5; i++) {
static const struct {
int jnt_no;
Vec pos;
f32 height;
f32 radius;
} DOWN_CYL_DT[] = {
{ 0, 0.0f, -100.0f, 140.0f, 200.0f, 300.0f },
{ 6, -50.0f, 100.0f, 250.0f, 200.0f, 300.0f },
{ 7, -50.0f, 100.0f, 170.0f, 200.0f, 370.0f },
{ 12, 0.0f, 0.0f, -150.0f, 200.0f, 300.0f },
{ 13, 0.0f, 0.0f, -200.0f, 200.0f, 350.0f },
};
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(DOWN_CYL_DT[i].jnt_no));
mae.x = DOWN_CYL_DT[i].pos.x;
mae.y = DOWN_CYL_DT[i].pos.y;
mae.z = DOWN_CYL_DT[i].pos.z;
mDoMtx_stack_c::multVec(&mae, &ato);
mDownCc[i].SetC(ato);
mDownCc[i].SetH(DOWN_CYL_DT[i].height);
mDownCc[i].SetR(DOWN_CYL_DT[i].radius);
dComIfG_Ccsp()->Set(&mDownCc[i]);
}
for (int i = 0; i < 9; i++) {
static const struct {
int jnt_no;
Vec pos;
f32 radius;
} DOWN_SPH_DT[] = {
{ 19, 50.0f, 0.0f, 0.0f, 140.0f },
{ 43, 0.0f, 0.0f, 0.0f, 150.0f },
{ 44, 0.0f, 0.0f, 0.0f, 130.0f },
{ 45, 0.0f, 0.0f, 0.0f, 130.0f },
{ 46, 0.0f, 0.0f, 0.0f, 130.0f },
{ 47, 0.0f, 0.0f, 0.0f, 130.0f },
{ 48, 0.0f, 0.0f, 0.0f, 130.0f },
{ 29, 150.0f, 0.0f, -50.0f, 130.0f },
{ 37, 180.0f, 0.0f, -50.0f, 130.0f },
};
mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(DOWN_SPH_DT[i].jnt_no));
mae.x = DOWN_SPH_DT[i].pos.x;
mae.y = DOWN_SPH_DT[i].pos.y;
mae.z = DOWN_SPH_DT[i].pos.z;
mDoMtx_stack_c::multVec(&mae, &ato);
mDownSphCc[i].SetC(ato);
mDownSphCc[i].SetR(DOWN_SPH_DT[i].radius);
dComIfG_Ccsp()->Set(&mDownSphCc[i]);
}
}
/* 805C4FB4-805C50BC 00A234 0108+00 1/1 0/0 0/0 .text demo_skip__8daB_DR_cFi */
void daB_DR_c::demo_skip(int) {
fopAc_ac_c* parent;
if (cDmr_SkipInfo == 0 && fopAcM_SearchByID(parentActorID, &parent) && parent != NULL) {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
dStage_changeScene(1, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1);
Z2GetAudioMgr()->subBgmStop();
dKy_getEnvlight()->field_0x12cc = 1;
cDmr_SkipInfo = 1;
dComIfGs_onZoneSwitch(0, fopAcM_GetRoomNo(this));
dComIfGs_onZoneSwitch(20, fopAcM_GetRoomNo(this));
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
fopAcM_delete(parent);
}
}
/* 805C50BC-805C50F0 00A33C 0034+00 1/1 0/0 0/0 .text DemoSkipCallBack__8daB_DR_cFPvi */
int daB_DR_c::DemoSkipCallBack(void* i_proc, int param_1) {
if (i_proc != NULL) {
((daB_DR_c*)i_proc)->demo_skip(param_1);
return 1;
}
return 0;
}
/* 805C50F0-805C5588 00A370 0498+00 1/1 0/0 0/0 .text execute__8daB_DR_cFv */
int daB_DR_c::execute() {
if (field_0x7d5 != 0) {
cXyz restart_pos;
csXyz restart_angle;
if (field_0x7d5 > 10) {
field_0x7d5 -= 10;
return 1;
}
if (field_0x7d5 == 2) {
daNpcF_getPlayerInfoFromPlayerList(2, fopAcM_GetRoomNo(this), restart_pos, restart_angle);
dComIfGs_setRestartRoom(restart_pos, restart_angle.y, fopAcM_GetRoomNo(this));
OS_REPORT("2階からスタート \n");
OS_REPORT("2階からスタート \n");
OS_REPORT("2階からスタート \n");
} else {
daNpcF_getPlayerInfoFromPlayerList(0, fopAcM_GetRoomNo(this), restart_pos, restart_angle);
dComIfGs_setRestartRoom(restart_pos, restart_angle.y, fopAcM_GetRoomNo(this));
}
field_0x7d5 = 0;
}
if (arg0 == 0xFF) {
if (parentActorID != 0 && health > 1 && cLib_calcTimer<int>(&mTimer[0]) == 0) {
fopAc_ac_c* parent;
if (fopAcM_SearchByID(parentActorID, &parent) != 0 && parent != NULL && parent->subtype != 1) {
if (dComIfGs_isZoneSwitch(20, fopAcM_GetRoomNo(this))) {
dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 0);
}
} else if (!dComIfGs_isZoneSwitch(0, fopAcM_GetRoomNo(this)) && cLib_calcTimer<int>(&mTimer[0]) == 0) {
dComIfGs_onZoneSwitch(0, fopAcM_GetRoomNo(this));
dComIfGs_onZoneSwitch(20, fopAcM_GetRoomNo(this));
Z2GetAudioMgr()->bgmStart(Z2BGM_DRAGON_BTL01, 0, 0);
arg0 = 0;
}
}
if (arg0 == 0xFF) {
return 1;
}
}
if (arg0 == 0xFE && cLib_calcTimer<int>(&mTimer[0]) == 0) {
if (parentActorID != 0) {
fopAc_ac_c* parent = NULL;
if (!fopAcM_SearchByID(parentActorID, &parent)) {
if (!dComIfGp_event_runCheck()) {
arg0 = 1;
field_0x7d1 = 2;
parentActorID = 0;
mBreakPartsNo = 3;
mTargetHeight = 6000.0f + home.pos.y;
setBck(ANM_DR_TAKE_OFF, 0, 10.0f, 1.0f);
mBoot_c_trance.zero();
field_0x724 = 50.0f;
mMoveMode = 100;
dComIfGs_onZoneSwitch(2, fopAcM_GetRoomNo(this));
}
} else {
current.pos.set(parent->current.pos);
current.angle = parent->current.angle;
shape_angle = parent->shape_angle;
if (parent->subtype == 1 && field_0x7e0 < 54) {
if (mAnm != ANM_DR_BURU) {
setBck(ANM_DR_BURU, 0, 0.0f, 1.0f);
mpModelMorf->setStartFrame(111.0f);
mSound.startCreatureSound(Z2SE_EN_DR_CRASH, 0, -1);
}
mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size);
mpModelMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
mpModelMorf->modelCalc();
chkPartCreate(1);
}
}
}
return 1;
}
switch (arg0) {
case 10:
action_fire();
break;
case 20:
case 21:
action_parts();
parts_mtx_set();
break;
default:
action();
mtx_set();
cc_set();
if (field_0x7d7 != 0) {
down_cc_set();
}
}
return 1;
}
/* 805C5588-805C55A8 00A808 0020+00 2/1 0/0 0/0 .text daB_DR_Execute__FP8daB_DR_c */
static int daB_DR_Execute(daB_DR_c* i_this) {
return i_this->execute();
}
/* 805C55A8-805C55B0 00A828 0008+00 1/0 0/0 0/0 .text daB_DR_IsDelete__FP8daB_DR_c */
static int daB_DR_IsDelete(daB_DR_c* i_this) {
return 1;
}
/* 805C55B0-805C5684 00A830 00D4+00 1/1 0/0 0/0 .text _delete__8daB_DR_cFv */
int daB_DR_c::_delete() {
dComIfG_resDelete(&mPhase, "B_DR");
if (arg0 == 10) {
return 1;
}
if (arg0 == 0x14 || arg0 == 0x15) {
if (heap != NULL) {
mSound.deleteObject();
return 1;
}
}
if (mInitHIO) {
l_initHIO = 0;
}
if (heap != NULL) {
mSound.deleteObject();
mSound2.deleteObject();
}
return 1;
}
/* 805C5684-805C56A4 00A904 0020+00 1/0 0/0 0/0 .text daB_DR_Delete__FP8daB_DR_c */
static int daB_DR_Delete(daB_DR_c* i_this) {
return i_this->_delete();
}
/* 805C56A4-805C590C 00A924 0268+00 1/1 0/0 0/0 .text CreateHeap__8daB_DR_cFv */
int daB_DR_c::CreateHeap() {
if (arg0 == 0x14 || arg0 == 0x15) {
static int mPartDt[] = {74, 74, 75, 76, 77, 78};
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("B_DR", mPartDt[mPartNo]);
JUT_ASSERT(6312, modelData != 0);
mpPartModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (mpPartModel == NULL) {
return 0;
}
return 1;
}
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("B_DR", 0x49);
JUT_ASSERT(6324, modelData != 0);
mpModelMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("B_DR", 0x2F), 2, 1.0f, 0, -1, &mSound, 0, 0x11000084);
if (mpModelMorf == NULL || mpModelMorf->getModel() == NULL) {
return 0;
}
mpCoreBrk = new mDoExt_brkAnm();
if (mpCoreBrk == NULL) {
return 0;
}
J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_DR", 0x51);
if (!mpCoreBrk->init(mpModelMorf->getModel()->getModelData(), pbrk, 1, 2, 1.0f, 0, -1)) {
return 0;
}
this->model = mpModelMorf->getModel();
this->model->setUserArea((u32)this);
for (u16 i = 0; i < this->model->getModelData()->getJointNum(); i++) {
if (i != 0) {
this->model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack);
}
}
return 1;
}
/* 805C5954-805C5974 00ABD4 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
static int useHeapInit(fopAc_ac_c* i_this) {
return ((daB_DR_c*)i_this)->CreateHeap();
}
/* 805C5974-805C62B0 00ABF4 093C+00 1/1 0/0 0/0 .text create__8daB_DR_cFv */
int daB_DR_c::create() {
fopAcM_SetupActor(this, daB_DR_c);
int phase_state = dComIfG_resLoad(&mPhase, "B_DR");
if (phase_state == cPhs_COMPLEATE_e) {
u32 heap_size = 0x68E0;
arg0 = fopAcM_GetParam(this);
bitSw = (fopAcM_GetParam(this) & 0xFF00) >> 8;
bitSw2 = (fopAcM_GetParam(this) & 0xFF0000) >> 0x10;
bitSw3 = (fopAcM_GetParam(this) & 0xFF000000) >> 0x18;
if (arg0 == 0xFF) {
arg0 = 0;
}
switch (arg0) {
case 20:
case 21:
mPartNo = bitSw;
if (mPartNo > 5) {
mPartNo = 0;
}
bitSw = 0xFF;
OS_REPORT("パーツ %d\n", mPartNo);
case 10:
attention_info.distances[fopAc_attn_BATTLE_e] = 0;
attention_info.flags &= ~0x4;
fopAcM_SetGroup(this, 0);
fopAcM_OffStatus(this, 0);
gravity = 0.0f;
shape_angle = current.angle;
if (arg0 == 0xA) {
mColliderStts.Init(0xFF, 0, this);
mBreathAtCc.Set(cc_dr_breath_at_src);
mBreathAtCc.SetStts(&mColliderStts);
setActionMode(0xE, 0);
} else {
static u32 mParts_EstimateSizeDt[] = {0x1980, 0x1990, 0xD50, 0xD40, 0xD40, 0xD40};
if (arg0 != 0xA && !fopAcM_entrySolidHeap(this, useHeapInit, mParts_EstimateSizeDt[mPartNo])) {
return cPhs_ERROR_e;
}
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
mAcchCir.SetWall(20.0f, 40.0f);
mAcch.CrrPos(dComIfG_Bgsp());
gravity = -3.0f;
mSound.init(&current.pos, &eyePos, 3, 1);
mColliderStts.Init(0x19, NULL, this);
fopAcM_OnStatus(this, 0x4000);
if (arg0 == 0x14) {
setActionMode(0xF, 0);
} else {
setActionMode(0xF, 10);
}
}
break;
default:
if (dComIfGs_isStageBossEnemy()) {
cXyz warp_pos(-325.0f, 0.0f, 215.0f);
OS_REPORT("B_DR やられ後なので再セットしません\n");
fopAcM_createWarpHole(&warp_pos, &shape_angle, fopAcM_GetRoomNo(this), 2, 0, 0xFF);
if (!dComIfGs_isStageLife()) {
cXyz size(1.0f, 1.0f, 1.0f);
cXyz pos;
csXyz angle;
angle.x = angle.y = angle.z = 0;
pos.set(224.0f, 0.0f, 762.0f);
fopAcM_createItemForBoss(&pos, fpcNm_ITEM_UTAWA_HEART, fopAcM_GetRoomNo(this), &angle, &size, 0.0f, 0.0f, -1);
}
dScnKy_env_light_c* kankyo = dKy_getEnvlight();
kankyo->field_0x12cc = 0;
return cPhs_ERROR_e;
}
if (!fopAcM_entrySolidHeap(this, useHeapInit, heap_size)) {
return cPhs_ERROR_e;
}
OS_REPORT("B_DR PARAM %x\n", fopAcM_GetParam(this));
OS_REPORT("B_DR arg0 %x\n", arg0);
OS_REPORT("cDmr_SkipInfo %d\n", cDmr_SkipInfo);
OS_REPORT("B_DR bitSw %d\n", bitSw);
OS_REPORT("B_DR bitSw2 %d\n", bitSw2);
OS_REPORT("B_DR bitSw3 %d\n\n", bitSw3);
if (bitSw != 0xFF) {
fopAcM_offSwitch(this, bitSw);
}
if (bitSw2 != 0xFF) {
fopAcM_offSwitch(this, bitSw2);
}
if (bitSw3 != 0xFF) {
fopAcM_offSwitch(this, bitSw3);
}
dComIfGs_offSaveDunSwitch(22);
onWolfNoLock();
health = 24;
field_0x560 = 24;
if (!l_initHIO) {
l_initHIO = true;
mInitHIO = true;
l_HIO.field_0x4 = mDoHIO_CREATE_CHILD("翼竜", &l_HIO);
}
shape_angle.z = 0;
shape_angle.x = 0;
shape_angle.y = current.angle.y;
attention_info.distances[fopAc_attn_BATTLE_e] = 85;
attention_info.flags = 4;
fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx());
fopAcM_SetMin(this, -20000.0f, -20000.0f, -20000.0f);
fopAcM_SetMax(this, 20000.0f, 20000.0f, 20000.0f);
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
mAcchCir.SetWall(0.0f, 300.0f);
mAcch.CrrPos(dComIfG_Bgsp());
mColliderStts.Init(0xFF, 0, this);
mPillarCc.Set(cc_pillar_src);
mPillarCc.SetStts(&mColliderStts);
mWeekCc.Set(cc_dr_week_src);
mWeekCc.SetStts(&mColliderStts);
mWeekCc.OffTgSetBit();
mWindAtCc.Set(cc_dr_wind_at_src);
mWindAtCc.SetStts(&mColliderStts);
mWindAtCc2.Set(cc_dr_wind_at_src);
mWindAtCc2.SetStts(&mColliderStts);
mWindAtCc3.Set(cc_dr_wind_at_src);
mWindAtCc3.SetStts(&mColliderStts);
mTailCc.Set(cc_dr_tail_src);
mTailCc.SetStts(&mColliderStts);
for (int i = 0; i < 5; i++) {
mDownCc[i].Set(cc_down_src);
mDownCc[i].SetStts(&mColliderStts);
}
for (int i = 0; i < 9; i++) {
mDownSphCc[i].Set(cc_downSph_src);
mDownSphCc[i].SetStts(&mColliderStts);
}
for (int i = 0; i < 2; i++) {
mFootAtCc[i].Set(cc_dr_foot_at_src);
mFootAtCc[i].SetStts(&mColliderStts);
}
field_0x784.set(current.pos);
field_0x790.set(current.pos);
mSound.init(&current.pos, &field_0x790, &eyePos, 3, 1, 1);
mSound2.init(&field_0x784, &eyePos, 3, 1);
field_0x7a8.set(current.pos);
field_0x27a8 = &mSound;
field_0x27be = 11;
field_0x752 = 4096.0f + cM_rndFX(2048.0f);
field_0x724 = 100.0f;
current.pos.y += 1500.0f;
setBck(ANM_DR_FLY, 2, 3.0f, 1.0f);
setActionMode(ACTION_GLIDER_ATTACK, 0);
mTargetHeight = 1500.0f + mAcch.GetGroundH();
if (-1000000000.0f == mAcch.GetGroundH()) {
mTargetHeight = 1500.0f + current.pos.y;
}
if (dComIfGs_isZoneSwitch(1, fopAcM_GetRoomNo(this))) {
mTargetHeight = 6000.0f + home.pos.y;
}
if (WREG_S(1) != 0) {
setActionMode(ACTION_WIND_ATTACK, 0);
}
if (dComIfGs_isZoneSwitch(2, fopAcM_GetRoomNo(this))) {
field_0x724 = 100.0f;
fopAcM_onSwitch(this, 16);
arg0 = 1;
field_0x7d1 = 2;
mBreakPartsNo = 3;
field_0x750 = JREG_S(8) + 200;
setActionMode(ACTION_FLY_WAIT, 0);
dScnKy_env_light_c* kankyo = dKy_getEnvlight();
kankyo->field_0x12cc = 2;
}
if (arg0 == 0) {
mtx_set();
if (cDmr_SkipInfo == 0 && !dComIfGs_isZoneSwitch(0, fopAcM_GetRoomNo(this))) {
arg0 = 0xFF;
field_0x7d5 = 0xB;
mTimer[0] = 2;
if (BREG_S(5) == 0) {
parentActorID = fopAcM_createChild(PROC_L7ODR, fopAcM_GetID(this), 0, &current.pos, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
mStatusONOFF(0);
} else if (BREG_S(0) != 0) {
parentActorID = fopAcM_createChild(PROC_B_DRE, fopAcM_GetID(this), 0, &current.pos, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
}
dScnKy_env_light_c* kankyo = dKy_getEnvlight();
kankyo->field_0x12cc = 0;
}
if (cDmr_SkipInfo != 0 || dComIfGs_isZoneSwitch(0, fopAcM_GetRoomNo(this)) ) {
Z2GetAudioMgr()->bgmStart(Z2BGM_DRAGON_BTL01, 0, 0);
field_0x7d5 = 0xC;
cDmr_SkipInfo = 0;
dComIfGs_onZoneSwitch(0, fopAcM_GetRoomNo(this));
dComIfGs_onZoneSwitch(20, fopAcM_GetRoomNo(this));
if (dComIfGs_isZoneSwitch(1, fopAcM_GetRoomNo(this))) {
field_0x7d1 = 1;
mBreakPartsNo++;
}
}
}
}
daB_DR_Execute(this);
}
return phase_state;
}
/* 805C62B0-805C6678 00B530 03C8+00 1/1 0/0 0/0 .text __ct__8daB_DR_cFv */
daB_DR_c::daB_DR_c() {}
/* 805C6B2C-805C6B4C 00BDAC 0020+00 1/0 0/0 0/0 .text daB_DR_Create__FP8daB_DR_c */
static int daB_DR_Create(daB_DR_c* i_this) {
return i_this->create();
}
/* 805C77E4-805C7804 -00001 0020+00 1/0 0/0 0/0 .data l_daB_DR_Method */
static actor_method_class l_daB_DR_Method = {
(process_method_func)daB_DR_Create,
(process_method_func)daB_DR_Delete,
(process_method_func)daB_DR_Execute,
(process_method_func)daB_DR_IsDelete,
(process_method_func)daB_DR_Draw,
};
/* 805C7804-805C7834 -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_DR */
extern actor_process_profile_definition g_profile_B_DR = {
fpcLy_CURRENT_e, // mLayerID
4, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_B_DR, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(daB_DR_c), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
221, // mPriority
&l_daB_DR_Method, // sub_method
0x04040000, // mStatus
fopAc_ENEMY_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};
AUDIO_INSTANCES;