/** * @file d_a_e_vt.cpp * Variant Enemy (Death Sword) */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_e_vt.h" #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "SSystem/SComponent/c_math.h" #include "c/c_damagereaction.h" #include #include "d/actor/d_a_player.h" #include "d/d_com_inf_game.h" #include "d/d_s_play.h" #include "d/d_camera.h" #include "f_op/f_op_actor_enemy.h" #include "f_op/f_op_camera_mng.h" #include "Z2AudioLib/Z2Instances.h" #define WL_CUT_TYPE_SMALL 1 #define WL_CUT_TYPE_JUMP 2 #define WL_CUT_TYPE_LARGE 3 class daE_VA_HIO_c { public: daE_VA_HIO_c(); virtual ~daE_VA_HIO_c() {} /* 0x04 */ s8 field_0x04; /* 0x08 */ f32 mModelSize; /* 0x0C */ f32 mAttackRange; /* 0x10 */ f32 mBiteCount; /* 0x14 */ f32 mCircleAttackRadius; /* 0x18 */ f32 mFadeAwayTime; /* 0x1C */ f32 mDownTime; /* 0x20 */ f32 mDownHP; /* 0x24 */ f32 field_0x24; /* 0x28 */ f32 field_0x28; /* 0x2C */ f32 field_0x2c; /* 0x30 */ f32 mKRegLightR; /* 0x34 */ f32 mKRegLightG; /* 0x38 */ f32 mKRegLightB; /* 0x3C */ f32 mKRegLightA; }; enum daE_VA_JOINT { JNT_ROOT, JNT_BACKBONE_01, JNT_BACKBONE_02, JNT_ARM_L01, JNT_ARM_L02, JNT_ARM_L03, JNT_ARM_L04, JNT_ARM_L05, JNT_FINGER_LB, JNT_FINGER_LC, JNT_FINGER_LA, JNT_LEFT_COTH_01, JNT_LEFT_COTH_02, JNT_LEFT_COTH_03, JNT_LEFT_COTH_04, JNT_ARM_R01, JNT_ARM_R02, JNT_ARM_R03, JNT_ARM_R04, JNT_ARM_R05, JNT_FINGER_RB, JNT_FINGER_RC, JNT_KEN_1, JNT_KEN_2, JNT_FINGER_RA, JNT_BUST, JNT_NECK_CLOTH, JNT_NECK_01, JNT_HEAD_CLOTH_01, JNT_HEAD_CLOTH_02, JNT_HEAD_CLOTH_03, JNT_HEAD_CLOTH_04, JNT_HEAD_CLOTH_05, JNT_NECK_02, JNT_HEAD, JNT_JOE, JNT_WAIST, JNT_BACK_CLOTH_01, JNT_BACK_CLOTH_02, JNT_BACK_CLOTH_03, JNT_FRONT_CLOTH_01, JNT_FRONT_CLOTH_02, JNT_FRONT_CLOTH_03, JNT_LEG_L01, JNT_LEG_L02, JNT_LEG_L03, JNT_LEG_R01, JNT_LEG_R02, JNT_LEG_R03, JNT_TAIL_CLOTH_01, JNT_TAIL_CLOTH_02, JNT_TAIL_CLOTH_03, JNT_TAIL_CLOTH_04, }; namespace { static dCcD_SrcSph cc_vt_neck_src = { { {0x0, {{0x0, 0x0, 0x0}, {0x80000000, 0x3}, 0x0}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x4}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; static dCcD_SrcCyl cc_vt_body_src = { { {0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { { {0.0f, 0.0f, 0.0f}, // mCenter 150.0f, // mRadius 158.0f // mHeight } // mCyl } }; static dCcD_SrcSph cc_vt_attack_src = { { {0x0, {{0x100000, 0x2, 0xD}, {0xD8FBFDFF, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x1, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; static dCcD_SrcSph cc_vt_line_src = { { {0x0, {{0x0, 0x0, 0x0}, {0xD8FBFDFF, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; static dCcD_SrcSph cc_vt_magic_src = { { {0x0, {{0x400, 0x2, 0xD}, {0xD8FBFDFF, 0x0}, 0x0}}, // mObj {0xD, 0x0, 0x1, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; // !@bug The i<40 loops that index these arrays read one element past the end; on // GC/Wii the OOB reads land on adjacent rodata instead of a defined value. #if AVOID_UB static u8 va_tag_set_size[40] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, }; static u8 va_tag_set_num[40] = { 0x01, 0x0C, 0x16, 0x1F, 0x21, 0x2A, 0x2B, 0x02, 0x04, 0x0D, 0x0F, 0x15, 0x18, 0x20, 0x2C, 0x03, 0x05, 0x06, 0x0B, 0x10, 0x17, 0x19, 0x1A, 0x22, 0x24, 0x29, 0x2D, 0x34, 0x49, 0x52, 0x36, 0x3E, 0x54, 0x5C, 0x39, 0x41, 0x4C, 0x56, 0x5E, 0x00, }; static f32 va_tag_offset[40] = { 20.0f, 20.0f, 20.0f, 20.0f, 20.0f, 0.0f, 40.0f, 0.0f, 30.0f, 10.0f, 0.0f, 0.0f, 20.0f, 0.0f, 10.0f, 20.0f, 40.0f, 0.0f, 20.0f, 0.0f, 0.0f, 20.0f, 0.0f, 10.0f, 0.0f, 0.0f, 20.0f, 10.0f, 20.0f, 30.0f, 0.0f, 10.0f, 20.0f, 0.0f, 0.0f, 10.0f, 20.0f, 30.0f, 0.0f, 0.0f, }; #else static u8 va_tag_set_size[39] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, }; static u8 va_tag_set_num[39] = { 0x01, 0x0C, 0x16, 0x1F, 0x21, 0x2A, 0x2B, 0x02, 0x04, 0x0D, 0x0F, 0x15, 0x18, 0x20, 0x2C, 0x03, 0x05, 0x06, 0x0B, 0x10, 0x17, 0x19, 0x1A, 0x22, 0x24, 0x29, 0x2D, 0x34, 0x49, 0x52, 0x36, 0x3E, 0x54, 0x5C, 0x39, 0x41, 0x4C, 0x56, 0x5E, }; static f32 va_tag_offset[39] = { 20.0f, 20.0f, 20.0f, 20.0f, 20.0f, 0.0f, 40.0f, 0.0f, 30.0f, 10.0f, 0.0f, 0.0f, 20.0f, 0.0f, 10.0f, 20.0f, 40.0f, 0.0f, 20.0f, 0.0f, 0.0f, 20.0f, 0.0f, 10.0f, 0.0f, 0.0f, 20.0f, 10.0f, 20.0f, 30.0f, 0.0f, 10.0f, 20.0f, 0.0f, 0.0f, 10.0f, 20.0f, 30.0f, 0.0f, }; #endif } // namespace daE_VA_HIO_c::daE_VA_HIO_c() { field_0x04 = -1; mModelSize = 1.2f; mAttackRange = 500.0f; mBiteCount = 7.0f; mFadeAwayTime = 2500.0f; mCircleAttackRadius = 1000.0f; mDownTime = 100.0f; mDownHP = 800.0f; field_0x24 = 0.5f; field_0x28 = 3.0f; field_0x2c = -50.0f; mKRegLightR = 40.0f; mKRegLightG = 35.0f; mKRegLightB = 82.0f; mKRegLightA = 210.0f; } #pragma push #pragma force_active on static u8 hio_set; #pragma pop static daE_VA_HIO_c l_HIO; int daE_VA_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { int joint_no = i_joint->getJntNo(); mDoMtx_stack_c::copy(i_model->getAnmMtx(joint_no)); switch (joint_no) { case JNT_LEFT_COTH_01: case JNT_LEFT_COTH_02: case JNT_LEFT_COTH_03: case JNT_LEFT_COTH_04: if (field_0x138b) { mDoMtx_stack_c::transS(field_0x140c[joint_no - JNT_LEFT_COTH_01]); mDoMtx_stack_c::YrotM(field_0x130c); mDoMtx_stack_c::ZrotM(field_0x130e); mDoMtx_stack_c::ZrotM(field_0x1448[joint_no - JNT_LEFT_COTH_01].z); mDoMtx_stack_c::YrotM(field_0x1448[joint_no - JNT_LEFT_COTH_01].y); mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); } break; case JNT_NECK_01: mDoMtx_stack_c::YrotM(field_0x1398); if (field_0x1391 == 1) { mDoMtx_stack_c::XrotM(field_0x1394); mDoMtx_stack_c::ZrotM(field_0x1396); } break; case JNT_NECK_02: mDoMtx_stack_c::YrotM(field_0x1398); if (field_0x1391 == 2) { mDoMtx_stack_c::XrotM(field_0x1394); } break; case JNT_HEAD: if (field_0x1391 == 2) { mDoMtx_stack_c::ZrotM(field_0x1396); } break; } i_model->setAnmMtx(joint_no, mDoMtx_stack_c::get()); cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); return 1; } int daE_VA_c::JointCallBack(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { J3DModel* model = j3dSys.getModel(); daE_VA_c* a_this = (daE_VA_c*)model->getUserArea(); if (a_this != NULL) { a_this->ctrlJoint(i_joint, model); } } return 1; } void daE_VA_c::calcJointNeck() { csXyz sp18; if (field_0x1391 != 0) { s16 angleY_to_player = fopAcM_searchPlayerAngleY(this) - shape_angle.y; if (angleY_to_player > 0x3000) { angleY_to_player = 0x3000; } if (angleY_to_player < -0x3000) { angleY_to_player = -0x3000; } cLib_addCalcAngleS(&field_0x1394, angleY_to_player, 8, 0x800, 0x40); s16 angleX_to_player = 0x1400 - fopAcM_searchPlayerAngleX(this); if (angleX_to_player > 0x3000) { angleX_to_player = 0x3000; } if (angleX_to_player < -0x3000) { angleX_to_player = -0x3000; } cLib_addCalcAngleS(&field_0x1396, angleX_to_player, 8, 0x800, 0x40); if (checkBck(ANM_SUBS_INVITE_A_e) || checkBck(ANM_SUBS_INVITE_B_e)) { cLib_addCalcAngleS(&field_0x1398, -0x800, 8, 0x80, 0x40); } else if (checkBck(ANM_SUBS_INVITE_C_e)) { cLib_addCalcAngleS(&field_0x1398, -0x1800, 8, 0x80, 0x40); } else { cLib_addCalcAngleS(&field_0x1398, -0x1800, 8, 0x100, 0x40); } field_0x1392 = field_0x1391; } else { field_0x1391 = field_0x1392; cLib_addCalcAngleS(&field_0x1394, 0, 8, 0x100, 0x40); cLib_addCalcAngleS(&field_0x1396, 0, 8, 0x100, 0x40); cLib_addCalcAngleS(&field_0x1398, 0, 8, 0x100, 0x40); } } void daE_VA_c::calcJointSleeve() { csXyz sp128; cXyz sp90(field_0x13b8); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_LEFT_COTH_01)); mDoMtx_stack_c::multVecZero(&field_0x13b8); mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &sp128); f32 anm_frame = mpMorf->getFrame(); if ((checkBck(ANM_SUBS_ATTACK_A1_e) && anm_frame >= 74.0f) || (checkBck(ANM_SUBS_ATTACK_A3_e) && anm_frame <= 11.0f) || (checkBck(ANM_TRANS_ATTACK_A1_e) && anm_frame >= 60.0f) || checkBck(ANM_TRANS_ATTACK_A2_e) || (checkBck(ANM_TRANS_ATTACK_A3_e) && anm_frame <= 60.0f)) { sp128.y = field_0x1466[0].y; } field_0x13c4 = field_0x13b8 - sp90; cXyz sp9C; cXyz spA8; cXyz spB4; field_0x13d0[0] = field_0x13c4; field_0x140c[0] = field_0x13b8; cXyz* line_pos = field_0x139c.getPos(0); *line_pos = field_0x140c[0]; field_0x1466[0].set(-0x8000, sp128.y, -0x8000); line_pos++; for (int i = 1; i < 5; i++, line_pos++) { f32 var_f29; if (i == 1) { var_f29 = ZREG_F(0) + 80.0f; } if (i == 2) { var_f29 = ZREG_F(1) + 80.0f; } if (i == 3) { var_f29 = ZREG_F(2) + 50.0f; } if (i == 4) { var_f29 = ZREG_F(3) + 50.0f; } if (field_0x140c[i].abs(field_0x140c[i - 1]) > (var_f29 + 30.0f) + nREG_F(3)) { spA8 = field_0x140c[i - 1] - field_0x140c[i]; f32 temp_f28 = spA8.abs(); spA8.normalizeZP(); spA8 = spA8 * (temp_f28 - var_f29); field_0x13d0[i].x = spA8.x; field_0x13d0[i].z = spA8.z; if (std::abs(field_0x140c[i].y - field_0x140c[i - 1].y) > var_f29) { field_0x13d0[i].y = spA8.y; } else if (spA8.y >= 0.0f) { if (field_0x13d0[i].y < spA8.y) { field_0x13d0[i].y = spA8.y; } } else { field_0x13d0[i].y -= l_HIO.field_0x28; if (field_0x140c[i].y < field_0x140c[i - 1].y - (var_f29 * 0.8f)) { if (field_0x13d0[i].y <= -10.0f) { field_0x13d0[i].y = -10.0f; } } else if (field_0x13d0[i].y <= l_HIO.field_0x2c) { field_0x13d0[i].y = l_HIO.field_0x2c; } } } else { field_0x13d0[i].x *= l_HIO.field_0x24; field_0x13d0[i].z *= l_HIO.field_0x24; field_0x13d0[i].y -= l_HIO.field_0x28; if (field_0x140c[i].y < field_0x140c[i - 1].y - (var_f29 * 0.8f)) { if (field_0x13d0[i].y <= -10.0f) { field_0x13d0[i].y = -10.0f; } } else if (field_0x13d0[i].y <= l_HIO.field_0x2c) { field_0x13d0[i].y = l_HIO.field_0x2c; } } if (field_0x1354 != 0) { field_0x13d0[i].y -= l_HIO.field_0x28; if (field_0x13d0[i].y <= l_HIO.field_0x2c) { field_0x13d0[i].y = l_HIO.field_0x2c; } } field_0x140c[i] += field_0x13d0[i]; if (field_0x140c[i].y < 0.0f) { field_0x13d0[i] *= 0.1f; field_0x13d0[i].y = 0.0f; field_0x140c[i].y = 0.0f; } spA8 = field_0x140c[i] - field_0x140c[i - 1]; spA8.normalizeZP(); field_0x140c[i] = field_0x140c[i - 1] + (spA8 * var_f29); line_pos[0] = field_0x140c[i]; spA8 = line_pos[0] - line_pos[-1]; mDoMtx_stack_c::YrotS(-sp128.y); mDoMtx_stack_c::transM(spA8); mDoMtx_stack_c::multVecZero(&spA8); field_0x1466[i].x = cM_atan2s(spA8.z, spA8.y); field_0x1466[i].y = cM_atan2s(spA8.x, spA8.z); field_0x1466[i].z = cM_atan2s(spA8.x, spA8.y); } field_0x130c = sp128.y; field_0x130e = -0x4000; cXyz sp80; cXyz sp74; cXyz sp68; cXyz sp5C; for (int i = 0; i < 4; i++) { field_0x1448[i].y = field_0x1466[i + 1].x - field_0x1466[0].x; field_0x1448[i].z = field_0x1466[0].z - field_0x1466[i + 1].z; if (abs(field_0x1448[i].z) >= 0x4000) { field_0x1448[i].y = 0x8000 - field_0x1448[i].y; } } } int daE_VA_c::draw() { J3DModel* model = mpMorf->getModel(); g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); if (!mPlayEndEf) { if (!mRopesEnabled) { g_env_light.setLightTevColorType_MAJI(model, &tevStr); J3DModelData* modelData = model->getModelData(); for (u16 i = 0; i < modelData->getMaterialNum(); i++) { J3DMaterial* material = modelData->getMaterialNodePointer(i); material->getZMode()->setUpdateEnable(1); material->setZCompLoc(1); material->setMaterialMode(4); if (i == 0) { material->getTevKColor(3)->a = mEyeAlpha; } else { material->getTevKColor(0)->r = mGlowLightR; material->getTevKColor(0)->g = mGlowLightG; material->getTevKColor(0)->b = mGlowLightB; if (!field_0x1318) { material->getTevColor(0)->r = field_0x1380; material->getTevColor(0)->g = field_0x1380; material->getTevColor(0)->b = field_0x1380; } else { material->getTevColor(0)->r = field_0x1318; material->getTevColor(0)->g = field_0x1318; material->getTevColor(0)->b = field_0x1318; } material->getTevKColor(3)->a = mGlowLightA; } J3DBlend* blend = material->getBlend(); if (mAlphaType >= 2) { blend->setDstFactor(5); } else { blend->setDstFactor(1); } } mInvisModel.entryDL(NULL); } } else { model = mpEndEfMorf->getModel(); g_env_light.setLightTevColorType_MAJI(model, &tevStr); mpEndEfBrk->entry(model->getModelData()); mpEndEfMorf->entryDL(); } f32 var_f31 = tevStr.field_0x344; if (mAlphaType == 2) { f32 temp_f2 = (1000.0f - current.pos.y) / 1000.0f; if (temp_f2 < 0.0f) { temp_f2 = 0.0f; } if (temp_f2 > 1.0f) { temp_f2 = 1.0f; } tevStr.field_0x344 = temp_f2 * ((var_f31 * (f32)mGlowLightA) / 255.0f); if (tevStr.field_0x344 > 0.4f) { tevStr.field_0x344 = 0.4f; } mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, ¤t.pos, nREG_F(19) + 2000.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } if (mpWeaponModel != NULL && field_0x1240 != 2) { g_env_light.setLightTevColorType_MAJI(mpWeaponModel, &tevStr); mpWeaponBrk->entry(mpWeaponModel->getModelData()); fopAcM_setEffectMtx(this, mpWeaponModel->getModelData()); mDoExt_modelUpdateDL(mpWeaponModel); if (mAlphaType == 2) { dComIfGd_addRealShadow(mShadowKey, mpWeaponModel); } else { tevStr.field_0x344 = var_f31; mShadowKey = dComIfGd_setShadow(mShadowKey, 1, mpWeaponModel, ¤t.pos, nREG_F(19) + 2000.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } } if (mRopesEnabled) { if (mDrawRopes) { static GXColor l_color = {0x64, 0x46, 0x00, 0xFF}; mRope.update(110, l_color, &tevStr); dComIfGd_set3DlineMatDark(&mRope); } for (int i = 0; i < 40; i++) { if (!(mCardFlags[i] & 0x80)) { g_env_light.setLightTevColorType_MAJI(mpCardModels[i], &tevStr); mDoExt_modelUpdateDL(mpCardModels[i]); } } } return 1; } static int daE_VA_Draw(daE_VA_c* i_this) { return i_this->draw(); } void daE_VA_c::setBck(int i_anmID, u8 i_attr, f32 i_morf, f32 i_rate) { mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_VA", i_anmID), i_attr, i_morf, i_rate, 0.0f, -1.0f); } bool daE_VA_c::checkBck(int i_anmID) { J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes("E_VA", i_anmID); return mpMorf->getAnm() == pbck ? TRUE : FALSE; } void daE_VA_c::setActionMode(int i_action, int i_mode) { if (dComIfGs_isOneZoneSwitch(6, fopAcM_GetRoomNo(this)) && i_action != ACTION_OPACI_DOWN_e && i_action != ACTION_OPACI_DOWN_DAMAGE_e) { dComIfGs_offOneZoneSwitch(6, fopAcM_GetRoomNo(this)); if (!dComIfGs_isOneZoneSwitch(7, fopAcM_GetRoomNo(this))) { dComIfGs_onOneZoneSwitch(7, fopAcM_GetRoomNo(this)); } } field_0x1381 = 0; mAction = i_action; mMode = i_mode; mGlowBody = 0; } int daE_VA_c::getWolfCutType() { switch (daPy_getPlayerActorClass()->getCutType()) { case daPy_py_c::CUT_TYPE_WOLF_B_LEFT: case daPy_py_c::CUT_TYPE_WOLF_B_RIGHT: return WL_CUT_TYPE_SMALL; case daPy_py_c::CUT_TYPE_WOLF_JUMP: return WL_CUT_TYPE_JUMP; case daPy_py_c::CUT_TYPE_WOLF_B_FRONT: case daPy_py_c::CUT_TYPE_WOLF_B_BACK: case daPy_py_c::CUT_TYPE_WOLF_UNK_30: case daPy_py_c::CUT_TYPE_WOLF_JUMP_S: case daPy_py_c::CUT_TYPE_WOLF_JUMP_S_FINISH: case daPy_py_c::CUT_TYPE_WOLF_TURN_LEFT: case daPy_py_c::CUT_TYPE_WOLF_TURN_RIGHT: case daPy_py_c::CUT_TYPE_WOLF_UNK_35: case daPy_py_c::CUT_TYPE_WOLF_LOCK: return WL_CUT_TYPE_LARGE; } return 0; } void daE_VA_c::onSwordAtBit() { mAttackSphs[0].OnAtSetBit(); mAttackSphs[1].OnAtSetBit(); mAttackSphs[2].OnAtSetBit(); mAttackSphs[3].OnAtSetBit(); } void daE_VA_c::offSwordShield() { if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_WOLF_JUMP) { mOffTgTimer = 3; for (int i = 0; i < 4; i++) { mAttackSphs[i].OffCoSetBit(); mAttackSphs[i].OffTgShield(); mAttackSphs[i].OnTgNoHitMark(); } } } void daE_VA_c::setTransDamage(cXyz* param_0) { u16 hitmark; if (field_0x138f >= 4) hitmark = 3; else hitmark = 1; dComIfGp_setHitMark(hitmark, this, param_0, NULL, NULL, 0); dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); setActionMode(ACTION_TRANS_DAMAGE_e, 0); } void daE_VA_c::damage_check() { daPy_py_c* player = daPy_getPlayerActorClass(); int cut_type = getWolfCutType(); mBodyCcStts.Move(); if (mAttackSphIFrameTimer == 0) { for (int i = 0; i < 4; i++) { if (mAttackSphs[i].ChkTgHit()) { if (mAttackSphs[i].GetTgHitObj()->ChkAtType(0xD8000000)) { mAttackSphIFrameTimer = 20; } else { mAttackSphIFrameTimer = 10; } def_se_set(&mSound, mAttackSphs[i].GetTgHitObj(), 0x2A, this); mAttackSphs[i].ClrTgHit(); } } } if (mRopesEnabled) { if (mAction == ACTION_DEMO_OP_WAIT_e) { for (int i = 0; i < 190; i++) { if (mLineSphs[i].ChkTgHit()) { if (mLineSphs[i].GetTgHitObj()->ChkAtType(AT_TYPE_NORMAL_SWORD)) { setActionMode(ACTION_DEMO_OP_e, 0); } else { int var_r24 = i / 19; field_0x1104[var_r24] = nREG_F(17) + 1.0f; field_0x112c[var_r24] = 0; setVibTag(0, var_r24); } } } } } else { if (mNeckSphIFrameTimer == 0 && mNeckSph.ChkTgHit()) { mAtInfo.mpCollider = mNeckSph.GetTgHitObj(); if (mAtInfo.mpCollider->ChkAtType(0xD8000000)) { if (cut_type == WL_CUT_TYPE_SMALL) { mNeckSphIFrameTimer = 15; } else { mNeckSphIFrameTimer = 20; } } else { mNeckSphIFrameTimer = 10; } if (mAtInfo.mAttackPower <= 1) { mNeckSphIFrameTimer = KREG_S(8) + 10; } mOffTgTimer = mNeckSphIFrameTimer; if (cut_type != WL_CUT_TYPE_SMALL && mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK) && player->onWolfEnemyHangBite(this)) { setActionMode(ACTION_TRANS_BITE_DAMAGE_e, 0); mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 31); mBodyCylIFrameTimer = 20; return; } if (mAlphaType == 1 && mGlowBody != 0) { mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 32); setTransDamage(mNeckSph.GetTgHitPosP()); return; } if (cut_type == WL_CUT_TYPE_JUMP) { setActionMode(ACTION_TRANS_THROUGH_e, 0); mNeckSph.ClrTgHit(); return; } mNeckSphIFrameTimer = 0; mOffTgTimer = 0; } if (mBodyCylIFrameTimer == 0) { BOOL body_hit = false; dCcD_Cyl hit_cyl; if (mBodyCyls[0].ChkTgHit()) { mAtInfo.mpCollider = mBodyCyls[0].GetTgHitObj(); body_hit = true; hit_cyl = mBodyCyls[0]; } if (mBodyCyls[1].ChkTgHit()) { mAtInfo.mpCollider = mBodyCyls[1].GetTgHitObj(); body_hit = true; hit_cyl = mBodyCyls[1]; } if (body_hit) { if (mAlphaType != 2 && mAtInfo.mpCollider->ChkAtType(0xD8000000) && mGlowBody == 0) { mBodyCyls[0].ClrTgHit(); mBodyCyls[1].ClrTgHit(); return; } mAtInfo.field_0x18 = 0; health = 100; cc_at_check(this, &mAtInfo); field_0x1368 = 100 - health; if (mAtInfo.mpCollider->ChkAtType(0xD8000000)) { mBodyCylIFrameTimer = 20; } else { mBodyCylIFrameTimer = 10; } if (mAtInfo.mAttackPower <= 1) { mBodyCylIFrameTimer = KREG_S(8) + 10; } mOffTgTimer = mBodyCylIFrameTimer; if (mAlphaType == 1) { setTransDamage(hit_cyl.GetTgHitPosP()); } else if (mAlphaType == 2) { if (field_0x1381 == 0) { field_0x1385 = 0; if (mAction == ACTION_OPACI_FLY_e) { if (mAtInfo.mpCollider->ChkAtType(0x16060)) { setActionMode(ACTION_OPACI_DAMAGE_e, 0); } } else if (mAtInfo.mpCollider->ChkAtType(0x14050)) { if (field_0x1386 != 0) { setActionMode(ACTION_OPACI_DOWN_DAMAGE_e, 2); mDownTimer = l_HIO.mDownTime; field_0x1381 = 1; } else { dComIfGp_getVibration().StopQuake(31); setActionMode(ACTION_OPACI_DAMAGE_e, 10); } } else if (mAtInfo.mAttackPower != 0) { setActionMode(ACTION_OPACI_DOWN_e, 0); field_0x1381 = 1; } } else { BOOL var_r26 = false; if (player->getCutCount() >= 4) { if (field_0x1383 != 0) { var_r26 = true; } } else if (((dCcD_GObjInf*)mAtInfo.mpCollider)->GetAtSpl() == 1) { field_0x1385++; if (field_0x1385 >= 2) { var_r26 = true; } } int var_r29 = 0; if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_NORMAL_SWORD)) { if (mAtInfo.mpCollider->GetAtAtp() >= 4) { if (player->checkMasterSwordEquip()) { if (player->getSwordAtUpTime() != 0) { var_r29 = 6; } else { var_r29 = 2; } } else if (player->getSwordAtUpTime() != 0) { var_r29 = 2; } else { var_r29 = 1; } } else if (player->checkMasterSwordEquip()) { if (player->getSwordAtUpTime() != 0 || var_r26) { var_r29 = 2; } } else if (var_r26) { if (player->getSwordAtUpTime() != 0) { var_r29 = 2; } else { var_r29 = 1; } } } else if (mAtInfo.mpCollider->ChkAtType(0xD8000000) && (((dCcD_GObjInf*)mAtInfo.mpCollider)->GetAtSpl() == 1 || mAtInfo.mpCollider->GetAtAtp() >= 4)) { var_r29 = 1; } field_0x1383++; if (var_r29 != 0) { field_0x1385 = 0; field_0x1384 += var_r29; setActionMode(ACTION_OPACI_DOWN_e, 5); } else if (mAtInfo.mpCollider->ChkAtType(0x4050)) { setActionMode(ACTION_OPACI_DOWN_DAMAGE_e, 2); } else { if (player->getCutCount() > 1) { field_0x1382 ^= 1; } else if (cM_rnd() < 0.5f) { field_0x1382 = 0; } else { field_0x1382 = 1; } setActionMode(ACTION_OPACI_DOWN_DAMAGE_e, field_0x1382); } field_0x1381 = 1; } } mBodyCyls[0].ClrTgHit(); mBodyCyls[1].ClrTgHit(); } } } } void daE_VA_c::setFireEffect(int param_0) { cXyz scale(1.0f, 1.0f, 1.0f); int idx = param_0 * 3; field_0x10f80[idx] = dComIfGp_particle_set(field_0x10f80[idx], 0x3AD, &field_0x1140[param_0], NULL, &scale); field_0x10f80[idx + 1] = dComIfGp_particle_set(field_0x10f80[idx + 1], 0x3AF, &field_0x1140[param_0], NULL, &scale); field_0x10f80[idx + 2] = dComIfGp_particle_set(field_0x10f80[idx + 2], 0x3AE, &field_0x1140[param_0], NULL, &scale); } f32 dummy() { return 3.2f; } void daE_VA_c::setFootEffect() { if (!field_0x1388) { int var_r6 = 0; if (current.pos.y < 10.0f) { var_r6 = 2; } cXyz pos(current.pos); cXyz scale(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); static u16 va_foot_smoke_id[] = {0x8891, 0x8892, 0x85C4, 0x85C5}; mFootSmokeEmtrIDs[0] = dComIfGp_particle_set(mFootSmokeEmtrIDs[0], va_foot_smoke_id[var_r6], &pos, &tevStr, &shape_angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL); mFootSmokeEmtrIDs[1] = dComIfGp_particle_set(mFootSmokeEmtrIDs[1], va_foot_smoke_id[var_r6 + 1], &pos, &tevStr, &shape_angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mFootSmokeEmtrIDs[0]); if (emitter != NULL) { emitter->setGlobalAlpha(mFootSmokeAlpha); } emitter = dComIfGp_particle_getEmitter(mFootSmokeEmtrIDs[1]); if (emitter != NULL) { emitter->setGlobalAlpha(mFootSmokeAlpha); } } } static u16 va_wepon_eff_id1[] = { 0x85D8, 0x85D9, 0x85DA, }; static u16 va_wepon_eff_id2[] = { 0x85C6, 0x85C7, 0x85C8, }; void daE_VA_c::setWeponEffect() { cXyz pos; cXyz scale(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); switch (mWeponEfMode) { case 1: pos.set(11.0f, 0.0f, -7.0f); for (int i = 0; i < 3; i++) { mWeponEffEmtrIDs[i] = dComIfGp_particle_set(mWeponEffEmtrIDs[i], va_wepon_eff_id1[i], &pos, &tevStr, &shape_angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL); } break; case 2: pos.set(11.0f, 0.0f, -7.0f); field_0x10f74 = dComIfGp_particle_set(field_0x10f74, 0x8601, &pos, &tevStr, &shape_angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL); /* fallthrough */ case 3: pos = current.pos; MtxP model_mtx = mpWeaponModel->getBaseTRMtx(); mSound.startCreatureSoundLevel(Z2SE_EN_VA_SWD_FLY, 0, -1); for (int i = 0; i < 3; i++) { mWeponEffEmtrIDs[i] = dComIfGp_particle_set(mWeponEffEmtrIDs[i], va_wepon_eff_id2[i], &pos, &tevStr, &shape_angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mWeponEffEmtrIDs[i]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(model_mtx); } } break; } } static u16 va_bugs_eff_jnt[] = { 0x01, 0x02, 0x22, 0x04, 0x05, 0x07, 0x10, 0x11, 0x13, 0x2C, 0x2F, 0x32, }; static u16 va_bugs_eff_id[] = { 0x85E1, 0x85E2, 0x85E3, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E4, 0x85E5, 0x85E6, }; void daE_VA_c::setBugsEffect() { J3DModel* model = mpMorf->getModel(); JGeometry::TVec3 scale(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); for (int i = 0; i < 12; i++) { JPABaseEmitter* emitter = dComIfGp_particle_set(va_bugs_eff_id[i], ¤t.pos, NULL, NULL); if (emitter != NULL) { emitter->setGlobalSRTMatrix(model->getAnmMtx(va_bugs_eff_jnt[i])); emitter->setGlobalParticleScale(scale); } } } static u16 va_weapon_land_eff_id[] = { 0x85C9, 0x85CA, 0x85CB, }; void daE_VA_c::setWeponLandEffect() { cXyz scale(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); for (int i = 0; i < 3; i++) { dComIfGp_particle_set(va_weapon_land_eff_id[i], ¤t.pos, &tevStr, &shape_angle, &scale); } } void daE_VA_c::setWeponGlow() { mWeponEffEmtrIDs[0] = dComIfGp_particle_set(mWeponEffEmtrIDs[0], 0x8600, ¤t.pos, &tevStr); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mWeponEffEmtrIDs[0]); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpWeaponModel->getBaseTRMtx()); } } void daE_VA_c::setWeponFlashScreen() { cXyz pos(0.0f, 0.0f, 0.0f); dComIfGp_particle_set(0x85FE, &pos, &tevStr, NULL, NULL); dComIfGp_particle_set(0x85FF, &pos, &tevStr, NULL, NULL); } static u16 va_magic_eff_id[] = { 0x8848, 0x8849, 0x884A, }; void daE_VA_c::setMagicEffect(int param_0) { int idx = param_0 * 3; for (int i = 0; i < 3; i++) { field_0x10f80[idx + i] = dComIfGp_particle_set(field_0x10f80[idx + i], va_magic_eff_id[i], &mMagicPos[param_0], NULL, NULL); } } void daE_VA_c::setMagicHitEffect(int param_0) { dComIfGp_particle_set(0x8846, &mMagicPos[param_0], NULL, NULL); dComIfGp_particle_set(0x8847, &mMagicPos[param_0], NULL, NULL); } void daE_VA_c::demo_skip(int param_0) { Z2GetAudioMgr()->bgmStreamStop(30); cDmr_SkipInfo = 1; dStage_changeScene(1, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1); } int daE_VA_c::DemoSkipCallBack(void* i_this, int param_1) { if (i_this != NULL) { ((daE_VA_c*)i_this)->demo_skip(param_1); return 1; } return 0; } f32 daE_VA_c::getRopeLength(int param_0) { if (param_0 < 5) { return nREG_F(18) + 115.0f; } else { return nREG_F(19) + 65.0f; } } static f32 line_pull_power[] = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, }; static cXyz line_end_pos[] = { cXyz(0.0f, 5.0f, 990.0f), cXyz(971.0f, 5.0f, 326.0f), cXyz(582.0f, 5.0f, -801.0f), cXyz(-582.0f, 5.0f, -801.0f), cXyz(-942.0f, 5.0f, 306.0f), cXyz(202.0f, 5.0f, 501.0f), cXyz(559.0f, 5.0f, -17.0f), cXyz(458.0f, 5.0f, -306.0f), cXyz(-131.0f, 5.0f, -524.0f), cXyz(-414.0f, 5.0f, 347.0f), }; static cXyz line_start_pos[] = { cXyz(-5.0f, -10.0f, -15.0f), cXyz(0.0f, 0.0f, -10.0f), cXyz(0.0f, -10.0f, -10.0f), cXyz(0.0f, 0.0f, -5.0f), cXyz(0.0f, -5.0f, -5.0f), cXyz(0.0f, 25.0f, -15.0f), cXyz(0.0f, 5.0f, -10.0f), cXyz(3.0f, 25.0f, -3.0f), cXyz(8.0f, 25.0f, 0.0f), cXyz(-8.0f, 23.0f, 8.0f), }; void daE_VA_c::calcOpRopePos() { cXyz sp60; cXyz sp6C; cXyz sp78; cXyz sp84; cXyz sp90; int idx; s16 var_r30; for (int i = 0; i < 10; i++) { int temp_3C = i * 10; mDoMtx_stack_c::transS(field_0x122c); mDoMtx_stack_c::transM(0.0f, 150.0f, 0.0f); mDoMtx_stack_c::ZXYrotM(field_0x1238); mDoMtx_stack_c::transM(0.0f, -150.0f, 0.0f); mDoMtx_stack_c::transM(0.0f, 400.0f, 0.0f); mDoMtx_stack_c::XrotM(field_0x123e); mDoMtx_stack_c::transM(0.0f, -400.0f, 0.0f); mDoMtx_stack_c::transM(line_start_pos[i]); mDoMtx_stack_c::multVecZero(&sp60); sp6C = line_end_pos[i]; if (i == nREG_S(0)) { sp6C.x += nREG_F(8); sp6C.z += nREG_F(9); } f32 var_f31 = 0.0f; if (field_0x1104[i]) { field_0x112c[i] += nREG_S(0) + 0x800; cLib_chaseF(&field_0x1104[i], 0.0f, nREG_F(19) + 0.01f); var_r30 = (s16)cLib_targetAngleY(&sp60, &sp6C); var_f31 = field_0x1104[i] * cM_ssin(field_0x112c[i]); } for (int j = 0; j < 10; j++) { idx = temp_3C + j; if (mRopeCutStatus[idx] & 2) { if (j == 0) { field_0x994[idx] = sp60; } else { field_0xe44[idx].y = 0x3130; if (abs(field_0xe44[idx].z) <= 0x20 && abs(field_0xe44[idx].x + 0x4000) <= 0x20) { field_0xe44[idx].x = -0x4000; field_0xe44[idx].z = 0; } else if (field_0xe44[idx].x < -0x4000) { field_0xe44[idx].z += 0x20; } else { field_0xe44[idx].z -= 0x20; } cLib_chaseAngleS(&field_0xe44[idx].z, 0, 8); field_0xe44[idx].x += field_0xe44[idx].z; f32 rope_len = getRopeLength(i); sp84.y = rope_len * cM_ssin(field_0xe44[idx].x); f32 temp_f31_2 = rope_len * cM_scos(field_0xe44[idx].x); sp84.x = temp_f31_2 * cM_scos(field_0xe44[idx].y); sp84.z = temp_f31_2 * cM_ssin(field_0xe44[idx].y); sp78 = field_0x994[idx - 1] + sp84; cLib_chasePos(&field_0x994[idx], sp78, 10.0f); } } else if (mRopeCutStatus[idx] & 4) { field_0x994[idx].y += -5.0f; if (field_0x994[idx].y < 5.0f) { field_0x994[idx].y = 5.0f; } } else if (mRopeCutStatus[idx] & 8) { field_0x994[idx].y += -3.0f; if (field_0x994[idx].y < 5.0f) { field_0x994[idx].y = 5.0f; } } else { if (j == 0) { field_0x994[idx] = sp60; } else if (j == 9) { field_0x994[idx] = sp6C; } else { sp84 = field_0x994[idx] - sp60; sp84.normalizeZP(); sp90 = sp6C - field_0x994[idx]; sp90.normalizeZP(); sp78 = (sp84 * line_pull_power[10 - j]) * (nREG_F(12) + 300.0f); sp78 += (sp90 * line_pull_power[j]) * (nREG_F(13) + 300.0f); sp78.y += -5.0f; sp78.normalizeZP(); field_0x994[idx] = field_0x994[idx - 1] + (sp78 * getRopeLength(i)); if (field_0x994[idx].y < 5.0f) { field_0x994[idx].y = 5.0f; } if (var_f31) { f32 temp_f29 = (nREG_F(16) + 0.2f) * ((f32)(10 - j) * var_f31); field_0x994[idx].x += temp_f29 * cM_scos(var_r30); field_0x994[idx].z += temp_f29 * cM_ssin(var_r30); } } } } } cXyz* pos; for (int i = 0; i < 11; i++) { pos = mRope.getPos(i); int temp_r5_2; if (i != 10) { int temp_r5 = i * 10; int sp68 = field_0x11b8[i] / getRopeLength(i); for (int j = 0; j < 10; j++, pos++) { temp_r5_2 = temp_r5 + j; *pos = field_0x994[temp_r5_2]; if (sp68 >= 4) { if (j <= sp68 && field_0x11b8[i]) { *pos = field_0x1140[i]; mRopeCutStatus[temp_r5_2] |= 1; } else if ((mRopeCutStatus[temp_r5_2] & 0x10) && j < 4) { *pos = field_0x994[temp_r5 + 4]; } } else if ((mRopeCutStatus[temp_r5_2] & 0x10) && j < 4) { *pos = field_0x994[temp_r5 + 4]; } else if (j <= sp68 && field_0x11b8[i]) { *pos = field_0x1140[i]; mRopeCutStatus[temp_r5_2] |= 1; } } } else { int temp_r5 = 50; int sp68 = field_0x11b8[5] / getRopeLength(5); for (int j = 0; j < 10; j++, pos++) { temp_r5_2 = temp_r5 + j; *pos = field_0x994[temp_r5_2]; if (sp68 > 3) { *pos = field_0x994[temp_r5 + 9]; } else if (j <= sp68 && field_0x11b8[5]) { *pos = field_0x1140[5]; } else if ((mRopeCutStatus[temp_r5_2] & 0x10) && j >= 3) { *pos = field_0x994[temp_r5 + 3]; } } } } for (int i = 0; i < 40; i++) { int idx = va_tag_set_num[i]; if (mRopeCutStatus[idx] & 1) { mCardFlags[i] |= 0x80; } if (mRopeCutStatus[idx] & 0xC) { mCardFlags[i] |= 0x8; } field_0x660[i].y = cLib_targetAngleY(&field_0x994[idx - 1], &field_0x994[idx + 1]) + 0x4000; } } void daE_VA_c::onRopeCutStatus(int param_0, int param_1, int param_2) { int var_r31 = param_0 * 10; for (int i = 0; i < 10; i++) { int var_r24 = var_r31 + i; if (param_2 == 0) { mRopeCutStatus[var_r24] |= 0x10; } if (i < param_1) { mRopeCutStatus[var_r24] |= 2; if (param_2 == 0) { field_0xe44[var_r24].x = cLib_targetAngleX(&field_0x994[var_r24 - 1], &field_0x994[var_r24]); field_0xe44[var_r24].y = cLib_targetAngleY(&field_0x994[var_r24 - 1], &field_0x994[var_r24]); field_0xe44[var_r24].z = 0; } } else if (param_2 == 0) { mRopeCutStatus[var_r24] |= 4; } else { mRopeCutStatus[var_r24] |= 8; } } } void daE_VA_c::setVibRope(f32 param_0, f32 param_1) { ANGLE_ADD(field_0x1336, param_1 * 7168.0f); ANGLE_ADD(field_0x122c.y, param_0 * cM_ssin(field_0x1336)); ANGLE_ADD(field_0x123e, param_0 * 50.0f * cM_ssin(field_0x1336)); } static s16 TAG_VIB_ANGLE[] = { -0x800, 0x800, -0x1000, 0x1000, }; static s16 TAG_VIB_WIDTH[] = { 0x1C0, 0x280, 0x180, 0x240, 0x380, 0x500, 0x300, 0x480, }; void daE_VA_c::setVibTag(int param_0, int param_1) { for (int i = 0; i < 40; i++) { if (param_1 == -1 || param_1 == va_tag_set_num[i] / 10) { mCardFlags[i] |= 4; if (!(mCardFlags[i] & 8)) { switch (param_0) { case 0: field_0x750[i].x += TAG_VIB_ANGLE[(int)cM_rndF(3.9f)]; field_0x750[i].z += TAG_VIB_ANGLE[(int)cM_rndF(3.9f)]; field_0x840[i].x = TAG_VIB_WIDTH[(int)(cM_rndF(3.9f) + 4.0f)]; field_0x840[i].z = TAG_VIB_WIDTH[(int)(cM_rndF(3.9f) + 4.0f)]; break; case 1: field_0x750[i].x += TAG_VIB_ANGLE[i & 3]; field_0x750[i].z += TAG_VIB_ANGLE[(i >> 1) & 3]; field_0x840[i].x = TAG_VIB_WIDTH[i & 3]; field_0x840[i].z = TAG_VIB_WIDTH[(i >> 2) & 3]; break; case 2: field_0x750[i].x += TAG_VIB_ANGLE[(i & 1) + 2]; field_0x750[i].z += TAG_VIB_ANGLE[((i >> 1) & 1) + 2]; field_0x840[i].x = TAG_VIB_WIDTH[(i & 3) + 4]; field_0x840[i].z = TAG_VIB_WIDTH[((i >> 2) & 3) + 4]; break; } field_0x660[i].x = field_0x840[i].x * cM_ssin(field_0x750[i].x); field_0x660[i].z = field_0x840[i].z * cM_ssin(field_0x750[i].z); } } } } void daE_VA_c::calcTagAngle() { for (int i = 0; i < 40; i++) { if (mCardFlags[i] & 8) { f32 var_f30; switch (mCardFlags[i] & 3) { case 0: var_f30 = 160.0f; break; case 1: var_f30 = 100.0f; break; case 2: var_f30 = 50.0f; break; } f32 var_f31 = field_0x994[va_tag_set_num[i]].y - 5.0f; if (var_f31 < var_f30) { if (var_f31) { f32 var_f29 = JMAFastSqrt(var_f30 * var_f30 - var_f31 * var_f31); if (field_0x660[i].x < 0) { field_0x660[i].x = -cM_atan2s(var_f29, var_f31); } else { field_0x660[i].x = cM_atan2s(var_f29, var_f31); } } field_0x660[i].z = 0; mCardFlags[i] |= 4; } } if (!(mCardFlags[i] & 4)) { field_0x750[i].x += TAG_VIB_ANGLE[i & 1]; field_0x750[i].z += TAG_VIB_ANGLE[(i >> 1) & 1]; cLib_chaseAngleS(&field_0x840[i].x, 0, 4); cLib_chaseAngleS(&field_0x840[i].z, 0, 4); field_0x660[i].x = field_0x840[i].x * cM_ssin(field_0x750[i].x); field_0x660[i].z = field_0x840[i].z * cM_ssin(field_0x750[i].z); } mCardFlags[i] &= ~4; } } void daE_VA_c::calcRopeFirePos() { int temp_r28; int var_r24; f32 var_f29; BOOL var_r31; cXyz sp48; for (int i = 0; i < 10; i++) { field_0x11b8[i] += nREG_F(15) + 60.0f; var_r24 = field_0x11b8[i] / getRopeLength(i); var_f29 = field_0x11b8[i] - ((f32)var_r24 * getRopeLength(i)); var_r31 = 1; if (var_r24 < 9) { temp_r28 = var_r24 + (i * 10); sp48 = field_0x994[temp_r28 + 1] - field_0x994[temp_r28]; sp48.normalizeZP(); field_0x1140[i] = field_0x994[temp_r28] + (sp48 * var_f29); } else if (cLib_chasePos(&field_0x1140[i], field_0x994[(i * 10) + 9], nREG_F(15) + 60.0f)) { var_r31 = 0; } if (var_r31) { setFireEffect(i); } } } void daE_VA_c::executeDemoOpWait() { cXyz sp34; switch (mMode) { case 0: mRopesEnabled = true; mpWeaponBrk->setPlaySpeed(0.0f); mpWeaponBrk->setFrame(0.0f); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (i < 5) { field_0x994[j + i * 10].x = j * 110.0f * cM_ssin(i * 0x3333); field_0x994[j + i * 10].z = j * 110.0f * cM_scos(i * 0x3333); field_0x994[j + i * 10].y = 275.0f - j * 30.0f; } else { field_0x994[j + i * 10].x = j * 60.0f * cM_ssin(i * 0x3333); field_0x994[j + i * 10].z = j * 60.0f * cM_scos(i * 0x3333); field_0x994[j + i * 10].y = 275.0f - j * 30.0f; } } } field_0x122c.set(51.0f, 0.0f, 0.0f); field_0x1238.set(0, -0x5000, -0x8000); field_0x123e = 0; mMode = 1; mDrawRopes = true; case 1: for (int i = 0; i < 190; i++) { if (!daPy_getPlayerActorClass()->checkNowWolf()) { mLineSphs[i].OffTgShield(); } else { mLineSphs[i].OnTgShield(); } } calcOpRopePos(); break; } calcTagAngle(); } void daE_VA_c::executeDemoOp() { camera_process_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz sp2C; cXyz sp38; f32 old; daPy_py_c* player = daPy_getPlayerActorClass(); calcOpRopePos(); switch (mMode) { case 0: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); return; } dComIfGs_onOneZoneSwitch(9, fopAcM_GetRoomNo(this)); player->changeOriginalDemo(); sp38.set(270.0f, 0.0f, 210.0f); player->setPlayerPosAndAngle(&sp38, -0x6000, 0); player->changeDemoMode(1, 0, 0, 0); camera->mCamera.Stop(); camera->mCamera.SetTrimSize(3); mDemoCamEye.set(300.0f, 300.0f, 600.0f); mDemoCamCenter.set(100.0f, 180.0f, 200.0f); mDemoCamBank = 60.0f; mDemoModeTimer = nREG_S(4) + 60; field_0x14a8 = 2.5f; onRopeCutStatus(5, 4, 0); Z2GetAudioMgr()->seStart(Z2SE_EN_VA_OPENING1, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); mMode = 1; Z2GetAudioMgr()->bgmStreamPrepare(0x200000A); Z2GetAudioMgr()->bgmStreamPlay(); return; case 1: sp38.set(270.0f, 0.0f, 210.0f); player->setPlayerPosAndAngle(&sp38, -0x6000, 0); sp38.set(-50.0f, 90.0f, -100.0f); cLib_chasePos(&mDemoCamEye, sp38, field_0x14a8); cLib_chasePos(&mDemoCamCenter, sp38, field_0x14a8); if (mDemoModeTimer == 0) { mDownTimer = 98; mpWeaponBrk->setPlaySpeed(nREG_F(1) + 1.0f); mpWeaponBrk->setFrame(0.0f); field_0x1336 = 0; mMode = 2; mDemoModeTimer = 60 - nREG_S(4); } break; case 2: if (mpWeaponBrk->checkFrame(48.0f)) { mpWeaponBrk->setPlaySpeed(0.0f); } if (mDemoModeTimer != 0) { sp38.set(-50.0f, 90.0f, -100.0f); cLib_chasePos(&mDemoCamEye, sp38, field_0x14a8); cLib_chasePos(&mDemoCamCenter, sp38, field_0x14a8); if (mDemoModeTimer < 25) { cLib_chaseF(&field_0x14a8, 0.0f, 0.1f); if (mDemoModeTimer > 15 && mDemoModeTimer < 25) { setVibRope(1.0f, 1.0f); } if (mDemoModeTimer > 12 && mDemoModeTimer < 22) { setVibTag(1, -1); } if (mDemoModeTimer == 0) { mMode = 3; } } } else if (mDownTimer == 0) { mMode = 4; mDemoModeTimer = 75; } break; case 4: setWeponGlow(); if (mDemoModeTimer < 50) { setVibRope(1.0f, 1.3f); if (mDemoModeTimer < 45) { setVibTag(2, -1); } if (mDemoModeTimer == 0) { setWeponFlashScreen(); mMode = 5; mDemoModeTimer = 50; for (int i = 0; i < 10; i++) { field_0x1140[i] = field_0x994[i * 10]; onRopeCutStatus(i, 0, 1); } field_0x14a8 = 50.0f; dComIfGp_getVibration().StartQuake(6, 31, cXyz(0.0f, 1.0f, 0.0f)); sp38.set(400.0f, 0.0f, 300.0f); player->setPlayerPosAndAngle(&sp38, -0x6000, 0); player->changeDemoMode(0x17, 0, 0, 0); return; } } break; case 5: sp38.set(459.0f, 394.0f, 920.0f); cLib_chasePos(&mDemoCamEye, sp38, field_0x14a8); sp38.set(259.0f, 275.0f, 519.0f); cLib_chasePos(&mDemoCamCenter, sp38, field_0x14a8); cLib_chaseF(&field_0x14a8, 0.0f, 1.0f); if (mDemoModeTimer == 20) { dComIfGp_getVibration().StopQuake(31); } setVibRope(1.0f, 1.3f); setVibTag(2, -1); calcRopeFirePos(); if (mDemoModeTimer == 0) { sp38.set(800.0f, 0.0f, 380.0f); player->setPlayerPosAndAngle(&sp38, -0x5000, 0); mMode = 6; mpWeaponBrk->setPlaySpeed(1.0f); mDemoCamCenter.set(field_0x122c.x, 150.0f, field_0x122c.z); field_0x14ac = 0x1800; cLib_chaseAngleS(&field_0x14ac, 0x2800, 0x20); sp38.set(0.0f, 150.0f, 0.0f); sp2C.set(0.0f, 50.0f, 400.0f); cLib_offsetPos(&mDemoCamEye, &sp38, field_0x14ac, &sp2C); mDemoCamBank = 60.0f; mWeponEfMode = 1; mDemoModeTimer = 130; if (!player->checkNowWolf()) { player->changeDemoMode(0x17, 0, 0, 0); } Z2GetAudioMgr()->seStart(Z2SE_EN_VA_OPENING2, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return; } break; case 6: mMode = 7; field_0x122c.y = -100.0f; case 7: if (mDemoModeTimer > 115 || (mDemoModeTimer < 90 && mDemoModeTimer > 60)) { field_0x122c.y += 1.0f; setVibRope(2.0f, 1.0f); } else if (mDemoModeTimer < 10) { field_0x122c.y += 1.0f; setVibRope(2.0f, 1.3f); } else if (mDemoModeTimer < 30) { field_0x122c.y += nREG_F(1) + 5.0f; setVibRope(2.0f, 1.0f); } else { field_0x122c.y += 0.2f; setVibRope(1.0f, 1.0f); } mDemoCamCenter.set(field_0x122c.x, 150.0f, field_0x122c.z); cLib_chaseAngleS(&field_0x14ac, 0x2800, 0x20); sp38.set(0.0f, 150.0f, 0.0f); sp2C.set(0.0f, 50.0f, 400.0f); cLib_offsetPos(&mDemoCamEye, &sp38, field_0x14ac, &sp2C); if (mDemoModeTimer == 0) { mMode = 8; mDemoModeTimer = 300; field_0x14a4 = 600.0f; mWeponEfMode = 2; field_0x1336 = 0x1400; field_0x1334 = 0xA00; field_0x1310 = 28.0f; field_0x123e = 0; mDrawRopes = false; mKankyoColType = 4; } break; case 8: mDemoCamCenter.set(field_0x122c.x, field_0x122c.y + 150.0f, field_0x122c.z); sp38.set(950.0f, 50.0f, 550.0f); cLib_chasePos(&mDemoCamEye, sp38, 15.0f); field_0x1310--; if (field_0x1310 < -10.0f) { field_0x1310 = -10.0f; } field_0x122c.y += field_0x1310; if (mDemoModeTimer < 267) { cLib_chaseAngleS(&field_0x1336, 0, 0x100); } if (mDemoModeTimer < 254) { cLib_chaseAngleS(&field_0x1334, 0, 0x100); } field_0x1238.z += field_0x1336; field_0x1238.x += field_0x1334; if (mDemoModeTimer < 270) { cLib_addCalcAngleS(&field_0x1238.x, -0x0C03, 4, 0x200, 0x100); cLib_addCalcAngleS(&field_0x1238.y, -0x43B1, 4, 0x200, 0x100); cLib_addCalcAngleS(&field_0x1238.z, -0x195D, 4, 0x200, 0x100); } sp38.set(26.0f, 187.0f, 236.0f); old = field_0x122c.y; if (cLib_chasePosXZ(&field_0x122c, sp38, 4.2f)) { field_0x122c.y = old; } if (field_0x1310 < 0.0f && field_0x122c.y < 192.0f) { field_0x122c = sp38; field_0x1238.set(-0x0C03, -0x43B1, -0x195D); setBck(ANM_INVI_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 9; field_0x1240 = 1; mDemoModeTimer = 60; mWeponEfMode = 3; } break; case 9: cLib_chaseAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x98); current.angle.y = shape_angle.y; sp38.set(field_0x122c.x, field_0x122c.y + 150.0f, field_0x122c.z); cLib_chasePos(&mDemoCamCenter, sp38, 5.0f); sp38.set(950.0f, 50.0f, 550.0f); cLib_chasePos(&mDemoCamEye, sp38, 15.0f); if (mDemoModeTimer == 0) { setBck(ANM_OP_ATTACK_A_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 10; } break; case 10: mDemoCamCenter.set(field_0x122c.x, field_0x122c.y + 150.0f, field_0x122c.z); sp38.set(950.0f, 50.0f, 550.0f); cLib_chasePos(&mDemoCamEye, sp38, nREG_F(19) + 15.0f); if (mpMorf->checkFrame(50.0f)) { player->changeDemoMode(0x22, 0, 0, 0); } if (mpMorf->checkFrame(67.0f)) { setWeponLandEffect(); mSound.startCreatureSound(Z2SE_EN_VA_SWD_IMPACT, 0, -1); dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); } if (mpMorf->isStop()) { camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); mRopesEnabled = false; setActionMode(ACTION_CLEAR_WAIT_e, 0); mDemoModeTimer = 60; Z2GetAudioMgr()->subBgmStart(Z2BGM_VARIANT); Z2GetAudioMgr()->changeSubBgmStatus(1); return; } } calcTagAngle(); camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); dComIfGp_getEvent()->onSkipFade(); dComIfGp_getEvent()->setSkipProc(this, DemoSkipCallBack, 0); } void daE_VA_c::executeClearWait() { switch (mMode) { case 1: mDemoModeTimer = 60; /* fallthrough */ case 0: setBck(ANM_INVI_WAIT_e, J3DFrameCtrl::EMode_LOOP, 20.0f, 1.0f); attention_info.flags = fopAc_AttnFlag_BATTLE_e; mMode = 2; /* fallthrough */ case 2: cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); if (mDemoModeTimer == 0) { if (fopAcM_searchPlayerDistance(this) < 2000.0f) { setActionMode(ACTION_CLEAR_CHASE_e, 0); } } if (daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { setActionMode(ACTION_TRANS_WAIT_e, 0); } } } void daE_VA_c::executeClearChase() { cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); switch (mMode) { case 0: setBck(ANM_INVI_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 1; /* fallthrough */ case 1: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x400, 0x40); current.angle.y = shape_angle.y; if (fopAcM_searchPlayerDistance(this) > l_HIO.mAttackRange) { cLib_chaseF(&speedF, 10.0f, 1.0f); } else if (fopAcM_searchPlayerDistance(this) < l_HIO.mAttackRange - 200.0f) { cLib_chaseF(&speedF, -10.0f, 1.0f); } else { cLib_chaseF(&speedF, 0.0f, 1.0f); if (speedF == 0.0f && mDemoModeTimer == 0) { setActionMode(ACTION_CLEAR_ATTACK_e, 0); return; } } if (speedF) { if (!checkBck(ANM_INVI_WALK_e)) { setBck(ANM_INVI_WALK_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } } else { if (!checkBck(ANM_INVI_WAIT_e)) { setBck(ANM_INVI_WAIT_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } } } if (daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { setActionMode(ACTION_TRANS_WAIT_e, 0); } } void daE_VA_c::executeClearAttack() { f32 anm_frame = mpMorf->getFrame(); cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); switch (mMode) { case 0: setBck(ANM_INVI_ATTACK_A_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK_T, 0, -1); mMode = 1; return; case 1: if (mpMorf->checkFrame(32.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK1, 0, -1); } if (mpMorf->checkFrame(36.0f)) { setWeponLandEffect(); mSound.startCreatureSound(Z2SE_EN_VA_SWD_IMPACT, 0, -1); dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); } if (30.0f <= anm_frame && anm_frame <= 43.0f) { onSwordAtBit(); } else if (anm_frame > 43.0f && anm_frame < 85.0f) { offSwordShield(); } if (mpMorf->isStop()) { setActionMode(ACTION_CLEAR_CHASE_e, 0); mDemoModeTimer = 150; } break; } if (daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { setActionMode(ACTION_TRANS_WAIT_e, 0); } } void daE_VA_c::executeTransWait() { switch (mMode) { case 0: Z2GetAudioMgr()->changeSubBgmStatus(2); mAlphaType = 1; attention_info.flags = fopAc_AttnFlag_BATTLE_e; speedF = 0.0f; mMode = 1; setBck(ANM_TRANS_WAIT_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mDemoModeTimer = 5; if (!dComIfGs_isOneZoneSwitch(5, fopAcM_GetRoomNo(this))) { dComIfGs_onOneZoneSwitch(5, fopAcM_GetRoomNo(this)); } /* fallthrough */ case 1: cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); if (mDemoModeTimer == 0) { setBck(ANM_INVI_NOTICE_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_FOUND, -1); mMode = 2; } break; case 2: cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); field_0x1391 = 1; if (mpMorf->isStop()) { setActionMode(ACTION_TRANS_CHASE_e, 0); } break; } if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 0); } } void daE_VA_c::executeTransChase() { f32 dist_to_player = fopAcM_searchPlayerDistanceXZ(this); s16 angleY_to_player = fopAcM_searchPlayerAngleY(this); switch (mMode) { case 0: setBck(ANM_TRANS_WAIT_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mMode = 1; /* fallthrough */ case 1: if (abs((s16)(shape_angle.y - angleY_to_player)) > 0x6000) { shape_angle.y += 0x400; } else { cLib_addCalcAngleS(&shape_angle.y, angleY_to_player, 8, 0x400, 0x40); } current.angle.y = shape_angle.y; if (dist_to_player > l_HIO.mAttackRange) { cLib_chaseF(&speedF, 15.0f, 1.0f); } else if (dist_to_player < l_HIO.mAttackRange - 200.0f) { if (mDemoModeTimer == 0) { cLib_chaseF(&speedF, 0.0f, 1.0f); } else { cLib_chaseF(&speedF, -10.0f, 1.0f); } } else { cLib_chaseF(&speedF, 0.0f, 1.0f); } if (speedF == 0.0f && mDemoModeTimer == 0 && dist_to_player <= l_HIO.mAttackRange && abs((s16)(shape_angle.y - angleY_to_player)) < 0x2000) { setActionMode(ACTION_TRANS_ATTACK_e, 0); return; } if (speedF) { if (!checkBck(ANM_TRANS_WALK_e)) { setBck(ANM_TRANS_WALK_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } } else { setBck(ANM_TRANS_WAIT_e, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } } if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 0); } } void daE_VA_c::executeTransAttack() { f32 anm_frame = mpMorf->getFrame(); switch (mMode) { case 0: setBck(ANM_TRANS_ATTACK_A1_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK_T, 0, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK1, -1); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK1, 0, -1); mMode = 2; break; case 2: if (mpMorf->checkFrame(22.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK1, 0, -1); } if (mpMorf->checkFrame(26.0f)) { setWeponLandEffect(); mSound.startCreatureSound(Z2SE_EN_VA_SWD_IMPACT, 0, -1); dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); } if (20.0f <= anm_frame && anm_frame <= 33.0f) { onSwordAtBit(); } else if (anm_frame > 33.0f) { offSwordShield(); } if (mpMorf->checkFrame(20.0f)) { mGlowBody = 1; mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); mBodyCyls[0].SetTgType(0xD8FBFDFF); mBodyCyls[1].SetTgType(0xD8FBFDFF); } if (mpMorf->isStop()) { setBck(ANM_TRANS_ATTACK_A3_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); mMode = 4; } break; case 4: if (mpMorf->checkFrame(20.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK2, 0, -1); } if (mpMorf->checkFrame(53.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK3, 0, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); } if (anm_frame <= 20.0f) { offSwordShield(); } if (mpMorf->checkFrame(40.0f)) { mGlowBody = 0; mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); } if (mpMorf->isStop()) { setActionMode(ACTION_TRANS_CHASE_e, 0); mDemoModeTimer = 90; } break; } if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); if (!checkBck(ANM_TRANS_ATTACK_A3_e)) { setBck(ANM_TRANS_ATTACK_A3_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); } setActionMode(ACTION_OPACI_FADE_AWAY_e, 10); mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); } } void daE_VA_c::executeTransBiteDamage() { daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp38; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_NECK_02)); mDoMtx_stack_c::multVecZero(&sp38); switch (mMode) { case 0: speedF = 0.0f; setBck(ANM_TRANS_NECK_DMG_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_BITED, -1); mMode = 1; field_0x1324 = 0; field_0x135c = 0; mGlowBody = 1; mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); if ((s16)(cLib_targetAngleY(&sp38, &player->current.pos) - shape_angle.y) < 0) { field_0x1390 = 0; } else { field_0x1390 = 1; } /* fallthrough */ case 1: s16 var_r4; if (field_0x1390 != 0) { var_r4 = shape_angle.y - 0x4000; } else { var_r4 = shape_angle.y + 0x4000; } player->setWolfEnemyHangBiteAngle(var_r4); if (checkWolfBiteDamage()) { offWolfBiteDamage(); field_0x135c++; field_0x1324++; if (field_0x135c >= l_HIO.mBiteCount) { field_0x135c = 0; player->offWolfEnemyHangBite(); setActionMode(ACTION_OPACI_WAIT_e, 0); mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 0x20); attention_info.flags = 0; return; } setBck(ANM_TRANS_NECK_DMG_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_BITED, -1); mSound.startCollisionSE(Z2SE_HIT_WOLFBITE, 0x1E); } if (checkBck(ANM_TRANS_NECK_DMG_e)) { if (mpMorf->isStop()) { setBck(ANM_TRANS_ATTACK_A2_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } } else if (checkBck(ANM_TRANS_ATTACK_A2_e) && mpMorf->checkFrame(22.0f)) { mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK2, -1); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK2, 0, -1); } if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { player->offWolfEnemyHangBite(); Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 0); return; } if (!player->checkWolfEnemyHangBiteOwn(this)) { setBck(ANM_TRANS_NECK_PAT_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 3; mGlowBody = 0; } break; case 3: if (mpMorf->isStop()) { setActionMode(ACTION_TRANS_CHASE_e, 0); return; } } setDownPos(&sp38); if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 0); } } void daE_VA_c::executeTransDamage() { if (checkWolfBiteDamage()) { offWolfBiteDamage(); daPy_getPlayerActorClass()->offWolfEnemyHangBite(); } switch (mMode) { case 0: field_0x138f++; if (field_0x138f >= 5) { setActionMode(ACTION_OPACI_WAIT_e, 0); attention_info.flags = 0; mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); return; } speedF = 0.0f; setBck(ANM_TRANS_NECK_DMG_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_BITED, -1); mMode = 1; mGlowBody = 1; mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); mBodyCyls[0].SetTgType(0xD8FBFDFF); mBodyCyls[1].SetTgType(0xD8FBFDFF); /* fallthrough */ case 1: if (mpMorf->isStop()) { setBck(ANM_TRANS_NECK_PAT_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 2; } break; case 2: if (mpMorf->checkFrame(30.0f)) { mGlowBody = 0; mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); } if (mpMorf->isStop()) { setActionMode(ACTION_TRANS_CHASE_e, 0); } } } void daE_VA_c::executeTransThrough() { switch (mMode) { case 0: speedF = 0.0f; setBck(ANM_TRANS_THROUGH_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 1; break; case 1: if (mpMorf->isStop()) { setActionMode(ACTION_TRANS_CHASE_e, 0); } break; } if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 0); } } void daE_VA_c::executeOpaciWait() { dCamera_c* camera = dCam_getBody(); cXyz sp24; cXyz sp30; switch (mMode) { case 0: if (field_0x1486 == 0) { field_0x1486 = 1; mMode = 10; if (!dComIfGs_isOneZoneSwitch(8, fopAcM_GetRoomNo(this))) { dComIfGs_onOneZoneSwitch(8, fopAcM_GetRoomNo(this)); } } else { mAlphaType = 2; field_0x1380 = 30; mGlowLightB = 0; mGlowLightG = 0; mGlowLightR = 0; mKankyoColBlend = 1.0f; mKankyoColType = 1; field_0x1354 = 10; attention_info.flags = fopAc_AttnFlag_BATTLE_e; mFadeAwayTimer = l_HIO.mFadeAwayTime; speedF = 0.0f; setActionMode(ACTION_OPACI_FLY_e, 22); } Z2GetAudioMgr()->changeSubBgmStatus(3); break; case 10: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); } else { mAlphaType = 2; field_0x1380 = 30; mGlowLightB = 0; mGlowLightG = 0; mGlowLightR = 0; mKankyoColBlend = 1.0f; mKankyoColType = 1; setBck(ANM_TRANS_STRUGGLE_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_VISUAL, -1); field_0x1354 = 10; speedF = 0.0f; mMode = 12; sp24.set(200.0f, 0.0f, 100.0f); daPy_getPlayerActorClass()->setPlayerPosAndAngle(&sp24, 0x8000, 0); daPy_getPlayerActorClass()->changeOriginalDemo(); daPy_getPlayerActorClass()->changeDemoMode(0x17, 1, 0, 0); camera->Stop(); camera->SetTrimSize(3); field_0x14ac = -0x1000; mDemoCamCenter.set(15.0f, 291.0f, 201.0f); sp30.set(0.0f, 50.0f, 700.0f); cLib_offsetPos(&mDemoCamEye, ¤t.pos, field_0x14ac, &sp30); mDemoCamBank = 70.0f; field_0x14a4 = 0.0f; } break; case 12: current.pos.set(0.0f, 0.0f, 0.0f); eyePos.set(15.0f, 291.0f, 201.0f); current.angle.y = 0; shape_angle.y = 0; mMode = 13; /* fallthrough */ case 13: field_0x14a4++; mDemoCamCenter = eyePos; sp30.set(0.0f, field_0x14a4 + 50.0f, 700.0f); cLib_offsetPos(&mDemoCamEye, ¤t.pos, field_0x14ac, &sp30); field_0x14ac += 80; camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); cLib_addCalcAngleS(&shape_angle.y, -0x1000, 8, 0x100, 0x100); if (mpMorf->checkFrame(90.0f)) { mMode = 14; dComIfGp_getVibration().StartQuake(2, 31, cXyz(0.0f, 1.0f, 0.0f)); field_0x14b0 = 180.0f; } break; case 14: cLib_addCalc2(&field_0x14b0, 0.0f, 1.0f, 6.0f); mDemoCamCenter = eyePos; cLib_chaseF(&mDemoCamBank, 30.0f, 5.0f); camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); if (mpMorf->checkFrame(120.0f)) { dComIfGp_getVibration().StopQuake(31); } if (mpMorf->isStop()) { camera->Reset(mDemoCamCenter, mDemoCamEye); camera->Start(); camera->SetTrimSize(0); dComIfGp_event_reset(); mFadeAwayTimer = l_HIO.mFadeAwayTime; attention_info.flags = fopAc_AttnFlag_BATTLE_e; setBck(ANM_SUBS_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 15; mDemoModeTimer = 30; } break; case 15: if (mDemoModeTimer == 0) { setActionMode(ACTION_OPACI_FLY_e, 0); } break; } } void daE_VA_c::executeOpaciFly() { daPy_py_c* player = daPy_getPlayerActorClass(); s16 var_r31 = cM_atan2s(current.pos.x, current.pos.z); mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); mBodyCyls[0].SetTgType(0x16060); mBodyCyls[1].SetTgType(0x16060); switch (mMode) { case 0: case 20: case 21: case 22: { attention_info.flags = 0; if (mMode == 0) { setBck(ANM_FLOAT_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } else if (mMode == 20) { setBck(ANM_SUBS_DOWN_D_STAND_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_DMG_L, -1); } else if (mMode == 21) { setBck(ANM_SUBS_DOWN_STAND_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); } else if (mMode == 22) { setBck(ANM_TRANS_NECK_DMG_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_BITED, -1); } mMode = 1; gravity = 0.0f; s16 temp_r0 = shape_angle.y + 0x8000; f32 temp_f29 = cM_scos(temp_r0) * 1000.0f; f32 temp_f1 = cM_ssin(temp_r0) * 1000.0f; field_0x12f8.set(temp_f1, 500.0f, temp_f29); current.angle.y = temp_r0; mDemoModeTimer = nREG_S(0) + 15; } /* fallthrough */ case 1: { if (mDemoModeTimer == 0 && !checkBck(ANM_FLOAT_WAIT_e)) { setBck(ANM_FLOAT_WAIT_e, J3DFrameCtrl::EMode_LOOP, nREG_F(19) + 30.0f, 1.0f); } cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); s16 temp_r3 = cLib_targetAngleX(¤t.pos, &field_0x12f8); f32 temp_f31 = std::abs(cM_scos(temp_r3) * 20.0f); f32 temp_f30 = cM_ssin(temp_r3) * 20.0f; if (current.pos.y >= 500.0f) { cLib_chaseF(&speed.y, 0.0f, 3.0f); cLib_chaseF(¤t.pos.y, 500.0f, 1.0f); } else { cLib_chaseF(&speed.y, temp_f30, 1.0f); } if (current.pos.absXZ() > 950.0f) { field_0x12f8.set(current.pos.x, 500.0f, current.pos.z); cLib_chaseF(&speedF, 0.0f, 3.0f); } else { cLib_chaseF(&speedF, temp_f31, 1.0f); } if (speed.y == 0.0f && speedF == 0.0f) { mMode = 2; } break; } case 2: mMode = 3; mDemoModeTimer = 30; field_0x1324 = 0; mDownTimer = cM_rndF(60.0f) + 150.0f; field_0x1348 = cM_rndF(30.0f) + 90.0f; /* fallthrough */ case 3: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); if (field_0x1324 != 0) { current.angle.y = var_r31 + 0x4000; } else { current.angle.y = var_r31 - 0x4000; } cLib_chaseF(&speedF, 30.0f, 1.0f); if (mDemoModeTimer == 0) { mMode = 4; } break; case 4: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); if (field_0x1324 != 0) { current.angle.y = var_r31 + 0x4000; } else { current.angle.y = var_r31 - 0x4000; } cLib_chaseF(&speedF, 0.0f, 1.0f); if (!speedF) { if (mFadeAwayTimer == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 1); } else if (mDownTimer == 0 && current.pos.absXZ(player->current.pos) > 500.0f) { mMode = 10; } else { mDemoModeTimer = 30; mMode = 3; if ((s16)(var_r31 - fopAcM_searchPlayerAngleY(this)) < 0) { field_0x1324 = 0; } else { field_0x1324 = 1; } } } break; case 10: mDemoModeTimer = 30; mMode = 11; /* fallthrough */ case 11: if (mDemoModeTimer == 0) { setBck(ANM_FLOAT_ATTACK_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 12; } break; case 12: if (mpMorf->checkFrame(42.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_ATK_FLY, 0, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK_FLY, -1); } if (mpMorf->checkFrame(62.0f)) { mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK_FLY2, -1); mSound.startCreatureSound(Z2SE_EN_VA_ATK_FLY2, 0, -1); } if (mpMorf->checkFrame(47.0f)) { field_0x1228[0] = 1; } if (mpMorf->checkFrame(67.0f)) { field_0x1228[1] = 1; } if (mpMorf->isStop()) { setBck(ANM_FLOAT_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 2; field_0x1348 = cM_rndF(30.0f) + 90.0f; } } } void daE_VA_c::executeOpaciDamage() { switch (mMode) { case 0: attention_info.flags = 0; mBodyCyls[0].SetTgType(0xD8FBFDFF); mBodyCyls[1].SetTgType(0xD8FBFDFF); setBck(ANM_FLOAT_DMG_A_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_DOWN, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_DMG, -1); mSound.startCreatureSound(Z2SE_EN_VA_DOWN, 0, -1); mMode = 1; speedF = 0.0f; /* fallthrough */ case 1: if (mpMorf->isStop()) { gravity = -5.0f; maxFallSpeed = -50.0f; mMode = 2; setBck(ANM_FLOAT_DMG_B_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); } break; case 2: if (mAcch.ChkGroundHit() || speed.y <= nREG_F(4) + -30.0f) { setActionMode(ACTION_OPACI_CHASE_e, 0); } break; case 10: attention_info.flags = 0; setBck(ANM_SUBS_STAGGER_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_NO_DMG, -1); mMode = 11; /* fallthrough */ case 11: if (mpMorf->isStop()) { setActionMode(ACTION_OPACI_FLY_e, 0); } break; } } void daE_VA_c::executeOpaciChase() { cXyz sp44; daPy_py_c* player = daPy_getPlayerActorClass(); s16 angleY_to_player = fopAcM_searchPlayerAngleY(this); s16 angle_to_home = cLib_targetAngleY(&home.pos, ¤t.pos); switch (mMode) { case 0: attention_info.flags = 0; field_0x1330 = angle_to_home; field_0x1332 = field_0x1330; field_0x1334 = (f32)field_0x1332 + cM_rndF(3.0f) * 16384.0f; if (cM_rnd() < 0.5f) { field_0x1336 = -0x400; } else { field_0x1336 = 0x400; } field_0x1330 += field_0x1336; mMode = 10; mDownTimer = 30; setBck(ANM_SUBS_FLY_e, J3DFrameCtrl::EMode_LOOP, 30.0f, 1.0f); gravity = 0.0f; field_0x1324 = 0; sp44.set(0.0f, 0.0f, l_HIO.mCircleAttackRadius); cLib_offsetPos(&field_0x12f8, &home.pos, field_0x1330, &sp44); current.angle.y = cLib_targetAngleY(¤t.pos, &field_0x12f8); /* fallthrough */ case 10: case 11: field_0x1388 = 1; mSound.startCreatureVoiceLevel(Z2SE_EN_VA_V_ROTATE, -1); if (mDownTimer == 0 && !player->checkNowWolf()) { mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); } switch (field_0x1324) { case 0: if (cLib_chaseF(&speed.y, nREG_F(0) + 25.0f, nREG_F(1) + 3.0f)) { field_0x1324 = 1; } break; case 1: if (cLib_chaseF(&speed.y, nREG_F(3) + -40.0f, nREG_F(2) + 3.0f)) { field_0x1324 = 0; } if (mAcch.ChkGroundHit()) { field_0x1324 = 2; gravity = -5.0f; } break; case 2: break; } cLib_chaseF(&speedF, 100.0f, 3.0f); sp44.set(0.0f, 0.0f, l_HIO.mCircleAttackRadius); cLib_offsetPos(&field_0x12f8, &home.pos, field_0x1330, &sp44); if (current.pos.absXZ() > nREG_F(19) + 1200.0f) { s16 temp_r26 = cM_atan2s(current.pos.x, current.pos.z); current.pos.x = (nREG_F(19) + 1200.0f) * cM_ssin(temp_r26); current.pos.z = (nREG_F(19) + 1200.0f) * cM_scos(temp_r26); } cLib_addCalcAngleS(&shape_angle.y, angleY_to_player, 8, 0x800, 0x80); cLib_addCalcAngleS(¤t.angle.y, (s16)cLib_targetAngleY(¤t.pos, &field_0x12f8), 8, 0x800, 0x80); if (abs((s16)(field_0x1330 - angle_to_home)) < 0x2000) { s16 var_r29 = field_0x1330; field_0x1330 += field_0x1336; if (mMode == 10) { if (abs((s16)(field_0x1332 - field_0x1330)) <= abs(field_0x1336)) { if (abs((s16)(field_0x1332 - var_r29)) <= abs(field_0x1336)) { if (field_0x1332 == field_0x1334) { mMode = 12; } else { mMode = 11; } } } } else { if (abs((s16)(field_0x1334 - field_0x1330)) <= abs(field_0x1336)) { mMode = 12; attention_info.flags = fopAc_AttnFlag_BATTLE_e; } } } break; case 12: mSound.startCreatureVoiceLevel(Z2SE_EN_VA_V_ROTATE, -1); if (!player->checkNowWolf()) { mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); } field_0x1388 = 1; cLib_addCalcAngleS(&shape_angle.y, angleY_to_player, 8, 0x800, 0x80); cLib_addCalcAngleS(¤t.angle.y, angleY_to_player, 8, 0x800, 0x80); if (fopAcM_searchPlayerDistance(this) > l_HIO.mAttackRange) { cLib_chaseF(&speedF, 100.0f, 3.0f); } else if (fopAcM_searchPlayerDistance(this) < l_HIO.mAttackRange - 300.0f) { cLib_chaseF(&speedF, -30.0f, 3.0f); } else { mMode = 13; } break; case 13: mSound.startCreatureVoiceLevel(Z2SE_EN_VA_V_ROTATE, -1); if (!player->checkNowWolf()) { mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); } cLib_addCalcAngleS(&shape_angle.y, angleY_to_player, 8, 0x800, 0x80); cLib_addCalcAngleS(¤t.angle.y, angleY_to_player, 8, 0x800, 0x80); if (cLib_chaseF(&speedF, 0.0f, 3.0f)) { setActionMode(ACTION_OPACI_ATTACK_e, 0); } break; } } void daE_VA_c::executeOpaciAttack() { f32 anm_frame = mpMorf->getFrame(); mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OnTgSetBit(); switch (mMode) { case 0: speedF = 0.0f; setBck(ANM_SUBS_ATTACK_A1_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK_T, 0, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK1, -1); mMode = 1; /* fallthrough */ case 1: if (mpMorf->checkFrame(22.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK1, 0, -1); } if (mpMorf->checkFrame(27.0f)) { setWeponLandEffect(); mSound.startCreatureSound(Z2SE_EN_VA_SWD_IMPACT, 0, -1); dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); } if (anm_frame < 16.0f) { cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); current.angle.y = shape_angle.y; } if (20.0f <= anm_frame && anm_frame <= 33.0f) { onSwordAtBit(); } else if (anm_frame > 33.0f) { offSwordShield(); field_0x1386 = 1; } if (mpMorf->isStop()) { setBck(ANM_SUBS_ATTACK_A3_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); mMode = 2; } break; case 2: if (mpMorf->checkFrame(12.0f)) { mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK3, 0, -1); } if (mpMorf->getFrame() <= 15.0f) { offSwordShield(); field_0x1386 = 1; } if (mpMorf->isStop()) { if (mFadeAwayTimer == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 1); return; } setActionMode(ACTION_OPACI_FLY_e, 0); } break; } } void daE_VA_c::executeOpaciDown() { daPy_py_c* player = daPy_getPlayerActorClass(); mBodyCyls[1].OnTgSetBit(); switch (mMode) { case 0: setBck(ANM_SUBS_DOWN_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mDownTimer = l_HIO.mDownTime; mMode = 2; speedF = 0.0f; field_0x1383 = 0; attention_info.flags = fopAc_AttnFlag_BATTLE_e; mSound.startCreatureVoice(Z2SE_EN_VA_V_DMG_L, -1); dComIfGs_onOneZoneSwitch(6, fopAcM_GetRoomNo(this)); /* fallthrough */ case 2: if (mpMorf->getFrame() < 40.0f) { mBodyCyls[1].OffTgSetBit(); } if (mpMorf->isStop()) { setBck(ANM_SUBS_DOWN_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 3; } break; case 1: setBck(ANM_SUBS_DOWN_WAIT_e, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 3; /* fallthrough */ case 3: if (mpMorf->checkFrame(1.0f)) { mSound.startCreatureVoice(Z2SE_EN_VA_V_DYING, -1); } if (mFadeAwayTimer == 0) { Z2GetAudioMgr()->changeSubBgmStatus(1); setActionMode(ACTION_OPACI_FADE_AWAY_e, 2); } else if (mDownTimer == 0) { setActionMode(ACTION_OPACI_FLY_e, 21); } break; case 5: field_0x1364 += field_0x1368; if ((f32)field_0x1364 > l_HIO.mDownHP || field_0x1384 >= 6) { setActionMode(ACTION_OPACI_DEATH_e, 0); field_0x1381 = 1; return; } setActionMode(ACTION_OPACI_FLY_e, 20); break; case 4: mBodyCyls[1].OffTgSetBit(); if (mpMorf->isStop()) { setActionMode(ACTION_OPACI_FLY_e, 0); return; } break; } if (player->getCutCount() > 1 || player->getCutType() == daPy_py_c::CUT_TYPE_JUMP) { if (mFadeAwayTimer < 30) { mFadeAwayTimer = 30; } if (mDownTimer < 30) { mDownTimer = 30; } } } void daE_VA_c::executeOpaciDownDamage() { daPy_py_c* player = daPy_getPlayerActorClass(); if (player->getCutCount() > 1 || player->getCutType() == daPy_py_c::CUT_TYPE_JUMP) { if (mFadeAwayTimer < 30) { mFadeAwayTimer = 30; } if (mDownTimer < 30) { mDownTimer = 30; } } if (mFadeAwayTimer != 0 && mDownTimer != 0) { mBodyCyls[1].OnTgSetBit(); } switch (mMode) { case 0: case 1: case 2: speedF = 0.0f; field_0x1364 += field_0x1368; if ((f32)field_0x1364 > l_HIO.mDownHP) { setActionMode(ACTION_OPACI_DEATH_e, 0); field_0x1381 = 1; return; } if (mMode == 0) { setBck(ANM_SUBS_DOWN_DMG_A1_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_DMG, -1); } else if (mMode == 1) { setBck(ANM_SUBS_DOWN_DMG_A2_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_DMG, -1); } else { setBck(ANM_SUBS_DOWN_STAGGER_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_NO_DMG, -1); } mMode = 5; case 5: if (mpMorf->isStop()) { setActionMode(ACTION_OPACI_DOWN_e, 1); field_0x1381 = 1; } break; } } void daE_VA_c::executeOpaciFlip() { switch (mMode) { case 0: speedF = 0.0f; mMode = 1; daPy_getPlayerActorClass()->setThrowDamage(shape_angle.y, 20.0f, 40.0f, 1, 0, 0); /* fallthrough */ case 1: if (mpMorf->isStop()) { setActionMode(ACTION_OPACI_CHASE_e, 0); } } } void daE_VA_c::executeOpaciFadeAway() { attention_info.flags = 0; mBodyCylIFrameTimer = 3; mNeckSphIFrameTimer = 3; mAttackSphIFrameTimer = 3; switch (mMode) { case 10: if (checkBck(ANM_TRANS_ATTACK_A3_e)) { if (mpMorf->checkFrame(20.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK2, 0, -1); } if (mpMorf->checkFrame(53.0f)) { mSound.startCreatureSound(Z2SE_EN_VA_SWD_ATK3, 0, -1); mSound.startCreatureVoice(Z2SE_EN_VA_V_ATK3, -1); } } mAlphaType = 0; speedF = 0.0f; if (mpMorf->isStop()) { setActionMode(ACTION_CLEAR_WAIT_e, 0); } break; case 0: mAlphaType = 0; speedF = 0.0f; setActionMode(ACTION_CLEAR_WAIT_e, 0); break; case 1: if (checkBck(ANM_SUBS_INVITE_B_e)) { setBck(ANM_SUBS_INVITE_C_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 5; } else { setBck(ANM_SUBS_TO_TRANS_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_VANISH, -1); mSound.startCreatureSound(Z2SE_EN_VA_VANISH, 0, -1); mAlphaType = 3; mMode = 4; mKankyoColType = 2; } speed.y = 0.0f; speedF = 0.0f; break; case 2: setBck(ANM_SUBS_DOWN_STAND_e, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mMode = 3; speedF = 0.0f; break; case 3: if (mpMorf->isStop()) { setBck(ANM_SUBS_TO_TRANS_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_VANISH, -1); mSound.startCreatureSound(Z2SE_EN_VA_VANISH, 0, -1); mMode = 4; mAlphaType = 3; mKankyoColType = 2; } break; case 4: cLib_addCalc(¤t.pos.y, 0.0f, 0.1f, 10.0f, 1.0f); if (mpMorf->isStop()) { setActionMode(ACTION_CLEAR_WAIT_e, 1); current.pos.y = 0.0f; } break; case 5: if (mpMorf->isStop()) { mMode = 1; } break; } if (daPy_getPlayerActorClass()->checkNowWolfEyeUp() && field_0x1358 == 0) { setActionMode(ACTION_TRANS_WAIT_e, 0); } } void daE_VA_c::executeOpaciDeath() { camera_process_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp24; cXyz sp30; mBodyCyls[0].OffTgSetBit(); mBodyCyls[1].OffTgSetBit(); switch (mMode) { case 0: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); return; } Z2GetAudioMgr()->subBgmStop(); Z2GetAudioMgr()->muteSceneBgm(0, 0.0f); dComIfGs_onStageMiddleBoss(); field_0x1364 = 0; setBck(ANM_SUBS_DOWN_DIE_e, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_VA_V_DEAD, -1); mMode = 10; player->changeOriginalDemo(); sp30.set(0.0f, 0.0f, 350.0f); player->setPlayerPosAndAngle(&sp30, 0x8000, 0); player->changeDemoMode(4, 1, 0, 0); camera->mCamera.Stop(); camera->mCamera.SetTrimSize(3); mDemoCamCenter.set(-54.0f, 168.0f, 207.0f); field_0x14ac = -0x1800; field_0x14a4 = 600.0f; sp24.set(0.0f, 0.0f, field_0x14a4); cLib_offsetPos(&mDemoCamEye, ¤t.pos, shape_angle.y + field_0x14ac, &sp24); mDemoCamEye.y = 50.0f; mDemoCamBank = 70.0f; return; case 10: current.pos.set(0.0f, 0.0f, 0.0f); eyePos.set(-54.0f, 168.0f, 207.0f); shape_angle.y = 0; current.angle.y = 0; mMode = 1; case 1: mDemoCamCenter = eyePos; mDemoCamCenter.y -= 50.0f; field_0x14ac += 0x40; sp24.set(0.0f, 0.0f, field_0x14a4); cLib_offsetPos(&mDemoCamEye, ¤t.pos, shape_angle.y + field_0x14ac, &sp24); mDemoCamEye.y = 50.0f; if (mpMorf->checkFrame(155.0f)) { mMode = 2; mDemoModeTimer = 60; sp30.set(0.0f, 0.0f, 350.0f); player->setPlayerPosAndAngle(&sp30, 0x8000, 0); field_0x14a4 = 400.0f; sp24.set(0.0f, 0.0f, field_0x14a4); cLib_offsetPos(&mDemoCamEye, ¤t.pos, shape_angle.y + field_0x14ac, &sp24); mDemoCamEye.y = 500.0f; } break; case 2: mDemoCamCenter = eyePos; mDemoCamCenter.y -= 50.0f; if (mpMorf->isStop()) { mDoMtx_stack_c::copy(mpWeaponModel->getBaseTRMtx()); mDoMtx_stack_c::transM(-10.0f, 160.0f, 15.0f); mDoMtx_stack_c::multVecZero(&sp30); fopAcM_createDisappear(this, &sp30, 20, 0, 0xFF); mDemoModeTimer = 120; mMode = 3; mPlayEndEf = true; mpEndEfMorf->setFrame(0.0f); mpEndEfBrk->setFrame(0.0f); mpEndEfBrk->setPlaySpeed(1.0f); mDownTimer = 100; setBugsEffect(); mSound.startCreatureSound(Z2SE_EN_VA_END, 0, -1); mKankyoColBlend = 0.0f; mKankyoColType = 3; } break; case 3: mDemoCamCenter = eyePos; mDemoCamCenter.y -= 50.0f; if (mDownTimer == 0) { field_0x1388 = 1; } if (mDownTimer == 80) { field_0x1240 = 2; mWeponEfMode = 0; } if (mDemoModeTimer == 0) { field_0x122c = mDemoCamCenter; mMode = 4; mDemoModeTimer = 150; } break; case 4: if (mDownTimer == 0) { field_0x1388 = 1; } mDemoCamCenter = field_0x122c; field_0x122c.y += 10.0f; if (mDemoModeTimer == 0) { camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); if (mSwNo != 0xFF && !dComIfGs_isSwitch(mSwNo, fopAcM_GetRoomNo(this))) { dComIfGs_onSwitch(mSwNo, fopAcM_GetRoomNo(this)); } Z2GetAudioMgr()->unMuteSceneBgm(45); fopAcM_delete(this); return; } break; } camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); } void daE_VA_c::calcMagicMove() { for (int i = 0; i < 2; i++) { switch (field_0x1228[i]) { case 0: mMagicSphs[i].OffAtSetBit(); break; case 1: { mMagicSphs[i].OnAtSetBit(); field_0x1228[i] = 2; mDoMtx_stack_c::copy(mpWeaponModel->getBaseTRMtx()); mDoMtx_stack_c::transM(-30.0f, 320.0f, 65.0f); mDoMtx_stack_c::multVecZero(&mMagicPos[i]); mMagicOldPos[i] = mMagicPos[i]; mMagicAcch[i].ClrGroundHit(); mMagicAcch[i].ClrWallHit(); mMagicSphs[i].ClrAtHit(); cXyz sp5C(daPy_getPlayerActorClass()->current.pos); s16 spA = cLib_targetAngleY(&mMagicPos[i], &sp5C); s16 sp8 = cLib_targetAngleX(&mMagicPos[i], &sp5C); f32 temp_f31 = std::abs(cM_scos(sp8) * 50.0f); mMagicSpeed[i].set(temp_f31 * cM_ssin(spA), cM_ssin(sp8) * 50.0f, temp_f31 * cM_scos(spA)); } /* fallthrough */ case 2: Z2GetAudioMgr()->seStartLevel(Z2SE_EN_VA_ATK_BALL, &mMagicPos[i], 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); setMagicEffect(i); mMagicSphs[i].SetC(mMagicPos[i]); mMagicSphs[i].SetR(50.0f); dComIfG_Ccsp()->Set(&mMagicSphs[i]); if (mMagicAcch[i].ChkGroundHit() || mMagicAcch[i].ChkWallHit() || mMagicSphs[i].ChkAtHit()) { Z2GetAudioMgr()->seStart(Z2SE_EN_VA_FIRE_BURST, &mMagicPos[i], 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); mMagicPos[i].y = 0.0f; setMagicHitEffect(i); field_0x1228[i] = 0; } mMagicOldPos[i] = mMagicPos[i]; mMagicPos[i] += mMagicSpeed[i]; mMagicAcch[i].CrrPos(dComIfG_Bgsp()); break; } } } void daE_VA_c::setAlphaType() { switch (mAlphaType) { case 0: case 3: cLib_chaseUC(&mGlowLightA, 0, 4); cLib_chaseUC(&mEyeAlpha, 0, 4); field_0x1380 = 0; if (mAlphaType == 3 && mGlowLightA == 0) { mAlphaType = 0; } cLib_chaseUC(&mGlowLightR, 0, 8); cLib_chaseUC(&mGlowLightG, 0, 8); cLib_chaseUC(&mGlowLightB, 0, 8); if (mAlphaType == 0) { cLib_chaseUC(&mFootSmokeAlpha, 0, 27); } else if (mFootSmokeAlpha < 33) { cLib_chaseUC(&mFootSmokeAlpha, 0, 1); } else { cLib_chaseUC(&mFootSmokeAlpha, 0, 10); } field_0x138f = 0; mNeckSph.OffTgSetBit(); for (int i = 0; i < 3; i++) { mBodyCyls[i].OffCoSetBit(); mBodyCyls[i].OffTgSetBit(); mBodyCyls[i].OnTgNoHitMark(); } break; case 1: if (mGlowBody) { cLib_chaseUC(&mGlowLightR, l_HIO.mKRegLightR, (u8)(l_HIO.mKRegLightR / 10.0f)); cLib_chaseUC(&mGlowLightG, l_HIO.mKRegLightG, (u8)(l_HIO.mKRegLightG / 10.0f)); cLib_chaseUC(&mGlowLightB, l_HIO.mKRegLightB, (u8)(l_HIO.mKRegLightB / 10.0f)); cLib_chaseUC(&mGlowLightA, l_HIO.mKRegLightA, (u8)((l_HIO.mKRegLightA - 128.0f) / 10.0f)); } else { cLib_chaseUC(&mGlowLightR, 0, (u8)(l_HIO.mKRegLightR / 20.0f)); cLib_chaseUC(&mGlowLightG, 0, (u8)(l_HIO.mKRegLightG / 20.0f)); cLib_chaseUC(&mGlowLightB, 0, (u8)(l_HIO.mKRegLightB / 20.0f)); cLib_chaseUC(&mGlowLightA, 0x80, 8); } cLib_chaseUC(&mEyeAlpha, 0, 4); field_0x1380 = 0; cLib_chaseUC(&mFootSmokeAlpha, 180, 8); mNeckSph.OnTgSetBit(); mBodyCyls[0].OnTgSetBit(); mBodyCyls[1].OffTgSetBit(); mBodyCyls[2].OffTgSetBit(); for (int i = 0; i < 3; i++) { mBodyCyls[i].OffCoSetBit(); mBodyCyls[i].OnTgNoHitMark(); } break; case 2: cLib_chaseUC(&mGlowLightA, 0xFF, 4); cLib_chaseUC(&mEyeAlpha, 0xFF, 8); cLib_chaseUC(&field_0x1380, 0, 1); cLib_chaseUC(&mFootSmokeAlpha, 0xFF, 4); mNeckSph.OffTgSetBit(); for (int i = 0; i < 3; i++) { mBodyCyls[i].OnCoSetBit(); mBodyCyls[i].OffTgNoHitMark(); mBodyCyls[i].OffTgSetBit(); } break; } } void daE_VA_c::action() { field_0x1391 = 0; setAlphaType(); damage_check(); for (int i = 0; i < 4; i++) { mAttackSphs[i].OffAtSetBit(); if (mGlowBody && i == 0) { mAttackSphs[i].OffCoSetBit(); mAttackSphs[i].OffTgShield(); mAttackSphs[i].OnTgNoHitMark(); } else { mAttackSphs[i].OnCoSetBit(); if (mOffTgTimer != 0) { mAttackSphs[i].OffTgShield(); mAttackSphs[i].OnTgNoHitMark(); } else { mAttackSphs[i].OnTgShield(); mAttackSphs[i].OffTgNoHitMark(); } } } BOOL var_r29 = true; field_0x1386 = 0; field_0x1388 = 0; switch (mAction) { case ACTION_DEMO_OP_WAIT_e: executeDemoOpWait(); var_r29 = false; break; case ACTION_DEMO_OP_e: executeDemoOp(); var_r29 = false; break; case ACTION_CLEAR_WAIT_e: executeClearWait(); break; case ACTION_CLEAR_CHASE_e: executeClearChase(); break; case ACTION_CLEAR_ATTACK_e: executeClearAttack(); break; case ACTION_TRANS_WAIT_e: executeTransWait(); break; case ACTION_TRANS_CHASE_e: executeTransChase(); break; case ACTION_TRANS_ATTACK_e: executeTransAttack(); break; case ACTION_TRANS_BITE_DAMAGE_e: executeTransBiteDamage(); break; case ACTION_TRANS_DAMAGE_e: executeTransDamage(); break; case ACTION_TRANS_THROUGH_e: executeTransThrough(); break; case ACTION_OPACI_WAIT_e: executeOpaciWait(); break; case ACTION_OPACI_FLY_e: executeOpaciFly(); break; case ACTION_OPACI_DOWN_e: executeOpaciDown(); break; case ACTION_OPACI_DOWN_DAMAGE_e: executeOpaciDownDamage(); break; case ACTION_OPACI_CHASE_e: executeOpaciChase(); break; case ACTION_OPACI_ATTACK_e: executeOpaciAttack(); break; case ACTION_OPACI_DAMAGE_e: executeOpaciDamage(); break; case ACTION_OPACI_FLIP_e: executeOpaciFlip(); break; case ACTION_OPACI_FADE_AWAY_e: executeOpaciFadeAway(); break; case ACTION_OPACI_DEATH_e: executeOpaciDeath(); break; } if (var_r29) { daPy_getPlayerActorClass()->onBossRoomWait(); } if (!field_0x138e) { if (daPy_getPlayerActorClass()->checkNowWolfEyeUp()) { field_0x1358 = 20; field_0x138e = 1; } } else { if (!daPy_getPlayerActorClass()->checkNowWolfEyeUp()) { field_0x1358 = 20; field_0x138e = 0; } } fopAcM_posMoveF(this, mBodyCcStts.GetCCMoveP()); mAcch.CrrPos(dComIfG_Bgsp()); switch (mKankyoColType) { case 0: if (daPy_getPlayerActorClass()->checkNowWolfEyeUp()) { cLib_chaseF(&mKankyoColBlend, 1.0f, 0.1f); } else { cLib_chaseF(&mKankyoColBlend, 0.0f, 0.1f); } dKy_custom_colset(2, 0, mKankyoColBlend); break; case 1: cLib_chaseF(&mKankyoColBlend, 1.0f, 0.1f); dKy_custom_colset(0, 1, mKankyoColBlend); break; case 2: cLib_chaseF(&mKankyoColBlend, 0.0f, 0.1f); dKy_custom_colset(2, 1, mKankyoColBlend); if (!mKankyoColBlend) { mKankyoColType = 0; } break; case 3: cLib_chaseF(&mKankyoColBlend, 1.0f, 0.01f); dKy_custom_colset(1, 4, mKankyoColBlend); break; case 4: cLib_chaseF(&mKankyoColBlend, 1.0f, 0.01f); /* fallthrough */ case 5: dKy_custom_colset(3, 2, mKankyoColBlend); if (mKankyoColBlend == 1.0f) { mKankyoColType = 0; mKankyoColBlend = 0.0f; } break; } s16 spC = shape_angle.y - current.angle.y; s16 target_x = (speedF * 128.0f) * cM_scos(spC); s16 target_z = (speedF * 128.0f) * cM_ssin(spC); cLib_addCalcAngleS(&field_0x1304.x, target_x, 8, 0x400, 0x40); cLib_addCalcAngleS(&field_0x1304.z, target_z, 8, 0x400, 0x40); mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); if (mPlayEndEf) { mpEndEfMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } mpWeaponBrk->play(); mpEndEfBrk->play(); } void daE_VA_c::mtx_set() { mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::transM(0.0f, 300.0f, 0.0f); mDoMtx_stack_c::ZXYrotM(field_0x1304); mDoMtx_stack_c::transM(0.0f, -300.0f, 0.0f); mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); J3DModel* model = mpMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); if (mPlayEndEf) { mpEndEfMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); mpEndEfMorf->modelCalc(); } field_0x138b = 0; mpMorf->modelCalc(); calcJointSleeve(); field_0x138b = 1; mpMorf->modelCalc(); if (!mRopesEnabled) { if (mpWeaponModel != NULL) { mpWeaponModel->setBaseTRMtx(model->getAnmMtx(JNT_KEN_2)); } } else { if (mpWeaponModel != NULL) { switch (field_0x1240) { case 0: mDoMtx_stack_c::transS(field_0x122c); mDoMtx_stack_c::transM(0.0f, 150.0f, 0.0f); mDoMtx_stack_c::ZXYrotM(field_0x1238); mDoMtx_stack_c::transM(0.0f, -150.0f, 0.0f); mDoMtx_stack_c::transM(0.0f, 400.0f, 0.0f); mDoMtx_stack_c::XrotM(field_0x123e); mDoMtx_stack_c::transM(0.0f, -400.0f, 0.0f); mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); mpWeaponModel->setBaseTRMtx(mDoMtx_stack_c::get()); break; case 1: mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_KEN_2)); mpWeaponModel->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_stack_c::multVecZero(&field_0x122c); break; } } cXyz sp34; cXyz sp40; for (int i = 0; i < 40; i++) { f32 var_f31; switch (mCardFlags[i] & 3) { case 0: var_f31 = 80.0f; break; case 1: var_f31 = 50.0f; break; case 2: var_f31 = 25.0f; break; } int idx = va_tag_set_num[i]; sp34 = field_0x994[idx + 1] - field_0x994[idx]; sp34.normalizeZP(); sp40 = field_0x994[idx] + (sp34 * va_tag_offset[i]); mDoMtx_stack_c::transS(sp40); mDoMtx_stack_c::ZXYrotM(field_0x660[i]); mDoMtx_stack_c::transM(0.0f, -var_f31, 0.0f); mDoMtx_stack_c::XrotM(0x4000); mpCardModels[i]->setBaseTRMtx(mDoMtx_stack_c::get()); } } } void daE_VA_c::cc_set() { cXyz sp24; if (mGlowLightA != 0) { mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::multVecZero(&eyePos); attention_info.position = eyePos; attention_info.position.y += 50.0f; } else { mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_KEN_2)); mDoMtx_stack_c::transM(-20.0f, 350.0f, 50.0f); mDoMtx_stack_c::multVecZero(&eyePos); attention_info.position = eyePos; attention_info.position.y += 30.0f; } mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_NECK_02)); mDoMtx_stack_c::transM(0.0f, 40.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp24); mNeckSph.SetC(sp24); if (mGlowBody) { mNeckSph.SetR(nREG_F(7) + 70.0f); } else { mNeckSph.SetR(50.0f); } dComIfG_Ccsp()->Set(&mNeckSph); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_ROOT)); mDoMtx_stack_c::transM(0.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp24); mBodyCyls[0].SetC(sp24); mBodyCyls[0].SetH(200.0f); if (mGlowBody) { mBodyCyls[0].SetR(75.0f); } else { mBodyCyls[0].SetR(100.0f); } dComIfG_Ccsp()->Set(&mBodyCyls[0]); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_NECK_02)); mDoMtx_stack_c::multVecZero(&sp24); sp24.y -= 50.0f; mBodyCyls[1].SetC(sp24); mBodyCyls[1].SetH(100.0f); mBodyCyls[1].SetR(80.0f); dComIfG_Ccsp()->Set(&mBodyCyls[1]); mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_NECK_02)); mDoMtx_stack_c::multVecZero(&sp24); sp24.y -= 200.0f; mBodyCyls[2].SetC(sp24); mBodyCyls[2].SetH(200.0f); mBodyCyls[2].SetR(80.0f); dComIfG_Ccsp()->Set(&mBodyCyls[2]); mDoMtx_stack_c::copy(mpWeaponModel->getBaseTRMtx()); mDoMtx_stack_c::transM(10.0f, 0.0f, -25.0f); for (int i = 0; i < 4; i++) { mDoMtx_stack_c::transM(-10.0f, 80.0f, 20.0f); mDoMtx_stack_c::multVecZero(&sp24); mAttackSphs[i].SetC(sp24); if (mAttackSphs[i].ChkAtSet()) { mAttackSphs[i].SetR(70.0f); } else { mAttackSphs[i].SetR(50.0f); } dComIfG_Ccsp()->Set(&mAttackSphs[i]); } if (mRopesEnabled) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 19; j++) { int sp14 = i * 19; sp14 += j; int sp10 = i * 10; sp10 += (j >> 1); if (!(j & 1)) { mLineSphs[sp14].SetC(field_0x994[sp10]); } else { mLineSphs[sp14].SetC((field_0x994[sp10] + field_0x994[sp10 + 1]) / 2.0f); } mLineSphs[sp14].SetR(20.0f); dComIfG_Ccsp()->Set(&mLineSphs[sp14]); } } } } int daE_VA_c::execute() { if (mDemoModeTimer != 0) { mDemoModeTimer--; } if (mDownTimer != 0) { mDownTimer--; } if (mFadeAwayTimer != 0) { mFadeAwayTimer--; } if (field_0x1350 != 0) { field_0x1350--; } if (mAttackSphIFrameTimer != 0) { mAttackSphIFrameTimer--; } if (mNeckSphIFrameTimer != 0) { mNeckSphIFrameTimer--; } if (mBodyCylIFrameTimer != 0) { mBodyCylIFrameTimer--; } if (mOffTgTimer != 0) { mOffTgTimer--; } if (field_0x1348 != 0) { field_0x1348--; } if (field_0x1354 != 0) { field_0x1354--; } if (field_0x1358 != 0) { field_0x1358--; } action(); calcJointNeck(); mtx_set(); setFootEffect(); setWeponEffect(); calcMagicMove(); cc_set(); if (mAlphaType < 2) { if (daPy_getPlayerActorClass()->checkWolfLock(this)) { daPy_getPlayerActorClass()->cancelWolfLock(this); } onWolfNoLock(); } else { offWolfNoLock(); } cXyz bind_pos; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(JNT_HEAD)); mDoMtx_stack_c::multVecZero(&bind_pos); cXyz bind_scale(1.0f, 1.0f, 1.0f); setMidnaBindEffect(this, &mSound, &bind_pos, &bind_scale); return 1; } static int daE_VA_Execute(daE_VA_c* i_this) { return i_this->execute(); } static int daE_VA_IsDelete(daE_VA_c* i_this) { return 1; } int daE_VA_c::_delete() { dComIfG_resDelete(&mPhase, "E_VA"); if (mInitHIO) { hio_set = false; } for (int i = 0; i < 2; i++) { JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mFootSmokeEmtrIDs[i]); if (emitter != NULL) { emitter->deleteAllParticle(); } } if (heap != NULL) { mSound.deleteObject(); } return 1; } static int daE_VA_Delete(daE_VA_c* i_this) { return i_this->_delete(); } int daE_VA_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x33); JUT_ASSERT(0, modelData != NULL); mpMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_VA", 15), 0, 1.0f, 0, -1, &mSound, 0x80000, 0x31000084); if (mpMorf == NULL || mpMorf->getModel() == NULL) { return 0; } if (!mInvisModel.create(mpMorf->getModel(), 1)) { return 0; } J3DModel* model = mpMorf->getModel(); model->setUserArea((uintptr_t)this); for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { if (i == 11 || i == 12 || i == 13 || i == 14 || i == 27 || i == 33 || i == 34) { model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); } } modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x30); JUT_ASSERT(0, modelData != NULL); mpWeaponModel = mDoExt_J3DModel__create(modelData, 0, 0x11000084); if (mpWeaponModel == NULL) { return 0; } mpWeaponBrk = new mDoExt_brkAnm(); if (mpWeaponBrk == NULL) { return 0; } if (!mpWeaponBrk->init(mpWeaponModel->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("E_VA", 0x3B), TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1)) { return 0; } modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x37); JUT_ASSERT(0, modelData != NULL); mpEndEfMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_VA", 7), 0, 1.0f, 0, -1, &mSound, 0x80000, 0x31000084); if (mpEndEfMorf == NULL || mpEndEfMorf->getModel() == NULL) { return 0; } model = mpEndEfMorf->getModel(); model->setUserArea((uintptr_t)this); for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { if (i == 11 || i == 12 || i == 13 || i == 14 || i == 27 || i == 33 || i == 34) { model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); } } mpEndEfBrk = new mDoExt_brkAnm(); if (mpEndEfBrk == NULL) { return 0; } if (!mpEndEfBrk->init(model->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("E_VA", 0x3A), TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1)) { return 0; } if (!field_0x139c.init(1, 5, 1)) { return 0; } f32* size_p = field_0x139c.getSize(0); for (int i = 0; i < 5; i++, size_p++) { *size_p = 5.0f; } if (!mRope.init(11, 10, (ResTIMG*)dComIfG_getObjectRes("E_VA", 0x3E), 1)) { return 0; } for (int i = 0; i < 11; i++) { f32* size_p = mRope.getSize(i); for (int j = 0; j < 10; ++j, size_p++) { *size_p = 2.0f; } } for (int i = 0; i < 40; i++) { switch (va_tag_set_size[i]) { case 0: modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x34); mCardFlags[i] = 0; break; case 1: modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x35); mCardFlags[i] = 1; break; case 2: modelData = (J3DModelData*)dComIfG_getObjectRes("E_VA", 0x36); mCardFlags[i] = 2; break; } JUT_ASSERT(0, modelData != NULL); mpCardModels[i] = mDoExt_J3DModel__create(modelData, 0, 0x11000084); } return 1; } static int useHeapInit(fopAc_ac_c* i_this) { return ((daE_VA_c*)i_this)->CreateHeap(); } int daE_VA_c::create() { fopAcM_ct(this, daE_VA_c); int phase_state = dComIfG_resLoad(&mPhase, "E_VA"); if (phase_state == cPhs_COMPLEATE_e) { OS_REPORT("E_VA PARAM %x\n", fopAcM_GetParam(this)); if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x216A0)) { return cPhs_ERROR_e; } if (!hio_set) { hio_set = true; mInitHIO = true; l_HIO.field_0x04 = -1; } attention_info.flags = 0; mSwNo = fopAcM_GetParam(this); if (mSwNo != 0xFF && dComIfGs_isSwitch(mSwNo, fopAcM_GetRoomNo(this))) { g_env_light.mColpatWeather = 4; g_env_light.wether_pat0 = 4; g_env_light.wether_pat1 = 4; return cPhs_ERROR_e; } fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(this, -500.0f, -500.0f, -500.0f); fopAcM_SetMax(this, 500.0f, 500.0f, 500.0f); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); mAcchCir.SetWall(40.0f, 500.0f); for (int i = 0; i < 2; i++) { mMagicAcch[i].Set(&mMagicPos[i], &mMagicOldPos[i], this, 1, &mMagicAcchCir[i], &mMagicSpeed[i], NULL, NULL); mMagicAcchCir[i].SetWall(0.0f, 120.0f); } health = 100; field_0x560 = 100; mBodyCcStts.Init(0xFF, 0, this); mNeckSph.Set(cc_vt_neck_src); mNeckSph.SetStts(&mBodyCcStts); for (int i = 0; i < 3; i++) { mBodyCyls[i].Set(cc_vt_body_src); mBodyCyls[i].SetStts(&mBodyCcStts); } for (int i = 0; i < 4; i++) { mAttackSphs[i].Set(cc_vt_attack_src); mAttackSphs[i].SetStts(&mBodyCcStts); } field_0x1b3c.Init(0xFF, 0, this); for (int i = 0; i < 190; i++) { mLineSphs[i].Set(cc_vt_line_src); mLineSphs[i].SetStts(&field_0x1b3c); } mMagicSphs[0].Set(cc_vt_magic_src); mMagicSphs[0].SetStts(&field_0x1b3c); mMagicSphs[1].Set(cc_vt_magic_src); mMagicSphs[1].SetStts(&field_0x1b3c); mSound.init(¤t.pos, &eyePos, 3, 1); mSound.setEnemyName("E_va"); mAtInfo.mpSound = &mSound; mAtInfo.mPowerType = 1; mFootSmokeAlpha = 0; mEyeAlpha = 0; mGlowLightA = 0; attention_info.distances[fopAc_attn_BATTLE_e] = 62; g_env_light.mColpatWeather = 2; g_env_light.wether_pat0 = 2; g_env_light.wether_pat1 = 2; if (daPy_getPlayerActorClass()->current.pos.z >= 1850.0f) { cDmr_SkipInfo = 0; } if (cDmr_SkipInfo != 0) { dComIfGs_onOneZoneSwitch(9, fopAcM_GetRoomNo(this)); cDmr_SkipInfo = 0; mWeponEfMode = 3; mAction = ACTION_CLEAR_WAIT_e; Z2GetAudioMgr()->subBgmStart(Z2BGM_VARIANT); Z2GetAudioMgr()->changeSubBgmStatus(1); mKankyoColType = 0; g_env_light.mColpatWeather = 2; g_env_light.wether_pat0 = 2; g_env_light.wether_pat1 = 2; } else { mAction = ACTION_DEMO_OP_WAIT_e; mKankyoColType = 5; g_env_light.mColpatWeather = 3; g_env_light.wether_pat0 = 3; g_env_light.wether_pat1 = 3; } daE_VA_Execute(this); } return phase_state; } daE_VA_c::daE_VA_c() { /* empty function */ } static int daE_VA_Create(daE_VA_c* i_this) { return i_this->create(); } static actor_method_class l_daE_VA_Method = { (process_method_func)daE_VA_Create, (process_method_func)daE_VA_Delete, (process_method_func)daE_VA_Execute, (process_method_func)daE_VA_IsDelete, (process_method_func)daE_VA_Draw, }; actor_process_profile_definition g_profile_E_VT = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 7, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_E_VT_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daE_VA_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_E_VT_e, /* Actor SubMtd */ &l_daE_VA_Method, /* Status */ fopAcStts_UNK_0x40000_e, /* Group */ fopAc_ENEMY_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, }; AUDIO_INSTANCES;