diff options
| author | robojumper <robojumper@gmail.com> | 2025-12-02 23:13:37 +0100 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-12-02 23:13:43 +0100 |
| commit | ba810ccc9e8fd2f43518293339977cf62c9fb7f2 (patch) | |
| tree | 53cbf3ad0d7d27244a71a371fe8205c37b98053c /src | |
| parent | f6d4e45c1a48c26556e32a155172a3fde727f7ba (diff) | |
71%
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/lyt/d_lyt_mini_game.cpp | 793 |
1 files changed, 551 insertions, 242 deletions
diff --git a/src/d/lyt/d_lyt_mini_game.cpp b/src/d/lyt/d_lyt_mini_game.cpp index 8d45db0b..292d8863 100644 --- a/src/d/lyt/d_lyt_mini_game.cpp +++ b/src/d/lyt/d_lyt_mini_game.cpp @@ -10,6 +10,7 @@ #include "d/snd/d_snd_wzsound.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" #include "nw4r/math/math_arithmetic.h" #include "nw4r/math/math_types.h" #include "toBeSorted/d_d3d.h" @@ -1284,6 +1285,7 @@ void dLytMiniGameTime_c::resetFinish() { mAnm[i + TIME_ANIM_FINISH_OFFSET].setForwardOnce(); mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart(); mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true); + // NOTE: Unnecessary calc here? mLyt.calc(); } @@ -1834,6 +1836,13 @@ static const char *sScorePanes[] = { "P_position_00", "P_position_01", "P_position_02", "P_position_03", "P_position_04", }; +#define SCORE_PANE_CENTER 0 +#define SCORE_PANE_POSITION_ALL 1 +#define SCORE_PANE_POSITION 2 +#define SCORE_PANE_UNIT 3 + +#define SCORE_PANE_P_POSITION_0 15 + #define SCORE_NUM_PANES 20 bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) { @@ -1888,7 +1897,7 @@ bool dLytMiniGameScore_c::execute() { field_0x804 = false; field_0x829 = false; } else { - fn_80292030(field_0x810); + increaseScore(field_0x810); } } @@ -1897,69 +1906,73 @@ bool dLytMiniGameScore_c::execute() { if (!field_0x816) { switch (field_0x818) { case 0: - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } break; case 2: if (field_0x829) { - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } - fn_80291E90(); + + if (hasDecreasedScore()) { + // nothing + } + field_0x829 = false; } break; case 1: - if (field_0x7D8 != 1) { - if (fn_80291E50()) { - fn_80291960(); + if (mScore != 1) { + if (hasIncreasedScore()) { + startGetScore(); } } break; case 3: case 4: - if (fn_80291E50()) { - fn_80291960(); + if (hasIncreasedScore()) { + startGetScore(); } break; } } - if (fn_80292A50()) { - fn_80292910(); + if (isInEndReached()) { + stopIn(); field_0x814 = true; } - if (fn_80292AA0()) { - fn_80292920(); - fn_80292A40(); - fn_80292880(); + if (isOutEndReached()) { + stopOut(); + stopLoop(); + resetLoop(); mIsVisible = false; } - if (fn_80292AF0()) { - fn_80292930(); + if (isAlphaInEndReached()) { + stopAlphaIn(); if (field_0x816) { startLoop(); } } - if (fn_80292B40()) { - fn_80292940(); + if (isAlphaOutEndReached()) { + stopAlphaOut(); if (field_0x816) { - fn_80292A40(); - fn_80292880(); + stopLoop(); + resetLoop(); } mIsVisible = false; } - if (fn_80292B90()) { - fn_80292950(); + if (isGetScoreEndReached()) { + stopGetScore(); } - if (fn_80292BE0()) { - fn_802929C0(); + if (isFinishEndReached()) { + stopFinish(); startLoop(); } @@ -1972,11 +1985,11 @@ bool dLytMiniGameScore_c::execute() { mLyt.calc(); } - if (!field_0x816 && field_0x818 == 0 && fn_80291E50()) { - dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(field_0x7D8); + if (!field_0x816 && field_0x818 == 0 && hasIncreasedScore()) { + dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore); } - fn_80292240(); + saveScore(); return true; } @@ -1991,21 +2004,45 @@ bool dLytMiniGameScore_c::draw() { return true; } +// TODO this is totally arbitrary and makes no sense but it sort of looks like it generates close-ish code +// Assume the TODO also covers all the calls to `calc` below +struct PaneCalc { + PaneCalc() { + for (int i = 4; i >= 0; i--) { + work[i][1] = work[i][0] = 0.0f; + } + } + + void calc(nw4r::lyt::Pane *p1, nw4r::lyt::Pane *p2) { + nw4r::lyt::Pane *pp1 = p1->GetParent(); + nw4r::lyt::Pane *pp2 = p2->GetParent(); + + work[0][0] = p1->GetScale().x; + work[0][1] = p1->GetScale().y; + + work[1][0] = p1->GetTranslate().x + pp1->GetTranslate().x; + work[1][1] = p1->GetTranslate().y; + + work[2][0] = p2->GetTranslate().x + pp2->GetTranslate().x; + work[2][1] = p2->GetTranslate().y; + + work[3][0] = p1->GetSize().width * p1->GetScale().x; + work[3][1] = p1->GetSize().height * p1->GetScale().y; + + work[4][0] = p2->GetSize().width * p2->GetScale().x; + work[4][1] = p2->GetSize().height * p2->GetScale().y; + } + + f32 work[5][2]; +}; + void dLytMiniGameScore_c::init() { if (sInstance == nullptr) { return; } - // TODO here are floats (0.0f) initialized on the stack - // in an interesting order. Those stack slots are used in - // the TODOs below, but I haven't figured out how it really works yet. - // An array of 10 floats seems the most reasonable - // (5 mVec2_c-s already cause too much stack space to be used) - - f32 temp[10]; - for (int i = 9; i >= 0; i--) { - temp[i] = 0.0f; - } + // maybe? + PaneCalc calc; mAnm[SCORE_ANIM_IN].setForwardOnce(); mAnm[SCORE_ANIM_IN].setToEnd2(); @@ -2018,8 +2055,8 @@ void dLytMiniGameScore_c::init() { field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(1); fn_80293410(); switch (field_0x830) { case 1: @@ -2041,13 +2078,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[i + 15]; - mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[i + 15], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); mFloats[field_0x81C + i] += field_0x7FC; mFloats[field_0x81C + i] += field_0x800; } @@ -2066,44 +2099,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // init+0x474 - - /* - // Cleaned up m2c output to make the stack operations easier to understand. - // This looks like 5x2 f32, which matches the initialization sequence at the start - // of the function. Note that the stack vars aren't ever read; they're only written. - // There are some unused results here (e.g. the height * scale.y...), but I don't know - // why... - - nw4r::lyt::Pane *p1 = this->unk750; - nw4r::lyt::Pane *p2 = this->unk74C; - - sp8 = p2->mScale.x; // unused - spC = p2->mScale.y; // unused - - sp10 = p2->mParent->mTranslate.x + p2->mTranslate.x; - sp14 = p2->mTranslate.y; // unused - - sp18 = p1->mParent->mTranslate.x + p1->mTranslate.x; - sp1C = p1->mTranslate.y; // unused - - sp20 = p2->mSize.width * p2->mScale.x; - sp24 = p2->mSize.height * p2->mScale.y; // unused - - sp28 = p1->mSize.width * p1->mScale.x; - sp2C = p1->mSize.height * p1->mScale.y; // unused - - this->mFloats[field_0x81C + i] = (f32) ((sp20 * 0.5f) + ((sp28 * 0.5f) + (sp18 - sp10))); - */ - - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - - // TODO - mFloats[field_0x81C + i] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } for (int i = 0; i < field_0x7E4; i++) { @@ -2112,13 +2110,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 2] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 2] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(5.0f); @@ -2132,13 +2126,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 4] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 4] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(4.0f); @@ -2152,13 +2142,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[13]; - mFloats[field_0x81C + i + 6] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[13], mpPanes[15]); + mFloats[field_0x81C + i + 6] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); break; @@ -2174,13 +2160,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[14]; - mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[14], mpPanes[15]); + mFloats[field_0x81C + i + 6] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); @@ -2189,8 +2171,8 @@ void dLytMiniGameScore_c::init() { field_0x82C = 0; field_0x81C = 21; field_0x7E4 = 4; - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(0); fn_80293410(); switch (field_0x830) { case 1: @@ -2212,13 +2194,9 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[i + 15]; - mFloats[field_0x81C + i] = field_0x7E8 + (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[i + 15], mpPanes[15]); + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); mFloats[field_0x81C + i] += field_0x7FC; mFloats[field_0x81C + i] += field_0x800; } @@ -2237,32 +2215,28 @@ void dLytMiniGameScore_c::init() { mLyt.calc(); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); - // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[12]; - - mFloats[field_0x81C + i + 8] = (p2->GetSize().width * p2->GetScale().x / 2.0f) + - (p1->GetSize().width * p1->GetScale().x / 2.0f) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); + calc.calc(mpPanes[12], mpPanes[15]); + // NOTE: 2.0 instead of 2.0f, so this division can't be an inline... + mFloats[field_0x81C + i] = + calc.work[3][0] / 2.0 + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); } fn_80293450(field_0x81C); break; } - fn_802922F0(); - fn_80292500(); - fn_80292590(); - fn_80292610(); - fn_80292710(); - fn_80292880(); - fn_80291BA0(0); - fn_80292400(); - fn_80292480(); - fn_80292380(); - fn_80292250(); - field_0x7DC = 0; + resetDigits(); + resetSetPosition(); + resetRupeeChange(); + resetGetScore(); + resetFinish(); + resetLoop(); + setScore(0); + resetAlphaIn(); + resetAlphaOut(); + resetOut(); + resetIn(); + mLastScore = 0; field_0x804 = false; field_0x808 = 0; field_0x80C = 0; @@ -2292,14 +2266,14 @@ void dLytMiniGameScore_c::fn_80291410() { mIsVisible = true; if (field_0x818 == 1) { - fn_80291BA0(1); - fn_802920B0(); + setScore(1); + calcNumDigits(); mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); fn_80292C30(); mAnm[SCORE_ANIM_0_TO_9_OFFSET].setFrame(1.0f); mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(true); - + mLyt.getLayout()->Animate(0); mLyt.calc(); @@ -2313,7 +2287,6 @@ void dLytMiniGameScore_c::fn_802915B0() { return; } - if (field_0x814 && field_0x815) { mAnm[SCORE_ANIM_OUT].setToStart(); mAnm[SCORE_ANIM_OUT].setAnimEnable(true); @@ -2408,7 +2381,7 @@ void dLytMiniGameScore_c::startAlphaOut() { mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291960() { +void dLytMiniGameScore_c::startGetScore() { if (sInstance == nullptr) { return; } @@ -2417,7 +2390,7 @@ void dLytMiniGameScore_c::fn_80291960() { return; } - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart(); mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true); } @@ -2426,14 +2399,14 @@ void dLytMiniGameScore_c::fn_80291960() { mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291A30() { +void dLytMiniGameScore_c::startFinish() { if (sInstance == nullptr) { return; } - fn_802920B0(); + calcNumDigits(); - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart(); mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true); } @@ -2457,19 +2430,19 @@ void dLytMiniGameScore_c::startLoop() { mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true); } -void dLytMiniGameScore_c::fn_80291BA0(s32 score) { +void dLytMiniGameScore_c::setScore(s32 score) { if (sInstance == nullptr) { return; } - field_0x7D8 = score; + mScore = score; } void dLytMiniGameScore_c::fn_80291BC0() { s32 digits[5]; - digits[4] = field_0x7D8 / 10000; - - s32 v = field_0x7D8; + digits[4] = mScore / 10000; + + s32 v = mScore; v %= 10000; digits[3] = v / 1000; v %= 1000; @@ -2479,8 +2452,8 @@ void dLytMiniGameScore_c::fn_80291BC0() { v %= 10; digits[0] = v; - fn_802920B0(); - fn_80292110(); + calcNumDigits(); + realizePosition(); if (field_0x818 == 1) { if (field_0x828) { @@ -2492,7 +2465,7 @@ void dLytMiniGameScore_c::fn_80291BC0() { fn_80292C30(); - for (int i = 0; i <= field_0x7E0; i++) { + for (int i = 0; i <= mHighestDigitIndex; i++) { setDigit(i, digits[i]); } } @@ -2502,7 +2475,7 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { return; } - s32 diff = arg - field_0x7D8; + s32 diff = arg - mScore; switch (diff) { case 1: field_0x80C = 1; @@ -2524,11 +2497,10 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { field_0x80C = 25; field_0x810 = 12; break; - case 0: - return; + case 0: return; } - if (arg < field_0x7D8) { + if (arg < mScore) { field_0x80C = nw4r::math::FAbs(diff); field_0x810 = -1; } @@ -2537,136 +2509,322 @@ void dLytMiniGameScore_c::fn_80291D40(s32 arg) { field_0x829 = true; } -bool dLytMiniGameScore_c::fn_80291E50() const { - +bool dLytMiniGameScore_c::hasIncreasedScore() const { + if (sInstance == nullptr) { + return false; + } + return mLastScore < mScore; } -void dLytMiniGameScore_c::fn_80291E90() { - +bool dLytMiniGameScore_c::hasDecreasedScore() const { + if (sInstance == nullptr) { + return false; + } + return mScore < mLastScore; } -void dLytMiniGameScore_c::fn_80291ED0() { - +void dLytMiniGameScore_c::fn_80291ED0(s32 arg) { + if (sInstance == nullptr) { + return; + } + field_0x824 = arg; } void dLytMiniGameScore_c::fn_80291EF0() { + f32 f1 = 0.0f; + switch (field_0x824) { + case 0: f1 = 4.0; break; + case 1: f1 = 0.0; break; + case 2: f1 = 1.0; break; + case 3: f1 = 2.0; break; + case 4: f1 = 5.0; break; + case 6: f1 = 3.0; break; + } -} + f32 f2 = 0.0f; + if (field_0x824 == 4) { + f2 = 2.0; + } else if (field_0x824 == 0) { + f2 = 4.0; + } -void dLytMiniGameScore_c::fn_80292030(s32) { + f32 frame = mAnm[SCORE_ANIM_SET_POSITION].getFrame(); + mAnm[SCORE_ANIM_SET_POSITION].setFrame(frame + 2.0f + f2); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(f1); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); +} + +void dLytMiniGameScore_c::increaseScore(s32 arg) { + setScore(mScore + arg); } void dLytMiniGameScore_c::fn_80292040() { + mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(6.0f); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); -} + mLyt.calc(); -void dLytMiniGameScore_c::fn_802920B0() { + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); +} +s32 dLytMiniGameScore_c::calcNumDigits() { + s32 num; + if (mScore >= 10000) { + num = 4; + } else if (mScore >= 1000) { + num = 3; + } else if (mScore >= 100) { + num = 2; + } else if (mScore >= 10) { + num = 1; + } else { + num = 0; + } + mHighestDigitIndex = num; + return num; } -void dLytMiniGameScore_c::fn_80292110() { +void dLytMiniGameScore_c::realizePosition() { + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + mHighestDigitIndex); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); } void dLytMiniGameScore_c::setDigit(s32 digitIndex, s32 number) { + s32 idx = digitIndex + SCORE_ANIM_0_TO_9_OFFSET; + f32 frame = number; -} + mAnm[idx].setFrame(frame); + mAnm[idx].setAnimEnable(true); -void dLytMiniGameScore_c::fn_80292240() { + mLyt.calc(); + mAnm[idx].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292250() { - +void dLytMiniGameScore_c::saveScore() { + mLastScore = mScore; } -void dLytMiniGameScore_c::fn_802922F0() { - -} +void dLytMiniGameScore_c::resetIn() { + mAnm[SCORE_ANIM_IN].setForwardOnce(); + mAnm[SCORE_ANIM_IN].setToStart(); + mAnm[SCORE_ANIM_IN].setAnimEnable(true); -void dLytMiniGameScore_c::fn_80292380() { + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnm[SCORE_ANIM_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292400() { - +void dLytMiniGameScore_c::resetDigits() { + // NOTE: includes SCORE_ANIM_SET_POSITION + for (int i = 0; i <= SCORE_NUM_DIGITS; i++) { + s32 idx = i + SCORE_ANIM_0_TO_9_OFFSET; + mAnm[idx].setForwardOnce(); + mAnm[idx].setFrame(0.0f); + mAnm[idx].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292480() { +void dLytMiniGameScore_c::resetOut() { + mAnm[SCORE_ANIM_OUT].setForwardOnce(); + mAnm[SCORE_ANIM_OUT].setToStart(); + mAnm[SCORE_ANIM_OUT].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_OUT].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292500() { +void dLytMiniGameScore_c::resetAlphaIn() { + mAnm[SCORE_ANIM_ALPHA_IN].setForwardOnce(); + mAnm[SCORE_ANIM_ALPHA_IN].setToStart(); + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true); + + mLyt.calc(); + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292590() { +void dLytMiniGameScore_c::resetAlphaOut() { + mAnm[SCORE_ANIM_ALPHA_OUT].setForwardOnce(); + mAnm[SCORE_ANIM_ALPHA_OUT].setToStart(); + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292610() { +void dLytMiniGameScore_c::resetSetPosition() { + mAnm[SCORE_ANIM_SET_POSITION].setForwardOnce(); + mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true); + + mLyt.calc(); + mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292710() { +void dLytMiniGameScore_c::resetRupeeChange() { + mAnm[SCORE_ANIM_RUPEE_CHANGE].setForwardOnce(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setToEnd2(); + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true); + mLyt.calc(); + + mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292880() { +void dLytMiniGameScore_c::resetGetScore() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setForwardOnce(); + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true); + } + + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setForwardOnce(); + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setToStart(); + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true); -} + mLyt.calc(); -void dLytMiniGameScore_c::fn_80292910() { + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false); + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292920() { +void dLytMiniGameScore_c::resetFinish() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setForwardOnce(); + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart(); + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true); + } -} + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(true); -bool dLytMiniGameScore_c::fn_80292930() const { + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(true); -} + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setForwardOnce(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setToStart(); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(true); + + mLyt.calc(); -void dLytMiniGameScore_c::fn_80292940() { + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false); + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false); + } } -void dLytMiniGameScore_c::fn_80292950() { +void dLytMiniGameScore_c::resetLoop() { + mAnm[SCORE_ANIM_LOOP_SCORE].setForwardLoop(); + mAnm[SCORE_ANIM_LOOP_SCORE].setFrame(0.0f); + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true); -} + mLyt.getLayout()->Animate(0); + mLyt.calc(); -void dLytMiniGameScore_c::fn_802929C0() { + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false); +} +void dLytMiniGameScore_c::stopIn() { + mAnm[SCORE_ANIM_IN].setAnimEnable(false); } -void dLytMiniGameScore_c::fn_80292A40() { +void dLytMiniGameScore_c::stopOut() { + mAnm[SCORE_ANIM_OUT].setAnimEnable(false); +} +void dLytMiniGameScore_c::stopAlphaIn() { + mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292A50() const { +void dLytMiniGameScore_c::stopAlphaOut() { + mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false); +} +void dLytMiniGameScore_c::stopGetScore() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false); + } + mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292AA0() const { +void dLytMiniGameScore_c::stopFinish() { + for (int i = 0; i < SCORE_NUM_DIGITS; i++) { + mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false); + } + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false); + mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292AF0() const { - +void dLytMiniGameScore_c::stopLoop() { + mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false); } -bool dLytMiniGameScore_c::fn_80292B40() const { +bool dLytMiniGameScore_c::isInEndReached() const { + if (mAnm[SCORE_ANIM_IN].isEnabled() && mAnm[SCORE_ANIM_IN].isEndReached()) { + return true; + } + return false; +} +bool dLytMiniGameScore_c::isOutEndReached() const { + if (mAnm[SCORE_ANIM_OUT].isEnabled() && mAnm[SCORE_ANIM_OUT].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292B90() const { +bool dLytMiniGameScore_c::isAlphaInEndReached() const { + if (mAnm[SCORE_ANIM_ALPHA_IN].isEnabled() && mAnm[SCORE_ANIM_ALPHA_IN].isEndReached()) { + return true; + } + return false; +} +bool dLytMiniGameScore_c::isAlphaOutEndReached() const { + if (mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled() && mAnm[SCORE_ANIM_ALPHA_OUT].isEndReached()) { + return true; + } + return false; } -bool dLytMiniGameScore_c::fn_80292BE0() const { +bool dLytMiniGameScore_c::isGetScoreEndReached() const { + if (mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEndReached()) { + return true; + } + return false; +} +bool dLytMiniGameScore_c::isFinishEndReached() const { + if (mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEndReached()) { + return true; + } + return false; } void dLytMiniGameScore_c::fn_80292C30() { @@ -2675,56 +2833,112 @@ void dLytMiniGameScore_c::fn_80292C30() { t = field_0x824 == 4 ? 4 : field_0x824 == 0 ? 6 : 0; } + PaneCalc calc; + switch (field_0x818) { case 0: { - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(1); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(1); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; - mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); - mFloats[field_0x81C + field_0x7E0] += field_0x7FC; - mFloats[field_0x81C + field_0x7E0] += field_0x800; + calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]); + mFloats[field_0x81C + mHighestDigitIndex] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); + mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC; + mFloats[field_0x81C + mHighestDigitIndex] += field_0x800; break; } case 3: { - dMessage_c::getGlobalTagProcessor()->setNumericArg0(field_0x7D8); - fn_802933A0(0); + dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore); + loadTextVariant(0); field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr); // TODO - nw4r::lyt::Pane *p1 = mpPanes[15]; - nw4r::lyt::Pane *p2 = mpPanes[field_0x7E0 + 15]; - mFloats[field_0x81C + field_0x7E0] = field_0x7E8 + (p2->GetSize().width * (p2->GetScale().x / 2.0f)) + - (p1->GetSize().width * (p1->GetScale().x / 2.0f)) + - (p1->GetParent()->GetTranslate().x + p1->GetTranslate().x) - - (p2->GetParent()->GetTranslate().x + p2->GetTranslate().x); - mFloats[field_0x81C + field_0x7E0] += field_0x7FC; - mFloats[field_0x81C + field_0x7E0] += field_0x800; + calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]); + mFloats[field_0x81C + mHighestDigitIndex] = + calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]); + mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC; + mFloats[field_0x81C + mHighestDigitIndex] += field_0x800; break; } } -} -void dLytMiniGameScore_c::fn_802933A0(s32 variant) { + f32 f = mFloats[mHighestDigitIndex + t + field_0x81C]; -} + if (field_0x830 != 0) { + nw4r::lyt::Size size = mpTextBoxes[0]->GetSize(); + switch (field_0x830) { + case 1: { + mVec3_c pos( + f / 2.0f + size.width / 2.0f - field_0x7E8 + 0.0f + (f32)field_0x7F4 - (f32)field_0x800, + field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f + ); + mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos); + break; + } + case 2: { + mVec3_c pos( + (f32)field_0x7E8 - f / 2.0f - size.width / 2.0f + 0.0 + (f32)field_0x7F4 + (f32)field_0x800, + field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f + ); + mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos); + break; + } + } + } -void dLytMiniGameScore_c::fn_80293410() { + // TODO - ... + fn_80293450(mHighestDigitIndex + t + field_0x81C); + nw4r::math::MTX34 mtx = mpPanes[SCORE_PANE_CENTER]->GetGlobalMtx(); + mVec3_c pos(mtx._03, mtx._13, 0.0f); + mpPanes[SCORE_PANE_POSITION_ALL]->SetTranslate(pos); } -void dLytMiniGameScore_c::fn_80293450(s32) { +void dLytMiniGameScore_c::loadTextVariant(s32 variant) { + for (int i = 0; i < SCORE_NUM_TEXTBOXES; i++) { + mLyt.loadTextVariant(mpTextBoxes[i], variant); + } +} +void dLytMiniGameScore_c::fn_80293410() { + (void)getCurrentLanguage1(); + field_0x830 = 1; } +void dLytMiniGameScore_c::fn_80293450(s32 idx) { + // TODO - aaaaaaaaaaaaa + f32 tmp = field_0x7F0 + mFloats[idx]; + + mpPanes[11]->SetSize(nw4r::lyt::Size(tmp, mpPanes[11]->GetSize().height)); + mpPanes[11]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f)); + + tmp /= 2.0f; + + mpPanes[9]->SetTranslate(mVec3_c(-tmp - mpPanes[9]->GetSize().width, 0.0f, 0.0f)); + mpPanes[10]->SetTranslate(mVec3_c(tmp + mpPanes[10]->GetSize().width, 0.0f, 0.0f)); + + tmp = field_0x7F0 + mFloats[idx]; + + mpPanes[8]->SetSize(nw4r::lyt::Size(tmp, mpPanes[8]->GetSize().height)); + mpPanes[8]->SetTranslate(mVec3_c(-2.0f, -2.0f, 0.0f)); + + tmp /= 2.0f; + + mpPanes[6]->SetTranslate(mVec3_c(-tmp - mpPanes[6]->GetSize().width - 2.0f, -2.0f, 0.0f)); + mpPanes[7]->SetTranslate(mVec3_c(tmp + mpPanes[7]->GetSize().width - 2.0f, -2.0f, 0.0f)); + + mpPanes[5]->SetSize(nw4r::lyt::Size( + mpPanes[10]->GetSize().width + mpPanes[11]->GetSize().width + mpPanes[9]->GetSize().width - 36.0f, + mpPanes[5]->GetSize().height + )); + + mpPanes[5]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f)); + mpPanes[4]->SetTranslate(mVec3_c(field_0x834[2][0], field_0x834[2][1], 0.0f)); +} static const d2d::LytBrlanMapping brlanMapScoreSd[] = { { "miniGameScoreSd_00_0to9.brlan", "G_0to9_00"}, @@ -2734,6 +2948,12 @@ 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_SET_POSITION 2 +#define SCORE_SD_ANIM_SCORE_UP 3 +#define SCORE_SD_ANIM_SCORE_DOWN 4 + #define SCORE_SD_NUM_ANIMS 5 bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { @@ -2744,6 +2964,7 @@ bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) { mAnm[i].init(brlanMapScoreSd[i].mFile, resAcc, mLyt.getLayout(), brlanMapScoreSd[i].mName); mAnm[i].bind(false); mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); } sInstance = this; @@ -2768,13 +2989,25 @@ bool dLytMiniGameScoreSd_c::execute() { return true; } - for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { - if (mAnm[i].isEnabled()) { - mAnm[i].play(); + if (mIsVisible) { + if (fn_80294030()) { + fn_80294010(); + mIsVisible = false; } - } - mLyt.calc(); + if (fn_80294080()) { + fn_80294020(); + mIsVisible = false; + } + + for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + mLyt.calc(); + } return true; } @@ -2783,12 +3016,88 @@ bool dLytMiniGameScoreSd_c::draw() { if (sInstance == nullptr) { return true; } - mLyt.addToDrawList(); + if (mIsVisible) { + mLyt.addToDrawList(); + } return true; } void dLytMiniGameScoreSd_c::init() { - // TODO - ... + if (sInstance == nullptr) { + return; + } + + fn_80293D40(); + fn_80293DC0(); + fn_80293E40(); + fn_80293ED0(); + fn_80293AF0(0); + + 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_80293A30() { + +} + +void dLytMiniGameScoreSd_c::fn_80293A90() { + +} + +void dLytMiniGameScoreSd_c::fn_80293AF0(s32) { + +} + +void dLytMiniGameScoreSd_c::fn_80293BB0() { + } +void dLytMiniGameScoreSd_c::fn_80293C60() { + +} + +void dLytMiniGameScoreSd_c::fn_80293D40() { + +} + +void dLytMiniGameScoreSd_c::fn_80293DC0() { + +} + +void dLytMiniGameScoreSd_c::fn_80293E40() { + +} + +void dLytMiniGameScoreSd_c::fn_80293ED0() { + +} + +void dLytMiniGameScoreSd_c::fn_80293F50() { + +} + +void dLytMiniGameScoreSd_c::fn_80293FB0() { + +} + +void dLytMiniGameScoreSd_c::fn_80294010() { + +} + +void dLytMiniGameScoreSd_c::fn_80294020() { + +} + +bool dLytMiniGameScoreSd_c::fn_80294030() const { + +} + +bool dLytMiniGameScoreSd_c::fn_80294080() const { + +} + + SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9); |
