From c662719bfcb0dedeb46c9df87d6089b2a91efc81 Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Fri, 22 Mar 2024 05:56:28 -0700 Subject: [PATCH] work / documentation on d_a_b_ds (#2104) * document / cleanup a good chunk of d_a_b_ds * fix d_a_b_ds nonmatching file --- include/f_op/f_op_actor_mng.h | 2 +- include/global.h | 2 + include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h | 72 +- rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp | 132 +- rel/d/a/b/d_a_b_ds/d_a_b_ds_NONMATCHING.cpp | 6492 +++++++++++++++++++ src/f_op/f_op_actor_mng.cpp | 4 +- 6 files changed, 6599 insertions(+), 105 deletions(-) create mode 100644 rel/d/a/b/d_a_b_ds/d_a_b_ds_NONMATCHING.cpp diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 887f5427d2e..feef23fae3f 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -534,7 +534,7 @@ s32 fopAcM_createItemFromTable(cXyz const* p_pos, int i_tableNo, int i_itemBitNo s32 fopAcM_createDemoItem(const cXyz* p_pos, int itemNo, int itemBitNo, const csXyz* p_angle, int roomNo, const cXyz* scale, u8 param_7); -s32 fopAcM_createItemForBoss(const cXyz* p_pos, int param_2, int roomNo, const csXyz* p_angle, +s32 fopAcM_createItemForBoss(const cXyz* p_pos, int i_itemNo, int roomNo, const csXyz* p_angle, const cXyz* p_scale, f32 speedF, f32 speedY, int param_8); s32 fopAcM_createItemForMidBoss(const cXyz* p_pos, int i_itemNo, int i_roomNo, const csXyz* p_angle, diff --git a/include/global.h b/include/global.h index 9898b9f220c..83f1c98364d 100644 --- a/include/global.h +++ b/include/global.h @@ -35,4 +35,6 @@ inline BOOL checkEqual(s32 a, s32 b) { return (u32)__cntlzw(a - b) >> 5; } +#define FAST_DIV(x, n) (x >> (n / 2)) + #endif diff --git a/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h b/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h index 419372d6778..a58d04c431d 100644 --- a/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h +++ b/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h @@ -12,12 +12,12 @@ class daB_DS_c : public fopEn_enemy_c { public: - enum Type { - /* 0 */ PHASE_1, - /* 1 */ BULLET_A, - /* 2 */ PHASE_2, - /* 3 */ BULLET_B, - /* 4 */ BULLET_C, + enum Arg0 { + /* 0 */ TYPE_BATTLE_1, + /* 1 */ TYPE_BULLET_A, + /* 2 */ TYPE_BATTLE_2, + /* 3 */ TYPE_BULLET_B, + /* 4 */ TYPE_BULLET_C, }; enum Action { @@ -225,9 +225,9 @@ public: /* 0x07D2 */ s16 field_0x7d2; /* 0x07D4 */ f32 mBreathTimerBase; /* 0x07D8 */ f32 mBulletRadius; - /* 0x07DC */ f32 field_0x7dc[3]; - /* 0x07E8 */ f32 field_0x7e8; - /* 0x07EC */ f32 field_0x7ec; + /* 0x07DC */ f32 mBackboneCrackAlpha[3]; + /* 0x07E8 */ f32 mEyeColorAlpha; + /* 0x07EC */ f32 mCrackAlpha; /* 0x07F0 */ f32 mBulletDistance; /* 0x07F4 */ f32 mChkHigh; /* 0x07F8 */ f32 field_0x7f8; @@ -239,7 +239,7 @@ public: /* 0x0810 */ f32 mWallR; /* 0x0814 */ int mBrokenBone; /* 0x0818 */ int mTimerCount; - /* 0x081C */ int mActionTimer; + /* 0x081C */ int mModeTimer; /* 0x0820 */ int mHitTimer; /* 0x0824 */ u8 field_0x824[4]; /* 0x0828 */ int mP2FallTimer; @@ -254,17 +254,17 @@ public: /* 0x084C */ u8 mAttackingHand; /* 0x084D */ u8 field_0x84d; /* 0x084E */ u8 mDamageTimer; - /* 0x084F */ u8 mBackboneJoint; + /* 0x084F */ u8 mBackboneLevel; /* 0x0850 */ bool mDead; /* 0x0851 */ bool mIsDemo; /* 0x0852 */ u8 mBossPhase; /* 0x0853 */ bool mIsOpeningDemo; /* 0x0854 */ bool mIsAppear; /* 0x0855 */ bool mIsAppearG; - /* 0x0856 */ u8 mType; - /* 0x0857 */ u8 mBitSw; - /* 0x0858 */ u8 mBitSw2; - /* 0x0859 */ u8 mBitSw3; + /* 0x0856 */ u8 arg0; + /* 0x0857 */ u8 bitSw; + /* 0x0858 */ u8 bitSw2; + /* 0x0859 */ u8 bitSw3; /* 0x085A */ bool mCreateFireBreath; /* 0x085B */ bool mNoDrawSword; /* 0x085C */ bool mDrawZant; @@ -314,46 +314,4 @@ public: STATIC_ASSERT(sizeof(daB_DS_c) == 0x2F28); -class daB_DS_HIO_c { -public: - /* 805CB22C */ daB_DS_HIO_c(); -#ifdef NONMATCHING - /* 805DC89C */ virtual ~daB_DS_HIO_c() {} -#else - /* 805DC89C */ ~daB_DS_HIO_c(); -#endif - -#ifndef NONMATCHING - /* 0x00 */ void* _vtable; -#endif - /* 0x04 */ s8 field_0x04; - /* 0x08 */ f32 mModelSize; - /* 0x0C */ f32 mHandRange; - /* 0x10 */ f32 mBreathRange; - /* 0x14 */ f32 mGuardSpawnRange; - /* 0x18 */ f32 mNoSearchRange; - /* 0x1C */ f32 mP2MoveAxis; - /* 0x20 */ f32 mP2ModelSize; - /* 0x24 */ f32 mP2AttackHeight; - /* 0x28 */ s16 mP2FallTime; - /* 0x2A */ s16 mPedestalFallTime; - /* 0x2C */ s16 mSandFallWaitTime; - /* 0x2E */ s16 mP2BulletFireTime; - /* 0x30 */ s16 mP2OuterWallAttackTime; - /* 0x32 */ s16 mP2TrapCreateWaitTime1; - /* 0x34 */ s16 mP2TrapCreateWaitTime2; - /* 0x36 */ s16 mP2TrapCreateID1; - /* 0x38 */ s16 mP2TrapCreateID2; - /* 0x3A */ s16 mHintTime1; - /* 0x3C */ s16 mHintTime2; - /* 0x3E */ s16 mP2OuterWallTrapSpeed; - /* 0x40 */ s16 mTowerTrapSpeed; - /* 0x42 */ s16 mP2ApproachAccel; - /* 0x44 */ s16 mP2ApproachSpeedMax; - /* 0x46 */ s16 mP2ApproachAfterBullet; - /* 0x48 */ s16 mP2ApproachDist; - /* 0x4A */ s16 mP2Health; - /* 0x4C */ bool mP2HealthDebugOn; -}; - #endif /* D_A_B_DS_H */ diff --git a/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp b/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp index 54e6d341db3..22a926dc0cf 100644 --- a/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp +++ b/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp @@ -18,6 +18,48 @@ #include "rel/d/a/d_a_spinner/d_a_spinner.h" #include "dol2asm.h" +class daB_DS_HIO_c { +public: + /* 805CB22C */ daB_DS_HIO_c(); +#ifdef NONMATCHING + /* 805DC89C */ virtual ~daB_DS_HIO_c() {} +#else + /* 805DC89C */ ~daB_DS_HIO_c(); +#endif + +#ifndef NONMATCHING + /* 0x00 */ void* _vtable; +#endif + /* 0x04 */ s8 field_0x04; + /* 0x08 */ f32 mModelSize; + /* 0x0C */ f32 mHandRange; + /* 0x10 */ f32 mBreathRange; + /* 0x14 */ f32 mGuardSpawnRange; + /* 0x18 */ f32 mNoSearchRange; + /* 0x1C */ f32 mP2MoveAxis; + /* 0x20 */ f32 mP2ModelSize; + /* 0x24 */ f32 mP2AttackHeight; + /* 0x28 */ s16 mP2FallTime; + /* 0x2A */ s16 mPedestalFallTime; + /* 0x2C */ s16 mSandFallWaitTime; + /* 0x2E */ s16 mP2BulletFireTime; + /* 0x30 */ s16 mP2OuterWallAttackTime; + /* 0x32 */ s16 mP2TrapCreateWaitTime1; + /* 0x34 */ s16 mP2TrapCreateWaitTime2; + /* 0x36 */ s16 mP2TrapCreateID1; + /* 0x38 */ s16 mP2TrapCreateID2; + /* 0x3A */ s16 mHintTime1; + /* 0x3C */ s16 mHintTime2; + /* 0x3E */ s16 mP2OuterWallTrapSpeed; + /* 0x40 */ s16 mTowerTrapSpeed; + /* 0x42 */ s16 mP2ApproachAccel; + /* 0x44 */ s16 mP2ApproachSpeedMax; + /* 0x46 */ s16 mP2ApproachAfterBullet; + /* 0x48 */ s16 mP2ApproachDist; + /* 0x4A */ s16 mP2Health; + /* 0x4C */ bool mP2HealthDebugOn; +}; + // // Forward References: // @@ -1363,7 +1405,7 @@ COMPILER_STRIP_GATE(0x805DCAA8, &lit_4271); #ifdef NONMATCHING // matches with literals int daB_DS_c::draw() { - if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C || mBossPhase == 100) { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C || mBossPhase == 100) { return 1; } @@ -1372,7 +1414,7 @@ int daB_DS_c::draw() { g_env_light.setLightTevColorType_MAJI(model, &tevStr); J3DModelData* model_data = model->getModelData(); - if (mType == PHASE_2) { + if (arg0 == TYPE_BATTLE_2) { if (!mDead) { if (model_data->getMaterialNodePointer(2) != NULL) { model_data->getMaterialNodePointer(2)->getTevColor(2)->a = (u8)field_0x7e8; @@ -2128,8 +2170,8 @@ asm void daB_DS_c::mCreateTrap(bool param_0) { #ifdef NONMATCHING // matches with literals void daB_DS_c::mChangeVer2() { - if (mBitSw != 0xff) { - fopAcM_offSwitch(this, mBitSw); + if (bitSw != 0xff) { + fopAcM_offSwitch(this, bitSw); } field_0x7ec = 0.0f; shape_angle.x = 0; @@ -2289,8 +2331,8 @@ void daB_DS_c::damage_check() { mHandAtLCyl.OffTgShield(); mHandAtRCyl.OffTgShield(); mActionTimer = 0; - if (mBitSw3 != 0xff) { - fopAcM_onSwitch(this, mBitSw3); + if (bitSw3 != 0xff) { + fopAcM_onSwitch(this, bitSw3); } def_se_set(&mSound, mAtInfo.mpCollider, 0x1f, NULL); i_dComIfGp_setHitMark(3, this, &hit_pos, &hit_angle, NULL, 0); @@ -4340,8 +4382,8 @@ asm void daB_DS_c::executeCircle() { /* 805D02F8-805D0374 0051B8 007C+00 1/1 0/0 0/0 .text mBreakBoneSUB__8daB_DS_cFv */ void daB_DS_c::mBreakBoneSUB() { - if (mBitSw3 != 0xff) { - fopAcM_offSwitch(this, mBitSw3); + if (bitSw3 != 0xff) { + fopAcM_offSwitch(this, bitSw3); mSoundPos = current.pos; mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1f); } @@ -5082,8 +5124,8 @@ void daB_DS_c::executeDamage() { camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); - if (mBitSw3 != 0xff) { - fopAcM_offSwitch(this, mBitSw3); + if (bitSw3 != 0xff) { + fopAcM_offSwitch(this, bitSw3); } mBirthTrapTimerF = 0x1e; shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this) + 0xc000; @@ -5100,8 +5142,8 @@ void daB_DS_c::executeDamage() { if (cLib_calcTimer(&mActionTimer) == 0 ) { if (!field_0x7dc[mBackboneJoint]) { - if (mBitSw != 0xff) { - fopAcM_offSwitch(this, mBitSw); + if (bitSw != 0xff) { + fopAcM_offSwitch(this, bitSw); } setBck(Ds_damage_id[mBackboneJoint], 0, 3.0f, 1.0f); for (int i = 0; i < 4; i++) { @@ -5239,7 +5281,7 @@ void daB_DS_c::executeDamage() { p2_angle.z = 0; p2_angle.y = 0; p2_angle.x = 0; - fopAcM_create(PROC_B_DS, param | PHASE_2, ¤t.pos, + fopAcM_create(PROC_B_DS, param | TYPE_BATTLE_2, ¤t.pos, fopAcM_GetRoomNo(this), &p2_angle, NULL, 0xff); mMode = 101; // no break @@ -5374,7 +5416,7 @@ void daB_DS_c::breath_smokeSet() { bullet_angle.y = vec.atan2sX_Z(); bullet_angle.z = 0; cXyz bullet_pos = mBulletPos; - fopAcM_create(PROC_B_DS, BULLET_A, &bullet_pos, fopAcM_GetRoomNo(this), + fopAcM_create(PROC_B_DS, TYPE_BULLET_A, &bullet_pos, fopAcM_GetRoomNo(this), &bullet_angle, NULL, 0xff); } } @@ -8015,7 +8057,7 @@ void daB_DS_c::executeBullet() { cXyz vec1, vec2; switch (mMode) { case 0: - if (mType == BULLET_A) { + if (arg0 == TYPE_BULLET_A) { speedF = -100.0f; mBulletRadius = 100.0f; mActionTimer = breathTimerBase; @@ -8060,7 +8102,7 @@ void daB_DS_c::executeBullet() { case 2: mDoMtx_YrotS(*calc_mtx, current.angle.y); - if (mType == BULLET_A) { + if (arg0 == TYPE_BULLET_A) { mDoMtx_XrotM(*calc_mtx, -current.angle.x); } else { mDoMtx_XrotM(*calc_mtx, current.angle.x); @@ -8084,7 +8126,7 @@ void daB_DS_c::executeBullet() { mBreathAtSph.SetR(mBulletRadius); dComIfG_Ccsp()->Set(&mBreathAtSph); - if (mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { cXyz scale(l_HIO.mP2ModelSize, l_HIO.mP2ModelSize, l_HIO.mP2ModelSize); field_0x724 = current.pos - old.pos; VECScale(&field_0x724, &field_0x724, 0.8f); @@ -8122,7 +8164,7 @@ asm void daB_DS_c::executeBullet() { void daB_DS_c::mBulletAction() { executeBullet(); fopAcM_posMove(this, mCcStts.GetCCMoveP()); - if (mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { mAcchCir.SetWall(0.0f, 100.0f); mAcch.CrrPos(dComIfG_Bgsp()); } @@ -8544,10 +8586,10 @@ void daB_DS_c::action() { mSandFallTimer = l_HIO.mSandFallWaitTime; } - if (mType == PHASE_1 && dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this))) { + if (arg0 == TYPE_BATTLE_1 && dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this))) { cLib_calcTimer(&mSandFallTimer); - if (mSandFallTimer >= 1 && mSandFallTimer <= 3 && mBitSw != 0xff) { - fopAcM_onSwitch(this, mBitSw); + if (mSandFallTimer >= 1 && mSandFallTimer <= 3 && bitSw != 0xff) { + fopAcM_onSwitch(this, bitSw); mSandFallTimer = 0; } } @@ -9325,7 +9367,7 @@ void daB_DS_c::mBattle2_mtx_set() { } if (mCreateFireBreath) { - mBattle2BreathFireSet(BULLET_C); + mBattle2BreathFireSet(TYPE_BULLET_C); } if (mAction == ACT_B2_F_MOVE && mMode >= 3 && mMode <= 4) { @@ -9511,10 +9553,10 @@ asm void daB_DS_c::mBattle2_cc_set() { #ifdef NONMATCHING // an extra `extsh` int daB_DS_c::execute() { - if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { mBulletAction(); return 1; - } else if (mType == PHASE_2) { + } else if (arg0 == TYPE_BATTLE_2) { mBattle2Action(); mBattle2_mtx_set(); mBattle2_cc_set(); @@ -9629,7 +9671,7 @@ static int daB_DS_IsDelete(daB_DS_c* i_this) { /* 805DB1AC-805DB244 01006C 0098+00 1/1 0/0 0/0 .text _delete__8daB_DS_cFv */ int daB_DS_c::_delete() { dComIfG_resDelete(&mPhase, "B_DS"); - if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { return 1; } if (mHIOInit) { @@ -9650,16 +9692,16 @@ static int daB_DS_Delete(daB_DS_c* i_this) { #ifdef NONMATCHING // Matches with literals int daB_DS_c::CreateHeap() { - if (mType == PHASE_1 && dComIfGs_isZoneSwitch(6, fopAcM_GetRoomNo(this)) + if (arg0 == TYPE_BATTLE_1 && dComIfGs_isZoneSwitch(6, fopAcM_GetRoomNo(this)) && dComIfGs_isZoneSwitch(7, fopAcM_GetRoomNo(this))) { - mType = PHASE_2; + arg0 = TYPE_BATTLE_2; home.pos.set(0.0f, 1900.0f, 0.0f); current.pos.set(0.0f, 1900.0f, 0.0f); } J3DModelData* model_data = (J3DModelData*)(dComIfG_getObjectRes("B_DS", 70)); int anm_index = 60; - if (mType == PHASE_2) { + if (arg0 == TYPE_BATTLE_2) { model_data = (J3DModelData*)(dComIfG_getObjectRes("B_DS", 71)); anm_index = 44; } @@ -9847,7 +9889,7 @@ cPhs__Step daB_DS_c::create() { fopAcM_SetupActor(this, daB_DS_c); cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase, "B_DS"); if (step == cPhs_COMPLEATE_e) { - if (mType == PHASE_1 && dComIfGs_isStageBossEnemy()) { + if (arg0 == TYPE_BATTLE_1 && dComIfGs_isStageBossEnemy()) { dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); g_env_light.mColpatPrevGather = 4; g_env_light.mColpatCurrGather = 4; @@ -9863,14 +9905,14 @@ cPhs__Step daB_DS_c::create() { } return cPhs_ERROR_e; } - mType = fopAcM_GetParamBit(this, 0, 8); - mBitSw = fopAcM_GetParamBit(this, 8, 8); - mBitSw2 = fopAcM_GetParamBit(this, 16, 8); - mBitSw3 = fopAcM_GetParamBit(this, 24, 8); - if (mType == 0xff) { - mType = PHASE_1; + arg0 = fopAcM_GetParamBit(this, 0, 8); + bitSw = fopAcM_GetParamBit(this, 8, 8); + bitSw2 = fopAcM_GetParamBit(this, 16, 8); + bitSw3 = fopAcM_GetParamBit(this, 24, 8); + if (arg0 == 0xff) { + arg0 = TYPE_BATTLE_1; } - if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { attention_info.field_0x0[2] = 0; attention_info.flags &= ~4; fopAcM_SetGroup(this, 0); @@ -9881,14 +9923,14 @@ cPhs__Step daB_DS_c::create() { mBreathAtSph.SetStts(&mCcStts); fopAcM_OffStatus(this, 0); attention_info.flags &= ~4; - if (mType == BULLET_B || mType == BULLET_C) { + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, NULL, NULL); mAcch.CrrPos(dComIfG_Bgsp()); fopAcM_OnStatus(this, 0x4000); } setActionMode(8, 0); } else { - if (mType != BULLET_A && mType != BULLET_B && mType != BULLET_C + if (arg0 != TYPE_BULLET_A && arg0 != TYPE_BULLET_B && arg0 != TYPE_BULLET_C && !fopAcM_entrySolidHeap(this, useHeapInit, 0xfac0)) { return cPhs_ERROR_e; } @@ -9959,10 +10001,10 @@ cPhs__Step daB_DS_c::create() { onWolfNoLock(); mHintTimer1 = l_HIO.mHintTime1; mHintTimer2 = l_HIO.mHintTime1; - if (mType == PHASE_1) { + if (arg0 == TYPE_BATTLE_1) { gravity = -1.0f; - if (mBitSw != 0xff) { - fopAcM_onSwitch(this, mBitSw); + if (bitSw != 0xff) { + fopAcM_onSwitch(this, bitSw); } fopAcM_OnStatus(this, 0x4000); if (!cDmr_SkipInfo && !dComIfGs_isZoneSwitch(5, fopAcM_GetRoomNo(this))) { @@ -9972,8 +10014,8 @@ cPhs__Step daB_DS_c::create() { mIsOpeningDemo = true; field_0x7e8 = 0.0f; field_0x7ec = 255.0f; - if (mBitSw != 0xff) { - fopAcM_offSwitch(this, mBitSw); + if (bitSw != 0xff) { + fopAcM_offSwitch(this, bitSw); } attention_info.field_0x0[2] = 0; attention_info.flags &= ~4; @@ -9989,8 +10031,8 @@ cPhs__Step daB_DS_c::create() { cDmr_SkipInfo = 0; dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); } - if (mBitSw3 != 0xff) { - fopAcM_offSwitch(this, mBitSw3); + if (bitSw3 != 0xff) { + fopAcM_offSwitch(this, bitSw3); } if (mAction != ACT_OPENING_DEMO) { field_0x7f8 = 0.5f; diff --git a/rel/d/a/b/d_a_b_ds/d_a_b_ds_NONMATCHING.cpp b/rel/d/a/b/d_a_b_ds/d_a_b_ds_NONMATCHING.cpp new file mode 100644 index 00000000000..86b1340f5aa --- /dev/null +++ b/rel/d/a/b/d_a_b_ds/d_a_b_ds_NONMATCHING.cpp @@ -0,0 +1,6492 @@ +/** + * d_a_b_ds.cpp + * Boss - Stallord + */ + +#include "rel/d/a/b/d_a_b_ds/d_a_b_ds.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "SSystem/SComponent/c_math.h" +#include "c/c_damagereaction.h" +#include "d/a/d_a_player.h" +#include "d/cc/d_cc_uty.h" +#include "d/com/d_com_inf_game.h" +#include "d/s/d_s_play.h" +#include "dol2asm.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_msg.h" +#include "f_op/f_op_msg_mng.h" +#include "rel/d/a/d_a_spinner/d_a_spinner.h" + +class daB_DS_HIO_c { +public: + /* 805CB22C */ daB_DS_HIO_c(); + /* 805DC89C */ virtual ~daB_DS_HIO_c() {} + + /* 0x04 */ s8 field_0x04; + /* 0x08 */ f32 mModelSize; + /* 0x0C */ f32 mHandRange; + /* 0x10 */ f32 mBreathRange; + /* 0x14 */ f32 mGuardSpawnRange; + /* 0x18 */ f32 mNoSearchRange; + /* 0x1C */ f32 mP2MoveAxis; + /* 0x20 */ f32 mP2ModelSize; + /* 0x24 */ f32 mP2AttackHeight; + /* 0x28 */ s16 mP2FallTime; + /* 0x2A */ s16 mPedestalFallTime; + /* 0x2C */ s16 mSandFallWaitTime; + /* 0x2E */ s16 mP2BulletFireTime; + /* 0x30 */ s16 mP2OuterWallAttackTime; + /* 0x32 */ s16 mP2TrapCreateWaitTime1; + /* 0x34 */ s16 mP2TrapCreateWaitTime2; + /* 0x36 */ s16 mP2TrapCreateID1; + /* 0x38 */ s16 mP2TrapCreateID2; + /* 0x3A */ s16 mHintTime1; + /* 0x3C */ s16 mHintTime2; + /* 0x3E */ s16 mP2OuterWallTrapSpeed; + /* 0x40 */ s16 mTowerTrapSpeed; + /* 0x42 */ s16 mP2ApproachAccel; + /* 0x44 */ s16 mP2ApproachSpeedMax; + /* 0x46 */ s16 mP2ApproachAfterBullet; + /* 0x48 */ s16 mP2ApproachDist; + /* 0x4A */ s16 mP2Health; + /* 0x4C */ bool mP2HealthDebugOn; +}; + +enum daB_DS_Joint { + DS_JNT_BACKBONE1, + DS_JNT_BACKBONE2, + DS_JNT_BACKBONE3, + DS_JNT_BACKBONE4, + DS_JNT_NECK1, + DS_JNT_NECK2, + DS_JNT_HEAD, + DS_JNT_JAW, + DS_JNT_SHOULDER_BL, + DS_JNT_ARM_L1, + DS_JNT_ARM_L2, + DS_JNT_HAND_L, + DS_JNT_LYUBI_A1, + DS_JNT_LYUBI_A2, + DS_JNT_LYUBI_A3, + DS_JNT_LYUBI_B1, + DS_JNT_LYUBI_B2, + DS_JNT_LYUBI_B3, + DS_JNT_LYUBI_C1, + DS_JNT_LYUBI_C2, + DS_JNT_LYUBI_C3, + DS_JNT_LYUBI_D1, + DS_JNT_LYUBI_D2, + DS_JNT_LYUBI_D3, + DS_JNT_LYUBI_E1, + DS_JNT_LYUBI_E2, + DS_JNT_LYUBI_E3, + DS_JNT_SHOULDER_BR, + DS_JNT_ARM_R1, + DS_JNT_ARM_R2, + DS_JNT_HAND_R, + DS_JNT_RYUBI_A1, + DS_JNT_RYUBI_A2, + DS_JNT_RYUBI_A3, + DS_JNT_RYUBI_B1, + DS_JNT_RYUBI_B2, + DS_JNT_RYUBI_B3, + DS_JNT_RYUBI_C1, + DS_JNT_RYUBI_C2, + DS_JNT_RYUBI_C3, + DS_JNT_RYUBI_D1, + DS_JNT_RYUBI_D2, + DS_JNT_RYUBI_D3, + DS_JNT_RYUBI_E1, + DS_JNT_RYUBI_E2, + DS_JNT_RYUBI_E3, + DS_JNT_SHOULDER_L, + DS_JNT_SHOULDER_R, +}; + +enum daB_DS_head_Joint { + DS_HEAD_JNT_HEAD, + DS_HEAD_JNT_FUR_B, + DS_HEAD_JNT_FUR_L1, + DS_HEAD_JNT_FUR_L2, + DS_HEAD_JNT_FUR_R1, + DS_HEAD_JNT_FUR_R2, + DS_HEAD_JNT_JAW, +}; + +// +// Forward References: +// + +extern "C" void __ct__12daB_DS_HIO_cFv(); +extern "C" void ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel(); +extern "C" void JointCallBack__8daB_DS_cFP8J3DJointi(); +extern "C" void draw__8daB_DS_cFv(); +extern "C" static void daB_DS_Draw__FP8daB_DS_c(); +extern "C" void setBck__8daB_DS_cFiUcff(); +extern "C" void setActionMode__8daB_DS_cFii(); +extern "C" void mSmokeSet__8daB_DS_cFv(); +extern "C" void mHeadAngle_Clear__8daB_DS_cFv(); +extern "C" void HandHitSoundSet__8daB_DS_cFb(); +extern "C" void handSPosSet__8daB_DS_cFi(); +extern "C" void hand_smokeSet__8daB_DS_cFUc(); +extern "C" void mZsMoveChk__8daB_DS_cFv(); +extern "C" void mZsMoveChk_Guard__8daB_DS_cFv(); +extern "C" void mTrapScale__8daB_DS_cFv(); +extern "C" void mClearTrap__8daB_DS_cFb(); +extern "C" void mCreateTrap__8daB_DS_cFb(); +extern "C" void mChangeVer2__8daB_DS_cFv(); +extern "C" void damage_check__8daB_DS_cFv(); +extern "C" void neck_set__8daB_DS_cFv(); +extern "C" void mCutTypeCheck__8daB_DS_cFv(); +extern "C" void startDemoCheck__8daB_DS_cFv(); +extern "C" void setYoMessage__8daB_DS_cFi(); +extern "C" void doYoMessage__8daB_DS_cFv(); +extern "C" void executeOpeningDemo__8daB_DS_cFv(); +extern "C" void setGlobalSRTMatrix__14JPABaseEmitterFPA4_Cf(); +extern "C" static void dComIfGp_particle_set__FUlUsPC4cXyzPC5csXyzPC4cXyz(); +extern "C" void abs__4cXyzCFv(); +extern "C" void isStop__13mDoExt_morf_cFv(); +extern "C" static void dComIfGp_particle_set__FUsPC4cXyzPC5csXyzPC4cXyz(); +extern "C" void mHandBreathChk__8daB_DS_cFv(); +extern "C" void executeWait__8daB_DS_cFv(); +extern "C" void executeCircle__8daB_DS_cFv(); +extern "C" void mBreakBoneSUB__8daB_DS_cFv(); +extern "C" void damageSet__8daB_DS_cFv(); +extern "C" void damageHitCamera__8daB_DS_cFv(); +extern "C" void damageDownCheck__8daB_DS_cFv(); +extern "C" void executeDamage__8daB_DS_cFv(); +extern "C" void executeEtcDamage__8daB_DS_cFv(); +extern "C" void breath_smokeSet__8daB_DS_cFv(); +extern "C" void executeBreathAttack__8daB_DS_cFv(); +extern "C" void executeHandAttack__8daB_DS_cFv(); +extern "C" void executeBreathSearch__8daB_DS_cFv(); +extern "C" void executeBattle2OpeningDemo__8daB_DS_cFv(); +extern "C" void mFlyBMove__8daB_DS_cFf(); +extern "C" void mFuwafuwaSet__8daB_DS_cFb(); +extern "C" void mBattle2BreathFireSet__8daB_DS_cFUl(); +extern "C" void mNeckAngleSet__8daB_DS_cFv(); +extern "C" void mSetFirstPos__8daB_DS_cFv(); +extern "C" void mChkScreenIn__8daB_DS_cFv(); +extern "C" void mRailInOutCheck__8daB_DS_cFv(); +extern "C" void executeBattle2Wait__8daB_DS_cFv(); +extern "C" void mBattle2MoveFSet__8daB_DS_cFv(); +extern "C" void executeBattle2FMove__8daB_DS_cFv(); +extern "C" void executeBattle2Tired__8daB_DS_cFv(); +extern "C" void executeBattle2Damage__8daB_DS_cFv(); +extern "C" void mDeadMove__8daB_DS_cFv(); +extern "C" void executeBattle2Dead__8daB_DS_cFv(); +extern "C" void executeBullet__8daB_DS_cFv(); +extern "C" void mBulletAction__8daB_DS_cFv(); +extern "C" void mSoundSE_Set__8daB_DS_cFv(); +extern "C" void action__8daB_DS_cFv(); +extern "C" void mtx_set__8daB_DS_cFv(); +extern "C" void cc_set__8daB_DS_cFv(); +extern "C" void cc_etc_set__8daB_DS_cFv(); +extern "C" void mBattle2Action__8daB_DS_cFv(); +extern "C" void mBattle2_spinner_damage_check__8daB_DS_cFv(); +extern "C" void mBattle2_damage_check__8daB_DS_cFv(); +extern "C" void mBattle2_mtx_set__8daB_DS_cFv(); +extern "C" void mBattle2_cc_etc_set__8daB_DS_cFv(); +extern "C" void mBattle2_cc_set__8daB_DS_cFv(); +extern "C" void execute__8daB_DS_cFv(); +extern "C" static void daB_DS_Execute__FP8daB_DS_c(); +extern "C" static bool daB_DS_IsDelete__FP8daB_DS_c(); +extern "C" void _delete__8daB_DS_cFv(); +extern "C" static void daB_DS_Delete__FP8daB_DS_c(); +extern "C" void CreateHeap__8daB_DS_cFv(); +extern "C" void __dt__12J3DFrameCtrlFv(); +extern "C" static void useHeapInit__FP10fopAc_ac_c(); +extern "C" void create__8daB_DS_cFv(); +extern "C" void __ct__8daB_DS_cFv(); +extern "C" void __dt__8cM3dGCylFv(); +extern "C" void __ct__8dCcD_SphFv(); +extern "C" void __dt__8dCcD_SphFv(); +extern "C" void __dt__8cM3dGSphFv(); +extern "C" void __dt__8cM3dGAabFv(); +extern "C" void __dt__10dCcD_GSttsFv(); +extern "C" void __dt__12dBgS_ObjAcchFv(); +extern "C" void __dt__12dBgS_AcchCirFv(); +extern "C" void __ct__4cXyzFv(); +extern "C" static void daB_DS_Create__FP8daB_DS_c(); +extern "C" void __dt__10cCcD_GSttsFv(); +extern "C" void __dt__12daB_DS_HIO_cFv(); +extern "C" void func_805DC8E4(void* _this, int*); +extern "C" void func_805DC900(void* _this, u8*); +extern "C" void __sinit_d_a_b_ds_cpp(); +extern "C" static void func_805DC958(); +extern "C" static void func_805DC960(); +extern "C" void __dt__4cXyzFv(); +extern "C" void changeDemoPos0__9daPy_py_cFPC4cXyz(); +extern "C" void __as__4cXyzFRC4cXyz(); +extern "C" void changeDemoMode__9daPy_py_cFUliis(); +extern "C" void set__4cXyzFRC3Vec(); +extern "C" void __ct__4cXyzFRC4cXyz(); +extern "C" void zero__4cXyzFv(); +extern "C" extern char const* const d_a_b_ds__stringBase0; +extern void* __vt__12dBgS_AcchCir[3]; +extern void* __vt__10cCcD_GStts[3]; +extern void* __vt__10dCcD_GStts[3]; +extern void* __vt__8cM3dGCyl[3]; +extern void* __vt__8cM3dGSph[3]; +extern void* __vt__8cM3dGAab[3]; +extern void* __vt__12dBgS_ObjAcch[9]; +extern void* __vt__12J3DFrameCtrl[3]; +extern void* __vt__12daB_DS_HIO_c[3]; + +// +// External References: +// + +extern "C" void mDoMtx_XrotM__FPA4_fs(); +extern "C" void mDoMtx_YrotS__FPA4_fs(); +extern "C" void mDoMtx_YrotM__FPA4_fs(); +extern "C" void transS__14mDoMtx_stack_cFRC4cXyz(); +extern "C" void transM__14mDoMtx_stack_cFfff(); +extern "C" void scaleM__14mDoMtx_stack_cFfff(); +extern "C" void ZXYrotM__14mDoMtx_stack_cFRC5csXyz(); +extern "C" void play__14mDoExt_baseAnmFv(); +extern "C" void init__13mDoExt_btkAnmFP16J3DMaterialTableP19J3DAnmTextureSRTKeyiifss(); +extern "C" void entry__13mDoExt_btkAnmFP16J3DMaterialTablef(); +extern "C" void init__13mDoExt_brkAnmFP16J3DMaterialTableP15J3DAnmTevRegKeyiifss(); +extern "C" void entry__13mDoExt_brkAnmFP16J3DMaterialTablef(); +extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); +extern "C" void +__ct__16mDoExt_McaMorfSOFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiP10Z2CreatureUlUl(); +extern "C" void setAnm__16mDoExt_McaMorfSOFP15J3DAnmTransformiffff(); +extern "C" void play__16mDoExt_McaMorfSOFUlSc(); +extern "C" void updateDL__16mDoExt_McaMorfSOFv(); +extern "C" void entryDL__16mDoExt_McaMorfSOFv(); +extern "C" void modelCalc__16mDoExt_McaMorfSOFv(); +extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); +extern "C" void __ct__10fopAc_ac_cFv(); +extern "C" void fopAcM_SearchByID__FUiPP10fopAc_ac_c(); +extern "C" void fopAcM_delete__FP10fopAc_ac_c(); +extern "C" void fopAcM_create__FsUlPC4cXyziPC5csXyzPC4cXyzSc(); +extern "C" void fopAcM_createChild__FsUiUlPC4cXyziPC5csXyzPC4cXyzScPFPv_i(); +extern "C" void fopAcM_entrySolidHeap__FP10fopAc_ac_cPFP10fopAc_ac_c_iUl(); +extern "C" void fopAcM_SetMin__FP10fopAc_ac_cfff(); +extern "C" void fopAcM_SetMax__FP10fopAc_ac_cfff(); +extern "C" void fopAcM_posMove__FP10fopAc_ac_cPC4cXyz(); +extern "C" void fopAcM_posMoveF__FP10fopAc_ac_cPC4cXyz(); +extern "C" void fopAcM_searchActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); +extern "C" void fopAcM_searchActorDistance__FPC10fopAc_ac_cPC10fopAc_ac_c(); +extern "C" void fopAcM_orderPotentialEvent__FP10fopAc_ac_cUsUsUs(); +extern "C" void fopAcM_createItemForBoss__FPC4cXyziiPC5csXyzPC4cXyzffi(); +extern "C" void fopAcM_createDisappear__FPC10fopAc_ac_cPC4cXyzUcUcUc(); +extern "C" void fopMsgM_SearchByID__FUi(); +extern "C" void fopMsgM_messageSet__FUlUl(); +extern "C" void fopMsgM_messageSetDemo__FUl(); +extern "C" void dStage_changeScene__FifUlScsi(); +extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); +extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); +extern "C" void dComIfGp_getReverb__Fi(); +extern "C" void dComIfGs_onStageBossEnemy__Fi(); +extern "C" void dComIfGs_onZoneSwitch__Fii(); +extern "C" void dComIfGs_offZoneSwitch__Fii(); +extern "C" void dComIfGs_isZoneSwitch__Fii(); +extern "C" void dComIfGs_onOneZoneSwitch__Fii(); +extern "C" void +dComIfGd_setShadow__FUlScP8J3DModelP4cXyzffffR13cBgS_PolyInfoP12dKy_tevstr_csfP9_GXTexObj(); +extern "C" void isDungeonItem__12dSv_memBit_cCFi(); +extern "C" void onEventBit__11dSv_event_cFUs(); +extern "C" void setRoom__13dSv_restart_cFRC4cXyzsSc(); +extern "C" void onSwitch__10dSv_info_cFii(); +extern "C" void offSwitch__10dSv_info_cFii(); +extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); +extern "C" void reset__14dEvt_control_cFv(); +extern "C" void dEv_noFinishSkipProc__FPvi(); +extern "C" void setSkipProc__14dEvt_control_cFPvPFPvi_ii(); +extern "C" void getEmitter__Q213dPa_control_c7level_cFUl(); +extern "C" void setHitMark__13dPa_control_cFUsP10fopAc_ac_cPC4cXyzPC5csXyzPC4cXyzUl(); +extern "C" void +set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); +extern "C" void +set__13dPa_control_cFUlUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); +extern "C" void dPath_GetRoomPath__Fii(); +extern "C" void StartShock__12dVibration_cFii4cXyz(); +extern "C" void StartQuake__12dVibration_cFii4cXyz(); +extern "C" void StopQuake__12dVibration_cFi(); +extern "C" void LineCross__4cBgSFP11cBgS_LinChk(); +extern "C" void GroundCross__4cBgSFP11cBgS_GndChk(); +extern "C" void __ct__12dBgS_AcchCirFv(); +extern "C" void SetWall__12dBgS_AcchCirFff(); +extern "C" void __dt__9dBgS_AcchFv(); +extern "C" void __ct__9dBgS_AcchFv(); +extern "C" void Set__9dBgS_AcchFP4cXyzP4cXyzP10fopAc_ac_ciP12dBgS_AcchCirP4cXyzP5csXyzP5csXyz(); +extern "C" void CrrPos__9dBgS_AcchFR4dBgS(); +extern "C" void SetGroundUpY__9dBgS_AcchFf(); +extern "C" void __ct__11dBgS_GndChkFv(); +extern "C" void __dt__11dBgS_GndChkFv(); +extern "C" void __ct__11dBgS_LinChkFv(); +extern "C" void __dt__11dBgS_LinChkFv(); +extern "C" void Set__11dBgS_LinChkFPC4cXyzPC4cXyzPC10fopAc_ac_c(); +extern "C" void SetObj__16dBgS_PolyPassChkFv(); +extern "C" void __ct__10dCcD_GSttsFv(); +extern "C" void Move__10dCcD_GSttsFv(); +extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); +extern "C" void __ct__12dCcD_GObjInfFv(); +extern "C" void __dt__12dCcD_GObjInfFv(); +extern "C" void ChkTgHit__12dCcD_GObjInfFv(); +extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); +extern "C" void getHitSeID__12dCcD_GObjInfFUci(); +extern "C" void Set__8dCcD_CylFRC11dCcD_SrcCyl(); +extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph(); +extern "C" void def_se_set__FP10Z2CreatureP8cCcD_ObjUlP10fopAc_ac_c(); +extern "C" void cc_at_check__FP10fopAc_ac_cP11dCcU_AtInfo(); +extern "C" void Start__9dCamera_cFv(); +extern "C" void Stop__9dCamera_cFv(); +extern "C" void SetTrimSize__9dCamera_cFl(); +extern "C" void Set__9dCamera_cF4cXyz4cXyz(); +extern "C" void Set__9dCamera_cF4cXyz4cXyzfs(); +extern "C" void Reset__9dCamera_cF4cXyz4cXyz(); +extern "C" void StartBlure__9dCamera_cFiP10fopAc_ac_cff(); +extern "C" void dCam_getBody__Fv(); +extern "C" void Eye__9dCamera_cFv(); +extern "C" void Center__9dCamera_cFv(); +extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); +extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); +extern "C" void dKy_change_colpat__FUc(); +extern "C" void dKy_custom_colset__FUcUcf(); +extern "C" void __ct__10dMsgFlow_cFv(); +extern "C" void Set__4cCcSFP8cCcD_Obj(); +extern "C" void __pl__4cXyzCFRC3Vec(); +extern "C" void __mi__4cXyzCFRC3Vec(); +extern "C" void atan2sX_Z__4cXyzCFv(); +extern "C" void atan2sY_XZ__4cXyzCFv(); +extern "C" void cM_rndF__Ff(); +extern "C" void cM_rndFX__Ff(); +extern "C" void SetPos__11cBgS_GndChkFPC4cXyz(); +extern "C" void __dt__13cBgS_PolyInfoFv(); +extern "C" void __dt__8cM3dGCirFv(); +extern "C" void SetC__8cM3dGCylFRC4cXyz(); +extern "C" void SetH__8cM3dGCylFf(); +extern "C" void SetR__8cM3dGCylFf(); +extern "C" void SetC__8cM3dGSphFRC4cXyz(); +extern "C" void SetR__8cM3dGSphFf(); +extern "C" void cLib_addCalc__FPfffff(); +extern "C" void cLib_addCalc2__FPffff(); +extern "C" void cLib_addCalc0__FPfff(); +extern "C" void cLib_addCalcPos__FP4cXyzRC4cXyzfff(); +extern "C" void cLib_addCalcAngleS2__FPssss(); +extern "C" void MtxPosition__FP4cXyzP4cXyz(); +extern "C" void func_80280808(); +extern "C" void seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); +extern "C" void seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); +extern "C" void bgmStart__8Z2SeqMgrFUlUll(); +extern "C" void bgmStop__8Z2SeqMgrFUll(); +extern "C" void subBgmStart__8Z2SeqMgrFUl(); +extern "C" void subBgmStop__8Z2SeqMgrFv(); +extern "C" void bgmStreamPrepare__8Z2SeqMgrFUl(); +extern "C" void bgmStreamPlay__8Z2SeqMgrFv(); +extern "C" void bgmStreamStop__8Z2SeqMgrFUl(); +extern "C" void changeBgmStatus__8Z2SeqMgrFl(); +extern "C" void setDemoName__11Z2StatusMgrFPc(); +extern "C" void __ct__15Z2CreatureEnemyFv(); +extern "C" void init__15Z2CreatureEnemyFP3VecP3VecUcUc(); +extern "C" void* __nw__FUl(); +extern "C" void __dl__FPv(); +extern "C" void init__12J3DFrameCtrlFs(); +extern "C" void checkPass__12J3DFrameCtrlFf(); +extern "C" void __construct_array(); +extern "C" void _savegpr_19(); +extern "C" void _savegpr_20(); +extern "C" void _savegpr_21(); +extern "C" void _savegpr_22(); +extern "C" void _savegpr_23(); +extern "C" void _savegpr_24(); +extern "C" void _savegpr_25(); +extern "C" void _savegpr_26(); +extern "C" void _savegpr_27(); +extern "C" void _savegpr_28(); +extern "C" void _savegpr_29(); +extern "C" void _restgpr_19(); +extern "C" void _restgpr_20(); +extern "C" void _restgpr_21(); +extern "C" void _restgpr_22(); +extern "C" void _restgpr_23(); +extern "C" void _restgpr_24(); +extern "C" void _restgpr_25(); +extern "C" void _restgpr_26(); +extern "C" void _restgpr_27(); +extern "C" void _restgpr_28(); +extern "C" void _restgpr_29(); +extern "C" extern void* __vt__8dCcD_Sph[36]; +extern "C" extern void* __vt__8dCcD_Cyl[36]; +extern "C" extern void* __vt__9dCcD_Stts[11]; +extern "C" extern void* __vt__12cCcD_SphAttr[25]; +extern "C" extern void* __vt__12cCcD_CylAttr[25]; +extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; +extern "C" extern void* __vt__9cCcD_Stts[8]; +extern "C" u8 now__14mDoMtx_stack_c[48]; +extern "C" u8 mSimpleTexObj__21dDlst_shadowControl_c[32]; +extern "C" u8 mCurrentMtx__6J3DSys[48]; +extern "C" u8 sincosTable___5JMath[65536]; +extern "C" extern u8 struct_80450C98[4]; +extern "C" u8 mParticleTracePCB__13dPa_control_c[4 + 4 /* padding */]; +extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; +extern "C" void __register_global_object(); + +// +// Declarations: +// + +/* 805DD248-805DD254 000000 000C+00 4/4 0/0 0/0 .data cNullVec__6Z2Calc */ +SECTION_DATA static u8 cNullVec__6Z2Calc[12] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* 805DD254-805DD268 00000C 0004+10 0/0 0/0 0/0 .data @1787 */ +#pragma push +#pragma force_active on +SECTION_DATA static u32 lit_1787[1 + 4 /* padding */] = { + 0x02000201, + /* padding */ + 0x40080000, + 0x00000000, + 0x3FE00000, + 0x00000000, +}; +#pragma pop + +/* 805DD268-805DD270 000020 0008+00 0/0 0/0 0/0 .data e_prim$3811 */ +#pragma push +#pragma force_active on +SECTION_DATA static u8 e_prim[8] = { + 0xFF, 0x78, 0x00, 0x00, 0xFF, 0x64, 0x78, 0x00, +}; +#pragma pop + +/* 805DD270-805DD278 000028 0008+00 0/0 0/0 0/0 .data e_env$3812 */ +#pragma push +#pragma force_active on +SECTION_DATA static u8 e_env[8] = { + 0x5A, 0x2D, 0x2D, 0x00, 0x3C, 0x1E, 0x1E, 0x00, +}; +#pragma pop + +/* 805DD278-805DD280 000030 0006+02 0/0 0/0 0/0 .data eff_id$3820 */ +#pragma push +#pragma force_active on +SECTION_DATA static u8 eff_id[6 + 2 /* padding */] = { + 0x02, + 0x9D, + 0x02, + 0x9E, + 0x02, + 0x9F, + /* padding */ + 0x00, + 0x00, +}; +#pragma pop + +namespace { +/* 805DD280-805DD2C0 000038 0040+00 0/1 0/0 0/0 .data cc_ds_week_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcSph cc_ds_week_src = { + { + 0, + {{0, 0, 0}, {0x00fbfdff, 0x43}, {0x75}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph +}; + +/* 805DD2C0-805DD300 000078 0040+00 0/1 0/0 0/0 .data cc_ds_head_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcSph cc_ds_head_src = { + { + 0, + {{0, 0, 0}, {0xd8fbfdff, 3}, {0x55}}, // mObj + {0xa, 0, 0, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph +}; + +/* 805DD300-805DD340 0000B8 0040+00 0/0 0/0 0/0 .data cc_ds_body_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcSph cc_ds_body_src = { + { + 0, + {{0, 0, 0}, {0xd8fbfdff, 0x43}, {0x75}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0xa, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph +}; + +/* 805DD340-805DD384 0000F8 0044+00 0/1 0/0 0/0 .data cc_ds_backbone_src__22@unnamed@d_a_b_ds_cpp@ + */ +static dCcD_SrcCyl cc_ds_backbone_src = { + { + 0, + {{0, 0, 0}, {0xd8fbfdff, 0x43}, {0x55}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0xa, 2, 0, 0, 0x307}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + { + {0.0f, 0.0f, 0.0f}, // mCenter + 30.0f, // mRadius + 130.0f, // mHeight + } // mCyl +}; + +/* 805DD384-805DD3C8 00013C 0044+00 0/1 0/0 0/0 .data + * cc_ds_hand_at_cyl_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcCyl cc_ds_hand_at_cyl_src = { + { + 0, + {{0x100000, 4, 0x1f}, {0xd8fbfdff, 3}, {0x75}}, // mObj + {0xa, 0, 0xe, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x307}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + { + {0.0f, 0.0f, 0.0f}, // mCenter + 30.0f, // mRadius + 130.0f, // mHeight + } // mCyl +}; + +/* 805DD3C8-805DD408 000180 0040+00 0/1 0/0 0/0 .data + * cc_ds_breath_at_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcSph cc_ds_breath_at_src = { + { + 0, + {{0x100000, 3, 0xd}, {0, 0}, {0}}, // mObj + {0xd, 0, 0xd, 0, 0}, // mGObjAt + {0, 0, 0, 0, 0}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph +}; +}; // namespace + +f32 dummyLiteral0() { + f32 temp = 100.0f; + + f32 temp_0 = 0.0f; + temp += temp_0; + temp += 1.0f; + return temp; +} + +f64 dummyLiteral1() { + return 0.5; +} + +f64 dummyLiteral2() { + return 3.0; +} + +f64 dummyLiteral3() { + return 0.0; +} + +f32 dummyLiteral4() { + return 0.01f; +} + +/* 805CB22C-805CB314 0000EC 00E8+00 1/1 0/0 0/0 .text __ct__12daB_DS_HIO_cFv */ +daB_DS_HIO_c::daB_DS_HIO_c() { + field_0x04 = -1; + mModelSize = 1.0f; + mHandRange = 2000.0f; + mBreathRange = 3900.0f; + mGuardSpawnRange = 2000.0f; + mNoSearchRange = 2500.0f; + mP2MoveAxis = 2800.0f; + mP2AttackHeight = 700.0f; + mP2ModelSize = 5.0f; + mP2FallTime = 250; + mPedestalFallTime = 200; + mSandFallWaitTime = 50; + mP2BulletFireTime = 5; + mP2OuterWallAttackTime = 850; + mP2TrapCreateWaitTime1 = 0; + mP2TrapCreateWaitTime2 = 300; + mP2TrapCreateID1 = 70; + mP2TrapCreateID2 = 10; + mHintTime1 = 600; + mHintTime2 = 600; + mP2OuterWallTrapSpeed = 12; + mTowerTrapSpeed = 14; + mP2ApproachAccel = 5; + mP2ApproachSpeedMax = 100; + mP2ApproachAfterBullet = 0x400; + mP2ApproachDist = 0x1800; + mP2Health = 1080; + mP2HealthDebugOn = false; +} + +/* ############################################################################################## */ +/* 805DDA70-805DDA74 000008 0001+03 8/8 0/0 0/0 .bss @1109 */ +static u8 lit_1109[1 + 3 /* padding */]; + +/* 805DDA74-805DDA78 00000C 0001+03 0/0 0/0 0/0 .bss @1107 */ +#pragma push +#pragma force_active on +static u8 lit_1107[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA78-805DDA7C 000010 0001+03 0/0 0/0 0/0 .bss @1105 */ +#pragma push +#pragma force_active on +static u8 lit_1105[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA7C-805DDA80 000014 0001+03 0/0 0/0 0/0 .bss @1104 */ +#pragma push +#pragma force_active on +static u8 lit_1104[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA80-805DDA84 000018 0001+03 0/0 0/0 0/0 .bss @1099 */ +#pragma push +#pragma force_active on +static u8 lit_1099[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA84-805DDA88 00001C 0001+03 0/0 0/0 0/0 .bss @1097 */ +#pragma push +#pragma force_active on +static u8 lit_1097[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA88-805DDA8C 000020 0001+03 0/0 0/0 0/0 .bss @1095 */ +#pragma push +#pragma force_active on +static u8 lit_1095[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA8C-805DDA90 000024 0001+03 0/0 0/0 0/0 .bss @1094 */ +#pragma push +#pragma force_active on +static u8 lit_1094[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA90-805DDA94 000028 0001+03 0/0 0/0 0/0 .bss @1057 */ +#pragma push +#pragma force_active on +static u8 lit_1057[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA94-805DDA98 00002C 0001+03 0/0 0/0 0/0 .bss @1055 */ +#pragma push +#pragma force_active on +static u8 lit_1055[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA98-805DDA9C 000030 0001+03 0/0 0/0 0/0 .bss @1053 */ +#pragma push +#pragma force_active on +static u8 lit_1053[1 + 3 /* padding */]; +#pragma pop + +/* 805DDA9C-805DDAA0 000034 0001+03 0/0 0/0 0/0 .bss @1052 */ +#pragma push +#pragma force_active on +static u8 lit_1052[1 + 3 /* padding */]; +#pragma pop + +/* 805DDAA0-805DDAA4 000038 0001+03 0/0 0/0 0/0 .bss @1014 */ +#pragma push +#pragma force_active on +static u8 lit_1014[1 + 3 /* padding */]; +#pragma pop + +/* 805DDAA4-805DDAA8 00003C 0001+03 0/0 0/0 0/0 .bss @1012 */ +#pragma push +#pragma force_active on +static u8 lit_1012[1 + 3 /* padding */]; +#pragma pop + +/* 805DDAA8-805DDAAC 000040 0001+03 0/0 0/0 0/0 .bss @1010 */ +#pragma push +#pragma force_active on +static u8 lit_1010[1 + 3 /* padding */]; +#pragma pop + +/* 805DDAAC-805DDAB0 -00001 0004+00 2/2 0/0 0/0 .bss None */ +/* 805DDAAC 0001+00 data_805DDAAC @1009 */ +/* 805DDAAD 0003+00 data_805DDAAD None */ +static u8 struct_805DDAAC; + +static bool hioInit; + +/* 805DDABC-805DDB0C 000054 0050+00 21/23 0/0 0/0 .bss l_HIO */ +static daB_DS_HIO_c l_HIO; + +/* 805DDB0C-805DDB10 -00001 0004+00 0/1 0/0 0/0 .bss None */ +/* 805DDB0C 0002+00 data_805DDB0C handL_ang */ +/* 805DDB0E 0002+00 data_805DDB0E handR_ang */ +static s16 handL_ang; +static s16 handR_ang; + +/* 805DDB10-805DDB14 -00001 0004+00 3/4 0/0 0/0 .bss None */ +/* 805DDB10 0002+00 data_805DDB10 handX_ang */ +/* 805DDB12 0002+00 breathTimerBase None */ +static s16 handX_ang; +static u8 breathTimerBase; + +/* 805CB314-805CB4A4 0001D4 0190+00 2/1 0/0 0/0 .text ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel */ +int daB_DS_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { + cXyz sp40; + cXyz sp4C; + csXyz rot; + + u16 joint_no = i_joint->getJntNo(); + mDoMtx_stack_c::copy(i_model->getAnmMtx(joint_no)); + + if (mBossPhase == 0) { + switch (joint_no) { + case DS_JNT_NECK1: + rot.x = 0; + rot.y = FAST_DIV(mHeadAngle.y, 2); + rot.z = mHeadAngle.x; + mDoMtx_stack_c::ZXYrotM(rot); + break; + case DS_JNT_HEAD: + rot.x = 0; + rot.y = FAST_DIV(mHeadAngle.y, 2); + rot.z = mHeadAngle.x; + mDoMtx_stack_c::ZXYrotM(rot); + break; + case DS_JNT_ARM_L1: + mDoMtx_stack_c::YrotM(handL_ang); + mDoMtx_stack_c::XrotM(handX_ang); + break; + case DS_JNT_ARM_L2: + mDoMtx_stack_c::YrotM(-handL_ang); + break; + case DS_JNT_ARM_R1: + mDoMtx_stack_c::YrotM(-handR_ang); + mDoMtx_stack_c::XrotM(-handX_ang); + break; + case DS_JNT_ARM_R2: + mDoMtx_stack_c::YrotM(handR_ang); + break; + } + } + + i_model->setAnmMtx(joint_no, mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + return 1; +} + +/* 805CB4A4-805CB4F0 000364 004C+00 1/1 0/0 0/0 .text JointCallBack__8daB_DS_cFP8J3DJointi */ +int daB_DS_c::JointCallBack(J3DJoint* i_joint, int param_1) { + if (param_1 == 0) { + daB_DS_c* a_this = (daB_DS_c*)j3dSys.getModel()->getUserArea(); + if (a_this != NULL) { + a_this->ctrlJoint(i_joint, j3dSys.getModel()); + } + } + + return 1; +} + +/* 805CB4F0-805CBAA8 0003B0 05B8+00 1/1 0/0 0/0 .text draw__8daB_DS_cFv */ +int daB_DS_c::draw() { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C || + mBossPhase == 100) + { + return 1; + } + + J3DModel* model = mpMorf->getModel(); + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType_MAJI(model->mModelData, &tevStr); + J3DModelData* model_data = model->getModelData(); + + if (arg0 == TYPE_BATTLE_2) { + if (!mDead) { + if (model_data->getMaterialNodePointer(2) != NULL) { + model_data->getMaterialNodePointer(2)->getTevColor(2)->a = (u8)mEyeColorAlpha; + model_data->getMaterialNodePointer(1)->getTevKColor(1)->a = mCrackAlpha; + } + + mpMorf->entryDL(); + + cXyz shadow_pos; + shadow_pos.set(current.pos.x, current.pos.y + 120.0f, current.pos.z); + tevStr.field_0x344 = field_0x7f8; + mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &shadow_pos, 6000.0f, 0.0f, + current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, + 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + } + + if (!mNoDrawSword) { + J3DModel* sword_model = mpSwordMorf->getModel(); + g_env_light.settingTevStruct(0, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(sword_model->mModelData, &tevStr); + mpSwordBrkAnm->entry(sword_model->getModelData()); + mpSwordMorf->entryDL(); + } + + if (mPlayPatternAnm) { + mpPatternBrkAnm->entry(mpPatternModel->getModelData()); + mpPatternBtkAnm->entry(mpPatternModel->getModelData()); + mDoExt_modelUpdateDL(mpPatternModel); + } + + return 1; + } else { + if (model_data->getMaterialNodePointer(2) != NULL) { + model_data->getMaterialNodePointer(2)->getTevColor(2)->a = (u8)mEyeColorAlpha; + model_data->getMaterialNodePointer(1)->getTevKColor(1)->a = mCrackAlpha; + } + + u8 backbone_hide_mat = 0; + if (mBossPhase != 0) { + backbone_hide_mat = 6; + } else if (mBackboneLevel == 1) { + backbone_hide_mat = 4; + } else if (mBackboneLevel == 2) { + backbone_hide_mat = 5; + } + + if (mBackboneCrackAlpha[mBackboneLevel] != 255.0f) { + J3DMaterial* material = + model->getModelData()->getMaterialNodePointer((u8)(mBackboneLevel + 4)); + if (material != NULL) { + material->getTevKColor(1)->a = mBackboneCrackAlpha[mBackboneLevel]; + } + } + + if (mBackboneLevel != 0 && mBackboneLevel < 3) { + for (int i = 4; i < backbone_hide_mat + 1; i++) { + J3DShape* shape = + mpMorf->getModel()->getModelData()->getMaterialNodePointer((u8)i)->getShape(); + if (shape != NULL) { + shape->hide(); + } + } + } else { + for (int i = 4; i < 7; i++) { + J3DShape* shape = + mpMorf->getModel()->getModelData()->getMaterialNodePointer((u8)i)->getShape(); + if (shape != NULL) { + shape->show(); + } + } + } + + mpMorf->entryDL(); + + if (!mNoDrawSword) { + J3DModel* sword_model = mpSwordMorf->getModel(); + g_env_light.settingTevStruct(0, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(sword_model->mModelData, &tevStr); + mpSwordBrkAnm->entry(sword_model->getModelData()); + mpSwordMorf->entryDL(); + } + + if (mPlayPatternAnm) { + mpOpPatternBrkAnm->entry(mpOpPatternModel->getModelData()); + mpOpPatternBtkAnm->entry(mpOpPatternModel->getModelData()); + mDoExt_modelUpdateDL(mpOpPatternModel); + } + + if (mDrawZant) { + J3DModel* zant_model = mpZantMorf->getModel(); + g_env_light.settingTevStruct(3, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(zant_model->mModelData, &tevStr); + + J3DShape* shape = + mpZantMorf->getModel()->getModelData()->getMaterialNodePointer(2)->getShape(); + if (shape != NULL) { + if (!mDrawZantSword) { + shape->hide(); + } else { + shape->show(); + } + } + mpZantMorf->entryDL(); + } + + cXyz shadow_pos; + shadow_pos.set(current.pos.x, current.pos.y + 1000.0f, current.pos.z); + model = mpMorf->getModel(); + tevStr.field_0x344 = field_0x7f8; + mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &shadow_pos, 7000.0f, 0.0f, + current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, + 1.0f, dDlst_shadowControl_c::getSimpleTex()); + + return 1; + } +} + +/* 805CBAA8-805CBAC8 000968 0020+00 1/0 0/0 0/0 .text daB_DS_Draw__FP8daB_DS_c */ +static int daB_DS_Draw(daB_DS_c* i_this) { + return i_this->draw(); +} + +/* 805CBAC8-805CBB74 000988 00AC+00 18/18 0/0 0/0 .text setBck__8daB_DS_cFiUcff */ +void daB_DS_c::setBck(int i_anmID, u8 i_attr, f32 i_morf, f32 i_rate) { + J3DAnmTransform* anm = static_cast(dComIfG_getObjectRes("B_DS", i_anmID)); + mpMorf->setAnm(anm, i_attr, i_morf, i_rate, 0.0f, -1.0f); + mAnmID = i_anmID; +} + +/* 805CBB74-805CBB80 000A34 000C+00 18/18 0/0 0/0 .text setActionMode__8daB_DS_cFii */ +void daB_DS_c::setActionMode(int i_action, int i_mode) { + mAction = i_action; + mMode = i_mode; +} + +/* 805DD470-805DD474 000228 0004+00 5/6 0/0 0/0 .data eff_smoke_id */ +static u16 eff_smoke_id[2] = {0x8BC4, 0x8BC5}; + +/* 805CBB80-805CBD00 000A40 0180+00 1/1 0/0 0/0 .text mSmokeSet__8daB_DS_cFv */ +void daB_DS_c::mSmokeSet() { + if (mSmokeCount >= 20) { + return; + } + + if (mAcch.i_ChkGroundHit()) { + if (field_0x84d == 0 && mAcch.GetGroundH() != -1000000000.0f) { + cXyz particle_scale(1.0f, 1.0f, 1.0f); + cXyz particle_pos(current.pos); + csXyz particle_angle(shape_angle); + + particle_pos.y = mAcch.GetGroundH(); + particle_angle.z = 0; + particle_angle.x = 0; + + mSmokeParticleKey[mSmokeCount] = + dComIfGp_particle_set(mSmokeParticleKey[mSmokeCount], eff_smoke_id[1], + &particle_pos, &particle_angle, &particle_scale); + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_H_COL, 0, -1); + + field_0x84d = 1; + mSmokeCount++; + } + } else { + field_0x84d = 0; + } +} + +/* 805CBD00-805CBD64 000BC0 0064+00 3/3 0/0 0/0 .text mHeadAngle_Clear__8daB_DS_cFv */ +void daB_DS_c::mHeadAngle_Clear() { + cLib_addCalcAngleS2(&mHeadAngle.x, 0, 20, 0x100); + cLib_addCalcAngleS2(&mHeadAngle.y, 0, 20, 0x100); + cLib_addCalcAngleS2(&mHeadAngle.z, 0, 20, 0x100); +} + +/* 805CBD64-805CBED0 000C24 016C+00 1/1 0/0 0/0 .text HandHitSoundSet__8daB_DS_cFb */ +void daB_DS_c::HandHitSoundSet(bool i_isLeft) { + csXyz hit_angle; + cXyz sp18, hit_pos; + + if (!i_isLeft) { + sp18 = mHandPos[1] - *mHandAtRCyl.GetTgHitPosP(); + hit_pos = *mHandAtRCyl.GetTgHitPosP(); + hit_pos.y += 100.0f; + mSoundPos = mHandPos[1]; + } else { + sp18 = mHandPos[0] - *mHandAtLCyl.GetTgHitPosP(); + hit_pos = *mHandAtLCyl.GetTgHitPosP(); + hit_pos.y += 100.0f; + mSoundPos = mHandPos[0]; + } + + hit_angle.x = 0; + hit_angle.y = sp18.atan2sX_Z(); + hit_angle.z = 0; + + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); +} + +/* 805CBED0-805CC158 000D90 0288+00 1/1 0/0 0/0 .text handSPosSet__8daB_DS_cFi */ +void daB_DS_c::handSPosSet(int i_hand) { + cXyz chk_pos, particle_pos; + csXyz particle_angle; + dBgS_GndChk gnd_chk; + + chk_pos = mFingerPos[i_hand]; + chk_pos.y += 800.0f; + gnd_chk.SetPos(&chk_pos); + + chk_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (chk_pos.y == -1000000000.0f) { + chk_pos.y = mFingerPos[i_hand].y; + } + particle_pos = chk_pos - mHandPos[i_hand]; + + mDoMtx_YrotS(*calc_mtx, (s16)particle_pos.atan2sX_Z()); + + chk_pos.x = 0.0f; + chk_pos.y = 200.0f; + chk_pos.z = 400.0f; + MtxPosition(&chk_pos, &particle_pos); + + particle_pos += mHandPos[i_hand]; + particle_pos.y += 800.0f; + gnd_chk.SetPos(&particle_pos); + + particle_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (particle_pos.y == -1000000000.0f) { + particle_pos.y = mHandPos[i_hand].y; + } + chk_pos = particle_pos - mHandPos[i_hand]; + + particle_angle.x = chk_pos.atan2sY_XZ(); + particle_angle.y = particle_pos.atan2sX_Z(); + particle_angle.z = 0; + + cXyz particle_scale(1.0f, 1.0f, 1.0f); + for (int i = 0; i < 2; i++) { + mHandSmokeParticleKey[(i_hand << 1) + i] = + dComIfGp_particle_set(mHandSmokeParticleKey[(i_hand << 1) + i], eff_smoke_id[i], + &particle_pos, &particle_angle, &particle_scale); + } + + dComIfGp_getVibration().StartShock(2, 0x4F, cXyz(0.0f, 1.0f, 0.0f)); +} + +/* 805CC158-805CC1C4 001018 006C+00 8/8 0/0 0/0 .text hand_smokeSet__8daB_DS_cFUc */ +void daB_DS_c::hand_smokeSet(u8 i_hand) { + if (i_hand == 0 || i_hand == 1) { + handSPosSet(0); + } + + if (i_hand == 0 || i_hand == 2) { + handSPosSet(1); + } +} + +/* 805CC1C4-805CC454 001084 0290+00 1/1 0/0 0/0 .text mZsMoveChk__8daB_DS_cFv */ +void daB_DS_c::mZsMoveChk() { + cXyz offset, zs_pos; + + fopAc_ac_c* staltroop; + int indices[15]; + int count = 0; + int i; + + for (i = 0; i < 15; i++) { + indices[count] = 0; + if (mStaltroopID[i] != 0) { + if (fopAcM_SearchByID(mStaltroopID[i], &staltroop) == 0) { + mStaltroopID[i] = 0; + } else { + indices[count] = i; + count++; + } + } + } + + if (count == 0) { + return; + } + + dBgS_GndChk gnd_chk; + s16 angle_y = fopAcM_searchPlayerAngleY(this); + + for (i = 0; i < count; i++) { + if (indices[i] == 0) { + continue; + } + + mDoMtx_YrotS(*calc_mtx, angle_y); + + offset.x = 0.0f; + offset.y = 0.0f; + offset.z = 1500.0f; + offset.z += cM_rndF(500.0f); + MtxPosition(&offset, &zs_pos); + + zs_pos += current.pos; + zs_pos.y += 2000.0f; + gnd_chk.SetPos(&zs_pos); + + if (zs_pos.y != -1000000000.0f) { + zs_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + } else { + zs_pos.y = current.pos.y += 800.0f; + } + + if (mStaltroopID[indices[i]] != 0 && + fopAcM_SearchByID(mStaltroopID[indices[i]], &staltroop) != 0 && staltroop != NULL) + { + staltroop->home.pos.x = zs_pos.x; + staltroop->home.pos.y = zs_pos.y; + staltroop->home.pos.z = zs_pos.z; + } + + angle_y = fopAcM_searchPlayerAngleY(this); + angle_y += (s16)cM_rndFX(0x2000); + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() || mAction == ACT_DAMAGE || + fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + mIsAppear = false; + return; + } + + mIsAppear = true; +} + +/* 805CC454-805CC6F4 001314 02A0+00 1/1 0/0 0/0 .text mZsMoveChk_Guard__8daB_DS_cFv */ +void daB_DS_c::mZsMoveChk_Guard() { + static s16 mGuardDt[5] = {-0x1800, 0xC00, -0xC00, 0, 0x1800}; + + cXyz offset, zs_pos; + s16 angle_to_player = fopAcM_searchPlayerAngleY(this); + fopAc_ac_c* staltroop; + dBgS_GndChk gnd_chk; + + s16 angle_y[5]; + + int i = 0; + int index = cM_rndF(5.0f); + for (; i < 5; i++, index++) { + if (index > 4) { + index = 0; + } + + angle_y[i] = angle_to_player; + + if (mGuardDt[index] != 0) { + angle_y[i] += mGuardDt[index]; + } + } + + for (int i = 0; i < 5; i++) { + mDoMtx_YrotS(*calc_mtx, angle_y[i]); + + offset.x = 0.0f; + offset.y = 0.0f; + offset.z = 500.0f; + MtxPosition(&offset, &zs_pos); + + zs_pos += current.pos; + zs_pos.y += 2000.0f; + gnd_chk.SetPos(&zs_pos); + + if (zs_pos.y != -1000000000.0f) { + zs_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + } else { + zs_pos.y = current.pos.y += 800.0f; + } + + if (mStaltroop2ID[i] != 0 && fopAcM_SearchByID(mStaltroop2ID[i], &staltroop) != 0 && + staltroop != NULL) + { + staltroop->home.pos.x = zs_pos.x; + staltroop->home.pos.y = zs_pos.y; + staltroop->home.pos.z = zs_pos.z; + } + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() || mAction == ACT_DAMAGE || + fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + mIsAppearG = false; + return; + } + + if (fopAcM_searchPlayerDistance(this) < l_HIO.mGuardSpawnRange) { + mIsAppearG = true; + } +} + +/* 805CC6F4-805CC80C 0015B4 0118+00 1/1 0/0 0/0 .text mTrapScale__8daB_DS_cFv */ +void daB_DS_c::mTrapScale() { + f32 target_scale = 1.0f; + if (mBossPhase != 0) { + target_scale = 2.0f; + } else if (mTrapID[0] == 0) { + return; + } + + for (int i = 0; i < 20; i++) { + fopAc_ac_c* trap_actor; + if (fopAcM_SearchByID(mTrapID[i], &trap_actor) != 0 && trap_actor != NULL) { + cLib_addCalc2(&trap_actor->scale.x, target_scale, 0.7f, 0.5f); + cLib_addCalc2(&trap_actor->scale.y, target_scale, 0.8f, 2.0f); + cLib_addCalc2(&trap_actor->scale.z, target_scale, 0.7f, 0.5f); + + if (fabsf(trap_actor->scale.y - target_scale) < 0.1f) { + trap_actor->scale.set(target_scale, target_scale, target_scale); + } + } + } +} + +/* 805CC80C-805CC8A4 0016CC 0098+00 2/2 0/0 0/0 .text mClearTrap__8daB_DS_cFb */ +void daB_DS_c::mClearTrap(bool i_delete) { + for (int i = 0; i < 20; i++) { + if (mTrapID[i] == 0) { + continue; + } + + fopAc_ac_c* trap_actor; + if (fopAcM_SearchByID(mTrapID[i], &trap_actor) != 0 && trap_actor != NULL) { + if (i_delete) { + fopAcM_delete(trap_actor); + } else { + trap_actor->health = 0; + } + + mTrapID[i] = 0; + } + } +} + +/* 805CC8A4-805CCEB4 001764 0610+00 3/3 0/0 0/0 .text mCreateTrap__8daB_DS_cFb */ +void daB_DS_c::mCreateTrap(bool param_0) { + daPy_py_c* pla = daPy_getPlayerActorClass(); + if (mBossPhase == 0) { + if (cLib_calcTimer(&mBirthTrapTimerF) != 0 || mPedestalFallTimer != 0 || + mSandFallTimer != 0 || mAction == ACT_DAMAGE || mAction == ACT_OPENING_DEMO) + { + mClearTrap(true); + return; + } + } else if (pla->current.pos.y < -1300.0f || pla->current.pos.y > l_HIO.mP2AttackHeight || + (mAction == ACT_CIRCLE && mMode >= 3 && mMode <= 4) || mOutTimer == 0 || + daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 || mAction == ACT_WAIT || + mAction == ACT_DAMAGE || mAction == ACT_ETC_DAMAGE || mAction == ACT_HAND_ATTACK) + { + mTrapCreate = false; + mClearTrap(false); + return; + } + + mTrapScale(); + + if (mBossPhase == 0 && !param_0 && (fopAcM_searchPlayerAngleY(this) & 0xFFF) == 0) { + return; + } + + cXyz pos, vec; + cXyz trap_scale(1.0f, 1.0f, 1.0f); + u32 params; + + if (mBossPhase != 0 && health <= (int)l_HIO.mP2Health / 3 * 2 && mTrapCreate) { + int i = 6; + int trap_count = 0; + for (; i < 20 && trap_count < 2; i++) { + if (mTrapID[i] != 0) { + fopAc_ac_c* actor; + if (fopAcM_SearchByID(mTrapID[i], &actor) != 0 && actor != NULL) { + continue; + } + mTrapID[i] = 0; + } + + params = 0x1F5003; + params |= (int)l_HIO.mTowerTrapSpeed << 8; + + int trap_create_id; + if (trap_count == 0) { + trap_create_id = l_HIO.mP2TrapCreateID1; + params |= l_HIO.mP2TrapCreateID1 << 0x18; + } else { + trap_create_id = l_HIO.mP2TrapCreateID2; + params |= l_HIO.mP2TrapCreateID2 << 0x18; + } + + dPath* path = dPath_GetRoomPath(3, fopAcM_GetRoomNo(this)); + if (path != NULL) { + dStage_dPnt_c& point = path->m_points[trap_create_id]; + pos = point.m_position; + vec = pos - current.pos; + if (vec.abs() <= 200.0f) { + continue; + } + + csXyz angle; + angle.x = 0; + angle.y = 0; + angle.z = 0; + mTrapID[i] = fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), params, + ¤t.pos, fopAcM_GetRoomNo(this), &angle, + &trap_scale, -1, NULL); + trap_count++; + } + } + mTrapCreate = false; + } + + trap_scale.set(0.0f, 7.0f, 0.0f); + pos.zero(); + csXyz angle; + angle.y = 0; + angle.z = 0; + angle.x = 0; + pos.y = 1708.0f; + + static s16 mBirthAngle01_dt[4] = {0x0000, 0x4000, 0x8000, 0xc000}; + static s16 mBirthAngle02_dt[3] = {0x0000, 0x5555, 0xaaaa}; + static f32 mBirthYpos02_dt[3] = {1150.0f, 350.0f, -450.0f}; + + if (mBossPhase == 0) { + int trap_max = 6; + if (mBackboneLevel < 2) { + trap_max = 4; + } + + for (int i = 0; i < trap_max; i++) { + if (mBackboneLevel < 2) { + angle.y = mBirthAngle01_dt[i]; + } + + if (mTrapID[i] != 0) { + continue; + } + + mTrapID[i] = + fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), 0x27104DFF, &pos, + fopAcM_GetRoomNo(this), &angle, &trap_scale, -1, NULL); + if (mBackboneLevel == 2) { + angle.y += 0x2AAA; + } + } + } else { + pos.zero(); + + if (health <= (int)l_HIO.mP2Health / 3) { + params = 0x271040FF; + params |= (int)l_HIO.mP2OuterWallTrapSpeed << 8; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 2; j++) { + int idx = (i << 1) + j; + if (mTrapID[idx] != 0) { + continue; + } + + angle.y = mBirthAngle02_dt[i] + mBirthAngle01_dt[j * 2]; + pos.y = mBirthYpos02_dt[i]; + mTrapID[idx] = + fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), params, &pos, + fopAcM_GetRoomNo(this), &angle, &trap_scale, -1, NULL); + } + } + } + } +} + +/* 805CCEB4-805CD074 001D74 01C0+00 1/1 0/0 0/0 .text mChangeVer2__8daB_DS_cFv */ +void daB_DS_c::mChangeVer2() { + if (bitSw != 0xFF) { + fopAcM_offSwitch(this, bitSw); + } + + mCrackAlpha = 0.0f; + shape_angle.x = 0; + mBossPhase = 1; + gravity = 0.0f; + mDead = false; + + mHandAtLCyl.OffTgSetBit(); + mHandAtRCyl.OffTgSetBit(); + mHandAtLCyl.OffCoSetBit(); + mHandAtRCyl.OffCoSetBit(); + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + + mWeakSph.OffTgSetBit(); + mWeakSph.OffCoSetBit(); + mWeakSph.OffAtSetBit(); + mWeakSph.OnTgNoHitMark(); + mWeakSph.OffTgShield(); + mWeakSph.OffTgNoConHit(); + mWeakSph.OnTgStopNoConHit(); + mWeakSph.SetTgHitMark(CcG_Tg_UNK_MARK_0); + + mBackboneCyl.OffTgSetBit(); + mBackboneCyl.OffCoSetBit(); + + for (int i = 0; i < 5; i++) { + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OnTgShield(); + mHeadSph[i].OffTgIronBallRebound(); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OnTgNoHitMark(); + } + + dComIfGs_onZoneSwitch(6, fopAcM_GetRoomNo(this)); + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + + mIsOpeningDemo = true; + mBackboneLevel = 0; + field_0x560 = health = l_HIO.mP2Health; +} + +/* 805CD074-805CD628 001F34 05B4+00 1/1 0/0 0/0 .text damage_check__8daB_DS_cFv */ +void daB_DS_c::damage_check() { + if (health <= 1 || mBossPhase == 100) { + return; + } + + if (cLib_calcTimer(&mDamageTimer) != 0) { + return; + } + + if (mHandAtRCyl.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHandAtRCyl.GetTgHitObj(); + HandHitSoundSet(false); + + if (mAction != ACT_OPENING_DEMO && mHandAtRCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) && + (mAction != ACT_ETC_DAMAGE || mHitLocation != 0)) + { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 0; + mMode = 0; + } + + mHandAtRCyl.ClrTgHit(); + return; + } + + if (mHandAtLCyl.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHandAtLCyl.GetTgHitObj(); + HandHitSoundSet(true); + + if (mAction != ACT_OPENING_DEMO && mHandAtLCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) && + (mAction != ACT_ETC_DAMAGE || mHitLocation != 1)) + { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 1; + mMode = 1; + } + + mHandAtLCyl.ClrTgHit(); + return; + } + + for (int i = 0; i < 18; i++) { + if (mEtcSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mEtcSph[i].GetTgHitObj(); + mSoundPos = *mEtcSph[i].GetTgHitPosP(); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mEtcSph[i].ClrTgHit(); + return; + } + } + + for (int i = 0; i < 5; i++) { + if (mHeadSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + mSoundPos = mHeadPos; + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + + if (mAction != ACT_OPENING_DEMO && (mAction != ACT_ETC_DAMAGE || mHitLocation != 2)) { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 2; + mMode = 2; + } + + mHeadSph[i].ClrTgHit(); + return; + } + } + + if (mWeakSph.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mWeakSph.GetTgHitObj(); + mSoundPos = mHeadPos; + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + + if (mAction != ACT_OPENING_DEMO && (mAction != ACT_ETC_DAMAGE || mHitLocation != 2)) { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 2; + mMode = 2; + } + + mWeakSph.ClrTgHit(); + return; + } + + if (mAction == ACT_OPENING_DEMO) { + return; + } + + daPy_getPlayerActorClass()->onBossRoomWait(); + mCcStts.Move(); + + if (mBackboneCyl.ChkTgHit()) { + mAtInfo.mpCollider = mBackboneCyl.GetTgHitObj(); + cXyz vec = current.pos - *mBackboneCyl.GetTgHitPosP(); + cXyz hit_pos = *mBackboneCyl.GetTgHitPosP(); + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec.atan2sX_Z(); + hit_angle.z = 0; + mSoundPos = current.pos; + + if (mBackboneCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) && + daPy_getPlayerActorClass()->checkSpinnerTriggerAttack()) + { + u8 se = static_cast(mBackboneCyl.GetTgHitObj())->GetAtSe(); + mSound.startCollisionSE(dCcD_GObjInf::getHitSeID(se, 0), mAtInfo.field_0x18); + dComIfGp_getVibration().StopQuake(0x4f); + + mBackboneCyl.SetTgHitMark(CcG_Tg_UNK_MARK_3); + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + mHandAtLCyl.OffTgShield(); + mHandAtRCyl.OffTgShield(); + + mModeTimer = 0; + if (bitSw3 != 0xFF) { + fopAcM_onSwitch(this, bitSw3); + } + + def_se_set(&mSound, mAtInfo.mpCollider, 0x1f, NULL); + dComIfGp_setHitMark(3, this, &hit_pos, &hit_angle, NULL, 0); + + mDamageTimer = 50; + setActionMode(ACT_DAMAGE, 0); + + if (mBackboneLevel >= 2) { + Z2GetAudioMgr()->bgmStop(0x1e, 0); + } + } else { + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + } + } +} + +/* 805CD628-805CD844 0024E8 021C+00 1/1 0/0 0/0 .text neck_set__8daB_DS_cFv */ +void daB_DS_c::neck_set() { + static f32 HeadAngleDt[3] = {-850.0f, -350.0f, -50.0f}; + cXyz mae; + csXyz angl; + angl.z = 0; + angl.y = 0; + angl.x = 0; + + if (mAction != ACT_OPENING_DEMO && mAction != ACT_DAMAGE) { + daPy_py_c* pla = daPy_getPlayerActorClass(); + mae.x = pla->current.pos.x - mHeadPos.x; + mae.z = pla->current.pos.z - mHeadPos.z; + mae.y = pla->current.pos.y - (mHeadPos.y + HeadAngleDt[mBackboneLevel]); + + angl.x = -mae.atan2sY_XZ() * 2.0f; + if (mAction == ACT_BREATH_ATTACK) { + angl.x = mBh2AttackAngleF; + angl.x += (s16)(mBackboneLevel * 200); + } + + if (angl.x > 0x2000) { + angl.x = 0x2000; + } else if (angl.x < -0x400) { + angl.x = -0x400; + } + + cLib_addCalcAngleS2(&mHeadAngle.x, -angl.x, 20, 0x100); + + angl.y = shape_angle.y - mae.atan2sX_Z(); + if (angl.y > 0x3000) { + angl.y = 0x3000; + } else if (angl.y < -0x3000) { + angl.y = -0x3000; + } + + if (WREG_S(1)) { + OS_REPORT("\n\n\n\n"); + OS_REPORT("mHeadPos.y %f\n", mHeadPos.y); + OS_REPORT("angl.sx %x\n", angl.x); + OS_REPORT("angl.sy %x\n", angl.y); + // clang-format off + OS_REPORT("(short)( shape_angle.sy - mae.atan2sX_Z() ) %x\n", (short)( shape_angle.y - mae.atan2sX_Z() )); + // clang-format on + OS_REPORT("\n\n\n\n"); + } + + if (abs((s16)(mHeadAngle.y - angl.y)) > 0x100) { + if (abs((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y)) < 0x4000 && + fopAcM_searchPlayerDistance(this) > l_HIO.mNoSearchRange) + { + cLib_addCalcAngleS2(&mHeadAngle.y, angl.y, 20, 0x200); + } else { + mHeadAngle_Clear(); + } + } + } +} + +/* 805CD844-805CD8D8 002704 0094+00 1/1 0/0 0/0 .text mCutTypeCheck__8daB_DS_cFv */ +bool daB_DS_c::mCutTypeCheck() { + daPy_py_c* pla = (daPy_py_c*)dComIfGp_getPlayer(0); + + if (pla->getCutType() == daPy_py_c::CUT_TYPE_TURN_RIGHT || + pla->getCutType() == daPy_py_c::CUT_TYPE_JUMP || + pla->getCutType() == daPy_py_c::CUT_TYPE_TWIRL || + pla->getCutType() == daPy_py_c::CUT_TYPE_TURN_LEFT) + { + return true; + } + + if (pla->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP || + pla->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP_FINISH || + pla->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT || + pla->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT || + pla->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_A || + pla->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_B) + { + return true; + } + + if (pla->getCutType() == daPy_py_c::CUT_TYPE_HEAD_JUMP || + pla->getCutType() == daPy_py_c::CUT_TYPE_TWIRL) + { + return true; + } + + return false; +} + +/* 805CD8D8-805CDA08 002798 0130+00 5/5 0/0 0/0 .text startDemoCheck__8daB_DS_cFv */ +bool daB_DS_c::startDemoCheck() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + + if (daPy_py_c::i_checkNowWolf()) { + return false; + } + + if (!eventInfo.checkCommandDemoAccrpt()) { + fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); + eventInfo.i_onCondition(2); + mCameraEye = dCam_getBody()->Center(); + mCameraCenter = dCam_getBody()->Eye(); + mCameraFovy = dCam_getBody()->Fovy(); + return false; + } else { + camera->mCamera.Stop(); + camera->mCamera.SetTrimSize(3); + daPy_getPlayerActorClass()->changeOriginalDemo(); + return true; + } +} + +/* 805CDA08-805CDA44 0028C8 003C+00 1/1 0/0 0/0 .text setYoMessage__8daB_DS_cFi */ +void daB_DS_c::setYoMessage(int i_msgIdx) { + mMsgIdx = i_msgIdx; + mMsgPcID = fopMsgM_messageSet(i_msgIdx, 1000); +} + +/* 805CDA44-805CDAC0 002904 007C+00 1/1 0/0 0/0 .text doYoMessage__8daB_DS_cFv */ +bool daB_DS_c::doYoMessage() { + if (mpMsg != NULL) { + if (mpMsg->mMode == 0xE) { + mpMsg->mMode = 0x10; + } else if (mpMsg->mMode == 0x12) { + mpMsg->mMode = 0x13; + mMsgPcID = 0xFFFFFFFF; + return true; + } + } else { + mpMsg = fopMsgM_SearchByID(mMsgPcID); + } + + return false; +} + +/* 805CDAC0-805CFA08 002980 1F48+00 2/1 0/0 0/0 .text executeOpeningDemo__8daB_DS_cFv */ +// r25 / r25 swap +void daB_DS_c::executeOpeningDemo() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + daPy_py_c* pla = daPy_getPlayerActorClass(); + + dBgS_GndChk gnd_chk; + cXyz sp298, sp28C, sp280, sp274, sp268; + csXyz particle_angle; + sp280.zero(); + sp274.zero(); + + static cXyz mOpPlayerDt[3] = { + cXyz(0.0f, 1800.0f, 4900.0f), + cXyz(342.0f, 690.0f, 1753.0f), + cXyz(-20.0f, 1270.0f, 3083.0f), + }; + + static cXyz mOpCenterDt[15] = { + cXyz(0.0f, 1910.0f, 4935.0f), cXyz(-5.0f, 2011.0f, 4664.0f), + cXyz(615.0f, 2410.0f, 2140.0f), cXyz(131.0f, 1105.0f, 1092.0f), + cXyz(-110.0f, 1160.0f, 1200.0f), cXyz(-50.0f, 1095.0f, 1300.0f), + cXyz(-85.0f, 1150.0f, 1250.0f), cXyz(10.0f, 1145.0f, 1420.0f), + cXyz(0.0f, 0.0f, 0.0f), cXyz(10.0f, 1060.0f, 1420.0f), + cXyz(45.0f, 1065.0f, 1475.0f), cXyz(235.0f, 1110.0f, 1835.0f), + cXyz(205.0f, 795.0f, 1770.0f), cXyz(45.0f, 905.0f, 1480.0f), + cXyz(650.0f, 2800.0f, 2350.0f), + }; + + static cXyz mOpCenterBodyDt[2] = { + cXyz(320.0f, 730.0f, 1270.0f), + cXyz(-235.0f, 1345.0f, 2090.0f), + }; + + static cXyz mOpEyeDt[15] = { + cXyz(0.0f, 1980.0f, 5300.0f), cXyz(0.0f, 1934.0f, 5036.0f), + cXyz(655.0f, 2810.0f, 2360.0f), cXyz(181.0f, 1190.0f, 844.0f), + cXyz(25.0f, 1125.0f, 1450.0f), cXyz(75.0f, 1010.0f, 1540.0f), + cXyz(40.0f, 1030.0f, 1480.0f), cXyz(150.0f, 1115.0f, 1670.0f), + cXyz(0.0f, 0.0f, 0.0f), cXyz(160.0f, 1000.0f, 1685.0f), + cXyz(180.0f, 1110.0f, 1730.0f), cXyz(360.0f, 1220.0f, 2080.0f), + cXyz(340.0f, 755.0f, 2020.0f), cXyz(170.0f, 800.0f, 1710.0f), + cXyz(695.0f, 3200.0f, 2570.0f), + }; + + static cXyz mOpEyeBodyDt[2] = { + cXyz(600.0f, 710.0f, 1300.0f), + cXyz(125.0f, 1500.0f, 3320.0f), + }; + + static u16 eff_znt_Disapp_id[2] = {0x8BBA, 0x8BBB}; + static u16 eff_znt_App_id[4] = {0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF}; + static u16 eff_znt_SASI_id[3] = {0x8BC0, 0x8BC1, 0x8BC2}; + + static const struct { + u16 eff_id; + int joint_no; + } KIDOU_EFF_DT[16] = { + {0x8BC6, 8}, {0x8BC7, 8}, {0x8BC8, 9}, {0x8BC9, 9}, {0x8BCA, 27}, {0x8BCB, 27}, + {0x8BCC, 28}, {0x8BCD, 28}, {0x8BCE, 3}, {0x8BCF, 3}, {0x8BD0, 11}, {0x8BD1, 11}, + {0x8BD2, 30}, {0x8BD3, 30}, {0x8BD4, 6}, {0x8BD5, 6}, + }; + + mHintTimer1 = l_HIO.mHintTime1; + + switch (mMode) { + case 0: + for (int i = 0; i < 16; i++) { + mStartingParticleKey[i] = 0; + } + setBck(ANM_OPDEMO, 0, 1.0f, 0.0f); + mMode++; + // fallthrough + case 1: + case 10: + if (!startDemoCheck()) { + break; + } + + Z2GetAudioMgr()->setDemoName("force_start"); + + if (mMode == 10) { + dComIfGp_getEvent().startCheckSkipEdge(this); + + sp298.set(mOpPlayerDt[1]); + daPy_getPlayerActorClass()->changeDemoMode(4, 2, 0, 0); + + sp298.set(pla->current.pos); + sp28C = mZantPos - pla->current.pos; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&sp298, sp28C.atan2sX_Z(), 0); + + mCameraCenter.set(mOpCenterDt[14]); + mCameraEye.set(mOpEyeDt[14]); + mMode++; + } else { + daPy_getPlayerActorClass()->changeDemoMode(20, 0, 0, 0); + + sp298.set(mOpPlayerDt[0]); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&sp298, -0x8000, 0); + + sp280.set(sp298.x, sp298.y, 4700.0f); + pla->changeDemoPos0(&sp280); + + mCameraCenter.set(mOpCenterDt[0]); + mCameraEye.set(mOpEyeDt[0]); + mModeTimer = 10; + mMode++; + } + break; + case 2: + f32 calc_center = cLib_addCalcPos(&mCameraCenter, mOpCenterDt[1], 0.3f, 2.0f, 1.0f); + f32 calc_eye = cLib_addCalcPos(&mCameraEye, mOpEyeDt[1], 0.3f, 2.0f, 1.0f); + if (calc_center > 2.0f || calc_eye > 2.0f || cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mCameraCenter.set(mOpCenterDt[1]); + mCameraEye.set(mOpEyeDt[1]); + sp280.set(0.0f, 1900.0f, 4727.0f); + sp274.set(0.0f, 1981.0f, 5018.0f); + camera->mCamera.Reset(sp280, sp274); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + + dComIfGp_event_reset(); + dComIfGs_onZoneSwitch(0, fopAcM_GetRoomNo(this)); + fopAcM_OffStatus(this, 0x4000); + mMode++; + // fallthrough + case 3: + mPedestalFallTimer = l_HIO.mPedestalFallTime; + + // supposed to be daPy_py_c::checkNowWolf, but not getting inlined. fix later + if (!dComIfGp_getLinkPlayer()->checkWolf() && pla->current.pos.z > 1800.0f && + pla->current.pos.z < 2200.0f && pla->current.pos.y > 780.0f && + pla->current.pos.x > -420.0f && pla->current.pos.x < 350.0f) + { + dComIfGs_onOneZoneSwitch(8, fopAcM_GetRoomNo(this)); + mMode = 10; + } + break; + case 11: + daPy_getPlayerActorClass()->changeDemoMode(20, 0, 0, 0); + Z2GetAudioMgr()->seStart(Z2SE_EN_ZAN_L4_V, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + mModeTimer = 150; + mMode++; + // fallthrough + case 12: + if (cLib_calcTimer(&mModeTimer) != 0) { + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[2], 0.3f, 4.0f, 2.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[2], 0.3f, 4.0f, 2.0f); + break; + } + daPy_getPlayerActorClass()->changeDemoMode(1, 0, 0, 0); + mModeTimer = 60; + mMode++; + // fallthrough + case 13: + mCameraCenter.set(mOpCenterDt[3]); + mCameraEye.set(mOpEyeDt[3]); + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 66)), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 1.0f, 0.0f, -1.0f); + mZantScale.set(0.0f, 5.0f, 0.0f); + mZantEyePos.set(mZantPos); + mZantEyePos.y += 200.0f; + + daPy_getPlayerActorClass()->changeDemoMode(47, 1, 0, 0); + + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + dComIfGp_particle_set(0x8bb9, &mZantPos, &particle_angle, NULL); + + mSoundPos.set(current.pos); + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_WARP_IN, 0, -1); + + mDrawZant = true; + mModeTimer = 10; + mMode++; + break; + case 14: + cLib_addCalc2(&mZantScale.x, 1.0f, 0.7f, 0.1f); + cLib_addCalc2(&mZantScale.y, 1.0f, 0.7f, 0.7f); + cLib_addCalc2(&mZantScale.z, 1.0f, 0.7f, 0.1f); + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mZantScale.set(1.0f, 1.0f, 1.0f); + daPy_getPlayerActorClass()->changeDemoMode(23, 1, 2, 0); + mModeTimer = 100; + mMode++; + // fallthrough + case 15: + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 86) { + Z2GetAudioMgr()->bgmStreamPrepare(0x2000047); + Z2GetAudioMgr()->bgmStreamPlay(); + } + + if (mModeTimer == 1) { + setYoMessage(0x1F41); + } + } else if (doYoMessage()) { + mMode++; + } + break; + case 16: + setYoMessage(0x1F42); + mMode++; + break; + case 17: + if (!doYoMessage()) { + break; + } + + mCameraCenter.set(mOpCenterDt[4]); + mCameraEye.set(mOpEyeDt[4]); + mModeTimer = 30; + mMode++; + // fallthrough + case 18: + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 1) { + setYoMessage(0x1F43); + } + } else { + if (doYoMessage()) { + mMode = 20; + } + } + break; + case 20: + mCameraCenter.set(mOpCenterDt[4]); + mCameraEye.set(mOpEyeDt[4]); + + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 64)), + J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 1.0f, 0.0f, -1.0f); + mpSwordMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 63)), + J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 1.0f, 0.0f, -1.0f); + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 81)), TRUE, + J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1); + + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + + for (int i = 0; i < 4; i++) { + dComIfGp_particle_set(eff_znt_App_id[i], &mZantPos, &particle_angle, NULL); + } + + for (int i = 0; i < 3; i++) { + dComIfGp_particle_set(eff_znt_SASI_id[i], &mZantPos, &particle_angle, NULL); + } + + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_1, 0, -1); + + mNoDrawSword = true; + mDrawZantSword = false; + mMode++; + // fallthrough + case 21: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[5], 1.0f, 20.0f, 10.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[5], 1.0f, 20.0f, 10.0f); + + if (mpZantMorf->checkFrame(9.0f)) { + mDrawZantSword = true; + } + + if ((int)mpZantMorf->getFrame() < 50) { + break; + } + mMode++; + // fallthrough + case 22: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[6], 0.3f, 1.0f, 0.5f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[6], 0.3f, 1.0f, 0.5f); + + if ((int)mpZantMorf->getFrame() < 191) { + break; + } + + mModeTimer = 30; + mNoDrawSword = false; + mMode++; + // fallthrough + case 23: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[7], 0.7f, 30.0f, 20.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[7], 0.7f, 30.0f, 20.0f); + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mMode++; + // fallthrough + case 24: + if ((int)mpZantMorf->getFrame() >= 250) { + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[9], 0.7f, 4.0f, 1.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[9], 0.7f, 4.0f, 1.0f); + } + + if ((int)mpZantMorf->getFrame() < 340) { + break; + } + + mMode++; + // fallthrough + case 25: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[10], 0.7f, 30.0f, 20.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[10], 0.7f, 30.0f, 20.0f); + if ((int)mpZantMorf->getFrame() < 346) { + break; + } + + field_0x85e = false; + mChkHigh = 0.0f; + mModeTimer = 100; + dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + // fallthrough + case 26: + if (!field_0x85e && mpZantMorf->isStop()) { + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 67)), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 1.0f, 0.0f, -1.0f); + field_0x85e = true; + } + + cLib_addCalc0(&mCrackAlpha, 0.7f, 20.0f); + cLib_addCalc2(&mChkHigh, 1.0f, 0.1f, 0.01f); + + sp298 = mCameraCenter - mOpCenterDt[11]; + f32 step = mChkHigh * sp298.abs(); + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[11], mChkHigh, step, step); + + sp298 = mCameraEye - mOpEyeDt[11]; + step = mChkHigh * sp298.abs(); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[11], mChkHigh, step, step); + + if (mModeTimer == 100) { + mpOpPatternBrkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 79)), + TRUE, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1); + + mpOpPatternBtkAnm->init( + mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 85)), TRUE, + J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1); + mPlayPatternAnm = true; + } + + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 30) { + mPlayPatternAnm = false; + } + break; + } + + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 65)), + J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 1.0f, 0.0f, -1.0f); + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_2, 0, -1); + mMode = 30; + field_0x85e = false; + // fallthrough + case 30: + mCameraCenter.set(mOpCenterDt[12]); + mCameraEye.set(mOpEyeDt[12]); + if ((int)mpZantMorf->getFrame() < 65) { + break; + } + mMode++; + // fallthrough + case 31: + if (mpZantMorf->checkFrame(76.0f)) { + mDrawZantSword = false; + } + + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[13], 0.7f, 10.0f, 5.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[13], 0.7f, 10.0f, 5.0f); + if (!mpZantMorf->isStop()) { + break; + } + + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_WARP_OUT, 0, -1); + mMode++; + // fallthrough + case 32: + cLib_addCalc2(&mZantScale.x, 0.0f, 0.7f, 0.1f); + cLib_addCalc2(&mZantScale.y, 5.0f, 0.7f, 0.7f); + cLib_addCalc2(&mZantScale.z, 0.0f, 0.7f, 0.1f); + if (mZantScale.y < 4.9f) { + break; + } + + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_znt_Disapp_id[i], &mZantPos, &particle_angle, NULL); + } + + mDrawZant = false; + mModeTimer = 50; + mMode++; + // fallthrough + case 33: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + Z2GetAudioMgr()->subBgmStart(Z2BGM_HARAGIGANT_D01); + mSound.startCreatureSound(Z2SE_EN_DS_OPDEMO, 0, -1); + mModeTimer = 50; + mMode = 40; + // fallthrough + case 40: + mCameraCenter.set(mOpCenterBodyDt[0]); + mCameraEye.set(mOpEyeBodyDt[0]); + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mModeTimer = 100; + dComIfGp_getVibration().StartQuake(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + // fallthrough + case 41: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + mMode++; + // fallthrough + case 42: + cLib_addCalc2(&mEyeColorAlpha, 255.0f, 0.7f, 10.0f); + if (mEyeColorAlpha < 254.0f) { + break; + } + + field_0x7d2 = 0; + mModeTimer = 0; + mEyeColorAlpha = 255.0f; + setBck(ANM_OPDEMO, 0, 1.0f, 1.0f); + dComIfGp_particle_set(0x8bd6, ¤t.pos, &shape_angle, NULL); + mMode++; + // fallthrough + case 43: + sp280.set(mSwordPos); + sp280.y += -100.0f; + cLib_addCalcPos(&mCameraCenter, sp280, 1.0f, 20.0f, 10.0f); + if ((int)mpMorf->getFrame() < 330) { + break; + } + + mIsOpeningDemo = false; + sp28C = current.pos - pla->current.pos; + shape_angle.y = -700; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&mOpPlayerDt[2], + sp28C.atan2sX_Z() + 0x1000, 0); + mMode++; + // fallthrough + + case 44: + sp274.set(mOpEyeBodyDt[1]); + sp280.set(mOpCenterBodyDt[1]); + sp280.y = mSwordPos.y; + + f32 max_step = 10.0f; + f32 min_step = 5.0f; + if ((int)mpMorf->getFrame() > 460) { + max_step = 40.0f; + min_step = 20.0f; + sp280.y -= 200.0f; + } + + if (sp280.y > 1835.0f) { + sp280.y = 1835.0f; + } else if (sp280.y < 1250.0f) { + sp280.y = 1250.0f; + } + + cLib_addCalcPos(&mCameraCenter, sp280, 1.0f, max_step, min_step); + cLib_addCalcPos(&mCameraEye, sp274, 1.0f, 40.0f, 20.0f); + + if (mpMorf->checkFrame(517.0f)) { + dComIfGp_getVibration().StopQuake(0x1f); + } + + if (mpMorf->checkFrame(518.0f)) { + hand_smokeSet(0); + } + + if (mpMorf->checkFrame(670.0f)) { + dCam_getBody()->StartBlure(40, this, 0.8f, 1.2f); + fopMsgM_messageSetDemo(0x482); + dComIfGp_getVibration().StartQuake(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + pla->changeDemoMode(34, 0, 0, 0); + } + + if (mpMorf->checkFrame(770.0f)) { + dComIfGp_getVibration().StopQuake(0x1f); + } + + if (mpMorf->isStop()) { + dKy_change_colpat(1); + + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + dComIfGp_event_reset(); + + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + fopAcM_SetGroup(this, 2); + fopAcM_OnStatus(this, 0); + + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL01, 0, 0); + Z2GetAudioMgr()->setDemoName("force_end"); + + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + field_0x7f8 = 0.5f; + mSwordTimer = 3; + setActionMode(ACT_WAIT, 0); + return; + } + } + + if (mMode > 41) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(0, 1, mColBlend); + cLib_addCalc2(&field_0x7f8, 0.5f, 0.1f, 0.01f); + } + + mZantEyePos.set(mZantPos); + mZantEyePos.y += 200.0f; + + if (mMode != 0 && mMode != 3 && mMode != 4) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + } + + if (mMode < 11) { + return; + } + + if (mMode >= 43) { + sp268.set(1.0f, 1.0f, 1.0f); + for (int i = 0; i < 16; i++) { + mStartingParticleKey[i] = dComIfGp_particle_set( + mStartingParticleKey[i], KIDOU_EFF_DT[i].eff_id, ¤t.pos, &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mStartingParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->getAnmMtx(KIDOU_EFF_DT[i].joint_no)); + } + } + } + + if (dComIfGp_getEvent().checkSkipEdge()) { + cDmr_SkipInfo = 1; + dStage_changeScene(2, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1); + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + + Z2GetAudioMgr()->setDemoName("force_end"); + Z2GetAudioMgr()->bgmStreamStop(0); + Z2GetAudioMgr()->subBgmStop(); + } +} + +/* 805CFC8C-805D002C 004B4C 03A0+00 3/3 0/0 0/0 .text mHandBreathChk__8daB_DS_cFv */ +bool daB_DS_c::mHandBreathChk() { + daPy_py_c* pla = daPy_getPlayerActorClass(); + if (daPy_getPlayerActorClass()->getDamageWaitTimer() > 10) { + return false; + } + + if (daPy_getPlayerActorClass()->checkSpinnerRide()) { + if (abs((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y)) < 0x4000) { + cXyz hand_l_dist = mHandPos[0] - pla->current.pos; + cXyz hand_r_dist = mHandPos[1] - pla->current.pos; + + if (hand_l_dist.abs() < l_HIO.mHandRange) { + mAttackingHand = 1; + setActionMode(ACT_HAND_ATTACK, 0); + return true; + } + + if (hand_r_dist.abs() < l_HIO.mHandRange) { + mAttackingHand = 0; + setActionMode(ACT_HAND_ATTACK, 0); + return true; + } + } + } + + if (cLib_calcTimer(&mModeTimer) == 0 && + fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + if ((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x2000) { + setActionMode(ACT_BREATH_ATTACK, 0); + } else { + setActionMode(ACT_BREATH_SEARCH, 0); + } + return true; + } + + return false; +} + +/* 805D002C-805D0194 004EEC 0168+00 1/1 0/0 0/0 .text executeWait__8daB_DS_cFv */ +void daB_DS_c::executeWait() { + static int Ds_wait_id[3] = { + ANM_WAIT01_A, + ANM_WAIT01_B, + ANM_WAIT01_C, + }; + + switch (mMode) { + case 0: + if (mModeTimer == 0) { + mModeTimer = (int)cM_rndF(60.0f) + 120; + + if (mBackboneLevel == 1) { + mModeTimer = FAST_DIV(mModeTimer, 2); + } else if (mBackboneLevel == 2) { + mModeTimer = FAST_DIV(mModeTimer, 4); + } + } + + if (mAnmID != Ds_wait_id[mBackboneLevel]) { + setBck(Ds_wait_id[mBackboneLevel], 2, 10.0f, 1.0f); + } + mMode = 1; + // fallthrough + case 1: + if (fopAcM_searchPlayerDistance(this) > l_HIO.mNoSearchRange || + daPy_getPlayerActorClass()->checkSpinnerRide()) + { + s16 angle_to_player = shape_angle.y - fopAcM_searchPlayerAngleY(this); + if (abs(angle_to_player) > 0x1800) { + setActionMode(ACT_CIRCLE, 0); + } + } + } + + mHandBreathChk(); +} + +/* 805D0194-805D02F8 005054 0164+00 1/1 0/0 0/0 .text executeCircle__8daB_DS_cFv */ +void daB_DS_c::executeCircle() { + static int Ds_circle_id[6] = { + ANM_CIRCLE_L_A, ANM_CIRCLE_L_B, ANM_CIRCLE_L_C, + ANM_CIRCLE_R_A, ANM_CIRCLE_R_B, ANM_CIRCLE_R_C, + }; + s16 angle_to_player = shape_angle.y - fopAcM_searchPlayerAngleY(this); + + switch (mMode) { + case 0: + if (mModeTimer == 0) { + mModeTimer = (int)cM_rndF(60.0f) + 240; + } + + if (angle_to_player < 0) { + setBck(Ds_circle_id[mBackboneLevel], 2, 10.0f, 1.0f); + } else { + setBck(Ds_circle_id[mBackboneLevel + 3], 2, 10.0f, 1.0f); + } + mMode = 1; + // fallthrough + case 1: + angle_to_player = shape_angle.y - fopAcM_searchPlayerAngleY(this); + if (abs(angle_to_player) < 0x200) { + setActionMode(ACT_WAIT, 0); + } + } + + cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 2, 100); + shape_angle.y = current.angle.y; + mHandBreathChk(); +} + +/* 805D02F8-805D0374 0051B8 007C+00 1/1 0/0 0/0 .text mBreakBoneSUB__8daB_DS_cFv */ +void daB_DS_c::mBreakBoneSUB() { + if (bitSw3 != 0xFF) { + fopAcM_offSwitch(this, bitSw3); + mSoundPos = current.pos; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1F); + } +} + +/* 805D0374-805D03EC 005234 0078+00 1/1 0/0 0/0 .text damageSet__8daB_DS_cFv */ +void daB_DS_c::damageSet() { + if (mBossPhase == 0) { + dScnPly_c::setPauseTimer(5); + } + + field_0x85e = true; + mBreakBoneSUB(); + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); +} + +/* 805D03EC-805D0584 0052AC 0198+00 1/1 0/0 0/0 .text damageHitCamera__8daB_DS_cFv */ +void daB_DS_c::damageHitCamera() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + cXyz offset, pos; + + mDoMtx_YrotS(*calc_mtx, field_0x7d0); + + offset.zero(); + offset.y = 300.0f; + MtxPosition(&offset, &pos); + pos.x += current.pos.x; + if (mAcch.GetGroundH() != -1000000000.0f) { + pos.y += mAcch.GetGroundH(); + } + pos.z += current.pos.z; + mCameraCenter = pos; + + offset.zero(); + offset.z = 700.0f; + MtxPosition(&offset, &pos); + pos.x += current.pos.x; + if (mAcch.GetGroundH() != -1000000000.0f) { + pos.y += mAcch.GetGroundH(); + } + pos.z += current.pos.z; + mCameraEye = pos; + + camera->mCamera.Set(mCameraCenter, mCameraEye); +} + +/* 805D0584-805D074C 005444 01C8+00 1/1 0/0 0/0 .text damageDownCheck__8daB_DS_cFv */ +void daB_DS_c::damageDownCheck() { + cXyz particle_scale(1.0f, 1.0f, 1.0f); + csXyz particle_angle = shape_angle; + + if (mAnmID == ANM_DAMAGE_A || mAnmID == ANM_DAMAGE_B) { + int ptcl_check_frame = 18; + + if (mBrokenBone == 0) { + if (mpMorf->checkFrame(30.0f)) { + hand_smokeSet(1); + } + + if (mpMorf->checkFrame(50.0f)) { + hand_smokeSet(2); + } + + ptcl_check_frame = 35; + } else { + if (mpMorf->checkFrame(13.0f)) { + hand_smokeSet(1); + } + + if (mpMorf->checkFrame(29.0f)) { + hand_smokeSet(2); + } + } + + if (mpMorf->checkFrame(ptcl_check_frame)) { + for (int i = 0; i < 2; i++) { + mHitParticleKey[i] = + dComIfGp_particle_set(mHitParticleKey[i], eff_smoke_id[i], ¤t.pos, + &particle_angle, &particle_scale); + } + } + } +} + +/* 805D074C-805D1E30 00560C 16E4+00 1/1 0/0 0/0 .text executeDamage__8daB_DS_cFv */ +void daB_DS_c::executeDamage() { + static cXyz down_center_dt[5] = { + cXyz(345.0f, 2100.0f, -1575.0f), cXyz(1490.0f, 1160.0f, -2050.0f), + cXyz(1465.0f, 1135.0f, -2110.0f), cXyz(-320.0f, 30.0f, -2355.0f), + cXyz(-320.0f, -1900.0f, -2355.0f), + }; + + static cXyz down_eye_dt[5] = { + cXyz(-180.0f, 1390.0f, 3080.0f), cXyz(1675.0f, 1120.0f, -2310.0f), + cXyz(1690.0f, 1210.0f, -2315.0f), cXyz(1400.0f, 2215.0f, 1480.0f), + cXyz(1400.0f, 280.0f, 1480.0f), + }; + + static struct { + u16 eff_id; + int joint_no; + } const BROKENBORN_EFF_DT[12] = { + {0x8BDB, 0}, {0x8BDC, 0}, {0x8BDD, 0}, {0x8BDE, 0}, {0x8BDF, 1}, {0x8BE0, 1}, + {0x8BE1, 1}, {0x8BE2, 1}, {0x8BE3, 2}, {0x8BE4, 2}, {0x8BE5, 2}, {0x8BE6, 2}, + }; + + static int Ds_damage_wait_id[3] = {ANM_DAMAGE_A_WAIT, ANM_DAMAGE_B_WAIT, ANM_LASTDAMAGE_WAIT}; + static int Ds_damage_id[3] = {ANM_DAMAGE_A, ANM_DAMAGE_B, ANM_LASTDAMAGE}; + static u16 eff_spHit_id[2] = {0x8BD9, 0x8BDA}; + static u16 eff_LastSmoke_id[4] = {0x8C25, 0x8C26, 0x8C27, 0x8C28}; + + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + daPy_py_c* pla = daPy_getPlayerActorClass(); + csXyz angle = shape_angle; + cXyz sp1BC, sp1B0; + cXyz particle_scale(1.0f, 1.0f, 1.0f); + + mHeadAngle_Clear(); + mDamageTimer = 50; + int index; + + switch (mMode) { + case 0: + mHintTimer1 = 0; + + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + + if (!startDemoCheck()) { + break; + } + + mColBlend = 0.0f; + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_spHit_id[i], ¤t.pos, &shape_angle, NULL); + } + + field_0x84d = 0; + mClearTrap(true); + + daPy_getPlayerActorClass()->changeOriginalDemo(); + daPy_getPlayerActorClass()->changeDemoMode(14, 1, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&pla->current.pos, + fopAcM_searchPlayerAngleY(this), 0); + + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + field_0x7d0 = fopAcM_searchPlayerAngleY(this); + setBck(Ds_damage_wait_id[mBackboneLevel], 2, 3.0f, 1.0f); + mIsDemo = true; + field_0x85e = false; + + if (mMode == 0) { + mModeTimer = 5; + } else { + mModeTimer = 30; + } + mMode++; + break; + case 1: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + daPy_getPlayerActorClass()->changeDemoMode(14, 2, 0, 0); + + mModeTimer = 41; + mIsOpeningDemo = false; + + if (mBackboneLevel < 2) { + mBrokenBone = mBackboneLevel; + mMode++; + } else { + mDead = true; + mIsOpeningDemo = true; + mMode = 10; + } + break; + case 2: + if (cLib_calcTimer(&mModeTimer) == 1 && + (mAnmID == ANM_DAMAGE_A_WAIT || mAnmID == ANM_DAMAGE_B_WAIT)) + { + setBck(Ds_damage_id[mBrokenBone], 0, 3.0f, 1.0f); + } + + if (mModeTimer == 0 && mAnmID != ANM_DAMAGE_A_WAIT && mAnmID != ANM_DAMAGE_B_WAIT && + ((mBrokenBone == 0 && mpMorf->checkFrame(24.0f)) || + (mBrokenBone != 0 && mpMorf->checkFrame(7.0f)))) + { + int index = mBackboneLevel * 4; + for (int i = 0; i < 4; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_set(BROKENBORN_EFF_DT[index + i].eff_id, + ¤t.pos, &shape_angle, NULL); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->getAnmMtx(BROKENBORN_EFF_DT[index + i].joint_no)); + } + } + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_BONE_BRK, 0, -1); + damageSet(); + mBackboneLevel++; + + s16 angle_to_player = fopAcM_searchPlayerAngleY(this); + for (int i = 0; i < 15; i++) { + mDoMtx_YrotS(*calc_mtx, angle_to_player); + + sp1BC.x = 0.0f; + sp1BC.y = 0.0f; + sp1BC.z = 1000.0f; + MtxPosition(&sp1BC, &sp1B0); + sp1B0 += current.pos; + if (mAcch.GetGroundH() != -1000000000.0f) { + sp1B0.y = mAcch.GetGroundH(); + } + + angle = shape_angle; + angle.y = fopAcM_searchPlayerAngleY(this); + + fopAc_ac_c* actor; + if (mStaltroopID[i] != 0 && !fopAcM_SearchByID(mStaltroopID[i], &actor)) { + mStaltroopID[i] = 0; + } + + if (mStaltroopID[i] == 0) { + mStaltroopID[i] = + fopAcM_createChild(PROC_E_ZS, fopAcM_GetID(this), 1, &sp1B0, + fopAcM_GetRoomNo(this), &angle, NULL, -1, NULL); + } + } + + if (mBackboneLevel == 2) { + for (int i = 0; i < 5; i++) { + if (mStaltroop2ID[i] == 0) { + mStaltroop2ID[i] = + fopAcM_createChild(PROC_E_ZS, fopAcM_GetID(this), 2, ¤t.pos, + fopAcM_GetRoomNo(this), NULL, NULL, -1, NULL); + } + } + } + } + + mBackboneCrackAlpha[mBrokenBone] -= 12.75f; + if (mBackboneCrackAlpha[mBrokenBone] < 0.0f) { + mBackboneCrackAlpha[mBrokenBone] = 0.0f; + } + + damageHitCamera(); + damageDownCheck(); + + if (field_0x85e && mBackboneCrackAlpha[mBrokenBone] < 2.0f) { + mModeTimer = 30; + mBackboneCrackAlpha[mBrokenBone] = 0.0f; + mMode = 3; + } + break; + case 3: + damageDownCheck(); + mIsDemo = false; + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mDoMtx_YrotS(*calc_mtx, shape_angle.y); + + sp1BC.zero(); + sp1BC.y = 1100.0f; + sp1BC.z = -1500.0f; + MtxPosition(&sp1BC, &sp1B0); + sp1B0 += current.pos; + cLib_addCalcPos(&mCameraCenter, sp1B0, 1.0f, 2000.0f, 300.0f); + + sp1BC.zero(); + sp1BC.y = 1600.0f; + sp1BC.z = 4200.0f; + MtxPosition(&sp1BC, &sp1B0); + sp1B0 += current.pos; + cLib_addCalcPos(&mCameraEye, sp1B0, 1.0f, 2000.0f, 300.0f); + + camera->mCamera.Set(mCameraCenter, mCameraEye); + + if (mpMorf->isStop()) { + mBrokenBone = 0; + + f32 dist = fopAcM_searchPlayerDistance(this); + mDoMtx_YrotS(*calc_mtx, dist + 0x8000); + sp1BC.x = 0.0f; + sp1BC.y = 0.0f; + sp1BC.z = -1000.0f; + MtxPosition(&sp1BC, &sp1B0); + + sp1B0 += pla->current.pos; + sp1BC = pla->current.pos; + camera->mCamera.Reset(pla->current.pos, sp1B0); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + dComIfGp_event_reset(); + + if (bitSw3 != 0xff) { + fopAcM_offSwitch(this, bitSw3); + } + + mBirthTrapTimerF = 30; + shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this) + 0xC000; + setActionMode(ACT_BREATH_ATTACK, 0); + } + break; + case 10: + mBackboneCrackAlpha[mBackboneLevel] -= 12.75f; + if (mBackboneCrackAlpha[mBackboneLevel] < 0.0f) { + mBackboneCrackAlpha[mBackboneLevel] = 0.0f; + } + damageHitCamera(); + + if (cLib_calcTimer(&mModeTimer) == 0) { + if (!mBackboneCrackAlpha[mBackboneLevel]) { + if (bitSw != 0xff) { + fopAcM_offSwitch(this, bitSw); + } + + setBck(Ds_damage_id[mBackboneLevel], 0, 3.0f, 1.0f); + + for (int i = 0; i < 4; i++) { + dComIfGp_particle_set(eff_LastSmoke_id[i], ¤t.pos, &home.angle, NULL); + } + + sp1BC.x = 0.0f; + sp1BC.y = -1600.0f; + sp1BC.z = 2315.0f; + daPy_getPlayerActorClass()->changeDemoMode(4, 2, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&sp1BC, -0x8000, 0); + mMode++; + } + } + break; + case 11: + cLib_addCalcAngleS2(&shape_angle.x, 2000, 8, 0x100); + cLib_addCalc0(&field_0x7f8, 0.1f, 0.01f); + + if (mpMorf->checkFrame(120.0f)) { + hand_smokeSet(1); + dComIfGp_getVibration().StartShock(1, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + mBossPhase = 1; + damageSet(); + + int index = 8; + for (int i = 0; i < 4; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_set(BROKENBORN_EFF_DT[index + i].eff_id, + ¤t.pos, &shape_angle, NULL); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->getAnmMtx(BROKENBORN_EFF_DT[index + i].joint_no)); + } + } + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_BONE_BRK, 0, -1); + } + + if (mpMorf->checkFrame(241.0f)) { + hand_smokeSet(2); + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (mpMorf->checkFrame(145.0f)) { + for (int i = 0; i < 2; i++) { + mHitParticleKey[i] = dComIfGp_particle_set(mHitParticleKey[i], eff_smoke_id[i], + ¤t.pos, &angle, &particle_scale); + } + mSoundPos = current.pos; + dComIfGp_getVibration().StartShock(2, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + index = 0; + if ((int)mpMorf->getFrame() > 130) { + index = 1; + } + + if ((int)mpMorf->getFrame() < 140) { + shape_angle.y = home.angle.y; + current.angle.y = shape_angle.y; + mCameraCenter = down_center_dt[index]; + mCameraEye = down_eye_dt[index]; + } else { + cLib_addCalcPos(&mCameraCenter, down_center_dt[2], 0.8f, 1.0f, 0.5f); + cLib_addCalcPos(&mCameraEye, down_eye_dt[2], 0.8f, 1.0f, 0.5f); + } + camera->mCamera.Set(mCameraCenter, mCameraEye); + + if (mpMorf->checkFrame(215.0f)) { + dComIfGp_getVibration().StartShock(4, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (!mpMorf->isStop()) { + break; + } + mModeTimer = 30; + mMode = 20; + // fallthrough + case 20: + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 1) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_EYE_OFF, 0, -1); + } + break; + } + + cLib_addCalc0(&mEyeColorAlpha, 0.7f, 3.0f); + if (mEyeColorAlpha > 2.0f) { + break; + } + + mModeTimer = 30; + mEyeColorAlpha = 0.0f; + mMode++; + // fallthrough + case 21: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mCameraCenter = down_center_dt[3]; + mCameraEye = down_eye_dt[3]; + camera->mCamera.Set(mCameraCenter, mCameraEye); + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + + mModeTimer = 30; + mMode++; + // fallthrough + case 22: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mColBlend = 0.0f; + mMode = 100; + mSound.startCreatureSound(Z2SE_EN_DS_MDEMO_FALL, 0, -1); + // fallthrough + case 100: + gravity = -0.2f; + if (current.pos.y > -1600.0f) { + if (current.pos.y <= -300.0f) { + dComIfGs_onZoneSwitch(6, fopAcM_GetRoomNo(this)); + } + break; + } + + mBossPhase = 100; + u32 param = fopAcM_GetParam(this); + csXyz p2_angle; + p2_angle = shape_angle; + p2_angle.z = 0; + p2_angle.y = 0; + p2_angle.x = 0; + + fopAcM_create(PROC_B_DS, param | TYPE_BATTLE_2, ¤t.pos, fopAcM_GetRoomNo(this), + &p2_angle, NULL, 0xff); + mMode = 101; + // fallthrough + case 101: + cLib_addCalc2(&mCameraCenter.y, down_center_dt[4].y, 0.7f, 10.0f); + cLib_addCalc2(&mCameraEye.y, down_eye_dt[4].y, 0.7f, 10.0f); + camera->mCamera.Set(mCameraCenter, mCameraEye); + if (fabsf(mCameraCenter.y - down_center_dt[4].y) > 2.0f || + fabsf(mCameraEye.y - down_eye_dt[4].y) > 2.0f) + { + break; + } + dComIfGp_getVibration().StopQuake(0x1f); + mModeTimer = 100; + mMode = 102; + // fallthrough + case 102: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + dKy_change_colpat(3); + + sp1BC.set(0.0f, -1510.0f, 2315.0f); + sp1B0.set(0.0f, -1435.0f, 2525.0f); + camera->mCamera.Reset(sp1BC, sp1B0); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + + dComIfGp_event_reset(); + fopAcM_delete(this); + } + + if (mMode >= 100) { + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.001f); + dKy_custom_colset(1, 3, mColBlend); + } +} + +/* 805D1E30-805D203C 006CF0 020C+00 1/1 0/0 0/0 .text executeEtcDamage__8daB_DS_cFv */ +void daB_DS_c::executeEtcDamage() { + static int Ds_Etc_damage_id[9] = { + ANM_NODAMAGE_01_A, ANM_NODAMAGE_01_B, ANM_NODAMAGE_01_C, + ANM_NODAMAGE_02_A, ANM_NODAMAGE_02_B, ANM_NODAMAGE_02_C, + ANM_NODAMAGE_03_A, ANM_NODAMAGE_03_B, ANM_NODAMAGE_03_C, + }; + + static int smokeSet_dt[3] = {32, 29, 29}; + + switch (mMode) { + case 0: + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + setBck(Ds_Etc_damage_id[mBackboneLevel], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 3; + break; + case 1: + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + setBck(Ds_Etc_damage_id[mBackboneLevel + 3], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 4; + break; + case 2: + setBck(Ds_Etc_damage_id[mBackboneLevel + 6], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 5; + break; + case 3: + case 4: + if ((int)mpMorf->getFrame() == smokeSet_dt[mBackboneLevel]) { + if (mMode == 4) { + hand_smokeSet(1); + } else { + hand_smokeSet(2); + } + } + // fallthrough + case 5: + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} + +/* 805D203C-805D226C 006EFC 0230+00 1/1 0/0 0/0 .text breath_smokeSet__8daB_DS_cFv */ +void daB_DS_c::breath_smokeSet() { + static u16 effId[3] = {0x85F6, 0x89B0, 0x89B1}; + cXyz particle_scale(1.0f, 1.0f, 1.0f); + + cLib_addCalc2(&mBreathTimerBase, 50.0f, 0.7f, 4.0f); + breathTimerBase = (int)mBreathTimerBase; + + for (int i = 0; i < 3; i++) { + mBreathSmokeParticleKey[i] = dComIfGp_particle_set(mBreathSmokeParticleKey[i], effId[i], + &mHeadPos, &mHeadAngle, &particle_scale); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mBreathSmokeParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(DS_JNT_HEAD)); + } + } + + Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_DS_FIRE_CLMN, &mHeadPos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, + 0); + + mBreathTimeCount++; + mBreathTimeCount &= 3; + if (mBreathTimeCount == 0) { + cXyz vec = mMouthPos - mBulletPos; + csXyz bullet_angle; + bullet_angle.x = -vec.atan2sY_XZ(); + bullet_angle.y = vec.atan2sX_Z(); + bullet_angle.z = 0; + + cXyz bullet_pos = mBulletPos; + + fopAcM_create(PROC_B_DS, TYPE_BULLET_A, &bullet_pos, fopAcM_GetRoomNo(this), &bullet_angle, + NULL, 0xff); + } +} + +/* 805D226C-805D2520 00712C 02B4+00 1/1 0/0 0/0 .text executeBreathAttack__8daB_DS_cFv */ +void daB_DS_c::executeBreathAttack() { + static int Ds_breath_id[9] = { + ANM_ATTACK02_A_A, ANM_ATTACK02_B_A, ANM_ATTACK02_C_A, ANM_ATTACK02_A_B, ANM_ATTACK02_B_B, + ANM_ATTACK02_C_B, ANM_ATTACK02_A_C, ANM_ATTACK02_B_C, ANM_ATTACK02_C_C, + }; + + switch (mMode) { + case 0: + mColBlend = 0.0f; + field_0x840 = 1; + mBh2AttackAngleF = 0; + setBck(Ds_breath_id[mBackboneLevel * 3], 0, 10.0f, 1.0f); + mMode = 1; + break; + case 1: + if (mpMorf->checkFrame(82.0f)) { + hand_smokeSet(0); + mSound.startCreatureSound(Z2SE_EN_DS_HANDS, 0, -1); + } + + if ((int)mpMorf->getFrame() > 82) { + cLib_addCalcAngleS2(&mBh2AttackAngleF, 10000, 10, 0x100); + } + + if (mpMorf->isStop()) { + setBck(Ds_breath_id[mBackboneLevel * 3 + 1], 2, 3.0f, 1.0f); + mModeTimer = 185; + mBreathTimerBase = 0.0f; + breathTimerBase = 0; + mMode = 2; + } + break; + case 2: + if (mModeTimer == 0 || daPy_getPlayerActorClass()->getDamageWaitTimer() > 10) { + setBck(Ds_breath_id[mBackboneLevel * 3 + 2], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 3; + } else if (cLib_calcTimer(&mModeTimer) != 0) { + cLib_addCalcAngleS2(&mBh2AttackAngleF, 5000, 10, 0x100); + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.04f); + dKy_custom_colset(1, 5, mColBlend); + field_0x840 = 5; + breath_smokeSet(); + } + break; + case 3: + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} + +/* 805D2520-805D272C 0073E0 020C+00 1/1 0/0 0/0 .text executeHandAttack__8daB_DS_cFv */ +void daB_DS_c::executeHandAttack() { + static int Ds_HandAt_id[6] = { + ANM_ATTACK_R_A, ANM_ATTACK_R_B, ANM_ATTACK_R_C, + ANM_ATTACK_L_A, ANM_ATTACK_L_B, ANM_ATTACK_L_C, + }; + + switch (mMode) { + case 0: + mChkHigh = 0.0f; + setBck(Ds_HandAt_id[mBackboneLevel + mAttackingHand * 3], 0, 10.0f, 1.0f); + mMode++; + break; + case 1: + if ((int)mpMorf->getFrame() > 90 && (int)mpMorf->getFrame() < 110) { + bool bvar1 = false; + + int ivar3 = (int)((mpMorf->getFrame() - 90.0f) / 4.0f) + 7; + if ((int)mChkHigh < ivar3) { + mChkHigh = ivar3; + bvar1 = true; + } + + if (mAttackingHand == 0) { + mHandAtRCyl.OnAtSetBit(); + if ((int)mpMorf->getFrame() > 100 && bvar1) { + hand_smokeSet(2); + } + } else { + mHandAtLCyl.OnAtSetBit(); + if ((int)mpMorf->getFrame() > 100 && bvar1) { + hand_smokeSet(1); + } + } + } else { + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + } + + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} + +/* 805D272C-805D28D0 0075EC 01A4+00 1/1 0/0 0/0 .text executeBreathSearch__8daB_DS_cFv */ +void daB_DS_c::executeBreathSearch() { + static int Ds_BS_id[3] = {ANM_ATTACK01_A, ANM_ATTACK01_B, ANM_ATTACK01_C}; + mHeadAngle_Clear(); + + switch (mMode) { + case 0: + setBck(Ds_BS_id[mBackboneLevel], 0, 10.0f, 1.0f); + mMode++; + // fallthrough + case 1: + if ((int)mpMorf->getFrame() >= 177 && (int)mpMorf->getFrame() <= 195) { + mHandAtRCyl.OnAtSetBit(); + mHandAtLCyl.OnAtSetBit(); + hand_smokeSet(0); + } else { + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + } + + if (mpMorf->isStop() && !mHandBreathChk()) { + setActionMode(ACT_WAIT, 0); + } + break; + } + + if ((int)mpMorf->getFrame() > 70 && (int)mpMorf->getFrame() < 150) { + s16 angle = fopAcM_searchPlayerAngleY(this); + cLib_addCalcAngleS2(¤t.angle.y, angle, 40, 0x200); + shape_angle.y = current.angle.y; + } +} + +/* 805D28D0-805D3900 007790 1030+00 2/1 0/0 0/0 .text executeBattle2OpeningDemo__8daB_DS_cFv */ +void daB_DS_c::executeBattle2OpeningDemo() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + daPy_py_c* pla = daPy_getPlayerActorClass(); + cXyz vec, center, eye, unused; + center.zero(); + + static cXyz mOp2PlayerDt[3] = { + cXyz(315.0f, 1800.0f, 1460.0f), + cXyz(415.0f, 1800.0f, 1880.0f), + cXyz(465.0f, 1400.0f, 1980.0f), + }; + + static cXyz mOp2CenterDt[7] = { + cXyz(-255.0f, -1460.0f, 3320.0f), cXyz(-255.0f, 3070.0f, 3340.0f), + cXyz(145.0f, 1940.0f, 1520.0f), cXyz(165.0f, 1930.0f, 1515.0f), + cXyz(180.0f, 2083.0f, 1490.0f), cXyz(450.0f, 1880.0f, 1955.0f), + cXyz(1815.0f, 2370.0f, 1660.0f), + }; + + static cXyz mOp2EyeDt[7] = { + cXyz(-290.0f, -1560.0f, 3690.0f), cXyz(-290.0f, 3230.0f, 3690.0f), + cXyz(-15.0f, 2005.0f, 1180.0f), cXyz(180.0f, 1840.0f, 1885.0f), + cXyz(45.0f, 2260.0f, 1250.0f), cXyz(600.0f, 1770.0f, 2225.0f), + cXyz(2145.0f, 2410.0f, 1635.0f), + }; + + static u16 eff_Sand_id[2] = {0x8BF6, 0x8BF7}; + + unused.set(1.0f, 1.0f, 1.0f); + mHintTimer2 = l_HIO.mHintTime1; + + switch (mMode) { + case 0: + mGroundUpY = 150.0f; + shape_angle.z = -8500; + if (!mIsDemo) { + break; + } + + mMode++; + // fallthrough + case 1: + if (!startDemoCheck()) { + break; + } + + mCameraCenter = mOp2CenterDt[0]; + mCameraEye = mOp2EyeDt[0]; + Z2GetAudioMgr()->subBgmStart(Z2BGM_HARAGIGANT_D02); + mMode++; + // fallthrough + case 2: + if (pla->current.pos.y < -745.0f) { + break; + } + + mCameraCenter = mOp2CenterDt[1]; + mCameraEye = mOp2EyeDt[1]; + mMode++; + // fallthrough + case 3: + if (mIsDemo) { + break; + } + + mModeTimer = 30; + mMode++; + // fallthrough + case 4: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mMode++; + // fallthrough + case 5: + vec = mOp2PlayerDt[0]; + daPy_getPlayerActorClass()->changeDemoMode(4, 2, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec, 0x570, 0); + + mCameraCenter = mOp2CenterDt[2]; + mCameraEye = mOp2EyeDt[2]; + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_MDEMO_REBOOT, 0, -1); + + mGroundUpY = 0.0f; + mModeTimer = 50; + mMode++; + // fallthrough + case 6: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mModeTimer = 18; + daPy_getPlayerActorClass()->changeDemoMode(25, 0, 0, 0); + mMode++; + // fallthrough + case 7: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + gravity = 0.0f; + speed.y = 0.0f; + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + + daPy_getPlayerActorClass()->changeDemoMode(23, 1, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&mOp2PlayerDt[0], -0x8000, 0); + + vec = mOp2PlayerDt[0]; + mCameraCenter = mOp2CenterDt[3]; + mCameraEye = mOp2EyeDt[3]; + + current.pos.y = 2050.0f; + current.pos.x = -140.0f; + current.pos.z = 360.0f; + + shape_angle.x = 0; + shape_angle.y = 0x1000; + current.angle.y = 0x1000; + shape_angle.z = 0; + + cLib_addCalc2(&mEyeColorAlpha, 255.0f, 0.7f, 5.0f); + daPy_getPlayerActorClass()->changeDemoMode(23, 1, 2, 0); + mMode++; + // fallthrough + case 8: + cLib_addCalc2(&mEyeColorAlpha, 255.0f, 0.7f, 5.0f); + for (int i = 0; i < 2; i++) { + mSandParticleKey[i] = dComIfGp_particle_set(mSandParticleKey[i], eff_Sand_id[i], + ¤t.pos, &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mSandParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(DS_HEAD_JNT_HEAD)); + } + } + + vec = pla->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + cLib_addCalc2(&field_0x7f8, 0.5f, 0.1f, 0.01f); + cLib_addCalc2(¤t.pos.y, 2400.0f, 0.8f, 5.0f); + + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + + center = mSwordPos; + center.y += -500.0f; + if (center.y < mOp2CenterDt[3].y) { + center.y = mOp2CenterDt[3].y; + } + + if (center.y > mCameraCenter.y) { + cLib_addCalc2(&mCameraCenter.y, center.y, 0.8f, 5.0f); + } + + if (fabsf(current.pos.y - 2400.0f) > 2.0f) { + break; + } + + mModeTimer = 50; + current.pos.y = 2400.0f; + mMode = 10; + // fallthrough + case 10: + vec = pla->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + vec = mOp2PlayerDt[1]; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec, -0x664a, 0); + mModeTimer = 30; + mMode++; + // fallthrough + + case 11: + current.pos.x = -140.0f; + current.pos.z = 760.0f; + + mCameraCenter = mOp2CenterDt[4]; + mCameraEye = mOp2EyeDt[4]; + + vec = pla->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + field_0x6f4 = current.pos; + daPy_getPlayerActorClass()->changeDemoMode(25, 0, 0, 0); + mModeTimer = 30; + mMode++; + break; + case 12: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mModeTimer = 30; + daPy_getPlayerActorClass()->changeDemoMode(23, 1, 2, 0); + mMode++; + // fallthrough + case 13: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + current.angle.y = shape_angle.y = fopAcM_searchPlayerAngleY(this); + field_0x790.zero(); + mCameraCenter = mOp2CenterDt[5]; + mCameraEye = mOp2EyeDt[5]; + + mModeTimer = 30; + mMode++; + // fallthrough + case 14: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + field_0x718 = pla->current.pos; + mMode++; + // fallthrough + case 15: + if ((int)mpMorf->getFrame() < 30) { + break; + } + + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + + daPy_getPlayerActorClass()->changeDemoMode(9, 1, 0, 0); + speedF = 150.0f; + + dCam_getBody()->StartBlure(40, this, 0.8f, 1.2f); + dComIfGp_getVibration().StartShock(6, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mCameraCenter = mOp2CenterDt[6]; + mCameraEye = mOp2EyeDt[6]; + + mModeTimer = 50; + mMode++; + // fallthrough + case 16: + cLib_addCalc0(&speedF, 0.7f, 10.0f); + + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 20) { + center.set(644.0f, -1495.0f, 2194.0f); + eye.set(968.0f, -1421.0f, 2169.0f); + camera->mCamera.Reset(center, eye); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + dComIfGp_event_reset(); + dComIfGs_onOneZoneSwitch(6, fopAcM_GetRoomNo(this)); + } + } else { + vec.set(644.0f, -1600.0f, 2195.0f); + dComIfGs_setRestartRoom(vec, -0x664A, 50); + + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + fopAcM_SetGroup(this, 2); + + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL02, 0, 0); + mSetFirstPos(); + setActionMode(ACT_B2_WAIT, 0); + } + } + + if (mMode > 6) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(3, 2, mColBlend); + } + + if (mMode >= 10) { + mSandPos.y = current.pos.y; + mFuwafuwaSet(false); + } + + if (mMode >= 2) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + } +} + +/* 805D3900-805D39A4 0087C0 00A4+00 2/2 0/0 0/0 .text mFlyBMove__8daB_DS_cFf */ +void daB_DS_c::mFlyBMove(f32 param_0) { + cLib_addCalc2(&mChkHigh, param_0, 0.8f, 30.0f); + mSandPos.y += mChkHigh; + + f32 step = fabsf(mSandPos.y - current.pos.y); + if (step < 1.0f) { + step = 1.0f; + } else if (step > 30.0f) { + step = 30.0f; + } + + cLib_addCalc2(¤t.pos.y, mSandPos.y, 0.8f, step); +} + +/* 805D39A4-805D3D14 008864 0370+00 5/5 0/0 0/0 .text mFuwafuwaSet__8daB_DS_cFb */ +void daB_DS_c::mFuwafuwaSet(bool param_0) { + if (fabsf(current.pos.y - mSandPos.y) < 20.0f) { + field_0x82c += 2.0f; + cLib_addCalc2(&field_0x790.y, cM_ssin(field_0x82c * 1000.0f) * 50.0f, 0.8f, 10.0f); + cLib_addCalc2(&field_0x790.x, cM_ssin(field_0x82c * 500.0f) * 50.0f, 0.5f, field_0x804); + cLib_addCalc2(&field_0x790.z, cM_scos(field_0x82c * 500.0f) * 50.0f, 0.5f, field_0x804); + cLib_addCalc2(&field_0x804, 4.0f, 0.8f, 0.3f); + } + + mSoundPos = current.pos; + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + + if (param_0) { + daPy_py_c* pla = daPy_getPlayerActorClass(); + dBgS_GndChk gnd_chk; + f32 cHigh = 1000.0f; + + mSandPos.y = pla->current.pos.y; + + if (field_0x7ce > 0x2800) { + field_0x7ce = 0x2800; + } + + if (mAction != ACT_B2_TIRED) { + if (daPy_getPlayerActorClass()->checkSpinnerPathMove() || + (daPy_getPlayerActorClass()->getSpinnerActor() != NULL && + !daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + cLib_calcTimer(&mOutTimer); + + if (pla->current.pos.y < l_HIO.mP2AttackHeight && mOutTimer != 0) { + mBh2AttackAngleF = 0x4800; + field_0x7ce = 0x4800; + mCreateFireBreath = false; + + if (mParticleKey2 != 0) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->stopDrawParticle(); + mParticleKey2 = 0; + } + } + } else { + mOutTimer = 0; + mBirthTrapTimerF = 0; + } + cHigh = 300.0f; + } + } else { + cHigh = 300.0f; + } + + cLib_addCalcAngleS2(&mBh2AttackAngleF, field_0x7ce, 20, 0x200); + + if (WREG_S(2)) { + OS_REPORT("mBh2AttackAngleF %x\n", (s16)mBh2AttackAngleF); + OS_REPORT("mSandPos.y %f\n", mSandPos.y); + OS_REPORT("pla->current.pos.y %f\n", pla->current.pos.y); + OS_REPORT("cHigh %f\n", cHigh); + } + + mFlyBMove(cHigh); + } +} + +/* 805D3D14-805D3D80 008BD4 006C+00 1/1 0/0 0/0 .text mBattle2BreathFireSet__8daB_DS_cFUl + */ +void daB_DS_c::mBattle2BreathFireSet(u32 i_params) { + fopAcM_createChild(PROC_B_DS, fopAcM_GetID(this), i_params, &mMouthPos, fopAcM_GetRoomNo(this), + &shape_angle, NULL, -1, NULL); + mCreateFireBreath = false; +} + +/* 805D3D80-805D3EA0 008C40 0120+00 3/3 0/0 0/0 .text mNeckAngleSet__8daB_DS_cFv */ +bool daB_DS_c::mNeckAngleSet() { + s16 svar5 = 0; + cXyz vec = daPy_getPlayerActorClass()->current.pos - mMouthPos; + if (daPy_getPlayerActorClass()->checkSpinnerRide() && !mRailInOutCheck()) { + svar5 = -0x52C; + } + + cLib_addCalcAngleS2(¤t.angle.y, svar5 + vec.atan2sX_Z(), 2, 0x1000); + cLib_addCalcAngleS2(¤t.angle.x, (s16)vec.atan2sY_XZ(), 8, 0x200); + shape_angle = current.angle; + return abs((s16)(shape_angle.y - (svar5 + vec.atan2sX_Z()))) <= 0x200; +} + +/* 805D3EA0-805D3F90 008D60 00F0+00 2/2 0/0 0/0 .text mSetFirstPos__8daB_DS_cFv */ +void daB_DS_c::mSetFirstPos() { + daPy_py_c* pla = daPy_getPlayerActorClass(); + home.pos.set(0.0f, 1900.0f, 0.0f); + + cXyz offset, vec2; + vec2 = pla->current.pos - home.pos; + vec2.y = 0.0f; + + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() - 0x4800); + + offset.x = 0.0f; + offset.y = 0.0f; + offset.z = l_HIO.mP2MoveAxis; + MtxPosition(&offset, ¤t.pos); + current.pos += home.pos; + + mEyeColorAlpha = 255.0f; + shape_angle.z = 0; +} + +/* 805D3F90-805D4054 008E50 00C4+00 2/2 0/0 0/0 .text mChkScreenIn__8daB_DS_cFv */ +bool daB_DS_c::mChkScreenIn() { + camera_class* camera = dComIfGp_getCamera(0); + cXyz vec1, vec2; + + vec2 = camera->mLookat.mEye - camera->mLookat.mCenter; + vec1 = camera->mLookat.mEye - current.pos; + return abs((s16)(vec1.atan2sX_Z() - vec2.atan2sX_Z())) < 0x3000; +} + +/* 805D4054-805D41CC 008F14 0178+00 2/2 0/0 0/0 .text mRailInOutCheck__8daB_DS_cFv */ +bool daB_DS_c::mRailInOutCheck() { + cXyz vec = daPy_getPlayerActorClass()->current.pos - home.pos; + vec.y = 0.0f; + return !(vec.abs() < l_HIO.mP2MoveAxis); +} + +/* 805D41CC-805D429C 00908C 00D0+00 1/1 0/0 0/0 .text executeBattle2Wait__8daB_DS_cFv */ +void daB_DS_c::executeBattle2Wait() { + switch (mMode) { + case 0: + mBh2AttackAngleF = 0x4800; + field_0x7ce = 0x4800; + mOutTimer = l_HIO.mP2OuterWallAttackTime; + mPlayPatternAnm = false; + field_0x82c = 0; + field_0x808 = 0.0f; + mCreateFireBreath = false; + mModeTimer = 0; + mWallR = 500.0f; + + setBck(ANM_HEAD_FWAIT, 2, 10.0f, 1.0f); + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime1; + mTrapCreate = false; + setActionMode(ACT_B2_F_MOVE, 0); + break; + } + + mNeckAngleSet(); + mFuwafuwaSet(true); +} + +/* 805D429C-805D497C 00915C 06E0+00 2/2 0/0 0/0 .text mBattle2MoveFSet__8daB_DS_cFv */ +bool daB_DS_c::mBattle2MoveFSet() { + daPy_py_c* pla = daPy_getPlayerActorClass(); + f32 move_axis = l_HIO.mP2MoveAxis; + bool cvar6 = mRailInOutCheck(); + + cXyz offset, ato; + ato = field_0x718 - current.pos; + ato.y = 0.0f; + + if (mBh2AttackAngleF <= 0x2880 && ato.abs() < 500.0f) { + if (!cvar6) { + move_axis += 600.0f; + } else if (mAction != ACT_B2_TIRED) { + move_axis += 700.0f; + } else { + move_axis -= 700.0f; + } + } + + cLib_addCalc2(&field_0x80c, move_axis, 1.0f, 20.0f); + bool ret = false; + + ato = pla->current.pos - home.pos; + ato.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z() - mBh2AttackAngleF); + offset.x = 0.0f; + offset.y = 0.0f; + offset.z = field_0x80c; + MtxPosition(&offset, &field_0x718); + + ato = field_0x718 - current.pos; + ato.y = 0.0f; + f32 spdF = ato.abs() - field_0x80c; + if (spdF < 10.0f || !mChkScreenIn()) { + spdF = 10.0f; + } else if (spdF > 30.0f) { + spdF = 30.0f; + } + spdF += pla->speedF * 2.0f; + + ato = pla->current.pos - home.pos; + ato.y = 0.0f; + if (ato.abs() > 2000.0f) { + cLib_addCalc2(&field_0x808, spdF, 1.0f, 10.0f); + cLib_addCalc2(¤t.pos.x, field_0x718.x, 1.0f, field_0x808); + cLib_addCalc2(¤t.pos.z, field_0x718.z, 1.0f, field_0x808); + + ato = field_0x718 - current.pos; + ato.y = 0.0f; + if (mOutTimer == 0 || ato.abs() < 200.0f) { + ret = true; + } + + if (cLib_calcTimer(&mBirthTrapTimerF) == 0) { + if (mTrapID[6] != 0) { + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime2; + } else { + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime1; + } + + mTrapCreate = true; + } + } + + if (WREG_S(1)) { + OS_REPORT("ato.abs() %f\n", ato.abs()); + OS_REPORT("mBirthTrapTimerF %d\n", mBirthTrapTimerF); + OS_REPORT("spdF %f\n", spdF); + OS_REPORT("pla->speedF %f\n\n", pla->getSpeedF()); + } + + if (daPy_getPlayerActorClass()->checkSpinnerPathMove()) { + field_0x6f4 = pla->current.pos; + } + + return ret; +} + +/* 805D497C-805D5040 00983C 06C4+00 1/1 0/0 0/0 .text executeBattle2FMove__8daB_DS_cFv */ +void daB_DS_c::executeBattle2FMove() { + daPy_py_c* pla = daPy_getPlayerActorClass(); + bool mMvFlag = mBattle2MoveFSet(); + bool mAnF = false; + cXyz vec; + + if (!mMvFlag && daPy_getPlayerActorClass()->checkSpinnerRide()) { + vec = field_0x718 - current.pos; + cLib_addCalcAngleS2(¤t.angle.y, vec.atan2sX_Z(), 1, 0x400); + shape_angle.y = current.angle.y; + } else { + mAnF = mNeckAngleSet(); + } + + switch (mMode) { + case 0: + mModeTimer = l_HIO.mP2BulletFireTime; + mCreateFireBreath = false; + setBck(ANM_HEAD_FWAIT, 2, 10.0f, 1.0f); + + if (!daPy_getPlayerActorClass()->checkSpinnerRide()) { + field_0x808 = 0.0f; + mOutTimer = l_HIO.mP2OuterWallAttackTime; + } + mMode++; + // fallthrough + case 1: + case 2: + vec = pla->current.pos - home.pos; + vec.y = 0.0f; + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer > 5) { + if (vec.abs() < 2000.0f) { + mModeTimer = 5; + } + } + } else { + if (vec.abs() > 2000.0f && (!mMvFlag || !mAnF || mBh2AttackAngleF > 0x2880)) { + if (WREG_S(3)) { + OS_REPORT("mMvFlag %d\n", mMvFlag); + OS_REPORT("mAnF %d\n", mAnF); + OS_REPORT("mBh2AttackAngleF %x\n", (s16)mBh2AttackAngleF); + } + break; + } + + if (daPy_getPlayerActorClass()->getDamageWaitTimer() != 0) { + mOutTimer = l_HIO.mP2OuterWallAttackTime; + mTrapCreate = false; + } else { + if (mMode == 1) { + if (field_0x7ce > 0x2800) { + field_0x7ce = 0x2800; + } + } else { + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + } + + mMode++; + } + } + break; + case 3: + if (!mpMorf->isStop()) { + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + break; + } + + setBck(ANM_HEAD_FATTACK_B, 2, 3.0f, 1.0f); + mCreateFireBreath = true; + mMode++; + // fallthrough + case 4: + if (mCreateFireBreath) { + field_0x6a8 = 3; + break; + } + + if (daPy_getPlayerActorClass()->checkSpinnerRide() && + daPy_getPlayerActorClass()->getDamageWaitTimer() == 0) + { + field_0x7ce -= l_HIO.mP2ApproachAfterBullet; + if (field_0x7ce <= l_HIO.mP2ApproachDist) { + field_0x6a8 = 2; + setActionMode(ACT_B2_TIRED, 0); + break; + } + } else if (!daPy_getPlayerActorClass()->checkSpinnerRide() || + (daPy_getPlayerActorClass()->getSpinnerActor() != NULL && + daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode = 100; + break; + } + + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode = 10; + break; + case 10: + case 100: + if (mpMorf->isStop()) { + if (mMode == 10) { + mMode = 0; + } else { + setActionMode(ACT_B2_WAIT, 0); + } + } + break; + } + + if (cLib_calcTimer(&field_0x6a8) == 1 && mParticleKey2 != 0) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + } + + mFuwafuwaSet(true); +} + +/* 805D5040-805D52D4 009F00 0294+00 1/1 0/0 0/0 .text executeBattle2Tired__8daB_DS_cFv */ +void daB_DS_c::executeBattle2Tired() { + switch (mMode) { + case 0: + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + mTimerCount = 0; + mMode++; + break; + case 1: + if (mAnmID == ANM_HEAD_FATTACK_A) { + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + if (mpMorf->isStop()) { + setBck(ANM_HEAD_FATTACK_B, 2, 3.0f, 1.0f); + } + } + + if (abs((s16)(mBh2AttackAngleF - 0x800)) > 0x100) { + break; + } + + mCreateFireBreath = true; + mMode++; + // fallthrough + case 2: + if (!mCreateFireBreath) { + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode++; + } + break; + case 3: + if (mpMorf->isStop()) { + mMode = 777; + } + break; + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() || + daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 || mMode == 777 || + (daPy_getPlayerActorClass()->getSpinnerActor() != NULL && + daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + setActionMode(ACT_B2_WAIT, 0); + } + + cLib_addCalcAngleS2(&mBh2AttackAngleF, 0x800, l_HIO.mP2ApproachAccel, + l_HIO.mP2ApproachSpeedMax); + + mSandPos.y = daPy_getPlayerActorClass()->current.pos.y; + mNeckAngleSet(); + mFlyBMove(100.0f); + mBattle2MoveFSet(); + mFuwafuwaSet(false); +} + +/* 805D52D4-805D60BC 00A194 0DE8+00 1/1 0/0 0/0 .text executeBattle2Damage__8daB_DS_cFv + */ +void daB_DS_c::executeBattle2Damage() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + daPy_py_c* pla = daPy_getPlayerActorClass(); + + JPABaseEmitter* emitter; + dBgS_LinChk lin_chk; + dBgS_GndChk gnd_chk; + cXyz vec1, vec2, chk_pos; + cXyz particle_scale(1.5f, 1.5f, 1.5f); + csXyz particle_angle; + + chk_pos = current.pos; + chk_pos.y += 300.0f; + gnd_chk.SetPos(&chk_pos); + chk_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (chk_pos.y == -1000000000.0f) { + chk_pos.y = current.pos.y - 200.0f; + } + + switch (mMode) { + case 0: + if (!startDemoCheck()) { + break; + } + + vec2 = pla->current.pos - home.pos; + vec2.y = 0.0f; + + field_0x7d2 = vec2.atan2sX_Z(); + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = l_HIO.mP2MoveAxis; + MtxPosition(&vec1, &vec2); + vec2.y = pla->current.pos.y; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec2, -vec2.atan2sX_Z(), 0); + + mHintTimer2 = 0; + + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + + shape_angle.x = 0; + current.angle.x = 0; + setBck(ANM_HEAD_DAMAGE, 0, 3.0f, 1.0f); + + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgSpinnerReflect(); + mHeadSph[i].OnTgIronBallRebound(); + mHeadSph[i].OffTgShield(); + mHeadSph[i].SetTgType(0); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_0); + } + + shape_angle.x = 0; + mTimerCount = 0; + daPy_getPlayerActorClass()->changeOriginalDemo(); + daPy_getPlayerActorClass()->changeDemoMode(14, 0, 0, 0); + + vec2 = field_0x6f4 - home.pos; + vec2.y = 0.0f; + vec1 = home.pos - field_0x6f4; + vec1.y = 0.0f; + current.angle.y = vec1.atan2sX_Z(); + + if (vec2.abs() < l_HIO.mP2MoveAxis) { + mAttackingHand = 0; + // "Player hit from right \n" + OS_REPORT("右からプレイヤ当り \n"); + current.angle.y += 0x8000; + field_0x7d2 = vec2.atan2sX_Z() + 0x800; + } else { + mAttackingHand = 1; + // "Player hit from left \n" + OS_REPORT("左からプレイヤ当り \n"); + field_0x7d2 = vec2.atan2sX_Z() + 0x1800; + } + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 4000.0f; + MtxPosition(&vec1, &field_0x79c); + + mWallR = 300.0f; + field_0x79c += current.pos; + if (field_0x79c.y > 1400.0f) { + field_0x79c.y = 1400.0f; + current.pos.y = 1400.0f; + } + + mSmokeCount = 0; + mMode++; + break; + case 1: + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + + vec1.x = 0.0f; + vec1.y = 200.0f; + vec1.z = l_HIO.mP2MoveAxis; + MtxPosition(&vec1, &mCameraEye); + mCameraEye.y += current.pos.y; + mCameraCenter = current.pos; + + vec2 = mCameraEye - mCameraCenter; + shape_angle.y = vec2.atan2sX_Z(); + cLib_addCalcPos(¤t.pos, field_0x79c, 0.8f, 50.0f, 7.0f); + + if (!mAcch.ChkWallHit()) { + break; + } + + mSound.startCreatureSound(Z2SE_EN_DS_H_COL_WALL, 0, -1); + + particle_angle = shape_angle; + particle_angle.x = 0x4000; + particle_angle.z = 0; + field_0x6d0 = mMouthPos; + mHitParticleKey[0] = dComIfGp_particle_set(mHitParticleKey[0], eff_smoke_id[1], + &field_0x6d0, &particle_angle, &particle_scale); + + dScnPly_c::setPauseTimer(5); + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + + current.angle.y = shape_angle.y; + speedF = 0.0f; + field_0x7d0 = 0; + gravity = -3.0f; + mEyeColorAlpha = 0.0f; + mMode++; + // fallthrough + case 2: + mCameraCenter = current.pos; + if (!mAcch.i_ChkGroundHit() && current.pos.y - 100.0f > chk_pos.y) { + break; + } + + if (mAnmID != ANM_HEAD_DOWN) { + setBck(ANM_HEAD_DOWN, 0, 3.0f, 1.0f); + } + + gravity = 0.0f; + speed.y = 0.0f; + + particle_angle = shape_angle; + particle_angle.z = 0; + particle_angle.x = 0; + vec2 = current.pos; + vec2.y = mAcch.GetGroundH(); + mHitParticleKey[1] = dComIfGp_particle_set(mHitParticleKey[1], eff_smoke_id[1], &vec2, + &particle_angle, &particle_scale); + + mSound.startCreatureSound(Z2SE_EN_DS_H_COL, 0, -1); + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mModeTimer = 50; + mMode++; + // fallthrough + case 3: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + camera->mCamera.Reset(mCameraCenter, mCameraEye); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + dComIfGp_event_reset(); + + attention_info.field_0x0[2] = 0x16; + mWeakSph.OnTgSetBit(); + mP2FallTimer = l_HIO.mP2FallTime; + mMode++; + // fallthrough + case 4: + if (mBattle2_damage_check()) { + return; + } + + mWeakSph.SetC(mSwordPos); + mWeakSph.SetR(140.0f); + dComIfG_Ccsp()->Set(&mWeakSph); + + if (cLib_calcTimer(&mP2FallTimer) != 0) { + mParticleKey1 = + dComIfGp_particle_set(mParticleKey1, 0x8bf5, ¤t.pos, &shape_angle, NULL); + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(DS_HEAD_JNT_HEAD)); + } + + Z2GetAudioMgr()->seStartLevel(Z2SE_EN_DS_SMOKE_2, &mSwordPos, 0, 0, 1.0f, 1.0f, -1.0f, + -1.0f, 0); + break; + } + + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + + attention_info.field_0x0[2] = 0; + setBck(ANM_HEAD_DOWN_UP, 0, 3.0f, 1.0f); + Z2GetAudioMgr()->changeBgmStatus(1); + mWeakSph.OffTgSetBit(); + mMode++; + // fallthrough + case 5: + mDamageTimer = 100; + + if (!mChkScreenIn()) { + mSetFirstPos(); + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgShield(); + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OffTgIronBallRebound(); + } + mDamageTimer = 100; + setActionMode(ACT_B2_WAIT, 0); + return; + } + + if ((int)mpMorf->getFrame() >= 20) { + if (mpMorf->checkFrame(20.0f)) { + mSound.startCreatureSound(Z2SE_EN_DS_H_DOWN_UP, 0, -1); + } + + cLib_addCalc2(&mWallR, 500.0f, 0.7f, 30.0f); + cLib_addCalcAngleS2(&shape_angle.z, 0, 4, 0x400); + cLib_addCalc2(&mEyeColorAlpha, 255.0f, 0.7f, 10.0f); + mFuwafuwaSet(true); + + if (mEyeColorAlpha > 254.0f && shape_angle.z < 0x100) { + mEyeColorAlpha = 255.0f; + shape_angle.z = 0; + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgShield(); + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OffTgIronBallRebound(); + } + setActionMode(ACT_B2_WAIT, 0); + return; + } + } + break; + } + + if (mMode >= 1 && mMode <= 3) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + cLib_addCalc0(&mEyeColorAlpha, 0.7f, 10.0f); + } + + if (mMode >= 2 && mMode <= 3) { + s16 target_z = 13000; + if (mAttackingHand == 0) { + target_z = -13000; + } + cLib_addCalcAngleS2(&shape_angle.z, target_z, 4, 0x400); + } + + if (mP2FallTimer != 0) { + if (mP2FallTimer > l_HIO.mP2FallTime / 3.0f) { + return; + } + + if ((mP2FallTimer & 32) == 0) { + cLib_addCalc0(&mEyeColorAlpha, 0.8f, 10.0f); + } else { + cLib_addCalc2(&mEyeColorAlpha, 255.0f, 0.8f, 10.0f); + } + } +} + +/* 805D60BC-805D6534 00AF7C 0478+00 1/1 0/0 0/0 .text mDeadMove__8daB_DS_cFv */ +bool daB_DS_c::mDeadMove() { + mTimerCount++; + cXyz vec1; + cXyz vec2 = home.pos - (current.pos + field_0x790); + vec2.y = 0.0f; + + if (mTimerCount < 80) { + if (mAttackingHand != 0) { + shape_angle.z -= 0x80; + } else { + shape_angle.z += 0x80; + } + + field_0x83c++; + cLib_addCalc2(&field_0x790.x, cM_ssin(field_0x83c * -300.0f) * 1000.0f, 0.8f, 50.0f); + cLib_addCalc2(&field_0x790.z, cM_scos(field_0x83c * -100.0f) * -200.0f, 0.8f, 50.0f); + + vec2 = home.pos - (current.pos + field_0x790); + vec2.y = (home.pos.y + 8000.0f) - current.pos.y; + if (mTimerCount == 1) { + current.angle.y = vec2.atan2sX_Z(); + speedF = 40.0f; + } + current.angle.x = vec2.atan2sY_XZ(); + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 80.0f; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + + field_0x861 = false; + mModeTimer = 30; + } else { + if (mAnmID != ANM_HEAD_DAMAGE) { + setBck(ANM_HEAD_DAMAGE, 0, 3.0f, 1.0f); + } + + if (cLib_calcTimer(&mModeTimer) == 0) { + field_0x861 = true; + if (mAttackingHand != 0) { + shape_angle.z -= 0x80; + cLib_addCalc2(&speedF, 20.0f, 0.8f, 3.0f); + } else { + shape_angle.z += 0x80; + cLib_addCalc2(&speedF, 17.0f, 0.8f, 3.0f); + } + + vec2 = field_0x718 - (current.pos + field_0x790); + field_0x7ba.z = 0; + current.angle.x = vec2.atan2sY_XZ(); + current.angle.y = vec2.atan2sX_Z(); + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 40.0f; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + } else { + speed.y = 0.0f; + cLib_addCalc0(&speedF, 0.7f, 2.0f); + } + cLib_addCalc0(&mEyeColorAlpha, 0.7f, 3.0f); + } + + s16 angle_scale, angle_step; + if (!field_0x861) { + angle_scale = 8; + angle_step = 0x200; + } else { + angle_scale = 40; + angle_step = 0x100; + } + + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, angle_scale, angle_step); + cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, angle_scale, angle_step); + + vec2 = current.pos + field_0x790; + cLib_addCalcPos(&mCameraCenter, vec2, 1.0f, 100.0f, 20.0f); + + if (mTimerCount < 80 || home.pos.y + 700.0f < current.pos.y) { + return false; + } else { + return true; + } +} + +/* 805D6534-805D7C10 00B3F4 16DC+00 2/1 0/0 0/0 .text executeBattle2Dead__8daB_DS_cFv */ +void daB_DS_c::executeBattle2Dead() { + static cXyz mEd2CenterDt[2] = { + cXyz(70.0f, 1890.0f, -1190.0f), + cXyz(-90.0f, 1890.0f, -2200.0f), + }; + static cXyz mEd22EyeDt[2] = { + cXyz(105.0f, 1880.0f, -945.0f), + cXyz(110.0f, 1880.0f, -885.0f), + }; + static u16 eff_Demo_sasi_id[2] = {0x8BF8, 0x8BF9}; + + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + csXyz particle_angle = shape_angle; + cXyz mae, ato; + cXyz particle_scale(1.5f, 1.5f, 1.5f); + cXyz item_scale; + + switch (mMode) { + case 0: + if (!startDemoCheck()) { + break; + } + + mSmokeCount = 0; + field_0x6f4 = current.pos; + home.angle = shape_angle; + field_0x7c0 = current.angle; + dComIfGp_getVibration().StartShock(5, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + // fallthrough + case 100: + field_0x790.zero(); + setBck(ANM_HEAD_DIEB, 2, 3.0f, 1.0f); + + mEyeColorAlpha = 255.0f; + mTimerCount = 0; + mCameraFovy = 50.0f; + mWallR = 500.0f; + mGroundUpY = 500.0f; + + ato = current.pos - home.pos; + if (mAttackingHand != 0) { + field_0x7d2 = ato.atan2sX_Z() + 0x2000; + } else { + field_0x7d2 = ato.atan2sX_Z() - 0x8000; + } + + field_0x83c = 0; + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + current.angle.y = field_0x7d2; + daPy_getPlayerActorClass()->changeDemoMode(4, 1, 0, 0); + + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = 1500.0f; + MtxPosition(&mae, &ato); + ato += field_0x6f4; + mCameraEye = ato; + mMode = 1; + // fallthrough + case 1: + shape_angle.z += 0x100; + if (current.pos.y < 1700.0f) { + mCameraCenter = current.pos; + ato = current.pos; + ato.y = 2500.0f; + cLib_addCalcPos(¤t.pos, ato, 1.0f, 90.0f, 45.0f); + cLib_addCalcAngleS2(&shape_angle.x, -0x4000, 4, 0x400); + break; + } + + speedF = 0.0f; + mMode++; + // fallthrough + case 2: + mWallR = 650.0f; + ato = current.pos - home.pos; + field_0x80c = 3400.0f; + + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z()); + + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = field_0x80c; + MtxPosition(&mae, &ato); + ato += home.pos; + + current.pos.x = ato.x; + current.pos.y = 2500.0f; + current.pos.z = ato.z; + + ato = home.pos - current.pos; + ato.y = 0.0f; + field_0x80c = 3600.0f; + + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z() + 10000); + + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = field_0x80c; + MtxPosition(&mae, &ato); + ato += home.pos; + ato.y = 3400.0f; + mCameraEye = ato; + + field_0x80c = 3600.0f; + ato = home.pos - current.pos; + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z()); + mDoMtx_XrotM(*calc_mtx, ato.atan2sY_XZ()); + mae.x = 0.0f; + mae.y = 100.0f; + mae.z = field_0x80c; + MtxPosition(&mae, &ato); + field_0x718 = ato + home.pos; + ato = field_0x718 - current.pos; + field_0x7ba.x = ato.atan2sY_XZ(); + field_0x7ba.y = ato.atan2sX_Z(); + field_0x7ba.z = 0; + current.angle = field_0x7ba; + + mCameraCenter = current.pos; + mMode++; + // fallthrough + case 3: + if (!mDeadMove()) { + break; + } + + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + mEyeColorAlpha = 0.0f; + field_0x790.zero(); + field_0x7d2 -= 0x1000; + + setBck(ANM_HEAD_DIE, 2, 3.0f, 1.0f); + speedF = 0.0f; + mMode++; + // fallthrough + case 4: + current.pos = field_0x718; + shape_angle.z = 0x5277; + shape_angle.x = 0x4a4; + current.angle.x = 0x4a4; + + ato = home.pos - current.pos; + ato.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z() - 40000); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = 3000.0f; + MtxPosition(&mae, &ato); + ato += home.pos; + ato.y -= 3000.0f; + mCameraEye = ato; + + ato = home.pos - current.pos; + mae = field_0x718 - current.pos; + + if (BREG_S(1)) { + OS_REPORT("ato.abs() %f\n", ato.abs()); + OS_REPORT("mae.abs() %f\n", mae.abs()); + } + + mSound.startCreatureSound(Z2SE_EN_DS_END_COL, 0, -1); + + gravity = 0.0f; + speed.y = 0.0f; + particle_angle = shape_angle; + particle_angle.x = 0x4000; + particle_angle.z = 0; + mDeathParticleKey = dComIfGp_particle_set(mDeathParticleKey, eff_smoke_id[1], &field_0x718, + &particle_angle, &particle_scale); + + current.angle.y = shape_angle.y; + ato = mCameraEye - current.pos; + ato.y = mCameraEye.y - current.pos.y; + current.angle.y = ato.atan2sX_Z() - 0x800; + current.angle.x = ato.atan2sY_XZ(); + + mModeTimer = 10; + dComIfGp_getVibration().StartShock(6, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + break; + case 5: + speedF = 50.0f; + mGroundUpY = 400.0f; + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = speedF; + MtxPosition(&mae, &ato); + speed.y = ato.y; + + cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 20, 0x100); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x100); + if (cLib_calcTimer(&mModeTimer) == 0) { + mMode++; + } + break; + case 6: + if (mAcch.ChkGroundHit()) { + mGroundUpY = 500.0f; + dComIfGp_getVibration().StartShock(5, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + speedF = 50.0f; + speed.y = 70.0f; + gravity = -5.0f; + mMode++; + } + break; + case 7: + ato.zero(); + ato.y = mAcch.GetGroundH() - current.pos.y; + current.angle.x = ato.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, 0, 8, 0x200); + cLib_addCalcAngleS2(&shape_angle.z, -0x4000, 10, 0x200); + + if (mAcch.ChkGroundHit()) { + dComIfGp_getVibration().StartShock(4, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + current.angle.y -= 0x1830; + mGroundUpY = 400.0f; + speedF = 120.0f; + speed.y = 50.0f; + gravity = -5.0f; + mMode = 10; + } + break; + case 10: + case 12: + case 14: + cLib_addCalcAngleS2(&shape_angle.z, -0x4000, 10, 0x200); + if (mAcch.ChkGroundHit()) { + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + } + break; + case 11: + case 13: + case 15: + if (mMode != 15) { + speedF = 180.0f; + speed.y = 20.0f; + gravity = -5.0f; + } else { + mModeTimer = 40; + } + mMode++; + break; + case 16: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + gravity = 0.0f; + speed.y = 0.0f; + speedF = 0.0f; + + ato = current.pos - home.pos; + mDoMtx_YrotS(*calc_mtx, ato.atan2sX_Z() + 0x2000); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = ato.abs() - 2500.0f; + MtxPosition(&mae, &ato); + ato += home.pos; + ato.y = -1600.0f; + + fopAcM_createDisappear(this, &ato, 49, 0, 0xff); + + dComIfGp_getVibration().StartShock(7, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_END_COL_LAST, 0, -1); + daPy_getPlayerActorClass()->changeDemoMode(4, 1, 0, 0); + mModeTimer = 80; + mMode++; + // fallthrough + case 17: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + mDead = true; + shape_angle.x = 0; + shape_angle.z = 0; + ato.set(0.0f, 1800.0f, -900.0f); + daPy_getPlayerActorClass()->changeDemoMode(2, 0, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&ato, 0x8000, 0); + + mae.set(0.0f, 1800.0f, -1140.0f); + ato = mae - home.pos; + ato.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, (s16)ato.atan2sX_Z()); + mae.x = 0.0f; + mae.y = -500.0f; + mae.z = l_HIO.mP2MoveAxis - 600.0f; + MtxPosition(&mae, ¤t.pos); + current.pos += home.pos; + + shape_angle.y = 0x4000; + mCameraCenter = current.pos; + mCameraCenter.y = mEd2CenterDt[0].y; + ato = mEd22EyeDt[0]; + mCameraEye = ato; + mCameraFovy = 68.0f; + current.angle.x = -0x4000; + + mae.set(0.0f, 1800.0f, -1140.0f); + ato = mae - home.pos; + ato.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, (s16)ato.atan2sX_Z()); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = l_HIO.mP2MoveAxis - 1600.0f; + MtxPosition(&mae, &field_0x718); + field_0x718 += home.pos; + + ato = field_0x718 - current.pos; + current.angle.y = ato.atan2sX_Z(); + mModeTimer = 80; + mMode = 20; + // fallthrough + case 20: + ato.set(0.0f, 1800.0f, -1140.0f); + daPy_getPlayerActorClass()->changeDemoPos0(&ato); + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + Z2GetAudioMgr()->seStart(Z2SE_OBJ_DS_END_ZAN_SWD, ¤t.pos, 0, 0, 1.0f, 1.0f, -1.0f, + -1.0f, 0); + mMode++; + // fallthrough + case 21: + shape_angle.z += 0x2000; + cLib_addCalcAngleS2(¤t.angle.x, 0x4000, 100, 200); + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = 30.0f; + MtxPosition(&mae, &ato); + speed.y = ato.y; + if (speed.y < 0.0f) { + speed.y *= 4.0f; + } + + if (abs(current.angle.x) > 0x2000) { + cLib_addCalc2(&speedF, 9.0f, 0.1f, 0.3f); + } + + if (speed.y < 0.0f && current.pos.y <= 1955.0f) { + mMode++; + } + break; + case 22: + if ((s16)shape_angle.z != 0) { + shape_angle.z += 0x2000; + } + + cLib_addCalc2(&speedF, 9.0f, 0.1f, 0.3f); + if (current.pos.y > 1850.0f) { + break; + } + + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + current.pos.y = 1850.0f; + ato = current.pos; + ato.x += 85.0f; + ato.y = 1800.0f; + + dComIfGp_getVibration().StartShock(2, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_Demo_sasi_id[i], &ato, &shape_angle, NULL); + } + + mModeTimer = 30; + mMode++; + // fallthrough + case 23: + if (cLib_calcTimer(&mModeTimer) == 0) { + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 80)), 1, + 1, 1.0f, 0, -1); + mColBlend = 0.0f; + field_0x840 = 4; + mMode++; + } + break; + case 24: + if (mpSwordMorf->isStop()) { + ato = current.pos; + ato.x += 85.0f; + ato.y = 1800.0f; + dComIfGp_particle_set(0x8c20, &ato, &shape_angle, NULL); + + fopAcM_createDisappear(this, &ato, 4, 1, 0xff); + + mNoDrawSword = true; + mModeTimer = 80; + mMode++; + } + break; + case 25: + if (cLib_calcTimer(&mModeTimer) != 0) { + if (mModeTimer == 70) { + item_scale.set(1.0f, 1.0f, 1.0f); + ato = current.pos; + ato.x += 85.0f; + ato.y = 1800.0f; + fopAcM_createItemForBoss(&ato, 0x22, fopAcM_GetRoomNo(this), &shape_angle, + &item_scale, 0.0f, 0.0f, -1); + + daPy_getPlayerActorClass()->changeDemoMode(30, 0, 0, 0); + } + + cLib_addCalcPos(&mCameraCenter, mEd2CenterDt[1], 0.3f, 50.0f, 10.0f); + cLib_addCalcPos(&mCameraEye, mEd22EyeDt[1], 0.3f, 50.0f, 10.0f); + break; + } + + daPy_getPlayerActorClass()->changeDemoMode(1, 0, 0, 0); + mModeTimer = 80; + mMode++; + // fallthrough + case 26: + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + fopAcM_onSwitch(this, 0x70); + mModeTimer = 140; + mMode++; + // fallthrough + case 27: + mCameraCenter.set(-280.0f, 1950.0f, -4150.0f); + mCameraEye.set(-340.0f, 2075.0f, -4505.0f); + mCameraFovy = 56.0f; + + if (cLib_calcTimer(&mModeTimer) != 0) { + break; + } + + fopAcM_onSwitch(this, 0x7b); + mModeTimer = 140; + mMode++; + // fallthrough + case 28: + mCameraCenter.set(410.0f, 1890.0f, -3835.0f); + mCameraEye.set(535.0f, 1725.0f, -3515.0f); + mCameraFovy = 59.0f; + + if (cLib_calcTimer(&mModeTimer) == 0) { + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + dComIfGp_event_reset(); + dComIfGs_onStageBossEnemy(0x13); + dComIfGs_onEventBit(0x2010); + fopAcM_delete(this); + } + } + + if (mMode >= 20 && mMode <= 23) { + ato = current.pos; + if (mEd2CenterDt[0].y < current.pos.y) { + cLib_addCalc2(&mCameraCenter.y, current.pos.y, 0.8f, 100.0f); + } + + ato.x += 70.0f; + cLib_addCalc2(&mCameraCenter.x, ato.x, 0.8f, 100.0f); + cLib_addCalc2(&mCameraCenter.z, ato.z, 0.8f, 100.0f); + eyePos = current.pos; + } + + if (mMode >= 5 && mMode <= 15) { + cLib_addCalcPos(&mCameraCenter, current.pos, 0.8f, 100.0f, 40.0f); + } + + if (mMode >= 5 && mMode <= 16) { + mSmokeSet(); + } + + if (mMode >= 25 && mMode != 100) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(2, 4, mColBlend); + } + + if (mMode != 0) { + camera->mCamera.Set(mCameraCenter, mCameraEye, mCameraFovy, 0); + } +} + +/* 805D7C10-805D8078 00CAD0 0468+00 1/1 0/0 0/0 .text executeBullet__8daB_DS_cFv */ +void daB_DS_c::executeBullet() { + static u16 effId[4] = {0x89AC, 0x89AD, 0x89AE, 0x89AF}; + cXyz sp38; + cXyz sp44; + + switch (mMode) { + case 0: + if (arg0 == TYPE_BULLET_A) { + speedF = -100.0f; + mBulletRadius = 100.0f; + mModeTimer = breathTimerBase; + mMode = 2; + break; + } else { + mBulletDistance = 500.0f; + mBulletRadius = 80.0f; + mModeTimer = 100; + mMode++; + } + // fallthrough + case 1: + if (!daPy_getPlayerActorClass()->checkSpinnerPathMove() || + (s16)(current.angle.y - home.angle.y) > 0x2000) + { + speedF = 100.0f; + mModeTimer = 100; + mMode = 2; + } else { + fopAc_ac_c* parent_actor; + if (fopAcM_SearchByID(parentActorID, &parent_actor) && parent_actor != NULL) { + daB_DS_c* parent = static_cast(parent_actor); + sp38 = parent->field_0x6d0 - parent->mMouthPos; + current.angle.x = sp38.atan2sY_XZ(); + current.angle.y = sp38.atan2sX_Z(); + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + sp38.x = 0.0f; + sp38.y = 0.0f; + sp38.z = mBulletDistance; + MtxPosition(&sp38, &sp44); + current.pos = sp44 + parent->mMouthPos; + mBulletDistance += 100.0f; + } + + mBulletRadius += 10.0f; + if (mBulletRadius > 240.0f) { + mBulletRadius = 240.0f; + } + } + break; + + case 2: + mDoMtx_YrotS(*calc_mtx, current.angle.y); + + if (arg0 == TYPE_BULLET_A) { + mDoMtx_XrotM(*calc_mtx, -current.angle.x); + } else { + mDoMtx_XrotM(*calc_mtx, current.angle.x); + } + + sp38.x = 0.0f; + sp38.y = 0.0f; + sp38.z = speedF; + MtxPosition(&sp38, &speed); + + if (cLib_calcTimer(&mModeTimer) == 0) { + fopAcM_delete(this); + } + break; + } + + if (mAcch.ChkWallHit() || mAcch.ChkGroundHit()) { + fopAcM_delete(this); + return; + } + + mBreathAtSph.SetC(current.pos); + mBreathAtSph.SetR(mBulletRadius); + dComIfG_Ccsp()->Set(&mBreathAtSph); + + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + cXyz scale(l_HIO.mP2ModelSize, l_HIO.mP2ModelSize, l_HIO.mP2ModelSize); + field_0x724 = current.pos - old.pos; + VECScale(&field_0x724, &field_0x724, 0.8f); + + Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_DS_H_FIRE, ¤t.pos, 0, 0, 1.0f, 1.0f, -1.0f, + -1.0f, 0); + + for (int i = 0; i < 4; i++) { + mBulletParticleKey[i] = dComIfGp_particle_set(mBulletParticleKey[i], effId[i], + ¤t.pos, ¤t.angle, &scale); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mBulletParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalTranslation(JGeometry::TVec3(current.pos)); + emitter->setParticleCallBackPtr(dPa_control_c::getParticleTracePCB()); + emitter->setUserWork((u32)&field_0x724); + } + } + } +} + +/* 805D8078-805D80F0 00CF38 0078+00 1/1 0/0 0/0 .text mBulletAction__8daB_DS_cFv */ +void daB_DS_c::mBulletAction() { + executeBullet(); + fopAcM_posMove(this, mCcStts.GetCCMoveP()); + + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + mAcchCir.SetWall(0.0f, 100.0f); + mAcch.CrrPos(dComIfG_Bgsp()); + } +} + +/* 805D80F0-805D8D04 00CFB0 0C14+00 2/1 0/0 0/0 .text mSoundSE_Set__8daB_DS_cFv */ +void daB_DS_c::mSoundSE_Set() { + static JAISoundID mWaitDt[3] = { + Z2SE_EN_DS_V_WAIT_A, + Z2SE_EN_DS_V_WAIT_B, + Z2SE_EN_DS_V_WAIT_C, + }; + + switch (mAnmID) { + case ANM_WAIT01_A: + case ANM_WAIT01_B: + case ANM_WAIT01_C: + if (mpMorf->checkFrame(29.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(mWaitDt[mAnmID - ANM_WAIT01_A], -1); + } + break; + case ANM_NODAMAGE_01_A: + case ANM_NODAMAGE_01_B: + case ANM_NODAMAGE_01_C: + if (mpMorf->checkFrame(25.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + if (mpMorf->checkFrame(39.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + break; + case ANM_NODAMAGE_02_A: + case ANM_NODAMAGE_02_B: + case ANM_NODAMAGE_02_C: + if (mpMorf->checkFrame(28.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + if (mpMorf->checkFrame(51.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + break; + case ANM_NODAMAGE_03_A: + case ANM_NODAMAGE_03_B: + case ANM_NODAMAGE_03_C: + if (mpMorf->checkFrame(42.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + break; + case ANM_ATTACK_L_A: + case ANM_ATTACK_L_B: + case ANM_ATTACK_L_C: + case ANM_ATTACK_R_A: + case ANM_ATTACK_R_B: + case ANM_ATTACK_R_C: + if (mpMorf->checkFrame(32.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_1, -1); + } + + if (mpMorf->checkFrame(97.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_2, -1); + } + + if (mpMorf->checkFrame(105.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_ATK, 0, -1); + } + break; + case ANM_ATTACK02_A_A: + case ANM_ATTACK02_A_B: + case ANM_ATTACK02_A_C: + if (mpMorf->checkFrame(83.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_FIRE, -1); + } + break; + case ANM_CIRCLE_L_A: + case ANM_CIRCLE_L_B: + case ANM_CIRCLE_L_C: + case ANM_CIRCLE_R_A: + case ANM_CIRCLE_R_B: + case ANM_CIRCLE_R_C: + if (mpMorf->checkFrame(32.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + + if (mpMorf->checkFrame(54.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + + if (mpMorf->checkFrame(92.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + + if (mpMorf->checkFrame(114.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + break; + case ANM_ATTACK01_A: + if (mpMorf->checkFrame(272.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + + if (mpMorf->checkFrame(314.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + // fallthrough + case ANM_ATTACK01_B: + case ANM_ATTACK01_C: + if (mpMorf->checkFrame(10.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_RTT, -1); + } + if (mpMorf->checkFrame(184.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HANDS, 0, -1); + } + break; + case ANM_DAMAGE_A_WAIT: + case ANM_DAMAGE_B_WAIT: + case ANM_LASTDAMAGE_WAIT: + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_WAIT, 0, -1); + break; + case ANM_DAMAGE_A: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_A, -1); + } + + if (mpMorf->checkFrame(20.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_A_FALL, 0, -1); + } + + if (mpMorf->checkFrame(28.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (mpMorf->checkFrame(54.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + + case ANM_DAMAGE_B: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_B, -1); + } + + if (mpMorf->checkFrame(6.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_B_FALL, 0, -1); + } + + if (mpMorf->checkFrame(33.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (mpMorf->checkFrame(45.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + case ANM_LASTDAMAGE: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_L, -1); + } + + if (mpMorf->checkFrame(124.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_L_FALL, 0, -1); + } + + if (mpMorf->checkFrame(119.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (mpMorf->checkFrame(236.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_BODY, 0, -1); + } + + if (mpMorf->checkFrame(240.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + } +} + +/* 805D8D04-805D91A4 00DBC4 04A0+00 2/1 0/0 0/0 .text action__8daB_DS_cFv */ +void daB_DS_c::action() { + static const struct { + u16 particle; + int joint; + } SEBONE_EFF_DT[6] = { + {0x8BEF, 0}, {0x8BF0, 0}, {0x8BF1, 1}, {0x8BF2, 1}, {0x8BF3, 2}, {0x8BF4, 2}, + }; + + int joint = mBackboneLevel; + if (mAction != ACT_OPENING_DEMO && joint < 3 && mBossPhase == 0) { + cXyz pos; + + joint *= 2; + for (int i = 0; i < 2; i++) { + mDoMtx_stack_c::copy(model->getAnmMtx(SEBONE_EFF_DT[joint + i].joint)); + + mDoMtx_stack_c::multVecZero(&pos); + mBackboneParticleKey[i] = + dComIfGp_particle_set(mBackboneParticleKey[i], SEBONE_EFF_DT[joint + i].particle, + &pos, &shape_angle, NULL); + } + + Z2GetAudioMgr()->seStartLevel(Z2SE_EN_DS_SMOKE_1, ¤t.pos, 0, 0, 1.0f, 1.0f, -1.0f, + -1.0f, 0); + } + + if (cLib_calcTimer(&mHintTimer1) != 0 && mHintTimer1 == 1) { + dComIfGs_onOneZoneSwitch(5, fopAcM_GetRoomNo(this)); + } + + if (mBackboneLevel != 0) { + mZsMoveChk(); + mZsMoveChk_Guard(); + } + + damage_check(); + mCreateTrap(false); + + if (mAction != ACT_OPENING_DEMO && !dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this)) && + cLib_calcTimer(&mPedestalFallTimer) == 0) + { + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + mSandFallTimer = l_HIO.mSandFallWaitTime; + } + + if (arg0 == TYPE_BATTLE_1 && dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this))) { + cLib_calcTimer(&mSandFallTimer); + if (mSandFallTimer >= 1 && mSandFallTimer <= 3 && bitSw != 0xff) { + fopAcM_onSwitch(this, bitSw); + mSandFallTimer = 0; + } + } + + switch (mAction) { + case ACT_OPENING_DEMO: + executeOpeningDemo(); + break; + case ACT_WAIT: + executeWait(); + break; + case ACT_CIRCLE: + executeCircle(); + break; + case ACT_DAMAGE: + executeDamage(); + break; + case ACT_ETC_DAMAGE: + executeEtcDamage(); + break; + case ACT_BREATH_ATTACK: + executeBreathAttack(); + break; + case ACT_HAND_ATTACK: + executeHandAttack(); + break; + case ACT_BREATH_SEARCH: + executeBreathSearch(); + break; + } + + if ((mAction != ACT_BREATH_ATTACK || mMode >= 3) && field_0x840 == 5) { + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.04f); + if (mColBlend > 0.998f) { + field_0x840 = 1; + mColBlend = 1.0f; + } + dKy_custom_colset(5, 1, mColBlend); + } + + mSoundSE_Set(); + fopAcM_posMoveF(this, mCcStts.GetCCMoveP()); + mAcchCir.SetWall(300.0f, 600.0f); + + f32 ground_up_y = -60.0f; + if (mAction == ACT_OPENING_DEMO) { + ground_up_y = 0.0f; + } + + if (mAction != ACT_DAMAGE || mMode < 100) { + mAcch.SetGroundUpY(ground_up_y); + mAcch.CrrPos(dComIfG_Bgsp()); + } + + if (mBossPhase != 100) { + if (daPy_getPlayerActorClass()->checkWolfLock(this)) { + daPy_getPlayerActorClass()->cancelWolfLock(this); + } + + mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mpSwordBrkAnm->play(); + mpSwordMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + + if (mDrawZant) { + mpZantMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + + if (mPlayPatternAnm) { + mpOpPatternBrkAnm->play(); + mpOpPatternBtkAnm->play(); + } + } +} + +/* 805D91A4-805D951C 00E064 0378+00 1/1 0/0 0/0 .text mtx_set__8daB_DS_cFv */ +void daB_DS_c::mtx_set() { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); + + if (mPlayPatternAnm) { + mpOpPatternModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + J3DModel* model = mpMorf->getModel(); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->modelCalc(); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HEAD)); + mDoMtx_stack_c::multVecZero(&mHeadPos); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_JAW)); + cXyz vec(0.0f, 100.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec, &mMouthPos); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_JAW)); + vec.set(100.0f, 20.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec, &mBulletPos); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HEAD)); + if (mAction == ACT_OPENING_DEMO || cLib_calcTimer(&mSwordTimer) != 0) { + vec.set(594.0f, -196.0f, 0.0f); + } else { + vec.set(584.0f, -136.0f, 0.0f); + } + + mDoMtx_stack_c::transM(vec.x, vec.y, vec.z); + + if (mAction == ACT_OPENING_DEMO || mSwordTimer != 0) { + mDoMtx_stack_c::YrotM(-0x4000); + mDoMtx_stack_c::XrotM(-0x7770); + } else { + mDoMtx_stack_c::YrotM(-0x3d44); + mDoMtx_stack_c::XrotM(-0x7c4c); + } + + mDoMtx_stack_c::scaleM(mSwordScale.x, mSwordScale.y, mSwordScale.z); + mDoMtx_stack_c::multVecZero(&mSwordPos); + mpSwordMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpSwordMorf->modelCalc(); + + vec.set(0.0f, -20.0f, 40.0f); + mDoMtx_stack_c::multVec(&vec, &eyePos); + if (mDrawZant == true) { + eyePos = mZantEyePos; + } + + attention_info.position = eyePos; + attention_info.position.y += 100.0f; + + mDoMtx_stack_c::transS(mSwordPos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + vec.set(5.0f, 0.0f, 10.0f); + mDoMtx_stack_c::transM(vec.x, vec.y, vec.z); + mDoMtx_stack_c::YrotM(field_0x7ca + 5000); + mDoMtx_stack_c::scaleM(mZantScale.x, mZantScale.y, mZantScale.z); + mDoMtx_stack_c::multVecZero(&mZantPos); + mpZantMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpZantMorf->modelCalc(); +} + +/* 805D951C-805D9A40 00E3DC 0524+00 1/1 0/0 0/0 .text cc_set__8daB_DS_cFv */ +void daB_DS_c::cc_set() { + static cXyz head_cc_dt[5] = { + cXyz(380.0f, 0.0f, 0.0f), cXyz(50.0f, -50.0f, 0.0f), cXyz(-300.0f, -70.0f, 0.0f), + cXyz(640.0f, 80.0f, 0.0f), cXyz(670.0f, -100.0f, 0.0f), + }; + + static f32 head_setRdt[5] = { + 300.0f, 350.0f, 270.0f, 190.0f, 190.0f, + }; + + J3DModel* model = mpMorf->getModel(); + cXyz center_base, center; + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HEAD)); + center_base.set(660.0f, -230.0f, 0.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + + mWeakSph.SetC(center); + mWeakSph.SetR(70.0f); + dComIfG_Ccsp()->Set(&mWeakSph); + + for (int i = 0; i < 5; i++) { + center_base = head_cc_dt[i]; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + f32 radius = head_setRdt[i]; + mHeadSph[i].SetC(center); + mHeadSph[i].SetR(radius); + dComIfG_Ccsp()->Set(&mHeadSph[i]); + } + + if (mBackboneLevel < 3) { + mDoMtx_stack_c::copy(model->getAnmMtx(mBackboneLevel)); + center_base.set(-20.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mBackboneCyl.SetC(center); + mBackboneCyl.SetH(400.0f); + mBackboneCyl.SetR(120.0f); + dComIfG_Ccsp()->Set(&mBackboneCyl); + } + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_BACKBONE4)); + mDoMtx_stack_c::multVecZero(&mBackbonePos); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HAND_L)); + mDoMtx_stack_c::multVecZero(&mHandPos[0]); + + if (mAction == ACT_OPENING_DEMO) { + center_base.set(500.0f, -100.0f, 180.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtLCyl.SetC(center); + mHandAtLCyl.SetH(300.0f); + mHandAtLCyl.SetR(440.0f); + } else { + center_base.set(400.0f, -100.0f, 100.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtLCyl.SetC(center); + mHandAtLCyl.SetH(300.0f); + mHandAtLCyl.SetR(500.0f); + } + + dComIfG_Ccsp()->Set(&mHandAtLCyl); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_LYUBI_C3)); + mDoMtx_stack_c::multVecZero(&mFingerPos[0]); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HAND_R)); + mDoMtx_stack_c::multVecZero(&mHandPos[1]); + + center_base.set(400.0f, -100.0f, -100.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtRCyl.SetC(center); + mHandAtRCyl.SetH(300.0f); + mHandAtRCyl.SetR(500.0f); + dComIfG_Ccsp()->Set(&mHandAtRCyl); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_RYUBI_C3)); + mDoMtx_stack_c::multVecZero(&mFingerPos[1]); +} + +/* 805D9A40-805D9B74 00E900 0134+00 1/1 0/0 0/0 .text cc_etc_set__8daB_DS_cFv */ +void daB_DS_c::cc_etc_set() { + static const struct { + int joint_no; + Vec center; + f32 radius; + } ETC_CC_DT[18] = { + {0, {2000.0f, 800.0f, 150.0f}, 200.0f}, {0, {1500.0f, 500.0f, 250.0f}, 550.0f}, + {0, {1000.0f, 200.0f, 150.0f}, 440.0f}, {4, {-220.0f, 0.0f, -250.0f}, 150.0f}, + {4, {0.0f, 0.0f, 750.0f}, 150.0f}, {29, {0.0f, -50.0f, 150.0f}, 150.0f}, + {11, {70.0f, 0.0f, 0.0f}, 170.0f}, {11, {-140.0f, -50.0f, -100.0f}, 120.0f}, + {11, {-310.0f, -70.0f, -180.0f}, 100.0f}, {10, {240.0f, 50.0f, 0.0f}, 80.0f}, + {10, {-100.0f, 100.0f, 250.0f}, 120.0f}, {9, {180.0f, 50.0f, -50.0f}, 110.0f}, + {11, {-100.0f, 200.0f, -100.0f}, 200.0f}, {10, {150.0f, 0.0f, 0.0f}, 200.0f}, + {10, {-150.0f, 0.0f, 0.0f}, 200.0f}, {30, {-100.0f, 200.0f, -100.0f}, 200.0f}, + {29, {150.0f, 0.0f, 0.0f}, 200.0f}, {29, {-150.0f, 0.0f, 0.0f}, 200.0f}, + }; + + static f32 etc_setRdt[18] = { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + }; + + if (health <= 1 || mBossPhase == 100) { + return; + } + + int last = 18; + int i = 0; + if (mAction == ACT_OPENING_DEMO) { + if (mMode == 3) { + last = 12; + } else { + return; + } + } else { + i = 12; + } + + J3DModel* model = mpMorf->getModel(); + for (; i < last; i++) { + mDoMtx_stack_c::copy(model->getAnmMtx(ETC_CC_DT[i].joint_no)); + cXyz center_base = ETC_CC_DT[i].center; + cXyz center; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mEtcSph[i].SetC(center); + mEtcSph[i].SetR(ETC_CC_DT[i].radius); + dComIfG_Ccsp()->Set(&mEtcSph[i]); + } +} + +/* 805D9B74-805D9CFC 00EA34 0188+00 1/1 0/0 0/0 .text mBattle2Action__8daB_DS_cFv */ +void daB_DS_c::mBattle2Action() { + mBattle2_spinner_damage_check(); + + switch (mAction) { + case ACT_B2_OPENING_DEMO: + executeBattle2OpeningDemo(); + break; + case ACT_B2_WAIT: + executeBattle2Wait(); + break; + case ACT_B2_F_MOVE: + executeBattle2FMove(); + break; + case ACT_B2_TIRED: + executeBattle2Tired(); + break; + case ACT_B2_DAMAGE: + executeBattle2Damage(); + break; + case ACT_B2_DEAD: + executeBattle2Dead(); + break; + } + + if (cLib_calcTimer(&mHintTimer2) != 0 && mHintTimer2 == 1) { + dComIfGs_onOneZoneSwitch(7, fopAcM_GetRoomNo(this)); + } + + mCreateTrap(false); + + if (BREG_S(7)) { + // "Where is process now? %d\n" + OS_REPORT("今ドコの処理? %d\n", mAction); + + // "Where is process now? %d\n\n" + OS_REPORT("今ドコの処理? %d\n\n", mMode); + } + + fopAcM_posMoveF(this, mCcStts.GetCCMoveP()); + + if (!mDead) { + mAcchCir.SetWall(200.0f, mWallR); + mAcch.SetGroundUpY(mGroundUpY); + mAcch.CrrPos(dComIfG_Bgsp()); + mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + + mpSwordBrkAnm->play(); + mpSwordMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + + if (mPlayPatternAnm) { + mpPatternBrkAnm->play(); + mpPatternBtkAnm->play(); + } +} + +/* 805D9CFC-805D9FF4 00EBBC 02F8+00 1/1 0/0 0/0 .text mBattle2_spinner_damage_check__8daB_DS_cFv + */ +void daB_DS_c::mBattle2_spinner_damage_check() { + if (cLib_calcTimer(&mDamageTimer) != 0 || mAnmID == ANM_HEAD_RETURN || + mAction == ACT_B2_DAMAGE || mAction == ACT_B2_DEAD || health < 1) + { + return; + } + + for (int i = 0; i < 18; i++) { + if (mEtcSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mEtcSph[i].GetTgHitObj(); + mSoundPos = *mEtcSph[i].GetTgHitPosP(); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mEtcSph[i].ClrTgHit(); + return; + } + } + + if (mAction == ACT_B2_OPENING_DEMO || mAction == ACT_B2_DAMAGE || mAction == ACT_B2_DEAD) { + return; + } + + daPy_getPlayerActorClass()->onBossRoomWait(); + + for (int i = 0; i < 5; i++) { + if (mHeadSph[i].ChkTgHit()) { + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + cXyz vec1 = mSwordPos - *mHeadSph[i].GetTgHitPosP(); + cXyz hit_pos = *mHeadSph[i].GetTgHitPosP(); + + mDamageTimer = 8; + + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec1.atan2sX_Z(); + hit_angle.z = 0; + + if (mHeadSph[i].GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_DMG_SPNR, -1); + mCreateFireBreath = false; + + def_se_set(&mSound, mAtInfo.mpCollider, 0x1f, NULL); + dComIfGp_setHitMark(3, this, &hit_pos, &hit_angle, NULL, 0); + Z2GetAudioMgr()->changeBgmStatus(2); + + field_0x790.set(0.0f, 0.0f, 0.0f); + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + setActionMode(ACT_B2_DAMAGE, 0); + } else { + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + } + + mHeadSph[i].ClrTgHit(); + } + } + + mCcStts.Move(); +} + +/* 805D9FF4-805DA584 00EEB4 0590+00 1/1 0/0 0/0 .text mBattle2_damage_check__8daB_DS_cFv + */ +bool daB_DS_c::mBattle2_damage_check() { + if (health < 1) { + return false; + } + + if (cLib_calcTimer(&mDamageTimer) != 0) { + return false; + } + + if (mWeakSph.ChkTgHit()) { + mAtInfo.mpCollider = mWeakSph.GetTgHitObj(); + cXyz vec1 = mSwordPos - *mWeakSph.GetTgHitPosP(); + cXyz hit_pos = *mWeakSph.GetTgHitPosP(); + mDamageTimer = 8; + + cc_at_check(this, &mAtInfo); + + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec1.atan2sX_Z(); + hit_angle.z = 0; + + if (health <= 1) { + dComIfGp_setHitMark(3, this, &eyePos, &hit_angle, NULL, 0); + mPlayPatternAnm = false; + mSoundPos = current.pos; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x20); + + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + + Z2GetAudioMgr()->bgmStop(0x1e, 0); + Z2GetAudioMgr()->bgmStreamPrepare(0x2000048); + Z2GetAudioMgr()->bgmStreamPlay(); + mSound.startCreatureVoice(Z2SE_EN_DS_END_V, -1); + + setBck(ANM_HEAD_DOWN_DAMAGE, 0, 3.0f, 1.0f); + setActionMode(ACT_B2_DEAD, 0); + return true; + } + + if (mWeakSph.GetTgHitObj()->ChkAtType(AT_TYPE_NORMAL_SWORD) || + mWeakSph.GetTgHitObj()->ChkAtType(AT_TYPE_8000)) + { + setBck(ANM_HEAD_DOWN_DAMAGE, 0, 3.0f, 1.0f); + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_DMG_SWD, -1); + + mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), + 1, 0, 1.0f, 0, -1); + + mpPatternBtkAnm->init( + mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), 1, 0, 1.0f, 0, + -1); + + mPlayPatternAnm = true; + mSoundPos = current.pos; + + if (mAtInfo.mHitStatus == 0) { + dComIfGp_setHitMark(1, this, &eyePos, &hit_angle, NULL, 0); + field_0x7d0 = 0x200; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1e); + } else { + dComIfGp_setHitMark(3, this, &eyePos, &hit_angle, NULL, 0); + field_0x7d0 = 0x400; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1f); + } + } else { + dComIfGp_setHitMark(2, this, &eyePos, &hit_angle, NULL, 0); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + } + + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 80)), 1, 1, + 1.0f, 0, -1); + + if (mCutTypeCheck()) { + mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), + 1, 0, 1.0f, 0, -1); + mpPatternBtkAnm->init( + mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), 1, 0, 1.0f, 0, + -1); + + mPlayPatternAnm = true; + mDamageTimer = 12; + mWeakSph.ClrTgHit(); + mWeakSph.OnTgStopNoConHit(); + return 0; + } + } + + mWeakSph.OffTgStopNoConHit(); + mCcStts.Move(); + return 0; +} + +/* 805DA584-805DA9A4 00F444 0420+00 1/1 0/0 0/0 .text mBattle2_mtx_set__8daB_DS_cFv */ +void daB_DS_c::mBattle2_mtx_set() { + cXyz vec1, vec2, vec3; + + J3DModel* model = mpMorf->getModel(); + if (!mDead) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::transM(field_0x790.x, field_0x790.y, field_0x790.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::ZXYrotM(field_0x7ae); + mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->modelCalc(); + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_HEAD_JNT_HEAD)); + mDoMtx_stack_c::multVecZero(&mHeadPos); + + if (mPlayPatternAnm) { + mDoMtx_stack_c::copy(model->getAnmMtx(DS_HEAD_JNT_HEAD)); + mpPatternModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_HEAD_JNT_HEAD)); + vec1.set(0.0f, 100.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec1, &mMouthPos); + } + + if (!mDead) { + mDoMtx_stack_c::copy(model->getAnmMtx(DS_HEAD_JNT_HEAD)); + vec1.set(590.0f, 175.0f, 0.0f); + mDoMtx_stack_c::transM(vec1.x, vec1.y, vec1.z); + mDoMtx_stack_c::YrotM(0x4000); + mDoMtx_stack_c::XrotM(7000); + mDoMtx_stack_c::scaleM(mSwordScale.x, mSwordScale.y, mSwordScale.z); + mDoMtx_stack_c::multVecZero(&mSwordPos); + } else { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(0.0f, -50.0f, 0.0f); + } + + mpSwordMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpSwordMorf->modelCalc(); + + vec1.set(0.0f, 30.0f, 80.0f); + mDoMtx_stack_c::multVec(&vec1, &eyePos); + + attention_info.position = eyePos; + attention_info.position.y += 100.0f; + + { + dBgS_LinChk lin_chk; + csXyz angle; + angle = shape_angle; + mDoMtx_YrotS(*calc_mtx, angle.y); + mDoMtx_XrotM(*calc_mtx, angle.x); + vec2.set(0.0f, 0.0f, 4000.0f); + MtxPosition(&vec2, &vec3); + field_0x6d0 = mMouthPos + vec3; + + lin_chk.Set(&mMouthPos, &field_0x6d0, this); + + if (dComIfG_Bgsp().LineCross(&lin_chk)) { + field_0x6d0 = lin_chk.i_GetCross(); + } + } + + if (mCreateFireBreath) { + mBattle2BreathFireSet(TYPE_BULLET_C); + } + + if (mAction == ACT_B2_F_MOVE && mMode >= 3 && mMode <= 4) { + mParticleKey2 = + dComIfGp_particle_set(mParticleKey2, 0x8bfa, ¤t.pos, &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(DS_HEAD_JNT_HEAD)); + } + } +} + +/* 805DA9A4-805DAA98 00F864 00F4+00 1/1 0/0 0/0 .text mBattle2_cc_etc_set__8daB_DS_cFv */ +void daB_DS_c::mBattle2_cc_etc_set() { + static const struct { + int joint_no; + Vec center; + f32 radius; + } B2_ETC_CC_DT[2] = { + {0, {60.0f, 300.0f, -120.0f}, 410.0f}, + {0, {-290.0f, 400.0f, -300.0f}, 100.0f}, + }; + + if (mAction == ACT_B2_OPENING_DEMO) { + J3DModel* model = mpMorf->getModel(); + for (int i = 0; i < 2; i++) { + mDoMtx_stack_c::copy(model->getAnmMtx(B2_ETC_CC_DT[i].joint_no)); + cXyz center_base = B2_ETC_CC_DT[i].center; + cXyz center; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mEtcSph[i].SetC(center); + mEtcSph[i].SetR(B2_ETC_CC_DT[i].radius); + dComIfG_Ccsp()->Set(&mEtcSph[i]); + } + } +} + +/* 805DAA98-805DADC4 00F958 032C+00 1/1 0/0 0/0 .text mBattle2_cc_set__8daB_DS_cFv */ +void daB_DS_c::mBattle2_cc_set() { + cXyz center_base; + cXyz center; + + static cXyz head2_cc_dt[5] = { + cXyz(380.0f, 0.0f, 0.0f), cXyz(-50.0f, 50.0f, 0.0f), cXyz(-400.0f, 130.0f, 0.0f), + cXyz(640.0f, 80.0f, 0.0f), cXyz(670.0f, -100.0f, 0.0f), + }; + + static f32 head2_setRdt[5] = { + 300.0f, 350.0f, 270.0f, 190.0f, 190.0f, + }; + + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(DS_HEAD_JNT_HEAD)); + + csXyz hit_angle; + cXyz delta_pos; + cXyz hit_pos; + + cLib_calcTimer(&mHitTimer); + + for (int i = 0; i < 5; i++) { + center_base.set(head2_cc_dt[i]); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + + f32 radius = head2_setRdt[i]; + mHeadSph[i].SetC(center); + mHeadSph[i].SetR(radius); + dComIfG_Ccsp()->Set(&mHeadSph[i]); + + if (mHeadSph[i].ChkTgHit()) { + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + mHeadSph[i].ClrTgHit(); + + if (mHitTimer == 0) { + delta_pos = current.pos - *mHeadSph[i].GetTgHitPosP(); + hit_pos = *mHeadSph[i].GetTgHitPosP(); + + hit_angle.x = 0; + hit_angle.y = delta_pos.atan2sX_Z(); + hit_angle.z = 0; + dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mHitTimer = 8; + } + } + } +} + +/* 805DADC4-805DB184 00FC84 03C0+00 1/1 0/0 0/0 .text execute__8daB_DS_cFv */ +// extra extsh +int daB_DS_c::execute() { + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + mBulletAction(); + return 1; + } else if (arg0 == TYPE_BATTLE_2) { + mBattle2Action(); + mBattle2_mtx_set(); + mBattle2_cc_set(); + mBattle2_cc_etc_set(); + return 1; + } + + action(); + + if (mBossPhase == 100) { + return 1; + } + + handR_ang = -4000; + handL_ang = -4000; + + mtx_set(); + + dBgS_GndChk gnd_chk; + cXyz jnt_pos, chk_pos; + + J3DModel* model = mpMorf->getModel(); + s8 var_r25; + int i = 0; + + if (!mIsOpeningDemo) { + s16 hand_x_ang_target = (s16)(mBackboneLevel * 1000) - 6000; + if (handX_ang > -4000) { + handX_ang = -4000; + } + + cLib_addCalcAngleS2(&handX_ang, hand_x_ang_target, 20, 0x100); + + // fake match? + while (true) { + var_r25 = false; + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HAND_L)); + mDoMtx_stack_c::multVecZero(&chk_pos); + jnt_pos = chk_pos; + + chk_pos.y += 3000.0f; + gnd_chk.SetPos(&chk_pos); + chk_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (chk_pos.y == -1000000000.0f) { + chk_pos.y = jnt_pos.y; + } + + if (jnt_pos.y < chk_pos.y) { + handL_ang += (s16)(fabsf(jnt_pos.y - chk_pos.y) * 10.0f); + var_r25 = true; + + if (field_0x84d & 1) { + if ((int)mpMorf->getFrame() >= 72 && (int)mpMorf->getFrame() < 79) { + hand_smokeSet(1); + field_0x84d ^= 1; + } + } + } + + mDoMtx_stack_c::copy(model->getAnmMtx(DS_JNT_HAND_R)); + mDoMtx_stack_c::multVecZero(&chk_pos); + jnt_pos = chk_pos; + + chk_pos.y += 3000.0f; + gnd_chk.SetPos(&chk_pos); + chk_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (chk_pos.y == -1000000000.0f) { + chk_pos.y = jnt_pos.y; + } + + if (jnt_pos.y < chk_pos.y) { + handR_ang += (s16)(fabsf(jnt_pos.y - chk_pos.y) * 10.0f); + var_r25 = true; + if (field_0x84d & 2) { + if ((int)mpMorf->getFrame() >= 34 && (int)mpMorf->getFrame() < 41) { + hand_smokeSet(2); + field_0x84d ^= 2; + } + } + } + + if (!var_r25) { + break; + } + + mpMorf->updateDL(); + + i++; + if (i > 10) { + break; + } + } + } else { + handL_ang = 0; + handR_ang = 0; + handX_ang = 0; + } + + if (mBossPhase == 0) { + neck_set(); + + if (BREG_S(7)) { + OS_REPORT("shape_angle.sx %x\n", shape_angle.x); + OS_REPORT("mHeadAngle.sx %x\n", mHeadAngle.x); + OS_REPORT("mHeadAngle.sy %x\n", mHeadAngle.y); + OS_REPORT("mHeadAngle.sz %x\n", mHeadAngle.z); + OS_REPORT("\n\n"); + } + } + + cc_set(); + cc_etc_set(); + return 1; +} + +/* 805DB184-805DB1A4 010044 0020+00 2/1 0/0 0/0 .text daB_DS_Execute__FP8daB_DS_c */ +static int daB_DS_Execute(daB_DS_c* i_this) { + return i_this->execute(); +} + +/* 805DB1A4-805DB1AC 010064 0008+00 1/0 0/0 0/0 .text daB_DS_IsDelete__FP8daB_DS_c */ +static int daB_DS_IsDelete(daB_DS_c* i_this) { + return 1; +} + +/* 805DB1AC-805DB244 01006C 0098+00 1/1 0/0 0/0 .text _delete__8daB_DS_cFv */ +int daB_DS_c::_delete() { + dComIfG_resDelete(&mPhase, "B_DS"); + + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + return 1; + } + + if (mHIOInit) { + hioInit = false; + } + + if (heap != NULL) { + mSound.deleteObject(); + } + + return 1; +} + +/* 805DB244-805DB264 010104 0020+00 1/0 0/0 0/0 .text daB_DS_Delete__FP8daB_DS_c */ +static int daB_DS_Delete(daB_DS_c* i_this) { + return i_this->_delete(); +} + +/* 805DB264-805DB90C 010124 06A8+00 1/1 0/0 0/0 .text CreateHeap__8daB_DS_cFv */ +int daB_DS_c::CreateHeap() { + if (arg0 == TYPE_BATTLE_1) { + if (dComIfGs_isZoneSwitch(6, fopAcM_GetRoomNo(this)) && + dComIfGs_isZoneSwitch(7, fopAcM_GetRoomNo(this))) + { + arg0 = TYPE_BATTLE_2; + home.pos.set(0.0f, 1900.0f, 0.0f); + current.pos.set(0.0f, 1900.0f, 0.0f); + } + + if (BREG_S(9)) { + arg0 = TYPE_BATTLE_2; + home.pos.set(0.0f, 1900.0f, 0.0f); + current.pos.set(0.0f, 1900.0f, 0.0f); + + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + + fopAcM_SetGroup(this, 2); + fopAcM_OnStatus(this, 0); + } + } + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("B_DS", 70)); + + int anm_res = ANM_WAIT01_A; + if (arg0 == TYPE_BATTLE_2) { + modelData = static_cast(dComIfG_getObjectRes("B_DS", 71)); + anm_res = ANM_HEAD_FWAIT; + } + + JUT_ASSERT(modelData != 0); + + mpMorf = new mDoExt_McaMorfSO( + modelData, NULL, NULL, static_cast(dComIfG_getObjectRes("B_DS", anm_res)), + 0, 1.0f, 0, -1, &mSound, 0, 0x11000084); + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return 0; + } + + model = mpMorf->getModel(); + model->setUserArea((u32)this); + for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) { + if (i != 0) { + model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); + } + } + + modelData = (J3DModelData*)dComIfG_getObjectRes("B_DS", 74); + JUT_ASSERT(modelData != 0); + + mpSwordMorf = new mDoExt_McaMorfSO( + modelData, NULL, NULL, static_cast(dComIfG_getObjectRes("B_DS", 63)), 0, + 1.0f, 0, -1, NULL, 0, 0x11000084); + if (mpSwordMorf == NULL || mpSwordMorf->getModel() == NULL) { + return 0; + } + + mpSwordBrkAnm = new mDoExt_brkAnm(); + if (mpSwordBrkAnm == NULL) { + return 0; + } + + if (!mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 81)), 1, 0, + 1.0f, 0, -1)) + { + return 0; + } + + modelData = (J3DModelData*)dComIfG_getObjectRes("B_DS", 75); + JUT_ASSERT(modelData != 0); + + mpZantMorf = new mDoExt_McaMorfSO( + modelData, NULL, NULL, static_cast(dComIfG_getObjectRes("B_DS", 66)), 2, + 1.0f, 0, -1, NULL, 0, 0x11000084); + if (mpZantMorf == NULL || mpZantMorf->getModel() == NULL) { + return 0; + } + + modelData = static_cast(dComIfG_getObjectRes("B_DS", 73)); + JUT_ASSERT(modelData != 0); + + mpOpPatternModel = mDoExt_J3DModel__create(modelData, 0, 0x11000284); + if (mpOpPatternModel == NULL) { + return 0; + } + + mpOpPatternBrkAnm = new mDoExt_brkAnm(); + if (mpOpPatternBrkAnm == NULL) { + return 0; + } + + if (!mpOpPatternBrkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 79)), 1, + 0, 1.0f, 0, -1)) + { + return 0; + } + + mpOpPatternBtkAnm = new mDoExt_btkAnm(); + if (mpOpPatternBtkAnm == NULL) { + return 0; + } + + if (!mpOpPatternBtkAnm->init( + mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 85)), 1, 2, 1.0f, 0, -1)) + { + return 0; + } + + modelData = static_cast(dComIfG_getObjectRes("B_DS", 72)); + JUT_ASSERT(modelData != 0); + + mpPatternModel = mDoExt_J3DModel__create(modelData, 0, 0x11000284); + if (mpPatternModel == NULL) { + return 0; + } + + mpPatternBrkAnm = new mDoExt_brkAnm(); + if (mpPatternBrkAnm == NULL) { + return 0; + } + + if (!mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), 1, + 0, 1.0f, 0, -1)) + { + return 0; + } + + mpPatternBtkAnm = new mDoExt_btkAnm(); + if (mpPatternBtkAnm == NULL) { + return 0; + } + + if (!mpPatternBtkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), + 1, 2, 1.0f, 0, -1)) + { + return 0; + } + + return 1; +} + +/* 805DB954-805DB974 010814 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ +static int useHeapInit(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); +} + +/* 805DB974-805DC1E8 010834 0874+00 1/1 0/0 0/0 .text create__8daB_DS_cFv */ +cPhs__Step daB_DS_c::create() { + fopAcM_SetupActor(this, daB_DS_c); + + cPhs__Step phase_state = (cPhs__Step)dComIfG_resLoad(&mPhase, "B_DS"); + if (phase_state == cPhs_COMPLEATE_e) { + if (arg0 == TYPE_BATTLE_1 && dComIfGs_isStageBossEnemy()) { + // "After B_DS defeated, so not re-setting\n" + OS_REPORT("B_DS やられ後なので再セットしません\n"); + + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + g_env_light.mColpatPrevGather = 4; + g_env_light.mColpatCurrGather = 4; + g_env_light.mColPatBlendGather = 1.0f; + + if (!dComIfGs_isStageLife()) { + cXyz scale(1.0f, 1.0f, 1.0f); + cXyz pos; + csXyz angle; + angle.x = angle.y = angle.z = 0; + pos.set(-400.0f, 1775.0f, -4132.0f); + + fopAcM_createItemForBoss(&pos, UTAWA_HEART, fopAcM_GetRoomNo(this), &angle, &scale, + 0.0f, 0.0f, -1); + } + + return cPhs_ERROR_e; + } + + arg0 = fopAcM_GetParamBit(this, 0, 8); + bitSw = fopAcM_GetParamBit(this, 8, 8); + bitSw2 = fopAcM_GetParamBit(this, 16, 8); + bitSw3 = fopAcM_GetParamBit(this, 24, 8); + + if (arg0 == 0xFF) { + arg0 = TYPE_BATTLE_1; + } + + if (arg0 == TYPE_BATTLE_1 || arg0 == TYPE_BATTLE_2) { + OS_REPORT("\n\n"); + OS_REPORT("fopAcM_GetParam(this) %x\n", fopAcM_GetParam(this)); + OS_REPORT("arg0 %d\n", arg0); + OS_REPORT("bitSw %d\n", bitSw); + OS_REPORT("bitSw2 %d\n", bitSw2); + OS_REPORT("bitSw3 %d\n", bitSw3); + OS_REPORT("\n\n"); + } + + if (arg0 == TYPE_BULLET_A || arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + + mCcStts.Init(0xff, 0, this); + gravity = 0.0f; + mBreathAtSph.Set(cc_ds_breath_at_src); + mBreathAtSph.SetStts(&mCcStts); + + fopAcM_OffStatus(this, 0); + attention_info.flags &= ~4; + + if (arg0 == TYPE_BULLET_B || arg0 == TYPE_BULLET_C) { + mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, + &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); + mAcch.CrrPos(dComIfG_Bgsp()); + fopAcM_OnStatus(this, 0x4000); + } + + setActionMode(8, 0); + } else { + if (arg0 != TYPE_BULLET_A && arg0 != TYPE_BULLET_B && arg0 != TYPE_BULLET_C && + !fopAcM_entrySolidHeap(this, useHeapInit, 0xfac0)) + { + return cPhs_ERROR_e; + } + + OS_REPORT("B_DS PARAM %x\n", fopAcM_GetParam(this)); + + field_0x560 = health = l_HIO.mP2Health; + + if (!hioInit) { + hioInit = 1; + mHIOInit = true; + l_HIO.field_0x04 = -1; + } + + shape_angle.z = 0; + shape_angle.x = 0; + shape_angle.y = current.angle.y; + + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + + fopAcM_SetMtx(this, mpMorf->mpModel->getBaseTRMtx()); + fopAcM_SetMin(this, -40000.0f, -40000.0f, -40000.0f); + fopAcM_SetMax(this, 40000.0f, 40000.0f, 40000.0f); + + mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, + fopAcM_GetSpeed_p(this), NULL, NULL); + mCcStts.Init(0xff, 0, this); + mWeakSph.Set(cc_ds_week_src); + mWeakSph.SetStts(&mCcStts); + + { + dBgS_GndChk gnd_chk; + cXyz chk_pos = current.pos; + chk_pos.y += 800.0f; + gnd_chk.SetPos(&chk_pos); + + chk_pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (chk_pos.y != -1000000000.0f) { + current.pos.y = chk_pos.y; + } + } + + for (int i = 0; i < 5; i++) { + mHeadSph[i].Set(cc_ds_head_src); + mHeadSph[i].SetStts(&mCcStts); + } + + for (int i = 0; i < 18; i++) { + mEtcSph[i].Set(cc_ds_head_src); + mEtcSph[i].SetStts(&mCcStts); + } + + mWallR = 500.0f; + + mBackboneCyl.Set(cc_ds_backbone_src); + mBackboneCyl.SetStts(&mCcStts); + + mHandAtLCyl.Set(cc_ds_hand_at_cyl_src); + mHandAtLCyl.SetStts(&mCcStts); + + mHandAtRCyl.Set(cc_ds_hand_at_cyl_src); + mHandAtRCyl.SetStts(&mCcStts); + + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + + mHandAtLCyl.OnTgShield(); + mHandAtRCyl.OnTgShield(); + + mSoundPos = current.pos; + mSound.init(&mSoundPos, &eyePos, 3, 1); + mAtInfo.mpSound = &mSound; + mAtInfo.mPowerType = 11; + + mSwordPos = current.pos; + for (int i = 0; i < 2; i++) { + mHandPos[i] = current.pos; + } + + for (int i = 0; i < 3; i++) { + mBackboneCrackAlpha[i] = 255.0f; + } + + mEyeColorAlpha = 255.0f; + mCrackAlpha = 0.0f; + mpSwordMorf->setStartFrame(379.0f); + + mZantScale.set(0.0f, 0.0f, 0.0f); + mSwordScale.set(1.0f, 1.0f, 1.0f); + + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + onWolfNoLock(); + + mHintTimer1 = l_HIO.mHintTime1; + mHintTimer2 = l_HIO.mHintTime1; + + if (arg0 == TYPE_BATTLE_1) { + gravity = -1.0f; + + if (bitSw != 0xff) { + fopAcM_onSwitch(this, bitSw); + } + + fopAcM_OnStatus(this, 0x4000); + + if (cDmr_SkipInfo == 0 && !dComIfGs_isZoneSwitch(5, fopAcM_GetRoomNo(this))) { + mDrawZant = false; + mNoDrawSword = true; + + dComIfGs_offZoneSwitch(8, fopAcM_GetRoomNo(this)); + mIsOpeningDemo = true; + + mEyeColorAlpha = 0.0f; + mCrackAlpha = 255.0f; + + if (bitSw != 0xFF) { + fopAcM_offSwitch(this, bitSw); + } + + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + + if (!dComIfGs_isZoneSwitch(0, fopAcM_GetRoomNo(this))) { + setActionMode(ACT_OPENING_DEMO, 0); + } else { + setActionMode(ACT_OPENING_DEMO, 3); + } + + setBck(ANM_OPDEMO, 0, 1.0f, 0.0f); + } else { + cDmr_SkipInfo = 0; + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + } + + if (bitSw3 != 0xFF) { + fopAcM_offSwitch(this, bitSw3); + } + + if (mAction != ACT_OPENING_DEMO) { + field_0x7f8 = 0.5f; + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL01, 0, 0); + dKy_change_colpat(1); + mCreateTrap(true); + setActionMode(ACT_WAIT, 0); + } + } else { + mChangeVer2(); + gravity = -1.0f; + + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + + shape_angle.y = -0x500A; + mEyeColorAlpha = 0.0f; + current.pos.set(345.0f, -1375.0f, -1040.0f); + shape_angle.y = 20000; + shape_angle.z = -15000; + + setActionMode(ACT_B2_OPENING_DEMO, 0); + } + } + + daB_DS_Execute(this); + } + + return phase_state; +} + +/* 805DC1E8-805DC4CC 0110A8 02E4+00 1/1 0/0 0/0 .text __ct__8daB_DS_cFv */ +daB_DS_c::daB_DS_c() {} + +/* 805DC834-805DC854 0116F4 0020+00 1/0 0/0 0/0 .text daB_DS_Create__FP8daB_DS_c */ +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +static asm void daB_DS_Create(daB_DS_c* param_0) { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Create__FP8daB_DS_c.s" +} +#pragma pop + +#pragma nosyminline on + +/* ############################################################################################## */ +/* 805DE2AC-805DE2B0 000844 0004+00 0/0 0/0 0/0 .bss + * sInstance__40JASGlobalInstance<19JASDefaultBankTable> */ +#pragma push +#pragma force_active on +static u8 data_805DE2AC[4]; +#pragma pop + +/* 805DE2B0-805DE2B4 000848 0004+00 0/0 0/0 0/0 .bss + * sInstance__35JASGlobalInstance<14JASAudioThread> */ +#pragma push +#pragma force_active on +static u8 data_805DE2B0[4]; +#pragma pop + +/* 805DE2B4-805DE2B8 00084C 0004+00 0/0 0/0 0/0 .bss sInstance__27JASGlobalInstance<7Z2SeMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2B4[4]; +#pragma pop + +/* 805DE2B8-805DE2BC 000850 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8Z2SeqMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2B8[4]; +#pragma pop + +/* 805DE2BC-805DE2C0 000854 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SceneMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2BC[4]; +#pragma pop + +/* 805DE2C0-805DE2C4 000858 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2StatusMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2C0[4]; +#pragma pop + +/* 805DE2C4-805DE2C8 00085C 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2DebugSys> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2C4[4]; +#pragma pop + +/* 805DE2C8-805DE2CC 000860 0004+00 0/0 0/0 0/0 .bss + * sInstance__36JASGlobalInstance<15JAISoundStarter> */ +#pragma push +#pragma force_active on +static u8 data_805DE2C8[4]; +#pragma pop + +/* 805DE2CC-805DE2D0 000864 0004+00 0/0 0/0 0/0 .bss + * sInstance__35JASGlobalInstance<14Z2SoundStarter> */ +#pragma push +#pragma force_active on +static u8 data_805DE2CC[4]; +#pragma pop + +/* 805DE2D0-805DE2D4 000868 0004+00 0/0 0/0 0/0 .bss + * sInstance__33JASGlobalInstance<12Z2SpeechMgr2> */ +#pragma push +#pragma force_active on +static u8 data_805DE2D0[4]; +#pragma pop + +/* 805DE2D4-805DE2D8 00086C 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8JAISeMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2D4[4]; +#pragma pop + +/* 805DE2D8-805DE2DC 000870 0004+00 0/0 0/0 0/0 .bss sInstance__29JASGlobalInstance<9JAISeqMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2D8[4]; +#pragma pop + +/* 805DE2DC-805DE2E0 000874 0004+00 0/0 0/0 0/0 .bss + * sInstance__33JASGlobalInstance<12JAIStreamMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2DC[4]; +#pragma pop + +/* 805DE2E0-805DE2E4 000878 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SoundMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2E0[4]; +#pragma pop + +/* 805DE2E4-805DE2E8 00087C 0004+00 0/0 0/0 0/0 .bss + * sInstance__33JASGlobalInstance<12JAISoundInfo> */ +#pragma push +#pragma force_active on +static u8 data_805DE2E4[4]; +#pragma pop + +/* 805DE2E8-805DE2EC 000880 0004+00 0/0 0/0 0/0 .bss + * sInstance__34JASGlobalInstance<13JAUSoundTable> */ +#pragma push +#pragma force_active on +static u8 data_805DE2E8[4]; +#pragma pop + +/* 805DE2EC-805DE2F0 000884 0004+00 0/0 0/0 0/0 .bss + * sInstance__38JASGlobalInstance<17JAUSoundNameTable> */ +#pragma push +#pragma force_active on +static u8 data_805DE2EC[4]; +#pragma pop + +/* 805DE2F0-805DE2F4 000888 0004+00 0/0 0/0 0/0 .bss + * sInstance__33JASGlobalInstance<12JAUSoundInfo> */ +#pragma push +#pragma force_active on +static u8 data_805DE2F0[4]; +#pragma pop + +/* 805DE2F4-805DE2F8 00088C 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SoundInfo> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2F4[4]; +#pragma pop + +/* 805DE2F8-805DE2FC 000890 0004+00 0/0 0/0 0/0 .bss + * sInstance__34JASGlobalInstance<13Z2SoundObjMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE2F8[4]; +#pragma pop + +/* 805DE2FC-805DE300 000894 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2Audience> + */ +#pragma push +#pragma force_active on +static u8 data_805DE2FC[4]; +#pragma pop + +/* 805DE300-805DE304 000898 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2FxLineMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE300[4]; +#pragma pop + +/* 805DE304-805DE308 00089C 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2EnvSeMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE304[4]; +#pragma pop + +/* 805DE308-805DE30C 0008A0 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SpeechMgr> + */ +#pragma push +#pragma force_active on +static u8 data_805DE308[4]; +#pragma pop + +/* 805DE30C-805DE310 0008A4 0004+00 0/0 0/0 0/0 .bss + * sInstance__34JASGlobalInstance<13Z2WolfHowlMgr> */ +#pragma push +#pragma force_active on +static u8 data_805DE30C[4]; +#pragma pop + +/* 805DD994-805DD9B4 -00001 0020+00 1/0 0/0 0/0 .data l_daB_DS_Method */ +static actor_method_class l_daB_DS_Method = { + (process_method_func)daB_DS_Create, (process_method_func)daB_DS_Delete, + (process_method_func)daB_DS_Execute, (process_method_func)daB_DS_IsDelete, + (process_method_func)daB_DS_Draw, +}; + +/* 805DD9B4-805DD9E4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_DS */ +extern actor_process_profile_definition g_profile_B_DS = { + fpcLy_CURRENT_e, + 4, + fpcPi_CURRENT_e, + PROC_B_DS, + &g_fpcLf_Method.mBase, + sizeof(daB_DS_c), + 0, + 0, + &g_fopAc_Method.base, + 0xDC, + &l_daB_DS_Method, + 0x4040000, + fopAc_ENEMY_e, + fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 6bf2b131b69..29d62e305ff 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -1668,10 +1668,10 @@ s32 fopAcM_createDemoItem(const cXyz* i_pos, int i_itemNo, int i_itemBitNo, cons /* 8001C0D4-8001C174 016A14 00A0+00 0/0 0/0 18/18 .text * fopAcM_createItemForBoss__FPC4cXyziiPC5csXyzPC4cXyzffi */ -s32 fopAcM_createItemForBoss(const cXyz* i_pos, int param_2, int i_roomNo, const csXyz* i_angle, +s32 fopAcM_createItemForBoss(const cXyz* i_pos, int i_itemNo, int i_roomNo, const csXyz* i_angle, const cXyz* i_scale, f32 speedF, f32 speedY, int param_8) { fopAc_ac_c* actor = (fopAc_ac_c*)fopAcM_fastCreate( - PROC_Obj_LifeContainer, 0xFFFF0000 | param_8 << 0x8 | (param_2 & 0xFF), i_pos, i_roomNo, + PROC_Obj_LifeContainer, 0xFFFF0000 | param_8 << 0x8 | (i_itemNo & 0xFF), i_pos, i_roomNo, i_angle, i_scale, -1, NULL, NULL); if (actor != NULL) { actor->speedF = speedF;