d_lyt_meter_rupy except for the hard part

This commit is contained in:
robojumper
2025-04-13 23:53:01 +02:00
parent f12a768571
commit 0cd063a62c
4 changed files with 613 additions and 51 deletions
+3
View File
@@ -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
+42 -42
View File
@@ -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
+79 -9
View File
@@ -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
+489
View File
@@ -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);
}
}