/** * d_a_player_hammer.inc * * Code relating to the Skull Hammer item. * * This file is not a standalone translation unit and is instead directly * included into d_a_player_main.cpp. * * The original name of this file is known because of an assert contained within * a function from this file. */ #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_player_main.h" #include "d/actor/d_a_player_HIO.h" extern JGeometry::TVec3 l_hammer_splash_particle_scale; /* 8015023C-80150324 .text setHammerModel__9daPy_lk_cFv */ void daPy_lk_c::setHammerModel() { J3DAnmTransform* bck = getItemAnimeResource(dRes_INDEX_LKANM_BCK_HAMMERDAM_e); JKRHeap* oldHeap = setItemHeap(); J3DModelData* tmp_modelData = initModel(&mpEquipItemModel, dRes_INDEX_LINK_BDL_HAMMER_e, 0x37221222); int ret = mSwordAnim.init(tmp_modelData, bck, false, J3DFrameCtrl::EMode_LOOP); if (!ret) { JUT_ASSERT(32, FALSE); } mSwBlur.mpPosBuffer = new (0x20) Vec[2 * 0x300]; mDoExt_setCurrentHeap(oldHeap); m35EC = 0.0f; } /* 80150324-801508FC .text setHammerQuake__9daPy_lk_cFP13cBgS_PolyInfoPC4cXyzi */ void daPy_lk_c::setHammerQuake(cBgS_PolyInfo* param_1, const cXyz* param_2, int param_3) { static JGeometry::TVec3 smoke_kusa_particle_scale(2.0f, 2.0f, 2.0f); static JGeometry::TVec3 emitter_scale(1.0f, 0.1f, 1.0f); static JGeometry::TVec3 emitter_trans(0.0f, 10.0f, 0.0f); float local_54; BOOL bVar2; int attrib_code; u32 iVar6; JPABaseEmitter* emitter; f32 dVar9; int iStack_58; cXyz local_2c; cXyz local_38; dComIfGp_getVibration().StartShock(6, -0x31, cXyz(0.0f, 1.0f, 0.0f)); onResetFlg0(daPyRFlg0_HAMMER_QUAKE); if (!checkNoResetFlg0(daPyFlg0_UNK10000000)) { if (param_3 == -1) { local_2c.set(mSwordTopPos.x, mSwordTopPos.y + 100.0f, mSwordTopPos.z); mGndChk.SetPos(&local_2c); dVar9 = dComIfG_Bgsp()->GroundCross(&mGndChk); if (-G_CM3D_F_INF != dVar9) { iVar6 = dComIfG_Bgsp()->GetMtrlSndId(mGndChk); } else { iVar6 = mMtrlSndId; } } else { iVar6 = param_3; } mDoAud_seStart(JA_SE_LK_HAMMER_HIT, &mSwordTopPos, iVar6, mReverb); } if (param_1 != NULL && m355C == 0) { mDoMtx_stack_c::transS(param_2->x, param_2->y, param_2->z); mDoMtx_stack_c::ZXYrotM( getGroundAngle(param_1, shape_angle.y), shape_angle.y, getGroundAngle(param_1, shape_angle.y + -0x4000) ); mDoMtx_stack_c::transM(0.0f, 0.0f, -30.0f); mDoMtx_stack_c::multVecZero(&local_38); if (!fopAcM_getWaterY(&local_38, &local_54) || (local_54 < (5.0f + local_38.y))) { emitter = dComIfGp_particle_setP1(dPa_name::ID_IT_JN_HM_SENKO00, &local_38); if (emitter != NULL) { emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); } emitter = dComIfGp_particle_setP1(dPa_name::ID_IT_JN_HM_SENPU00, &local_38); if (emitter != NULL) { emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); } emitter = dComIfGp_particle_setP1(dPa_name::ID_IT_JN_HM_SYOGEKI00, &local_38); if (emitter != NULL) { emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); } bVar2 = false; } else { bVar2 = true; local_38.y = local_54; mDoMtx_stack_c::transS(local_38.x, local_54, local_38.z); mDoMtx_stack_c::YrotM(shape_angle.y); } if (bVar2) { attrib_code = dBgS_Attr_WATER_e; dComIfGp_particle_setP1(dPa_name::ID_IT_JN_HM_WP00, &local_38); dComIfGp_particle_setShipTail( dPa_name::ID_IT_JN_WP_HAMON01, &local_38, NULL, NULL, 0xFF, &dPa_control_c::mSingleRippleEcallBack ); } else { attrib_code = dComIfG_Bgsp()->GetAttributeCode(*param_1); } emitter = dComIfGp_particle_setSimpleLand(attrib_code, &local_38, NULL, 1.0f, 1.0f, 1.0f, &tevStr, &iStack_58, 0x1E); if (emitter != NULL) { emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); if (attrib_code == dBgS_Attr_WATER_e || attrib_code == dBgS_Attr_GRASS_e) { emitter->setRate(60.0f); emitter->setSpread(1.0f); if (attrib_code == dBgS_Attr_WATER_e) { emitter->setDirectionalSpeed(10.0f); emitter->setGlobalParticleScale(l_hammer_splash_particle_scale); } else { emitter->setDirectionalSpeed(40.0f); emitter->setGlobalParticleScale(smoke_kusa_particle_scale); } } else { emitter->setRate(45.0f); emitter->setSpread(0.0f); emitter->setLifeTime(0x28); emitter->setEmitterScale(emitter_scale); emitter->setEmitterTranslation(emitter_trans); emitter->setAwayFromCenterSpeed(50.0f); emitter->setGlobalParticleScale(smoke_kusa_particle_scale); } } } m355C = 1; dKy_Sound_set(current.pos, 500, fopAcM_GetID(this), 10); } /* 801508FC-80150B60 .text setHammerWaterSplash__9daPy_lk_cFv */ void daPy_lk_c::setHammerWaterSplash() { f32 local_50; cXyz local_28; if (mCurProc != daPyProc_HAMMER_FRONT_SWING_e || (m35EC <= mFrameCtrlUnder[UNDER_MOVE0_e].getRate())) { return; } if (m355C == 0) { local_28 = m36C4 - mSwordTopPos; local_28.normalize(); local_28 = mSwordTopPos + (local_28 * 30.0f); if (fopAcM_getWaterY(&local_28, &local_50) && local_50 >= local_28.y + 5.0f) { local_28.y += 150.0f; mGndChk.SetPos(&local_28); if (!(local_50 < dComIfG_Bgsp()->GroundCross(&mGndChk) + 5.0f)) { local_28.y = local_50; dComIfGp_particle_setP1(dPa_name::ID_IT_JN_HM_WP00, &local_28); dComIfGp_particle_setShipTail( dPa_name::ID_IT_JN_WP_HAMON01, &local_28, NULL, NULL, 0xFF, &dPa_control_c::mSingleRippleEcallBack ); GXColor amb, dif; dKy_get_seacolor(&amb, &dif); JPABaseEmitter* emitter = dComIfGp_particle_setP1(dPa_name::ID_AK_JN_ELEMENTSHIBUKI00, &local_28, NULL, NULL, 0xFF, NULL, -1, &amb); if (emitter != NULL) { emitter->setRate(60.0f); emitter->setSpread(1.0f); emitter->setMaxFrame(1); emitter->setDirectionalSpeed(10.0f); emitter->setGlobalParticleScale(l_hammer_splash_particle_scale); } m355C = 1; } } } } /* 80150B60-80150C40 .text procHammerSideSwing_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerSideSwing_init() { commonProcInit(daPyProc_HAMMER_SIDE_SWING_e); setSingleMoveAnime( ANM_HAMSWINGA, m_HIO->mItem.mHam.m.field_0x8, m_HIO->mItem.mHam.m.field_0xC, m_HIO->mItem.mHam.m.field_0x0, m_HIO->mItem.mHam.m.field_0x14 ); current.angle.y = shape_angle.y; mNormalSpeed = 0.0f; voiceStart(1); mProcVar2.m34D4 = shape_angle.y; setBlurPosResource(dRes_INDEX_LKANM__HAMMERSIDE_POS_e); setAtParam(AT_TYPE_SKULL_HAMMER, 4, dCcG_At_Spl_UNK0, dCcG_SE_METAL, dCcG_AtHitMark_Nrm_e, CUT_TYPE_HAMMER_SIDESWING, 50.0f); mSwordAnim.changeBckOnly(getItemAnimeResource(dRes_INDEX_LKANM_BCK_HAMSWINGAA_e)); m35EC = m_HIO->mItem.mHam.m.field_0xC; return true; } /* 80150C40-80150DDC .text procHammerSideSwing__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerSideSwing() { m35EC = mFrameCtrlUnder[UNDER_MOVE0_e].getFrame(); if (mFrameCtrlUnder[UNDER_MOVE0_e].getRate() < 0.01f) { mNormalSpeed = 0.0f; mDirection = DIR_RIGHT; checkNextMode(0); return true; } if (mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() > m_HIO->mItem.mHam.m.field_0x10) { f32 dVar4 = mNormalSpeed; u8 orig_direction = mDirection; mNormalSpeed = 0.0f; mDirection = DIR_RIGHT; if (checkNextMode(1)) { return true; } mNormalSpeed = dVar4; mDirection = orig_direction; } if (changeCutReverseProc(ANM_CUTREL)) { setHammerQuake(NULL, NULL, -1); return true; } if (mpAttnActorLockOn != NULL) { setShapeAngleToAtnActor(); mProcVar2.m34D4 = shape_angle.y; } else { cLib_addCalcAngleS( &shape_angle.y, mProcVar2.m34D4, m_HIO->mTurn.m.field_0x4, m_HIO->mTurn.m.field_0x0, m_HIO->mTurn.m.field_0x2 ); } current.angle.y = shape_angle.y; if ((mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() >= m_HIO->mItem.mHam.m.field_0x18) && (mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() < m_HIO->mItem.mHam.m.field_0x1C)) { if (!checkNoResetFlg0(daPyFlg0_CUT_AT_FLG)) { onResetFlg0(daPyRFlg0_UNK1); seStartSwordCut(JA_SE_LK_HAMMER_SWING); } onResetFlg0(daPyRFlg0_UNK2); } return true; } /* 80150DDC-80150F08 .text procHammerFrontSwingReady_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwingReady_init() { commonProcInit(daPyProc_HAMMER_FRONT_SWING_READY_e); setSingleMoveAnime( ANM_HAMSWINGBPRE, m_HIO->mItem.mHam.m.field_0x20, m_HIO->mItem.mHam.m.field_0x24, m_HIO->mItem.mHam.m.field_0x2, m_HIO->mItem.mHam.m.field_0x28 ); current.angle.y = shape_angle.y; mNormalSpeed = 0.0f; if (checkAttentionLock() || mStickDistance <= 0.05f) { mProcVar2.m34D4 = shape_angle.y; } else { mProcVar2.m34D4 = m34E8; } setAtParam(AT_TYPE_SKULL_HAMMER, 4, dCcG_At_Spl_UNK0, dCcG_SE_METAL, dCcG_AtHitMark_Nrm_e, CUT_TYPE_HAMMER_FRONTSWING, 50.0f); voiceStart(7); mSwordAnim.changeBckOnly(getItemAnimeResource(dRes_INDEX_LKANM_BCK_HAMSWINGBPREA_e)); m35EC = m_HIO->mItem.mHam.m.field_0x24; m355C = 0; return true; } /* 80150F08-80150F98 .text procHammerFrontSwingReady__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwingReady() { m35EC = mFrameCtrlUnder[UNDER_MOVE0_e].getFrame(); if (mFrameCtrlUnder[UNDER_MOVE0_e].getRate() < 0.01f) { return procHammerFrontSwing_init(); } if (mpAttnActorLockOn != NULL) { setShapeAngleToAtnActor(); mProcVar2.m34D4 = shape_angle.y; } else { cLib_addCalcAngleS( &shape_angle.y, mProcVar2.m34D4, m_HIO->mTurn.m.field_0x4, m_HIO->mTurn.m.field_0x0, m_HIO->mTurn.m.field_0x2 ); } current.angle.y = shape_angle.y; return true; } /* 80150F98-801510DC .text procHammerFrontSwing_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwing_init() { commonProcInit(daPyProc_HAMMER_FRONT_SWING_e); setSingleMoveAnime( ANM_HAMSWINGBHIT, 4.0f * m_HIO->mItem.mHam.m.field_0x2C, m_HIO->mItem.mHam.m.field_0x30, m_HIO->mItem.mHam.m.field_0x4, 0.0f ); current.angle.y = shape_angle.y; mNormalSpeed = 0.0f; voiceStart(1); if (checkAttentionLock() || mStickDistance <= 0.05f) { mProcVar2.m34D4 = shape_angle.y; } else { mProcVar2.m34D4 = m34E8; } mProcVar2.m34D4 = shape_angle.y; setBlurPosResource(dRes_INDEX_LKANM__HAMMERFRONT_POS_e); mCutType = CUT_TYPE_HAMMER_FRONTSWING; offResetFlg0(daPyRFlg0_NOT_ATTACKING); onResetFlg0(daPy_RFLG0(daPyRFlg0_UNK1 | daPyRFlg0_UNK2)); mProcVar0.m34D0 = 0; mSwordAnim.changeBckOnly(getItemAnimeResource(dRes_INDEX_LKANM_BCK_HAMSWINGBHITA_e)); m35EC = m_HIO->mItem.mHam.m.field_0x30; return true; } /* 801510DC-801513D4 .text procHammerFrontSwing__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwing() { m35EC = mFrameCtrlUnder[UNDER_MOVE0_e].getFrame(); f32 f1 = mFrameCtrlUnder[UNDER_MOVE0_e].getRate(); if (f1 < 0.01f) { if (mProcVar0.m34D0 == 0) { return procHammerFrontSwingEnd_init(); } else { mProcVar0.m34D0--; } return true; } if (m35EC > f1 && changeCutReverseProc(ANM_CUTREL)) { if (mCurProc == daPyProc_HAMMER_FRONT_SWING_e) { cXyz sp08(mSwordTopPos.x, current.pos.y + 300.0f, mSwordTopPos.z); mGndChk.SetPos(&sp08); sp08.y = dComIfG_Bgsp()->GroundCross(&mGndChk); if (sp08.y > mSwordTopPos.y) { int r27; int r26; r26 = -1; for (r27 = 0; r27 < mSwBlur.field_0x014; r27++) { sp08.set(mSwBlur.field_0x034[r27].x, 300.0f + mSwBlur.field_0x034[r27].y, mSwBlur.field_0x034[r27].z); mGndChk.SetPos(&sp08); sp08.y = dComIfG_Bgsp()->GroundCross(&mGndChk); if (sp08.y != -G_CM3D_F_INF && mSwBlur.field_0x034[r27].y > sp08.y) { r26 = dComIfG_Bgsp()->GetMtrlSndId(mGndChk); break; } } f32 f4 = mFrameCtrlUnder[UNDER_MOVE0_e].getRate(); f32 f5 = (mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() - f4) - 0.1f * (r27 * f4); if (r27 != 0 && r27 < mSwBlur.field_0x014) { f32 f6 = mSwBlur.field_0x034[r27].y - mSwBlur.field_0x034[r27 - 1].y; if (std::abs(f6) > 1.0f) { f32 temp = (1.0f - (sp08.y - (&mSwBlur.field_0x034[0])[r27 - 1].y) / f6); f5 = f5 + 0.1f * (temp * f4); } } if (f5 < 0.0f) { f5 = 0.0f; } mFrameCtrlUnder[UNDER_MOVE0_e].setFrame(f5); mFrameCtrlUnder[UNDER_MOVE0_e].setRate(0.0f); m35EC = f5; mProcVar0.m34D0 = 10; setHammerQuake(&mGndChk, &sp08, r26); return true; } } else { setHammerQuake(NULL, NULL, -1); return true; } } if (mpAttnActorLockOn != NULL) { setShapeAngleToAtnActor(); mProcVar2.m34D4 = shape_angle.y; } else { cLib_addCalcAngleS( &shape_angle.y, mProcVar2.m34D4, m_HIO->mTurn.m.field_0x4, m_HIO->mTurn.m.field_0x0, m_HIO->mTurn.m.field_0x2 ); } current.angle.y = shape_angle.y; onResetFlg0(daPyRFlg0_UNK2); return true; } /* 801513D4-80151450 .text procHammerFrontSwingEnd_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwingEnd_init() { commonProcInit(daPyProc_HAMMER_FRONT_SWING_END_e); setSingleMoveAnime( ANM_HAMSWINGBEND, m_HIO->mItem.mHam.m.field_0x34, m_HIO->mItem.mHam.m.field_0x38, m_HIO->mItem.mHam.m.field_0x6, m_HIO->mItem.mHam.m.field_0x40 ); current.angle.y = shape_angle.y; mNormalSpeed = 0.0f; mCutType = CUT_TYPE_HAMMER_FRONTSWING; offResetFlg0(daPyRFlg0_NOT_ATTACKING); return true; } /* 80151450-801514B0 .text procHammerFrontSwingEnd__9daPy_lk_cFv */ BOOL daPy_lk_c::procHammerFrontSwingEnd() { if (mFrameCtrlUnder[UNDER_MOVE0_e].getRate() < 0.01f) { return checkNextMode(0); } else if (mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() > m_HIO->mItem.mHam.m.field_0x3C) { return checkNextMode(1); } else { return true; } }