/** * @file d_a_e_dt.cpp * */ #include "d/dolzel_rel.h" #include "d/actor/d_a_e_dt.h" #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "SSystem/SComponent/c_math.h" #include "Z2AudioLib/Z2Instances.h" #include "c/c_damagereaction.h" #include "d/actor/d_a_e_ot.h" #include "d/actor/d_a_obj_amiShutter.h" #include "d/actor/d_a_player.h" #include "d/d_camera.h" #include "d/d_com_inf_game.h" #include "d/d_bomb.h" #include "f_op/f_op_actor_mng.h" #include "f_op/f_op_camera_mng.h" #include "m_Do/m_Do_graphic.h" #include "m_Do/m_Do_lib.h" class daE_DT_HIO_c { public: /* 806AD90C */ daE_DT_HIO_c(); /* 806B5BDC */ virtual ~daE_DT_HIO_c() {} /* 0x04 */ s8 field_0x4; /* 0x08 */ f32 mScale; /* 0x0C */ f32 mWalkSpeed; /* 0x10 */ f32 field_0x10; /* 0x14 */ f32 field_0x14; /* 0x18 */ f32 field_0x18; /* 0x1C */ f32 mStunTimer; /* 0x20 */ f32 mPressTimer; /* 0x24 */ f32 mMaxFallSpeed; /* 0x28 */ f32 field_0x28; /* 0x2C */ f32 field_0x2c; }; enum Action { /* 0x0 */ ACT_WAIT, /* 0x1 */ ACT_CRY, /* 0x2 */ ACT_SHAKE, /* 0x3 */ ACT_WALK, /* 0x4 */ ACT_JUMP, /* 0x5 */ ACT_DOWN, /* 0x6 */ ACT_SEARCH, /* 0x7 */ ACT_DAMAGE, /* 0x8 */ ACT_BOMB_DAMAGE, /* 0x9 */ ACT_DEATH, /* 0xA */ ACT_OPENING, }; enum Animation { /* 0x04 */ ANM_CROAK = 4, /* 0x05 */ ANM_CROAK_DAMAGE, /* 0x06 */ ANM_DEAD, /* 0x07 */ ANM_DOWN_DAMAGE, /* 0x08 */ ANM_DOWN_DAMAGE_2, /* 0x09 */ ANM_DOWN_RETURN, /* 0x0A */ ANM_DOWN_RETURN_2, /* 0x0B */ ANM_DOWN_WAIT, /* 0x0C */ ANM_JUMP_END, /* 0x0D */ ANM_JUMP_START, /* 0x0E */ ANM_JUMP_TOP, /* 0x0F */ ANM_KYORO_2, /* 0x10 */ ANM_OP_DEMO, /* 0x11 */ ANM_OP_DEMO_FALL, /* 0x12 */ ANM_OP_DEMO_SWING, /* 0x13 */ ANM_OP_DEMO_WAIT, /* 0x14 */ ANM_SMALL_DAMAGE, /* 0x15 */ ANM_STEP, /* 0x16 */ ANM_SWING, /* 0x17 */ ANM_WAIT_01, /* 0x18 */ ANM_WALK_01, /* 0x19 */ ANM_WALK_02, }; enum Joint { /* 0x00 */ JNT_WORLD_ROOT, /* 0x01 */ JNT_BACKBONE_1, /* 0x02 */ JNT_BACKBONE_2, /* 0x03 */ JNT_ARM_L1, /* 0x04 */ JNT_ARM_L2, /* 0x05 */ JNT_HAND_L, /* 0x06 */ JNT_FINGER_L, /* 0x07 */ JNT_ARM_R1, /* 0x08 */ JNT_ARM_R2, /* 0x09 */ JNT_HAND_R, /* 0x0A */ JNT_FINGER_R, /* 0x0B */ JNT_HEAD, /* 0x0C */ JNT_ANTENNA_L1, /* 0x0D */ JNT_ANTENNA_L2, /* 0x0E */ JNT_ANTENNA_L3, /* 0x0F */ JNT_ANTENNA_L4, /* 0x10 */ JNT_ANTENNA_L5, /* 0x11 */ JNT_ANTENNA_R1, /* 0x12 */ JNT_ANTENNA_R2, /* 0x13 */ JNT_ANTENNA_R3, /* 0x14 */ JNT_ANTENNA_R4, /* 0x15 */ JNT_ANTENNA_R5, /* 0x16 */ JNT_CHEEK, /* 0x17 */ JNT_CHIN_1, /* 0x18 */ JNT_CHIN_2, /* 0x19 */ JNT_THROAT_1, /* 0x1A */ JNT_TONGUE_1, /* 0x1B */ JNT_TONGUE_2, /* 0x1C */ JNT_TONGUE_3, /* 0x1D */ JNT_TONGUE_4, /* 0x1E */ JNT_TONGUE_5, /* 0x1F */ JNT_BELLY_1, /* 0x20 */ JNT_WAIST, /* 0x21 */ JNT_LEG_L1, /* 0x22 */ JNT_LEG_L2, /* 0x23 */ JNT_FOOT_L1, /* 0x24 */ JNT_FOOT_L2, /* 0x25 */ JNT_LEG_R1, /* 0x26 */ JNT_LEG_R2, /* 0x27 */ JNT_FOOT_R1, /* 0x28 */ JNT_FOOT_R2, /* 0x29 */ JNT_TAIL_1, /* 0x2A */ JNT_TAIL_2, }; /* 806B5EEC-806B5F14 000000 0028+00 1/1 0/0 0/0 .data eDt_ShakeFrame__6E_DT_n */ f32 E_DT_n::eDt_ShakeFrame[10] = { 20.0f, 22.0f, 24.0f, 26.0f, 28.0f, 30.0f, 32.0f, 34.0f, 36.0f, 38.0f, }; /* 806B5F14-806B5F3C 000028 0028+00 1/1 0/0 0/0 .data eDt_ShakeFrameDemo__6E_DT_n */ f32 E_DT_n::eDt_ShakeFrameDemo[10] = { 310.0f, 312.0f, 314.0f, 316.0f, 318.0f, 320.0f, 322.0f, 324.0f, 326.0f, 328.0f, }; /* 806B5F3C-806B5F7C 000050 0040+00 1/1 0/0 0/0 .data cc_dt_body_src__6E_DT_n */ dCcD_SrcSph E_DT_n::cc_dt_body_src = { { {0x0, {{AT_TYPE_CSTATUE_SWING, 0x1, 0x0}, {0xd8fbfdff, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x5}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 806B5F7C-806B5FBC 000090 0040+00 1/1 0/0 0/0 .data cc_dt_tongue_src__6E_DT_n */ dCcD_SrcSph E_DT_n::cc_dt_tongue_src = { { {0x0, {{AT_TYPE_CSTATUE_SWING, 0x1, 0x0}, {0xd8fbfdff, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 806B629C-806B62A0 -00001 0004+00 2/2 0/0 0/0 .bss None */ /* 806B629D 0003+00 data_806B629D None */ static bool hioInit; /* 806B62AC-806B62DC 000054 0030+00 7/8 0/0 0/0 .bss l_HIO */ static daE_DT_HIO_c l_HIO; /* 806AD90C-806AD97C 0000EC 0070+00 1/1 0/0 0/0 .text __ct__12daE_DT_HIO_cFv */ daE_DT_HIO_c::daE_DT_HIO_c() { field_0x4 = -1; mScale = 1.5f; mWalkSpeed = 8.0f; field_0x10 = 170.0f; field_0x14 = 1536.0f; field_0x2c = 25.0f; field_0x18 = 3.0f; mStunTimer = 300.0f; mPressTimer = 120.0f; mMaxFallSpeed = -55.0f; field_0x28 = 105.0f; } /* 806AD97C-806ADBA0 00015C 0224+00 2/1 0/0 0/0 .text ctrlJoint__8daE_DT_cFP8J3DJointP8J3DModel */ int daE_DT_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { u16 jnt_no = i_joint->getJntNo(); mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); f32 scl = field_0x748 * cM_ssin(field_0x74c) + 1.0f; s16 ang1 = field_0x74e * cM_ssin(field_0x750); s16 ang2 = field_0x752 * cM_ssin(field_0x754); switch (jnt_no) { case JNT_BACKBONE_1: mDoMtx_stack_c::scaleM(1.0f, scl, 1.0f); mDoMtx_stack_c::scaleM(1.0f, 1.0f, scl); break; case JNT_BACKBONE_2: mDoMtx_stack_c::scaleM(1.0f, 1.0f / scl, 1.0f); mDoMtx_stack_c::scaleM(1.0f, 1.0f, 1.0f / scl); break; case JNT_LEG_L1: mDoMtx_stack_c::YrotM(ang1); break; case JNT_LEG_L2: mDoMtx_stack_c::YrotM(-ang1); break; case JNT_LEG_R1: mDoMtx_stack_c::YrotM(ang2); break; case JNT_LEG_R2: mDoMtx_stack_c::YrotM(-ang2); break; case JNT_TONGUE_4: mDoMtx_stack_c::ZrotM(field_0x734); break; case JNT_HEAD: mDoMtx_stack_c::YrotM(field_0x744); mDoMtx_stack_c::ZrotM(field_0x742); break; } i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); return 1; } /* 806ADBA0-806ADBEC 000380 004C+00 1/1 0/0 0/0 .text JointCallBack__8daE_DT_cFP8J3DJointi */ int daE_DT_c::JointCallBack(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { J3DModel* model = j3dSys.getModel(); daE_DT_c* _this = (daE_DT_c*)model->getUserArea(); if (_this != NULL) { _this->ctrlJoint(i_joint, model); } } return 1; } /* 806ADBEC-806ADD30 0003CC 0144+00 1/1 0/0 0/0 .text * ctrlJointTuba__8daE_DT_cFP8J3DJointP8J3DModel */ int daE_DT_c::ctrlJointTuba(J3DJoint* i_joint, J3DModel* i_model) { u16 jnt_no = i_joint->getJntNo(); mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); switch (jnt_no) { case 0: break; case 1: mDoMtx_stack_c::YrotM(mSpitAngle[1].x - mSpitAngle[0].x); mDoMtx_stack_c::ZrotM(mSpitAngle[1].z); mDoMtx_stack_c::scaleM(mSpitScaleX, 1.0f / mSpitScale[0], 1.0f / mSpitScale[0]); mDoMtx_stack_c::scaleM(mSpitScaleX, mSpitScale[1], mSpitScale[1]); break; case 2: mDoMtx_stack_c::YrotM(mSpitAngle[2].x - mSpitAngle[1].x); mDoMtx_stack_c::scaleM(1.0f, 1.0f / mSpitScale[1], 1.0f / mSpitScale[1]); mDoMtx_stack_c::scaleM(1.0f, mSpitScale[2], mSpitScale[2]); break; } i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); return 1; } /* 806ADD30-806ADD7C 000510 004C+00 1/1 0/0 0/0 .text JointCallBackTuba__8daE_DT_cFP8J3DJointi */ int daE_DT_c::JointCallBackTuba(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { J3DModel* model = j3dSys.getModel(); daE_DT_c* _this = (daE_DT_c*)model->getUserArea(); if (_this != NULL) { _this->ctrlJointTuba(i_joint, model); } } return 1; } /* 806ADD7C-806AE56C 00055C 07F0+00 1/1 0/0 0/0 .text draw__8daE_DT_cFv */ int daE_DT_c::draw() { g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); if (mChestMode != 0) { g_env_light.setLightTevColorType_MAJI(mpSpitModel, &tevStr); J3DModelData* model_data = mpSpitModel->getModelData(); J3DMaterial* material0 = model_data->getMaterialNodePointer(0); material0->getTevColor(1)->r = 24.0f - mSpitFade[0] * 18.0f; material0->getTevColor(1)->g = 8.0f - mSpitFade[0] * 6.0f; material0->getTevColor(2)->r = 8.0f - mSpitFade[0] * 6.0f; material0->getTevColor(2)->g = 24.0f - mSpitFade[0] * 18.0f; material0->getTevKColor(3)->a = mSpitFade[0] * 255.0f; J3DMaterial* material1 = model_data->getMaterialNodePointer(1); material1->getTevColor(1)->r = 16.0f - mSpitFade[0] * 10.0f; material1->getTevColor(1)->g = 8.0f - mSpitFade[0] * 8.0f; material1->getTevColor(2)->r = 16.0f - mSpitFade[0] * 12.0f; material1->getTevColor(2)->g = 24.0f - mSpitFade[0] * 16.0f; if (mSpitFade[0] == 1.0f) { material1->setMaterialMode(1); material1->setZCompLoc(GX_TRUE); material1->getZMode()->setUpdateEnable(GX_TRUE); material1->getBlend()->setType(0); } else { material1->getZMode()->setUpdateEnable(GX_FALSE); material1->setZCompLoc(GX_FALSE); material1->setMaterialMode(4); material1->getBlend()->setType(1); } material1->getTevKColor(3)->a = mSpitFade[0] * 255.0f; fopAcM_setEffectMtx(this, model_data); mDoExt_modelUpdateDL(mpSpitModel); g_env_light.setLightTevColorType_MAJI(mpSpitBModel, &tevStr); model_data = mpSpitBModel->getModelData(); for (u16 i = 0; i < model_data->getMaterialNum(); i++) { J3DMaterial* material = model_data->getMaterialNodePointer(i); material->getTevColor(0)->r = mSpitFade[i + 1] * -20.0f; material->getTevColor(0)->g = mSpitFade[i + 1] * -30.0f; material->getTevColor(0)->b = mSpitFade[i + 1] * -10.0f; material->getTevKColor(3)->a = mSpitFade[i + 1] * 255.0f; } fopAcM_setEffectMtx(this, model_data); mDoExt_modelUpdateDL(mpSpitBModel); } if (mDead == 2) { return 1; } J3DModel* model = mpMorf->getModel(); g_env_light.setLightTevColorType_MAJI(model, &tevStr); if (field_0x72c) { J3DModelData* model_data = model->getModelData(); for (u16 i = 0; i < model_data->getMaterialNum(); i++) { J3DMaterial* material = model_data->getMaterialNodePointer(i); material->getTevColor(0)->r = field_0x72c; material->getTevColor(0)->g = field_0x72c; material->getTevColor(0)->b = field_0x72c; } } fopAcM_setEffectMtx(this, model->getModelData()); mpMorf->entryDL(); cXyz pos; pos.set(current.pos.x, current.pos.y + 100.0f, current.pos.z); tevStr.mLightPosWorld = current.pos; tevStr.mLightPosWorld.y += 1000.0f; f32 tmp = 2000.0f - current.pos.y; if (tmp < 0.0f) { tmp = 0.0f; } tevStr.field_0x344 = l_HIO.field_0x18 * tmp / 2000.0f; if (tevStr.field_0x344 >= 1.0f) { tevStr.field_0x344 = 1.0f; } mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &pos, 4000.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); cXyz unused = current.pos; unused.y += 100.0f; if (mChestMode != 0) { g_env_light.settingTevStruct(0x10, &mChestPos, &tevStr); g_env_light.setLightTevColorType_MAJI(mpChestModel, &tevStr); mDoExt_modelUpdateDL(mpChestModel); } if (mBlurMode == 1) { mDoGph_gInf_c::setBlureRate(mBlurRate); mDoGph_gInf_c::onBlure(); } else if (mBlurMode == 2) { mDoGph_gInf_c::offBlure(); } return 1; } /* 806AE5A8-806AE5C8 000D88 0020+00 1/0 0/0 0/0 .text daE_DT_Draw__FP8daE_DT_c */ static int daE_DT_Draw(daE_DT_c* i_this) { return i_this->draw(); } /* 806AE5C8-806AE618 000DA8 0050+00 1/1 0/0 0/0 .text demo_skip__8daE_DT_cFi */ void daE_DT_c::demo_skip(int param_0) { cDmr_SkipInfo = 1; dStage_changeScene(2, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1); } /* 806AE618-806AE64C 000DF8 0034+00 1/1 0/0 0/0 .text DemoSkipCallBack__8daE_DT_cFPvi */ int daE_DT_c::DemoSkipCallBack(void* i_this, int param_1) { if (i_this != NULL) { static_cast(i_this)->demo_skip(param_1); return 1; } else { return 0; } } /* 806AE64C-806AE6F0 000E2C 00A4+00 11/11 0/0 0/0 .text setBck__8daE_DT_cFiUcff */ void daE_DT_c::setBck(int i_anm, u8 i_attr, f32 i_morf, f32 i_rate) { J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("E_DT", i_anm); mpMorf->setAnm(bck, i_attr, i_morf, i_rate, 0.0f, -1.0f); } /* 806AE6F0-806AE74C 000ED0 005C+00 5/5 0/0 0/0 .text checkBck__8daE_DT_cFi */ bool daE_DT_c::checkBck(int i_anm) { J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("E_DT", i_anm); return mpMorf->getAnm() == bck; } /* 806AE74C-806AE758 000F2C 000C+00 12/12 0/0 0/0 .text setActionMode__8daE_DT_cFii */ void daE_DT_c::setActionMode(int i_action, int i_mode) { mAction = i_action; mMode = i_mode; } /* 806AE758-806AEB48 000F38 03F0+00 1/1 0/0 0/0 .text damage_check__8daE_DT_cFv */ void daE_DT_c::damage_check() { daPy_py_c* player = daPy_getPlayerActorClass(); if (mBodyDamageTimer == 0 && (mBodyCcSph[0].ChkTgHit() || mBodyCcSph[1].ChkTgHit())) { field_0x748 = -0.3f; field_0x74c = 0; mBodyDamageTimer = 10; mSound.startCreatureSound(Z2SE_EN_DT_SMALL_DAMAGE, 0, -1); } cXyz pos; if (mLegLDamageTimer == 0 && mLegCcSph[0].ChkTgHit()) { field_0x74e = 0x600; field_0x750 = 0; mLegLDamageTimer = 10; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_LEG_L1)); mDoMtx_stack_c::transM(130.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&pos); mDoAud_seStart(Z2SE_EN_DT_NODAMAGE_FOOT, &pos, 0, 0); } if (mLegRDamageTimer == 0 && mLegCcSph[1].ChkTgHit()) { field_0x752 = 0x600; field_0x754 = 0; mLegRDamageTimer = 10; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_LEG_R1)); mDoMtx_stack_c::transM(130.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&pos); mDoAud_seStart(Z2SE_EN_DT_NODAMAGE_FOOT, &pos, 0, 0); } if (checkCutDownHitFlg()) { offCutDownHitFlg(); health = 0; setActionMode(ACT_DEATH, 0); } else if (mDamageTimer == 0) { mCcStts.Move(); if (mTongueCcSph[0].ChkTgHit()) { mAtInfo.mpCollider = mTongueCcSph[0].GetTgHitObj(); dCc_GetAc(mAtInfo.mpCollider->GetAc()); cc_at_check(this, &mAtInfo); if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_UNK)) { mDamageTimer = 20; } else { mDamageTimer = 10; } if (mAtInfo.mAttackPower <= 1) { mDamageTimer = 10; } mTongueCcSph[0].ClrTgHit(); BOOL bVar1 = false; if (player->getSwordAtUpTime() != 0 || player->getCutCount() >= 4 || mAtInfo.mpCollider->GetAtAtp() >= 4) { bVar1 = true; } else if (static_cast(mAtInfo.mpCollider)->GetAtSpl() == 1) { field_0x774++; if (field_0x774 >= 2) { bVar1 = true; } } if (player->getCutType() == daPy_py_c::CUT_TYPE_JUMP && player->checkCutJumpCancelTurn()) { mDamageTimer = 3; setActionMode(ACT_DAMAGE, 0); } else if (bVar1) { field_0x774 = 0; setActionMode(ACT_DOWN, 2); } else { setActionMode(ACT_DAMAGE, 0); } if (health <= 0) { setActionMode(ACT_DEATH, 2); } } } } /* 806AEB48-806AEBD4 001328 008C+00 1/1 0/0 0/0 .text setStabPos__8daE_DT_cFv */ void daE_DT_c::setStabPos() { cXyz pos; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_5)); mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&pos); setDownPos(&pos); } /* 806AEBD4-806AED4C 0013B4 0178+00 1/1 0/0 0/0 .text checkBeforeBg__8daE_DT_cFf */ bool daE_DT_c::checkBeforeBg(f32 i_dist) { dBgS_LinChk lin_chk; cM3dGPla plane; cXyz start, end; start = current.pos; start.y += 100.0f; end = start; end.x += i_dist * cM_ssin(shape_angle.y); end.z += i_dist * cM_scos(shape_angle.y); lin_chk.Set(&start, &end, this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { dComIfG_Bgsp().GetTriPla(lin_chk, &plane); if ((s16)(cM_atan2s(plane.mNormal.x, plane.mNormal.z) - shape_angle.y) > 0) { mTargetAngleY = shape_angle.y + 0x2000; } else { mTargetAngleY = shape_angle.y - 0x2000; } return TRUE; } else { return FALSE; } } /* 806AED94-806AEEFC 001574 0168+00 1/1 0/0 0/0 .text checkTongueBg__8daE_DT_cFv */ void daE_DT_c::checkTongueBg() { if (mAction != ACT_DOWN && mAction != ACT_DAMAGE && mAction != ACT_JUMP) { cLib_chaseAngleS(&field_0x734, 0, 0x200); return; } cXyz start, end; J3DModel* model = mpMorf->getModel(); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_4)); mDoMtx_stack_c::multVecZero(&start); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_5)); mDoMtx_stack_c::transM(15.0f, -10.0f, 0.0f); mDoMtx_stack_c::multVecZero(&end); dBgS_LinChk lin_chk; end.y = start.y; lin_chk.Set(&start, &end, this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { cLib_chaseAngleS(&field_0x734, 15000, 0x400); field_0x730 = 0; } else if (mAction != ACT_DOWN) { cLib_chaseAngleS(&field_0x734, 0, 0x200); } } /* 806AEEFC-806AEFE8 0016DC 00EC+00 1/1 0/0 0/0 .text checkWaterSurface__8daE_DT_cFv */ void daE_DT_c::checkWaterSurface() { dBgS_ObjGndChk_Spl wtr_chk; Vec pos; pos = current.pos; pos.y += 300.0f; wtr_chk.SetPos(&pos); f32 surface = dComIfG_Bgsp().GroundCross(&wtr_chk); if (surface != -1.0e9f) { mWaterSurface = surface; if (current.pos.y < mWaterSurface) { if (checkBck(ANM_DOWN_WAIT) || checkBck(ANM_DOWN_DAMAGE_2)) { setHamonEffect(1); } else { setHamonEffect(0); } } } } /* 806AEFE8-806AF09C 0017C8 00B4+00 3/3 0/0 0/0 .text setSmallWaterEffect__8daE_DT_cFv */ void daE_DT_c::setSmallWaterEffect() { cXyz scl(mScale, mScale, mScale); static u16 w_eff_id[5] = {0x8572, 0x8573, 0x8574, 0x8575, 0x8576}; for (int i = 0; i < 5; i++) { dComIfGp_particle_set(w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, &scl); } } /* 806AF09C-806AF150 00187C 00B4+00 2/2 0/0 0/0 .text setLargeWaterEffect__8daE_DT_cFv */ void daE_DT_c::setLargeWaterEffect() { cXyz scl(mScale, mScale, mScale); static u16 w_eff_id[5] = {0x856d, 0x856e, 0x856f, 0x8570, 0x8571}; for (int i = 0; i < 5; i++) { dComIfGp_particle_set(w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, &scl); } } /* 806AF150-806AF240 001930 00F0+00 1/1 0/0 0/0 .text setHamonEffect__8daE_DT_cFi */ void daE_DT_c::setHamonEffect(int param_0) { if (param_0 >= 2) { return; } cXyz scl(mScale, mScale, mScale); cXyz pos(current.pos.x, mWaterSurface, current.pos.z); static u16 w_eff_id[4] = {0x8563, 0x8564, 0x8561, 0x8562}; for (int i = 0; i < 2; i++) { mRippleKey[i] = dComIfGp_particle_set(mRippleKey[i], w_eff_id[(param_0 << 1) + i], &pos, &tevStr, &shape_angle, &scl, 0xff, NULL, -1, NULL, NULL, NULL); } } /* 806AF240-806AF2F4 001A20 00B4+00 1/1 0/0 0/0 .text setJumpEffect__8daE_DT_cFv */ void daE_DT_c::setJumpEffect() { cXyz scl(mScale, mScale, mScale); static u16 w_eff_id[5] = {0x8565, 0x8566, 0x8567, 0x8568, 0x8569}; for (int i = 0; i < 5; i++) { dComIfGp_particle_set(w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, &scl); } } /* 806AF2F4-806AF3D0 001AD4 00DC+00 1/1 0/0 0/0 .text setJumpSizukuEffect__8daE_DT_cFv */ void daE_DT_c::setJumpSizukuEffect() { mParticleKey[0] = dComIfGp_particle_set(mParticleKey[0], 0x856a, ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey[0]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_BACKBONE_2)); } } /* 806AF3D0-806AF460 001BB0 0090+00 2/2 0/0 0/0 .text setDamageShibukiEffect__8daE_DT_cFi */ void daE_DT_c::setDamageShibukiEffect(int param_0) { cXyz scl(mScale, mScale, mScale); static u16 w_eff_id[2] = {0x855d, 0x855f}; dComIfGp_particle_set(w_eff_id[param_0], ¤t.pos, &tevStr, &shape_angle, &scl); } /* 806AF460-806AF548 001C40 00E8+00 2/2 0/0 0/0 .text setDamageYodareEffect__8daE_DT_cFi */ void daE_DT_c::setDamageYodareEffect(int param_0) { static u16 w_eff_id[2] = {0x855e, 0x8560}; mParticleKey[0] = dComIfGp_particle_set(mParticleKey[0], w_eff_id[param_0], ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey[0]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_CHEEK)); } } /* 806AF548-806AF5CC 001D28 0084+00 2/2 0/0 0/0 .text setSwingEffect__8daE_DT_cFv */ void daE_DT_c::setSwingEffect() { cXyz scl(mScale, mScale, mScale); dComIfGp_particle_set(0x856c, ¤t.pos, &tevStr, &shape_angle, &scl); } /* 806AF5CC-806AF740 001DAC 0174+00 1/1 0/0 0/0 .text setStepEffect__8daE_DT_cFv */ void daE_DT_c::setStepEffect() { cXyz scl(mScale, mScale, mScale); if (!checkBck(ANM_STEP)) { return; } if (mpMorf->checkFrame(0.0f)) { dComIfGp_particle_set(0x856b, ¤t.pos, &tevStr, &shape_angle, &scl); } if (mpMorf->checkFrame(29.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_STEP, 0, -1); mSound.startCreatureSound(Z2SE_EN_DT_FOOTNOTE_L, 0, -1); } if (mpMorf->checkFrame(59.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_FOOTNOTE_R, 0, -1); } } /* 806AF740-806AF848 001F20 0108+00 1/1 0/0 0/0 .text setBombEffect__8daE_DT_cFv */ void daE_DT_c::setBombEffect() { static u16 w_eff_id[4] = {0x8552, 0x8553, 0x8554, 0x8555}; for (int i = 0; i < 4; i++) { mParticleKey[i] = dComIfGp_particle_set(mParticleKey[i], w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey[i]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_CHEEK)); } } } /* 806AF848-806AF924 002028 00DC+00 1/1 0/0 0/0 .text setBombSmokeEffect__8daE_DT_cFv */ void daE_DT_c::setBombSmokeEffect() { mSmokeKey = dComIfGp_particle_set(mSmokeKey, 0x8556, ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mSmokeKey); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_CHEEK)); } } /* 806AF924-806AF9D8 002104 00B4+00 1/1 0/0 0/0 .text setDeadShibukiEffect__8daE_DT_cFv */ void daE_DT_c::setDeadShibukiEffect() { cXyz scl(mScale, mScale, mScale); static u16 w_eff_id[2] = {0x8557, 0x8558}; for (int i = 0; i < 2; i++) { dComIfGp_particle_set(w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, &scl); } } /* 806AF9D8-806AFAE0 0021B8 0108+00 1/1 0/0 0/0 .text setDeadYodareEffect__8daE_DT_cFv */ void daE_DT_c::setDeadYodareEffect() { static u16 w_eff_id[4] = {0x8559, 0x855a, 0x855b, 0x855c}; for (int i = 0; i < 4; i++) { mParticleKey[i] = dComIfGp_particle_set(mParticleKey[i], w_eff_id[i], ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey[i]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_CHEEK)); } } } /* 806AFAE0-806AFBBC 0022C0 00DC+00 1/1 0/0 0/0 .text setBoxTubaEffect__8daE_DT_cFv */ void daE_DT_c::setBoxTubaEffect() { mSpitKey = dComIfGp_particle_set(mSpitKey, 0x8598, ¤t.pos, &tevStr, &shape_angle, NULL, 0xff, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mSpitKey); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpMorf->getModel()->getAnmMtx(JNT_CHEEK)); } } /* 806AFBBC-806AFC98 00239C 00DC+00 1/1 0/0 0/0 .text setBoxTubaLandEffect__8daE_DT_cFv */ void daE_DT_c::setBoxTubaLandEffect() { cXyz pos; mDoMtx_stack_c::copy(mpSpitModel->getAnmMtx(0)); mDoMtx_stack_c::multVecZero(&pos); static u16 w_eff_id[2] = {0x8599, 0x859a}; for (int i = 0; i < 2; i++) { dComIfGp_particle_set(w_eff_id[i], &pos, &tevStr, NULL, NULL); } } /* 806B62DC-806B62E0 000084 0004+00 2/2 0/0 0/0 .bss mDt_OtamaNum__6E_DT_n */ int E_DT_n::mDt_OtamaNum; /* 806B62E0-806B6330 000088 0050+00 3/3 0/0 0/0 .bss mDt_OtamaNo__6E_DT_n */ int E_DT_n::mDt_OtamaNo[20]; /* 806AFC98-806AFD30 002478 0098+00 1/1 0/0 0/0 .text s_otama_todo__FPvPv */ static void* s_otama_todo(void* i_proc, void* i_this) { if (fopAcM_IsActor(i_proc) && !fpcM_IsCreating(fopAcM_GetID(i_proc)) && fopAcM_GetName(i_proc) == PROC_E_OT) { daE_OT_c* otama = static_cast(i_proc); E_DT_n::mDt_OtamaNum++; if (otama->getChildNo() < 20) { E_DT_n::mDt_OtamaNo[otama->getChildNo()] = 1; } } return NULL; } /* 806AFD30-806AFD94 002510 0064+00 3/3 0/0 0/0 .text getNumberOfOtama__8daE_DT_cFv */ int daE_DT_c::getNumberOfOtama() { E_DT_n::mDt_OtamaNum = 0; for (int i = 0; i < 20; i++) { E_DT_n::mDt_OtamaNo[i] = 0; } fpcM_Search(s_otama_todo, this); return E_DT_n::mDt_OtamaNum; } /* 806B6330-806B6334 0000D8 0004+00 3/3 0/0 0/0 .bss m_fall_no__6E_DT_n */ int E_DT_n::m_fall_no; /* 806AFD94-806AFE24 002574 0090+00 3/3 0/0 0/0 .text s_fall_otama__FPvPv */ static void* s_fall_otama(void* i_proc, void* i_this) { if (fopAcM_IsActor(i_proc) && !fpcM_IsCreating(fopAcM_GetID(i_proc)) && fopAcM_GetName(i_proc) == PROC_E_OT) { daE_OT_c* otama = static_cast(i_proc); if (E_DT_n::m_fall_no == otama->getChildNo() && otama->getActionMode() == daE_OT_c::ACT_EGG) { return i_proc; } } return NULL; } /* 806AFE24-806AFEAC 002604 0088+00 2/2 0/0 0/0 .text setStayOtamaFall__8daE_DT_cFv */ void daE_DT_c::setStayOtamaFall() { for (int i = field_0x704 * 2; i < (field_0x704 + 1) * 2; i++) { E_DT_n::m_fall_no = 19 - i; daE_OT_c* otama = (daE_OT_c*)fpcM_Search(s_fall_otama, this); if (otama != NULL) { otama->setShakeEgg(); } } } /* 806AFEAC-806AFF1C 00268C 0070+00 1/1 0/0 0/0 .text setStayOtamaDelete__8daE_DT_cFv */ void daE_DT_c::setStayOtamaDelete() { for (int i = 0; i < 20; i++) { E_DT_n::m_fall_no = i; daE_OT_c* otama = (daE_OT_c*)fpcM_Search(s_fall_otama, this); if (otama != NULL) { otama->setDeleteEgg(); } } } /* 806AFF1C-806AFF8C 0026FC 0070+00 1/1 0/0 0/0 .text s_demo_otama__FPvPv */ static void* s_demo_otama(void* i_proc, void* i_this) { if (fopAcM_IsActor(i_proc) && !fpcM_IsCreating(fopAcM_GetID(i_proc)) && fopAcM_GetName(i_proc) == PROC_E_OT) { daE_OT_c* otama = static_cast(i_proc); fopAcM_OffStatus(otama, 0x8000); } return NULL; } /* 806B6340-806B634C 0000E8 000C+00 2/3 0/0 0/0 .bss m_tongue_pos__6E_DT_n */ cXyz E_DT_n::m_tongue_pos; /* 806AFF8C-806B0114 00276C 0188+00 1/1 0/0 0/0 .text s_bomb_search__FPvPv */ static void* s_bomb_search(void* i_proc, void* i_this) { if (fopAcM_IsActor(i_proc) && !fpcM_IsCreating(fopAcM_GetID(i_proc))) { fopAc_ac_c* actor = static_cast(i_proc); if (dBomb_c::checkBombActor(actor) && !fopAcM_checkCarryNow(actor) && fopAcM_GetPosition_p(actor)->abs(E_DT_n::m_tongue_pos) < 200.0f) { return actor; } } return NULL; } /* 806B0114-806B01B4 0028F4 00A0+00 1/1 0/0 0/0 .text checkBombEat__8daE_DT_cFv */ bool daE_DT_c::checkBombEat() { mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_3)); mDoMtx_stack_c::multVecZero(&E_DT_n::m_tongue_pos); dBomb_c* bomb = (dBomb_c*)fpcM_Search(s_bomb_search, this); if (bomb != NULL) { bomb->deleteBombAndEffect(); return true; } return false; } /* 806B01B4-806B0200 002994 004C+00 1/1 0/0 0/0 .text isShutterOpen__8daE_DT_cFv */ bool daE_DT_c::isShutterOpen() { daAmiShutter_c* shutter; fopAcM_SearchByName(PROC_Obj_AmiShutter, (fopAc_ac_c**)&shutter); if (shutter != NULL && shutter->isShutterOpen()) { return true; } else { return false; } } /* 806B0200-806B0368 0029E0 0168+00 1/1 0/0 0/0 .text executeWait__8daE_DT_cFv */ void daE_DT_c::executeWait() { switch (mMode) { case 0: mTimer = 0; // fallthrough case 1: if (checkBck(ANM_KYORO_2) && (mpMorf->checkFrame(0.0f) || mpMorf->checkFrame(45.0f))) { mSound.startCreatureVoice(Z2SE_EN_DT_V_KYORO, -1); } if (mTimer == 0) { setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 2; mTimer = (u8)(150.0f + cM_rndFX(30.0f)); } break; case 2: if (mTimer == 0) { setBck(ANM_KYORO_2, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 1; mTimer = 180; } break; } setActionMode(ACT_CRY, 0); } /* 806B0368-806B063C 002B48 02D4+00 1/5 0/0 0/0 .text executeCry__8daE_DT_cFv */ void daE_DT_c::executeCry() { switch (mMode) { case 0: if (checkBeforeBg(1200.0f)) { mMode = 1; mTimer = 30; setBck(ANM_STEP, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); if ((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0) { mTargetAngleY = shape_angle.y + 0x4000; } else { mTargetAngleY = shape_angle.y - 0x4000; } } else { setBck(ANM_CROAK, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); field_0x704 = 0; mMode = 2; } break; case 1: cLib_chaseAngleS(&shape_angle.y, mTargetAngleY, 0x200); if (mTimer == 0) { if (checkBeforeBg(1200.0f)) { mTimer = 30; } else { setBck(ANM_CROAK, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); field_0x704 = 0; mMode = 2; } } break; case 2: if (mpMorf->checkFrame(27.0f)) { mSound.startCreatureVoice(Z2SE_EN_DT_V_CROAK, -1); } if (35.0f <= mpMorf->getFrame() && mpMorf->getFrame() < 70.0f) { mEyePosMode = 2; if (checkBombEat()) { setActionMode(ACT_BOMB_DAMAGE, 0); return; } } if (mpMorf->checkFrame(30.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_SPAWN, 0, -1); getNumberOfOtama(); for (int i = 0; i < 20; i++) { if (E_DT_n::mDt_OtamaNo[i] == 0) { fopAcM_create(PROC_E_OT, i, ¤t.pos, fopAcM_GetRoomNo(this), &shape_angle, NULL, 0xff); } } } if (mpMorf->isStop()) { setActionMode(ACT_SHAKE, 0); } break; } } /* 806B063C-806B07C4 002E1C 0188+00 1/1 0/0 0/0 .text executeShake__8daE_DT_cFv */ void daE_DT_c::executeShake() { switch (mMode) { case 0: setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mTimer = 30; mMode = 1; break; case 1: if (mTimer == 0) { setSwingEffect(); setBck(ANM_SWING, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 2; field_0x704 = 0; mTimer = 60; } break; case 2: if (mpMorf->checkFrame(12.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_SWING, 0, -1); } if (field_0x704 < 10) { if (60 - mTimer == E_DT_n::eDt_ShakeFrame[field_0x704]) { setStayOtamaFall(); field_0x704++; } } if (mTimer == 0) { setActionMode(ACT_WALK, 0); } break; } } /* 806B07C4-806B0E9C 002FA4 06D8+00 2/1 0/0 0/0 .text executeWalk__8daE_DT_cFv */ void daE_DT_c::executeWalk() { cXyz offset; if (mMode >= 5 && (mBodyCcSph[0].ChkTgHit() || mBodyCcSph[1].ChkTgHit() || mLegCcSph[0].ChkTgHit() || mLegCcSph[1].ChkTgHit())) { mMode = 7; setBck(ANM_SMALL_DAMAGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_DT_SMALL_DAMAGE, 0, -1); } switch (mMode) { case 0: setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mTimer = 30; mMode = 1; mWalkTimer = 1200; // fallthrough case 1: if (mTimer == 0) { setBck(ANM_STEP, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); offset.set(0.0f, 0.0f, 1500.0f); s16 angle = cM_rndFX(0x2000) + fopAcM_searchPlayerAngleY(this) + 0x8000; cLib_offsetPos(&mTargetPos, &home.pos, angle, &offset); mTargetAngleY = cLib_targetAngleY(¤t.pos, &mTargetPos); mMode = 2; } break; case 2: if (cLib_chaseAngleS(&shape_angle.y, mTargetAngleY, 0x100)) { current.angle.y = shape_angle.y; mTimer = 300; setBck(ANM_WALK_01, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mMode = 3; } break; case 3: if (mpMorf->checkFrame(0.0f) || mpMorf->checkFrame(45.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_WALK, 0, -1); } if (mpMorf->checkFrame(23.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_FOOTNOTE_L, 0, -1); } if (mpMorf->checkFrame(65.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_FOOTNOTE_R, 0, -1); } cLib_chaseF(&speedF, l_HIO.mWalkSpeed, 1.0f); if (mTimer == 0 || mTargetPos.absXZ(current.pos) < 300.0f) { setBck(ANM_STEP, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mTargetAngleY = cLib_targetAngleY(¤t.pos, &home.pos); mMode = 4; speedF = 0.0f; } break; case 4: if (cLib_chaseAngleS(&shape_angle.y, mTargetAngleY, 0x100)) { current.angle.y = shape_angle.y; setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mMode = 5; field_0x704 = 0; } break; case 5: if (abs((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this))) < 0x3000) { field_0x73e = fopAcM_searchPlayerAngleX(this); field_0x740 = fopAcM_searchPlayerAngleY(this) - shape_angle.y; field_0x704 = 0; } else { field_0x704++; if (field_0x704 >= 150) { mMode = 6; setBck(ANM_KYORO_2, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_DT_V_KYORO, -1); } } break; case 6: if (mpMorf->checkFrame(45.0f)) { mSound.startCreatureVoice(Z2SE_EN_DT_V_KYORO, -1); } if (mpMorf->isStop()) { setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mMode = 5; field_0x704 = 0; } break; case 7: if (mpMorf->isStop()) { setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 5; field_0x704 = 0; } break; } if (getNumberOfOtama() < 1 || (getNumberOfOtama() < 20 && mWalkTimer == 0)) { setActionMode(ACT_JUMP, 0); } } /* 806B0E9C-806B177C 00367C 08E0+00 2/1 0/0 0/0 .text executeJump__8daE_DT_cFv */ void daE_DT_c::executeJump() { s16 player_angle = fopAcM_searchPlayerAngleY(this); cXyz pos, offset, press_pos; offset.set(0.0f, 0.0f, 160.0f); cLib_offsetPos(&pos, ¤t.pos, shape_angle.y, &offset); if (!mLinkPressed) { mTongueCcSph[0].OnCoSetBit(); mTongueCcSph[1].OnCoSetBit(); } cXyz player_offset; cXyz player_pos = daPy_getPlayerActorClass()->current.pos; s16 angle_to_player = (s16)cLib_targetAngleY(&pos, &player_pos); s16 press_angle; mDoMtx_stack_c::YrotS(daPy_getPlayerActorClass()->current.angle.y); player_offset.set(0.0f, 0.0f, daPy_getPlayerActorClass()->getSpeedF() * 20.0f); mDoMtx_stack_c::multVec(&player_offset, &player_offset); switch (mMode) { case 0: setBck(ANM_STEP, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); speed.y = 0.0f; speedF = 0.0f; gravity = -5.0f; mMode = 1; mDemoMode = 0; field_0x736 = l_HIO.field_0x14; break; case 1: cLib_addCalcAngleS(&shape_angle.y, player_angle, 0x10, 0x100, 0x100); if (abs((s16)(player_angle - shape_angle.y)) < 0x1000 || fopAcM_searchPlayerDistance(this) < 700.0f) { mMode = 2; setBck(ANM_JUMP_START, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_DT_V_JUMP, -1); setJumpEffect(); if (!field_0x783) { mDemoMode = 1; } current.angle.y = shape_angle.y; } break; case 2: setJumpSizukuEffect(); if (mpMorf->checkFrame(87.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_JUMP, 0, -1); } if (mpMorf->isStop()) { speedF = 30.0f; speed.y = 150.0f; mMode = 3; mTimer = 60; current.angle.y = cLib_targetAngleY(¤t.pos, &player_pos); setBck(ANM_JUMP_TOP, J3DFrameCtrl::EMode_NONE, 20.0f, 1.0f); } break; case 3: setJumpSizukuEffect(); Z2GetAudioMgr()->changeSubBgmStatus(2); if (speed.y <= 0.0f) { cLib_chaseF(¤t.pos.x, player_pos.x + player_offset.x, 70.0f); cLib_chaseF(¤t.pos.z, player_pos.z + player_offset.z, 70.0f); speedF = 0.0f; gravity = 0.0f; speed.y = 0.0f; if (dComIfGp_checkPlayerStatus0(0, 0x2000) || mTimer == 0) { mMode = 4; maxFallSpeed = -50.0f; gravity = -5.0f; mTimer = 30; field_0x704 = 0; } } if (current.pos.y > 2000.0f) { cLib_chaseF(¤t.pos.x, player_pos.x + player_offset.x, 70.0f); cLib_chaseF(¤t.pos.z, player_pos.z + player_offset.z, 70.0f); } break; case 4: mSound.startCreatureSoundLevel(Z2SE_EN_DT_FALLING, 0, -1); mFlyingAttack = true; if (!dComIfGp_checkPlayerStatus0(0, 0x2000)) { current.pos.x = player_pos.x + player_offset.x; current.pos.z = player_pos.z + player_offset.z; } maxFallSpeed = l_HIO.mMaxFallSpeed; gravity = -5.0f; mMode = 5; field_0x704 = 0; mTimer = 10; shape_angle.y = cLib_targetAngleY(¤t.pos, &home.pos) + cM_rndFX(0x1000); break; case 5: mSound.startCreatureSoundLevel(Z2SE_EN_DT_FALLING, 0, -1); // fallthrough case 6: mFlyingAttack = true; switch (field_0x704) { case 0: if (mBodyCcSph[0].ChkCoHit()) { if (fopAcM_GetName(dCc_GetAc(mBodyCcSph[0].GetCoHitObj()->GetAc())) == PROC_ALINK) { field_0x704 = 2; mLinkPressed = true; } } if (mBodyCcSph[1].ChkCoHit()) { if (fopAcM_GetName(dCc_GetAc(mBodyCcSph[1].GetCoHitObj()->GetAc())) == PROC_ALINK) { field_0x704 = 2; mLinkPressed = true; } } break; case 2: if (mLinkPressed == true) { s16 angle_diff = shape_angle.y - angle_to_player; if (abs(angle_diff) < 0x2000) { if (angle_diff < 0) { angle_to_player += 0x2000; } else { angle_to_player += -0x2000; } } offset.set(0.0f, 0.0f, 470.0f); cLib_offsetPos(&press_pos, &pos, angle_to_player, &offset); press_angle = angle_to_player; } else { mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_3)); mDoMtx_stack_c::multVecZero(&press_pos); if (cM_rnd() < 0.5f) { press_angle = shape_angle.y + 0x4000; } else { press_angle = shape_angle.y - 0x4000; } } press_pos.y = mAcch.GetGroundH(); daPy_getPlayerActorClass()->onPressedDamage(press_pos, press_angle); daPy_py_c::setPlayerDamage(4, 1); field_0x704 = 3; Z2GetAudioMgr()->changeSubBgmStatus(1); break; case 3: mDemoMode = 3; field_0x704 = 4; break; } if (mMode == 5) { if (mAcch.ChkGroundHit()) { setLargeWaterEffect(); mFlyingAttackLand = true; dComIfGp_getVibration().StartQuake(8, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); mQuakeTimer = 30; setBck(ANM_JUMP_END, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 6; mSound.startCreatureSound(Z2SE_EN_DT_SPLASH, 0, -1); } } else if (mpMorf->getFrame() >= 5.0f) { if (field_0x704 == 1 || field_0x704 >= 4) { mMode = 7; } else if (field_0x704 == 0) { field_0x704 = 1; Z2GetAudioMgr()->changeSubBgmStatus(3); break; } } break; case 7: if (mpMorf->isStop()) { setActionMode(ACT_DOWN, 0); } break; } f32 tmp = 2000.0f - current.pos.y; if (tmp < 0.0f) { tmp = 0.0f; } if (speed.y < 0.0f) { if (tmp > 2000.0f) { tmp = 2000.0f; } mScale = tmp / 2000.0f * 1.2f + 0.3f; } else { if (tmp > 2000.0f) { tmp = 2000.0f; } mScale = tmp / 2000.0f + 0.5f; } } /* 806B177C-806B1B60 003F5C 03E4+00 1/1 0/0 0/0 .text executeDown__8daE_DT_cFv */ void daE_DT_c::executeDown() { switch (mMode) { case 0: if (mLinkPressed) { mTimer = l_HIO.mPressTimer; } else { mTimer = l_HIO.mStunTimer; } field_0x774 = 0; // fallthrough case 1: setBck(ANM_DOWN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); speed.y = 0.0f; speedF = 0.0f; mMode = 3; if (mHitCounter >= 2) { onDownFlg(); setStabPos(); } break; case 2: setDamageShibukiEffect(1); setDamageYodareEffect(1); Z2GetAudioMgr()->changeSubBgmStatus(1); mTimer = 0; mSound.startCreatureVoice(Z2SE_EN_DT_V_DOWN_DAMAGE2, -1); setBck(ANM_DOWN_DAMAGE_2, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); speed.y = 0.0f; speedF = 0.0f; mMode = 4; mEyePosMode = 1; mHitCounter++; if (mHitCounter >= 3) { setActionMode(ACT_DEATH, 2); } break; case 3: if (checkBck(ANM_DOWN_WAIT) && mpMorf->checkFrame(56.0f)) { mSound.startCreatureVoice(Z2SE_EN_DT_V_DOWN_WAIT, -1); } if (mTimer == 0) { offDownFlg(); if (mLinkPressed) { daPy_getPlayerActorClass()->offPressedDamage(); mDemoMode = 6; mLinkPressed = false; } else { Z2GetAudioMgr()->changeSubBgmStatus(1); } setBck(ANM_DOWN_RETURN_2, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_DT_V_RETURN, -1); mMode = 5; } else { if (mHitCounter >= 2) { setStabPos(); } if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_DOWN) { mCcStts.ClrCcMove(); mTimer = 30; } else if (!mLinkPressed) { mTongueCcSph[0].OnTgSetBit(); mTongueCcSph[0].OnCoSetBit(); mTongueCcSph[1].OnCoSetBit(); } mEyePosMode = 1; } break; case 4: setDamageYodareEffect(1); if (mpMorf->checkFrame(50.0f)) { mSound.startCreatureSound(Z2SE_CM_BODYFALL_ASASE_L, 0, -1); setSmallWaterEffect(); } // fallthrough case 5: if (mpMorf->isStop()) { setActionMode(ACT_SEARCH, 0); } break; } } /* 806B1B60-806B1BEC 004340 008C+00 1/1 0/0 0/0 .text executeSearch__8daE_DT_cFv */ void daE_DT_c::executeSearch() { switch (mMode) { case 0: setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mTimer = 30; mMode = 1; break; case 1: if (mTimer == 0) { setActionMode(ACT_WAIT, 0); } break; } } /* 806B1BEC-806B1D48 0043CC 015C+00 1/1 0/0 0/0 .text executeDamage__8daE_DT_cFv */ void daE_DT_c::executeDamage() { if (mTimer != 0) { if (!mLinkPressed) { mTongueCcSph[0].OnTgSetBit(); mTongueCcSph[0].OnCoSetBit(); mTongueCcSph[1].OnCoSetBit(); } mEyePosMode = 1; } switch (mMode) { case 0: setDamageShibukiEffect(0); setDamageYodareEffect(0); if (mTimer > 120) { mTimer = 120; } mSound.startCreatureVoice(Z2SE_EN_DT_V_DOWN_DAMAGE, -1); setBck(ANM_DOWN_DAMAGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 1; break; case 1: setDamageYodareEffect(0); if (mpMorf->isStop()) { setActionMode(ACT_DOWN, 1); } break; } } /* 806B1D48-806B1F78 004528 0230+00 1/1 0/0 0/0 .text executeBombDamage__8daE_DT_cFv */ void daE_DT_c::executeBombDamage() { mTongueCcSph[0].OnCoSetBit(); mTongueCcSph[1].OnCoSetBit(); switch (mMode) { case 0: setBombEffect(); setBombSmokeEffect(); mSound.startCreatureVoice(Z2SE_EN_DT_CROAK_DAMAGE, -1); setBck(ANM_CROAK_DAMAGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 1; break; case 1: setBombEffect(); setBombSmokeEffect(); if (mpMorf->checkFrame(119.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_CROAK_BOMB, 0, -1); setStayOtamaDelete(); } if (mpMorf->checkFrame(135.0f)) { mSound.startCreatureSound(Z2SE_EN_DT_SPLASH, 0, -1); setSmallWaterEffect(); } if (mpMorf->getFrame() >= 150.0f) { if (mpMorf->checkFrame(150.0f)) { Z2GetAudioMgr()->changeSubBgmStatus(3); } mTimer = l_HIO.mStunTimer; mEyePosMode = 1; mTongueCcSph[0].OnTgSetBit(); mTongueCcSph[0].OnCoSetBit(); mTongueCcSph[1].OnCoSetBit(); } if (mpMorf->isStop()) { setActionMode(ACT_DOWN, 0); } break; } } /* 806B1F78-806B28E4 004758 096C+00 2/1 0/0 0/0 .text executeDeath__8daE_DT_cFv */ void daE_DT_c::executeDeath() { cXyz player_pos(0.0f, 0.0f, 450.0f); camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz offset, disappear_pos; daPy_py_c* player = daPy_getPlayerActorClass(); switch (mMode) { case 0: mSound.startCreatureVoice(Z2SE_EN_DT_V_TODOME, -1); attention_info.flags = 0; setBck(ANM_DOWN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mTimer = 30; mMode = 1; mDead = 1; field_0x781 = true; speed.y = 0.0f; gravity = 0.0f; break; case 1: if (player->getCutType() == daPy_py_c::CUT_TYPE_DOWN) { mTimer = 10; } if (mTimer == 0) { mMode = 2; } break; case 2: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xffff, 0); eventInfo.onCondition(dEvtCnd_CANDEMO_e); } else { setDeadShibukiEffect(); setDeadYodareEffect(); camera->mCamera.Stop(); mMode = 3; mDead = 1; current.pos.set(0.0f, 0.0f, -1000.0f); current.angle.y = 0; shape_angle.y = 0; shape_angle.z = 0; shape_angle.x = 0; player->changeOriginalDemo(); player->setPlayerPosAndAngle(&player_pos, 0x8000, 0); player->changeDemoMode(4, 1, 0, 0); mCamEye.set(150.0f, 100.0f, 800.0f); mCamCenter = eyePos; mCamFovy = 55.0f; camera->mCamera.SetTrimSize(3); attention_info.flags = 0; setBck(ANM_DEAD, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_DT_V_DEAD, -1); mMode = 3; mTimer = 300; Z2GetAudioMgr()->subBgmStop(); Z2GetAudioMgr()->muteSceneBgm(0, 0.0f); dComIfGs_onStageMiddleBoss(); } break; case 3: player->setPlayerPosAndAngle(&player_pos, 0x8000, 0); setBoxTubaEffect(); if (mpMorf->checkFrame(70.0f) || mpMorf->checkFrame(110.0f) || mpMorf->checkFrame(125.0f)) { setDeadShibukiEffect(); } if (mpMorf->checkFrame(212.0f)) { mSound.startCreatureSound(Z2SE_CM_BODYFALL_ASASE_L, 0, -1); setSmallWaterEffect(); } setDeadYodareEffect(); if (mpMorf->checkFrame(176.0f)) { mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_3)); mDoMtx_stack_c::multVecZero(&mChestPos); mChestSpeed.y = 50.0f; mChestSpeed.z = 26.2f; mChestMode = 1; s16 ang_x = 0x4000 - cM_atan2s(mChestSpeed.y, mChestSpeed.absXZ()); mSpitAngle[2].x = ang_x; mSpitAngle[1].x = ang_x; mSpitAngle[0].x = ang_x; player->changeDemoMode(23, 1, 0, 0); } if (mpMorf->getFrame() < 30.0f) { cLib_addCalc2(&mBlurRate, 180.0f, 1.0f, 8.0f); mBlurMode = 1; } else if (mBlurRate) { cLib_addCalc2(&mBlurRate, 0.0f, 1.0f, 1.0f); if (!mBlurRate) { mBlurMode = 2; } } else { mBlurMode = 0; } if (mTimer < 120) { cLib_chasePos(&mCamEye, cXyz(200.0f, 100.0f, 700.0f), 5.0f); cLib_chaseF(&field_0x6e4, 0.3f, 0.03f); mCamCenter = eyePos * field_0x6e4 + mChestPos * (1.0f - field_0x6e4); } else { field_0x6e4 = 1.0f; if (mTimer < 270) { cLib_chasePos(&mCamEye, cXyz(200.0f, 100.0f, 600.0f), 5.0f); } mCamCenter = eyePos; } camera->mCamera.Set(mCamCenter, mCamEye, mCamFovy, 0); if (mpMorf->getFrame() > 176.0f) { cLib_addCalc2(&field_0x72c, -50.0f, 1.0f, 0.5f); } if (mpMorf->isStop()) { mTimer = 20; mMode = 4; } break; case 4: mEyePosMode = 3; cLib_addCalc2(&field_0x72c, -50.0f, 1.0f, 0.5f); if (mTimer == 0) { offset.set(0.0f, 0.0f, 160.0f); cLib_offsetPos(&disappear_pos, ¤t.pos, shape_angle.y, &offset); fopAcM_createDisappear(this, &disappear_pos, 40, 0, 0xff); mDead = 2; mTimer = 10; mMode = 5; } break; case 5: mEyePosMode = 3; if (mTimer == 0) { mTimer = 120; mMode = 6; } break; case 6: mEyePosMode = 3; cLib_addCalcPos2(&mCamCenter, cXyz(0.0f, 100.0f, 0.0f), 0.1f, 5.0f); camera->mCamera.Set(mCamCenter, mCamEye, mCamFovy, 0); if (mTimer == 0) { camera->mCamera.Reset(mCamCenter, mCamEye, mCamFovy, 0); camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); Z2GetAudioMgr()->unMuteSceneBgm(45); fopAcM_delete(this); } break; } } /* 806B28E4-806B29D4 0050C4 00F0+00 1/1 0/0 0/0 .text pointInSight__8daE_DT_cFP4cXyz */ bool daE_DT_c::pointInSight(cXyz* i_point) { cXyz proj; u32 idx = fopCamM_GetParam(dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0))); scissor_class* scissor = dComIfGp_getWindow(dComIfGp_getCameraWinID(idx))->getScissor(); f32 width = scissor->width; f32 height = scissor->height; mDoLib_project(i_point, &proj); if (proj.x > 0.0f && proj.x < width && proj.y > 30.0f && -30.0f < height) { return true; } else { return false; } } /* 806B29D4-806B3B08 0051B4 1134+00 2/1 0/0 0/0 .text executeOpening__8daE_DT_cFv */ void daE_DT_c::executeOpening() { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camera = dCam_getBody(); cXyz vec1; cXyz vec2 = eyePos; vec2.y -= 100.0f; int i; BOOL in_sight, create_otama, bVar1; fopAc_ac_c* otama; switch (mMode) { case 0: mMode = 1; setBck(ANM_OP_DEMO_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); attention_info.flags = 0; if (getNumberOfOtama() == 0) { for (i = 0; i < 20; i++) { fopAcM_create(PROC_E_OT, i | 0xff030000, ¤t.pos, fopAcM_GetRoomNo(this), &shape_angle, NULL, 0xff); } } // fallthrough case 1: case 2: vec1.set(0.0f, 0.0f, 0.0f); shape_angle.y = cLib_targetAngleY(&player->current.pos, &vec1); shape_angle.x = -0x4000; mDoMtx_stack_c::transS(0.0f, 4000.0f, 0.0f); mDoMtx_stack_c::YrotM(shape_angle.y); mDoMtx_stack_c::transM(0.0f, 0.0f, -100.0f); mDoMtx_stack_c::multVecZero(¤t.pos); field_0x781 = true; if (isShutterOpen()) { field_0x714 = 690; return; } in_sight = pointInSight(¤t.pos); bVar1 = FALSE; if (dCam_getBody()->Mode() == 4 || dCam_getBody()->Mode() == 7 || dCam_getBody()->Mode() == 8 || dComIfGp_checkPlayerStatus0(0, 0x200000)) { bVar1 = TRUE; } if (!bVar1) { field_0x704 = 0; if (mMode == 1) { if (mTimer == 0) { setBck(ANM_OP_DEMO_SWING, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 2; field_0x775 = cM_rndF(2.9f); } } else { create_otama = FALSE; if (mpMorf->checkFrame(14.0f)) { create_otama = TRUE; } else if (mpMorf->checkFrame(19.0f)) { if (field_0x775 >= 1) { create_otama = TRUE; } } else if (mpMorf->checkFrame(24.0f)) { if (field_0x775 >= 2) { create_otama = TRUE; } } if (create_otama) { vec1.set(0.0f, 2000.0f, 0.0f); fopAcM_create(PROC_E_OT, 0xff01ffff, &vec1, fopAcM_GetRoomNo(this), &shape_angle, NULL, 0xff); } if (mpMorf->isStop() && getNumberOfOtama() <= 20) { setBck(ANM_OP_DEMO_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 1; mTimer = 300.0f + cM_rndFX(60.0f); } } } else { if (field_0x704 != 0) { setBck(ANM_OP_DEMO_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); field_0x704++; } if (in_sight) { camera->Stop(); mCamEye = camera->Eye(); mCamCenter = camera->Center(); mCamFovy = camera->Fovy(); mCamBank = camera->Bank(); player->onPlayerNoDraw(); camera->SetTrimSize(3); setBck(ANM_OP_DEMO_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 3; Z2GetAudioMgr()->subBgmStart(Z2BGM_DEKUTOAD_D01); dComIfGs_onOneZoneSwitch(3, fopAcM_GetRoomNo(this)); } } return; case 3: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xffff, 0); eventInfo.onCondition(dEvtCnd_CANDEMO_e); } else { mMode = 4; mTimer = 60; mSound.startCreatureVoice(Z2SE_EN_DT_V_OPDEMO, -1); } break; case 4: cLib_chasePos(&mCamCenter, vec2, 5.0f); if (mTimer == 0) { mMode = 5; setBck(ANM_OP_DEMO_SWING, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mTimer = 60; field_0x704 = 0; } break; case 5: cLib_chasePos(&mCamCenter, vec2, 5.0f); if (checkBck(ANM_OP_DEMO_SWING) && (mpMorf->checkFrame(10.0f) || mpMorf->checkFrame(15.0f) || mpMorf->checkFrame(20.0f))) { E_DT_n::m_fall_no = mpMorf->getFrame() - 10.0f; daE_OT_c* otama = (daE_OT_c*)fpcM_Search(s_fall_otama, this); if (otama != NULL) { otama->setFallEgg(); mDemoOtama[field_0x704] = otama; field_0x704++; } } if (mpMorf->isStop()) { setBck(ANM_OP_DEMO_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } if (mTimer == 0) { mMode = 6; mTimer = 60; field_0x6e8 = -300.0f; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_1)); mDoMtx_stack_c::multVecZero(&vec2); vec2.y += field_0x6e8; mCamCenter = vec2; mDoMtx_stack_c::YrotS(shape_angle.y + 0x7c00); mDoMtx_stack_c::transM(0.0f, 3000.0f, 1700.0f); mDoMtx_stack_c::multVecZero(&mCamEye); mCamFovy = 55.0f; mCamBank = 0; } break; case 6: cLib_chaseF(&field_0x6e8, 0.0f, 3.0f); mDoMtx_stack_c::YrotS(shape_angle.y + 0x6000); mDoMtx_stack_c::transM(0.0f, 3400.0f, 1400.0f); mDoMtx_stack_c::multVecZero(&vec1); cLib_chasePos(&mCamEye, vec1, 8.0f); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_1)); mDoMtx_stack_c::multVecZero(&vec2); vec2.y += field_0x6e8; cLib_chasePos(&mCamCenter, vec2, 50.0f); if (mTimer == 0) { setBck(ANM_OP_DEMO_FALL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 7; } break; case 7: cLib_chaseF(&field_0x6e8, 0.0f, 3.0f); mDoMtx_stack_c::YrotS(shape_angle.y + 0x6000); mDoMtx_stack_c::transM(0.0f, 3400.0f, 1400.0f); mDoMtx_stack_c::multVecZero(&vec1); cLib_chasePos(&mCamEye, vec1, 8.0f); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_TONGUE_1)); mDoMtx_stack_c::multVecZero(&vec2); vec2.y += field_0x6e8; cLib_chasePos(&mCamCenter, vec2, 50.0f); if (mpMorf->checkFrame(143.0f)) { mMode = 8; current.angle.y = shape_angle.y - 0x8000; gravity = -5.0f; maxFallSpeed = -100.0f; mTimer = 40; field_0x6e8 = 20.0f; } break; case 8: mDoMtx_stack_c::YrotS(shape_angle.y + 0x6000); mDoMtx_stack_c::transM(0.0f, 3000.0f, 1700.0f); mDoMtx_stack_c::multVecZero(&vec1); cLib_chasePos(&mCamEye, vec1, 30.0f); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::multVecZero(&vec2); cLib_chasePos(&mCamCenter, vec2, field_0x6e8); if (mpMorf->isStop()) { setBck(ANM_JUMP_TOP, J3DFrameCtrl::EMode_NONE, 20.0f, 1.0f); } cLib_chaseF(&speedF, 0.0f, 1.0f); if (mTimer < 15) { cLib_chaseF(&field_0x6e8, 0.0f, 3.0f); } if (mTimer == 0) { mMode = 10; field_0x781 = false; speedF = 0.0f; speed.y = 0.0f; maxFallSpeed = -100.0f; current.pos.set(0.0f, 2000.0f, 0.0f); shape_angle.y = 0; shape_angle.x = 0; vec1.set(0.0f, 0.0f, 1400.0f); player->offPlayerNoDraw(); player->setPlayerPosAndAngle(&vec1, shape_angle.y + 0x8000, 0); mCamCenter.set(0.0f, 3112.0f, 243.0f); mCamEye.set(-150.0f, 150.0f, 1600.0f); mCamFovy = 115.0f; mDemoJump = true; } break; case 10: mSound.startCreatureSoundLevel(Z2SE_EN_DT_FALLING, 0, -1); mDemoJump = false; mCamCenter = vec2; cLib_chaseF(&mCamFovy, 70.0f, 1.0f); if (mAcch.ChkGroundHit()) { setLargeWaterEffect(); mMode = 11; setBck(ANM_OP_DEMO, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); dComIfGp_getVibration().StartQuake(8, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); mQuakeTimer = 30; mSound.startCreatureSound(Z2SE_EN_DT_SPLASH, 0, -1); player->changeOriginalDemo(); player->changeDemoMode(34, 1, 0, 0); mTimer = 90; } break; case 11: cLib_chasePos(&mCamCenter, vec2, 100.0f); vec1.set(-100.0f, 50.0f, 1550.0f); cLib_chasePos(&mCamEye, vec1, 100.0f); cLib_chaseF(&mCamFovy, 70.0f, 1.5f); if (mTimer == 1) { player->changeDemoMode(23, 1, 0, 0); } if (mpMorf->checkFrame(130.0f)) { getNumberOfOtama(); for (int i = 0; i < 20; i++) { if (E_DT_n::mDt_OtamaNo[i] == 0) { mDemoID = fopAcM_create(PROC_E_OT, i | 0xff030000, ¤t.pos, fopAcM_GetRoomNo(this), &shape_angle, NULL, 0xff); } } } if (mpMorf->checkFrame(200.0f)) { mMode = 20; mCamCenter.set(100.0f, 300.0f, 350.0f); mCamEye.set(800.0f, 800.0f, -500.0f); mCamFovy = 70.0f; field_0x704 = 0; } break; case 20: if (field_0x704 < 10 && mpMorf->checkFrame(E_DT_n::eDt_ShakeFrameDemo[field_0x704])) { setStayOtamaFall(); field_0x704++; } if (mpMorf->checkFrame(290.0f)) { setSwingEffect(); } if (mpMorf->checkFrame(330.0f)) { mMode = 30; if (mDemoID != -1) { fopAcM_SearchByID(mDemoID, &otama); if (otama != NULL) { vec1 = otama->current.pos; vec1.y += 100.0f; mCamCenter = vec1; mCamEye.set(1000.0f, 300.0f, 1700.0f); mCamFovy = 40.0f; } } } break; case 30: cLib_chaseF(&mCamFovy, 20.0f, 1.0f); if (mDemoID != -1) { fopAcM_SearchByID(mDemoID, &otama); if (otama != NULL) { vec1 = otama->current.pos; vec1.y += 100.0f; cLib_chasePos(&mCamCenter, vec1, 50.0f); } } if (mpMorf->isStop()) { setBck(ANM_WAIT_01, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 32; mTimer = 45; player->changeOriginalDemo(); player->changeDemoMode(34, 0, 0, 0); } break; case 32: cLib_chaseF(&mCamFovy, 20.0f, 1.0f); if (mDemoID != -1) { fopAcM_SearchByID(mDemoID, &otama); if (otama != NULL) { vec1 = otama->current.pos; vec1.y += 100.0f; cLib_chasePos(&mCamCenter, vec1, 50.0f); } } if (mTimer == 0) { setActionMode(ACT_WALK, 0); maxFallSpeed = l_HIO.mMaxFallSpeed; camera->Reset(mCamCenter, mCamEye); camera->Start(); camera->SetTrimSize(0); dComIfGp_event_reset(); attention_info.flags = fopAc_AttnFlag_BATTLE_e; Z2GetAudioMgr()->subBgmStart(Z2BGM_DEKUTOAD); fpcM_Search(s_demo_otama, this); return; } break; } camera->Set(mCamCenter, mCamEye, mCamFovy, mCamBank); dComIfGp_getEvent().onSkipFade(); dComIfGp_getEvent().setSkipProc(this, DemoSkipCallBack, 0); } /* 806B3B08-806B40D8 0062E8 05D0+00 1/1 0/0 0/0 .text calcCamera__8daE_DT_cFv */ void daE_DT_c::calcCamera() { dBgS_LinChk lin_chk; cXyz start, end, offset_pos, offset; cXyz player_pos = daPy_getPlayerActorClass()->current.pos; camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz cam_center, vec, cam_eye; s16 angle; switch (mDemoMode) { case 0: break; case 1: case 2: mDoMtx_stack_c::YrotS(fopAcM_searchPlayerAngleY(this)); vec.set(0.0f, 100.0f, 400.0f); mDoMtx_stack_c::multVec(&vec, &cam_eye); cam_eye += player_pos; lin_chk.Set(&eyePos, &cam_eye, this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { eyePos.x *= 0.5f; eyePos.z *= 0.5f; mDoMtx_stack_c::YrotS(fopAcM_searchPlayerAngleY(this)); vec.set(0.0f, 150.0f, 100.0f); mDoMtx_stack_c::multVec(&vec, &cam_eye); cam_eye += player_pos; } if (mDemoMode == 1) { camera->mCamera.Stop(); mDemoTimer = l_HIO.field_0x28; mCamEye = cam_eye; mCamCenter = eyePos; mDemoMode = 2; daPy_getPlayerActorClass()->onForceSubjectCancel(); return; } cLib_chasePos(&mCamEye, cam_eye, 50.0f); cLib_chasePos(&mCamCenter, eyePos, 40.0f); if (mDemoTimer != 0) { camera->mCamera.U2((s16)cLib_targetAngleY(&mCamEye, &mCamCenter)); camera->mCamera.Set(mCamCenter, mCamEye); } else { mDoMtx_stack_c::YrotS(fopAcM_searchPlayerAngleY(this)); vec.set(0.0f, 150.0f, -500.0f); mDoMtx_stack_c::multVec(&vec, &mCamCenter); mCamCenter += player_pos; camera->mCamera.Reset(mCamCenter, mCamEye); camera->mCamera.Start(); mDemoMode = 0; } break; case 3: camera->mCamera.Stop(); mDemoMode = 4; break; case 4: field_0x73a = 0; offset.set(0.0f, 0.0f, 160.0f); cLib_offsetPos(&offset_pos, ¤t.pos, shape_angle.y, &offset); angle = (s16)cLib_targetAngleY(&offset_pos, &player_pos); mDoMtx_stack_c::YrotS(angle); vec.set(200.0f, 1200.0f, 600.0f); mDoMtx_stack_c::multVec(&vec, &end); end += player_pos; mDoMtx_stack_c::YrotS(angle); vec.set(0.0f, 0.0f, 100.0f); mDoMtx_stack_c::multVec(&vec, &start); start += offset_pos; lin_chk.Set(&start, &end, this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { field_0x73a = 0x8000; } mDemoMode = 5; // fallthrough case 5: offset.set(0.0f, 0.0f, 160.0f); cLib_offsetPos(&offset_pos, ¤t.pos, shape_angle.y, &offset); angle = field_0x73a + cLib_targetAngleY(&offset_pos, &player_pos); mDoMtx_stack_c::YrotS(angle); vec.set(200.0f, 1200.0f, 600.0f); mDoMtx_stack_c::multVec(&vec, &cam_eye); cam_eye += player_pos; mDoMtx_stack_c::YrotS(angle); vec.set(0.0f, 0.0f, 100.0f); mDoMtx_stack_c::multVec(&vec, &cam_center); cam_center += offset_pos; camera->mCamera.Set(cam_center, cam_eye, 50.0f, 0); break; case 6: camera->mCamera.Start(); mDemoMode = 0; break; } } /* 806B40D8-806B4724 0068B8 064C+00 1/1 0/0 0/0 .text calcBoxAndTuba__8daE_DT_cFv */ void daE_DT_c::calcBoxAndTuba() { if (mChestMode == 0) { return; } mChestSpeed.y += -5.0f; if (mChestSpeed.y < -80.0f) { mChestSpeed.y = -80.0f; } mChestPos += mChestSpeed; if (mChestPos.y <= 0.0f) { mChestPos.y = 0.0f; } switch (mChestMode) { case 1: mChestAngle.x += 0x400; if (mChestPos.y <= 0.0f) { mChestAngle.x = -0x2000; mChestSpeed.x = 1.2f; mChestSpeed.y = 30.0f; mChestSpeed.z = 9.0f; mChestMode = 2; setBoxTubaLandEffect(); mDoAud_seStart(Z2SE_CM_BODYFALL_ASASE_M, &mChestPos, 0, 0); } else { s16 angle = 0x4000 - cM_atan2s(mChestSpeed.y, mChestSpeed.absXZ()); cLib_addCalcAngleS(&mSpitAngle[0].x, angle, 8, 0x1000, 0x100); cLib_addCalcAngleS(&mSpitAngle[1].x, mSpitAngle[0].x, 8, 0x1000, 0x100); cLib_addCalcAngleS(&mSpitAngle[2].x, mSpitAngle[1].x, 8, 0x1000, 0x100); mSpitAngle[0].y = mSpitAngle[1].y = mSpitAngle[2].y = 0; field_0x6dc += 0x800; mSpitAngle[0].z = cM_ssin(field_0x6dc) * 0x800; mSpitAngle[1].z = cM_ssin(field_0x6dc + 0x4000) * 0x1000; mSpitAngle[2].z = cM_ssin(field_0x6dc + 0x8000) * 0x1800; field_0x6de += 0x1000; mSpitScale[0] = cM_ssin(field_0x6de) * 0.2f + 1.0f; mSpitScale[1] = cM_ssin(field_0x6de + 0x4000) * 0.1f + 1.0f; mSpitScale[2] = cM_ssin(field_0x6de + 0x8000) * 0.05f + 1.0f; mSpitScaleX = 1.0f; mSpitOffset = 80.0f; mSpitFade[0] = 1.0f; } break; case 2: cLib_chaseAngleS(&mChestAngle.x, 0, 0x400); if (mChestSpeed.y < 0.0f && mChestPos.y <= 0.0f) { mChestAngle.x = 0; mChestSpeed.set(0.0f, 0.0f, 0.0f); mChestPos.set(0.0f, 0.0f, 0.0f); if (mSwBit != 0xff && !dComIfGs_isSwitch(mSwBit, fopAcM_GetRoomNo(this))) { dComIfGs_onSwitch(mSwBit, fopAcM_GetRoomNo(this)); } mChestMode = 3; mSpitTimer = 50; } cLib_addCalcAngleS(&mSpitAngle[0].x, 0, 0x10, 0x2000, 0x80); cLib_addCalcAngleS(&mSpitAngle[1].x, mSpitAngle[0].x, 0x10, 0x2000, 0x80); cLib_addCalcAngleS(&mSpitAngle[2].x, mSpitAngle[1].x, 0x10, 0x2000, 0x80); cLib_chaseF(&mSpitScale[0], 2.0f, 0.0f); cLib_chaseF(&mSpitScale[1], 3.0f, 0.02f); cLib_chaseF(&mSpitScale[2], 1.0f, 0.02f); cLib_chaseF(&mSpitOffset, 100.0f, 1.0f); break; case 3: case 4: cLib_addCalcAngleS(&mSpitAngle[0].x, 0, 0x10, 0x2000, 0x80); cLib_addCalcAngleS(&mSpitAngle[1].x, mSpitAngle[0].x, 0x10, 0x2000, 0x80); cLib_addCalcAngleS(&mSpitAngle[2].x, mSpitAngle[1].x, 0x10, 0x2000, 0x80); cLib_chaseF(&mSpitScale[0], 5.0f, 0.01f); cLib_chaseF(&mSpitScale[1], 5.0f, 0.02f); cLib_chaseF(&mSpitScale[2], 1.0f, 0.02f); cLib_chaseF(&mSpitOffset, -100.0f, 1.0f); if (mChestMode == 3) { if (mSpitTimer == 30) { mSpitFade[1] = mSpitFade[2] = mSpitFade[3] = 1.0f; } if (mSpitTimer == 0) { mChestMode = 4; mSpitTimer = 100; } } else { if (mSpitTimer < 70) { cLib_chaseF(&mSpitFade[0], 0.0f, 0.01f); if (mSpitTimer < 30) { cLib_chaseF(&mSpitFade[2], 0.0f, 0.02f); if (mSpitTimer < 15) { cLib_chaseF(&mSpitFade[1], 0.0f, 0.02f); if (mSpitTimer == 0) { cLib_chaseF(&mSpitFade[3], 0.0f, 0.02f); } } } } } break; } } /* 806B4724-806B49F0 006F04 02CC+00 2/1 0/0 0/0 .text action__8daE_DT_cFv */ void daE_DT_c::action() { mBodyCcSph[1].OnTgShield(); if (mLinkPressed) { mBodyCcSph[0].OffCoSetBit(); mBodyCcSph[1].OffCoSetBit(); mLegCcSph[0].OffCoSetBit(); mLegCcSph[1].OffCoSetBit(); } else { mBodyCcSph[0].OnCoSetBit(); mBodyCcSph[1].OnCoSetBit(); mLegCcSph[0].OnCoSetBit(); mLegCcSph[1].OnCoSetBit(); } mTongueCcSph[0].OffCoSetBit(); mTongueCcSph[0].OffTgSetBit(); mTongueCcSph[1].OffCoSetBit(); mTongueCcSph[1].OffTgSetBit(); mEyePosMode = 0; mFlyingAttack = false; mFlyingAttackLand = false; field_0x73e = 0; field_0x740 = 0; checkWaterSurface(); damage_check(); cLib_chaseF(&field_0x748, 0.0f, 0.02f); field_0x74c += 0x2000; cLib_chaseAngleS(&field_0x74e, 0, 0x40); field_0x750 += 0x2000; cLib_chaseAngleS(&field_0x752, 0, 0x40); field_0x754 += 0x2000; BOOL boss_room_wait = true; switch (mAction) { case ACT_WAIT: executeWait(); break; case ACT_CRY: executeCry(); break; case ACT_SHAKE: executeShake(); break; case ACT_WALK: executeWalk(); break; case ACT_JUMP: executeJump(); break; case ACT_DOWN: mBodyCcSph[1].OffTgShield(); executeDown(); break; case ACT_SEARCH: executeSearch(); break; case ACT_DAMAGE: mBodyCcSph[1].OffTgShield(); executeDamage(); break; case ACT_BOMB_DAMAGE: executeBombDamage(); break; case ACT_DEATH: executeDeath(); break; case ACT_OPENING: executeOpening(); boss_room_wait = false; } if (boss_room_wait) { daPy_getPlayerActorClass()->onBossRoomWait(); } calcCamera(); setStepEffect(); fopAcM_posMoveF(this, NULL); if (!field_0x781) { mAcch.CrrPos(dComIfG_Bgsp()); } mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); calcBoxAndTuba(); checkTongueBg(); cLib_chaseAngleS(&field_0x742, field_0x73e, 0x100); cLib_chaseAngleS(&field_0x744, field_0x740, 0x100); } /* 806B49F0-806B4B24 0071D0 0134+00 1/1 0/0 0/0 .text mtx_set__8daE_DT_cFv */ void daE_DT_c::mtx_set() { cXyz spit_pos; mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::transM(0.0f, 0.0f, -100.0f); mDoMtx_stack_c::scaleM(mScale, mScale, mScale); mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); mpMorf->modelCalc(); mDoMtx_stack_c::transS(mChestPos); mDoMtx_stack_c::ZXYrotM(mChestAngle); mpChestModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpSpitBModel->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_stack_c::transM(0.0f, mSpitOffset, 0.0f); mDoMtx_stack_c::multVecZero(&spit_pos); mDoMtx_stack_c::transS(spit_pos); mDoMtx_stack_c::ZXYrotM(mSpitAngle[0]); mDoMtx_stack_c::scaleM(mSpitScale[0], 1.0f, mSpitScale[0]); mpSpitModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 806B4B24-806B4FD8 007304 04B4+00 1/1 0/0 0/0 .text cc_set__8daE_DT_cFv */ void daE_DT_c::cc_set() { cXyz center; J3DModel* model = mpMorf->getModel(); switch (mEyePosMode) { case 0: mDoMtx_stack_c::copy(model->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::transM(0.0f, 100.0f, 0.0f); mDoMtx_stack_c::multVecZero(&eyePos); break; case 1: mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_4)); mDoMtx_stack_c::transM(30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&eyePos); break; case 2: mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_3)); mDoMtx_stack_c::multVecZero(&eyePos); break; case 3: eyePos = mChestPos; break; } attention_info.position = eyePos; attention_info.position.y += 70.0f; mDoMtx_stack_c::copy(model->getAnmMtx(JNT_BACKBONE_1)); mDoMtx_stack_c::transM(110.0f, -100.0f, 0.0f); if (mAction == ACT_DOWN || (mAction == ACT_JUMP && mMode >= 7)) { if (!mLinkPressed) { mBodyCcSph[0].SetR(510.0f); } else { mBodyCcSph[0].SetR(360.0f); } } else { mBodyCcSph[0].SetR(400.0f); } mDoMtx_stack_c::multVecZero(¢er); mBodyCcSph[0].SetC(center); dComIfG_Ccsp()->Set(&mBodyCcSph[0]); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_BACKBONE_1)); mDoMtx_stack_c::transM(110.0f, -100.0f, 0.0f); if (mAction == ACT_DOWN || (mAction == ACT_JUMP && mMode >= 7)) { if (!mLinkPressed) { mDoMtx_stack_c::transM(300.0f, -50.0f, 0.0f); mBodyCcSph[1].SetR(350.0f); } else { mDoMtx_stack_c::transM(300.0f, -30.0f, 0.0f); mBodyCcSph[1].SetR(370.0f); } } else { mDoMtx_stack_c::transM(220.0f, -20.0f, 0.0f); mBodyCcSph[1].SetR(350.0f); } mDoMtx_stack_c::multVecZero(¢er); mBodyCcSph[1].SetC(center); dComIfG_Ccsp()->Set(&mBodyCcSph[1]); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_4)); mDoMtx_stack_c::transM(30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mTongueCcSph[0].SetC(center); mTongueCcSph[0].SetR(70.0f); dComIfG_Ccsp()->Set(&mTongueCcSph[0]); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_TONGUE_4)); mDoMtx_stack_c::transM(-30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mTongueCcSph[1].SetC(center); mTongueCcSph[1].SetR(70.0f); dComIfG_Ccsp()->Set(&mTongueCcSph[1]); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_LEG_L1)); mDoMtx_stack_c::transM(130.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mLegCcSph[0].SetC(center); mLegCcSph[0].SetR(100.0f); dComIfG_Ccsp()->Set(&mLegCcSph[0]); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_LEG_R1)); mDoMtx_stack_c::transM(130.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mLegCcSph[1].SetC(center); mLegCcSph[1].SetR(100.0f); dComIfG_Ccsp()->Set(&mLegCcSph[1]); } /* 806B4FD8-806B5130 0077B8 0158+00 1/1 0/0 0/0 .text execute__8daE_DT_cFv */ int daE_DT_c::execute() { if (mTimer != 0) { mTimer--; } if (mWalkTimer != 0) { mWalkTimer--; } if (mDamageTimer != 0) { mDamageTimer--; } if (mDemoTimer != 0) { mDemoTimer--; } if (mQuakeTimer != 0) { mQuakeTimer--; if (mQuakeTimer == 0) { dComIfGp_getVibration().StopQuake(0x1f); } } if (mBodyDamageTimer != 0) { mBodyDamageTimer--; } if (mLegLDamageTimer != 0) { mLegLDamageTimer--; } if (mLegRDamageTimer != 0) { mLegRDamageTimer--; } if (mSpitTimer != 0) { mSpitTimer--; } if (field_0x714 != 0) { field_0x714--; } else if (!dComIfGs_isOneZoneSwitch(2, fopAcM_GetRoomNo(this))) { dComIfGs_onOneZoneSwitch(2, fopAcM_GetRoomNo(this)); } action(); mtx_set(); cc_set(); return 1; } /* 806B5130-806B5150 007910 0020+00 2/1 0/0 0/0 .text daE_DT_Execute__FP8daE_DT_c */ static int daE_DT_Execute(daE_DT_c* i_this) { return i_this->execute(); } /* 806B5150-806B5158 007930 0008+00 1/0 0/0 0/0 .text daE_DT_IsDelete__FP8daE_DT_c */ static int daE_DT_IsDelete(daE_DT_c* i_this) { return 1; } /* 806B5158-806B51F4 007938 009C+00 1/1 0/0 0/0 .text _delete__8daE_DT_cFv */ int daE_DT_c::_delete() { dComIfG_resDelete(&mPhase[0], "E_DT"); dComIfG_resDelete(&mPhase[1], "Dalways"); dComIfG_resDelete(&mPhase[2], "E_OT"); if (mHIOInit) { hioInit = false; } if (heap != NULL) { mSound.deleteObject(); } return 1; } /* 806B51F4-806B5214 0079D4 0020+00 1/0 0/0 0/0 .text daE_DT_Delete__FP8daE_DT_c */ static int daE_DT_Delete(daE_DT_c* i_this) { return i_this->_delete(); } /* 806B5214-806B5440 0079F4 022C+00 1/1 0/0 0/0 .text CreateHeap__8daE_DT_cFv */ int daE_DT_c::CreateHeap() { J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes("E_DT", 28); mpMorf = new mDoExt_McaMorfSO(model_data, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_DT", 23), J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, &mSound, 0, 0x11000084); if (mpMorf == NULL || mpMorf->getModel() == NULL) { return 0; } J3DModel* model = mpMorf->getModel(); model->setUserArea((uintptr_t)this); for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); } model_data = (J3DModelData*)dComIfG_getObjectRes("Dalways", "BoxB.bmd"); mpChestModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084); if (mpChestModel == NULL) { return 0; } model_data = (J3DModelData*)dComIfG_getObjectRes("E_DT", 29); mpSpitModel = mDoExt_J3DModel__create(model_data, 0, 0x11000084); if (mpSpitModel == NULL) { return 0; } mpSpitModel->setUserArea((uintptr_t)this); for (u16 i = 1; i < mpSpitModel->getModelData()->getJointNum(); i++) { mpSpitModel->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBackTuba); } model_data = (J3DModelData*)dComIfG_getObjectRes("E_DT", 30); mpSpitBModel = mDoExt_J3DModel__create(model_data, 0, 0x11000084); if (mpSpitBModel == NULL) { return 0; } return 1; } /* 806B5440-806B5460 007C20 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { return static_cast(i_this)->CreateHeap(); } /* 806B5460-806B592C 007C40 04CC+00 1/1 0/0 0/0 .text create__8daE_DT_cFv */ cPhs__Step daE_DT_c::create() { fopAcM_SetupActor(this, daE_DT_c); cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase[0], "E_DT"); if (step != cPhs_COMPLEATE_e) { return step; } step = (cPhs__Step)dComIfG_resLoad(&mPhase[1], "Dalways"); if (step != cPhs_COMPLEATE_e) { return step; } step = (cPhs__Step)dComIfG_resLoad(&mPhase[2], "E_OT"); if (step != cPhs_COMPLEATE_e) { return step; } mSwBit = fopAcM_GetParam(this) & 0xff; if (dComIfGs_isSwitch(mSwBit, fopAcM_GetRoomNo(this))) { return cPhs_ERROR_e; } if (dComIfGs_isStageMiddleBoss()) { return cPhs_ERROR_e; } if (!fopAcM_entrySolidHeap(this, useHeapInit, 0xa840)) { return cPhs_ERROR_e; } if (!hioInit) { hioInit = true; mHIOInit = true; l_HIO.field_0x4 = -1; } attention_info.flags = fopAc_AttnFlag_BATTLE_e; fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(this, -700.0f, -200.0f, -700.0f); fopAcM_SetMax(this, 700.0f, 500.0f, 700.0f); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); mAcchCir.SetWall(50.0f, 500.0f); health = 400; field_0x560 = 400; mCcStts.Init(0xff, 0, this); mBodyCcSph[0].Set(E_DT_n::cc_dt_body_src); mBodyCcSph[0].SetStts(&mCcStts); mBodyCcSph[1].Set(E_DT_n::cc_dt_body_src); mBodyCcSph[1].SetStts(&mCcStts); mLegCcSph[0].Set(E_DT_n::cc_dt_body_src); mLegCcSph[0].SetStts(&mCcStts); mLegCcSph[1].Set(E_DT_n::cc_dt_body_src); mLegCcSph[1].SetStts(&mCcStts); mTongueCcSph[0].Set(E_DT_n::cc_dt_tongue_src); mTongueCcSph[0].SetStts(&mCcStts); mTongueCcSph[1].Set(E_DT_n::cc_dt_tongue_src); mTongueCcSph[1].SetStts(&mCcStts); attention_info.distances[fopAc_attn_BATTLE_e] = 4; mSound.init(¤t.pos, &eyePos, 3, 1); mAtInfo.mpSound = &mSound; mAtInfo.mPowerType = 1; gravity = 0.0f; maxFallSpeed = l_HIO.mMaxFallSpeed; mScale = l_HIO.mScale; if (daPy_getPlayerActorClass()->current.pos.y < -800.0f) { cDmr_SkipInfo = 0; } if (daPy_getPlayerActorClass()->current.pos.z > 3000.0f) { cDmr_SkipInfo = 0; } if (cDmr_SkipInfo != 0) { cDmr_SkipInfo = 0; gravity = -5.0f; setActionMode(ACT_WAIT, 0); maxFallSpeed = l_HIO.mMaxFallSpeed; attention_info.flags = fopAc_AttnFlag_BATTLE_e; current.pos.set(0.0f, 0.0f, -500.0f); shape_angle.y = cLib_targetAngleY(¤t.pos, &daPy_getPlayerActorClass()->current.pos); Z2GetAudioMgr()->subBgmStart(Z2BGM_DEKUTOAD); dComIfGs_onOneZoneSwitch(3, fopAcM_GetRoomNo(this)); } else { setActionMode(ACT_OPENING, 0); field_0x714 = 600; } daE_DT_Execute(this); return step; } /* 806B5BBC-806B5BDC 00839C 0020+00 1/0 0/0 0/0 .text daE_DT_Create__FP8daE_DT_c */ static cPhs__Step daE_DT_Create(daE_DT_c* i_this) { return i_this->create(); } /* 806B61B0-806B61D0 -00001 0020+00 1/0 0/0 0/0 .data l_daE_DT_Method */ static actor_method_class l_daE_DT_Method = { (process_method_func)daE_DT_Create, (process_method_func)daE_DT_Delete, (process_method_func)daE_DT_Execute, (process_method_func)daE_DT_IsDelete, (process_method_func)daE_DT_Draw, }; /* 806B61D0-806B6200 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_DT */ extern actor_process_profile_definition g_profile_E_DT = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_E_DT, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daE_DT_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 202, // mPriority &l_daE_DT_Method, // sub_method 0x00040000, // mStatus fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; AUDIO_INSTANCES