diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 1dbe7814..863d21f6 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -418,7 +418,10 @@ d/lyt/meter/d_lyt_meter_dowsing.cpp: d/lyt/meter/d_lyt_meter_rupy.cpp: .text start:0x801003F0 end:0x801026A8 .ctors start:0x804DB714 end:0x804DB718 + .rodata start:0x804E6928 end:0x804E69D8 .data start:0x80518A60 end:0x80518F00 + .sdata2 start:0x80579C48 end:0x80579C78 + .bss start:0x805AC550 end:0x805AC750 d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp: .text start:0x801026B0 end:0x80105548 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8963f97a..28167f4a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -6211,47 +6211,47 @@ isSameName__37sFStateID_c<22dLytMeterDowsingText_c>CFPCc = .text:0x801001B0; // isSameName__38sFStateID_c<23dLytMeterDowsingInput_c>CFPCc = .text:0x80100240; // type:function size:0x88 isSameName__38sFStateID_c<23dLytMeterDowsingBlink_c>CFPCc = .text:0x801002D0; // type:function size:0x88 isSameName__41sFStateID_c<26dLytMeterDowsingMenuIcon_c>CFPCc = .text:0x80100360; // type:function size:0x88 -fn_801003F0 = .text:0x801003F0; // type:function size:0x4 -fn_80100400 = .text:0x80100400; // type:function size:0x8C -fn_80100490 = .text:0x80100490; // type:function size:0x4 -fn_801004A0 = .text:0x801004A0; // type:function size:0x4 -fn_801004B0 = .text:0x801004B0; // type:function size:0xA4 -fn_80100560 = .text:0x80100560; // type:function size:0x4 -fn_80100570 = .text:0x80100570; // type:function size:0x20 -fn_80100590 = .text:0x80100590; // type:function size:0x10 -fn_801005A0 = .text:0x801005A0; // type:function size:0x4 -fn_801005B0 = .text:0x801005B0; // type:function size:0x8C -fn_80100640 = .text:0x80100640; // type:function size:0x4 -fn_80100650 = .text:0x80100650; // type:function size:0x4 -fn_80100660 = .text:0x80100660; // type:function size:0x104 -fn_80100770 = .text:0x80100770; // type:function size:0x4 -fn_80100780 = .text:0x80100780; // type:function size:0x24 -fn_801007B0 = .text:0x801007B0; // type:function size:0x10 -fn_801007C0 = .text:0x801007C0; // type:function size:0x164 -fn_80100930 = .text:0x80100930; // type:function size:0x78 -fn_801009B0 = .text:0x801009B0; // type:function size:0x4 -fn_801009C0 = .text:0x801009C0; // type:function size:0x4 -fn_801009D0 = .text:0x801009D0; // type:function size:0x74 -fn_80100A50 = .text:0x80100A50; // type:function size:0x4 -fn_80100A60 = .text:0x80100A60; // type:function size:0x58 -fn_80100AC0 = .text:0x80100AC0; // type:function size:0xA8 -fn_80100B70 = .text:0x80100B70; // type:function size:0x4 -fn_80100B80 = .text:0x80100B80; // type:function size:0xB8 -fn_80100C40 = .text:0x80100C40; // type:function size:0xAC -fn_80100CF0 = .text:0x80100CF0; // type:function size:0x4 -fn_80100D00 = .text:0x80100D00; // type:function size:0x310 -fn_80101010 = .text:0x80101010; // type:function size:0x58 -fn_80101070 = .text:0x80101070; // type:function size:0x1B0 -fn_80101220 = .text:0x80101220; // type:function size:0x5C -fn_80101280 = .text:0x80101280; // type:function size:0x34 -fn_801012C0 = .text:0x801012C0; // type:function size:0xB0 -fn_80101370 = .text:0x80101370; // type:function size:0x74 -fn_801013F0 = .text:0x801013F0; // type:function size:0x5C8 -fn_801019C0 = .text:0x801019C0; // type:function size:0x24C -fn_80101C10 = .text:0x80101C10; // type:function size:0x158 -fn_80101D70 = .text:0x80101D70; // type:function size:0x8 -fn_80101D80 = .text:0x80101D80; // type:function size:0x8 -fn_80101D90 = .text:0x80101D90; // type:function size:0x8 +initializeState_Wait__20dLytMeterRupyStart_cFv = .text:0x801003F0; // type:function size:0x4 +executeState_Wait__20dLytMeterRupyStart_cFv = .text:0x80100400; // type:function size:0x8C +finalizeState_Wait__20dLytMeterRupyStart_cFv = .text:0x80100490; // type:function size:0x4 +initializeState_Start__20dLytMeterRupyStart_cFv = .text:0x801004A0; // type:function size:0x4 +executeState_Start__20dLytMeterRupyStart_cFv = .text:0x801004B0; // type:function size:0xA4 +finalizeState_Start__20dLytMeterRupyStart_cFv = .text:0x80100560; // type:function size:0x4 +init__20dLytMeterRupyStart_cFv = .text:0x80100570; // type:function size:0x20 +execute__20dLytMeterRupyStart_cFv = .text:0x80100590; // type:function size:0x10 +initializeState_Wait__20dLytMeterRupyBlink_cFv = .text:0x801005A0; // type:function size:0x4 +executeState_Wait__20dLytMeterRupyBlink_cFv = .text:0x801005B0; // type:function size:0x8C +finalizeState_Wait__20dLytMeterRupyBlink_cFv = .text:0x80100640; // type:function size:0x4 +initializeState_Flash__20dLytMeterRupyBlink_cFv = .text:0x80100650; // type:function size:0x4 +executeState_Flash__20dLytMeterRupyBlink_cFv = .text:0x80100660; // type:function size:0x104 +finalizeState_Flash__20dLytMeterRupyBlink_cFv = .text:0x80100770; // type:function size:0x4 +init__20dLytMeterRupyBlink_cFv = .text:0x80100780; // type:function size:0x24 +execute__20dLytMeterRupyBlink_cFv = .text:0x801007B0; // type:function size:0x10 +initializeState_In__15dLytMeterRupy_cFv = .text:0x801007C0; // type:function size:0x164 +executeState_In__15dLytMeterRupy_cFv = .text:0x80100930; // type:function size:0x78 +finalizeState_In__15dLytMeterRupy_cFv = .text:0x801009B0; // type:function size:0x4 +initializeState_Active__15dLytMeterRupy_cFv = .text:0x801009C0; // type:function size:0x4 +executeState_Active__15dLytMeterRupy_cFv = .text:0x801009D0; // type:function size:0x74 +finalizeState_Active__15dLytMeterRupy_cFv = .text:0x80100A50; // type:function size:0x4 +initializeState_Start__15dLytMeterRupy_cFv = .text:0x80100A60; // type:function size:0x58 +executeState_Start__15dLytMeterRupy_cFv = .text:0x80100AC0; // type:function size:0xA8 +finalizeState_Start__15dLytMeterRupy_cFv = .text:0x80100B70; // type:function size:0x4 +initializeState_Out__15dLytMeterRupy_cFv = .text:0x80100B80; // type:function size:0xB8 +executeState_Out__15dLytMeterRupy_cFv = .text:0x80100C40; // type:function size:0xAC +finalizeState_Out__15dLytMeterRupy_cFv = .text:0x80100CF0; // type:function size:0x4 +build__15dLytMeterRupy_cFPQ23d2d10ResAccIf_c = .text:0x80100D00; // type:function size:0x310 +remove__15dLytMeterRupy_cFv = .text:0x80101010; // type:function size:0x58 +execute__15dLytMeterRupy_cFv = .text:0x80101070; // type:function size:0x1B0 +hasChangeInRupees__15dLytMeterRupy_cCFv = .text:0x80101220; // type:function size:0x5C +getRupeeDifference__15dLytMeterRupy_cCFv = .text:0x80101280; // type:function size:0x34 +getLastVisibleDigitPosition__15dLytMeterRupy_cFv = .text:0x801012C0; // type:function size:0xB0 +setDigit__15dLytMeterRupy_cFll = .text:0x80101370; // type:function size:0x74 +updateDisplayedAmount__15dLytMeterRupy_cFb = .text:0x801013F0; // type:function size:0x5C8 +executeDigitJump__15dLytMeterRupy_cFv = .text:0x801019C0; // type:function size:0x24C +executeDigitBlink__15dLytMeterRupy_cFl = .text:0x80101C10; // type:function size:0x158 +getName__15dLytMeterRupy_cCFv = .text:0x80101D70; // type:function size:0x8 +getLyt__15dLytMeterRupy_cFv = .text:0x80101D80; // type:function size:0x8 +getPane__15dLytMeterRupy_cFv = .text:0x80101D90; // type:function size:0x8 __sinit_\d_lyt_meter_rupy_cpp = .text:0x80101DA0; // type:function size:0x640 scope:local __dt__35sFStateID_c<20dLytMeterRupyStart_c>Fv = .text:0x801023E0; // type:function size:0x58 __dt__35sFStateID_c<20dLytMeterRupyBlink_c>Fv = .text:0x80102440; // type:function size:0x58 @@ -31698,7 +31698,7 @@ lbl_80518BC4 = .data:0x80518BC4; // type:object size:0xC lbl_80518BD0 = .data:0x80518BD0; // type:object size:0x10 lbl_80518BE0 = .data:0x80518BE0; // type:object size:0x10 data:4byte lbl_80518BF0 = .data:0x80518BF0; // type:object size:0x10 -__vt__15dLytMeterRupy_c = .data:0x80518C00; // type:object size:0x260 +__vt__15dLytMeterRupy_c = .data:0x80518C00; // type:object size:0x34 __vt__30sFStateID_c<15dLytMeterRupy_c> = .data:0x80518E60; // type:object size:0x34 __vt__35sFStateID_c<20dLytMeterRupyBlink_c> = .data:0x80518E94; // type:object size:0x34 __vt__35sFStateID_c<20dLytMeterRupyStart_c> = .data:0x80518EC8; // type:object size:0x34 diff --git a/include/d/lyt/meter/d_lyt_meter_rupy.h b/include/d/lyt/meter/d_lyt_meter_rupy.h index 80b960a2..73c58f1e 100644 --- a/include/d/lyt/meter/d_lyt_meter_rupy.h +++ b/include/d/lyt/meter/d_lyt_meter_rupy.h @@ -2,33 +2,71 @@ #define D_LYT_METER_RUPY_H #include "d/lyt/d2d.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dLytMeterRupyStart_c { public: dLytMeterRupyStart_c() : mStateMgr(*this, sStateID::null) {} + void init(); + void execute(); + + void setAnm(d2d::AnmGroup_c *anm) { + mpAnm = anm; + } + + void setShouldStart(bool b) { + mShouldStart = b; + } + + bool isStarting() const { + return mShouldStart; + } + private: STATE_FUNC_DECLARE(dLytMeterRupyStart_c, Wait); STATE_FUNC_DECLARE(dLytMeterRupyStart_c, Start); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterRupyStart_c); + UI_STATE_MGR_DECLARE(dLytMeterRupyStart_c); - u8 field_0x3C[0x8]; + d2d::AnmGroup_c *mpAnm; + bool mShouldStart; }; class dLytMeterRupyBlink_c { public: dLytMeterRupyBlink_c() : mStateMgr(*this, sStateID::null) {} + void init(); + void execute(); + + void setAnm(d2d::AnmGroup_c *anm) { + mpAnm = anm; + } + + void doFlash() { + mShouldFlash = true; + } + + void cancelFlash() { + mImmediatelyCancelFlash = true; + } + private: STATE_FUNC_DECLARE(dLytMeterRupyBlink_c, Wait); STATE_FUNC_DECLARE(dLytMeterRupyBlink_c, Flash); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterRupyBlink_c); + UI_STATE_MGR_DECLARE(dLytMeterRupyBlink_c); - u8 field_0x3C[0x8]; + d2d::AnmGroup_c *mpAnm; + bool mShouldFlash; + bool mImmediatelyCancelFlash; }; class dLytMeterRupy_c : public d2d::dSubPane { @@ -37,25 +75,57 @@ public: virtual bool build(d2d::ResAccIf_c *resAcc) override; virtual bool remove() override; virtual bool execute() override; - virtual nw4r::lyt::Pane *getPane() override; - virtual d2d::LytBase_c *getLyt() override; - virtual const char *getName() const override; + virtual nw4r::lyt::Pane *getPane() override { + return mLyt.getLayout()->GetRootPane(); + } + virtual d2d::LytBase_c *getLyt() override { + return &mLyt; + } + virtual const char *getName() const override { + return mLyt.getName(); + } virtual ~dLytMeterRupy_c() {} + + mVec3_c getLastVisibleDigitPosition(); + private: + bool updateDisplayedAmount(bool suppressSound); + bool hasChangeInRupees() const; + s32 getRupeeDifference() const; + void setDigit(s32 index, s32 digit); + void executeDigitJump(); + void executeDigitBlink(s32 amount); + STATE_FUNC_DECLARE(dLytMeterRupy_c, In); STATE_FUNC_DECLARE(dLytMeterRupy_c, Active); STATE_FUNC_DECLARE(dLytMeterRupy_c, Start); STATE_FUNC_DECLARE(dLytMeterRupy_c, Out); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterRupy_c); + UI_STATE_MGR_DECLARE(dLytMeterRupy_c); /* 0x044 */ d2d::dLytSub mLyt; - /* 0x0D8 */ d2d::AnmGroup_c mAnmGroups[22]; + /* 0x0D8 */ d2d::AnmGroup_c mAnm[22]; /* 0x658 */ dLytMeterRupyStart_c mStartParts[4]; /* 0x768 */ dLytMeterRupyBlink_c mBlinkParts[4]; - /* 0x??? */ u8 padding[0x1A98 - 0x1A60]; + /* 0x878 */ nw4r::lyt::Pane *mpPanes[4]; + /* 0x888 */ s32 mNumDisplayedDigits; + /* 0x88C */ s32 mDisplayedRupeeCount; + /* 0x890 */ s32 field_0x890; + /* 0x894 */ s32 mBlinkDelay; + /* 0x898 */ s32 mRupeeColor; + /* 0x89C */ u8 mSize; + /* 0x89D */ u8 mDisplayedDigits[4]; + /* 0x8A1 */ u8 field_0x8A1[4]; + /* 0x8A5 */ u8 mJumpState[4]; + /* 0x8A9 */ u8 field_0x8A9; + /* 0x8AA */ u8 field_0x8AA; + /* 0x8AB */ u8 field_0x8AB; + /* 0x8AC */ u8 field_0x8AC; + /* 0x8AD */ u8 field_0x8AD; + /* 0x8AE */ u8 field_0x8AE; }; - #endif diff --git a/src/d/lyt/meter/d_lyt_meter_rupy.cpp b/src/d/lyt/meter/d_lyt_meter_rupy.cpp index d6eb5895..2c30a756 100644 --- a/src/d/lyt/meter/d_lyt_meter_rupy.cpp +++ b/src/d/lyt/meter/d_lyt_meter_rupy.cpp @@ -1,5 +1,13 @@ #include "d/lyt/meter/d_lyt_meter_rupy.h" +#include "c/c_math.h" +#include "d/lyt/d2d.h" +#include "nw4r/math/math_types.h" +#include "toBeSorted/small_sound_mgr.h" + +extern "C" s32 getRupeeCounter2(); +extern "C" u32 getCurrentWalletCapacity2(); + STATE_DEFINE(dLytMeterRupyStart_c, Wait); STATE_DEFINE(dLytMeterRupyStart_c, Start); @@ -10,3 +18,484 @@ STATE_DEFINE(dLytMeterRupy_c, In); STATE_DEFINE(dLytMeterRupy_c, Active); STATE_DEFINE(dLytMeterRupy_c, Start); STATE_DEFINE(dLytMeterRupy_c, Out); + +void dLytMeterRupyStart_c::initializeState_Wait() {} +void dLytMeterRupyStart_c::executeState_Wait() { + if (mShouldStart) { + mpAnm->setForwardOnce(); + mpAnm->setFrame(0.0f); + mpAnm->setAnimEnable(true); + mStateMgr.changeState(StateID_Start); + } +} +void dLytMeterRupyStart_c::finalizeState_Wait() {} + +void dLytMeterRupyStart_c::initializeState_Start() {} +void dLytMeterRupyStart_c::executeState_Start() { + if (mpAnm->isEndReached()) { + mpAnm->setAnimEnable(false); + mShouldStart = false; + mStateMgr.changeState(StateID_Wait); + } + + if (mpAnm->isEnabled()) { + mpAnm->play(); + } +} +void dLytMeterRupyStart_c::finalizeState_Start() {} + +void dLytMeterRupyStart_c::init() { + mShouldStart = false; + mStateMgr.changeState(StateID_Wait); +} + +void dLytMeterRupyStart_c::execute() { + mStateMgr.executeState(); +} + +void dLytMeterRupyBlink_c::initializeState_Wait() {} +void dLytMeterRupyBlink_c::executeState_Wait() { + if (mShouldFlash) { + mpAnm->setForwardOnce(); + mpAnm->setFrame(0.0f); + mpAnm->setAnimEnable(true); + mStateMgr.changeState(StateID_Flash); + } +} +void dLytMeterRupyBlink_c::finalizeState_Wait() {} + +void dLytMeterRupyBlink_c::initializeState_Flash() {} +void dLytMeterRupyBlink_c::executeState_Flash() { + if (mImmediatelyCancelFlash) { + mpAnm->setFrame(0.0f); + mpAnm->setAnimEnable(false); + mImmediatelyCancelFlash = false; + mShouldFlash = false; + mStateMgr.changeState(StateID_Wait); + } else { + if (mpAnm->isEndReached()) { + mpAnm->setAnimEnable(false); + mShouldFlash = false; + mStateMgr.changeState(StateID_Wait); + } + + if (mpAnm->isEnabled()) { + mpAnm->play(); + } + } +} +void dLytMeterRupyBlink_c::finalizeState_Flash() {} + +void dLytMeterRupyBlink_c::init() { + mShouldFlash = false; + mImmediatelyCancelFlash = false; + mStateMgr.changeState(StateID_Wait); +} + +void dLytMeterRupyBlink_c::execute() { + mStateMgr.executeState(); +} + +static const d2d::LytBrlanMapping brlanMap[] = { + { "rupy_01_in.brlan", "G_inOut_00"}, + { "rupy_01_sizeChange.brlan", "G_sizeChange"}, + { "rupy_01_keta.brlan", "G_keta_00"}, + { "rupy_01_color.brlan", "G_color_00"}, + { "rupy_01_number.brlan", "G_number_00"}, + { "rupy_01_number.brlan", "G_number_01"}, + { "rupy_01_number.brlan", "G_number_02"}, + { "rupy_01_number.brlan", "G_number_03"}, + { "rupy_01_loop.brlan", "G_loop_00"}, + {"rupy_01_randomFlash.brlan", "G_number_00"}, + {"rupy_01_randomFlash.brlan", "G_number_01"}, + {"rupy_01_randomFlash.brlan", "G_number_02"}, + {"rupy_01_randomFlash.brlan", "G_number_03"}, + { "rupy_01_jump.brlan", "G_number_00"}, + { "rupy_01_jump.brlan", "G_number_01"}, + { "rupy_01_jump.brlan", "G_number_02"}, + { "rupy_01_jump.brlan", "G_number_03"}, + { "rupy_01_start.brlan", "G_number_00"}, + { "rupy_01_start.brlan", "G_number_01"}, + { "rupy_01_start.brlan", "G_number_02"}, + { "rupy_01_start.brlan", "G_number_03"}, + { "rupy_01_out.brlan", "G_inOut_00"}, +}; + +#define RUPY_ANIM_IN 0 +#define RUPY_ANIM_SIZE_CHANGE 1 +#define RUPY_ANIM_KETA 2 +#define RUPY_ANIM_COLOR 3 +#define RUPY_ANIM_NUMBER_OFFSET 4 +#define RUPY_ANIM_LOOP 8 +#define RUPY_ANIM_FLASH_OFFSET 9 +#define RUPY_ANIM_JUMP_OFFSET 13 +#define RUPY_ANIM_START_OFFSET 17 +#define RUPY_ANIM_OUT 21 + +#define RUPY_NUM_ANIMS 22 + +#define RUPY_NUM_DIGITS 4 + +static const char *sPaneNames[] = { + "N_ketaT_00", + "N_ketaT_01", + "N_ketaT_02", + "N_ketaT_03", +}; + +void dLytMeterRupy_c::initializeState_In() { + mAnm[RUPY_ANIM_OUT].setAnimEnable(false); + mAnm[RUPY_ANIM_OUT].setFrame(0.0f); + + mAnm[RUPY_ANIM_IN].setForwardOnce(); + if (field_0x8A9 == 1) { + mAnm[RUPY_ANIM_IN].setFrame(0.0f); + } else { + mAnm[RUPY_ANIM_IN].setToEnd(); + } + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + if (mAnm[i + RUPY_ANIM_FLASH_OFFSET].isEnabled()) { + mBlinkParts[i].cancelFlash(); + } else { + mAnm[i + RUPY_ANIM_FLASH_OFFSET].setAnimEnable(true); + } + + mAnm[i + RUPY_ANIM_FLASH_OFFSET].setFrame(0.0f); + } + + mLyt.calc(); + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mAnm[i + RUPY_ANIM_FLASH_OFFSET].setAnimEnable(false); + } + field_0x8A9 = 0; + mAnm[RUPY_ANIM_IN].setAnimEnable(true); + field_0x8AB = 1; +} +void dLytMeterRupy_c::executeState_In() { + if (mAnm[RUPY_ANIM_IN].isEndReached()) { + mAnm[RUPY_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} +void dLytMeterRupy_c::finalizeState_In() {} + +void dLytMeterRupy_c::initializeState_Active() {} +void dLytMeterRupy_c::executeState_Active() { + bool result = updateDisplayedAmount(false); + if (field_0x890 == 0) { + mStateMgr.changeState(StateID_Start); + } else if (!result && field_0x890 != -1) { + field_0x890 = -1; + } +} +void dLytMeterRupy_c::finalizeState_Active() {} + +void dLytMeterRupy_c::initializeState_Start() { + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + if (i < mNumDisplayedDigits) { + mStartParts[i].setShouldStart(true); + } + } +} +void dLytMeterRupy_c::executeState_Start() { + updateDisplayedAmount(false); + bool bAllDone = true; + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + if (mStartParts[i].isStarting()) { + bAllDone = false; + } + } + + if (bAllDone) { + mStateMgr.changeState(StateID_Active); + } + + field_0x890++; +} +void dLytMeterRupy_c::finalizeState_Start() {} + +void dLytMeterRupy_c::initializeState_Out() { + mAnm[RUPY_ANIM_OUT].setForwardOnce(); + if (field_0x8AA == 1 || field_0x8AA == 3) { + mAnm[RUPY_ANIM_OUT].setFrame(0.0f); + } else { + mAnm[RUPY_ANIM_OUT].setToEnd(); + } + + if (field_0x8AA >= 3 && field_0x8AA < 5) { + field_0x8AE = 1; + } else { + field_0x8AE = 0; + } + + field_0x8AA = 0; + mAnm[RUPY_ANIM_OUT].setAnimEnable(true); +} +void dLytMeterRupy_c::executeState_Out() { + if (mAnm[RUPY_ANIM_OUT].isEndReached()) { + field_0x8AB = 0; + + if (field_0x8AE == 0 && hasChangeInRupees()) { + mDisplayedRupeeCount = getRupeeCounter2(); + updateDisplayedAmount(true); + } + + mAnm[RUPY_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} +void dLytMeterRupy_c::finalizeState_Out() {} + +bool dLytMeterRupy_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("rupy_01.brlyt", nullptr); + + for (int i = 0; i < RUPY_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mStartParts[i].setAnm(&mAnm[i + RUPY_ANIM_START_OFFSET]); + mStartParts[i].init(); + mBlinkParts[i].setAnm(&mAnm[i + RUPY_ANIM_FLASH_OFFSET]); + mBlinkParts[i].init(); + } + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mpPanes[i] = mLyt.findPane(sPaneNames[i]); + } + + mAnm[RUPY_ANIM_SIZE_CHANGE].setAnimEnable(true); + mAnm[RUPY_ANIM_COLOR].setAnimEnable(true); + mAnm[RUPY_ANIM_LOOP].setAnimEnable(true); + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mAnm[i + RUPY_ANIM_NUMBER_OFFSET].setAnimEnable(true); + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setAnimEnable(true); + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setFrame(0.0f); + } + + mSize = 1; + mAnm[RUPY_ANIM_SIZE_CHANGE].setFrame(mSize); + mRupeeColor = 0; + mAnm[RUPY_ANIM_COLOR].setFrame(mRupeeColor); + mAnm[RUPY_ANIM_IN].setAnimEnable(true); + mAnm[RUPY_ANIM_IN].setToEnd(); + mLyt.calc(); + mAnm[RUPY_ANIM_IN].setAnimEnable(false); + + field_0x8AB = 0; + mDisplayedRupeeCount = getRupeeCounter2(); + field_0x890 = -1; + mBlinkDelay = cM::rndF(10.0f); + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mJumpState[i] = 0xFF; + mDisplayedDigits[i] = 0; + field_0x8A1[i] = 0; + } + + field_0x8A9 = 0; + field_0x8AA = 0; + mNumDisplayedDigits = 0; + field_0x8AC = 0; + field_0x8AD = 0; + + field_0x8AE = 0; + updateDisplayedAmount(true); + + mStateMgr.changeState(StateID_Active); + return true; +} + +bool dLytMeterRupy_c::remove() { + for (int i = 0; i < RUPY_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMeterRupy_c::execute() { + if (field_0x8A9 != 0) { + mStateMgr.changeState(StateID_In); + } else if (field_0x8AA != 0) { + mStateMgr.changeState(StateID_Out); + } + + mStateMgr.executeState(); + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + mStartParts[i].execute(); + mBlinkParts[i].execute(); + } + + for (s32 i = 0; i < RUPY_NUM_ANIMS; i++) { + switch (i) { + case RUPY_ANIM_SIZE_CHANGE: + case RUPY_ANIM_KETA: + case RUPY_ANIM_COLOR: + case RUPY_ANIM_NUMBER_OFFSET + 0: + case RUPY_ANIM_NUMBER_OFFSET + 1: + case RUPY_ANIM_NUMBER_OFFSET + 2: + case RUPY_ANIM_NUMBER_OFFSET + 3: + case RUPY_ANIM_JUMP_OFFSET + 0: + case RUPY_ANIM_JUMP_OFFSET + 1: + case RUPY_ANIM_JUMP_OFFSET + 2: + case RUPY_ANIM_JUMP_OFFSET + 3: + case RUPY_ANIM_START_OFFSET + 0: + case RUPY_ANIM_START_OFFSET + 1: + case RUPY_ANIM_START_OFFSET + 2: + case RUPY_ANIM_START_OFFSET + 3: continue; + } + // Yes, really + u32 idx = i; + if (mAnm[idx].isEnabled()) { + mAnm[idx].play(); + } + } + + mAnm[RUPY_ANIM_SIZE_CHANGE].setFrame(mSize); + + bool isMax = false; + u32 current = mDisplayedRupeeCount; + u32 capacity = getCurrentWalletCapacity2(); + if (current != 0 && capacity == current) { + isMax = true; + }; + if (isMax != mRupeeColor) { + mRupeeColor = isMax; + mAnm[RUPY_ANIM_COLOR].setFrame(mRupeeColor); + } + + return true; +} + +bool dLytMeterRupy_c::hasChangeInRupees() const { + s32 amount = getRupeeCounter2(); + if (amount > 9999) { + amount = 9999; + } else if (amount < 0) { + amount = 0; + } + return amount != mDisplayedRupeeCount; +} + +s32 dLytMeterRupy_c::getRupeeDifference() const { + return getRupeeCounter2() - mDisplayedRupeeCount; +} + +mVec3_c dLytMeterRupy_c::getLastVisibleDigitPosition() { + mVec3_c ret(0.0f, 0.0f, 0.0f); + u32 idx = mNumDisplayedDigits - 1; + if (idx <= 3) { + nw4r::math::MTX34 mtx = mpPanes[idx]->GetGlobalMtx(); + ret.x = mtx._03; + ret.y = mtx._13; + } + + return ret; +} + +void dLytMeterRupy_c::setDigit(s32 index, s32 digit) { + mDisplayedDigits[index] = digit; + s32 num = index + RUPY_ANIM_NUMBER_OFFSET; + mAnm[num].setFrame(digit); +} + +bool dLytMeterRupy_c::updateDisplayedAmount(bool suppressSound) { + s32 amount = getRupeeCounter2(); + if (amount > 9999) { + amount = 9999; + } else if (amount < 0) { + amount = 0; + } + + if (amount != mDisplayedRupeeCount || suppressSound) { + + } else if (field_0x8AD && mDisplayedRupeeCount == getCurrentWalletCapacity2()) { + SmallSoundManager::GetInstance()->playSound(SE_S_RUPEE_MAX); + field_0x890 = 0; + field_0x8AD = 0; + } +} + +void dLytMeterRupy_c::executeDigitJump() { + // ??? + s32 last = mNumDisplayedDigits + 3; + if (field_0x8A1[last] == 1) { + mAnm[mNumDisplayedDigits - 1 + RUPY_ANIM_JUMP_OFFSET].setFrame(2.0f); + s32 last = mNumDisplayedDigits + 3; + field_0x8A1[last] = 0; + } else { + mAnm[mNumDisplayedDigits - 1 + RUPY_ANIM_JUMP_OFFSET].setFrame(1.0f); + s32 last = mNumDisplayedDigits + 3; + field_0x8A1[last] = 1; + } + + if (mNumDisplayedDigits >= 4) { + s32 last = mNumDisplayedDigits - 4; + if (mDisplayedDigits[last] != field_0x8A1[last] && mJumpState[last] == 0xFF) { + mJumpState[last] = 0; + } + } + if (mNumDisplayedDigits >= 3) { + s32 last = mNumDisplayedDigits - 3; + if (mDisplayedDigits[last] != field_0x8A1[last] && mJumpState[last] == 0xFF) { + mJumpState[last] = 0; + } + } + if (mNumDisplayedDigits >= 2) { + s32 last = mNumDisplayedDigits - 2; + if (mDisplayedDigits[last] != field_0x8A1[last] && mJumpState[last] == 0xFF) { + mJumpState[last] = 0; + } + } + + for (int i = 0; i < RUPY_NUM_DIGITS; i++) { + if (mJumpState[i] == 0xFF) { + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setFrame(0.0f); + } else if (i != mNumDisplayedDigits - 1) { + if (mJumpState[i] == 0) { + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setFrame(1.0f); + mJumpState[i] = 1; + } else if (mJumpState[i] == 1) { + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setFrame(2.0f); + mJumpState[i] = 2; + } else if (mJumpState[i] == 2) { + mAnm[i + RUPY_ANIM_JUMP_OFFSET].setFrame(0.0f); + mJumpState[i] = 0xFF; + } + } + } +} + +void dLytMeterRupy_c::executeDigitBlink(s32 amount) { + if (amount >= 1000 && amount % 1000 == 0) { + mBlinkParts[0].doFlash(); + } + + if (amount >= 100 && amount % 100 == 0) { + if (amount >= 1000) { + mBlinkParts[1].doFlash(); + } else { + mBlinkParts[0].doFlash(); + } + } + + mBlinkDelay--; + if (mBlinkDelay <= 0) { + if (mNumDisplayedDigits == 1) { + mBlinkParts[mNumDisplayedDigits - 1].doFlash(); + } else { + if (cM::rndF(100.0f) >= 50.0f) { + mBlinkParts[mNumDisplayedDigits - 1].doFlash(); + } else { + mBlinkParts[mNumDisplayedDigits - 2].doFlash(); + } + } + mBlinkDelay = mAnm[RUPY_ANIM_FLASH_OFFSET + 0].getAnimDuration() + cM::rndF(10.0f); + } +}