summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2024-06-29 15:06:25 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2024-06-29 15:06:25 -0700
commitedb26111fc12895d9b9bde5a3dd2944cdfd4bca7 (patch)
tree08bd3bc2d92cd0fc6201523b3086385d77f5a8b3
parent8a77112521823569917b74b925f920fb64ad642b (diff)
d_wpot_water work
-rw-r--r--include/JSystem/JParticle/JPADraw.h1
-rw-r--r--include/JSystem/JParticle/JPAEmitter.h2
-rw-r--r--include/d/d_wpot_water.h24
-rw-r--r--src/d/d_wpot_water.cpp106
4 files changed, 113 insertions, 20 deletions
diff --git a/include/JSystem/JParticle/JPADraw.h b/include/JSystem/JParticle/JPADraw.h
index 6dd10bb8..90742e4b 100644
--- a/include/JSystem/JParticle/JPADraw.h
+++ b/include/JSystem/JParticle/JPADraw.h
@@ -67,6 +67,7 @@ public:
void zDrawParticle();
void zDrawChild();
void loadYBBMtx(MtxP);
+ bool isZDraw() { return field_0xc2 & 1; }
static JPADrawVisitorContainer vc;
static JPADrawClipBoard cb;
diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h
index e40be37c..a607e8f9 100644
--- a/include/JSystem/JParticle/JPAEmitter.h
+++ b/include/JSystem/JParticle/JPAEmitter.h
@@ -302,7 +302,7 @@ public:
void getgReRDirection(JGeometry::TVec3<f32>&) {}
void isChildDraw() {}
void isContinuousParticle() {}
- void isZDraw() {}
+ bool isZDraw() { return mDraw.isZDraw(); }
void loadTexture(u8, GXTexMapID) {}
void setEmitterRotation(const JGeometry::TVec3<s16>&) {}
void setGlobalParticleHeightScale(f32) {}
diff --git a/include/d/d_wpot_water.h b/include/d/d_wpot_water.h
index 2813369d..8d31a233 100644
--- a/include/d/d_wpot_water.h
+++ b/include/d/d_wpot_water.h
@@ -1,22 +1,30 @@
#ifndef D_WPOT_WATER_H
#define D_WPOT_WATER_H
-#include "dolphin/types.h"
#include "d/d_particle.h"
+#include "d/d_drawlist.h"
+#include "f_op/f_op_kankyo.h"
-class dWpotWater_c {
+class dWpotWater_EcallBack : public dPa_levelEcallBack {
+public:
+ void execute(JPABaseEmitter*) {}
+ void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) {}
+
+ void draw(JPABaseEmitter*);
+};
+
+class dWpotWater_c : public kankyo_class {
public:
inline s32 create();
inline BOOL draw();
inline BOOL execute();
-};
-class dWpotWater_EcallBack {
public:
- void execute(JPABaseEmitter*) {}
- void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) {}
-
- void draw(JPABaseEmitter*);
+ static dWpotWater_EcallBack mEcallback;
+
+public:
+ /* 0x0F8 */ JPABaseEmitter* emtr;
+ /* 0x0FC */ dDlst_alphaVolPacket mPacket;
};
#endif /* D_WPOT_WATER_H */
diff --git a/src/d/d_wpot_water.cpp b/src/d/d_wpot_water.cpp
index 2986f59e..e595c1da 100644
--- a/src/d/d_wpot_water.cpp
+++ b/src/d/d_wpot_water.cpp
@@ -4,34 +4,118 @@
//
#include "d/d_wpot_water.h"
-#include "f_op/f_op_kankyo.h"
+#include "d/d_bg_s_gnd_chk.h"
+#include "d/d_com_inf_game.h"
+#include "d/d_procname.h"
+#include "f_op/f_op_kankyo_mng.h"
/* 8023F5D0-8023F64C .text draw__20dWpotWater_EcallBackFP14JPABaseEmitter */
-void dWpotWater_EcallBack::draw(JPABaseEmitter*) {
- /* Nonmatching */
+void dWpotWater_EcallBack::draw(JPABaseEmitter* emtr) {
+ if (emtr->isZDraw()) {
+ GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
+ GXSetBlendMode(GX_BM_BLEND, GX_BL_DST_ALPHA, GX_BL_INV_DST_ALPHA, GX_LO_CLEAR);
+ GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE);
+ GXSetZCompLoc(GX_FALSE);
+ GXSetColorUpdate(GX_FALSE);
+ GXSetAlphaUpdate(GX_TRUE);
+ }
}
/* 8023F64C-8023F688 .text dWpotWater_Draw__FP12dWpotWater_c */
-static void dWpotWater_Draw(dWpotWater_c*) {
- /* Nonmatching */
+static BOOL dWpotWater_Draw(dWpotWater_c* i_this) {
+ dComIfGd_getXluList()->entryImm(&i_this->mPacket, 0);
+ return TRUE;
}
/* 8023F688-8023F740 .text dWpotWater_Execute__FP12dWpotWater_c */
-static void dWpotWater_Execute(dWpotWater_c*) {
+static BOOL dWpotWater_Execute(dWpotWater_c* i_this) {
/* Nonmatching */
+ mDoMtx_stack_c::transS(i_this->mPos.x, i_this->mPos.y + 50.0f, i_this->mPos.z);
+ mDoMtx_stack_c::scaleM(220.0f, 100.0f, 220.0f);
+ mDoMtx_concat(j3dSys.getViewMtx(), mDoMtx_stack_c::get(), i_this->mPacket.mtx);
+ if (i_this->emtr->isEnableDeleteEmitter()) {
+ i_this->emtr->quitImmortalEmitter();
+ fopKyM_Delete(i_this);
+ }
+ return TRUE;
}
/* 8023F740-8023F748 .text dWpotWater_IsDelete__FP12dWpotWater_c */
-static void dWpotWater_IsDelete(dWpotWater_c*) {
- /* Nonmatching */
+static BOOL dWpotWater_IsDelete(dWpotWater_c* i_this) {
+ return TRUE;
}
/* 8023F748-8023F750 .text dWpotWater_Delete__FP12dWpotWater_c */
-static void dWpotWater_Delete(dWpotWater_c*) {
- /* Nonmatching */
+static BOOL dWpotWater_Delete(dWpotWater_c* i_this) {
+ return TRUE;
}
/* 8023F750-8023FFCC .text dWpotWater_Create__FP12kankyo_class */
-static void dWpotWater_Create(kankyo_class*) {
+static s32 dWpotWater_Create(kankyo_class* i_k) {
/* Nonmatching */
+ dWpotWater_c* i_this = (dWpotWater_c*)i_k;
+
+ dBgS_GndChk chk2;
+ dBgS_ObjGndChk_Yogan chk;
+
+ s16 angle = 0;
+ for (s32 i = 0; i < 50; i++, angle += 10000) {
+ cXyz pos = i_this->mPos;
+ pos.x += 2.040816f * cM_ssin(angle);
+ pos.y += 100.0f;
+ pos.z += 2.040816f * cM_scos(angle);
+ chk.SetPos(&pos);
+ f32 ret = dComIfG_Bgsp()->GroundCross(&chk);
+ if (ret != -1000000000.0f) {
+ chk2.SetPos(&pos);
+ f32 ret2 = dComIfG_Bgsp()->GroundCross(&chk2);
+ if (chk.ChkSetInfo() && dComIfG_Bgsp()->GetAttributeCode(chk) && ret2 < ret) {
+ cXyz spawnPos = pos;
+ spawnPos.y = ret + 25.0f;
+ fopAcM_create(PROC_Obj_Magmarock, 0, &spawnPos, i_this->mParam);
+ break;
+ }
+ }
+ }
+
+ cXyz pos = i_this->mPos;
+ pos.y += 100.0f;
+ chk2.SetPos(&pos);
+ f32 ret = dComIfG_Bgsp()->GroundCross(&chk2);
+ i_this->mPos.y = ret;
+ if (ret != -1000000000.0f)
+ return cPhs_ERROR_e;
+
+ fopAcM_create(PROC_HITOBJ, 0, &i_this->mPos, i_this->mParam);
+ new(&i_this) dWpotWater_c();
+ dComIfGp_particle_set(0x8083, &i_this->mPos);
+ dComIfGp_particle_set(0x8084, &i_this->mPos);
+ i_this->emtr = dComIfGp_particle_set(0x8086, &i_this->mPos, NULL, NULL, 0xAA, &dWpotWater_c::mEcallback);
+ if (i_this->emtr == NULL)
+ return cPhs_ERROR_e;
+
+ i_this->emtr->becomeImmortalEmitter();
+ return cPhs_NEXT_e;
}
+
+kankyo_method_class l_dWpotWater_Method = {
+ (process_method_func)dWpotWater_Create,
+ (process_method_func)dWpotWater_Delete,
+ (process_method_func)dWpotWater_Execute,
+ (process_method_func)dWpotWater_IsDelete,
+ (process_method_func)dWpotWater_Draw,
+};
+
+kankyo_process_profile_definition g_profile_WPOT_WATER = {
+ fpcLy_CURRENT_e,
+ 2,
+ fpcPi_CURRENT_e,
+ PROC_WPOT_WATER,
+ &g_fpcLf_Method.base,
+ sizeof(dWpotWater_c),
+ 0,
+ 0,
+ &g_fopKy_Method,
+ 0x01CC,
+ &l_dWpotWater_Method,
+};