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