diff options
| author | robojumper <robojumper@gmail.com> | 2025-09-27 12:21:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-27 12:21:38 +0200 |
| commit | e8fea3ebe5ee0056195834f836aa0c07a891da7d (patch) | |
| tree | 3bfcb7adc19b8bb38173cebe490b34aa8da10bcf /src | |
| parent | 4d2420e52f3340d1b0d02e391da3f5552a75ae8b (diff) | |
| parent | 13acaee08772cc96ccbf0c9572ab93ee634181c8 (diff) | |
Merge pull request #252 from robojumper/more_cursor_stuff
Cursor Cleanup
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/d_cs_game.cpp | 990 | ||||
| -rw-r--r-- | src/d/d_cursor_hit_check.cpp | 2 | ||||
| -rw-r--r-- | src/d/d_pad.cpp | 6 | ||||
| -rw-r--r-- | src/d/d_stage_mgr.cpp | 6 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_game_over.cpp | 16 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_pause.cpp | 22 | ||||
| -rw-r--r-- | src/d/lyt/meter/d_lyt_meter.cpp | 2 | ||||
| -rw-r--r-- | src/toBeSorted/d_emitter.cpp | 5 | ||||
| -rw-r--r-- | src/toBeSorted/d_emitter_callbacks.cpp | 61 |
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; +} |
