From b465138e9c65d9496b2052929d37e4cdb9028a41 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 14 Jun 2025 17:00:59 -0400 Subject: [PATCH] daPy_lk_c::procBottleOpen --- include/SSystem/SComponent/c_cc_d.h | 2 +- include/d/actor/d_a_player.h | 2 + include/d/d_cc_d.h | 1 + src/d/actor/d_a_player.cpp | 4 +- src/d/actor/d_a_player_bottle.inc | 171 +++++++++++++++++++++++++++- src/d/actor/d_a_player_particle.inc | 2 +- 6 files changed, 175 insertions(+), 7 deletions(-) diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index 5bc85e93e..886b7dd46 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -145,7 +145,7 @@ public: void Set(const cCcD_SrcCpsAttr& pSrc) { cM3dGCps::Set(pSrc.mCps); } - void Set(const cXyz& pStart, const cXyz& pEnd, float radius) { + void Set(const cXyz& pStart, const cXyz& pEnd, f32 radius) { cM3dGCps::Set(pStart, pEnd, radius); } diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 726bf2334..9d954600e 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -18,6 +18,8 @@ public: void setup(JPABaseEmitter* emitter, const cXyz*, const csXyz*, s8) { mpEmitter = emitter; } JPABaseEmitter* getEmitter() { return mpEmitter; } + MtxP getMtx() { return mpMtx; } + void setMatrix(MtxP mtx) { mpMtx = mtx; } /* 0x04 */ JPABaseEmitter* mpEmitter; /* 0x08 */ MtxP mpMtx; diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index bf7b0b48d..142a6301e 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -105,6 +105,7 @@ enum dCcG_At_Spl { /* 0x1 */ dCcG_At_Spl_UNK1 = 1, /* 0x2 */ dCcG_At_Spl_UNK2 = 2, /* 0x3 */ dCcG_At_Spl_UNK3 = 3, + /* 0x4 */ dCcG_At_Spl_UNK4 = 4, /* 0x5 */ dCcG_At_Spl_UNK5 = 5, /* 0x6 */ dCcG_At_Spl_UNK6 = 6, /* 0x7 */ dCcG_At_Spl_UNK7 = 7, diff --git a/src/d/actor/d_a_player.cpp b/src/d/actor/d_a_player.cpp index b1084f1ea..cac239367 100644 --- a/src/d/actor/d_a_player.cpp +++ b/src/d/actor/d_a_player.cpp @@ -68,14 +68,14 @@ void daPy_mtxFollowEcallBack_c::end() { /* 80102BF8-80102C84 .text makeEmitter__25daPy_mtxFollowEcallBack_cFUsPA4_fPC4cXyzPC4cXyz */ JPABaseEmitter* daPy_mtxFollowEcallBack_c::makeEmitter(u16 particleID, MtxP mtx, const cXyz* pos, const cXyz* scale) { end(); - mpMtx = mtx; + setMatrix(mtx); return dComIfGp_particle_setP1(particleID, pos, NULL, scale, 0xFF, this); } /* 80102C84-80102D14 .text makeEmitterColor__25daPy_mtxFollowEcallBack_cFUsPA4_fPC4cXyzPC8_GXColorPC8_GXColor */ JPABaseEmitter* daPy_mtxFollowEcallBack_c::makeEmitterColor(u16 particleID, MtxP mtx, const cXyz* pos, const GXColor* prmColor, const GXColor* envColor) { end(); - mpMtx = mtx; + setMatrix(mtx); return dComIfGp_particle_setP1(particleID, pos, NULL, NULL, 0xFF, this, -1, prmColor, envColor); } diff --git a/src/d/actor/d_a_player_bottle.inc b/src/d/actor/d_a_player_bottle.inc index 3415d11fa..1de3dd779 100644 --- a/src/d/actor/d_a_player_bottle.inc +++ b/src/d/actor/d_a_player_bottle.inc @@ -15,6 +15,7 @@ #include "d/d_camera.h" #include "d/d_procname.h" #include "JSystem/J3DGraphLoader/J3DAnmLoader.h" +#include "f_op/f_op_kankyo_mng.h" /* 80151E40-80151E60 .text changeBottleDrinkFace__9daPy_lk_cFi */ int daPy_lk_c::changeBottleDrinkFace(int param_0) { @@ -247,9 +248,173 @@ BOOL daPy_lk_c::procBottleOpen_init(u16 param_0) { /* 801527CC-80152ED0 .text procBottleOpen__9daPy_lk_cFv */ BOOL daPy_lk_c::procBottleOpen() { - /* Nonmatching */ - static const Vec splash_scale = {0.3f, 0.3f, 0.3f}; - static const Vec ripple_scale = {0.5f, 0.5f, 0.5f}; + J3DFrameCtrl& frameCtrl = mFrameCtrlUnder[UNDER_MOVE0_e]; + + setShipRidePosUseItem(); + + if (m_anm_heap_under[UNDER_MOVE0_e].mIdx == LKANM_BCK_BINOPENPRE) { + if (frameCtrl.getRate() < 0.01f) { + if (mEquipItem == dItem_FAIRY_BOTTLE_e) { + setSingleMoveAnime( + ANM_BINOPENB, + 1.0f, + daPy_HIO_bottle_c0::m.field_0x50, + daPy_HIO_bottle_c0::m.field_0xA, + daPy_HIO_bottle_c0::m.field_0x54 + ); + } else { + setSingleMoveAnime( + ANM_BINOPENA, + 1.0f, + daPy_HIO_bottle_c0::m.field_0x44, + daPy_HIO_bottle_c0::m.field_0x8, + daPy_HIO_bottle_c0::m.field_0x48 + ); + } + } else if (frameCtrl.checkPass(32.0f)) { + m355E = 0; + mRightHandIdx = 8; + } + } else { + if (m32E4.getEmitter() && m34D4 == 0 && m32E4.getEmitter()->getParticleList() && m32E4.getEmitter()->getParticleList()->getLast()) { + JGeometry::TVec3 temp; + m32E4.getEmitter()->getParticleList()->getLast()->getObject()->getGlobalPosition(temp); + cXyz sp64(temp.x, temp.y + 100.0f, temp.z); + BOOL r27 = FALSE; + mGndChk.SetPos(&sp64); + f32 f31 = dComIfG_Bgsp()->GroundCross(&mGndChk); + mLavaGndChk.SetPos(&sp64); + f32 f29 = dComIfG_Bgsp()->GroundCross(&mGndChk); // Bug? They might have meant to use mLavaGndChk here + f32 f1; + f32 water_y; + if (fopAcM_getWaterY(&sp64, &water_y)) { + if (water_y > f31) { + if (water_y > f29) { + f1 = water_y; + r27 = TRUE; + } else { + f1 = f29; + } + } else { + if (f31 > f29) { + f1 = f31; + } else { + f1 = f29; + } + } + } else { + if (f31 > f29) { + f1 = f31; + } else { + f1 = f29; + } + } + cXyz sp58; + cXyz sp4C; + cXyz sp40; + cXyz sp34; + if (f1 > temp.y + 15.0f) { + m34D4 = 1; + sp64.y = f1; + m34D4 = 1; + static const Vec splash_scale = {0.3f, 0.3f, 0.3f}; + JPABaseEmitter* emitter = dComIfGp_particle_setP1( + dPa_name::ID_COMMON_0040, &sp64, + NULL, (cXyz*)&splash_scale, 0xFF, NULL, -1, + &tevStr.mColorK0, &tevStr.mColorK0 + ); + if (emitter) { + emitter->setRate(8.0f); + emitter->setMaxFrame(20); + } + static const Vec ripple_scale = {0.5f, 0.5f, 0.5f}; + if (r27) { + dComIfGp_particle_setSingleRipple(dPa_name::ID_COMMON_003F, &sp64, NULL, (cXyz*)&ripple_scale); + } else { + m370C = sp64; + m34D0 = 1; + } + sp58.set(sp64.x, sp64.y, sp64.z); + sp4C.set(sp64.x, sp64.y + 5.0f, sp64.z); + mAtCps[1].SetStartEnd(sp58, sp64); + sp34.set(0.0f, 0.0f, 0.0f); + mAtCps[1].SetAtVec(sp34); + mAtCps[1].SetR(50.0f); + } else { + sp64.y = temp.y; + } + mDoMtx_multVecZero(mpCLModel->getAnmMtx(0x08), &sp58); + sp40 = sp64 - sp58; + mAtCps[0].SetStartEnd(sp58, sp64); + mAtCps[0].SetAtVec(sp40); + m34D6 = 1; + } + if (frameCtrl.getRate() < 0.01f) { + mActorKeepRope.clearData(); + if (mDemo.getDemoType() == 5) { + dCam_getBody()->EndEventCamera(fopAcM_GetID(this)); + dComIfGp_event_reset(); + endDemoMode(); + } else { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + } else if (m34D8 == 0) { + if ( + (mEquipItem == dItem_WATER_BOTTLE_e || mEquipItem == dItem_FOREST_WATER_e) && + (frameCtrl.checkPass(9.0f)) + ) { + seStartOnlyReverb(JA_SE_LK_SPRINKLE_WATER); + m32E4.makeEmitterColor(dPa_name::ID_COMMON_0279, mpCLModel->getAnmMtx(0x08), ¤t.pos, &tevStr.mColorK0, &tevStr.mColorK0); + dCcG_At_Spl spl; + if (mEquipItem == dItem_WATER_BOTTLE_e) { + spl = dCcG_At_Spl_UNK0; + } else { + spl = dCcG_At_Spl_UNK4; + onNoResetFlg1(daPyFlg1_FOREST_WATER_USE); + m3554 = 3; + } + setAtParam(AT_TYPE_WATER, 0, spl, 0, dCcG_AtHitMark_None_e, 0, 5.0f); + } else if ( + (mEquipItem == dItem_FAIRY_BOTTLE_e && frameCtrl.getFrame() >= daPy_HIO_bottle_c0::m.field_0x58) || + (mEquipItem != dItem_FAIRY_BOTTLE_e && mEquipItem != dItem_FOREST_WATER_e && frameCtrl.getFrame() >= daPy_HIO_bottle_c0::m.field_0x4C) + ) { + mpBottleContentsModel = NULL; + m34D8 = 1; + if (mDemo.getDemoType() == 5) { + dComIfGs_setEquipBottleItemEmpty(mReadyItemBtn); + } else if (dComIfGp_event_getTalkXYBtn() == dTalkBtn_X_e) { + dComIfGs_setEquipBottleItemEmpty(dItemBtn_X_e); + } else if (dComIfGp_event_getTalkXYBtn() == dTalkBtn_Y_e) { + dComIfGs_setEquipBottleItemEmpty(dItemBtn_Y_e); + } else { // dTalkBtn_Z_e + dComIfGs_setEquipBottleItemEmpty(dItemBtn_Z_e); + } + if (mEquipItem == dItem_FAIRY_BOTTLE_e) { + onModeFlg(ModeFlg_08000000); + mActorKeepRope.setData(makeFairy(&mLeftHandPos, 2)); + } else if (mEquipItem == dItem_FIREFLY_BOTTLE_e) { + fopAcM_create(PROC_NH, 1, &mLeftHandPos, fopAcM_GetRoomNo(this), &shape_angle); + } + } + } else if (frameCtrl.getFrame() > 40.0f) { + m32E4.end(); + } + } + + if (m34D0 > 0) { + m34D0--; + if (m34D0 == 0) { + cXyz sp28( + m370C.x + cM_rndFX(45.0f), + m370C.y, + m370C.z + cM_rndFX(45.0f) + ); + fopKyM_create(PROC_WATER_MARK, 1, &sp28); + m34D0 = 3; + } + } + + return TRUE; } /* 80152ED0-80153064 .text procBottleSwing_init__9daPy_lk_cFi */ diff --git a/src/d/actor/d_a_player_particle.inc b/src/d/actor/d_a_player_particle.inc index 5b5078611..9aa4d019c 100644 --- a/src/d/actor/d_a_player_particle.inc +++ b/src/d/actor/d_a_player_particle.inc @@ -1236,7 +1236,7 @@ void daPy_lk_c::endFlameDamageEmitter() { if (current.pos.y < m35D0 - 10.0f) { for (int i = 0; i < (s32)ARRAY_SIZE(mDmEcallBack); i++) { cXyz pos; - mDoMtx_multVecZero(mDmEcallBack[i].mpMtx, &pos); + mDoMtx_multVecZero(mDmEcallBack[i].getMtx(), &pos); pos.y = m35D0; dComIfGp_particle_set(dPa_name::ID_COMMON_035A, &pos);