summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-09-27 12:21:38 +0200
committerGitHub <noreply@github.com>2025-09-27 12:21:38 +0200
commite8fea3ebe5ee0056195834f836aa0c07a891da7d (patch)
tree3bfcb7adc19b8bb38173cebe490b34aa8da10bcf /src
parent4d2420e52f3340d1b0d02e391da3f5552a75ae8b (diff)
parent13acaee08772cc96ccbf0c9572ab93ee634181c8 (diff)
Merge pull request #252 from robojumper/more_cursor_stuff
Cursor Cleanup
Diffstat (limited to 'src')
-rw-r--r--src/d/d_cs_game.cpp990
-rw-r--r--src/d/d_cursor_hit_check.cpp2
-rw-r--r--src/d/d_pad.cpp6
-rw-r--r--src/d/d_stage_mgr.cpp6
-rw-r--r--src/d/lyt/d_lyt_game_over.cpp16
-rw-r--r--src/d/lyt/d_lyt_pause.cpp22
-rw-r--r--src/d/lyt/meter/d_lyt_meter.cpp2
-rw-r--r--src/toBeSorted/d_emitter.cpp5
-rw-r--r--src/toBeSorted/d_emitter_callbacks.cpp61
9 files changed, 968 insertions, 142 deletions
diff --git a/src/d/d_cs_game.cpp b/src/d/d_cs_game.cpp
index 7163184a..f16dfd7e 100644
--- a/src/d/d_cs_game.cpp
+++ b/src/d/d_cs_game.cpp
@@ -1,15 +1,51 @@
#include "d/d_cs_game.h"
+#include "common.h"
+#include "d/a/d_a_player.h"
#include "d/d_cs_base.h"
#include "d/d_cursor_hit_check.h"
+#include "d/d_gfx.h"
+#include "d/d_pad.h"
+#include "d/d_pad_nav.h"
#include "d/lyt/d2d.h"
+#include "d/lyt/d_lyt_map.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "f/f_base.h"
+#include "m/m_vec.h"
+#include "nw4r/lyt/lyt_pane.h"
+#include "s/s_StateInterfaces.hpp"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
+#include "toBeSorted/d_emitter.h"
+#include "toBeSorted/event_manager_util.h"
SPECIAL_BASE_PROFILE(C_GAME, dCsGame_c, fProfile::C_GAME, 0x2BF, 0x06F9);
-dCsGame_HIO_c sConfig;
+struct dCsGame_HIO_c {
+ dCsGame_HIO_c();
+ virtual ~dCsGame_HIO_c();
+
+ /* 0x04 */ f32 field_0x04;
+ /* 0x08 */ f32 field_0x08;
+ /* 0x0C */ f32 field_0x0C;
+ /* 0x10 */ f32 field_0x10;
+ /* 0x14 */ f32 field_0x14;
+ /* 0x18 */ f32 field_0x18;
+ /* 0x1C */ f32 field_0x1C;
+ /* 0x20 */ f32 field_0x20;
+ /* 0x24 */ f32 field_0x24;
+ /* 0x28 */ f32 field_0x28;
+ /* 0x2C */ f32 field_0x2C;
+ /* 0x30 */ s32 field_0x30;
+ /* 0x34 */ f32 field_0x34;
+ /* 0x38 */ f32 field_0x38;
+ /* 0x3C */ f32 field_0x3C;
+ /* 0x40 */ u8 field_0x40;
+ /* 0x41 */ u8 field_0x41;
+ /* 0x42 */ u8 field_0x42;
+
+ static const f32 sFloat1;
+ static const f32 sFloat2;
+};
dCsGame_HIO_c::dCsGame_HIO_c() {
field_0x04 = 0.0f;
@@ -18,8 +54,8 @@ dCsGame_HIO_c::dCsGame_HIO_c() {
field_0x10 = 0.0f;
field_0x14 = 3.0f;
field_0x20 = 10.0f;
- field_0x24 = 1.0f;
- field_0x28 = 6.0f;
+ field_0x24 = sFloat1;
+ field_0x28 = sFloat2;
field_0x18 = 1.3f;
field_0x1C = 0.5f;
field_0x42 = 0;
@@ -32,6 +68,11 @@ dCsGame_HIO_c::dCsGame_HIO_c() {
field_0x40 = 5;
}
+dCsGame_HIO_c::~dCsGame_HIO_c() {}
+
+static dCsGame_HIO_c sHio;
+dCsGame_c *dCsGame_c::sInstance;
+
STATE_DEFINE(dCsGame_c::lytItemCursor_c, Invisible);
STATE_DEFINE(dCsGame_c::lytItemCursor_c, Bow);
STATE_DEFINE(dCsGame_c::lytItemCursor_c, Dowsing);
@@ -72,57 +113,14 @@ STATE_DEFINE(dCsGame_c::lytItemCursor_c::lytVacuumCsr_c, ToLock);
STATE_DEFINE(dCsGame_c::lytItemCursor_c::lytVacuumCsr_c, Lock);
STATE_DEFINE(dCsGame_c::lytItemCursor_c::lytVacuumCsr_c, ToNormal);
-#define MAIN_ANIM_CURSOR 0
-#define MAIN_ANIM_DOWSE_IN_OUT 1
-#define MAIN_ANIM_LOOP 2
-#define MAIN_ANIM_HOOK_FIX 3
-#define MAIN_ANIM_VACUUM_LOCK 4
-#define MAIN_ANIM_LOCK_LOOP 5
-#define MAIN_ANIM_DOWSE_LOOP_1 6
-#define MAIN_ANIM_DOWSE_LOOP_2 7
-#define MAIN_ANIM_DOWSE_LOOP_3 8
-#define MAIN_ANIM_DOWSE_ZOOM 9
-#define MAIN_ANIM_ARROW_ON 10
-#define MAIN_ANIM_ARROW_CURSOR 11
-#define MAIN_ANIM_ARROW_EFFECT 12
-#define MAIN_ANIM_ARROW_KEEP 13
-#define MAIN_ANIM_ARROW_PEAK 14
-#define MAIN_ANIM_SLING_ON 15
-#define MAIN_ANIM_SLING_KEEP 16
-#define MAIN_ANIM_SLING_PEAK 17
-#define MAIN_ANIM_SLING_PEAK_RING 18
-#define MAIN_ANIM_SLING_OUT 19
-#define MAIN_ANIM_ARROW_LOOP 20
-#define MAIN_ANIM_LOOP_END 21
-#define MAIN_ANIM_LOOP_END_2 22
-
-static const d2d::LytBrlanMapping lytItemCursorMap[] = {
- { "itemCursor_00_cursor.brlan", "G_cursor_00"},
- { "itemCursor_00_dowseInOut.brlan", "G_dowseAll_00"},
- { "itemCursor_00_loop.brlan", "G_loop_00"},
- { "itemCursor_00_hookFix.brlan", "G_hookFix_00"},
- { "itemCursor_00_vacuumLock.brlan", "G_vacuumLock_00"},
- { "itemCursor_00_lockLoop.brlan", "G_lockLoop_00"},
- { "itemCursor_00_dowseLoop1.brlan", "G_dowseLoop_00"},
- { "itemCursor_00_dowseLoop2.brlan", "G_dowseLoop_01"},
- { "itemCursor_00_dowseLoop3.brlan", "G_auraLoop_00"},
- { "itemCursor_00_dowseZoom.brlan", "G_dowseAll_00"},
- { "itemCursor_00_arrowOn.brlan", "G_arrowOn_00"},
- { "itemCursor_00_arrowCursor.brlan", "G_arrowCursor_00"},
- { "itemCursor_00_arrowEffect.brlan", "G_arrowEffect_00"},
- { "itemCursor_00_arrowKeep.brlan", "G_arrowCursor_00"},
- { "itemCursor_00_arrowPeak.brlan", "G_arrowCursor_00"},
- { "itemCursor_00_slingOn.brlan", "G_slingEffect_00"},
- { "itemCursor_00_slingKeep.brlan", "G_slingGauge_00"},
- { "itemCursor_00_slingPeak.brlan", "G_slingAll_00"},
- {"itemCursor_00_slingPeakRing.brlan", "G_slingRing_00"},
- { "itemCursor_00_slingOut.brlan", "G_slingEffect_00"},
- { "itemCursor_00_loop2.brlan", "G_arrowLoop"},
- { "itemCursor_00_loopEnd.brlan", "G_loopEnd_00"},
- { "itemCursor_00_loopEnd2.brlan", "G_loopEnd_01"},
-};
-
-dCsGame_c::dCsGame_c() : mCursorType(0) {
+dCsGame_c::dCsGame_c()
+ : mCursorType(CS_NONE),
+ mCursorActive(false),
+ field_0x9A1(false),
+ field_0x9A2(false),
+ mActiveCursorType(mCursorType),
+ mNextCursorActive(false),
+ mNextCursorType(mCursorType) {
sInstance = this;
}
@@ -137,16 +135,16 @@ int dCsGame_c::create() {
mMain2DResAcc.attach(mainData, "");
mLyt1.setResAcc(&mCursorResAcc);
- mLyt1.dCsGameLytBase_0x10();
+ mLyt1.init();
mLyt2.setResAcc(&mCursorResAcc);
- mLyt2.dCsGameLytBase_0x10();
+ mLyt2.init();
mCursor.setResAcc(&mMain2DResAcc);
mCursor.init();
- setSomething(0);
- mCursorType = 0;
+ setNextCursorType(CS_NONE);
+ mCursorType = CS_NONE;
- mCursor.setField0x9A0(0);
+ mCursorActive = false;
mCursorIf.setCursorMask(2);
dCsMgr_c::GetInstance()->registCursor(&mCursorIf);
dCsBase_c::GetInstance()->setVisible(false);
@@ -155,22 +153,295 @@ int dCsGame_c::create() {
int dCsGame_c::doDelete() {
mCursor.remove();
- mLyt2.dCsGameLytBase_0x14();
- mLyt1.dCsGameLytBase_0x14();
+ mLyt2.remove();
+ mLyt1.remove();
dCsMgr_c::GetInstance()->unregistCursor(&mCursorIf);
mCursorResAcc.detach();
mMain2DResAcc.detach();
return SUCCEEDED;
}
-bool dCsGame_c::fn_801BF5E0() const {
- return mCursor.isCursorActive() & !fn_801BF630();
+#pragma push
+#pragma pool_data off
+int dCsGame_c::execute() {
+ mCursorType = mNextCursorType;
+ mCursorActive = mNextCursorActive;
+ if (isCursorActive() && mCursorType == CS_DOWSING) {
+ mCursor.mDowsing.moveEffectsIn();
+ } else {
+ mCursor.mDowsing.moveEffectsOut();
+ }
+
+ bool active = isCursorActive();
+ if (!active) {
+ if (!field_0x9A2) {
+ field_0x9A1 = active;
+ }
+ field_0x9A2 = false;
+ return SUCCEEDED;
+ }
+
+ if (active != field_0x9A1 || mCursorType != mActiveCursorType) {
+ switch (mCursorType) {
+ case CS_BOW: mCursor.changeState(lytItemCursor_c::StateID_Bow); break;
+ case CS_DOWSING: mCursor.changeState(lytItemCursor_c::StateID_Dowsing); break;
+ case CS_VACUUM: mCursor.changeState(lytItemCursor_c::StateID_Vacuum); break;
+ case CS_PACHINKO: mCursor.changeState(lytItemCursor_c::StateID_Pachinko); break;
+ case CS_HOOKSHOT: mCursor.changeState(lytItemCursor_c::StateID_HookShot); break;
+ case CS_PLAYERCAM: mCursor.changeState(lytItemCursor_c::StateID_PlayerCam); break;
+ default: break;
+ }
+
+ if (!field_0x9A2) {
+ mActiveCursorType = mCursorType;
+ field_0x9A1 = mCursorActive;
+ }
+ }
+
+ const mVec2_c &cursorPosition = mCursorIf.getCursorPos();
+
+ switch (mCursorType) {
+ case CS_POINTER_CAT: {
+ mLyt2.setPosition(mVec2_c(cursorPosition.x, cursorPosition.y + 10.0f));
+ mLyt2.execute();
+ break;
+ }
+ case CS_POINTER_DEF: {
+ mLyt1.setPosition(cursorPosition);
+ mLyt1.execute();
+ break;
+ }
+ case CS_BOW:
+ case CS_DOWSING:
+ case CS_VACUUM:
+ case CS_PACHINKO:
+ case CS_PLAYERCAM:
+ case CS_HOOKSHOT: {
+ mCursor.setPosition(cursorPosition);
+ mCursor.execute();
+ } break;
+ default: break;
+ }
+
+ mNextCursorActive = false;
+ field_0x9A2 = false;
+
+ return SUCCEEDED;
+}
+#pragma pop
+
+int dCsGame_c::draw() {
+ if (!isCursorActive() || isForcedHidden()) {
+ return SUCCEEDED;
+ }
+
+ switch (mCursorType) {
+ case CS_POINTER_CAT: mLyt2.draw(); break;
+ case CS_POINTER_DEF: mLyt1.draw(); break;
+ case CS_BOW:
+ case CS_DOWSING:
+ case CS_VACUUM:
+ case CS_PACHINKO:
+ case CS_PLAYERCAM:
+ case CS_HOOKSHOT: mCursor.draw(); break;
+ default: break;
+ }
+
+ return SUCCEEDED;
+}
+
+bool dCsGame_c::shouldDraw() const {
+ return isCursorActive() & !isForcedHidden();
+}
+
+bool dCsGame_c::isForcedHidden() const {
+ return (
+ EventManagerNotDrawControl0x80() && EventManagerNotSkyKeepPuzzle() && EventManagerNotInShop() &&
+ EventManagerNotInDeposit() && !EventManagerIsMapOpenAndMessage() && !EventManagerIsMapOpenAnd0x9008Eq10()
+ );
+}
+
+void dCsGame_c::setNextCursorType(CursorType_e cs) {
+ mNextCursorActive = true;
+ mNextCursorType = cs;
+}
+
+void dCsGame_c::noneSet() {
+ setNextCursorType(CS_NONE);
+}
+
+void dCsGame_c::pointerDefSet() {
+ if (dPadNav::isPointerVisible()) {
+ setNextCursorType(CS_POINTER_DEF);
+ }
+}
+
+void dCsGame_c::pointerCatSet() {
+ setNextCursorType(CS_POINTER_CAT);
+}
+
+void dCsGame_c::pachinkoSetCharging(bool charging, f32 progress) {
+ setNextCursorType(CS_PACHINKO);
+ mCursor.pachinkoSetCharging(charging, progress);
+}
+
+void dCsGame_c::bowStartDrawOrCharge(f32 f1, f32 f2) {
+ setNextCursorType(CS_BOW);
+ mCursor.bowStartDrawOrCharge(f1, f2);
+}
+
+void dCsGame_c::bowAimStart() {
+ setNextCursorType(CS_BOW);
+ mCursor.bowAimStart();
+}
+
+void dCsGame_c::bowReady() {
+ setNextCursorType(CS_BOW);
+ mCursor.bowReady();
+}
+
+void dCsGame_c::dowsingSetParams(const mAng &rot, f32 v1, f32 v2) {
+ setNextCursorType(CS_DOWSING);
+ mCursor.dowsingSetParams(rot, v1, v2);
+}
+
+void dCsGame_c::dowsingSetUnkWord(UNKWORD v) {
+ mCursor.dowsingSetUnkWord(v);
+}
+
+void dCsGame_c::vacuumSetNotLocked(f32 v) {
+ setNextCursorType(CS_VACUUM);
+ mCursor.vacuumSetUnkFloat(v);
+ mCursor.vacuumSetLocked(false);
+}
+
+void dCsGame_c::vacuumSetLocked() {
+ setNextCursorType(CS_VACUUM);
+ mCursor.vacuumSetLocked(true);
}
-void dCsGame_c::setNextCursorType(lytItemCursor_c::CursorType_e cs) {
- mCursor.setNextCursorType(cs);
+void dCsGame_c::clawshotsSetLocked(bool locked) {
+ setNextCursorType(CS_HOOKSHOT);
+ mCursor.clawshotsSetLocked(locked);
}
+void dCsGame_c::setCursorTypePlayerCam() {
+ setNextCursorType(CS_PLAYERCAM);
+}
+
+mVec2_c &dCursorInterfaceGame_c::getCursorPos() {
+ // TODO explain this math
+ mVec2_c pos = dPad::getDpdPosScreen();
+ f32 f0 = dGfx_c::getWidth4x3() / dGfx_c::getWidth16x9F() * 368.0f;
+ f32 f1 = sHio.field_0x04;
+ f32 f2 = sHio.field_0x08 + 6.0f;
+ f32 f3 = sHio.field_0x10 + 4.0f;
+ f32 f4 = sHio.field_0x0C + -15.0f;
+
+ if (dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance()->isOpenMaybe()) {
+ if (pos.x < -f0 + f4) {
+ pos.x = -f0 + f4;
+ }
+ if (pos.x > f0 + f3) {
+ pos.x = f0 + f3;
+ }
+ if (pos.y < f1 + -209.0f) {
+ pos.y = f1 + -209.0f;
+ }
+ if (pos.y < f2 + -209.0f) {
+ pos.y = f2 + -209.0f;
+ }
+ }
+
+ field_0x14 = pos;
+
+ return field_0x14;
+}
+
+bool dCsGameLytBase2_c::init() {
+ loadResAcc();
+ build();
+ return true;
+}
+
+bool dCsGameLytBase2_c::execute() {
+ nw4r::lyt::Pane *p = getLyt()->getLayout()->GetRootPane();
+ mVec3_c pos;
+ pos.x = mPosition.x;
+ pos.y = mPosition.y;
+ pos.z = 0.0f;
+ p->SetTranslate(pos);
+ getLyt()->calc();
+ return true;
+}
+
+bool dCsGameLytBase2_c::draw() {
+ getLyt()->addToDrawList();
+ return true;
+}
+
+void dCsGameLyt1_c::loadResAcc() {
+ mLyt.setResAcc(mpResAcc);
+}
+
+void dCsGameLyt1_c::build() {
+ mLyt.build("P1_Def.brlyt", nullptr);
+}
+
+bool dCsGameLyt1_c::init() {
+ dCsGameLytBase2_c::init();
+ mLyt.setPriority(0x88);
+ mLyt.calc();
+ return true;
+}
+
+bool dCsGameLyt1_c::remove() {
+ return true;
+}
+
+void dCsGameLyt2_c::loadResAcc() {
+ mLyt.setResAcc(mpResAcc);
+}
+
+void dCsGameLyt2_c::build() {
+ mLyt.build("P1_Cat.brlyt", nullptr);
+}
+
+bool dCsGameLyt2_c::init() {
+ dCsGameLytBase2_c::init();
+ mLyt.setPriority(0x88);
+ mLyt.calc();
+ return true;
+}
+
+bool dCsGameLyt2_c::remove() {
+ return true;
+}
+
+#define MAIN_ANIM_CURSOR 0
+#define MAIN_ANIM_DOWSE_IN_OUT 1
+#define MAIN_ANIM_LOOP 2
+#define MAIN_ANIM_HOOK_FIX 3
+#define MAIN_ANIM_VACUUM_LOCK 4
+#define MAIN_ANIM_LOCK_LOOP 5
+#define MAIN_ANIM_DOWSE_LOOP_1 6
+#define MAIN_ANIM_DOWSE_LOOP_2 7
+#define MAIN_ANIM_DOWSE_LOOP_3 8
+#define MAIN_ANIM_DOWSE_ZOOM 9
+#define MAIN_ANIM_ARROW_ON 10
+#define MAIN_ANIM_ARROW_CURSOR 11
+#define MAIN_ANIM_ARROW_EFFECT 12
+#define MAIN_ANIM_ARROW_KEEP 13
+#define MAIN_ANIM_ARROW_PEAK 14
+#define MAIN_ANIM_SLING_ON 15
+#define MAIN_ANIM_SLING_KEEP 16
+#define MAIN_ANIM_SLING_PEAK 17
+#define MAIN_ANIM_SLING_PEAK_RING 18
+#define MAIN_ANIM_SLING_OUT 19
+#define MAIN_ANIM_ARROW_LOOP 20
+#define MAIN_ANIM_LOOP_END 21
+#define MAIN_ANIM_LOOP_END_2 22
+
void dCsGame_c::lytItemCursor_c::initializeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::executeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::finalizeState_Invisible() {}
@@ -180,7 +451,7 @@ void dCsGame_c::lytItemCursor_c::initializeState_Bow() {
mBow.select();
}
void dCsGame_c::lytItemCursor_c::executeState_Bow() {
- mCursorTrail = 1;
+ mDrawCursorTrailThisFrame = true;
mBow.execute();
}
void dCsGame_c::lytItemCursor_c::finalizeState_Bow() {}
@@ -197,14 +468,14 @@ void dCsGame_c::lytItemCursor_c::initializeState_Vacuum() {
mVacuum.enter();
}
void dCsGame_c::lytItemCursor_c::executeState_Vacuum() {
- mCursorTrail = 1;
+ mDrawCursorTrailThisFrame = true;
mVacuum.execute();
}
void dCsGame_c::lytItemCursor_c::finalizeState_Vacuum() {}
void dCsGame_c::lytItemCursor_c::initializeState_Pachinko() {}
void dCsGame_c::lytItemCursor_c::executeState_Pachinko() {
- mCursorTrail = 1;
+ mDrawCursorTrailThisFrame = true;
mPachinko.execute();
}
void dCsGame_c::lytItemCursor_c::finalizeState_Pachinko() {}
@@ -213,7 +484,7 @@ void dCsGame_c::lytItemCursor_c::initializeState_HookShot() {
mCrawShot.enter();
}
void dCsGame_c::lytItemCursor_c::executeState_HookShot() {
- mCursorTrail = 1;
+ mDrawCursorTrailThisFrame = true;
mCrawShot.execute();
}
void dCsGame_c::lytItemCursor_c::finalizeState_HookShot() {}
@@ -225,28 +496,107 @@ void dCsGame_c::lytItemCursor_c::executeState_PlayerCam() {
}
void dCsGame_c::lytItemCursor_c::finalizeState_PlayerCam() {}
+// TODO - why are these here?
+const f32 dCsGame_HIO_c::sFloat1 = 1.0f;
+const f32 dCsGame_HIO_c::sFloat2 = 6.0f;
+
void dCsGame_c::lytItemCursor_c::changeState(const sFStateID_c<lytItemCursor_c> &newState) {
mStateMgr.changeState(newState);
}
-bool dCsGame_c::lytItemCursor_c::doInit() {
+void dCsGame_c::lytItemCursor_c::bowStartDrawOrCharge(f32 f1, f32 f2) {
+ mBow.startDrawOrCharge(f1, f2);
+}
+
+void dCsGame_c::lytItemCursor_c::bowAimStart() {
+ mBow.aimStart();
+}
+
+void dCsGame_c::lytItemCursor_c::bowReady() {
+ mBow.ready();
+}
+
+void dCsGame_c::lytItemCursor_c::pachinkoSetCharging(bool charging, f32 progress) {
+ mPachinko.setCharging(charging, progress);
+}
+
+void dCsGame_c::lytItemCursor_c::dowsingSetParams(const mAng &rot, f32 v1, f32 v2) {
+ mDowsing.setParams(rot, v1, v2);
+}
+
+void dCsGame_c::lytItemCursor_c::dowsingSetUnkWord(UNKWORD v) {
+ mDowsing.setUnkWord(v);
+}
+
+void dCsGame_c::lytItemCursor_c::vacuumSetUnkFloat(f32 v) {
+ mVacuum.setUnkFloat(v);
+}
+
+void dCsGame_c::lytItemCursor_c::vacuumSetLocked(bool locked) {
+ mVacuum.setLocked(locked);
+}
+
+void dCsGame_c::lytItemCursor_c::clawshotsSetLocked(bool locked) {
+ mCrawShot.setLocked(locked);
+}
+
+void dCsGame_c::lytItemCursor_c::loadResAcc() {
+ mLyt.setResAcc(mpResAcc);
+}
+
+void dCsGame_c::lytItemCursor_c::build() {
+ mLyt.build("itemCursor_00.brlyt", nullptr);
+}
+
+static const d2d::LytBrlanMapping lytItemCursorMap[] = {
+ { "itemCursor_00_cursor.brlan", "G_cursor_00"},
+ { "itemCursor_00_dowseInOut.brlan", "G_dowseAll_00"},
+ { "itemCursor_00_loop.brlan", "G_loop_00"},
+ { "itemCursor_00_hookFix.brlan", "G_hookFix_00"},
+ { "itemCursor_00_vacuumLock.brlan", "G_vacuumLock_00"},
+ { "itemCursor_00_lockLoop.brlan", "G_lockLoop_00"},
+ { "itemCursor_00_dowseLoop1.brlan", "G_dowseLoop_00"},
+ { "itemCursor_00_dowseLoop2.brlan", "G_dowseLoop_01"},
+ { "itemCursor_00_dowseLoop3.brlan", "G_auraLoop_00"},
+ { "itemCursor_00_dowseZoom.brlan", "G_dowseAll_00"},
+ { "itemCursor_00_arrowOn.brlan", "G_arrowOn_00"},
+ { "itemCursor_00_arrowCursor.brlan", "G_arrowCursor_00"},
+ { "itemCursor_00_arrowEffect.brlan", "G_arrowEffect_00"},
+ { "itemCursor_00_arrowKeep.brlan", "G_arrowCursor_00"},
+ { "itemCursor_00_arrowPeak.brlan", "G_arrowCursor_00"},
+ { "itemCursor_00_slingOn.brlan", "G_slingEffect_00"},
+ { "itemCursor_00_slingKeep.brlan", "G_slingGauge_00"},
+ { "itemCursor_00_slingPeak.brlan", "G_slingAll_00"},
+ {"itemCursor_00_slingPeakRing.brlan", "G_slingRing_00"},
+ { "itemCursor_00_slingOut.brlan", "G_slingEffect_00"},
+ { "itemCursor_00_loop2.brlan", "G_arrowLoop"},
+ { "itemCursor_00_loopEnd.brlan", "G_loopEnd_00"},
+ { "itemCursor_00_loopEnd2.brlan", "G_loopEnd_01"},
+};
+
+bool dCsGame_c::lytItemCursor_c::init() {
mEffects.init(dCsGame_c::sInstance);
- preInit();
+ dCsGameLytBase2_c::init();
mLyt.setPriority(0x88);
mLyt.calc();
mAnm.init(mAnmGroups.tmp.mAnmGroups, lytItemCursorMap, 0x17, mpResAcc, mLyt.getLayout());
+ // TODO - nonmatching
for (int i = 0; i < 0x17; i++) {
- mAnmGroups.tmp.mAnmGroups[i].bind(false);
- mAnmGroups.tmp.mAnmGroups[i].setAnimEnable(false);
+ mAnmGroups[i].bind(false);
+ mAnmGroups[i].setAnimEnable(false);
}
+ // TODO - why are these temps so weird?
+
mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_CURSOR].setAnimEnable(true);
- mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_LOOP].setFrame(0.0f);
- mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_LOOP].setAnimEnable(true);
+ d2d::AnmGroup_c &mainLoop = mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_LOOP];
+ mainLoop.setFrame(0.0f);
+ mainLoop.setAnimEnable(true);
mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_ARROW_LOOP].setAnimEnable(true);
- mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_ARROW_LOOP].setFrame(0.0f);
+ d2d::AnmGroup_c &arrowLoop = mAnmGroups.tmp.mAnmGroups[MAIN_ANIM_ARROW_LOOP];
+ arrowLoop.setFrame(0.0f);
mBow.init();
mDowsing.init();
@@ -255,21 +605,51 @@ 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();
- mAnmGroups.tmp.mAnmGroups[0x14].setAnimEnable(false);
+ arrowLoop.setAnimEnable(false);
mStateMgr.changeState(StateID_Invisible);
return true;
}
+bool dCsGame_c::lytItemCursor_c::remove() {
+ mAnm.remove();
+ return true;
+}
+
+bool dCsGame_c::lytItemCursor_c::execute() {
+ mPositionThisFrame.x = mPosition.x;
+ mPositionThisFrame.y = mPosition.y;
+ mPositionThisFrame.z = 0.0f;
+
+ mDrawCursorTrailThisFrame = false;
+ mAnmGroups[MAIN_ANIM_LOOP].setAnimEnable(true);
+ mStateMgr.executeState();
+
+ if (dCsGame_c::GetInstance()->shouldDraw() && mDrawCursorTrailThisFrame) {
+ f32 sqDist = mPositionThisFrame.squareDistance(mPositionLastFrame);
+ if (sqDist > sHio.field_0x34 * sHio.field_0x34 ||
+ (mEffects.hasEmitters() && sqDist > sHio.field_0x38 * sHio.field_0x38)) {
+ mEffects.createContinuousUIEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_31_, mPositionThisFrame, nullptr, nullptr, nullptr, nullptr
+ );
+ }
+ }
+
+ dCsGameLytBase2_c::execute();
+ mPositionLastFrame = mPositionThisFrame;
+ return true;
+}
+
void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::initializeState_NotFind() {}
void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::executeState_NotFind() {
- if (field_0xC0 < 0.999f) {
+ if (field_0xC0 < 0.9999f) {
mAnm[MAIN_ANIM_DOWSE_IN_OUT].setAnimEnable(true);
mAnm[MAIN_ANIM_DOWSE_IN_OUT].setForward();
- mStateMgr.changeState(StateID_Find);
+ mStateMgr.changeState(StateID_ToFind);
}
}
void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::finalizeState_NotFind() {}
@@ -279,8 +659,7 @@ void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::executeState_ToFind() {
if (mAnm[MAIN_ANIM_DOWSE_IN_OUT].isEndReached()) {
mAnm[MAIN_ANIM_DOWSE_IN_OUT].setAnimEnable(false);
mAnm[MAIN_ANIM_DOWSE_ZOOM].setAnimEnable(true);
- // TODO
- mAnm[MAIN_ANIM_DOWSE_ZOOM].setRatio(1.0f - field_0xC0);
+ mAnm[MAIN_ANIM_DOWSE_ZOOM].setFrame((1.0f - field_0xC0) * mAnm[MAIN_ANIM_DOWSE_ZOOM].getLastFrame());
mpLyt->calc();
mStateMgr.changeState(StateID_Find);
} else {
@@ -293,11 +672,11 @@ void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::initializeState_Find() {}
void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::executeState_Find() {
mAnm[MAIN_ANIM_DOWSE_LOOP_2].setAnimEnable(true);
mAnm[MAIN_ANIM_DOWSE_ZOOM].setAnimEnable(true);
- // TODO
- mAnm[MAIN_ANIM_DOWSE_ZOOM].setRatio(1.0f - field_0xC0);
+ f32 f = mAnm[MAIN_ANIM_DOWSE_ZOOM].getLastFrame();
+ mAnm[MAIN_ANIM_DOWSE_ZOOM].setFrame((1.0f - field_0xC0) * f);
if (field_0xC0 > 0.9999f) {
- mAnm[MAIN_ANIM_DOWSE_ZOOM].setToEnd();
+ mAnm[MAIN_ANIM_DOWSE_ZOOM].setFrame(f);
mpLyt->calc();
mAnm[MAIN_ANIM_DOWSE_IN_OUT].setAnimEnable(true);
mAnm[MAIN_ANIM_DOWSE_ZOOM].setAnimEnable(false);
@@ -334,6 +713,139 @@ void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::executeState_ToNotFind() {
}
void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::finalizeState_ToNotFind() {}
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::enter() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(3.0f);
+ mAnm[MAIN_ANIM_DOWSE_IN_OUT].setFrame(0.0f);
+ mAnm[MAIN_ANIM_DOWSE_IN_OUT].setAnimEnable(true);
+ mAnm[MAIN_ANIM_DOWSE_ZOOM].setAnimEnable(false);
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(false);
+ mAnm[MAIN_ANIM_DOWSE_LOOP_1].setAnimEnable(false);
+ mAnm[MAIN_ANIM_DOWSE_LOOP_2].setAnimEnable(false);
+ mAnm[MAIN_ANIM_DOWSE_LOOP_3].setAnimEnable(false);
+
+ mpLyt->calc();
+
+ mAnm[MAIN_ANIM_DOWSE_ZOOM].setAnimEnable(false);
+ mAnm[MAIN_ANIM_DOWSE_IN_OUT].setAnimEnable(false);
+ mAnm[MAIN_ANIM_DOWSE_LOOP_1].setAnimEnable(true);
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::setParams(const mAng &rot, f32 v1, f32 v2) {
+ field_0xC0 = v1;
+ if (field_0xC0 <= 0.999f) {
+ mRotZ = rot;
+ }
+
+ f32 f2 = (sHio.field_0x18 - sHio.field_0x1C) * 0.05f;
+ if (v2 < (field_0xCC - f2)) {
+ field_0xD0 = (field_0xCC - v2);
+ } else if (v2 > (field_0xCC + f2)) {
+ field_0xD0 = (field_0xCC - v2);
+ }
+
+ field_0xCC = v2;
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::setUnkWord(UNKWORD v) {
+ field_0xC4 = v;
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::moveEffectsIn() {
+ if (mAlpha < sHio.field_0x40) {
+ mAlpha++;
+ }
+ updateEffects();
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::moveEffectsOut() {
+ if (mAlpha > 0) {
+ mAlpha--;
+ updateEffects();
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::updateEffects() {
+ u8 alpha = (f32)mAlpha / (f32)sHio.field_0x40 * 255.0f;
+ if (alpha != 0) {
+ mVec2_c csPos = dPad::getDpdPosScreen();
+ mVec3_c effectPos(csPos.x, csPos.y, 0.0f);
+ mVec3_c effectScale(sHio.field_0x3C, sHio.field_0x3C, 1.0f);
+ mEffects1.createContinuousUIEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_725_, mVec3_c::Zero, nullptr, nullptr, nullptr, nullptr
+ );
+ mEffects2.createContinuousUIEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_726_, effectPos, &mAng3_c::Zero, &effectScale, nullptr, nullptr
+ );
+ mEffects1.setGlobalAlpha(alpha);
+ mEffects2.setGlobalAlpha(alpha);
+ } else {
+ mEffects1.remove(true);
+ mEffects2.remove(true);
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::init() {
+ mpDowsingPane = mpLyt->findPane("N_dowsing_00");
+ mpRingAllPane = mpLyt->findPane("N_ringAll_00");
+ mEffects1.init(dCsGame_c::GetInstance());
+ mEffects2.init(dCsGame_c::GetInstance());
+ field_0xC0 = 0.0f;
+ enter();
+ mStateMgr.changeState(StateID_NotFind);
+}
+
+void dCsGame_c::lytItemCursor_c::lytDowsingCsr_c::execute() {
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(false);
+ f32 f2 = (sHio.field_0x18 - sHio.field_0x1C) * 0.95f;
+ if (field_0xD0 > 0.0f) {
+ field_0xD0 -= f2 / sHio.field_0x14;
+ if (field_0xD0 < 0.0f) {
+ field_0xD0 = 0.0f;
+ }
+ } else {
+ field_0xD0 += f2 / sHio.field_0x14;
+ if (field_0xD0 > 0.0f) {
+ field_0xD0 = 0.0f;
+ }
+ }
+
+ f32 scale = sHio.field_0x1C + (sHio.field_0x18 - sHio.field_0x1C) * (field_0xCC + field_0xD0);
+ mpDowsingPane->SetScale(mVec2_c(scale, scale));
+
+ mVec3_c rot = mpRingAllPane->GetRotate();
+ rot.z = -mRotZ.degree2();
+ mpRingAllPane->SetRotate(rot);
+
+ mStateMgr.executeState();
+
+ if (mAnm[MAIN_ANIM_DOWSE_LOOP_1].isEnabled()) {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_1].play();
+ }
+
+ if (mAnm[MAIN_ANIM_DOWSE_LOOP_2].isEnabled()) {
+ if (mAnm[MAIN_ANIM_DOWSE_LOOP_2].getFrame() >= 60.0f) {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_2].setFrame(60.0f);
+ } else {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_2].play();
+ }
+ }
+
+ if (mAnm[MAIN_ANIM_DOWSE_LOOP_3].isEnabled()) {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_3].play();
+ if (mAnm[MAIN_ANIM_DOWSE_LOOP_3].isEndReached()) {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_3].setAnimEnable(false);
+ }
+ }
+
+ const sStateIDIf_c *state = mStateMgr.getStateID();
+
+ if (*state == StateID_NotFind || *state == StateID_ToNotFind) {
+ mAnm[MAIN_ANIM_DOWSE_LOOP_2].setFrame(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_DOWSE_LOOP_2].setAnimEnable(false);
+ }
+}
+
void dCsGame_c::lytItemCursor_c::lytBowCsr_c::initializeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::lytBowCsr_c::executeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::lytBowCsr_c::finalizeState_Invisible() {}
@@ -385,7 +897,11 @@ void dCsGame_c::lytItemCursor_c::lytBowCsr_c::initializeState_Draw() {
mAnm[MAIN_ANIM_ARROW_LOOP].setAnimEnable(false);
}
void dCsGame_c::lytItemCursor_c::lytBowCsr_c::executeState_Draw() {
- // TODO ???
+ if (!mpPanesArrowRing[0]->IsVisible()) {
+ mpPanesArrowRing[0]->SetVisible(true);
+ mpPanesArrowRing[1]->SetVisible(true);
+ }
+
mAnm[MAIN_ANIM_ARROW_CURSOR].setAnimEnable(true);
f32 t = field_0x50;
if (t < 0.0001f) {
@@ -393,7 +909,8 @@ void dCsGame_c::lytItemCursor_c::lytBowCsr_c::executeState_Draw() {
} else if (t > 0.9999f) {
t = 1.0f;
}
- mAnm[MAIN_ANIM_ARROW_CURSOR].setBackwardsRatio(t);
+ f32 f = mAnm[MAIN_ANIM_ARROW_CURSOR].getLastFrame();
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setFrame(f - (t * f));
if (t <= 0.0f) {
mAnm[MAIN_ANIM_ARROW_CURSOR].setAnimEnable(false);
mStateMgr.changeState(StateID_Charge);
@@ -427,32 +944,133 @@ void dCsGame_c::lytItemCursor_c::lytBowCsr_c::executeState_Charge() {
}
void dCsGame_c::lytItemCursor_c::lytBowCsr_c::finalizeState_Charge() {}
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::enter() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(2.0f);
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(false);
+ mAnm[MAIN_ANIM_ARROW_LOOP].setAnimEnable(false);
+
+ mAnm[MAIN_ANIM_ARROW_PEAK].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_PEAK].setFrame(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_ARROW_PEAK].setAnimEnable(false);
+
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_KEEP].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_KEEP].setFrame(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_ARROW_KEEP].setAnimEnable(false);
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setAnimEnable(false);
+
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setFrame(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setAnimEnable(false);
+
+ mAnm[MAIN_ANIM_ARROW_ON].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_ON].setFrame(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_ARROW_ON].setAnimEnable(false);
+
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(true);
+}
+
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::init() {
+ mpPanesArrowRing[0] = mpLyt->findPane("N_arrowRing_00");
+ mpPanesArrowRing[1] = mpLyt->findPane("N_arrowRingS_00");
+ mpPanesArrowRing[2] = mpLyt->findPane("N_arrowRing_01");
+ mpPanesArrowRing[3] = mpLyt->findPane("N_arrowRingS_02");
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_CURSOR].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_ON].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_ON].setAnimEnable(true);
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setAnimEnable(false);
+ mAnm[MAIN_ANIM_ARROW_KEEP].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_KEEP].setAnimEnable(false);
+ mAnm[MAIN_ANIM_ARROW_PEAK].setFrame(0.0f);
+ mAnm[MAIN_ANIM_ARROW_PEAK].setAnimEnable(false);
+
+ mStateMgr.changeState(StateID_Select);
+}
+
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::execute() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(2.0f);
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(false);
+ mStateMgr.executeState();
+
+ if (mAnm[MAIN_ANIM_ARROW_KEEP].isEnabled()) {
+ mAnm[MAIN_ANIM_ARROW_KEEP].setFrame(field_0x54 * mAnm[MAIN_ANIM_ARROW_KEEP].getLastFrame());
+ }
+
+ if (mAnm[MAIN_ANIM_ARROW_EFFECT].isEnabled()) {
+ mAnm[MAIN_ANIM_ARROW_EFFECT].play();
+ if (mAnm[MAIN_ANIM_ARROW_EFFECT].isEndReached()) {
+ mAnm[MAIN_ANIM_ARROW_EFFECT].setAnimEnable(false);
+ }
+ }
+
+ if (mAnm[MAIN_ANIM_ARROW_PEAK].isEnabled()) {
+ mAnm[MAIN_ANIM_ARROW_PEAK].play();
+ }
+
+ if (mAnm[MAIN_ANIM_LOOP].isEnabled()) {
+ mAnm[MAIN_ANIM_LOOP].play();
+ }
+
+ if (mAnm[MAIN_ANIM_ARROW_LOOP].isEnabled()) {
+ mAnm[MAIN_ANIM_ARROW_LOOP].play();
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::startDrawOrCharge(f32 f1, f32 f2) {
+ field_0x50 = f1;
+ field_0x54 = f2;
+ const sStateIDIf_c *currentStateId = mStateMgr.getStateID();
+ if (*currentStateId != StateID_Draw && *currentStateId != StateID_Charge) {
+ mStateMgr.changeState(StateID_Draw);
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::aimStart() {
+ if (*mStateMgr.getStateID() != StateID_AimStart) {
+ enter();
+ mStateMgr.changeState(StateID_AimStart);
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytBowCsr_c::ready() {
+ if (*mStateMgr.getStateID() != StateID_Ready) {
+ enter();
+ mStateMgr.changeState(StateID_Ready);
+ }
+}
+
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::finalizeState_Invisible() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_Select() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_Select() {
- if (!field_0x50) {
- return;
+ if (mIsCharging) {
+ mStateMgr.changeState(StateID_ToDraw);
}
- mStateMgr.changeState(StateID_ToDraw);
}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::finalizeState_Select() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_ToDraw() {
mAnm[MAIN_ANIM_SLING_ON].setAnimEnable(true);
mAnm[MAIN_ANIM_SLING_ON].setFrame(0.0f);
- field_0x58 = 0.0f;
+ mSavedOnProgress = 0.0f;
}
-extern "C" int getCurrentSlingshotType();
+
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_ToDraw() {
- if (field_0x50) {
+ if (mIsCharging) {
if (mAnm[MAIN_ANIM_SLING_ON].isEndReached()) {
mpLyt->calc();
mAnm[MAIN_ANIM_SLING_ON].setAnimEnable(false);
- if (getCurrentSlingshotType() == 2) {
- field_0x58 = field_0x54;
+ if (dAcPy_c::getCurrentSlingshotType() == 2) {
+ mSavedOnProgress = mDrawProgress;
mStateMgr.changeState(StateID_Charge);
} else {
mStateMgr.changeState(StateID_Draw);
@@ -469,10 +1087,9 @@ void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::finalizeState_ToDraw() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_Draw() {}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_Draw() {
- if (field_0x50) {
- return;
+ if (!mIsCharging) {
+ mStateMgr.changeState(StateID_Out);
}
- mStateMgr.changeState(StateID_Out);
}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::finalizeState_Draw() {}
@@ -497,15 +1114,16 @@ void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_Charge() {
mpLyt->calc();
}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_Charge() {
- if (field_0x50) {
- if (field_0x54 >= 1.0f) {
+ if (mIsCharging) {
+ if (mDrawProgress >= 1.0f) {
mAnm[MAIN_ANIM_SLING_KEEP].setToEnd();
mpLyt->calc();
mAnm[MAIN_ANIM_SLING_KEEP].setAnimEnable(false);
mStateMgr.changeState(StateID_ChargeFull);
} else {
- // TODO we need a second load of anm control here
- mAnm[MAIN_ANIM_SLING_KEEP].setRatio((field_0x54 - field_0x58) / (1.0f - field_0x58));
+ f32 frame = ((mDrawProgress - mSavedOnProgress) / (1.0f - mSavedOnProgress));
+ f32 len = mAnm[MAIN_ANIM_SLING_KEEP].getLastFrame();
+ mAnm[MAIN_ANIM_SLING_KEEP].setFrame(len * frame);
}
} else {
mAnm[MAIN_ANIM_SLING_KEEP].setAnimEnable(false);
@@ -521,7 +1139,7 @@ void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::initializeState_ChargeFull()
mAnm[MAIN_ANIM_SLING_PEAK_RING].setFrame(0.0f);
}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_ChargeFull() {
- if (field_0x50) {
+ if (mIsCharging) {
if (mAnm[MAIN_ANIM_SLING_PEAK].isEndReached()) {
mpLyt->calc();
} else if (mAnm[MAIN_ANIM_SLING_PEAK].isEnabled()) {
@@ -535,27 +1153,162 @@ void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::executeState_ChargeFull() {
}
void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::finalizeState_ChargeFull() {}
-void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_Normal() {}
-void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_Normal() {}
+void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::init() {
+ mAnm[MAIN_ANIM_SLING_ON].setFrame(0.0f);
+ mAnm[MAIN_ANIM_SLING_ON].setAnimEnable(true);
+ mAnm[MAIN_ANIM_SLING_KEEP].setFrame(0.0f);
+ mAnm[MAIN_ANIM_SLING_KEEP].setAnimEnable(true);
+ mAnm[MAIN_ANIM_SLING_PEAK].setFrame(0.0f);
+ mAnm[MAIN_ANIM_SLING_PEAK].setAnimEnable(true);
+ mAnm[MAIN_ANIM_SLING_OUT].setFrame(0.0f);
+ mAnm[MAIN_ANIM_SLING_OUT].setAnimEnable(true);
+ mpLyt->calc();
+
+ mAnm[MAIN_ANIM_SLING_KEEP].setAnimEnable(false);
+ mAnm[MAIN_ANIM_SLING_PEAK].setAnimEnable(false);
+ mAnm[MAIN_ANIM_SLING_OUT].setAnimEnable(false);
+
+ mIsCharging = false;
+ mDrawProgress = false;
+
+ mStateMgr.changeState(StateID_Select);
+}
+
+void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::execute() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(5.0f);
+ mStateMgr.executeState();
+ if (mAnm[MAIN_ANIM_LOOP].isEnabled()) {
+ // ??? order
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_LOOP].play();
+ }
+
+ if (mAnm[MAIN_ANIM_SLING_PEAK_RING].isEndReached()) {
+ mAnm[MAIN_ANIM_SLING_PEAK_RING].setAnimEnable(false);
+ mpLyt->calc();
+ } else {
+ mAnm[MAIN_ANIM_SLING_PEAK_RING].play();
+ }
+}
+
+void dCsGame_c::lytItemCursor_c::lytPachinkoCsr_c::setCharging(bool charging, f32 progress) {
+ mIsCharging = charging;
+ mDrawProgress = progress;
+}
+
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_Normal() {
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(true);
+}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_Normal() {
+ if (mLocked) {
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(true);
+ mAnm[MAIN_ANIM_HOOK_FIX].setForward();
+ mAnm[MAIN_ANIM_HOOK_FIX].setToStart();
+ mAnm[MAIN_ANIM_LOOP].setAnimEnable(false);
+ mStateMgr.changeState(StateID_ToLock);
+ } else {
+ mAnm[MAIN_ANIM_LOOP].play();
+ }
+}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::finalizeState_Normal() {}
-void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_ToLock() {}
-void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_ToLock() {}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::setRotate(f32 rot) {
+ mVec3_c v;
+ v.set(0.0f, 0.0f, rot);
+ mpPaneCraws[0]->SetRotate(v);
+ v.z -= 120.0f;
+ mpPaneCraws[1]->SetRotate(v);
+ v.z += 240.0f;
+ mpPaneCraws[2]->SetRotate(v);
+}
+
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_ToLock() {
+ setRotate(0.0f);
+}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_ToLock() {
+ if (mAnm[MAIN_ANIM_HOOK_FIX].isEndReached()) {
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(false);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_LOCK_LOOP].setAnimEnable(true);
+ mAnm[MAIN_ANIM_LOCK_LOOP].setFrame(0.0f);
+ mStateMgr.changeState(StateID_Lock);
+ } else {
+ mAnm[MAIN_ANIM_HOOK_FIX].play();
+ }
+}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::finalizeState_ToLock() {}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::initializeState_Lock() {}
-void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_Lock() {}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::executeState_Lock() {
+ if (!mLocked) {
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(true);
+ mAnm[MAIN_ANIM_HOOK_FIX].setBackward();
+ mAnm[MAIN_ANIM_HOOK_FIX].setToStart();
+ mAnm[MAIN_ANIM_LOCK_LOOP].setAnimEnable(false);
+ field_0x68 = mpPaneCrawFix->GetRotate().z;
+ setRotate(field_0x68);
+ mStateMgr.changeState(StateID_ToNormal);
+ } else {
+ mAnm[MAIN_ANIM_LOCK_LOOP].play();
+ }
+}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::finalizeState_Lock() {}
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::executeState_ToNormal() {
+ if (mAnm[MAIN_ANIM_HOOK_FIX].isStop2()) {
+ setRotate(0.0f);
+ mpLyt->calc();
+ mAnm[MAIN_ANIM_HOOK_FIX].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Normal);
+ } else {
+ mAnm[MAIN_ANIM_HOOK_FIX].play();
+ f32 frame = mAnm[MAIN_ANIM_HOOK_FIX].getFrame();
+ f32 len = mAnm[MAIN_ANIM_HOOK_FIX].getLastFrame();
+ f32 offset = (-120.0f - field_0x68);
+ offset /= len;
+ if (offset < -10.0f) {
+ offset = -10.0f;
+ }
+ setRotate(field_0x68 + offset * (len - frame));
+ }
+}
void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::finalizeState_ToNormal() {}
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::enter() {
+ mAnm[MAIN_ANIM_CURSOR].setFrame(6.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::setLocked(bool locked) {
+ mLocked = locked;
+}
+
+void dCsGame_c::lytItemCursor_c::lytCrawShotCsr_c::init() {
+ mpPaneCrawFix = mpLyt->findPane("N_crawFix_00");
+ mpPaneCraws[0] = mpLyt->findPane("N_craw_03");
+ mpPaneCraws[1] = mpLyt->findPane("N_craw_04");
+ mpPaneCraws[2] = mpLyt->findPane("N_craw_05");
+ mLocked = false;
+ 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);
}
void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::executeState_Normal() {
- if (field_0x5C) {
+ if (mLocked) {
mAnm[MAIN_ANIM_VACUUM_LOCK].setAnimEnable(true);
mAnm[MAIN_ANIM_VACUUM_LOCK].setForward();
mAnm[MAIN_ANIM_VACUUM_LOCK].setToStart();
@@ -583,7 +1336,7 @@ void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::finalizeState_ToLock() {}
void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::initializeState_Lock() {}
void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::executeState_Lock() {
- if (!field_0x5C) {
+ if (!mLocked) {
mAnm[MAIN_ANIM_VACUUM_LOCK].setAnimEnable(true);
mAnm[MAIN_ANIM_VACUUM_LOCK].setBackward();
mAnm[MAIN_ANIM_VACUUM_LOCK].setToStart();
@@ -618,8 +1371,21 @@ void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::enter() {
mStateMgr.changeState(StateID_Normal);
}
+void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::setUnkFloat(f32 f) {
+ if (f < 0.0f) {
+ f = 0.0f;
+ } else if (f > 100.0f) {
+ f = 100.0f;
+ }
+ field_0x54 = f;
+}
+
+void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::setLocked(bool locked) {
+ mLocked = locked;
+}
+
void dCsGame_c::lytItemCursor_c::lytVacuumCsr_c::init() {
- field_0x5C = 0;
+ mLocked = false;
enter();
mStateMgr.changeState(StateID_Normal);
}
diff --git a/src/d/d_cursor_hit_check.cpp b/src/d/d_cursor_hit_check.cpp
index 61fe1108..013d14cb 100644
--- a/src/d/d_cursor_hit_check.cpp
+++ b/src/d/d_cursor_hit_check.cpp
@@ -39,7 +39,7 @@ void dCsMgr_c::execute() {
u32 mask = it->mCursorMask;
if (mask) {
- for (HitCheckList::Iterator chkIt = mList2.GetBeginIter(); chkIt != mList2.GetEndIter(); ++it) {
+ for (HitCheckList::Iterator chkIt = mList2.GetBeginIter(); chkIt != mList2.GetEndIter(); ++chkIt) {
if ((chkIt->mMask & mask) != 0) {
bool hit = chkIt->checkHit(x, y);
if (chkIt->checkOverrideCallback(hit)) {
diff --git a/src/d/d_pad.cpp b/src/d/d_pad.cpp
index 098983e4..8736812a 100644
--- a/src/d/d_pad.cpp
+++ b/src/d/d_pad.cpp
@@ -7,8 +7,8 @@
#include "d/d_cs_game.h"
#include "d/d_gfx.h"
#include "d/d_hbm.h"
-#include "d/d_pad_nav.h"
#include "d/d_pad_manager.h"
+#include "d/d_pad_nav.h"
#include "d/d_reset.h"
#include "d/d_sc_game.h"
#include "d/lyt/d_lyt_control_game.h"
@@ -222,8 +222,8 @@ void beginPad_BR() {
KPADEnableMplsAccRevise(0);
KPADSetMplsAccReviseParam(0, 0.03f, 0.4f);
- if ((dCsGame_c::GetInstance() && dCsGame_c::GetInstance()->fn_801BF5E0() && !ex.field_0x22D0) ||
- (dAcPy_c::GetLink() &&
+ if ((dCsGame_c::GetInstance() != nullptr && dCsGame_c::GetInstance()->shouldDraw() && !ex.field_0x22D0) ||
+ (dAcPy_c::GetLink() != nullptr &&
dAcPy_c::GetLink()->checkActionFlagsCont(0x400 | 0x100 | 0x80 | 0x40 | 0x10 | 0x4 | 0x2 | 0x1) &&
!dAcPy_c::GetLink()->vt_0x1C0() && !dLytMeter_c::GetMain()->getField_0x1377F()) ||
ex.field_0x22CF) {
diff --git a/src/d/d_stage_mgr.cpp b/src/d/d_stage_mgr.cpp
index 4ab7ff87..acf55ae1 100644
--- a/src/d/d_stage_mgr.cpp
+++ b/src/d/d_stage_mgr.cpp
@@ -236,7 +236,7 @@ void dStageMgr_c::initializeState_SceneChangeSave() {
if (LYT_SAVE_MGR != nullptr) {
fn_80285600(LYT_SAVE_MGR, 3, 0);
}
- dBase_c::s_NextExecuteControlFlags |= 1;
+ dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x1;
dSys_c::setFrameRate(2);
}
@@ -252,8 +252,8 @@ void dStageMgr_c::executeState_SceneChangeSave() {
}
void dStageMgr_c::finalizeState_SceneChangeSave() {
- dBase_c::s_NextExecuteControlFlags &= ~1;
- dBase_c::s_DrawControlFlags &= ~1;
+ dBase_c::s_NextExecuteControlFlags &= ~BASE_PROP_0x1;
+ dBase_c::s_DrawControlFlags &= ~BASE_PROP_0x1;
}
void dStageMgr_c::initializeState_RestartSceneWait() {
diff --git a/src/d/lyt/d_lyt_game_over.cpp b/src/d/lyt/d_lyt_game_over.cpp
index 518045bf..f50045fd 100644
--- a/src/d/lyt/d_lyt_game_over.cpp
+++ b/src/d/lyt/d_lyt_game_over.cpp
@@ -163,8 +163,8 @@ bool dLytGameOver_c::remove() {
mResAcc2.detach();
mResAcc1.detach();
- dBase_c::s_NextExecuteControlFlags &= ~0x200;
- dBase_c::s_DrawControlFlags &= ~0x200;
+ dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x200;
+ dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x200;
return true;
}
@@ -435,8 +435,8 @@ void dLytGameOverMgr_c::executeState_Select() {
if (mTimer < 20) {
mTimer++;
if (mTimer == 20) {
- dBase_c::s_NextExecuteControlFlags |= 1;
- dBase_c::s_DrawControlFlags |= 1;
+ dBase_c::s_NextExecuteControlFlags |= dBase_c::BASE_PROP_0x1;
+ dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x1;
}
}
if (mMain.isChangingState() == true) {
@@ -563,11 +563,11 @@ void dLytGameOverMgr_c::executeState_Select() {
break;
}
case 100: {
- dBase_c::s_NextExecuteControlFlags &= ~0x1;
- dBase_c::s_DrawControlFlags &= ~0x1;
+ dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x1;
+ dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x1;
- dBase_c::s_NextExecuteControlFlags |= 0x200;
- dBase_c::s_DrawControlFlags |= 0x200;
+ dBase_c::s_NextExecuteControlFlags |= dBase_c::BASE_PROP_0x200;
+ dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x200;
mStep++;
break;
diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp
index 959469ff..926de978 100644
--- a/src/d/lyt/d_lyt_pause.cpp
+++ b/src/d/lyt/d_lyt_pause.cpp
@@ -112,8 +112,8 @@ bool dLytPauseMain_c::remove() {
mpPauseBack = nullptr;
}
- dBase_c::s_NextExecuteControlFlags &= ~0x1;
- dBase_c::s_DrawControlFlags &= ~0x1;
+ dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x1;
+ dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x1;
return true;
}
@@ -260,7 +260,7 @@ void dLytPauseMain_c::executeState_In() {
}
}
void dLytPauseMain_c::finalizeState_In() {
- dBase_c::s_DrawControlFlags |= 0x1;
+ dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x1;
}
void dLytPauseMain_c::initializeState_Wait() {
@@ -462,7 +462,7 @@ void dLytPauseMain_c::finalizeState_GetDemo() {}
void dLytPauseMain_c::initializeState_Out() {
mPartStateChangeFlags = 0;
mStep = 0;
- dBase_c::s_DrawControlFlags &= ~0x1;
+ dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x1;
mpArrow->requestOut();
}
void dLytPauseMain_c::executeState_Out() {
@@ -580,7 +580,7 @@ void dLytPauseMgr_c::executeState_None() {
field_0x083A = true;
mMain.requestIn();
mStateMgr.changeState(StateID_In);
- dBase_c::s_NextExecuteControlFlags |= 0x1;
+ dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x1;
dLytMeter_c::GetInstance()->setMeterField_0x13750(3);
dLytControlGame_c *lytControl = dLytControlGame_c::getInstance();
if (lytControl->isPauseDemo()) {
@@ -600,7 +600,7 @@ void dLytPauseMgr_c::executeState_In() {
mStateMgr.changeState(StateID_GetDemo);
} else {
mStateMgr.changeState(StateID_Wait);
- dCsGame_c::GetInstance()->setCursorTypePointer();
+ dCsGame_c::GetInstance()->pointerDefSet();
}
}
}
@@ -629,7 +629,7 @@ void dLytPauseMgr_c::executeState_Wait() {
dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true);
}
- dCsGame_c::GetInstance()->setCursorTypePointer();
+ dCsGame_c::GetInstance()->pointerDefSet();
if (dPad::getDownTrig1() ||
(dLytControlGame_c::getInstance()->getCurrentPauseDisp() != dLytPauseMgr_c::DISP_00_INVENTORY &&
@@ -685,7 +685,7 @@ void dLytPauseMgr_c::executeState_Wait() {
if (checkRing()) {
if (mTimer >= 10) {
mTimer = 0;
- dCsGame_c::GetInstance()->setCursorTypeNoneMaybe();
+ dCsGame_c::GetInstance()->noneSet();
mStateMgr.changeState(StateID_Ring);
} else {
mTimer++;
@@ -715,7 +715,7 @@ void dLytPauseMgr_c::initializeState_Change() {
}
void dLytPauseMgr_c::executeState_Change() {
if (!sInstance->getField_0x083E()) {
- dCsGame_c::GetInstance()->setCursorTypePointer();
+ dCsGame_c::GetInstance()->pointerDefSet();
}
if (mMain.isChangingState() == true) {
@@ -817,8 +817,8 @@ void dLytPauseMgr_c::initializeState_Out() {
}
void dLytPauseMgr_c::executeState_Out() {
if (mMain.isChangingState() == true) {
- dBase_c::s_NextExecuteControlFlags &= ~0x1;
- dBase_c::s_DrawControlFlags &= ~0x1;
+ dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x1;
+ dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x1;
mStateMgr.changeState(StateID_None);
}
}
diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp
index 76e91e78..12dc2514 100644
--- a/src/d/lyt/meter/d_lyt_meter.cpp
+++ b/src/d/lyt/meter/d_lyt_meter.cpp
@@ -996,7 +996,7 @@ bool dLytMeterMain_c::remove() {
void dLytMeterMain_c::fn_800D5290() {
dLytMeter_c *meter = dLytMeter_c::GetInstance();
- if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->unkMeterCheck()) {
+ if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->isSomeMapFieldEq2Or4Or5Or6()) {
meter->setFlags(METER_BTN_PLUS);
}
diff --git a/src/toBeSorted/d_emitter.cpp b/src/toBeSorted/d_emitter.cpp
index 4fb19c71..47abb431 100644
--- a/src/toBeSorted/d_emitter.cpp
+++ b/src/toBeSorted/d_emitter.cpp
@@ -856,7 +856,7 @@ void dJEffManager_c::execute() {
sMassObjEmitters[i].execute();
}
- if ((dBase_c::s_ExecuteControlFlags & 0x6F9) == 0) {
+ if ((dBase_c::s_ExecuteControlFlags & (dBase_c::BASE_PROP_UNK_PARTICLE_1)) == 0) {
for (int i = 0; i < 12; i++) {
dParticle::mgr_c::GetInstance()->calc(i);
}
@@ -886,8 +886,7 @@ void dJEffManager_c::draw() {
bool dJEffManager_c::shouldBePaused(dBase_c *owner) {
return owner != nullptr && !owner->checkBaseProperty(dBase_c::BASE_PROP_0x4) &&
(EventManager::isInEvent() || owner->checkProcControl(fBase_c::DISABLE_EXECUTE) ||
- // TODO execute control flags
- (owner->s_ExecuteControlFlags & 0x6fb));
+ (owner->s_ExecuteControlFlags & dBase_c::BASE_PROP_UNK_PARTICLE_2));
}
void dJEffManager_c::draw(const JPADrawInfo *info, u32 groupId) {
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;
+}