From 98b97ac2b36ff0ad39a25d608923cabad2b02d6f Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 1 Mar 2026 17:12:09 +0100 Subject: [PATCH] Mostly ok --- config/SOUE01/symbols.txt | 24 +- include/d/lyt/d_lyt_note.h | 48 +- include/d/lyt/d_lyt_suiryu_score.h | 35 +- src/d/lyt/d_lyt_note.cpp | 36 +- src/d/lyt/d_lyt_suiryu_score.cpp | 832 ++++++++++++++++++++++++++++- 5 files changed, 923 insertions(+), 52 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 96693fac..4100cd30 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15507,21 +15507,21 @@ draw__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297350; // type:function size:0 initAnm__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297380; // type:function size:0x2D8 startIn__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297660; // type:function size:0xBC startOut__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297720; // type:function size:0xA8 -setColor0__26dLytMeterSuiryuScoreBase_cFl = .text:0x802977D0; // type:function size:0x84 -setColor1__26dLytMeterSuiryuScoreBase_cFl = .text:0x80297860; // type:function size:0x84 -fn_802978F0 = .text:0x802978F0; // type:function size:0x1EC -fn_80297AE0 = .text:0x80297AE0; // type:function size:0x54 -fn_80297B40 = .text:0x80297B40; // type:function size:0x54 -fn_80297BA0 = .text:0x80297BA0; // type:function size:0xD4 -fn_80297C80 = .text:0x80297C80; // type:function size:0xC4 +setColor0__26dLytMeterSuiryuScoreBase_cFUc = .text:0x802977D0; // type:function size:0x84 +setColor1__26dLytMeterSuiryuScoreBase_cFUc = .text:0x80297860; // type:function size:0x84 +fn_802978F0__26dLytMeterSuiryuScoreBase_cFl = .text:0x802978F0; // type:function size:0x1EC +fn_80297AE0__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297AE0; // type:function size:0x54 +fn_80297B40__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297B40; // type:function size:0x54 +fn_80297BA0__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297BA0; // type:function size:0xD4 +fn_80297C80__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297C80; // type:function size:0xC4 alphaBackwards__26dLytMeterSuiryuScoreBase_cFlf = .text:0x80297D50; // type:function size:0x60 alphaForwards__26dLytMeterSuiryuScoreBase_cFlf = .text:0x80297DB0; // type:function size:0x60 -fn_80297E10 = .text:0x80297E10; // type:function size:0x84 -fn_80297EA0 = .text:0x80297EA0; // type:function size:0x140 -fn_80297FE0 = .text:0x80297FE0; // type:function size:0x61C -fn_80298600 = .text:0x80298600; // type:function size:0x50C +fn_80297E10__26dLytMeterSuiryuScoreBase_cCFUc = .text:0x80297E10; // type:function size:0x84 +fn_80297EA0__26dLytMeterSuiryuScoreBase_cFv = .text:0x80297EA0; // type:function size:0x140 +fn_80297FE0__26dLytMeterSuiryuScoreBase_cFUc = .text:0x80297FE0; // type:function size:0x61C +fn_80298600__26dLytMeterSuiryuScoreBase_cFv = .text:0x80298600; // type:function size:0x50C stopMove__26dLytMeterSuiryuScoreBase_cFv = .text:0x80298B10; // type:function size:0x64 -fn_80298B80 = .text:0x80298B80; // type:function size:0x248 +fn_80298B80__26dLytMeterSuiryuScoreBase_cFv = .text:0x80298B80; // type:function size:0x248 initializeState_None__19dLytMeterClefMain_cFv = .text:0x80298DD0; // type:function size:0x4 executeState_None__19dLytMeterClefMain_cFv = .text:0x80298DE0; // type:function size:0x4 finalizeState_None__19dLytMeterClefMain_cFv = .text:0x80298DF0; // type:function size:0x4 diff --git a/include/d/lyt/d_lyt_note.h b/include/d/lyt/d_lyt_note.h index 138f6254..bb9788b2 100644 --- a/include/d/lyt/d_lyt_note.h +++ b/include/d/lyt/d_lyt_note.h @@ -24,6 +24,42 @@ public: return mStateMgr.isState(StateID_Wait); } + void forceOut() { + mShouldMove = false; + mForceOut = true; + } + + void lose() { + mShouldMove = false; + mIsCollected = false; + } + + void collect() { + mShouldMove = false; + mIsCollected = true; + } + + void startLose() { + mIsAboutToLose = true; + } + + void stopLose() { + mIsAboutToLose = false; + } + + void setColor(s32 color) { + mColor = color; + } + + void setMove() { + mIsAboutToLose = false; + mShouldMove = true; + } + + bool isMove() const { + return mIsMove; + } + private: STATE_FUNC_DECLARE(dLytNote_c, Wait); STATE_FUNC_DECLARE(dLytNote_c, In); @@ -38,12 +74,12 @@ private: /* 0x260 */ f32 field_0x260; /* 0x264 */ s32 mOutAnim; /* 0x268 */ s32 mInAnim; - /* 0x26C */ s32 field_0x26C; - /* 0x270 */ u8 field_0x270; - /* 0x271 */ u8 field_0x271; - /* 0x272 */ u8 field_0x272; - /* 0x273 */ u8 field_0x273; - /* 0x274 */ u8 field_0x274; + /* 0x26C */ s32 mColor; + /* 0x270 */ bool mShouldMove; + /* 0x271 */ bool mIsCollected; + /* 0x272 */ bool mIsAboutToLose; + /* 0x273 */ bool mIsMove; + /* 0x274 */ bool mForceOut; }; #endif diff --git a/include/d/lyt/d_lyt_suiryu_score.h b/include/d/lyt/d_lyt_suiryu_score.h index 758c541d..18792450 100644 --- a/include/d/lyt/d_lyt_suiryu_score.h +++ b/include/d/lyt/d_lyt_suiryu_score.h @@ -26,18 +26,44 @@ public: void startIn(); void startOut(); - void setColor0(s32 idx); - void setColor1(s32 idx); + void setColor0(u8 idx); + void setColor1(u8 idx); void alphaForwards(s32 idx, f32 rate); void alphaBackwards(s32 idx, f32 rate); void stopMove(); - void fn_802978F0(u8); + void fn_802978F0(s32 idx); + void fn_80297AE0(); + void fn_80297B40(); + void fn_80297BA0(); + void fn_80297C80(); + bool fn_80297E10(u8) const; + void fn_80297EA0(); + void fn_80297FE0(u8); + bool fn_80298B80(); nw4r::lyt::Pane *getInOutAllPane() const { return mLyt.findPane("N_inOutAll_00"); } + nw4r::lyt::Pane *getNotePane(s32 idx) const { + return mpPanes[idx]; + } + + u8 getField_0x2251(s32 idx) const { + return field_0x2251[idx]; + } + + void setField_0x2251(u8 idx, u8 val) { + if (field_0x2251[idx] != val) { + field_0x2251[idx] = val; + } + } + + void setField_0x2251_(u8 idx, u8 val) { + field_0x2251[idx] = val; + } + private: STATE_FUNC_DECLARE(dLytMeterSuiryuScoreBase_c, None); STATE_FUNC_DECLARE(dLytMeterSuiryuScoreBase_c, In); @@ -66,6 +92,7 @@ private: class dLytMeterClefMain_c { private: static const s32 NUM_TADTONE_GROUPS = 17; + static const s32 NUM_TOTAL_TADTONES = 77; public: dLytMeterClefMain_c() @@ -115,7 +142,7 @@ private: /* 0x5E81 */ u8 field_0x5E81[NUM_TADTONE_GROUPS]; /* 0x5E92 */ u8 field_0x5E92[NUM_TADTONE_GROUPS]; /* 0x5EA4 */ UNKWORD field_0x5EA4[NUM_TADTONE_GROUPS]; - /* 0x5EE8 */ u8 field_0x5EE8[77]; + /* 0x5EE8 */ u8 field_0x5EE8[NUM_TOTAL_TADTONES]; /* 0x5F35 */ u8 field_0x5F35; /* 0x5F36 */ u8 field_0x5F36; diff --git a/src/d/lyt/d_lyt_note.cpp b/src/d/lyt/d_lyt_note.cpp index 231b3cf3..8f3d2d7e 100644 --- a/src/d/lyt/d_lyt_note.cpp +++ b/src/d/lyt/d_lyt_note.cpp @@ -28,11 +28,11 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define NOTE_ANIM_INVALID 6 void dLytNote_c::initializeState_Wait() { - field_0x273 = 0; + mIsMove = false; } void dLytNote_c::executeState_Wait() { - if (field_0x270 != 0) { + if (mShouldMove) { mStateMgr.changeState(StateID_In); } } @@ -40,14 +40,14 @@ void dLytNote_c::executeState_Wait() { void dLytNote_c::finalizeState_Wait() {} void dLytNote_c::initializeState_In() { - field_0x274 = 0; + mForceOut = false; mpPane->SetVisible(true); mAnmGroups[NOTE_ANIM_GET].setAnimEnable(true); mAnmGroups[NOTE_ANIM_GET].setFrame(0.0f); } void dLytNote_c::executeState_In() { - if (field_0x270 == 0) { + if (!mShouldMove) { mAnmGroups[NOTE_ANIM_GET].setToEnd(); mAnmGroups[NOTE_ANIM_GET].setAnimEnable(false); mStateMgr.changeState(StateID_Out); @@ -68,14 +68,14 @@ void dLytNote_c::executeState_In() { void dLytNote_c::finalizeState_In() {} void dLytNote_c::initializeState_Move() { - field_0x273 = 1; + mIsMove = true; } void dLytNote_c::executeState_Move() { - if (field_0x270 == 0) { + if (!mShouldMove) { mAnmGroups[mInAnim].setAnimEnable(false); mStateMgr.changeState(StateID_Out); - } else if (field_0x272 != 0 && mInAnim == NOTE_ANIM_GET_LOOP) { + } else if (mIsAboutToLose && mInAnim == NOTE_ANIM_GET_LOOP) { mAnmGroups[mInAnim].setAnimEnable(false); field_0x260 = 0.0f; mInAnim = NOTE_ANIM_LOST_LOOP; @@ -88,7 +88,7 @@ void dLytNote_c::executeState_Move() { mAnmGroups[mInAnim].setFrame(field_0x260); mAnmGroups[mInAnim].setAnimEnable(true); } else { - if (field_0x272 == 0 && mInAnim == NOTE_ANIM_LOST_LOOP) { + if (!mIsAboutToLose && mInAnim == NOTE_ANIM_LOST_LOOP) { mAnmGroups[mInAnim].setAnimEnable(false); field_0x260 = 0.0f; mInAnim = NOTE_ANIM_GET_LOOP; @@ -108,8 +108,8 @@ void dLytNote_c::finalizeState_Move() {} void dLytNote_c::initializeState_Out() { mInAnim = NOTE_ANIM_INVALID; - field_0x273 = 0; - if (field_0x271) { + mIsMove = false; + if (mIsCollected) { mOutAnim = NOTE_ANIM_FIX; } else { mOutAnim = NOTE_ANIM_LOST; @@ -119,7 +119,7 @@ void dLytNote_c::initializeState_Out() { } void dLytNote_c::executeState_Out() { - if (field_0x274 != 0) { + if (mForceOut) { mAnmGroups[mOutAnim].setToEnd(); } @@ -155,12 +155,12 @@ bool dLytNote_c::build(d2d::ResAccIf_c *resAcc) { mInAnim = NOTE_ANIM_INVALID; mOutAnim = NOTE_ANIM_FIX; field_0x260 = 0.0f; - field_0x270 = 0; - field_0x271 = 0; - field_0x272 = 0; - field_0x273 = 0; - field_0x274 = 0; - field_0x26C = 0; + mShouldMove = false; + mIsCollected = false; + mIsAboutToLose = false; + mIsMove = false; + mForceOut = false; + mColor = 0; mStateMgr.changeState(StateID_Wait); return true; } @@ -177,7 +177,7 @@ void dLytNote_c::execute(u8 alpha) { mStateMgr.executeState(); if (*mStateMgr.getStateID() != StateID_Wait) { mpPane->SetTranslate(mTranslate); - mAnmGroups[NOTE_ANIM_COLOR].setFrame(field_0x26C); + mAnmGroups[NOTE_ANIM_COLOR].setFrame(mColor); mpPane->SetAlpha(alpha); mLyt.calc(); } diff --git a/src/d/lyt/d_lyt_suiryu_score.cpp b/src/d/lyt/d_lyt_suiryu_score.cpp index 631bc262..0b9cc849 100644 --- a/src/d/lyt/d_lyt_suiryu_score.cpp +++ b/src/d/lyt/d_lyt_suiryu_score.cpp @@ -8,6 +8,8 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_force_line.h" #include "d/lyt/meter/d_lyt_meter.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" #include "m/m_vec.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/misc_actor.h" @@ -373,7 +375,57 @@ bool dLytMeterSuiryuScoreBase_c::draw() { return true; } -void dLytMeterSuiryuScoreBase_c::initAnm() {} +void dLytMeterSuiryuScoreBase_c::initAnm() { + mAnm[SUIRYU_SCORE_BASE_ANIM_OUT].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_OUT].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_OUT].setAnimEnable(false); + + for (int i = 0; i < SUIRYU_SCORE_BASE_NUM_NOTE_ANIMS; i++) { + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_OFFSET].setAnimEnable(false); + + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_P_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_P_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_P_OFFSET].setAnimEnable(false); + + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_LOOP_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_LOOP_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_N_LOOP_OFFSET].setAnimEnable(false); + + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOST_LOOP_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOST_LOOP_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOST_LOOP_OFFSET].setAnimEnable(false); + + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_OFFSET].setAnimEnable(true); + mLyt.calc(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_FIX_OFFSET].setAnimEnable(false); + + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOOP_OFFSET].setForwardOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOOP_OFFSET].setToStart(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOOP_OFFSET].setAnimEnable(true); + mLyt.calc(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_LOOP_OFFSET].setAnimEnable(false); + setColor0(i); + } + + mAnm[SUIRYU_SCORE_BASE_ANIM_IN].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_IN].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_IN].setAnimEnable(true); + mLyt.calc(); + mAnm[SUIRYU_SCORE_BASE_ANIM_IN].setAnimEnable(false); + + fn_80297C80(); + fn_80297EA0(); + + for (int i = 0; i < SUIRYU_SCORE_BASE_NUM_NOTE_ANIMS; i++) { + field_0x2251[i] = 0; + } + + field_0x2262 = 0; +} void dLytMeterSuiryuScoreBase_c::startIn() { if (field_0x2264 == 0) { @@ -404,7 +456,7 @@ void dLytMeterSuiryuScoreBase_c::startOut() { } } -void dLytMeterSuiryuScoreBase_c::setColor0(s32 idx) { +void dLytMeterSuiryuScoreBase_c::setColor0(u8 idx) { s32 actualIdx = idx + SUIRYU_SCORE_BASE_ANIM_FIX_COLOR_OFFSET; mAnm[actualIdx].setFrame(0.0f); mAnm[actualIdx].setAnimEnable(true); @@ -412,7 +464,7 @@ void dLytMeterSuiryuScoreBase_c::setColor0(s32 idx) { mAnm[actualIdx].setAnimEnable(false); } -void dLytMeterSuiryuScoreBase_c::setColor1(s32 idx) { +void dLytMeterSuiryuScoreBase_c::setColor1(u8 idx) { s32 actualIdx = idx + SUIRYU_SCORE_BASE_ANIM_FIX_COLOR_OFFSET; mAnm[actualIdx].setFrame(1.0f); mAnm[actualIdx].setAnimEnable(true); @@ -420,6 +472,90 @@ void dLytMeterSuiryuScoreBase_c::setColor1(s32 idx) { mAnm[actualIdx].setAnimEnable(false); } +void dLytMeterSuiryuScoreBase_c::fn_802978F0(s32 idx) { + s32 i1 = idx + SUIRYU_SCORE_BASE_ANIM_LOST_LOOP_OFFSET; + s32 i2 = idx + SUIRYU_SCORE_BASE_ANIM_FIX_OFFSET; + s32 i3 = idx + SUIRYU_SCORE_BASE_ANIM_LOOP_OFFSET; + s32 i4 = idx + SUIRYU_SCORE_BASE_ANIM_FIX_N_OFFSET; + s32 i5 = idx + SUIRYU_SCORE_BASE_ANIM_FIX_P_OFFSET; + s32 i6 = idx + SUIRYU_SCORE_BASE_ANIM_FIX_N_LOOP_OFFSET; + + mAnm[i1].setToEnd2(); + mAnm[i2].setToEnd2(); + mAnm[i3].setToEnd2(); + + mAnm[i1].setAnimEnable(true); + mAnm[i2].setAnimEnable(true); + mAnm[i3].setAnimEnable(true); + + mAnm[i4].setToEnd2(); + mAnm[i5].setToEnd2(); + mAnm[i6].setToEnd2(); + + mAnm[i4].setAnimEnable(true); + mAnm[i5].setAnimEnable(true); + mAnm[i6].setAnimEnable(true); + + mLyt.calc(); + + mAnm[i4].setAnimEnable(false); + mAnm[i5].setAnimEnable(false); + mAnm[i6].setAnimEnable(false); + + mAnm[i1].setAnimEnable(false); + mAnm[i2].setAnimEnable(false); + mAnm[i3].setAnimEnable(false); + + field_0x2251[idx] = 3; +} + +void dLytMeterSuiryuScoreBase_c::fn_80297AE0() { + alphaBackwards(0, 1.0f); + alphaBackwards(1, 1.0f); + alphaBackwards(2, 1.0f); +} + +void dLytMeterSuiryuScoreBase_c::fn_80297B40() { + alphaForwards(0, 1.0f); + alphaForwards(1, 1.0f); + alphaForwards(2, 1.0f); +} + +void dLytMeterSuiryuScoreBase_c::fn_80297BA0() { + switch (field_0x2250) { + case 0: { + alphaBackwards(0, 1.0f); + alphaForwards(1, 1.0f); + alphaForwards(2, 1.0f); + break; + } + case 1: { + alphaForwards(0, 1.0f); + alphaBackwards(1, 1.0f); + alphaForwards(2, 1.0f); + break; + } + case 2: { + alphaForwards(0, 1.0f); + alphaForwards(1, 1.0f); + alphaBackwards(2, 1.0f); + break; + } + } +} + +void dLytMeterSuiryuScoreBase_c::fn_80297C80() { + for (int i = 0; i < 3; i++) { + mAnm[i + SUIRYU_SCORE_BASE_ANIM_ALPHA_OFFSET].setBackwardsOnce(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_ALPHA_OFFSET].setToEnd2(); + mAnm[i + SUIRYU_SCORE_BASE_ANIM_ALPHA_OFFSET].setAnimEnable(true); + } + mLyt.calc(); + for (int i = 0; i < 3; i++) { + mAnm[i + SUIRYU_SCORE_BASE_ANIM_ALPHA_OFFSET].setAnimEnable(false); + } +} + void dLytMeterSuiryuScoreBase_c::alphaBackwards(s32 idx, f32 rate) { s32 actualIdx = idx + SUIRYU_SCORE_BASE_ANIM_ALPHA_OFFSET; mAnm[actualIdx].setBackwardsOnce(); @@ -434,6 +570,327 @@ void dLytMeterSuiryuScoreBase_c::alphaForwards(s32 idx, f32 rate) { mAnm[actualIdx].setAnimEnable(true); } +bool dLytMeterSuiryuScoreBase_c::fn_80297E10(u8 arg) const { + if (field_0x2250 == 0) { + if (arg == 1) { + return true; + } + if (arg == 2) { + return true; + } + } else if (field_0x2250 == 1) { + if (arg == 0) { + return true; + } + if (arg == 2) { + return true; + } + } else if (field_0x2250 == 2) { + if (arg == 0) { + return true; + } + if (arg == 1) { + return true; + } + } + return false; +} + +void dLytMeterSuiryuScoreBase_c::fn_80297EA0() { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(false); + + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(false); + + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(false); + + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(false); + + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + + field_0x2250 = 4; +} + +void dLytMeterSuiryuScoreBase_c::fn_80297FE0(u8 arg) { + if (field_0x2250 == 4) { + if (arg == 0) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(true); + } else if (arg == 1) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(true); + } else if (arg == 2) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(true); + } else if (arg == 3) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(true); + } + field_0x2263 = 0; + } else if (field_0x2250 == 3) { + if (arg == 0) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(true); + } else if (arg == 1) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(true); + } else if (arg == 2) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(false); + } + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setToEnd2(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(false); + } + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(true); + } else if (arg == 4) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(true); + } + field_0x2263 = 0; + } else if (field_0x2250 == 0) { + if (arg == 1) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(0.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 2) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setToStart(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 3) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(true); + field_0x2263 = 0; + } + } else if (field_0x2250 == 1) { + if (arg == 0) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 2) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 3) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(true); + field_0x2263 = 0; + } + } else if (field_0x2250 == 2) { + if (arg == 0) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setForwardOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(20.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 1) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(20.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setAnimEnable(true); + field_0x2263 = 1; + } else if (arg == 3) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setBackwardsOnce(); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setAnimEnable(true); + field_0x2263 = 0; + } + } + + field_0x2250 = arg; +} + +bool dLytMeterSuiryuScoreBase_c::fn_80298600() { + switch (field_0x2250) { + case 0: { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].getFrame() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].getFrame() <= 10.0f && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setFrame(0.0f); + return true; + } + break; + } + + case 1: { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].getFrame() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(10.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].getFrame() <= 10.0f && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(10.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() <= 10.0f && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setFrame(0.0f); + return true; + } + break; + } + + case 2: { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].getFrame() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(20.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].getFrame() <= 20.0f && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].setFrame(10.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() <= 20.0f && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + 20.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].setFrame(10.0f); + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setFrame(0.0f); + return true; + } + break; + } + + case 3: { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setFrame(0.0f); + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isEnabled()) { + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setFrame(0.0f); + return true; + } + break; + } + + case 4: { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isStop2() && mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].isEnabled()) { + return true; + } + break; + } + } + + return false; +} + void dLytMeterSuiryuScoreBase_c::stopMove() { mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].setAnimEnable(false); mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].setAnimEnable(false); @@ -442,6 +899,87 @@ void dLytMeterSuiryuScoreBase_c::stopMove() { mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_ALL].setAnimEnable(false); } +bool dLytMeterSuiryuScoreBase_c::fn_80298B80() { + switch (field_0x2250) { + case 0: { + if (field_0x2263 == 1) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isStop2()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isStop2()) { + return true; + } + } else { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].getFrame()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_1].getFrame() <= 10.0f) { + return true; + } + } + break; + } + + case 1: { + if (field_0x2263 == 1) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() <= 10.0f) { + return true; + } + } else { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].getFrame()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_2].getFrame() <= 10.0f) { + return true; + } + } + break; + } + + case 2: { + if (field_0x2263 == 1) { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame() <= 10.0f) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_123].getFrame()) { + return true; + } + } else { + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isPlayingForwardsOnce() && + 10.0f <= mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].getFrame()) { + return true; + } + + if (mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].isPlayingBackwardsOnce() && + mAnm[SUIRYU_SCORE_BASE_ANIM_MOVE_3].getFrame() <= 10.0f) { + return true; + } + } + break; + } + } + + return false; +} + STATE_DEFINE(dLytMeterClefMain_c, None); STATE_DEFINE(dLytMeterClefMain_c, In); STATE_DEFINE(dLytMeterClefMain_c, Wait); @@ -459,6 +997,8 @@ void dLytMeterClefMain_c::finalizeState_In() {} void dLytMeterClefMain_c::initializeState_Wait() {} void dLytMeterClefMain_c::executeState_Wait() { + // TODO - Nonmatching but maybe equivalent. Function suffers from register pressure, + // so regalloc might have an effect on codegen patterns too... fn_8029A200(); fn_8029A2C0(); fn_8029A260(); @@ -474,11 +1014,279 @@ void dLytMeterClefMain_c::executeState_Wait() { b = true; } + bool b2 = false; + + s32 acc = 0; for (int i = 0; i < NUM_TADTONE_GROUPS; i++) { if (field_0x5E81[i] != 0) { - field_0x5E81[i]--; - // TODO - ... + for (int j = field_0x5E81[i] - 1; j >= 0; j--) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].mNote.isStateWait()) { + if (mNotes[noteIdx].field_0x278 == 5) { + field_0x5E81[i] -= 1; + } + mNotes[noteIdx].field_0x278 = 7; + field_0x5EE8[acc + j] = NUM_TOTAL_TADTONES; + } + } } + acc += field_0x5E4E[i]; + } + + acc = 0; + for (int i = 0; i < NUM_TADTONE_GROUPS; i++) { + if (field_0x5E5F[i] != 0) { + for (int j = field_0x5E5F[i] - 1; j >= 0; j--) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && !mNotes[noteIdx].mNote.isStateWait()) { + b2 = true; + } + } + } + + if (field_0x5E81[i] != 0) { + for (int j = field_0x5E81[i] - 1; j >= 0; j--) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && !mNotes[noteIdx].mNote.isStateWait()) { + b2 = true; + } + } + } + + if (field_0x5EA4[i] == 0) { + b2 = true; + } + + acc += field_0x5E4E[i]; + } + + if (!b && !b2) { + if (field_0x5F40 <= 0) { + mBase.fn_80297AE0(); + field_0x5F35 = NUM_TADTONE_GROUPS + 1; // TODO ??? + field_0x5F36 = NUM_TADTONE_GROUPS + 1; + } else { + field_0x5F40--; + } + } else { + field_0x5F40 = 45; + } + + acc = 0; + for (int j = 0; j < NUM_TADTONE_GROUPS; j++) { + if (field_0x5F36 == j) { + break; + } + acc += field_0x5E4E[j]; + } + + // TODO: actual length? + static const u8 sUnk1[] = { + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 4, 0, + }; + + if (mBase.getField_0x2251(field_0x5F36) == 2 && mBase.fn_80297E10(sUnk1[field_0x5F35])) { + for (int j = 0; j < field_0x5E4E[field_0x5F36]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES) { + mNotes[noteIdx].mNote.forceOut(); + } + } + } + + if (field_0x5F40 > 0) { + if (b2 == true) { + mBase.fn_80297BA0(); + } else { + mBase.fn_80297B40(); + field_0x5F35 = NUM_TADTONE_GROUPS; + field_0x5F36 = NUM_TADTONE_GROUPS; + } + } + + mBase.fn_80297FE0(sUnk1[field_0x5F35]); + + // TODO new local? + acc = 0; + + for (int i = 0; i < NUM_TADTONE_GROUPS; i++) { + if (field_0x5E81[i] != 0) { + switch (field_0x5EA4[i]) { + case 1: { + for (int j = field_0x5E5F[i]; j < field_0x5E70[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].field_0x278 != 5) { + mNotes[noteIdx].field_0x278 = 5; + mNotes[noteIdx].mNote.lose(); + } + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_Clef_GROUP_DROP_OUT); + field_0x5EA4[i] = 3; + break; + } + case 2: { + for (int j = 0; j < field_0x5E70[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].field_0x278 != 5) { + mNotes[noteIdx].field_0x278 = 5; + mNotes[noteIdx].mNote.lose(); + } + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_Clef_GROUP_DROP_OUT); + field_0x5EA4[i] = 4; + break; + } + } + } + + for (int j = 0; j < field_0x5E81[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES) { + f32 f = mNotes[noteIdx].mNote.getField0x260(); + if (mNotes[noteIdx].field_0x278 == 2 || mNotes[noteIdx].field_0x278 == 4) { + mNotes[noteIdx].mNote.setFrame(f); + } + } + } + + if (field_0x5E81[i] != field_0x5E4E[i]) { + field_0x5F3C = 60; + if (field_0x5E92[i] < field_0x5F3C && field_0x5E92[i] != 0) { + mBase.setField_0x2251(i, 1); + + for (int j = 0; j < field_0x5E81[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].field_0x278 == 3) { + if (j != 0) { + s32 otherNoteIdx = field_0x5EE8[acc + j - 1]; + f32 f = mNotes[otherNoteIdx].mNote.getField0x260(); + if (0.0f <= f - 2.0f) { + mNotes[noteIdx].field_0x278 = 4; + mNotes[noteIdx].mNote.setFrame(f - 2.0f); + } else { + mNotes[noteIdx].mNote.setFrame(0.0f); + } + } else { + f32 f = mNotes[noteIdx].mNote.getField0x260(); + if (0.0f <= f) { + mNotes[noteIdx].field_0x278 = 4; + mNotes[noteIdx].mNote.setFrame(f); + } + } + } + if (mNotes[noteIdx].field_0x278 >= 1 && mNotes[noteIdx].field_0x278 <= 2) { + mNotes[noteIdx].field_0x278 = 3; + mNotes[noteIdx].mNote.startLose(); + } + } + } else { + mBase.setField_0x2251(i, 0); + + for (int j = 0; j < field_0x5E81[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].field_0x278 == 1) { + if (j != 0) { + s32 otherNoteIdx = field_0x5EE8[acc + j - 1]; + f32 f = mNotes[otherNoteIdx].mNote.getField0x260(); + if (0.0f <= f - 2.0f) { + mNotes[noteIdx].field_0x278 = 2; + mNotes[noteIdx].mNote.setFrame(f - 2.0f); + } else { + mNotes[noteIdx].mNote.setFrame(0.0f); + } + } else { + f32 f = mNotes[noteIdx].mNote.getField0x260(); + if (0.0f <= f) { + mNotes[noteIdx].field_0x278 = 2; + mNotes[noteIdx].mNote.setFrame(f); + } + } + } + if (mNotes[noteIdx].field_0x278 >= 3 && mNotes[noteIdx].field_0x278 <= 4) { + mNotes[noteIdx].field_0x278 = 1; + mNotes[noteIdx].mNote.stopLose(); + } + } + } + } + + acc += field_0x5E4E[i]; + } + + static const u8 sTadtoneGroupColors[NUM_TADTONE_GROUPS] = {0, 1, 2, 3, 4, 5, 2, 3, 4, 5, 0, 1, 3, 5, 0, 1, 2}; + + if (mBase.fn_80298B80()) { + // TODO new local? + acc = 0; + for (int i = 0; i < NUM_TADTONE_GROUPS; i++) { + switch (field_0x5EA4[i]) { + case 0: { + for (int j = 0; j < field_0x5E5F[i]; j++) { + if (field_0x5EE8[acc + j] == NUM_TOTAL_TADTONES) { + if (dLytForceLine_c::isDone(j)) { + for (int k = 0; k < 24; k++) { + if (mNotes[k].field_0x278 == 7) { + mNotes[k].field_0x278 = 0; + mNotes[k].mNote.setColor(sTadtoneGroupColors[i]); + mNotes[k].mNote.setTransform(*mBase.getNotePane(acc + j)); + mNotes[k].mNote.setMove(); + field_0x5EE8[acc + j] = k; + break; + } + } + } + } else if (mNotes[field_0x5EE8[acc + j]].field_0x278 == 5) { + break; + } + } + + for (int j = 0; j < field_0x5E5F[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && mNotes[noteIdx].mNote.isMove() && + mNotes[noteIdx].field_0x278 == 0) { + if (j != 0) { + s32 otherNoteIdx = field_0x5EE8[acc + j - 1]; + f32 f = mNotes[otherNoteIdx].mNote.getField0x260(); + if (0.0f <= f - 2.0f) { + mNotes[noteIdx].field_0x278 = 2; + mNotes[noteIdx].mNote.setFrame(f - 2.0f); + field_0x5E81[i]++; + } else { + mNotes[noteIdx].mNote.setFrame(0.0f); + } + } else { + f32 f = mNotes[noteIdx].mNote.getField0x260(); + if (0.0f <= f) { + mNotes[noteIdx].field_0x278 = 2; + mNotes[noteIdx].mNote.setFrame(f); + field_0x5E81[i]++; + } + } + } + } + break; + } + case 5: { + for (int j = 0; j < field_0x5E4E[i]; j++) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES) { + mNotes[noteIdx].field_0x278 = 6; + mNotes[noteIdx].mNote.collect(); + } + } + mBase.setColor1(i); + mBase.setField_0x2251_(i, 2); + field_0x5EA4[i] = 7; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_Clef_GROUP_FIX); + break; + } + } + + acc += field_0x5E4E[i]; + } + + fn_8029A3B0(); + field_0x5F36 = field_0x5F35; } } void dLytMeterClefMain_c::finalizeState_Wait() {} @@ -583,12 +1391,12 @@ void dLytMeterClefMain_c::fn_80299E30() { mNotes[i].field_0x278 = 7; } - for (int i = 0; i < 77; i++) { - field_0x5EE8[i] = 77; + for (int i = 0; i < NUM_TOTAL_TADTONES; i++) { + field_0x5EE8[i] = NUM_TOTAL_TADTONES; } - field_0x5F35 = 18; - field_0x5F36 = 18; + field_0x5F35 = NUM_TADTONE_GROUPS + 1; // TODO ??? + field_0x5F36 = NUM_TADTONE_GROUPS + 1; field_0x5E4D = 0; field_0x5F3C = 60; @@ -608,7 +1416,7 @@ void dLytMeterClefMain_c::fn_8029A050() { if (field_0x5E5F[i] == field_0x5E4E[i]) { field_0x5EA4[i] = 8; field_0x5E81[i] = field_0x5E4E[i]; - mBase.fn_802978F0(i); + mBase.setColor0(i); } } } @@ -656,8 +1464,8 @@ void dLytMeterClefMain_c::fn_8029A440() { } bool b = true; for (int j = 0; j < field_0x5E4E[i]; j++) { - // TODO cast - if ((s32)field_0x5EE8[acc + j] != 77 && !mNotes[field_0x5EE8[acc + j]].mNote.isStateWait()) { + s32 noteIdx = field_0x5EE8[acc + j]; + if (noteIdx != NUM_TOTAL_TADTONES && !mNotes[noteIdx].mNote.isStateWait()) { b = false; } }