/** * d_a_player_particle.inc * * Code relating to various particle effects. * * 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 not known, but a best guess was taken * based on the original names of the functions it contains. */ #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_player_main.h" #include "d/actor/d_a_player_main_data.h" #include "d/actor/d_a_player_HIO.h" #include "d/actor/d_a_sea.h" #include "d/actor/d_a_ship.h" #include "f_op/f_op_kankyo_mng.h" #include "m_Do/m_Do_lib.h" #include "SSystem/SComponent/c_math.h" #include "assets/l_sightDL__d_a_player_main.h" /* 8012901C-80129034 .text setup__24daPy_swimTailEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ void daPy_swimTailEcallBack_c::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* angle, s8) { mpEmitter = emitter; mbEnd = false; field_0x20 = angle; field_0x05 = false; } /* 80129034-801290D8 .text getMaxWaterY__24daPy_swimTailEcallBack_cFPQ29JGeometry8TVec3 */ void daPy_swimTailEcallBack_c::getMaxWaterY(JGeometry::TVec3* pos) { if (daSea_ChkArea(pos->x, pos->z)) { pos->y = daSea_calcWave(pos->x, pos->z) + 2.0f; if (mWaterFlatY > pos->y) { pos->y = mWaterFlatY + 2.0f; } } else if (mWaterFlatY != -G_CM3D_F_INF) { pos->y = mWaterFlatY + 2.0f; } else { pos->y = mWaterY; } } /* 801290D8-8012910C .text remove__24daPy_swimTailEcallBack_cFv */ void daPy_swimTailEcallBack_c::remove() { if (mpEmitter != NULL) { mpEmitter->setEmitterCallBackPtr(NULL); mpEmitter->becomeInvalidEmitter(); mpEmitter = NULL; } } /* 8012910C-80129310 .text execute__24daPy_swimTailEcallBack_cFP14JPABaseEmitter */ void daPy_swimTailEcallBack_c::execute(JPABaseEmitter* emitter) { static JGeometry::TVec3 right_dir(-1.0f, 0.0f, 0.0f); GXColor ambColor; GXColor difColor; dKy_get_seacolor(&ambColor, &difColor); emitter->setGlobalPrmColor(ambColor.r, ambColor.g, ambColor.b); if (mbEnd) { s16 sp8 = emitter->getGlobalAlpha(); cLib_chaseS(&sp8, 0, 0x14); emitter->setGlobalAlpha(sp8); if (sp8 == 0) { emitter->becomeInvalidEmitter(); emitter->setEmitterCallBackPtr(NULL); mpEmitter = NULL; return; } } if (field_0x20 != NULL) { emitter->setGlobalTranslation(mPos.x, mPos.y, mPos.z); JGeometry::TVec3 rot((s16)0, field_0x20->y, (s16)0); emitter->setGlobalRotation(rot); }else { JGeometry::TVec3 sp20; emitter->getGlobalTranslation(sp20); getMaxWaterY(&sp20); emitter->setGlobalTranslation(sp20); cLib_chaseF(&mSpeedRate, 0.0f, 0.08f); } emitter->setDirectionalSpeed(1.0f + 12.0f * mSpeedRate); if (field_0x05) { emitter->setDirection(right_dir); } for (JSULink* link = emitter->getParticleList()->getFirst(); link != NULL;) { JSULink* nextLink = link->getNext(); JPABaseParticle* particle = link->getObject(); JGeometry::TVec3 offsetPos; particle->getOffsetPosition(offsetPos); getMaxWaterY(&offsetPos); particle->setOffsetPosition(offsetPos); link = nextLink; } } /* 80129310-80129348 .text draw__24daPy_swimTailEcallBack_cFP14JPABaseEmitter */ void daPy_swimTailEcallBack_c::draw(JPABaseEmitter*) { if (dPa_control_c::isStatus(0x01)) { GXSetZMode(GX_FALSE, GX_NEVER, GX_FALSE); } } /* 80129348-8012952C .text draw__18daPy_sightPacket_cFv */ void daPy_sightPacket_c::draw() { #if VERSION > VERSION_JPN j3dSys.reinitGX(); GXSetNumIndStages(0); #endif GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_U8, 0); GXTexObj texObj; GXColor color; if (mLockFlag) { GXInitTexObj(&texObj, mpLockTex, mpImg->width, mpImg->height, (GXTexFmt)mpImg->format, (GXTexWrapMode)mpImg->wrapS, (GXTexWrapMode)mpImg->wrapT, (mpImg->mipmapCount > 1) ? GX_TRUE : GX_FALSE); color.r = 0xFF; color.g = 0xFF; color.b = 0x32; color.a = mLockAlpha; GXSetTevColor(GX_TEVREG0, color); GXSetTevColor(GX_TEVREG1, color); } else { GXInitTexObj(&texObj, mpSightTex, 0x80, 0x80, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); color.r = 0xFF; color.g = 0x00; color.b = 0x00; color.a = 0xFF; GXSetTevColor(GX_TEVREG0, color); GXSetTevColor(GX_TEVREG1, color); } GXInitTexObjLOD(&texObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1); GXLoadTexObj(&texObj, GX_TEXMAP0); GXLoadPosMtxImm(mMtx, GX_PNMTX0); GXSetCurrentMtx(GX_PNMTX0); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXCallDisplayList(&l_sightDL, sizeof(l_sightDL) - 0x09); #if VERSION > VERSION_JPN J3DShape::resetVcdVatCache(); #endif } /* 8012952C-801296FC .text setSight__18daPy_sightPacket_cFv */ void daPy_sightPacket_c::setSight() { cXyz proj; mDoLib_project(&mPos, &proj); mDoMtx_stack_c::transS(proj); if (mLockFlag) { f32 var_f2; f32 var_f31; if (mFrame < 13) { var_f2 = 1.0f - ((s16)mFrame / 13.0f); var_f31 = -var_f2; } else { var_f2 = (mFrame - 13) / 13.0f; var_f31 = var_f2; } mLockAlpha = 150.0f + (30.0f * var_f2); f32 temp_f3 = 0.65f + (0.35f * var_f2); mDoMtx_stack_c::scaleM(temp_f3 * mpImg->width, temp_f3 * mpImg->height, temp_f3); mDoMtx_stack_c::ZrotM(0x8000 * cM_ssin(0x4000 * var_f31)); } else { mDoMtx_stack_c::scaleM(10.0f, 10.0f, 10.0f); } mDoMtx_copy(mDoMtx_stack_c::get(), mMtx); dComIfGd_set2DXlu(this); } /* 801296FC-801297F4 .text initSwBlur__13daPy_swBlur_cFPA4_fifi */ void daPy_swBlur_c::initSwBlur(MtxP mtx, int idx, f32 blurTopRate, int blurColorType) { int i = idx * 2; mBlurTopRate = blurTopRate; mBlurColorType = blurColorType; mDoMtx_multVec(mtx, mpPosBuffer + i + 0, &field_0x034[0]); mDoMtx_multVec(mtx, mpPosBuffer + i + 1, &field_0x304[0]); field_0x034[0] += (field_0x034[0] - field_0x304[0]) * mBlurTopRate; field_0x034[1] = field_0x034[0]; field_0x304[1] = field_0x304[0]; field_0x014 = 0; field_0x018 = idx; field_0x028.set(mtx[0][3], mtx[1][3], mtx[2][3]); } /* 801297F4-80129A78 .text copySwBlur__13daPy_swBlur_cFPA4_fi */ void daPy_swBlur_c::copySwBlur(MtxP mtx, int param_2) { int var_r31 = param_2 - field_0x018; field_0x018 = param_2; int var_r30; if (var_r31 > 0) { var_r30 = -2; if (var_r31 > 60) { var_r31 = 60; } } else if (var_r31 < 0) { var_r30 = 2; if (var_r31 < -60) { var_r31 = 60; } else { var_r31 = -var_r31; } } else { var_r31 = 10; var_r30 = 0; } for (int i = 59 - var_r31; i >= 0; i--) { field_0x034[i + var_r31] = field_0x034[i]; field_0x304[i + var_r31] = field_0x304[i]; } // Probably fakematch f32 var_f31 = 0.0f; f32 frac = 1.0f / var_r31; int i; int buffIdx = field_0x018 * 2; cXyz sp50(mtx[0][3], mtx[1][3], mtx[2][3]); cXyz sp38 = field_0x028 - sp50; field_0x028 = sp50; for (i = 0; i < var_r31 && buffIdx >= 0; i++) { mDoMtx_multVec(mtx, mpPosBuffer + buffIdx + 0, &field_0x034[i]); mDoMtx_multVec(mtx, mpPosBuffer + buffIdx + 1, &field_0x304[i]); field_0x034[i] += (field_0x034[i] - field_0x304[i]) * mBlurTopRate; field_0x034[i] += sp38 * var_f31; field_0x304[i] += sp38 * var_f31; var_f31 += frac; buffIdx += var_r30; } field_0x014 += var_r31; if (field_0x014 >= 59) { field_0x014 = 58; } } /* 80129A78-80129DD0 .text draw__13daPy_swBlur_cFv */ void daPy_swBlur_c::draw() { #if VERSION > VERSION_JPN j3dSys.reinitGX(); GXSetNumIndStages(0); #endif static GXTexObj texObj; u16 texWidth = 16; u16 texHeight = 4; GXTexFmt texFormat = GX_TF_I4; GXInitTexObj(&texObj, (u8*)mpTex + mpTex->imageOffset, texWidth, texHeight, texFormat, GX_CLAMP, GX_CLAMP, GX_FALSE); GXInitTexObjLOD(&texObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1); GXLoadTexObj(&texObj, GX_TEXMAP0); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXSetNumChans(0); if (mBlurColorType == NORMAL_SLASH_BLUR) { // Normal color. static GXColor n_color0 = {0xFF, 0xFF, 0xFF, 0x96}; GXSetTevColor(GX_TEVREG0, n_color0); } else if (mBlurColorType == ELIXIR_SOUP_SLASH_BLUR) { // Elixir Soup color. static GXColor y_color0 = {0xFF, 0xFF, 0x7B, 0x96}; GXSetTevColor(GX_TEVREG0, y_color0); } else { // Parrying color. static GXColor g_color0 = {0x5A, 0xFF, 0x5A, 0x96}; GXSetTevColor(GX_TEVREG0, g_color0); } GXSetNumTexGens(1); GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); GXSetNumTevStages(1); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXLoadPosMtxImm(j3dSys.getViewMtx(), GX_PNMTX0); GXSetCurrentMtx(GX_PNMTX0); GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); GXSetCullMode(GX_CULL_NONE); GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); int r30 = 0xFF / ((field_0x014 >> 1) + 1); s16 r29 = r30; s16 r28 = 0x00; GXBegin(GX_QUADS, GX_VTXFMT0, 4 + field_0x014*4); for (int i = field_0x014; i >= 0; i--) { GXPosition3f32(field_0x034[i+0].x, field_0x034[i+0].y, field_0x034[i+0].z); GXTexCoord2s16(r29, 0x00); GXPosition3f32(field_0x304[i+0].x, field_0x304[i+0].y, field_0x304[i+0].z); GXTexCoord2s16(r29, 0xFF); GXPosition3f32(field_0x304[i+1].x, field_0x304[i+1].y, field_0x304[i+1].z); GXTexCoord2s16(r28, 0xFF); GXPosition3f32(field_0x034[i+1].x, field_0x034[i+1].y, field_0x034[i+1].z); GXTexCoord2s16(r28, 0x00); r28 = r29; r29 += r30; } GXEnd(); #if VERSION > VERSION_JPN J3DShape::resetVcdVatCache(); #endif } /* 80129DD0-80129E9C .text execute__24daPy_fanSwingEcallBack_cFP14JPABaseEmitter */ void daPy_fanSwingEcallBack_c::execute(JPABaseEmitter* emitter) { if (emitter->isEnableDeleteEmitter()) { emitter->quitImmortalEmitter(); emitter->setEmitterCallBackPtr(NULL); mpEmitter = NULL; } else if (mAlphaOutFlg != FALSE) { s16 alpha = emitter->getGlobalAlpha(); cLib_chaseS(&alpha, 0, 50); emitter->setGlobalAlpha(alpha); if (alpha == 0) { emitter->quitImmortalEmitter(); emitter->setEmitterCallBackPtr(NULL); mpEmitter = NULL; } } } /* 80129E9C-80129F48 .text execute__25daPy_waterDropPcallBack_cFP14JPABaseEmitterP15JPABaseParticle */ void daPy_waterDropPcallBack_c::execute(JPABaseEmitter* emitter, JPABaseParticle* ptcl) { if (mbWaterMark) { JGeometry::TVec3 ptclPos; ptcl->getGlobalPosition(ptclPos); cXyz pos(ptclPos.x, ptclPos.y + 25.0f, ptclPos.z); mGndChk.SetPos(&pos); pos.y = dComIfG_Bgsp()->GroundCross(&mGndChk); if (pos.y > ptclPos.y) { fopKyM_create(fpcNm_WATER_MARK_e, 1, &pos); } } } /* 80129F48-80129F98 .text execute__22daPy_followEcallBack_cFP14JPABaseEmitter */ void daPy_followEcallBack_c::execute(JPABaseEmitter* emitter) { emitter->setGlobalTranslation(mPos.x, mPos.y, mPos.z); JGeometry::TVec3 rot(mAngle.x, mAngle.y, mAngle.z); emitter->setGlobalRotation(rot); } /* 80129F98-80129FA0 .text setup__22daPy_followEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ void daPy_followEcallBack_c::setup(JPABaseEmitter* emitter, const cXyz*, const csXyz*, s8) { mpEmitter = emitter; } /* 80129FA0-80129FD4 .text end__22daPy_followEcallBack_cFv */ void daPy_followEcallBack_c::end() { if (mpEmitter) { mpEmitter->becomeInvalidEmitter(); mpEmitter->setEmitterCallBackPtr(NULL); mpEmitter = NULL; } } daPy_waterDropPcallBack_c daPy_waterDropEcallBack_c::m_pcallback; /* 80129FD4-8012A040 .text execute__25daPy_waterDropEcallBack_cFP14JPABaseEmitter */ void daPy_waterDropEcallBack_c::execute(JPABaseEmitter* emitter) { daPy_followEcallBack_c::execute(emitter); if (emitter->isEnableDeleteEmitter()) end(); } /* 8012A040-8012A058 .text setup__25daPy_waterDropEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ void daPy_waterDropEcallBack_c::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* angle, s8) { mpEmitter = emitter; mpEmitter->becomeImmortalEmitter(); } /* 8012A058-8012A0B4 .text end__25daPy_waterDropEcallBack_cFv */ void daPy_waterDropEcallBack_c::end() { if (mpEmitter != NULL) { mpEmitter->quitImmortalEmitter(); mpEmitter->deleteAllParticle(); mpEmitter->setParticleCallBackPtr(NULL); daPy_followEcallBack_c::end(); } } /* 8012A0B4-8012A0E0 .text makeEmitterColor__28daPy_mtxPosFollowEcallBack_cFUsPA4_fPC4cXyzPC5csXyzPC8_GXColorPC8_GXColor */ void daPy_mtxPosFollowEcallBack_c::makeEmitterColor(u16 particleID, MtxP mtx, const cXyz* pos, const csXyz* angle, const GXColor* prmColor, const GXColor* envColor) { mpAngle = angle; daPy_mtxFollowEcallBack_c::makeEmitterColor(particleID, mtx, pos, prmColor, envColor); } /* 8012A0E0-8012A160 .text execute__28daPy_mtxPosFollowEcallBack_cFP14JPABaseEmitter */ void daPy_mtxPosFollowEcallBack_c::execute(JPABaseEmitter* emitter) { mDoMtx_stack_c::transS(mpMtx[0][3], mpMtx[1][3], mpMtx[2][3]); if (mpAngle != NULL) { mDoMtx_stack_c::YrotM(mpAngle->y); } emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); } s16 daPy_dmEcallBack_c::m_timer = 0; u16 daPy_dmEcallBack_c::m_type = 3; /* 8012A160-8012A288 .text execute__18daPy_dmEcallBack_cFP14JPABaseEmitter */ void daPy_dmEcallBack_c::execute(JPABaseEmitter* emitter) { if (checkFlame()) { JGeometry::TVec3 pos; emitter->getGlobalTranslation(pos); emitter->setGlobalTranslation(mpMtx[0][3], mpMtx[1][3], mpMtx[2][3]); pos.x = (mpMtx[0][3] - pos.x) * -0.05f; pos.z = (mpMtx[2][3] - pos.z) * -0.05f; f32 f6 = 0.6f; f32 sq = pos.x * pos.x + pos.z * pos.z; if (sq > 1.0f) { f32 distFrac = 1.0f / std::sqrtf(sq); pos.x *= distFrac; pos.z *= distFrac; } emitter->setDirection(JGeometry::TVec3(pos.x, f6, pos.z)); } else { emitter->setGlobalRTMatrix(mpMtx); } } /* 8012A288-8012A8D8 .text setAuraEffect__9daPy_lk_cFv */ void daPy_lk_c::setAuraEffect() { static const u16 aura_emitter_joint[] = { CL_JNT_LARMB_JNT_e, CL_JNT_RARMB_JNT_e, CL_JNT_CL_LHANDA_e, CL_JNT_CL_RHANDA_e, CL_JNT_LLEGB_JNT_e, CL_JNT_RLEGB_JNT_e, CL_JNT_LFOOT_JNT_e, CL_JNT_RFOOT_JNT_e, CL_JNT_LINK_ROOT_e, CL_JNT_HEAD_JNT_e, }; static const u16 aura_model_joint[] = { CL_JNT_LINK_ROOT_e, CL_JNT_HEAD_JNT_e, CL_JNT_CL_LHANDA_e, CL_JNT_CL_RHANDA_e, CL_JNT_LLEGB_JNT_e, CL_JNT_RLEGB_JNT_e, }; J3DAnmTevRegKey* curYaura00Brk = mYaura00rBrk.getBrkAnm(); J3DAnmTevRegKey* curYmgcs00Brk = mYmgcs00Brk.getBrkAnm(); f32 yauraFrame = curYaura00Brk->getFrame(); f32 ymgcsFrame = curYmgcs00Brk->getFrame(); f32 y00BtkFrameMax = mpYaura00Btk->getFrameMax(); if (checkNoDamageMode()) { J3DAnmTevRegKey* pYaura00Brk; J3DAnmTevRegKey* pYmgcs00Brk; if (checkEquipDragonShield()) { if (!dComIfGp_event_runCheck()) { m3548 -= 1; } if (m3548 == 0) { if (dComIfGs_getMagic() != 0) { m3548 = m_HIO->mItem.mMagicShield.m.field_0x0; dComIfGp_setItemMagicCount(-1); } else { offNoResetFlg1(daPyFlg1_EQUIP_DRAGON_SHIELD); } } pYaura00Brk = static_cast(dComIfG_getObjectRes(l_arcName, dRes_INDEX_LINK_BRK_YAURA00_R_e)); pYmgcs00Brk = static_cast(dComIfG_getObjectRes(l_arcName, dRes_INDEX_LINK_BRK_YMGCS00_MS_e)); } else { if (!dComIfGp_event_runCheck()) { mTinkleShieldTimer -= 1; } pYaura00Brk = static_cast(dComIfG_getObjectRes(l_arcName, dRes_INDEX_LINK_BRK_YAURA00_G_e)); pYmgcs00Brk = static_cast(dComIfG_getObjectRes(l_arcName, dRes_INDEX_LINK_BRK_YMGCS00_TS_e)); } if (pYaura00Brk != curYaura00Brk) { mYaura00rBrk.init(mMagicArmorAuraEntries[0].getModel()->getModelData(), pYaura00Brk, FALSE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, true, 0); curYaura00Brk = pYaura00Brk; } if (pYmgcs00Brk != curYmgcs00Brk) { mYmgcs00Brk.init(mpYmgcs00Model->getModelData(), pYmgcs00Brk, FALSE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, true, 0); curYmgcs00Brk = pYmgcs00Brk; } } if (checkNoDamageMode() && (!dComIfGp_event_runCheck() || (eventInfo.checkCommandDoor() && !dComIfGp_event_chkEventFlag(dEvtFlag_TALK_e))) ) { if (yauraFrame < 0.01f) { for (int idx = 0; idx < (int)ARRAY_SIZE(mMagicArmorAuraEntries); idx++) { mMagicArmorAuraEntries[idx].setFrame(cM_rndF(y00BtkFrameMax)); } } yauraFrame += 1.0f; if (yauraFrame >= curYaura00Brk->getFrameMax()) { yauraFrame = curYaura00Brk->getFrameMax() - 0.001f; } ymgcsFrame += 1.0f; if (ymgcsFrame >= curYmgcs00Brk->getFrameMax()) { ymgcsFrame = curYmgcs00Brk->getFrameMax() - 0.001f; } seStartMapInfo(JA_SE_LK_MG_SHELD_USING); } else { yauraFrame -= 1.0f; if (yauraFrame < 0.0f) { yauraFrame = 0.0f; } ymgcsFrame -= 1.0f; if (ymgcsFrame < 0.0f) { ymgcsFrame = 0.0f; } } mYaura00rBrk.entryFrame(yauraFrame); mYmgcs00Brk.entryFrame(ymgcsFrame); if (yauraFrame > 0.0f) { f32 var_f28, var_f31; daPy_aura_c* auraEntry = mMagicArmorAuraEntries; if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && dComIfGp_getShipActor() != NULL) { var_f31 = 0.0f; var_f28 = 1.0f + (std::fabsf(dComIfGp_getShipActor()->speedF) / 15.0f); if (var_f28 > 1.5f) { var_f28 = 1.5f; } } else { var_f31 = std::fabsf(mNormalSpeed) / m_HIO->mMove.m.field_0x18; if (var_f31 > 1.0f) { var_f31 = 1.0f; } var_f28 = 1.0f; } cXyz localScale = scale * (var_f28 * cM_fcos(M_PI * (0.5f * var_f31))); for (int idx = 0; idx < (int)ARRAY_SIZE(mMagicArmorAuraEntries); idx++, auraEntry++) { f32 var_f0 = 1.0f + auraEntry->getFrame(); if (var_f0 >= y00BtkFrameMax) { var_f0 -= y00BtkFrameMax; } auraEntry->setFrame(var_f0); auraEntry->getModel()->setBaseTRMtx(mpCLModel->getAnmMtx(aura_model_joint[idx])); if (idx == 0) { auraEntry->getModel()->setBaseScale(scale * var_f31 * 1.2f); } else if (idx != 1) { auraEntry->getModel()->setBaseScale(localScale); } else { auraEntry->getModel()->setBaseScale((scale * (1.0f - (0.3f * var_f31))) * 2.0f); } } } if (checkNoDamageMode() || mYmgcs00Brk.getBrkAnm()->getFrame() > 0.0f) { mpYmgcs00Model->setBaseTRMtx(mpCLModel->getBaseTRMtx()); mpYmgcs00Model->calc(); simpleAnmPlay(mpYmgcs00Btk); } } /* 8012A8D8-8012B340 .text setWaterRipple__9daPy_lk_cFv */ void daPy_lk_c::setWaterRipple() { static Vec waterfall_ripple_scale = {0.75f, 0.75f, 0.75f}; static JGeometry::TVec3 normal_ripple_scale(1.0f, 1.0f, 1.0f); static JGeometry::TVec3 small_ripple_scale(0.4f, 0.4f, 0.4f); static const Vec wave_offset = {0.0f, 18.0f, 0.0f}; static const Vec swim_offset = {0.0f, 30.0f, 0.0f}; static const Vec swim_side_offset = {0.0f, 0.0f, 30.0f}; // Probably fakematch BOOL var_r3; if (mCurProc == daPyProc_DEMO_DEAD_e && dComIfGp_checkPlayerStatus0(0, daPyStts0_SWIM_e)) { var_r3 = TRUE; } else { var_r3 = FALSE; } // Probably fakematch (May use inlines?) if ((var_r3 && mProcVar3.m34D6 != 0) || ( mCurProc != daPyProc_VOMIT_WAIT_e && !var_r3 && (!checkModeFlg(ModeFlg_IN_SHIP | ModeFlg_HANG) || checkModeFlg(ModeFlg_SWIM)) && ( (checkNoResetFlg0(daPyFlg0_UNK80) && mWaterY > 5.0f + mCyl.GetC().y && mWaterY < mCyl.GetC().y + mCyl.GetH()) || (mCurrAttributeCode == dBgS_Attr_WATER_e && mAcch.ChkGroundHit()) ) ) ) { if (m3280.getEmitter() == NULL) { dComIfGp_particle_setShipTail(dPa_name::ID_AK_JN_HAMON00, ¤t.pos, NULL, NULL, 0xFF, &m3280); } f32 var_f1 = (0.1f * std::fabsf(getSpeedF())); var_f1 *= var_f1; if (var_f1 > 1.0f) { var_f1 = 1.0f; } m3280.setRate(var_f1); simpleAnmPlay(mpSuimenMunyaBtk); JPABaseEmitter* emitter = m3280.getEmitter(); if (emitter != NULL) { JGeometry::TVec3 ptcl_scale; emitter->getGlobalParticleScale(ptcl_scale); if ((ptcl_scale.x < 0.8f && checkNoResetFlg0(daPyFlg0_UNK80)) || (ptcl_scale.x > 0.8f && !checkNoResetFlg0(daPyFlg0_UNK80))) { m3280.remove(); emitter = dComIfGp_particle_setShipTail(dPa_name::ID_AK_JN_HAMON00, ¤t.pos, NULL, NULL, 0xFF, &m3280); } } if (emitter != NULL) { if (checkNoResetFlg0(daPyFlg0_UNK80)) { emitter->setGlobalScale(normal_ripple_scale); } else { emitter->setGlobalScale(small_ripple_scale); } } } else if (m3280.getEmitter() != NULL) { m3280.remove(); } if (checkModeFlg(ModeFlg_SWIM)) { if (!mSwimTailEcallBack[0].getEnd()) { mSwimTailEcallBack[0].setSpeedRate(std::fabsf(mNormalSpeed / mMaxNormalSpeed)); } if (!mSwimTailEcallBack[1].getEnd()) { mSwimTailEcallBack[1].setSpeedRate(std::fabsf(mNormalSpeed / mMaxNormalSpeed)); } cXyz local_1c; cMtx_multVec(mpCLModel->getAnmMtx(CL_JNT_HEAD_JNT_e), &wave_offset, &local_1c); local_1c.y = mWaterY; f32 cos = cM_scos(shape_angle.y) * 5.0f; f32 sin = cM_ssin(shape_angle.y) * 5.0f; cXyz local_20(local_1c.x + cos, local_1c.y, local_1c.z - sin); cXyz local_28(local_1c.x - cos, local_1c.y, local_1c.z + sin); mSwimTailEcallBack[0].setPos(local_20); mSwimTailEcallBack[0].setWaterY(mWaterY + 2.0f); mSwimTailEcallBack[0].setWaterFlatY(mAcch.m_wtr.GetHeight()); mSwimTailEcallBack[1].setPos(local_28); mSwimTailEcallBack[1].setWaterY(mWaterY + 2.0f); mSwimTailEcallBack[1].setWaterFlatY(mAcch.m_wtr.GetHeight()); cXyz local_40; cMtx_multVec(mpCLModel->getAnmMtx(CL_JNT_HEAD_JNT_e), &swim_offset, &local_40); MtxP suimenMunyaMtx = mpSuimenMunyaModel->getBaseTRMtx(); cXyz local_4c; mDoMtx_multVecZero(suimenMunyaMtx, &local_4c); local_40.y = mWaterY; local_4c -= local_40; cXyz local_50; local_50.z = (local_4c.absXZ() / mMaxNormalSpeed) * 0.5f + 1.0f; if (local_50.z > 1.5f) { local_50.z = 1.5f; } local_50.x = 1.0f; local_50.y = 1.0f; if (mCurProc == daPyProc_DEMO_DEAD_e) { mDoMtx_stack_c::transS(current.pos.x + cM_ssin(shape_angle.y) * 60.0f, local_40.y + 2.0f, current.pos.z + cM_scos(shape_angle.y) * 60.0f); } else { mDoMtx_stack_c::transS(local_40.x, local_40.y + 2.0f, local_40.z); } if (dPa_control_c::isStatus(0x01)) { MtxP head_jnt_mtx = mpCLModel->getAnmMtx(CL_JNT_HEAD_JNT_e); cXyz local_5c; mDoMtx_multVecZero(head_jnt_mtx, &local_5c); cXyz local_68; cMtx_multVec(head_jnt_mtx, &swim_side_offset, &local_68); cXyz local_74(local_5c.x * 2.0f - local_68.x, local_5c.y, local_5c.z * 2.0f - local_68.z); cXyz local_80(local_5c.x * 2.0f - local_40.x, local_5c.y, local_5c.z * 2.0f - local_40.z); if (daSea_ChkArea(local_68.x, local_68.z)) { local_68.y = daSea_calcWave(local_68.x, local_68.z); } if (daSea_ChkArea(local_74.x, local_74.z)) { local_74.y = daSea_calcWave(local_74.x, local_74.z); } if (daSea_ChkArea(local_80.x, local_80.z)) { local_80.y = daSea_calcWave(local_80.x, local_80.z); } cXyz local_b8 = local_40 - local_80; cXyz local_c4 = local_74 - local_68; mDoMtx_stack_c::ZXYrotM(cM_atan2s(-local_b8.y, local_b8.absXZ()), shape_angle.y, cM_atan2s(-local_c4.y, local_c4.absXZ())); } else { mDoMtx_stack_c::YrotM(shape_angle.y); } mpSuimenMunyaModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpSuimenMunyaModel->setBaseScale(local_50); } static JGeometry::TVec3 waterfall_splash_trans(0.0f, 15.0f, 0.0f); if (((mAcch.ChkGroundHit() || checkModeFlg(ModeFlg_SWIM)) && mCurrAttributeCode == dBgS_Attr_WATERFALL_e) || (checkModeFlg(ModeFlg_HANG) && m3588 == 0x17)) { if (m3400.getEmitter() == NULL) { m3400.makeEmitter(dPa_name::ID_AK_JN_ELEMENTSHIBUKI00, mpCLModel->getAnmMtx(CL_JNT_HEAD_JNT_e), ¤t.pos, NULL); JPABaseEmitter* emitter = m3400.getEmitter(); if (emitter != NULL) { emitter->setRate(4.0f); emitter->setSpread(1.0f); emitter->setEmitterTranslation(waterfall_splash_trans); } } if (m34CD == 0) { cXyz local_ac; mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_LINK_ROOT_e), &local_ac); dComIfGp_particle_setSingleRipple(dPa_name::ID_IT_JN_WP_HAMON03, &local_ac, NULL, (cXyz*)&waterfall_ripple_scale); m34CD = 15; dComIfGp_getVibration().StartQuake(4, 1, cXyz(0.0f, 1.0f, 0.0f)); } else { m34CD -= 1; if (m34CD == 5) { dComIfGp_getVibration().StopQuake(-1); } } } else { if (m3400.getEmitter() != NULL) { dComIfGp_getVibration().StopQuake(-1); } m3400.end(); } if (m3400.getEmitter() != NULL) { GXColor amb, dif; dKy_get_seacolor(&amb, &dif); m3400.getEmitter()->setGlobalPrmColor(amb.r, amb.g, amb.b); } } /* 8012B340-8012B8EC .text setFootEffectType__9daPy_lk_cFiP4cXyzii */ void daPy_lk_c::setFootEffectType(int effectID, cXyz* i_pos, int param_2, int param_3) { static JGeometry::TVec3 run_splash_scale(0.6f, 0.6f, 0.6f); static Vec grass_scale = {1.5f, 1.5f, 1.5f}; static JGeometry::TVec3 run_grass_scale(0.65f, 0.65f, 0.65f); static Vec smoke_scale = {1.25f, 1.25f, 1.25f}; static JGeometry::TVec3 heavy_emit_smoke_scale(1.0f, 0.0f, 1.0f); static JGeometry::TVec3 heavy_dyn_smoke_scale(0.25f, 0.25f, 0.25f); static JGeometry::TVec3 heavy_pat_smoke_scale(0.75f, 0.75f, 0.75f); JPABaseEmitter* emitter = NULL; csXyz angle; daPy_footEffect_c* footEffect = &mFootEffect[param_2]; if (mAcch.ChkGroundHit() && !checkNoResetFlg0(static_cast(daPyFlg0_UNK80000000 | daPyFlg0_UNK20000000))) { angle.x = getGroundAngle(&mAcch.m_gnd, current.angle.y); } else { angle.x = 0; } angle.y = current.angle.y; angle.z = 0; footEffect->setPos(i_pos); footEffect->setAngle(&angle); if (effectID == dPa_name::ID_AK_JN_ELEMENTSHIBUKI00) { if (checkNoResetFlg0(daPyFlg0_UNK80) && mWaterY > 10.0f + i_pos->y) { footEffect->getPos().y = mWaterY - 10.0f; } } else if (mCurProc == daPyProc_CUT_ROLL_e && effectID == dPa_name::ID_AK_JT_ELEMENTSMOKE00) { effectID = -2; } else if (param_3 == 5) { effectID = dPa_name::ID_AK_JT_ELEMENTSMOKE01; } s32 oldEffectID = footEffect->getID(); if (effectID != oldEffectID) { if (oldEffectID != -1) { footEffect->getSmokeCallBack()->remove(); footEffect->getOtherCallBack()->remove(); } if (effectID == -2) { emitter = dComIfGp_particle_setP1(dPa_name::ID_AK_JT_ELEMENTSMOKE00, &footEffect->getPos(), &footEffect->getAngle(), (cXyz*)&smoke_scale, (u8)m_HIO->mBasic.m.field_0x2, footEffect->getSmokeCallBack(), fopAcM_GetRoomNo(this)); } else if (effectID == dPa_name::ID_AK_JT_ELEMENTSMOKE00 || effectID == dPa_name::ID_AK_JT_ELEMENTSMOKE01) { emitter = dComIfGp_particle_setToonP1(effectID, &footEffect->getPos(), &footEffect->getAngle(), (cXyz*)&smoke_scale, (u8)m_HIO->mBasic.m.field_0x2, footEffect->getSmokeCallBack(), fopAcM_GetRoomNo(this)); } else if (effectID == dPa_name::ID_AK_JN_ELEMENTKUSA00) { GXColor color = {tevStr.mColorC0.r, tevStr.mColorC0.g, tevStr.mColorC0.b, tevStr.mColorC0.a}; emitter = dComIfGp_particle_setP1(effectID, &footEffect->getPos(), &footEffect->getAngle(), (cXyz*)&grass_scale, 0xFF, footEffect->getOtherCallBack(), -1, &color, &tevStr.mColorK0); } else { GXColor amb, dif; dKy_get_seacolor(&amb, &dif); emitter = dComIfGp_particle_setP1(effectID, &footEffect->getPos(), &footEffect->getAngle(), NULL, 0xFF, footEffect->getOtherCallBack(), -1, &amb); } if (emitter != NULL) { footEffect->setID(effectID); } if (effectID == -2) { effectID = dPa_name::ID_AK_JT_ELEMENTSMOKE00; } } if (emitter != NULL) { if (param_3 == 5) { if (effectID == dPa_name::ID_AK_JT_ELEMENTSMOKE01) { emitter->setLifeTime(40); emitter->setRate(10.0f); emitter->setEmitterScale(heavy_emit_smoke_scale); emitter->setGlobalDynamicsScale(heavy_dyn_smoke_scale); emitter->setGlobalParticleScale(heavy_pat_smoke_scale); } else { emitter->setRate(15.0f); emitter->setSpread(1.0f); if (effectID == dPa_name::ID_AK_JN_ELEMENTKUSA00) { emitter->setDirectionalSpeed(12.0f); } } } else if (param_3 == 1) { emitter->setRate(16.0f); emitter->setSpread(1.0f); } else if (param_3 == 3) { emitter->setRate(8.0f); emitter->setSpread(0.3f); } else if (param_3 == 2) { if (effectID == dPa_name::ID_AK_JN_ELEMENTKUSA00) { emitter->setGlobalScale(run_grass_scale); emitter->setRate(10.0f); emitter->setSpread(1.0f); emitter->setLifeTime(15); } else { emitter->setRate(18.0f); emitter->setSpread(1.0f); emitter->setGlobalScale(run_splash_scale); } } else if (param_3 == 4 && effectID == dPa_name::ID_AK_JN_ELEMENTSHIBUKI00) { emitter->setRate(3.0f); emitter->setSpread(0.2f); } else { emitter->setRate(3.0f); emitter->setSpread(0.05f); } } } /* 8012B8EC-8012B9DC .text setFootMark__9daPy_lk_cFP4cXyz */ void daPy_lk_c::setFootMark(cXyz* i_pos) { cXyz pos(i_pos->x, i_pos->y + 5.0f, i_pos->z); mGndChk.SetPos(&pos); pos.y = dComIfG_Bgsp()->GroundCross(&mGndChk); if (pos.y != -G_CM3D_F_INF && dComIfG_Bgsp()->GetAttributeCode(mGndChk) == dBgS_Attr_SAND_e) { fopKyM_create(fpcNm_WATER_MARK_e, (shape_angle.y << 16) | 2, &pos, &scale, NULL); } if (m336C.getEmitter() != NULL) { fopKyM_create(fpcNm_WATER_MARK_e, shape_angle.y << 16, i_pos, &scale); } } /* 8012B9DC-8012C128 .text setFootEffect__9daPy_lk_cFv */ void daPy_lk_c::setFootEffect() { if (!mAcch.ChkGroundHit() || checkNoResetFlg0(daPyFlg0_UNK80000000)) { resetFootEffect(); m3410.end(); return; } cXyz pos; if (getFootOnGround()) { if (getRightFootOnGround()) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_RFOOT_JNT_e), &pos); setFootMark(&pos); } if (getLeftFootOnGround()) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_LFOOT_JNT_e), &pos); setFootMark(&pos); } } if (checkResetFlg0(daPyRFlg0_UNK10) && mCurrAttributeCode == dBgS_Attr_WATER_e && mWaterY > 25.0f + current.pos.y) { cXyz& p = m3410.getPos(); p.x = current.pos.x + 45.0f * cM_ssin(current.angle.y); p.y = mWaterY; p.z = current.pos.z + 45.0f * cM_scos(current.angle.y); m3410.setAngle(0, current.angle.y + 0x8000, 0); if (m3410.getEmitter() == NULL) { GXColor amb, dif; dKy_get_seacolor(&amb, &dif); JPABaseEmitter* emitter = dComIfGp_particle_setP1(dPa_name::ID_AK_JN_ELEMENTSHIBUKI00, &p, NULL, NULL, 0xFF, &m3410, -1, &amb); if (emitter != NULL) { emitter->setLifeTime(15); emitter->setRate(4.0f); emitter->setSpread(0.6f); emitter->setDirectionalSpeed(11.0f); } } } else { m3410.end(); } if (strcmp(dComIfGp_getStartStageName(), "Adanmae") == 0) { if (checkResetFlg0(daPyRFlg0_UNK10)) { if (getFootOnGround() && mWaterY <= current.pos.y) { dComIfGp_particle_setP1(dPa_name::ID_AK_SN_VOLCANICASHESRUN00, &pos, ¤t.angle); } } } s32 effectID = dComIfGp_particle_checkAtrCodeEffect(mCurrAttributeCode); if (effectID == -1) { return; } s32 var_r29; if ( checkResetFlg0(daPyRFlg0_UNK10) && getFootOnGround() && (checkHeavyStateOn() || effectID == dPa_name::ID_AK_JN_ELEMENTSHIBUKI00 || effectID == dPa_name::ID_AK_JN_ELEMENTKUSA00) ) { if (getRightFootOnGround()) { setFootEffectPosType(2); } else { setFootEffectPosType(1); } if (checkHeavyStateOn()) { var_r29 = 5; #if VERSION > VERSION_DEMO dComIfGp_getVibration().StartShock(2, -0x31, cXyz(0.0f, 1.0f, 0.0f)); #endif } else { var_r29 = 2; } } else { if (mCurProc == daPyProc_JUMP_CUT_LAND_e) { var_r29 = 3; } else if (mCurProc == daPyProc_FRONT_ROLL_e) { var_r29 = 4; } else { var_r29 = 0; } } if (mFootEffectPosType == 0) { return; } if (mCurProc == daPyProc_DEMO_LAST_COMBO_e) { f32 rnd = cM_rndFX(17.5f); cXyz sp44 = m370C; mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_CENTER_e), &m370C); if (mProcVar6.m3570 != 0) { current.angle.y = shape_angle.y - 0x4000; mProcVar6.m3570 = 0; } else { cXyz sp38 = m370C - sp44; current.angle.y = cM_atan2s(sp38.x, sp38.z); } pos.x = m370C.x + rnd * cM_scos(current.angle.y); pos.y = current.pos.y; pos.z = m370C.z - rnd * cM_scos(current.angle.y); setFootEffectType(effectID, &pos, 0, var_r29); } else if (mFootEffectPosType == 4) { f32 rnd = cM_rndFX(17.5f); pos.x = current.pos.x + rnd * cM_scos(current.angle.y); pos.y = current.pos.y; pos.z = current.pos.z - rnd * cM_scos(current.angle.y); setFootEffectType(effectID, &pos, 0, var_r29); } else if (mFootEffectPosType == 3) { if (mCurrAttributeCode == dBgS_Attr_GRASS_e || mCurrAttributeCode == dBgS_Attr_WATER_e) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_RFOOT_JNT_e), &pos); setFootEffectType(effectID, &pos, 0, var_r29); mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_LFOOT_JNT_e), &pos); setFootEffectType(effectID, &pos, 1, var_r29); } else { setFootEffectType(effectID, ¤t.pos, 0, var_r29); } } else if (mFootEffectPosType == 1) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_LFOOT_JNT_e), &pos); setFootEffectType(effectID, &pos, 0, var_r29); } else if (mFootEffectPosType == 2) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_RFOOT_JNT_e), &pos); setFootEffectType(effectID, &pos, 0, var_r29); } else if (mFootEffectPosType == 5) { setFootEffectType(effectID, ¤t.pos, 0, 1); } else if (mFootEffectPosType == 6) { mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_LINK_ROOT_e), &pos); mGndChk.SetPos(&pos); f32 groundY = dComIfG_Bgsp()->GroundCross(&mGndChk); if (groundY != -G_CM3D_F_INF) { pos.y = groundY; } setFootEffectType(effectID, &pos, 0, 1); } } /* 8012C128-8012C1A8 .text resetFootEffect__9daPy_lk_cFv */ void daPy_lk_c::resetFootEffect() { daPy_footEffect_c* pFootEffect = mFootEffect; for (int idx = 0; idx < (s32)ARRAY_SIZE(mFootEffect); idx++, pFootEffect++) { pFootEffect->getSmokeCallBack()->remove(); pFootEffect->getOtherCallBack()->remove(); pFootEffect->setID(-1); } setFootEffectPosType(0); } /* 8012C1A8-8012C2A4 .text setSwimTail__9daPy_lk_cFv */ void daPy_lk_c::setSwimTail() { static JGeometry::TVec3 tail_scale(1.0f, 1.0f, -1.0f); if (mSwimTailEcallBack[0].getEmitter() == NULL) { dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_LK_SWIMK_L, &mSwimTailEcallBack[0].getPos(), ¤t.angle, &scale, 0xFF, &mSwimTailEcallBack[0]); mSwimTailEcallBack[0].onRightFlg(); } if (mSwimTailEcallBack[1].getEmitter() == NULL) { dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_LK_SWIMK_L, &mSwimTailEcallBack[1].getPos(), ¤t.angle, &scale, 0xFF, &mSwimTailEcallBack[1]); } } /* 8012C2A4-8012C330 .text setCutWaterSplash__9daPy_lk_cFv */ void daPy_lk_c::setCutWaterSplash() { if (m336C.getEmitter() != NULL) { cXyz pos; mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_CHEST_JNT_e), &pos); dComIfGp_particle_setP1(dPa_name::ID_IT_JN_LK_NURE_SHIBUKI00, &pos); } } /* 8012C330-8012C45C .text setSwimWaterDrop__9daPy_lk_cFP25daPy_waterDropEcallBack_c */ void daPy_lk_c::setSwimWaterDrop(daPy_waterDropEcallBack_c* callBack) { f32 tmp = mWaterY + 10.0f; if (checkNoResetFlg1(daPy_lk_c::daPyFlg1_WATER_DROP) || !checkNoResetFlg0(daPy_lk_c::daPyFlg0_UNK80) || (callBack->getPos().y > tmp && !checkModeFlg(ModeFlg_SWIM))) { if (callBack->getEmitter() == NULL && (callBack->checkReady() || checkNoResetFlg1(daPy_lk_c::daPyFlg1_WATER_DROP))) { JPABaseEmitter* emitter = dComIfGp_particle_setP1(dPa_name::ID_IT_JN_LK_NURE_POTA00, &callBack->getPos(), NULL, NULL, 0xFF, callBack); if (emitter != NULL) { emitter->setParticleCallBackPtr(daPy_waterDropEcallBack_c::getPcallBack()); } } callBack->offReady(); offNoResetFlg1(daPy_lk_c::daPyFlg1_WATER_DROP); } else if (checkNoResetFlg0(daPy_lk_c::daPyFlg0_UNK80) && callBack->getPos().y < mWaterY) { callBack->end(); if (mCurProc != daPyProc_VOMIT_WAIT_e) { callBack->onReady(); } } } /* 8012C45C-8012C620 .text setWaterDrop__9daPy_lk_cFv */ void daPy_lk_c::setWaterDrop() { MtxP neck_jnt_mtx = mpCLModel->getAnmMtx(CL_JNT_NECK_JNT_e); cXyz tmp; mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_NECK_JNT_e), &tmp); m334C.setPos(&tmp); mDoMtx_multVecZero(mpCLModel->getAnmMtx(CL_JNT_BODY_CHN_e), &tmp); m336C.setPos(&tmp); if (checkModeFlg(ModeFlg_00000001)) { daPy_waterDropEcallBack_c::getPcallBack()->onWaterMark(); } else { daPy_waterDropEcallBack_c::getPcallBack()->offWaterMark(); } if (daPy_dmEcallBack_c::checkFlame()) { m334C.end(); m336C.end(); m3460[0].end(); m3460[1].end(); return; } if ( dKyr_player_overhead_bg_chk() && dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) != dStageType_MISC_e && mCurProc != daPyProc_DEMO_LAST_COMBO_e && mAcch.GetRoofHeight() == G_CM3D_F_INF ) { if (m3460[0].getEmitter() == NULL) { m3460[0].makeEmitter(dPa_name::ID_AK_JN_LK_NURE_POTA01, mpCLModel->getAnmMtx(CL_JNT_NECK_JNT_e), ¤t.pos, NULL); } if (m3460[1].getEmitter() == NULL) { m3460[1].makeEmitter(dPa_name::ID_AK_JN_LK_NURE_POTA01, mpCLModel->getAnmMtx(CL_JNT_BODY_CHN_e), ¤t.pos, NULL); } m334C.end(); m336C.end(); return; } m3460[0].end(); m3460[1].end(); setSwimWaterDrop(&m334C); setSwimWaterDrop(&m336C); } /* 8012C620-8012C754 .text setDamageFlameEmitter__9daPy_lk_cFv */ void daPy_lk_c::setDamageFlameEmitter() { static JGeometry::TVec3 arm_flame_scale(0.6f, 0.6f, 0.6f); static const u16 flame_joint[ARRAY_SIZE(mDmEcallBack)] = { CL_JNT_HEAD_JNT_e, CL_JNT_STOMACH_JNT_e, CL_JNT_LARMB_JNT_e, CL_JNT_RARMB_JNT_e, }; if (!daPy_dmEcallBack_c::checkFlame()) { endDamageEmitter(); const u16* jointNoP = flame_joint; daPy_dmEcallBack_c* dmECB = mDmEcallBack; for (int i = 0; i < (s32)ARRAY_SIZE(mDmEcallBack); i++, jointNoP++, dmECB++) { cXyz jointPos; mDoMtx_multVecZero(mpCLModel->getAnmMtx(*jointNoP), &jointPos); dmECB->makeEmitter(dPa_name::ID_AK_JN_BODYABLAZE00, mpCLModel->getAnmMtx(*jointNoP), &jointPos, NULL); if (dmECB->getEmitter() == NULL) { continue; } if (i == 2 || i == 3) { dmECB->getEmitter()->setGlobalScale(arm_flame_scale); } } } daPy_dmEcallBack_c::setFlame(100); } /* 8012C754-8012C7F0 .text setDamageCurseEmitter__9daPy_lk_cFv */ void daPy_lk_c::setDamageCurseEmitter() { if (!daPy_dmEcallBack_c::checkCurse()) { endDamageEmitter(); mDmEcallBack[0].makeEmitter(dPa_name::ID_AK_SN_BUBBLECURSE00, mpCLModel->getAnmMtx(CL_JNT_WAIST_JNT_e), ¤t.pos, NULL); if (checkUpperReadyThrowAnime()) { resetActAnimeUpper(UPPER_MOVE2_e, -1.0f); freeRopeItem(); } } cancelNoDamageMode(); daPy_dmEcallBack_c::setCurse(200); } /* 8012C7F0-8012C880 .text setDamageElecEmitter__9daPy_lk_cFv */ void daPy_lk_c::setDamageElecEmitter() { if (!daPy_dmEcallBack_c::checkElec()) { endDamageEmitter(); mDmEcallBack[0].makeEmitter(dPa_name::ID_AK_JN_CCTHUNDER00, mpCLModel->getAnmMtx(CL_JNT_CHEST_JNT_e), ¤t.pos, NULL); mDmEcallBack[1].makeEmitter(dPa_name::ID_AK_JN_CCTHUNDER01, mpCLModel->getAnmMtx(CL_JNT_CHEST_JNT_e), ¤t.pos, NULL); } daPy_dmEcallBack_c::setElec(m_HIO->mDam.mElecDamage.m.field_0x2); } /* 8012C880-8012C8F8 .text setDamageEmitter__9daPy_lk_cFv */ void daPy_lk_c::setDamageEmitter() { dCcD_GObjInf* tgHitGObj = mCyl.GetTgHitGObj(); if (tgHitGObj != NULL) { if (tgHitGObj->GetAtSpl() == dCcG_At_Spl_UNK3) { setDamageCurseEmitter(); } else if (tgHitGObj->GetAtSpl() == dCcG_At_Spl_UNKB) { setDamageElecEmitter(); } else if (tgHitGObj->ChkAtType(AT_TYPE_FIRE)) { setDamageFlameEmitter(); } } } /* 8012C8F8-8012C9D8 .text endFlameDamageEmitter__9daPy_lk_cFv */ void daPy_lk_c::endFlameDamageEmitter() { if (!daPy_dmEcallBack_c::checkFlame()) return; if (current.pos.y < mWaterY - 10.0f) { for (int i = 0; i < (s32)ARRAY_SIZE(mDmEcallBack); i++) { cXyz pos; mDoMtx_multVecZero(mDmEcallBack[i].getMtx(), &pos); pos.y = mWaterY; dComIfGp_particle_set(dPa_name::ID_AK_JN_EVAPORATION00, &pos); } } endDamageEmitter(); } /* 8012C9D8-8012CA44 .text endDamageEmitter__9daPy_lk_cFv */ void daPy_lk_c::endDamageEmitter() { for (int i = 0; i < (int)ARRAY_SIZE(mDmEcallBack); i++) { mDmEcallBack[i].end(); } daPy_dmEcallBack_c::setTimer(0); daPy_dmEcallBack_c::setType(3); mLightInfluence.mPower = 0.0f; } /* 8012CA44-8012CD60 .text setItemWaterEffect__9daPy_lk_cFP10fopAc_ac_cii */ BOOL daPy_lk_c::setItemWaterEffect(fopAc_ac_c* i_actor, BOOL inWater, BOOL triggerOnExit) { static cXyz eff_scale0(0.5f, 0.5f, 0.5f); static cXyz eff_scale2(0.13f, 0.13f, 0.13f); static JGeometry::TVec3 direction(0.0f, 1.0f, 0.0f); f32 waterY; if (fopAcM_getWaterY(&i_actor->current.pos, &waterY) && ((inWater && i_actor->current.pos.y > waterY) || (!inWater && waterY >= i_actor->current.pos.y))) { // Item entered or exited the water. inWater ^= 1; if (!inWater && !triggerOnExit) { return inWater; } f32 deltaY = std::fabsf(i_actor->old.pos.y - i_actor->current.pos.y); f32 waterDistY = std::fabsf(waterY - i_actor->current.pos.y); cXyz pos; if (deltaY < 1.0f) { pos = i_actor->current.pos; } else { f32 var_f31 = waterDistY / deltaY; if (var_f31 > 1.0f) { var_f31 = 1.0f; } pos = i_actor->old.pos * var_f31 + i_actor->current.pos * (1.0f - var_f31); } dComIfGp_particle_setSingleRipple(dPa_name::ID_IT_JN_WP_HAMON01, &pos, NULL, &eff_scale0); dComIfGp_particle_setSingleRipple(dPa_name::ID_IT_JN_WP_HAMON03, &pos, NULL, &eff_scale0); GXColor amb, dif; dKy_get_seacolor(&amb, &dif); JPABaseEmitter* emitter = dComIfGp_particle_setP1(dPa_name::ID_AK_JN_ELEMENTSHIBUKI00, &pos, NULL, &eff_scale2, 0xFF, NULL, -1, &amb); if (emitter != NULL) { emitter->setMaxFrame(1); emitter->setLifeTime(20); emitter->setRate(40.0f); emitter->setAwayFromAxisSpeed(20.0f); emitter->setDirectionalSpeed(80.0f); emitter->setSpread(0.0f); emitter->setDirection(direction); } } return inWater; }