diff options
| author | robojumper <robojumper@gmail.com> | 2025-09-15 22:11:00 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-09-18 14:48:02 +0200 |
| commit | e9c2ac8f1a884db5724d326dbcedf9d3d2b35b53 (patch) | |
| tree | 06332da404d9ec8333d5dc621447769f7c637a52 /src | |
| parent | f475873a904e924816bdab0398f1a62646763de0 (diff) | |
More cursor stuff WIP
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/d_cs_game.cpp | 26 | ||||
| -rw-r--r-- | src/toBeSorted/d_emitter_callbacks.cpp | 61 |
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; +} |
