From 001ecdde5a7d465b6ee42ce2b206ba6e21d2fbf0 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Tue, 30 Jan 2024 22:44:09 -0800 Subject: [PATCH] d_particle --- .../JSystem/JParticle/JPAResourceManager.h | 2 +- include/d/d_kankyo.h | 1 + include/d/d_particle.h | 45 ++-- include/m_Do/m_Do_ext.h | 1 + src/JSystem/JParticle/JPAResourceManager.cpp | 2 +- src/d/d_particle.cpp | 243 +++++++++++++++--- 6 files changed, 232 insertions(+), 62 deletions(-) diff --git a/include/JSystem/JParticle/JPAResourceManager.h b/include/JSystem/JParticle/JPAResourceManager.h index 743512514..bc72f21f9 100644 --- a/include/JSystem/JParticle/JPAResourceManager.h +++ b/include/JSystem/JParticle/JPAResourceManager.h @@ -34,7 +34,7 @@ public: JPAEmitterResource(u32, JKRHeap*); void registration(JPAEmitterData*, u16); JPAEmitterData * getByUserIndex(u16); - BOOL checkUserIndexDuplication(u16); + bool checkUserIndexDuplication(u16); public: /* 0x00 */ u32 registNum; diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 034f52dc0..ad5d84518 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -428,6 +428,7 @@ void dKy_arrowcol_chg_on(cXyz*, int); void dKy_arrowcol_chg_move(); void dKy_setLight_init(); void dKy_setLight(); +void dKy_setLight_again(); void dKy_GxFog_set(); void dKy_GxFog_sea_set(); void dKy_GxFog_tevstr_set(dKy_tevstr_c*); diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 4bd6e940f..f4d373acf 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -4,6 +4,7 @@ #include "JSystem/J3DGraphBase/J3DVertex.h" #include "JSystem/J3DGraphAnimator/J3DAnimation.h" #include "JSystem/JGeometry.h" +#include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JParticle/JPAParticle.h" #include "JSystem/JParticle/JPAEmitter.h" #include "JSystem/JParticle/JPAEmitterManager.h" @@ -89,9 +90,9 @@ public: void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); - void create(JPAEmitterManager*, u16, u8); + JPABaseEmitter* create(JPAEmitterManager*, u16, u8); JPABaseEmitter* createEmitter(JPAEmitterManager*); - void set(cXyz const*, u8, GXColor const&, GXColor const&, int); + bool set(cXyz const*, u8, GXColor const&, GXColor const&, int); /* 0x004 */ JPABaseEmitter* mpBaseEmitter; /* 0x008 */ u16 mResID; @@ -119,8 +120,8 @@ public: /* 0x14 */ f32 mVelFade2; /* 0x18 */ f32 mMaxParticleVelocity; /* 0x1C */ cXyz mCollapsePos[2]; - /* 0x34 */ cXyz* mpPos; - /* 0x38 */ csXyz* mpRot; + /* 0x34 */ const cXyz* mpPos; + /* 0x38 */ const csXyz* mpRot; /* 0x3C */ JGeometry::TVec3 mRotMtx[3]; /* 0x60 */ JPABaseEmitter* mpBaseEmitter; }; @@ -136,8 +137,8 @@ public: /* 0x04 */ s16 mState; /* 0x08 */ f32 mScaleTimer; /* 0x0C */ f32 mMaxScaleTimer; - /* 0x10 */ cXyz* mpPos; - /* 0x14 */ csXyz* mpRot; + /* 0x10 */ const cXyz* mpPos; + /* 0x14 */ const csXyz* mpRot; /* 0x18 */ JPABaseEmitter* mpBaseEmitter; }; @@ -155,8 +156,8 @@ public: /* 0x08 */ f32 mBaseY; /* 0x0C */ f32 mMinY; /* 0x10 */ Vec mPos[3]; - /* 0x34 */ cXyz* mpPos; - /* 0x38 */ csXyz* mpRot; + /* 0x34 */ const cXyz* mpPos; + /* 0x38 */ const csXyz* mpRot; /* 0x3C */ f32 mExTransY; /* 0x40 */ f32 mExScaleY; /* 0x44 */ f32 mVel; @@ -182,7 +183,7 @@ public: void setRate(f32 rate) { mRate = rate; } /* 0x04 */ JPABaseEmitter* mpBaseEmitter; - /* 0x08 */ cXyz* mPos; + /* 0x08 */ const cXyz* mPos; /* 0x0C */ u32 mFlags; /* 0x10 */ f32 mRate; }; @@ -301,7 +302,11 @@ public: void setPosArray(cXyz*, s16) {} public: - /* 0x04 */ u8 field_0x04[0x10 - 0x04]; + /* 0x04 */ u8 field_0x4; + /* 0x05 */ u8 field_0x5; + /* 0x06 */ u16 field_0x6; + /* 0x08 */ u8 field_0x8[0xC - 0x08]; + /* 0x0C */ JPABaseEmitter* mpBaseEmitter; }; // Size: 0x10 STATIC_ASSERT(sizeof(dPa_cutTurnEcallBack_c) == 0x10); @@ -379,9 +384,9 @@ public: int*, int); void checkAtrCodeEffect(int); void setNormalStripes(u16, cXyz const*, csXyz const*, cXyz const*, u8, u16); - void newSimple(u16, u8); - void setSimple(u16, cXyz const*, u8, GXColor const&, GXColor const&, int); - void getSimple(u16); + bool newSimple(u16, u8); + bool setSimple(u16, cXyz const*, u8, GXColor const&, GXColor const&, int); + dPa_simpleEcallBack* getSimple(u16); JPABaseEmitter* setNormal(u16 particleID, const cXyz* pos, const csXyz* angle, const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, @@ -457,7 +462,7 @@ public: u32 getParticleNum() { return mEmitterMng->getParticleNumber(); } u32 getEmitterNum() { return mEmitterMng->getEmitterNumber(); } - void drawModelParticle() { mModelCtrl->draw(); } + void drawModelParticle() { mModelControl->draw(); } JKRHeap * getHeap() { return mHeap; } static dPa_selectTexEcallBack mTsubo[4]; @@ -482,12 +487,12 @@ public: static MtxP getWindViewMatrix() { return mWindViewMatrix; } static Mtx mWindViewMatrix; - /* 0x0000 */ JKRHeap* mHeap; - /* 0x0004 */ JPAResourceManager* mpCommonResMgr; - /* 0x0008 */ dPa_modelControl_c* mModelCtrl; - /* 0x000C */ JKRHeap* mpSceneHeap; - /* 0x0010 */ void* mpData; - /* 0x0014 */ JPAResourceManager* mpSceneResMgr; + /* 0x0000 */ JKRSolidHeap* mHeap; + /* 0x0004 */ JPAResourceManager* mCommonResMng; + /* 0x0008 */ dPa_modelControl_c* mModelControl; + /* 0x000C */ JKRSolidHeap* mSceneHeap; + /* 0x0010 */ const void* mpData; + /* 0x0014 */ JPAResourceManager* mSceneResMng; /* 0x0018 */ u8 mSceneNo; /* 0x0019 */ u8 mCount; /* 0x001A */ u8 mNumSimple; diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 58c4b6fb5..5ea37cb61 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -650,6 +650,7 @@ s32 mDoExt_resIDToIndex(JKRArchive*, u16); JKRSolidHeap * mDoExt_createSolidHeapFromGameToCurrent(u32 size, u32 align); JKRSolidHeap * mDoExt_createSolidHeapToCurrent(u32, JKRHeap *, u32 align); +JKRSolidHeap * mDoExt_createSolidHeapFromGame(u32 i_size, u32 i_alignment); JKRSolidHeap * mDoExt_createSolidHeapFromSystem(u32 i_size, u32 i_alignment); void mDoExt_restoreCurrentHeap(); s32 mDoExt_adjustSolidHeap(JKRSolidHeap * pHeap); diff --git a/src/JSystem/JParticle/JPAResourceManager.cpp b/src/JSystem/JParticle/JPAResourceManager.cpp index 6a3828e48..6ca603095 100644 --- a/src/JSystem/JParticle/JPAResourceManager.cpp +++ b/src/JSystem/JParticle/JPAResourceManager.cpp @@ -65,7 +65,7 @@ JPAEmitterData * JPAEmitterResource::getByUserIndex(u16 userIndex) { } /* 80258F5C-80258FA0 .text checkUserIndexDuplication__18JPAEmitterResourceFUs */ -BOOL JPAEmitterResource::checkUserIndexDuplication(u16 userIndex) { +bool JPAEmitterResource::checkUserIndexDuplication(u16 userIndex) { for (u32 i = 0; i < registNum; i++) { if (pEmtrResArray[i]->getUserIndex() == userIndex) return TRUE; diff --git a/src/d/d_particle.cpp b/src/d/d_particle.cpp index f2aec94dc..6db702445 100644 --- a/src/d/d_particle.cpp +++ b/src/d/d_particle.cpp @@ -4,13 +4,21 @@ // #include "d/d_particle.h" -#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JParticle/JPAEmitter.h" #include "JSystem/JParticle/JPAEmitterManager.h" -#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JUtility/JUTAssert.h" #include "SSystem/SComponent/c_malloc.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo.h" +#include "d/d_resorce.h" +#include "m_Do/m_Do_dvd_thread.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_graphic.h" #include "m_Do/m_Do_lib.h" +#include "stdio.h" static f32 dummy_2100[3] = {1.0f, 1.0f, 1.0f}; static f32 dummy_2080[3] = {1.0f, 1.0f, 1.0f}; @@ -331,8 +339,19 @@ void dPa_simpleEcallBack::draw(JPABaseEmitter*) { } /* 8007C6EC-8007C774 .text create__19dPa_simpleEcallBackFP17JPAEmitterManagerUsUc */ -void dPa_simpleEcallBack::create(JPAEmitterManager*, u16, u8) { - /* Nonmatching */ +JPABaseEmitter* dPa_simpleEcallBack::create(JPAEmitterManager* manager, u16 param_2, u8 param_3) { + mpBaseEmitter = NULL; + mGrpID = param_3; + mResID = param_2; + if (createEmitter(manager)) { + if (param_2 == 0xa06a || param_2 == 0xa410) { + mbIsSmoke = true; + mpBaseEmitter->mpParticleCallBack = &dPa_control_c::mSmokePcallback; + } else { + mbIsSmoke = false; + } + } + return mpBaseEmitter; } /* 8007C774-8007C840 .text createEmitter__19dPa_simpleEcallBackFP17JPAEmitterManager */ @@ -351,7 +370,7 @@ JPABaseEmitter* dPa_simpleEcallBack::createEmitter(JPAEmitterManager* manager) { } /* 8007C840-8007C8C4 .text set__19dPa_simpleEcallBackFPC4cXyzUcRC8_GXColorRC8_GXColori */ -void dPa_simpleEcallBack::set(const cXyz*, u8, const _GXColor&, const _GXColor&, int) { +bool dPa_simpleEcallBack::set(const cXyz*, u8, const _GXColor&, const _GXColor&, int) { /* Nonmatching */ } @@ -379,7 +398,7 @@ dPa_setColorEcallBack dPa_control_c::mLifeBall[] = { dPa_setColorEcallBack(l_lifeBallColor[2]), }; -JPAEmitterManager * dPa_control_c::mEmitterMng; +JPAEmitterManager* dPa_control_c::mEmitterMng; dPa_stripesEcallBack dPa_control_c::mStripes; dPa_kageroEcallBack dPa_control_c::mKagero; dPa_smokeEcallBack dPa_control_c::mSmokeEcallback(0, 1, 1, 1); @@ -397,8 +416,8 @@ dPa_control_c::dPa_control_c() { mCount = 0; mEmitterMng = NULL; mNumSimple = 0; - mpCommonResMgr = NULL; - mpSceneResMgr = NULL; + mCommonResMng = NULL; + mSceneResMng = NULL; } /* 8007CA28-8007CA30 .text getRM_ID__13dPa_control_cFUs */ @@ -408,22 +427,77 @@ u8 dPa_control_c::getRM_ID(u16 uid) { /* 8007CA30-8007CA98 .text swapFrameBufferTexture__13dPa_control_cFv */ void dPa_control_c::swapFrameBufferTexture() { - /* Nonmatching */ + if (mCommonResMng) { + mCommonResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00"); + } + if (mSceneResMng) { + mSceneResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00"); + } } /* 8007CA98-8007CCC8 .text createCommon__13dPa_control_cFPCv */ -void dPa_control_c::createCommon(const void*) { +void dPa_control_c::createCommon(const void* param_1) { /* Nonmatching */ + mCommonResMng = new (mHeap, 0) JPAResourceManager(param_1, mHeap); + JUT_ASSERT(1313, mCommonResMng != 0); + mCommonResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00"); + mEmitterMng = new(mHeap, 0) JPAEmitterManager(mCommonResMng, 3000, 150, 200, mHeap); + JUT_ASSERT(1324, mEmitterMng != 0); + JKRHeap* oldHeap = mDoExt_setCurrentHeap(mHeap); + mModelControl = new dPa_modelControl_c((J3DModelData*)g_dComIfG_gameInfo.mResControl.getObjectRes("Always", 0x31)); + JUT_ASSERT(1332, mModelControl != 0); + for (u16 i = 0; i < 8; i++) { + u16 var1 = dPa_name::j_o_id[i]; + if (mCommonResMng->pEmtrRes->checkUserIndexDuplication(var1)) { + newSimple(var1, var1 & 0x4000 ? 4 : 0); + } + } + mNumSimpleCommon = mNumSimple; + mDoExt_setCurrentHeap(oldHeap); + mDoExt_adjustSolidHeap(mHeap); } /* 8007CCC8-8007CE50 .text createRoomScene__13dPa_control_cFPCv */ -void dPa_control_c::createRoomScene(const void*) { +void dPa_control_c::createRoomScene(const void* param_1) { /* Nonmatching */ + mSceneHeap = mDoExt_createSolidHeapFromGame(0, 0); + JUT_ASSERT(1369, mSceneHeap != 0); + mpData = param_1; + mSceneResMng = new (mSceneHeap, 0) JPAResourceManager(mpData, mSceneHeap); + JUT_ASSERT(1373, mSceneResMng != 0); + mSceneResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00"); + mEmitterMng->pResMgrArray[1] = mSceneResMng; + mDoExt_adjustSolidHeap(mSceneHeap); + for (u16 i = 0; i < 34; i++) { + u16 var1 = dPa_name::s_o_id[i]; + if (mSceneResMng->pEmtrRes->checkUserIndexDuplication(var1)) { + u32 var2; + if (var1 & 0x4000) { + var2 = 4; + } else if (var1 & 0x2000) { + var2 = 2; + } else { + var2 = 0; + } + newSimple(var1, var2); + } + } } /* 8007CE50-8007CF20 .text readScene__13dPa_control_cFUcPP21mDoDvdThd_toMainRam_c */ -bool dPa_control_c::readScene(u8, mDoDvdThd_toMainRam_c**) { - /* Nonmatching */ +bool dPa_control_c::readScene(u8 i_no, mDoDvdThd_toMainRam_c** param_2) { + if (i_no == 0xff) { + return false; + } + if (mCount++) { + JUT_ASSERT(1415, i_no != mSceneNo); + return true; + } + mSceneNo = i_no; + static char jpcName[32]; + sprintf(jpcName, "/res/Particle/Pscene%03d.jpc", i_no); + *param_2 = mDoDvdThd_toMainRam_c::create(jpcName, 0, NULL); + return true; } /* 8007CF20-8007CF98 .text createScene__13dPa_control_cFPCv */ @@ -457,8 +531,15 @@ void dPa_control_c::calcMenu() { } /* 8007D16C-8007D1DC .text draw__13dPa_control_cFP11JPADrawInfoUc */ -void dPa_control_c::draw(JPADrawInfo*, u8) { - /* Nonmatching */ +void dPa_control_c::draw(JPADrawInfo* param_1, u8 param_2) { + if (!mEmitterMng) { + return; + } + j3dSys.reinitGX(); + dKy_setLight_again(); + mEmitterMng->draw(param_1, param_2); + GXSetAlphaUpdate(GX_DISABLE); + GXSetNumIndStages(0); } /* 8007D1DC-8007D378 .text set__13dPa_control_cFUcUsPC4cXyzPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyz */ @@ -492,28 +573,61 @@ void dPa_control_c::setNormalStripes(u16, const cXyz*, const csXyz*, const cXyz* } /* 8007DB34-8007DBC4 .text newSimple__13dPa_control_cFUsUc */ -void dPa_control_c::newSimple(u16, u8) { +bool dPa_control_c::newSimple(u16 param_1, u8 param_2) { /* Nonmatching */ + if (mNumSimple >= 25) { + OSReport("\x1b[43;30m1エミッター登録数オーバー!!\n"); + return false; + } + JPABaseEmitter* emitter = mSimpleCallbacks[mNumSimple].create(mEmitterMng, param_1, param_2); + if (!emitter) { + return false; + } + mNumSimple++; + return true; } /* 8007DBC4-8007DC30 .text setSimple__13dPa_control_cFUsPC4cXyzUcRC8_GXColorRC8_GXColori */ -void dPa_control_c::setSimple(u16, const cXyz*, u8, const _GXColor&, const _GXColor&, int) { - /* Nonmatching */ +bool dPa_control_c::setSimple(u16 param_1, const cXyz* param_2, u8 param_3, const _GXColor& param_4, const _GXColor& param_5, int param_6) { + dPa_simpleEcallBack* simple = getSimple(param_1); + if (simple == NULL) { + return false; + } + return simple->set(param_2, param_3, param_4, param_5, param_6); } /* 8007DC30-8007DC6C .text getSimple__13dPa_control_cFUs */ -void dPa_control_c::getSimple(u16) { +dPa_simpleEcallBack* dPa_control_c::getSimple(u16 param_1) { /* Nonmatching */ + dPa_simpleEcallBack* simple = mSimpleCallbacks; + for (int i = 0; i < mNumSimple; i++, simple++) { + if (simple->mResID == param_1) { + return simple; + } + } + return NULL; } /* 8007DC6C-8007DC94 .text setup__19dPa_rippleEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_rippleEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { +void dPa_rippleEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { /* Nonmatching */ + param_1->setParticleCallBackPtr(&dPa_control_c::mRipplePcallBack); + mPos = param_2; + mRate = 1.0f; + mFlags |= 1; + mpBaseEmitter = param_1; } /* 8007DC94-8007DCE4 .text end__19dPa_rippleEcallBackFv */ void dPa_rippleEcallBack::end() { - /* Nonmatching */ + if (!mpBaseEmitter) { + return; + } + mpBaseEmitter->becomeInvalidEmitter(); + mpBaseEmitter->quitImmortalEmitter(); + mpBaseEmitter->setEmitterCallBackPtr(NULL); + mFlags |= 2; + mpBaseEmitter = NULL; } /* 8007DCE4-8007DD70 .text execute__19dPa_rippleEcallBackFP14JPABaseEmitter */ @@ -523,27 +637,38 @@ void dPa_rippleEcallBack::execute(JPABaseEmitter*) { /* 8007DD70-8007DDA8 .text draw__19dPa_rippleEcallBackFP14JPABaseEmitter */ void dPa_rippleEcallBack::draw(JPABaseEmitter*) { - /* Nonmatching */ + if (dPa_control_c::isStatus(1)) { + GXSetZMode(GX_FALSE, GX_NEVER, GX_FALSE); + } } /* 8007DDA8-8007DDB4 .text setup__25dPa_singleRippleEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_singleRippleEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { - /* Nonmatching */ +void dPa_singleRippleEcallBack::setup(JPABaseEmitter* param_1, const cXyz*, const csXyz*, s8) { + param_1->setParticleCallBackPtr(&dPa_control_c::mRipplePcallBack); } /* 8007DDB4-8007DE00 .text execute__25dPa_singleRippleEcallBackFP14JPABaseEmitter */ -void dPa_singleRippleEcallBack::execute(JPABaseEmitter*) { - /* Nonmatching */ +void dPa_singleRippleEcallBack::execute(JPABaseEmitter* param_1) { + GXColor c1, c2; + dKy_get_seacolor(&c1, &c2); + param_1->setGlobalPrmColor(c1.r, c1.g, c1.b); } /* 8007DE00-8007DE38 .text draw__25dPa_singleRippleEcallBackFP14JPABaseEmitter */ void dPa_singleRippleEcallBack::draw(JPABaseEmitter*) { - /* Nonmatching */ + if (dPa_control_c::isStatus(1)) { + GXSetZMode(GX_FALSE, GX_NEVER, GX_FALSE); + } } /* 8007DE38-8007DE94 .text execute__19dPa_ripplePcallBackFP14JPABaseEmitterP15JPABaseParticle */ -void dPa_ripplePcallBack::execute(JPABaseEmitter*, JPABaseParticle*) { +void dPa_ripplePcallBack::execute(JPABaseEmitter* param_1, JPABaseParticle* param_2) { /* Nonmatching */ + f32 tmp2; + cXyz tmp1(param_2->mPosition.x, param_2->mPosition.y, param_2->mPosition.z); + if (fopAcM_getWaterY(&tmp1, &tmp2)) { + param_2->mGlobalPosition.y = tmp2; + } } /* 8007DE94-8007E254 .text draw__19dPa_ripplePcallBackFP14JPABaseEmitterP15JPABaseParticle */ @@ -552,13 +677,26 @@ void dPa_ripplePcallBack::draw(JPABaseEmitter*, JPABaseParticle*) { } /* 8007E254-8007E288 .text setup__17dPa_waveEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_waveEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { +void dPa_waveEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { /* Nonmatching */ + mpPos = param_2; + mpRot = param_3; + mVel = 0.0f; + mVelFade2 = 1.0f; + mpBaseEmitter = param_1; + mMaxParticleVelocity = 10000.0f; + mState = 0; + mFadeTimer = 0; } /* 8007E288-8007E2BC .text remove__17dPa_waveEcallBackFv */ void dPa_waveEcallBack::remove() { - /* Nonmatching */ + if (!mpBaseEmitter) { + return; + } + mpBaseEmitter->setEmitterCallBackPtr(NULL); + mpBaseEmitter->becomeInvalidEmitter(); + mpBaseEmitter = NULL; } /* 8007E2BC-8007E484 .text executeAfter__17dPa_waveEcallBackFP14JPABaseEmitter */ @@ -611,13 +749,21 @@ void dPa_waveEcallBack::draw(JPABaseEmitter*) { } /* 8007E804-8007E81C .text setup__19dPa_splashEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_splashEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { - /* Nonmatching */ +void dPa_splashEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { + mpPos = param_2; + mpRot = param_3; + mpBaseEmitter = param_1; + mState = 0; } /* 8007E81C-8007E850 .text remove__19dPa_splashEcallBackFv */ void dPa_splashEcallBack::remove() { - /* Nonmatching */ + if (!mpBaseEmitter) { + return; + } + mpBaseEmitter->setEmitterCallBackPtr(NULL); + mpBaseEmitter->becomeInvalidEmitter(); + mpBaseEmitter = NULL; } /* 8007E850-8007E9B8 .text execute__19dPa_splashEcallBackFP14JPABaseEmitter */ @@ -626,8 +772,11 @@ void dPa_splashEcallBack::execute(JPABaseEmitter*) { } /* 8007E9B8-8007E9D4 .text setup__22dPa_cutTurnEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_cutTurnEcallBack_c::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { - /* Nonmatching */ +void dPa_cutTurnEcallBack_c::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { + mpBaseEmitter = param_1; + field_0x6 = 0; + field_0x5 = 0; + field_0x4 = 0xFF; } /* 8007E9D4-8007EAC4 .text executeAfter__22dPa_cutTurnEcallBack_cFP14JPABaseEmitter */ @@ -637,7 +786,13 @@ void dPa_cutTurnEcallBack_c::executeAfter(JPABaseEmitter*) { /* 8007EAC4-8007EB00 .text end__22dPa_cutTurnEcallBack_cFv */ void dPa_cutTurnEcallBack_c::end() { - /* Nonmatching */ + if (!mpBaseEmitter) { + return; + } + mpBaseEmitter->setEmitterCallBackPtr(NULL); + mpBaseEmitter->becomeInvalidEmitter(); + mpBaseEmitter = NULL; + field_0x5 = 1; } /* 8007EB00-8007F028 .text draw__20dPa_stripesEcallBackFP14JPABaseEmitter */ @@ -647,7 +802,7 @@ void dPa_stripesEcallBack::draw(JPABaseEmitter*) { /* 8007F028-8007F05C .text draw__19dPa_kageroEcallBackFP14JPABaseEmitter */ void dPa_kageroEcallBack::draw(JPABaseEmitter*) { - /* Nonmatching */ + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); } /* 8007F05C-8007F108 .text execute__22dPa_bombSmokeEcallBackFP14JPABaseEmitter */ @@ -661,13 +816,21 @@ void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3*) { } /* 8007F1A8-8007F1C0 .text setup__18dPa_trackEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_trackEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { - /* Nonmatching */ +void dPa_trackEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { + mpPos = param_2; + mState = 0; + mpRot = param_3; + mpBaseEmitter = param_1; } /* 8007F1C0-8007F1F4 .text remove__18dPa_trackEcallBackFv */ void dPa_trackEcallBack::remove() { - /* Nonmatching */ + if (!mpBaseEmitter) { + return; + } + mpBaseEmitter->setEmitterCallBackPtr(NULL); + mpBaseEmitter->becomeInvalidEmitter(); + mpBaseEmitter = NULL; } /* 8007F1F4-8007F3BC .text execute__18dPa_trackEcallBackFP14JPABaseEmitter */