/** * @file d_a_e_hzelda.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_e_hzelda.h" #include "d/actor/d_a_player.h" #include "d/d_com_inf_game.h" #include "SSystem/SComponent/c_math.h" #include "f_op/f_op_camera_mng.h" #include "f_op/f_op_msg_mng.h" #include "m_Do/m_Do_graphic.h" #include "d/d_s_play.h" #define ANM_ATTACKC 6 #define ANM_ATTACKC_A 7 #define ANM_ATTACKC_B 8 #define ANM_ATTACK_C_WAIT 9 #define ANM_ATTACK_A 10 #define ANM_ATTACK_A_BEFORE 11 #define ANM_ATTACK_B 12 #define ANM_ATTACK_C 13 #define ANM_ATTACK_WAIT 14 #define ANM_BEFORE_ATTACK 15 #define ANM_DAMAGE 16 #define ANM_DAMAGE_LOOP 17 #define ANM_DAMAGE_UP 18 #define ANM_FMOVE_L 19 #define ANM_FMOVE_R 20 #define ANM_FWAIT 21 #define ANM_LAST_DAMAGE 22 enum helda_joint { JNT_CENTER, JNT_BACKBONE1, JNT_BACKBONE2, JNT_NECK, JNT_HEAD, JNT_CHIN, JNT_MAYU_L, JNT_MAYU_R, JNT_MOMI_L1, JNT_MOMI_L2, JNT_MOMI_L3, JNT_MOMI_R1, JNT_MOMI_R2, JNT_MOMI_R3, JNT_MOUTH, JNT_OSAGE1, JNT_OSAGE2, JNT_OSAGE3, JNT_SHOULDER_L, JNT_ARM_L1, JNT_ARM_L2, JNT_HAND_L, JNT_FINGER_L1, JNT_FINGER_L2, JNT_THAMB_L, JNT_SHOULDER_R, JNT_ARM_R1, JNT_ARM_R2, JNT_HAND_R, JNT_FINGER_R1, JNT_FINGER_R2, JNT_THAMB_R, JNT_WAIST, JNT_CLOTH1, JNT_CLOTH2, JNT_CLOTH3, JNT_LEG_L1, JNT_LEG_L2, JNT_FOOT_L, JNT_LEG_R1, JNT_LEG_R2, JNT_FOOT_R, JNT_SKIRT_BL1, JNT_SKIRT_BL2, JNT_SKIRT_BR1, JNT_SKIRT_BR2, JNT_SKIRT_FL1, JNT_SKIRT_FL2, JNT_SKIRT_FR1, JNT_SKIRT_FR2, }; enum hzelda_action { ACTION_WAIT, ACTION_ATTACK_A, // Sword Attack ACTION_ATTACK_B, // Triangle Attack ACTION_ATTACK_C, // Ball Throw Attack ACTION_DAMAGE = 5 }; enum hzelda_timer { TIMER_ATTACK_WAIT = 0, }; /* 806F0D4C-806F0D70 0000EC 0024+00 1/1 0/0 0/0 .text __ct__16daE_HZELDA_HIO_cFv */ daE_HZELDA_HIO_c::daE_HZELDA_HIO_c() { field_0x4 = -1; mModelSize = 1.0f; } /* 806F0D70-806F0E1C 000110 00AC+00 5/5 0/0 0/0 .text anm_init__FP14e_hzelda_classifUcf */ static void anm_init(e_hzelda_class* i_this, int i_resID, f32 i_morf, u8 i_attr, f32 i_speed) { i_this->mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Hzelda", i_resID), i_attr, i_morf, i_speed, 0.0f, -1.0f); i_this->mAnm = i_resID; } /* 806F0E1C-806F1004 0001BC 01E8+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */ static int nodeCallBack(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { int jnt_no = i_joint->getJntNo(); J3DModel* model = j3dSys.getModel(); e_hzelda_class* a_this = (e_hzelda_class*)model->getUserArea(); if (a_this != NULL) { MTXCopy(model->getAnmMtx(jnt_no), *calc_mtx); if (jnt_no == JNT_NECK) { cMtx_XrotM(*calc_mtx, a_this->mHeadRotX / 2); cMtx_ZrotM(*calc_mtx, -a_this->mHeadRotZ / 2); } else if (jnt_no == JNT_HEAD) { cMtx_XrotM(*calc_mtx, a_this->mHeadRotX / 2); cMtx_ZrotM(*calc_mtx, a_this->mHeadRotZ / 2); } else if (jnt_no == JNT_ARM_L1) { cMtx_YrotM(*calc_mtx, a_this->mArmLRotY); } else if (jnt_no == JNT_ARM_R1) { cMtx_YrotM(*calc_mtx, -a_this->mArmRRotY); } else if (jnt_no == JNT_WAIST) { cMtx_YrotM(*calc_mtx, a_this->mBodyRotY); cMtx_ZrotM(*calc_mtx, a_this->mBodyRotZ); } model->setAnmMtx(jnt_no, *calc_mtx); MTXCopy(*calc_mtx, J3DSys::mCurrentMtx); } } return 1; } /* 806F1004-806F1214 0003A4 0210+00 1/0 0/0 0/0 .text daE_HZELDA_Draw__FP14e_hzelda_class */ static int daE_HZELDA_Draw(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; J3DModel* model = i_this->mpModelMorf->getModel(); g_env_light.settingTevStruct(0, &a_this->current.pos, &a_this->tevStr); g_env_light.setLightTevColorType_MAJI(model, &a_this->tevStr); i_this->mpModelMorf->entryDL(); if (i_this->mpSwordModel != NULL) { g_env_light.setLightTevColorType_MAJI(i_this->mpSwordModel, &a_this->tevStr); J3DMaterial* materialp = i_this->mpSwordModel->getModelData()->getMaterialNodePointer(0); materialp->getTevColor(0)->r = i_this->mSwordColorIntensity * 255.0f; materialp->getTevColor(0)->g = i_this->mSwordColorIntensity * 150.0f; materialp->getTevColor(0)->b = 0; mDoExt_modelUpdateDL(i_this->mpSwordModel); } cXyz shadow_pos; shadow_pos.set(a_this->current.pos.x, a_this->current.pos.y + 100.0f, a_this->current.pos.z); i_this->mShadowKey = dComIfGd_setShadow(i_this->mShadowKey, 1, model, &shadow_pos, 1000.0f, 0.0f, a_this->current.pos.y, i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd, &a_this->tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); if (i_this->mpSwordModel != NULL) { dComIfGd_addRealShadow(i_this->mShadowKey, i_this->mpSwordModel); } if (i_this->mDrawTriangleAt) { i_this->mpTriangleAtBrk->entry(i_this->mpTriangleAtModel->getModelData()); i_this->mpTriangleAtBtk->entry(i_this->mpTriangleAtModel->getModelData()); g_env_light.setLightTevColorType_MAJI(i_this->mpTriangleAtModel, &a_this->tevStr); mDoExt_modelUpdateDL(i_this->mpTriangleAtModel); } return 1; } /* 806F1214-806F13A8 0005B4 0194+00 1/1 0/0 0/0 .text shot_s_sub__FPvPv */ static void* shot_s_sub(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_ARROW && (fopAcM_GetParam(i_actor) == 1 || fopAcM_GetParam(i_actor) == 2)) { cXyz vec = ((fopAc_ac_c*)i_data)->current.pos - ((fopAc_ac_c*)i_actor)->current.pos; if (vec.abs() < 1000.0f) { return i_actor; } } return NULL; } /* 806F13A8-806F1758 000748 03B0+00 1/1 0/0 0/0 .text e_hzelda_wait__FP14e_hzelda_class */ static void e_hzelda_wait(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp24; cXyz sp30; i_this->field_0x6b4 = 5; i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_MOVE, 0, -1); switch (i_this->mMode) { case -1: Z2GetAudioMgr()->bgmStart(Z2BGM_VS_GANON_01, 0, 0); case 0: anm_init(i_this, ANM_FWAIT, 10.0f, J3DFrameCtrl::EMode_LOOP, 1.0f); i_this->mMode = 1; i_this->mTimers[TIMER_ATTACK_WAIT] = cM_rndF(150.0f) + 100.0f; i_this->mMoveStep = 0.0f; i_this->field_0x5d0 = i_this->mAngleToPlayer + 0x8000; break; case 1: break; } cLib_addCalc2(&a_this->speedF, 0.0f, 1.0f, 3.0f); cLib_addCalcAngleS2(&a_this->current.angle.y, i_this->mAngleToPlayer, 2, 0x300); cMtx_YrotS(*calc_mtx, i_this->field_0x5d0); sp24.x = cM_ssin(i_this->mCounter * 300) * 300.0f; sp24.y = cM_ssin(i_this->mCounter * 700) * 30.0f + 300.0f; sp24.z = cM_ssin(i_this->mCounter * 400) * 150.0f + 600.0f; MtxPosition(&sp24, &i_this->mTargetMovePos); i_this->mTargetMovePos += player->current.pos; cLib_addCalc2(&a_this->current.pos.x, i_this->mTargetMovePos.x, 0.1f, i_this->mMoveStep); cLib_addCalc2(&a_this->current.pos.y, i_this->mTargetMovePos.y, 0.1f, i_this->mMoveStep); cLib_addCalc2(&a_this->current.pos.z, i_this->mTargetMovePos.z, 0.1f, i_this->mMoveStep); cLib_addCalc2(&i_this->mMoveStep, 30.0f, 1.0f, 0.5f); i_this->mIsLookatPlayer = true; if (i_this->mDodgeMove < 0.1f) { if (i_this->mTimers[TIMER_ATTACK_WAIT] == 0) { if (i_this->mNoBallCount != 0) { i_this->mNoBallCount--; // 50-50% chance of sword or triangle attack if (cM_rndF(1.0f) < 0.5f) { i_this->mAction = ACTION_ATTACK_A; } else { i_this->mAction = ACTION_ATTACK_B; } } else { // 70% chance of ball attack. if failed, 50-50% chance of sword or triangle attack if (cM_rndF(1.0f) < 0.7f) { i_this->mAction = ACTION_ATTACK_C; } else if (cM_rndF(1.0f) < 0.5f) { i_this->mAction = ACTION_ATTACK_A; } else { i_this->mAction = ACTION_ATTACK_B; } } i_this->mMode = 0; return; } // dodge out of the way if player shoots arrow or hookshot if (fpcM_Search(shot_s_sub, i_this) != NULL || (daPy_getPlayerActorClass()->checkHookshotShootReturnMode() && !daPy_getPlayerActorClass()->checkHookshotReturnMode())) { i_this->mDodgeMove = 40.0f; if (cM_rndF(1.0f) < 0.5f) { i_this->field_0x6dc = i_this->mAngleToPlayer + 0x4000; } else { i_this->field_0x6dc = i_this->mAngleToPlayer - 0x4000; } } } cMtx_YrotS(*calc_mtx, i_this->field_0x6dc); sp24.x = 0.0f; sp24.y = 0.0f; sp24.z = i_this->mDodgeMove; MtxPosition(&sp24, &sp30); a_this->current.pos += sp30; cLib_addCalc0(&i_this->mDodgeMove, 1.0f, 2.0f); } /* 806F1758-806F1C9C 000AF8 0544+00 1/1 0/0 0/0 .text e_hzelda_attack_a__FP14e_hzelda_class */ static int e_hzelda_attack_a(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz target_dist; cXyz sp38; f32 target_speed = 0.0f; f32 speed_step = 10.0f; BOOL move_to_target = FALSE; int ret = 1; i_this->field_0x6b4 = 5; int anm_frame = i_this->mpModelMorf->getFrame(); s16 sp8 = 0; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_BEFORE_ATTACK, 10.0f, J3DFrameCtrl::EMode_NONE, 1.0f); i_this->mMode = 1; i_this->field_0x5c4 = i_this->mTargetMovePos; /* fallthrough */ case 1: move_to_target = TRUE; i_this->field_0x68c = 1; i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_MOVE, 0, -1); if (i_this->mpModelMorf->isStop()) { i_this->mMode = 2; anm_init(i_this, ANM_ATTACK_A_BEFORE, 5.0f, 0, 1.0f); i_this->field_0x5c4 = i_this->mTargetMovePos; } break; case 2: i_this->field_0x68c = 1; if (anm_frame > 32) { target_speed = 30.0f; speed_step = 10.0f; i_this->mTargetMovePos = player->current.pos; i_this->mTargetMovePos.y += 100.0f; i_this->field_0x6b8 = 1; } if (i_this->mpModelMorf->isStop()) { i_this->mMode = 3; anm_init(i_this, ANM_ATTACK_A, 0.0f, 2, 1.0f); i_this->mTimers[TIMER_ATTACK_WAIT] = 90; } break; case 3: i_this->field_0x68c = 1; target_speed = 50.0f; ret = 2; i_this->field_0x6b8 = 1; i_this->mTargetMovePos = player->current.pos; i_this->mTargetMovePos.y += 100.0f; target_dist = i_this->mTargetMovePos - a_this->current.pos; if (target_dist.abs() < 200.0f || i_this->mTimers[TIMER_ATTACK_WAIT] == 0) { i_this->mMode = 4; } break; case 4: i_this->field_0x68c = 1; speed_step = 1.0f; sp8 = -0x1000; ret = 2; i_this->field_0x6b8 = 1; if (a_this->speedF < 20.0f) { i_this->mAction = ACTION_WAIT; i_this->mMode = 0; } break; } if (move_to_target) { cLib_addCalcAngleS2(&a_this->current.angle.y, i_this->mAngleToPlayer, 2, 0x300); cLib_addCalc2(&a_this->current.pos.x, i_this->mTargetMovePos.x, 0.05f, i_this->mMoveStep); cLib_addCalc2(&a_this->current.pos.y, i_this->mTargetMovePos.y + (30.0f * cM_ssin((i_this->mCounter * 1000))), 0.1f, 30.0f); cLib_addCalc2(&a_this->current.pos.z, i_this->mTargetMovePos.z, 0.05f, i_this->mMoveStep); } if (target_speed > 0.0f) { target_dist = i_this->mTargetMovePos - a_this->current.pos; cLib_addCalcAngleS2(&a_this->current.angle.y, (s16)cM_atan2s(target_dist.x, target_dist.z), 8, 0x800); cLib_addCalcAngleS2(&a_this->current.angle.x, -cM_atan2s(target_dist.y, JMAFastSqrt((target_dist.x * target_dist.x) + (target_dist.z * target_dist.z))), 2, 0x1000); cLib_addCalcAngleS2(&a_this->shape_angle.x, a_this->current.angle.x, 2, 0x2000); } else { cLib_addCalcAngleS2(&a_this->current.angle.x, sp8, 4, 0x400); cLib_addCalcAngleS2(&a_this->shape_angle.x, a_this->current.angle.x, 8, 0x1000); } cLib_addCalc2(&a_this->speedF, target_speed, 0.5f, speed_step); return ret; } /* 806F1C9C-806F1FA4 00103C 0308+00 1/1 0/0 0/0 .text e_hzelda_attack_b__FP14e_hzelda_class */ static void e_hzelda_attack_b(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp18; cXyz spC; i_this->field_0x6b4 = 5; i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_MOVE, 0, -1); switch (i_this->mMode) { case 0: anm_init(i_this, ANM_BEFORE_ATTACK, 10.0f, 0, 1.0f); i_this->mMode = 1; /* fallthrough */ case 1: i_this->field_0x68c = 1; dComIfGs_onOneZoneSwitch(12, -1); if (i_this->mpModelMorf->isStop()) { i_this->mMode = 2; anm_init(i_this, ANM_ATTACK_WAIT, 10.0f, 2, 1.0f); i_this->mTimers[TIMER_ATTACK_WAIT] = 60; i_this->mDrawTriangleAt = TRUE; i_this->mTrianglePos = player->current.pos; i_this->mTrianglePos.y = 5.0f; i_this->mTriangleAnmFrame = 0; if (i_this->field_0x718 == 0) { i_this->mTriangleSize = 8.0f; } else if (i_this->field_0x718 == 1) { i_this->mTriangleSize = 10.0f; } else { i_this->mTriangleSize = 12.0f; } i_this->field_0x718++; i_this->mTriangleRotY = cM_rndF((f32)0x10000); } break; case 2: i_this->field_0x68c = 1; dComIfGs_onOneZoneSwitch(12, -1); if (i_this->mTriangleAnmFrame >= 80.0f) { anm_init(i_this, ANM_ATTACK_B, 5.0f, 0, 1.0f); i_this->mMode = 3; } break; case 3: dComIfGs_onOneZoneSwitch(12, -1); if (i_this->mpModelMorf->isStop()) { anm_init(i_this, ANM_FWAIT, 10.0f, 2, 1.0f); } if (i_this->mTriangleAnmFrame >= 210.0f) { i_this->mAction = ACTION_WAIT; i_this->mMode = 0; i_this->mDrawTriangleAt = FALSE; } break; } cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mAngleToPlayer, 2, 0x400); cLib_addCalc2(&i_this->current.pos.x, i_this->mTargetMovePos.x, 0.05f, i_this->mMoveStep); cLib_addCalc2(&i_this->current.pos.y, i_this->mTargetMovePos.y, 0.1f, 30.0f); cLib_addCalc2(&i_this->current.pos.z, i_this->mTargetMovePos.z, 0.05f, i_this->mMoveStep); } /* 806F1FA4-806F2054 001344 00B0+00 2/2 0/0 0/0 .text ball_crash_eff_set__FP14e_hzelda_classf */ static void ball_crash_eff_set(e_hzelda_class* i_this, f32 i_size) { cXyz size(i_size, i_size, i_size); for (int i = 0; i < 3; i++) { static u16 b_id[] = {0x8915, 0x8916, 0x8917}; dComIfGp_particle_set(b_id[i], &i_this->mBallPos, NULL, &size); } } /* 806F2054-806F28C8 0013F4 0874+00 1/1 0/0 0/0 .text e_hzelda_attack_c__FP14e_hzelda_class */ static void e_hzelda_attack_c(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp60; cXyz sp54; int anm_frame = i_this->mpModelMorf->getFrame(); i_this->field_0x6b4 = 5; i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_MOVE, 0, -1); sp60 = a_this->current.pos - i_this->mBallPos; sp60.y += 150.0f; f32 dist_to_ball = sp60.abs(); switch (i_this->mMode) { case 0: anm_init(i_this, ANM_BEFORE_ATTACK, 10.0f, 0, 1.0f); i_this->mMode = 1; // Set Midna tutorial demo switch if player doesn't hit a ball back within 5 attempts if (i_this->mMissedBallCount != 0) { i_this->mMissedBallCount++; if (i_this->mMissedBallCount >= 6) { dComIfGs_onOneZoneSwitch(3, -1); } } /* fallthrough */ case 1: i_this->field_0x68c = 1; if (i_this->mpModelMorf->isStop()) { i_this->mMode = 2; anm_init(i_this, ANM_ATTACK_WAIT, 10.0f, 2, 1.0f); i_this->mTimers[TIMER_ATTACK_WAIT] = 60; i_this->field_0x6e4 = 1; i_this->field_0x6e8 = 0.0f; } break; case 2: i_this->field_0x68c = 1; if (i_this->mTimers[TIMER_ATTACK_WAIT] == 0) { i_this->mMode = 3; anm_init(i_this, ANM_ATTACK_C, 10.0f, 0, 1.0f); } break; case 3: i_this->field_0x68c = 1; if (i_this->mpModelMorf->checkFrame(41)) { i_this->field_0x6e4 = 2; sp60 = player->eyePos - i_this->mBallPos; sp60.y -= 40.0f; i_this->mBallMoveStep = 35.0f; cMtx_YrotS(*calc_mtx, cM_atan2s(sp60.x, sp60.z)); cMtx_XrotM(*calc_mtx, -cM_atan2s(sp60.y, JMAFastSqrt((sp60.x * sp60.x) + (sp60.z * sp60.z)))); sp60.x = 0.0f; sp60.y = 0.0f; sp60.z = i_this->mBallMoveStep; MtxPosition(&sp60, &i_this->mBallMove); i_this->mBallSphAt.StartCAt(i_this->mBallPos); } if (i_this->mpModelMorf->isStop()) { anm_init(i_this, ANM_ATTACK_C_WAIT, 3.0f, 2, 1.0f); i_this->mMode = 4; } break; case 4: if (i_this->field_0x6e4 <= 0) { i_this->mAction = ACTION_WAIT; i_this->mMode = 0; } else if (i_this->field_0x6e4 == 3 && dist_to_ball < 400.0f) { if (cM_rndF(1.0f) < 0.5f) { anm_init(i_this, ANM_ATTACKC_A, 3.0f, 0, 2.0f); } else { anm_init(i_this, ANM_ATTACKC_B, 3.0f, 0, 2.0f); } i_this->mpModelMorf->setFrame(15.0f); i_this->mMode = 5; } break; case 5: if (i_this->mpModelMorf->checkFrame(30.0f)) { i_this->field_0x6e4 = 2; sp60 = player->eyePos - i_this->mBallPos; sp60.y -= 40.0f; if (i_this->mBallMoveStep < 50.0f) { i_this->mBallMoveStep += 2.0f; } cMtx_YrotS(*calc_mtx, cM_atan2s(sp60.x, sp60.z)); cMtx_XrotM(*calc_mtx, -cM_atan2s(sp60.y, JMAFastSqrt((sp60.x * sp60.x) + (sp60.z * sp60.z)))); sp60.x = 0.0f; sp60.y = 0.0f; sp60.z = i_this->mBallMoveStep; MtxPosition(&sp60, &i_this->mBallMove); ball_crash_eff_set(i_this, 0.4f); i_this->mSound.startCreatureSound(Z2SE_EN_HZE_ATK_C_BALL_RETURN, 0, -1); } if (i_this->mpModelMorf->isStop()) { anm_init(i_this, ANM_ATTACK_C_WAIT, 3.0f, 2, 1.0f); i_this->mMode = 4; } break; } if (i_this->field_0x6e4 == 3) { sp60 = a_this->current.pos - i_this->mBallPos; sp60.y += 150.0f; cMtx_YrotS(*calc_mtx, cM_atan2s(sp60.x, sp60.z)); cMtx_XrotM(*calc_mtx, -cM_atan2s(sp60.y, JMAFastSqrt((sp60.x * sp60.x) + (sp60.z * sp60.z)))); sp60.x = 0.0f; sp60.y = 0.0f; sp60.z = i_this->mBallMoveStep; MtxPosition(&sp60, &i_this->mBallMove); if (dist_to_ball < 80.0f) { i_this->field_0x6e4 = -1; i_this->mAction = ACTION_DAMAGE; i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_DAMAGE, -1); i_this->mSound.startCreatureSound(Z2SE_EN_HZE_ATK_C_BALL_HIT, 0, -1); a_this->health--; if (a_this->health == 1) { i_this->mNoBallCount = 3; } else { i_this->mNoBallCount = 1; } if (a_this->health <= 0) { i_this->mDemoMode = 1; Z2GetAudioMgr()->bgmStop(0x1E, 0); i_this->mMode = 10; i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_DAMAGE_LAST, -1); } else { i_this->mMode = 0; } } } cLib_addCalcAngleS2(&a_this->current.angle.y, i_this->mAngleToPlayer, 2, 0x400); cLib_addCalc2(&a_this->current.pos.x, i_this->mTargetMovePos.x, 0.05f, i_this->mMoveStep); cLib_addCalc2(&a_this->current.pos.y, i_this->mTargetMovePos.y + (30.0f * cM_ssin((i_this->mCounter * 1000))), 0.1f, 30.0f); cLib_addCalc2(&a_this->current.pos.z, i_this->mTargetMovePos.z, 0.05f, i_this->mMoveStep); } /* 806F28C8-806F2A3C 001C68 0174+00 2/1 0/0 0/0 .text e_hzelda_damage__FP14e_hzelda_class */ static void e_hzelda_damage(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz unused; cXyz unused2; i_this->field_0x6b4 = 5; switch (i_this->mMode) { case 0: anm_init(i_this, ANM_DAMAGE, 2.0f, 0, 1.0f); i_this->mMode = 1; /* fallthrough */ case 1: if (i_this->mpModelMorf->isStop()) { anm_init(i_this, ANM_DAMAGE_LOOP, 5.0f, 2, 1.0f); i_this->mTimers[TIMER_ATTACK_WAIT] = 60; i_this->mMode = 2; } break; case 2: if (i_this->mTimers[TIMER_ATTACK_WAIT] == 0) { anm_init(i_this, ANM_DAMAGE_UP, 2.0f, 0, 1.0f); i_this->mMode = 3; } break; case 3: if (i_this->mpModelMorf->isStop()) { i_this->mAction = ACTION_WAIT; i_this->mMode = 0; } break; case 10: anm_init(i_this, ANM_LAST_DAMAGE, 5.0f, 2, 1.0f); i_this->mMode = 11; case 11: a_this->current.pos.y -= 1.0f; break; } } /* 806F2A3C-806F2F9C 001DDC 0560+00 1/1 0/0 0/0 .text action__FP14e_hzelda_class */ static void action(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz sp50; cXyz sp44; i_this->mIsLookatPlayer = false; i_this->mDistToPlayer = fopAcM_searchPlayerDistance(i_this); i_this->mAngleToPlayer = fopAcM_searchPlayerAngleY(i_this); int sp10; BOOL on_link_search = TRUE; BOOL on_attention = TRUE; sp10 = 1; dComIfGs_offOneZoneSwitch(12, -1); switch (i_this->mAction) { case ACTION_WAIT: e_hzelda_wait(i_this); break; case ACTION_ATTACK_A: sp10 = e_hzelda_attack_a(i_this); break; case ACTION_ATTACK_B: e_hzelda_attack_b(i_this); break; case ACTION_ATTACK_C: e_hzelda_attack_c(i_this); break; case ACTION_DAMAGE: e_hzelda_damage(i_this); on_link_search = FALSE; break; } if (on_link_search) { i_this->mSound.setLinkSearch(true); } else { i_this->mSound.setLinkSearch(false); } if (on_attention) { fopAcM_OnStatus(a_this, 0); a_this->attention_info.flags = fopAc_AttnFlag_BATTLE_e; } else { fopAcM_OffStatus(a_this, 0); a_this->attention_info.flags = 0; } cLib_addCalcAngleS2(&a_this->shape_angle.y, a_this->current.angle.y, 2, 0x2000); cMtx_YrotS(*calc_mtx, a_this->current.angle.y); cMtx_XrotM(*calc_mtx, a_this->current.angle.x); sp50.x = 0.0f; sp50.y = 0.0f; sp50.z = a_this->speedF; MtxPosition(&sp50, &a_this->speed); a_this->current.pos += a_this->speed; s16 head_target_rotx = 0; s16 head_target_rotz = 0; s16 rot_max = 7000; cXyz player_pos; s16 rot_step = 0x1000; player_pos = player->eyePos; if (i_this->mIsLookatPlayer) { sp50 = player_pos - a_this->current.pos; sp50.y += -150.0f; head_target_rotx = (cM_atan2s(sp50.x, sp50.z) - a_this->shape_angle.y); head_target_rotz = (a_this->shape_angle.x + cM_atan2s(sp50.y, JMAFastSqrt((sp50.x * sp50.x) + (sp50.z * sp50.z)))); if (head_target_rotx > rot_max) { head_target_rotx = rot_max; } else if (head_target_rotx < -rot_max) { head_target_rotx = -rot_max; } if (head_target_rotz > rot_max) { head_target_rotz = rot_max; } else if (head_target_rotz < -rot_max) { head_target_rotz = -rot_max; } } cLib_addCalcAngleS2(&i_this->mHeadRotX, head_target_rotx, 2, rot_step); cLib_addCalcAngleS2(&i_this->mHeadRotZ, head_target_rotz, 2, rot_step); if (sp10 != 0) { if (sp10 == 1) { cMtx_YrotS(*calc_mtx, -a_this->shape_angle.y); sp50 = a_this->current.pos - a_this->old.pos; MtxPosition(&sp50, &sp44); sp44.x *= -400.0f; sp44.z *= 400.0f; f32 var_f29 = sp44.x; f32 var_f30 = -sp44.x; if (sp44.x < -1000.0f) { sp44.x = -1000.0f; } else if (sp44.x > 3500.0f) { sp44.x = 3500.0f; } cLib_addCalc2(&i_this->mArmLRotY, sp44.x, 0.2f, 200.0f); if (var_f29 > 1000.0f) { var_f29 = 1000.0f; } else if (var_f29 < -3500.0f) { var_f29 = -3500.0f; } cLib_addCalc2(&i_this->mArmRRotY, var_f29, 0.2f, 200.0f); if (var_f30 > 2000.0f) { var_f30 = 2000.0f; } else if (var_f30 < -2000.0f) { var_f30 = -2000.0f; } if (sp44.z > 2000.0f) { sp44.z = 2000.0f; } else if (sp44.z < -2000.0f) { sp44.z = -2000.0f; } cLib_addCalc2(&i_this->mBodyRotY, var_f30, 0.2f, 200.0f); cLib_addCalc2(&i_this->mBodyRotZ, sp44.z, 0.2f, 200.0f); cLib_addCalcAngleS2(&a_this->shape_angle.z, -0.5f * var_f30, 8, 0x400); cLib_addCalcAngleS2(&a_this->shape_angle.x, 0.5f * sp44.z, 8, 0x400); } else { f32 target_body_rot = a_this->current.angle.y - a_this->old.angle.y; target_body_rot *= -10.0f; if (target_body_rot > 9000.0f) { target_body_rot = 9000.0f; } else if (target_body_rot < -9000.0f) { target_body_rot = -9000.0f; } cLib_addCalc2(&i_this->mBodyRotY, target_body_rot, 0.5f, 1000.0f); cLib_addCalcAngleS2(&a_this->shape_angle.z, 0, 8, 0x800); } } else { cLib_addCalc0(&i_this->mArmLRotY, 0.1f, 100.0f); cLib_addCalc0(&i_this->mArmRRotY, 0.1f, 100.0f); cLib_addCalc0(&i_this->field_0x6cc, 0.1f, 100.0f); cLib_addCalc0(&i_this->field_0x6c4, 0.1f, 100.0f); cLib_addCalc0(&i_this->mBodyRotY, 0.1f, 100.0f); cLib_addCalc0(&i_this->mBodyRotZ, 0.1f, 100.0f); cLib_addCalcAngleS2(&a_this->shape_angle.z, 0, 8, 0x800); } } /* 806F2F9C-806F3084 00233C 00E8+00 1/1 0/0 0/0 .text ball_bg_check__FP14e_hzelda_class */ static BOOL ball_bg_check(e_hzelda_class* i_this) { cXyz start; cXyz end; cXyz unused; dBgS_LinChk linchk; start = i_this->mBallPos; end = i_this->mBallPos + ((i_this->mBallPos - i_this->mOldBallPos) * 2.0f); linchk.Set(&start, &end, i_this); if (dComIfG_Bgsp().LineCross(&linchk)) { return TRUE; } return FALSE; } /* 806F3084-806F3388 002424 0304+00 1/1 0/0 0/0 .text demo_camera__FP14e_hzelda_class */ static void demo_camera(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); camera_class* unused = dComIfGp_getCamera(0); daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cXyz offset; cXyz unused2; cXyz target_eye; cXyz target_center; switch (i_this->mDemoMode) { case 0: break; case 1: if (!a_this->eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(a_this, 2, 0xFFFF, 0); a_this->eventInfo.onCondition(2); return; } camera->mCamera.Stop(); i_this->mDemoMode = 2; i_this->mDemoCamFovy = 55.0f; i_this->mDemoTimer = 0; camera->mCamera.SetTrimSize(3); a_this->current.pos.set(0.0f, 500.0f, -2000.0f); a_this->shape_angle.y = 0; a_this->current.angle.y = 0; case 2: cMtx_YrotS(*calc_mtx, a_this->shape_angle.y); target_center = a_this->current.pos; target_center.y += 100.0f; if (i_this->mDemoTimer == 0) { offset.x = 200.0f; offset.y = -300.0f; offset.z = 600.0f; MtxPosition(&offset, &target_eye); target_eye += a_this->current.pos; i_this->mDemoCamEye = target_eye; i_this->mDemoCamCenter = target_center; } else if (i_this->mDemoTimer == 60) { offset.x = -100.0f; offset.y = -50.0f; offset.z = 300.0f; MtxPosition(&offset, &target_eye); target_eye += a_this->current.pos; i_this->mDemoCamEye = target_eye; } else if (i_this->mDemoTimer == 160) { offset.x = -100.0f; offset.y = 250.0f + -50.0f; offset.z = 300.0f - 200.0f; MtxPosition(&offset, &target_eye); target_eye += a_this->current.pos; i_this->mDemoCamEye = target_eye; } cLib_addCalc2(&i_this->mDemoCamCenter.y, target_center.y, 0.1f, 5.0f); if (i_this->mDemoTimer == 220) { mDoGph_gInf_c::fadeOut(0.0166f, g_blackColor); } if (i_this->mDemoTimer == 280) { dStage_changeScene(1, 0.0f, 0, fopAcM_GetRoomNo(i_this), 0, -1); } } if (i_this->mDemoMode != 0) { camera->mCamera.Set(i_this->mDemoCamCenter, i_this->mDemoCamEye, i_this->mDemoCamFovy, 0); i_this->mDemoTimer++; } } /* 806F3388-806F3590 002728 0208+00 1/1 0/0 0/0 .text anm_se_set__FP14e_hzelda_class */ static void anm_se_set(e_hzelda_class* i_this) { if (i_this->mAnm == ANM_BEFORE_ATTACK && i_this->mpModelMorf->checkFrame(21)) { i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_ATK_YOKOKU, -1); } else if (i_this->mAnm == ANM_ATTACK_A_BEFORE && i_this->mpModelMorf->checkFrame(1)) { i_this->mSound.startCreatureSound(Z2SE_EN_HZE_V_ATK_A_START, 0, -1); } else if (i_this->mAnm == ANM_ATTACK_A) { i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_ATK_A_MOVE, 0, -1); } else if (i_this->mAnm == ANM_ATTACK_C && i_this->mpModelMorf->checkFrame(36)) { i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_ATK_C_THROW, -1); } else if (i_this->mAnm == ANM_DAMAGE_UP && i_this->mpModelMorf->checkFrame(1)) { i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_REBIRTH, -1); } else if ((i_this->mAnm == ANM_ATTACKC_A || i_this->mAnm == ANM_ATTACKC_B) && i_this->mpModelMorf->checkFrame(26)) { i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_ATK_C_RETURN, -1); } } /* 806F5928-806F592C 000008 0004+00 2/2 0/0 0/0 .bss None */ static u8 l_initHIO; /* 806F5938-806F5944 000018 000C+00 3/3 0/0 0/0 .bss l_HIO */ static daE_HZELDA_HIO_c l_HIO; /* 806F3590-806F474C 002930 11BC+00 2/1 0/0 0/0 .text daE_HZELDA_Execute__FP14e_hzelda_class */ static int daE_HZELDA_Execute(e_hzelda_class* i_this) { fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; cXyz sp114; cXyz sp108; cXyz spFC; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); if (i_this->mDemoMode == 0 && !player->checkElecDamage() && dComIfGp_event_runCheck()) { return 1; } if (i_this->mMsgSetTimer != 0) { i_this->mMsgSetTimer--; if (i_this->mMsgSetTimer == 0) { fopMsgM_messageSetDemo(0x490); } } i_this->mCounter++; for (int i = 0; i < 4; i++) { if (i_this->mTimers[i] != 0) { i_this->mTimers[i]--; } } if (i_this->field_0x6b4 != 0) { i_this->field_0x6b4--; } action(i_this); demo_camera(i_this); a_this->current.pos.y -= 30.0f; a_this->old.pos.y -= 30.0f; i_this->mAcch.CrrPos(dComIfG_Bgsp()); a_this->current.pos.y += 30.0f; a_this->old.pos.y += 30.0f; mDoMtx_stack_c::transS(a_this->current.pos.x, a_this->current.pos.y, a_this->current.pos.z); mDoMtx_stack_c::YrotM(a_this->shape_angle.y); mDoMtx_stack_c::XrotM(a_this->shape_angle.x); mDoMtx_stack_c::ZrotM(a_this->shape_angle.z); f32 model_scale = l_HIO.mModelSize * a_this->scale.x; mDoMtx_stack_c::scaleM(model_scale, model_scale, model_scale); J3DModel* model = i_this->mpModelMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); i_this->mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this))); i_this->mpModelMorf->modelCalc(); anm_se_set(i_this); MTXCopy(model->getAnmMtx(JNT_HEAD), *calc_mtx); sp114.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp114, &a_this->eyePos); a_this->attention_info.position = a_this->eyePos; a_this->attention_info.position.y += 80.0f; cXyz spF0(0.0f, 0.0f, 0.0f); if (i_this->field_0x6b4 != 0) { spF0.set(-200000.0f, 100000.0f, 20000.0f); } i_this->mSphCc[0].SetC(a_this->eyePos + spF0); i_this->mSphCc[0].SetR(25.0f); dComIfG_Ccsp()->Set(&i_this->mSphCc[0]); MTXCopy(model->getAnmMtx(JNT_WAIST), *calc_mtx); sp114.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp114, &sp108); i_this->mSphCc[1].SetC(sp108 + spF0); i_this->mSphCc[1].SetR(30.0f); dComIfG_Ccsp()->Set(&i_this->mSphCc[1]); MTXCopy(model->getAnmMtx(JNT_LEG_L2), *calc_mtx); sp114.set(0.0f, 0.0f, 0.0f); MtxPosition(&sp114, &sp108); i_this->mSphCc[2].SetC(sp108 + spF0); i_this->mSphCc[2].SetR(35.0f); dComIfG_Ccsp()->Set(&i_this->mSphCc[2]); if (i_this->mpSwordModel != NULL) { MTXCopy(model->getAnmMtx(JNT_HAND_R), *calc_mtx); i_this->mpSwordModel->setBaseTRMtx(*calc_mtx); if (i_this->field_0x6b8 != 0) { sp114.set(20.0f, 0.0f, -40.0f); MtxPosition(&sp114, &sp108); i_this->mSphAt.SetC(sp108); i_this->mSphAt.SetR(30.0f); dComIfG_Ccsp()->Set(&i_this->mSphAt); i_this->field_0x6b8 = 0; } } i_this->field_0x958.Move(); i_this->field_0xd3c.Move(); i_this->field_0x127c.Move(); BOOL on_player_at_sph = FALSE; if (daPy_py_c::checkMasterSwordEquip()) { if (daPy_getPlayerActorClass()->getCutType() != daPy_py_c::CUT_TYPE_NONE) { i_this->mSwordAtTimer++; if (i_this->mSwordAtTimer < 6) { on_player_at_sph = TRUE; } } else { i_this->mSwordAtTimer = 0; } } if (daPy_getPlayerActorClass()->checkEmptyBottleSwing()) { i_this->mBottleSwingAtTimer++; if (i_this->mBottleSwingAtTimer < 10) { on_player_at_sph = TRUE; } } else { i_this->mBottleSwingAtTimer = 0; } if (on_player_at_sph) { daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); cMtx_YrotS(*calc_mtx, player->shape_angle.y); sp114.x = 0.0f; sp114.y = 110.0f; sp114.z = 40.0f; MtxPosition(&sp114, &sp108); sp108 += player->current.pos; i_this->mPlAtSph.SetC(sp108); i_this->mPlAtSph.SetR(80.0f); dComIfG_Ccsp()->Set(&i_this->mPlAtSph); } if (i_this->field_0x6e4 > 0) { i_this->mBallSound.startLevelSound(Z2SE_EN_HZE_ATK_C_BALL, 0, -1); if (i_this->field_0x6e4 == 1) { MTXCopy(model->getAnmMtx(JNT_HAND_R), *calc_mtx); i_this->mpSwordModel->setBaseTRMtx(*calc_mtx); sp114.set(20.0f, 0.0f, -80.0f); MtxPosition(&sp114, &i_this->mBallPos); cLib_addCalc2(&i_this->field_0x6e8, 1.0f, 1.0f, 0.02f); } else { i_this->mOldBallPos = i_this->mBallPos; i_this->mBallPos += i_this->mBallMove; cXyz spE4(i_this->mBallPos); BOOL sp64 = 0; if (i_this->field_0x6e4 == 2) { if (i_this->mBallSphAt.ChkAtShieldHit() || i_this->mBallSphAt.ChkAtHit()) { if (i_this->mBallSphAt.ChkAtHit()) { cCcD_Obj* hitobj = i_this->mBallSphAt.GetAtHitObj(); fopAc_ac_c* hit_actor = dCc_GetAc(hitobj->GetAc()); if (fopAcM_GetName(hit_actor) == PROC_ALINK) { if (!daPy_getPlayerActorClass()->checkPlayerGuard()) { i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_LAUGH, -1); sp64 = 1; } else { sp114 = a_this->current.pos - i_this->mBallPos; sp114.y += 140.0f; s16 spE = 0; s16 spC = 0; i_this->field_0x6e4 = 4; cMtx_YrotS(*calc_mtx, (s16)cM_atan2s(sp114.x, sp114.z)); sp114.x = 0.0f; sp114.y = 0.0f; sp114.z = i_this->mBallMoveStep; MtxPosition(&sp114, &i_this->mBallMove); i_this->mBallMove.y = -10.0f; i_this->field_0x6ba = 0; i_this->mSound.startCreatureSound(Z2SE_EN_HZE_ATK_C_BALL_RETURN, 0, -1); dComIfGp_getVibration().StartShock(VIBMODE_S_POWER3, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); ball_crash_eff_set(i_this, 0.4f); dScnPly_c::setPauseTimer(2); spE4.y += 10000.0f; i_this->mTimers[2] = 80; } } } } else if (i_this->mBallTgSph.ChkTgHit()) { sp114 = a_this->current.pos - i_this->mBallPos; sp114.y += 140.0f; s16 spA = 0; s16 sp8 = 0; if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_GUARD_ATTACK) { if (cM_rndF(1.0f) < 0.5f) { sp8 = 0xA00; } else { sp8 = -0xA00; } if (cM_rndF(1.0f) < 0.5f) { spA = 0xA00; } else { spA = -0xA00; } i_this->field_0x6e4 = 4; } else { i_this->mMissedBallCount = 0; i_this->field_0x6e4 = 3; } cMtx_YrotS(*calc_mtx, (sp8 + cM_atan2s(sp114.x, sp114.z))); cMtx_XrotM(*calc_mtx, (spA - cM_atan2s(sp114.y, JMAFastSqrt((sp114.x * sp114.x) + (sp114.z * sp114.z))))); sp114.x = 0.0f; sp114.y = 0.0f; sp114.z = i_this->mBallMoveStep; MtxPosition(&sp114, &i_this->mBallMove); i_this->field_0x6ba = 0; i_this->mSound.startCreatureSound(Z2SE_EN_HZE_ATK_C_BALL_RETURN, 0, -1); dComIfGp_getVibration().StartShock(3, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); ball_crash_eff_set(i_this, 0.4f); dScnPly_c::setPauseTimer(2); spE4.y += 10000.0f; i_this->mTimers[2] = 0x50; } } else if (i_this->field_0x6e4 >= 3) { spE4.y += 10000.0f; daPy_py_c* sp58 = (daPy_py_c*)dComIfGp_getPlayer(0); if (i_this->mTimers[2] == 0 || sp58->checkElecDamage()) { sp64 = 1; } } if (sp64 || ball_bg_check(i_this)) { i_this->field_0x6e4 = -1; i_this->mSound.startCreatureSound(Z2SE_EN_HZE_ATK_C_BALL_HIT, 0, -1); spE4.y += 10000.0f; } i_this->mBallTgSph.SetC(spE4); i_this->mBallSphAt.MoveCAt(spE4); dComIfG_Ccsp()->Set(&i_this->mBallTgSph); dComIfG_Ccsp()->Set(&i_this->mBallSphAt); } for (int i = 0; i < 3; i++) { static u16 b_id[] = {0x8918, 0x8919, 0x891A}; i_this->field_0x141c[i] = dComIfGp_particle_set(i_this->field_0x141c[i], b_id[i], &i_this->mBallPos, NULL, NULL); } } else if (i_this->field_0x6e4 < 0) { for (int i = 0; i < 3; i++) { JPABaseEmitter* emitterp = dComIfGp_particle_getEmitter(i_this->field_0x141c[i]); if (emitterp != NULL) { emitterp->deleteAllParticle(); dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0x141c[i]); } } ball_crash_eff_set(i_this, 1.0f); i_this->field_0x6e4 = 0; } if (i_this->mDrawTriangleAt) { mDoMtx_stack_c::transS(i_this->mTrianglePos.x, i_this->mTrianglePos.y, i_this->mTrianglePos.z); mDoMtx_stack_c::YrotM(i_this->mTriangleRotY + 0x8000); f32 size = i_this->mTriangleSize; mDoMtx_stack_c::scaleM(size, size, size); i_this->mpTriangleAtModel->setBaseTRMtx(mDoMtx_stack_c::get()); i_this->mpTriangleAtBrk->setFrame(i_this->mTriangleAnmFrame); i_this->mpTriangleAtBtk->setFrame(i_this->mTriangleAnmFrame); if (i_this->mTriangleAnmFrame < 210) { if (i_this->mTriangleAnmFrame < 100) { i_this->mTriangleAnmFrame += 2; if (i_this->mTriangleAnmFrame == 2) { Z2GetAudioMgr()->seStart(Z2SE_EN_HZE_ATK_B_LIGHT, &i_this->mTrianglePos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } if (i_this->mTriangleAnmFrame == 100) { Z2GetAudioMgr()->seStart(Z2SE_EN_HZE_ATK_B_LIGHTWALL, &i_this->mTrianglePos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_ATK_B_LIGHTWALL, -1); csXyz particle_rot(0, i_this->mTriangleRotY + 0x8000, 0); cXyz particle_size(size, size, size); for (int i = 0; i < 5; i++) { static u16 b_id[] = {0x8945, 0x8946, 0x8947, 0x8948, 0x8949}; dComIfGp_particle_set(b_id[i], &i_this->mTrianglePos, &particle_rot, &particle_size); } } } else { i_this->mTriangleAnmFrame++; } } if (i_this->mTriangleAnmFrame > 105 && i_this->mTriangleAnmFrame < 135) { daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); sp108.x = player->current.pos.x - i_this->mTrianglePos.x; sp108.y = 0.0f; sp108.z = player->current.pos.z - i_this->mTrianglePos.z; cMtx_YrotS(*calc_mtx, -i_this->mTriangleRotY); MtxPosition(&sp108, &sp114); f32 var_f31 = fabsf(57.295f * cM_atan2f(sp114.x, sp114.z)); if (var_f31 >= 60.0f && var_f31 <= 120.0f) { var_f31 = 120.0f - var_f31; } else if (var_f31 >= 120.0f && var_f31 <= 180.0f) { var_f31 -= 120.0f; } f32 temp_f28 = 1.0f / cM_fcos(M_PI * (var_f31 / 180.0f)); if (JMAFastSqrt((sp114.x * sp114.x) + (sp114.z * sp114.z)) < temp_f28 * (50.0f * i_this->mTriangleSize)) { i_this->mTriAtSph.SetC(player->current.pos); i_this->mTriAtSph.SetR(5.0f); dComIfG_Ccsp()->Set(&i_this->mTriAtSph); i_this->mSound.startCreatureVoice(Z2SE_EN_HZE_V_LAUGH, -1); } } } if (i_this->field_0x68c != 0) { cLib_addCalc2(&i_this->mSwordColorIntensity, 1.0f, 1.0f, 0.025f); i_this->field_0x68c = 0; i_this->field_0x1418 = dComIfGp_particle_set(i_this->field_0x1418, 0x895F, &a_this->current.pos, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(i_this->field_0x1418); if (emitter != NULL) { emitter->setGlobalRTMatrix(i_this->mpSwordModel->getBaseTRMtx()); dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0x1418); } } else { cLib_addCalc0(&i_this->mSwordColorIntensity, 1.0f, 0.05f); } if (i_this->mAnm == ANM_DAMAGE || i_this->mAnm == ANM_LAST_DAMAGE || i_this->mAnm == ANM_DAMAGE_LOOP) { J3DModel* model = i_this->mpModelMorf->getModel(); for (int i = 0; i < 6; i++) { static u16 b_id[] = {0x891B, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920}; i_this->field_0x1428[i] = dComIfGp_particle_set(i_this->field_0x1428[i], b_id[i], &a_this->current.pos, NULL, NULL); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(i_this->field_0x1428[i]); if (emitter != NULL) { if (i <= 2) { emitter->setGlobalSRTMatrix(model->getAnmMtx(JNT_BACKBONE2)); } else { emitter->setGlobalSRTMatrix(model->getAnmMtx(JNT_WAIST)); } } } i_this->mSound.startCreatureSoundLevel(Z2SE_EN_HZE_DAMAGE, 0, -1); } i_this->mBallSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this))); return 1; } /* 806F474C-806F4754 003AEC 0008+00 1/0 0/0 0/0 .text daE_HZELDA_IsDelete__FP14e_hzelda_class */ static int daE_HZELDA_IsDelete(e_hzelda_class* i_this) { return 1; } /* 806F4754-806F47C4 003AF4 0070+00 1/0 0/0 0/0 .text daE_HZELDA_Delete__FP14e_hzelda_class */ static int daE_HZELDA_Delete(e_hzelda_class* i_this) { dComIfG_resDelete(&i_this->mPhase, "Hzelda"); if (i_this->mInitHIO) { l_initHIO = 0; } if (i_this->heap != NULL) { i_this->mpModelMorf->stopZelAnime(); i_this->mBallSound.deleteObject(); } return 1; } /* 806F47C4-806F4AD4 003B64 0310+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { e_hzelda_class* a_this = (e_hzelda_class*)i_this; a_this->mpModelMorf = new mDoExt_McaMorfSO(static_cast(dComIfG_getObjectRes("Hzelda", 0x1B)), NULL, NULL, static_cast(dComIfG_getObjectRes("Hzelda", 0x15)), J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, &a_this->mSound, 0x80000, 0x11000284); if (a_this->mpModelMorf == NULL || a_this->mpModelMorf->getModel() == NULL) { return 0; } J3DModel* model = a_this->mpModelMorf->getModel(); model->setUserArea((uintptr_t)a_this); for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) { model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); } J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Hzelda", 0x1C)); JUT_ASSERT(2129, modelData != NULL); a_this->mpSwordModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (a_this->mpSwordModel == NULL) { return 0; } modelData = static_cast(dComIfG_getObjectRes("Hzelda", 0x1A)); JUT_ASSERT(2149, modelData != NULL); a_this->mpTriangleAtModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000284); if (a_this->mpTriangleAtModel == NULL) { return 0; } a_this->mpTriangleAtBrk = new mDoExt_brkAnm(); if (a_this->mpTriangleAtBrk == NULL) { return 0; } if (a_this->mpTriangleAtBrk->init(modelData, static_cast(dComIfG_getObjectRes("Hzelda", 0x1F)), TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1) == FALSE) { return 0; } a_this->mpTriangleAtBtk = new mDoExt_btkAnm(); if (a_this->mpTriangleAtBtk == NULL) { return 0; } if (a_this->mpTriangleAtBtk->init(a_this->mpTriangleAtModel->getModelData(), static_cast(dComIfG_getObjectRes("Hzelda", 0x23)), TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1) == FALSE) { return 0; } a_this->mpTriangleAtBrk->setPlaySpeed(0.0f); a_this->mpTriangleAtBtk->setPlaySpeed(0.0f); return 1; } /* 806F4B1C-806F4E48 003EBC 032C+00 1/0 0/0 0/0 .text daE_HZELDA_Create__FP10fopAc_ac_c */ static int daE_HZELDA_Create(fopAc_ac_c* i_this) { e_hzelda_class* a_this = (e_hzelda_class*)i_this; fopAcM_ct(a_this, e_hzelda_class); int phase_state = dComIfG_resLoad(&a_this->mPhase, "Hzelda"); a_this->mPrm0 = fopAcM_GetParam(i_this); if (phase_state == cPhs_COMPLEATE_e) { OS_REPORT("E_HZELDA PARAM %x\n", fopAcM_GetParam(i_this)); int swbit = fopAcM_GetParam(i_this) >> 0x18; if (swbit != 0xFF) { if (dComIfGs_isSwitch(swbit, fopAcM_GetRoomNo(i_this))) { return cPhs_ERROR_e; } } if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x4B000)) { OS_REPORT("//////////////E_HZELDA SET NON !!\n"); return cPhs_ERROR_e; } if (l_initHIO == 0) { a_this->mInitHIO = 1; l_initHIO = 1; l_HIO.field_0x4 = -1; } fopAcM_SetMtx(i_this, a_this->mpModelMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(i_this, -200.0f, -200.0f, -200.0f); fopAcM_SetMax(i_this, 200.0f, 200.0f, 200.0f); a_this->mAcch.Set(fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this), i_this, 1, &a_this->mAcchCir, fopAcM_GetSpeed_p(i_this), NULL, NULL); a_this->mAcchCir.SetWall(50.0f, 70.0f); i_this->health = 3; i_this->field_0x560 = 3; a_this->field_0x958.Init(200, 0, i_this); for (int i = 0; i <= 2; i++) { static dCcD_SrcSph cc_sph_src = { { {0x0, {{0x0, 0x0, 0x0}, {0xd8fafdbf, 0x3}, 0x0}}, // mObj {dCcD_SE_NONE, 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 }; a_this->mSphCc[i].Set(cc_sph_src); a_this->mSphCc[i].SetStts(&a_this->field_0x958); } a_this->field_0xd3c.Init(255, 0, i_this); static dCcD_SrcSph at_sph_src = { { {0x0, {{AT_TYPE_CSTATUE_SWING, 0x2, 0xd}, {0xd8fafdbf, 0x3}, 0x0}}, // mObj {dCcD_SE_METAL, 0x0, 0xb, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 35.0f} // mSph } // mSphAttr }; a_this->mSphAt.Set(at_sph_src); a_this->mSphAt.SetStts(&a_this->field_0xd3c); a_this->mSphAt.OnTgShield(); a_this->mSphAt.SetTgHitMark(CcG_Tg_UNK_MARK_2); static dCcD_SrcSph ball_at_sph_src = { { {0x0, {{AT_TYPE_CSTATUE_SWING, 0x4, 0xd}, {0x0, 0x0}, 0x0}}, // mObj {dCcD_SE_13, 0x1, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 15.0f} // mSph } // mSphAttr }; a_this->mBallSphAt.Set(ball_at_sph_src); a_this->mBallSphAt.SetStts(&a_this->field_0xd3c); a_this->mBallSphAt.SetAtMtrl(dCcD_MTRL_ELECTRIC); static dCcD_SrcSph ball_tg_sph_src = { { {0x0, {{0x0, 0x0, 0x0}, {0x4000000, 0x3}, 0x0}}, // mObj {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 35.0f} // mSph } // mSphAttr }; a_this->mBallTgSph.Set(ball_tg_sph_src); a_this->mBallTgSph.SetStts(&a_this->field_0x958); a_this->mBallTgSph.OnTgNoHitMark(); static dCcD_SrcSph tri_at_sph_src = { { {0x0, {{AT_TYPE_CSTATUE_SWING, 0x4, 0xd}, {0x0, 0x0}, 0x0}}, // mObj {dCcD_SE_13, 0x0, 0xe, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 10.0f} // mSph } // mSphAttr }; a_this->mTriAtSph.Set(tri_at_sph_src); a_this->mTriAtSph.SetStts(&a_this->field_0x958); a_this->field_0x127c.Init(0xFF, 0, dComIfGp_getPlayer(0)); static dCcD_SrcSph pl_at_sph_src = { { {0x0, {{AT_TYPE_MASTER_SWORD, 0x2, 0x3}, {0x0, 0x0}, 0x0}}, // 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}, 35.0f} // mSph } // mSphAttr }; a_this->mPlAtSph.Set(pl_at_sph_src); a_this->mPlAtSph.SetStts(&a_this->field_0x127c); a_this->mSound.init(&i_this->current.pos, &i_this->eyePos, 3, 1); a_this->mAtInfo.mpSound = &a_this->mSound; a_this->mAction = ACTION_WAIT; a_this->mMode = -1; i_this->attention_info.distances[fopAc_attn_BATTLE_e] = 22; a_this->mBallSound.init(&a_this->mBallPos, 1); if (!dComIfGs_isSaveDunSwitch(2)) { a_this->mMsgSetTimer = 30; dComIfGs_onSaveDunSwitch(2); } a_this->mMissedBallCount = 1; daE_HZELDA_Execute(a_this); } return phase_state; } /* 806F5854-806F5874 -00001 0020+00 1/0 0/0 0/0 .data l_daE_HZELDA_Method */ static actor_method_class l_daE_HZELDA_Method = { (process_method_func)daE_HZELDA_Create, (process_method_func)daE_HZELDA_Delete, (process_method_func)daE_HZELDA_Execute, (process_method_func)daE_HZELDA_IsDelete, (process_method_func)daE_HZELDA_Draw, }; /* 806F5874-806F58A4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_HZELDA */ extern actor_process_profile_definition g_profile_E_HZELDA = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_E_HZELDA, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(e_hzelda_class), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 142, // mPriority &l_daE_HZELDA_Method, // sub_method 0x00044000, // mStatus fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };