From f8c9af7dc612f635253eb4b75d8b4e802a8e15cd Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 4 Dec 2025 00:31:49 +0100 Subject: [PATCH] 82% --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 50 +- include/d/lyt/d_lyt_mini_game.h | 139 ++++-- include/d/snd/d_snd_small_effect_mgr.h | 2 +- src/d/lyt/d_lyt_mini_game.cpp | 618 ++++++++++++++++++++++--- src/d/snd/d_snd_small_effect_mgr.cpp | 2 +- 6 files changed, 689 insertions(+), 123 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 3cf914ad..e4f60c69 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1620,6 +1620,7 @@ d/lyt/d_lyt_mini_game.cpp: .text start:0x8028BCE0 end:0x802969E0 align:16 .rodata start:0x804EE7D8 end:0x804EEB68 .data start:0x80538E58 end:0x80539B68 + .sdata start:0x80573B90 end:0x80573BB0 .sbss start:0x80575970 end:0x80575990 .sdata2 start:0x8057C700 end:0x8057C760 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 618d614a..9de06218 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15409,21 +15409,21 @@ remove__21dLytMiniGameScoreSd_cFv = .text:0x802937C0; // type:function size:0x74 execute__21dLytMiniGameScoreSd_cFv = .text:0x80293840; // type:function size:0xF0 draw__21dLytMiniGameScoreSd_cFv = .text:0x80293930; // type:function size:0x48 init__21dLytMiniGameScoreSd_cFv = .text:0x80293980; // type:function size:0xA8 -fn_80293A30__21dLytMiniGameScoreSd_cFv = .text:0x80293A30; // type:function size:0x60 -fn_80293A90__21dLytMiniGameScoreSd_cFv = .text:0x80293A90; // type:function size:0x60 -fn_80293AF0__21dLytMiniGameScoreSd_cFl = .text:0x80293AF0; // type:function size:0xC0 -fn_80293BB0__21dLytMiniGameScoreSd_cFv = .text:0x80293BB0; // type:function size:0xA8 -fn_80293C60__21dLytMiniGameScoreSd_cFv = .text:0x80293C60; // type:function size:0xE0 -fn_80293D40__21dLytMiniGameScoreSd_cFv = .text:0x80293D40; // type:function size:0x80 -fn_80293DC0__21dLytMiniGameScoreSd_cFv = .text:0x80293DC0; // type:function size:0x80 -fn_80293E40__21dLytMiniGameScoreSd_cFv = .text:0x80293E40; // type:function size:0x88 -fn_80293ED0__21dLytMiniGameScoreSd_cFv = .text:0x80293ED0; // type:function size:0x74 -fn_80293F50__21dLytMiniGameScoreSd_cFv = .text:0x80293F50; // type:function size:0x54 -fn_80293FB0__21dLytMiniGameScoreSd_cFv = .text:0x80293FB0; // type:function size:0x54 -fn_80294010__21dLytMiniGameScoreSd_cFv = .text:0x80294010; // type:function size:0xC -fn_80294020__21dLytMiniGameScoreSd_cFv = .text:0x80294020; // type:function size:0xC -fn_80294030__21dLytMiniGameScoreSd_cCFv = .text:0x80294030; // type:function size:0x44 -fn_80294080__21dLytMiniGameScoreSd_cCFv = .text:0x80294080; // type:function size:0x44 +setScoreUp__21dLytMiniGameScoreSd_cFl = .text:0x80293A30; // type:function size:0x60 +setScoreDown__21dLytMiniGameScoreSd_cFl = .text:0x80293A90; // type:function size:0x60 +setScoreInternal__21dLytMiniGameScoreSd_cFl = .text:0x80293AF0; // type:function size:0xC0 +setHighestDigitIndex__21dLytMiniGameScoreSd_cFl = .text:0x80293BB0; // type:function size:0xA8 +setDigit__21dLytMiniGameScoreSd_cFll = .text:0x80293C60; // type:function size:0xE0 +resetScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80293D40; // type:function size:0x80 +resetScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80293DC0; // type:function size:0x80 +resetDigits__21dLytMiniGameScoreSd_cFv = .text:0x80293E40; // type:function size:0x88 +resetPosition__21dLytMiniGameScoreSd_cFv = .text:0x80293ED0; // type:function size:0x74 +startScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80293F50; // type:function size:0x54 +startScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80293FB0; // type:function size:0x54 +stopScoreUp__21dLytMiniGameScoreSd_cFv = .text:0x80294010; // type:function size:0xC +stopScoreDown__21dLytMiniGameScoreSd_cFv = .text:0x80294020; // type:function size:0xC +isScoreUpEndReached__21dLytMiniGameScoreSd_cCFv = .text:0x80294030; // type:function size:0x44 +isScoreDownEndReached__21dLytMiniGameScoreSd_cCFv = .text:0x80294080; // type:function size:0x44 dLytMiniGame_c_classInit__Fv = .text:0x802940D0; // type:function size:0x380 __dt__19dLytMiniGameScore_cFv = .text:0x80294450; // type:function size:0x74 __dt__21dLytMiniGameScoreSd_cFv = .text:0x802944D0; // type:function size:0x74 @@ -15433,10 +15433,10 @@ __dt__18dLytMiniGameBugs_cFv = .text:0x80294650; // type:function size:0x74 __ct__26dLytMiniGamePumpkinParts_cFv = .text:0x802946D0; // type:function size:0x6C __dt__26dLytMiniGamePumpkinParts_cFv = .text:0x80294740; // type:function size:0x74 __dt__21dLytMiniGamePumpkin_cFv = .text:0x802947C0; // type:function size:0x68 -LytMiniGame__init = .text:0x80294830; // type:function size:0xA94 -LytMiniGame__destructRes = .text:0x802952D0; // type:function size:0x31C -fn_802955F0 = .text:0x802955F0; // type:function size:0xD4 -fn_802956D0 = .text:0x802956D0; // type:function size:0x6C +create__14dLytMiniGame_cFv = .text:0x80294830; // type:function size:0xA94 +doDelete__14dLytMiniGame_cFv = .text:0x802952D0; // type:function size:0x31C +execute__14dLytMiniGame_cFv = .text:0x802955F0; // type:function size:0xD4 +draw__14dLytMiniGame_cFv = .text:0x802956D0; // type:function size:0x6C scoreRelatedExecute__14dLytMiniGame_cFv = .text:0x80295740; // type:function size:0x8C scoreRelated__14dLytMiniGame_cFv = .text:0x802957D0; // type:function size:0x78 setDisplayedPoints__14dLytMiniGame_cFl = .text:0x80295850; // type:function size:0xA8 @@ -15480,11 +15480,11 @@ fn_802962A0 = .text:0x802962A0; // type:function size:0x88 fn_80296330 = .text:0x80296330; // type:function size:0xA4 fn_802963E0 = .text:0x802963E0; // type:function size:0x98 fn_80296480 = .text:0x80296480; // type:function size:0x98 -fn_80296520 = .text:0x80296520; // type:function size:0x58 -fn_80296580 = .text:0x80296580; // type:function size:0x130 -fn_802966B0 = .text:0x802966B0; // type:function size:0x30 -fn_802966E0 = .text:0x802966E0; // type:function size:0x40 -decrementLayoutArcRefCount = .text:0x80296720; // type:function size:0x4C +init__14dLytMiniGame_cFv = .text:0x80296520; // type:function size:0x58 +loadData__14dLytMiniGame_cFPCcl = .text:0x80296580; // type:function size:0x130 +isLoading__14dLytMiniGame_cCFPCc = .text:0x802966B0; // type:function size:0x30 +attachLoadedData__14dLytMiniGame_cFPCcRQ23d2d10ResAccIf_c = .text:0x802966E0; // type:function size:0x40 +unloadData__14dLytMiniGame_cFPCc = .text:0x80296720; // type:function size:0x4C __dt__14dLytMiniGame_cFv = .text:0x80296770; // type:function size:0x270 LytMeterSuiryuScoreBase__stateNoneEnter = .text:0x802969E0; // type:function size:0x4 LytMeterSuiryuScoreBase__stateNoneUpdate = .text:0x802969F0; // type:function size:0x4 @@ -20855,7 +20855,7 @@ playMinigameStartSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA80; // type:fun playMinigameFinishSound__20dSndSmallEffectMgr_cFv = .text:0x8037EA90; // type:function size:0x40 playMinigameFinishWhistleSound__20dSndSmallEffectMgr_cFv = .text:0x8037EAD0; // type:function size:0x40 playMinigameScoreUpSound__20dSndSmallEffectMgr_cFl = .text:0x8037EB10; // type:function size:0x11C -playMinigameScoreDownSound__20dSndSmallEffectMgr_cFv = .text:0x8037EC30; // type:function size:0x8 +playMinigameScoreDownSound__20dSndSmallEffectMgr_cFl = .text:0x8037EC30; // type:function size:0x8 playMinigameMusasabiSound__20dSndSmallEffectMgr_cFl = .text:0x8037EC40; // type:function size:0x3C playSkbSound__20dSndSmallEffectMgr_cFUl = .text:0x8037EC80; // type:function size:0xB0 playDemoSound__20dSndSmallEffectMgr_cFUlPQ34nw4r3snd11SoundHandle = .text:0x8037ED30; // type:function size:0x68 diff --git a/include/d/lyt/d_lyt_mini_game.h b/include/d/lyt/d_lyt_mini_game.h index 1e2a25cf..6ec7bc2d 100644 --- a/include/d/lyt/d_lyt_mini_game.h +++ b/include/d/lyt/d_lyt_mini_game.h @@ -145,18 +145,28 @@ private: /** 2D UI - Mini Game - Time */ class dLytMiniGameTime_c { +public: + enum Variant_e { + TIME_VARIANT_0, + TIME_VARIANT_1, + TIME_VARIANT_2, + TIME_VARIANT_3, + TIME_VARIANT_4, + TIME_VARIANT_5, + }; + public: dLytMiniGameTime_c() : field_0x7D4(0), mCurrentTimerValueMilliSeconds(0), mCurrentTimerValueSeconds(0), mLastTimerValueSeconds(0), - mTimerVariant(0), + mTimeFormat(0), mHighestDigitIndex(0), field_0x7EC(false), field_0x7ED(false), field_0x7EE(false), - field_0x7F0(0), + mVariant(0), field_0x7F4(0), mIsVisible(false) {} virtual ~dLytMiniGameTime_c() {} @@ -167,8 +177,16 @@ public: bool draw(); void init(); + void setVariant(s32 var) { + mVariant = var; + } + + void setField_0x7EE(bool v) { + field_0x7EE = v; + } + private: - enum TimerVariant_e { + enum TimeFormat_e { TIMER_LONG, TIMER_SECONDS, }; @@ -224,12 +242,12 @@ private: /* 0x7D8 */ s32 mCurrentTimerValueMilliSeconds; /* 0x7DC */ s32 mCurrentTimerValueSeconds; /* 0x7E0 */ s32 mLastTimerValueSeconds; - /* 0x7E4 */ u8 mTimerVariant; + /* 0x7E4 */ u8 mTimeFormat; /* 0x7E4 */ s32 mHighestDigitIndex; /* 0x7EC */ bool field_0x7EC; /* 0x7ED */ bool field_0x7ED; /* 0x7EE */ bool field_0x7EE; - /* 0x7F0 */ UNKWORD field_0x7F0; + /* 0x7F0 */ s32 mVariant; /* 0x7F4 */ u8 field_0x7F4; /* 0x7F5 */ bool mIsVisible; }; @@ -278,6 +296,15 @@ private: /** 2D UI - Mini Game - Score counter */ class dLytMiniGameScore_c { +public: + enum Variant_e { + SCORE_VARIANT_0, + SCORE_VARIANT_1, + SCORE_VARIANT_2, + SCORE_VARIANT_3, + SCORE_VARIANT_4, + }; + public: dLytMiniGameScore_c() : mScore(0), @@ -298,7 +325,7 @@ public: field_0x814(false), field_0x815(false), field_0x816(false), - field_0x818(0), + mVariant(SCORE_VARIANT_0), field_0x81C(0), field_0x820(false), field_0x824(0), @@ -315,6 +342,14 @@ public: bool draw(); void init(); + void setVariant(s32 var) { + mVariant = var; + } + + void setField_0x816(bool v) { + field_0x816 = v; + } + private: void fn_80291410(); void fn_802915B0(); @@ -396,7 +431,7 @@ private: /* 0x814 */ bool field_0x814; /* 0x815 */ bool field_0x815; /* 0x816 */ bool field_0x816; - /* 0x818 */ s32 field_0x818; + /* 0x818 */ s32 mVariant; /* 0x81C */ s32 field_0x81C; /* 0x820 */ bool field_0x820; /* 0x824 */ s32 field_0x824; @@ -423,21 +458,21 @@ public: private: static dLytMiniGameScoreSd_c *sInstance; - void fn_80293A30(); - void fn_80293A90(); - void fn_80293AF0(s32); - void fn_80293BB0(); - void fn_80293C60(); - void fn_80293D40(); - void fn_80293DC0(); - void fn_80293E40(); - void fn_80293ED0(); - void fn_80293F50(); - void fn_80293FB0(); - void fn_80294010(); - void fn_80294020(); - bool fn_80294030() const; - bool fn_80294080() const; + void setScoreUp(s32 score); + void setScoreDown(s32 score); + void setScoreInternal(s32 score); + void setHighestDigitIndex(s32); + void setDigit(s32 digitIndex, s32 number); + void resetScoreUp(); + void resetScoreDown(); + void resetDigits(); + void resetPosition(); + void startScoreUp(); + void startScoreDown(); + void stopScoreUp(); + void stopScoreDown(); + bool isScoreUpEndReached() const; + bool isScoreDownEndReached() const; /* 0x004 */ d2d::LytBase_c mLyt; /* 0x094 */ d2d::AnmGroup_c mAnm[5]; @@ -447,6 +482,37 @@ private: }; class dLytMiniGame_c : public dBase_c { +public: + enum Variant_e { + VARIANT_0, + VARIANT_1, + VARIANT_2, + VARIANT_3, + VARIANT_4, + VARIANT_5, + VARIANT_6, + VARIANT_7, + VARIANT_8, + VARIANT_9, + VARIANT_10, + VARIANT_11, + VARIANT_12, + VARIANT_13, + VARIANT_14, + VARIANT_15, + VARIANT_16, + }; + +private: + enum Slot_e { + SLOT_MINI_GAME, + SLOT_MINI_GAME_SCORE, + SLOT_MINI_GAME_TIME, + SLOT_MINI_GAME_BUGS, + SLOT_MINI_GAME_PUMPKIN, + SLOT_MINI_GAME_SCORE_SD, + }; + public: dLytMiniGame_c() : field_0x0068(0), @@ -455,7 +521,7 @@ public: field_0x006B(0), field_0x006C(0), field_0x006D(0), - field_0x1510(1), + mVariant(1), field_0x3864(0), field_0x3865(0), field_0x3866(false), @@ -463,6 +529,11 @@ public: field_0x3868(0) {} virtual ~dLytMiniGame_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int execute() override; + virtual int draw() override; + static dLytMiniGame_c *GetInstance() { return sInstance; } @@ -498,6 +569,14 @@ public: private: static dLytMiniGame_c *sInstance; + bool isLoading(const char *name) const; + bool loadData(const char *name, s32 slot); + void unloadData(const char *name); + void attachLoadedData(const char *name, d2d::ResAccIf_c &resAcc); + + + void init(); + /* 0x0068 */ u8 field_0x0068; /* 0x0069 */ u8 field_0x0069; /* 0x006A */ u8 field_0x006A; @@ -505,14 +584,14 @@ private: /* 0x006C */ u8 field_0x006C; /* 0x006D */ u8 field_0x006D; - /* 0x0070 */ d2d::ResAccIf_c mResAcc1; - /* 0x03E0 */ d2d::ResAccIf_c mResAcc2; - /* 0x0750 */ d2d::ResAccIf_c mResAcc3; - /* 0x0AC0 */ d2d::ResAccIf_c mResAcc4; - /* 0x0E30 */ d2d::ResAccIf_c mResAcc5; - /* 0x11A0 */ d2d::ResAccIf_c mResAcc6; + /* 0x0070 */ d2d::ResAccIf_c mResAccStart; + /* 0x03E0 */ d2d::ResAccIf_c mResAccScore; + /* 0x0750 */ d2d::ResAccIf_c mResAccTime; + /* 0x0AC0 */ d2d::ResAccIf_c mResAccBugs; + /* 0x0E30 */ d2d::ResAccIf_c mResAccPumpkin; + /* 0x11A0 */ d2d::ResAccIf_c mResAccScoreSd; - /* 0x1510 */ UNKWORD field_0x1510; + /* 0x1510 */ s32 mVariant; /* 0x1514 */ dLytMiniGameScore_c mScore; /* 0x1D64 */ dLytMiniGameScoreSd_c mScoreSd; diff --git a/include/d/snd/d_snd_small_effect_mgr.h b/include/d/snd/d_snd_small_effect_mgr.h index 8631e6fe..08b524cd 100644 --- a/include/d/snd/d_snd_small_effect_mgr.h +++ b/include/d/snd/d_snd_small_effect_mgr.h @@ -62,7 +62,7 @@ public: bool playMinigameFinishSound(); bool playMinigameFinishWhistleSound(); bool playMinigameScoreUpSound(s32 param); - bool playMinigameScoreDownSound(); + bool playMinigameScoreDownSound(s32 score); bool playMinigameMusasabiSound(s32 count); bool playSkbSound(u32 soundId); diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 292d8863..2fdeb81f 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -8,6 +8,7 @@ #include "d/lyt/d2d.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/lyt/lyt_types.h" @@ -819,7 +820,7 @@ bool dLytMiniGameTime_c::execute() { } if (mIsVisible) { - switch (mTimerVariant) { + switch (mTimeFormat) { case TIMER_LONG: updateLongTimer(); break; case TIMER_SECONDS: updateSecondsTimer(); break; } @@ -865,14 +866,14 @@ bool dLytMiniGameTime_c::execute() { mLyt.calc(); } - if (mTimerVariant == TIMER_SECONDS) { + if (mTimeFormat == TIMER_SECONDS) { if (mCurrentTimerValueSeconds <= 10 && mLastTimerValueSeconds != mCurrentTimerValueSeconds) { dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(mCurrentTimerValueSeconds); } saveSecondsTimer(); } - if (field_0x7F0 == 0) { + if (mVariant == TIME_VARIANT_0) { if (mCurrentTimerValueSeconds >= 590 && mLastTimerValueSeconds != mCurrentTimerValueSeconds && mCurrentTimerValueSeconds != 600) { dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(600 - mCurrentTimerValueSeconds); @@ -898,13 +899,13 @@ void dLytMiniGameTime_c::init() { return; } - switch (field_0x7F0) { - case 0: mTimerVariant = TIMER_LONG; break; - case 1: mTimerVariant = TIMER_SECONDS; break; - case 2: mTimerVariant = TIMER_SECONDS; break; - case 3: mTimerVariant = TIMER_LONG; break; - case 4: mTimerVariant = TIMER_LONG; break; - case 5: mTimerVariant = TIMER_LONG; break; + switch (mVariant) { + case TIME_VARIANT_0: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_1: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_2: mTimeFormat = TIMER_SECONDS; break; + case TIME_VARIANT_3: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_4: mTimeFormat = TIMER_LONG; break; + case TIME_VARIANT_5: mTimeFormat = TIMER_LONG; break; } resetAlphaIn(); @@ -1267,7 +1268,7 @@ void dLytMiniGameTime_c::resetDigits() { } void dLytMiniGameTime_c::resetPosition() { - switch (mTimerVariant) { + switch (mTimeFormat) { case TIMER_LONG: setTimePosition(false); setBestHasSixDigits(false); @@ -1904,13 +1905,13 @@ bool dLytMiniGameScore_c::execute() { if (mIsVisible) { fn_80291BC0(); if (!field_0x816) { - switch (field_0x818) { - case 0: + switch (mVariant) { + case SCORE_VARIANT_0: if (hasIncreasedScore()) { startGetScore(); } break; - case 2: + case SCORE_VARIANT_2: if (field_0x829) { if (hasIncreasedScore()) { startGetScore(); @@ -1923,15 +1924,15 @@ bool dLytMiniGameScore_c::execute() { field_0x829 = false; } break; - case 1: + case SCORE_VARIANT_1: if (mScore != 1) { if (hasIncreasedScore()) { startGetScore(); } } break; - case 3: - case 4: + case SCORE_VARIANT_3: + case SCORE_VARIANT_4: if (hasIncreasedScore()) { startGetScore(); } @@ -1985,7 +1986,7 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && field_0x818 == 0 && hasIncreasedScore()) { + if (!field_0x816 && mVariant == SCORE_VARIANT_0 && hasIncreasedScore()) { dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } @@ -2050,8 +2051,8 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_IN].setAnimEnable(false); - switch (field_0x818) { - case 0: + switch (mVariant) { + case SCORE_VARIANT_0: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2087,7 +2088,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 1: + case SCORE_VARIANT_1: field_0x830 = 0; field_0x82C = 0; field_0x81C = 11; @@ -2148,7 +2149,7 @@ void dLytMiniGameScore_c::init() { } fn_80293450(field_0x81C); break; - case 2: + case SCORE_VARIANT_2: field_0x830 = 0; field_0x82C = 0; field_0x81C = 6; @@ -2167,7 +2168,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 3: + case SCORE_VARIANT_3: field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; @@ -2203,7 +2204,7 @@ void dLytMiniGameScore_c::init() { fn_80293450(field_0x81C); break; - case 4: + case SCORE_VARIANT_4: field_0x830 = 0; field_0x82C = 0; field_0x81C = 19; @@ -2265,7 +2266,7 @@ void dLytMiniGameScore_c::fn_80291410() { field_0x820 = true; mIsVisible = true; - if (field_0x818 == 1) { + if (mVariant == SCORE_VARIANT_1) { setScore(1); calcNumDigits(); mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); @@ -2455,11 +2456,11 @@ void dLytMiniGameScore_c::fn_80291BC0() { calcNumDigits(); realizePosition(); - if (field_0x818 == 1) { + if (mVariant == SCORE_VARIANT_1) { if (field_0x828) { fn_80291EF0(); } - } else if (field_0x818 == 2) { + } else if (mVariant == SCORE_VARIANT_2) { fn_80292040(); } @@ -2835,8 +2836,8 @@ void dLytMiniGameScore_c::fn_80292C30() { PaneCalc calc; - switch (field_0x818) { - case 0: { + switch (mVariant) { + case SCORE_VARIANT_0: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(1); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2850,7 +2851,7 @@ void dLytMiniGameScore_c::fn_80292C30() { break; } - case 3: { + case SCORE_VARIANT_3: { dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); loadTextVariant(0); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); @@ -2948,14 +2949,15 @@ static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_scoreDown.brlan", "G_animAll_00"}, }; -#define SCORE_SD_ANIM_0_TO_9_0 0 -#define SCORE_SD_ANIM_0_TO_9_1 1 +#define SCORE_SD_ANIM_0_TO_9_OFFSET 0 #define SCORE_SD_ANIM_SET_POSITION 2 #define SCORE_SD_ANIM_SCORE_UP 3 #define SCORE_SD_ANIM_SCORE_DOWN 4 #define SCORE_SD_NUM_ANIMS 5 +#define SCORE_SD_NUM_DIGITS 2 + bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("miniGameScoreSd_00.brlyt", nullptr); @@ -2990,13 +2992,13 @@ bool dLytMiniGameScoreSd_c::execute() { } if (mIsVisible) { - if (fn_80294030()) { - fn_80294010(); + if (isScoreUpEndReached()) { + stopScoreUp(); mIsVisible = false; } - if (fn_80294080()) { - fn_80294020(); + if (isScoreDownEndReached()) { + stopScoreDown(); mIsVisible = false; } @@ -3027,11 +3029,11 @@ void dLytMiniGameScoreSd_c::init() { return; } - fn_80293D40(); - fn_80293DC0(); - fn_80293E40(); - fn_80293ED0(); - fn_80293AF0(0); + resetScoreUp(); + resetScoreDown(); + resetDigits(); + resetPosition(); + setScoreInternal(0); mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2(); mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); @@ -3039,65 +3041,549 @@ void dLytMiniGameScoreSd_c::init() { mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293A30() { - +void dLytMiniGameScoreSd_c::setScoreUp(s32 score) { + if (sInstance == nullptr) { + return; + } + setScoreInternal(score); + startScoreUp(); + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(score); + mIsVisible = true; } -void dLytMiniGameScoreSd_c::fn_80293A90() { - +void dLytMiniGameScoreSd_c::setScoreDown(s32 score) { + if (sInstance == nullptr) { + return; + } + setScoreInternal(score); + startScoreUp(); + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreDownSound(score); + mIsVisible = true; } -void dLytMiniGameScoreSd_c::fn_80293AF0(s32) { +void dLytMiniGameScoreSd_c::setScoreInternal(s32 score) { + s32 digits[2]; + digits[1] = score / 10; + digits[0] = score % 10; + + s32 num = 0; + if (digits[1] != 0) { + num = 1; + } else if (digits[0] != 0) { + num = 0; + } + setHighestDigitIndex(num); + for (int i = 0; i <= num; i++) { + setDigit(i, digits[i]); + } + field_0x1D4 = score; } -void dLytMiniGameScoreSd_c::fn_80293BB0() { +void dLytMiniGameScoreSd_c::setHighestDigitIndex(s32 num) { + f32 frame = num + 6.0f; + mAnm[SCORE_SD_ANIM_SET_POSITION].setRate(0.0f); + mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(frame); + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293C60() { +void dLytMiniGameScoreSd_c::setDigit(s32 digitIndex, s32 number) { + u8 idx = digitIndex + SCORE_SD_ANIM_0_TO_9_OFFSET; + f32 frame = 0.0f; + switch (number) { + case 0: frame = 0.0f; break; + case 1: frame = 1.0f; break; + case 2: frame = 2.0f; break; + case 4: frame = 3.0f; break; + case 6: frame = 4.0f; break; + case 8: frame = 5.0f; break; + } + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); + + mLyt.calc(); + + mAnm[idx].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293D40() { +void dLytMiniGameScoreSd_c::resetScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293DC0() { +void dLytMiniGameScoreSd_c::resetScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToEnd2(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293E40() { - +void dLytMiniGameScoreSd_c::resetDigits() { + // NOTE: includes SCORE_SD_ANIM_SET_POSITION + for (int i = 0; i <= SCORE_SD_NUM_DIGITS; i++) { + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setForwardOnce(); + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setFrame(0.0f); + mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScoreSd_c::fn_80293ED0() { +void dLytMiniGameScoreSd_c::resetPosition() { + mAnm[SCORE_SD_ANIM_SET_POSITION].setForwardOnce(); + mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(6.0f); + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80293F50() { - +void dLytMiniGameScoreSd_c::startScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setToStart(); + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true); } -void dLytMiniGameScoreSd_c::fn_80293FB0() { - +void dLytMiniGameScoreSd_c::startScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToStart(); + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true); } -void dLytMiniGameScoreSd_c::fn_80294010() { - +void dLytMiniGameScoreSd_c::stopScoreUp() { + mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false); } -void dLytMiniGameScoreSd_c::fn_80294020() { - +void dLytMiniGameScoreSd_c::stopScoreDown() { + mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false); } -bool dLytMiniGameScoreSd_c::fn_80294030() const { - +bool dLytMiniGameScoreSd_c::isScoreUpEndReached() const { + s32 idx = SCORE_SD_ANIM_SCORE_UP; + if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) { + return true; + } + return false; } -bool dLytMiniGameScoreSd_c::fn_80294080() const { - +bool dLytMiniGameScoreSd_c::isScoreDownEndReached() const { + s32 idx = SCORE_SD_ANIM_SCORE_DOWN; + if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) { + return true; + } + return false; } - SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9); + +static const char *sMiniGame = "MiniGame"; +static const char *sMiniGameScore = "MiniGameScore"; +static const char *sMiniGameTime = "MiniGameTime"; +static const char *sMiniGameBugs = "MiniGameBugs"; +static const char *sMiniGamePumpkin = "MiniGamePumpkin"; +static const char *sMiniGameSd = "MiniGameSd"; + +int dLytMiniGame_c::create() { + mVariant = mParams; + switch (mVariant) { + case VARIANT_1: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_2: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameSd, SLOT_MINI_GAME_SCORE_SD) || + loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameSd) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameSd, mResAccScoreSd); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_1); + mScore.build(&mResAccScore); + mScoreSd.build(&mResAccScoreSd); + mStart.build(&mResAccStart); + break; + } + case VARIANT_3: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_4: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameBugs, SLOT_MINI_GAME_BUGS) || + loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameBugs) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameBugs, mResAccBugs); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.build(&mResAccTime); + mBugs.build(&mResAccBugs); + mStart.build(&mResAccStart); + break; + } + case VARIANT_5: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || + loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameScore) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameScore, mResAccScore); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_1); + mTime.build(&mResAccTime); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_4); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + break; + } + case VARIANT_6: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGamePumpkin, SLOT_MINI_GAME_PUMPKIN) || + loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGamePumpkin) || isLoading(sMiniGameScore) || + isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGamePumpkin, mResAccPumpkin); + attachLoadedData(sMiniGameScore, mResAccScore); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_2); + mTime.build(&mResAccTime); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.build(&mResAccScore); + mStart.build(&mResAccStart); + mPumpkin.build(&mResAccPumpkin); + break; + } + case VARIANT_7: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_8: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_9: { + if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) { + return NOT_READY; + } + + attachLoadedData(sMiniGame, mResAccStart); + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.build(&mResAccTime); + mStart.build(&mResAccStart); + break; + } + case VARIANT_10: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_0); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_11: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_2); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_12: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_0); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_13: { + if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) { + return NOT_READY; + } + if (isLoading(sMiniGameScore)) { + return NOT_READY; + } + attachLoadedData(sMiniGameScore, mResAccScore); + mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_3); + mScore.setField_0x816(true); + mScore.build(&mResAccScore); + break; + } + case VARIANT_14: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_3); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_15: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_4); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + case VARIANT_16: { + if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) { + return NOT_READY; + } + if (isLoading(sMiniGameTime)) { + return NOT_READY; + } + attachLoadedData(sMiniGameTime, mResAccTime); + mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_5); + mTime.setField_0x7EE(true); + mTime.build(&mResAccTime); + break; + } + } + + init(); + + sInstance = this; + return SUCCEEDED; +} + +int dLytMiniGame_c::doDelete() { + mScore.remove(); + mScoreSd.remove(); + mStart.remove(); + mTime.remove(); + mBugs.remove(); + mPumpkin.remove(); + + switch (mVariant) { + case VARIANT_1: { + mResAccStart.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + break; + } + case VARIANT_2: { + mResAccStart.detach(); + mResAccScoreSd.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameSd); + unloadData(sMiniGameScore); + break; + } + case VARIANT_3: { + mResAccStart.detach(); + mResAccScore.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + break; + } + case VARIANT_4: { + mResAccStart.detach(); + mResAccBugs.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameBugs); + unloadData(sMiniGameTime); + break; + } + case VARIANT_5: { + mResAccStart.detach(); + mResAccScore.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameScore); + unloadData(sMiniGameTime); + break; + } + case VARIANT_6: { + mResAccStart.detach(); + mResAccPumpkin.detach(); + mResAccScore.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGamePumpkin); + unloadData(sMiniGameScore); + unloadData(sMiniGameTime); + break; + } + case VARIANT_7: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_8: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_9: { + mResAccStart.detach(); + mResAccTime.detach(); + unloadData(sMiniGame); + unloadData(sMiniGameTime); + break; + } + case VARIANT_10: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_11: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_12: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_13: { + mResAccScore.detach(); + unloadData(sMiniGameScore); + break; + } + case VARIANT_14: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_15: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + case VARIANT_16: { + mResAccTime.detach(); + unloadData(sMiniGameTime); + break; + } + } + + sInstance = nullptr; + return SUCCEEDED; +} + +int dLytMiniGame_c::execute() { + return SUCCEEDED; +} + +int dLytMiniGame_c::draw() { + return SUCCEEDED; +} + +void dLytMiniGame_c::init() { + mScore.init(); + mScoreSd.init(); + mStart.init(); + mTime.init(); + mBugs.init(); + mPumpkin.init(); +} diff --git a/src/d/snd/d_snd_small_effect_mgr.cpp b/src/d/snd/d_snd_small_effect_mgr.cpp index 0728448f..c1301d31 100644 --- a/src/d/snd/d_snd_small_effect_mgr.cpp +++ b/src/d/snd/d_snd_small_effect_mgr.cpp @@ -544,7 +544,7 @@ bool dSndSmallEffectMgr_c::playMinigameScoreUpSound(s32 param) { return playSoundInternal(soundId); } -bool dSndSmallEffectMgr_c::playMinigameScoreDownSound() { +bool dSndSmallEffectMgr_c::playMinigameScoreDownSound(s32 score) { return playSoundInternal(SE_S_MG_SCORE_DOWN); }