summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-09-15 22:11:00 +0200
committerrobojumper <robojumper@gmail.com>2025-09-18 14:48:02 +0200
commite9c2ac8f1a884db5724d326dbcedf9d3d2b35b53 (patch)
tree06332da404d9ec8333d5dc621447769f7c637a52 /src
parentf475873a904e924816bdab0398f1a62646763de0 (diff)
More cursor stuff WIP
Diffstat (limited to 'src')
-rw-r--r--src/d/d_cs_game.cpp26
-rw-r--r--src/toBeSorted/d_emitter_callbacks.cpp61
2 files changed, 85 insertions, 2 deletions
diff --git a/src/d/d_cs_game.cpp b/src/d/d_cs_game.cpp
index 7163184a..f9f7518c 100644
--- a/src/d/d_cs_game.cpp
+++ b/src/d/d_cs_game.cpp
@@ -143,7 +143,7 @@ int dCsGame_c::create() {
mCursor.setResAcc(&mMain2DResAcc);
mCursor.init();
- setSomething(0);
+ setNextCursorType(lytItemCursor_c::NONE);
mCursorType = 0;
mCursor.setField0x9A0(0);
@@ -255,7 +255,8 @@ bool dCsGame_c::lytItemCursor_c::doInit() {
mVacuum.init();
mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_VACUUM_LOCK].setAnimEnable(false);
- mEffectRelated.doSomething(&mEffects);
+ mEffects.setEmitterCallback(&mTrailCb);
+
mLyt.setPriority(0x88);
mLyt.calc();
@@ -551,6 +552,27 @@ void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_ToNormal() {}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_ToNormal() {}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::finalizeState_ToNormal() {}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::enter() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(4.0f);
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(true);
+ mAnm[MAIN_ANIM_HOOK_FIX].setFrame(0.0f);
+ mAnm[MAIN_ANIM_LOCK_LOOP].setAnimEnable(false);
+ mpLyt->getLayout()->Animate(0);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Normal);
+}
+
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::init() {
+ enter();
+ mStateMgr.changeState(StateID_Normal);
+}
+
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::execute() {
+ mStateMgr.executeState();
+}
+
+
void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::initializeState_Normal() {
mAnm[MAIN_ANIM_LOOP].setAnimEnable(true);
}
diff --git a/src/toBeSorted/d_emitter_callbacks.cpp b/src/toBeSorted/d_emitter_callbacks.cpp
new file mode 100644
index 00000000..b7c9d116
--- /dev/null
+++ b/src/toBeSorted/d_emitter_callbacks.cpp
@@ -0,0 +1,61 @@
+#include "toBeSorted/d_emitter_callbacks.h"
+#include "JSystem/JParticle/JPAEmitter.h"
+#include "common.h"
+#include "m/m_vec.h"
+
+dEmitterCallbackCursorTrail_c::dEmitterCallbackCursorTrail_c(u32 a, f32 b) : field_0x10(b), field_0x14(a) {
+ // TODO - TList
+}
+
+static void fn_8002B9D0(mVec3_c &newPos, const mVec3_c&, const mVec3_c&, const mVec3_c&, const mVec3_c&, f32) {
+ // TODO - ...
+ // Probably cubic B-Spline interpolation?
+}
+
+void dEmitterCallbackCursorTrail_c::executeAfter(JPABaseEmitter *emitter) {
+ mVec3_c newPos;
+ mVec3_c pos;
+ mVec3_c v2;
+ mVec3_c v1;
+
+ emitter->getGlobalTranslation(pos);
+
+ if (!emitter->checkStatus(JPAEmtrStts_StopCalc) && emitter->mMaxFrame == 0) {
+ v1 = (pos - posNMinus1) * 0.5f;
+ v2 = (posNMinus1 - posNMinus2) * 0.5f;
+ f32 dist = pos.distance(posNMinus1);
+ dist = dist * 0.1f * field_0x10;
+ if (field_0x14 != 0 && dist > field_0x14) {
+ dist = field_0x14;
+ }
+
+ if (dist > 1.0f) {
+ f32 f, step;
+ step = 1.0f / dist;
+ for (f = step; f < 1.0f; f += step) {
+ fn_8002B9D0(newPos, posNMinus1, v2, v1, pos, f);
+ JPABaseParticle *ptc = emitter->createParticle();
+ if (ptc != nullptr) {
+ ptc->setOffsetPosition(newPos);
+ }
+ }
+ }
+ }
+
+ if (emitter->getUserWork() == 0) {
+ posNMinus2 = posNMinus1;
+ posNMinus1 = pos;
+ }
+}
+
+void dEmitterCallbackCursorTrail_c::create(JPABaseEmitter *emitter) {
+ emitter->getGlobalTranslation(posNMinus1);
+ posNMinus2 = posNMinus1;
+}
+
+void dEmitterCallbackCursorTrail_c::vt_0x20(f32 x, f32 y) {
+ posNMinus2.x += x;
+ posNMinus2.z += y;
+ posNMinus1.x += x;
+ posNMinus1.z += y;
+}