summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-10-17 23:58:38 +0200
committerGitHub <noreply@github.com>2024-10-17 17:58:38 -0400
commitb96e6ee19f4f8538e3162b16177a4d066eacdae5 (patch)
treee47be5e74d6dce873a74417a1a8583c858030899 /src
parent22a5cadd578840f592b41a6d341e8cf7afb7ebbe (diff)
Meter madness (#64)
* Meter Madness Part 1 * progress * maybe * ::build meters too * vtables labeling, small order problems * Moar symbols * Renames * some dLytNote_c * Fixes * Checkpoint * ::remove funcs * Fix includes * Move code around * rm dead code * rm dead include * Draw functions * Update include/s/s_State.hpp * Update include/toBeSorted/scgame.h
Diffstat (limited to 'src')
-rw-r--r--src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/stddef.h4
-rw-r--r--src/d/lyt/d2d.cpp10
-rw-r--r--src/d/lyt/d_lyt_bird_gauge.cpp13
-rw-r--r--src/d/lyt/d_lyt_boss_gauge.cpp6
-rw-r--r--src/d/lyt/d_lyt_common_icon_item.cpp6
-rw-r--r--src/d/lyt/d_lyt_note.cpp104
-rw-r--r--src/d/lyt/d_lyt_pause_disp_00.cpp4
-rw-r--r--src/d/lyt/d_lyt_sky_gauge.cpp11
-rw-r--r--src/d/lyt/d_structd.cpp5
-rw-r--r--src/d/lyt/meter/d_lyt_meter.cpp682
-rw-r--r--src/d/lyt/meter/d_lyt_meter_a_btn.cpp138
-rw-r--r--src/d/lyt/meter/d_lyt_meter_cross_btn.cpp11
-rw-r--r--src/d/lyt/meter/d_lyt_meter_dowsing.cpp33
-rw-r--r--src/d/lyt/meter/d_lyt_meter_drink.cpp12
-rw-r--r--src/d/lyt/meter/d_lyt_meter_event_skip.cpp6
-rw-r--r--src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp93
-rw-r--r--src/d/lyt/meter/d_lyt_meter_item_select.cpp12
-rw-r--r--src/d/lyt/meter/d_lyt_meter_key.cpp69
-rw-r--r--src/d/lyt/meter/d_lyt_meter_minus_btn.cpp26
-rw-r--r--src/d/lyt/meter/d_lyt_meter_nun_stk.cpp6
-rw-r--r--src/d/lyt/meter/d_lyt_meter_nunchaku_bg.cpp6
-rw-r--r--src/d/lyt/meter/d_lyt_meter_plus_btn.cpp6
-rw-r--r--src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp10
-rw-r--r--src/d/lyt/meter/d_lyt_meter_rupy.cpp12
-rw-r--r--src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp47
-rw-r--r--src/d/lyt/meter/d_lyt_meter_timer.cpp9
-rw-r--r--src/d/lyt/meter/d_lyt_meter_z_btn.cpp6
-rw-r--r--src/m/m2d.cpp2
28 files changed, 1334 insertions, 15 deletions
diff --git a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/stddef.h b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/stddef.h
index 09870064..121e4ac6 100644
--- a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/stddef.h
+++ b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/stddef.h
@@ -13,7 +13,11 @@ typedef unsigned long size_t;
typedef long ptrdiff_t;
#endif
+#ifdef __MWERKS__
#define offsetof(type, member) ((size_t) & (((type *)0)->member))
+#else
+#define offsetof(type, member) __builtin_offsetof(type, member)
+#endif
#ifndef NULL
#define NULL (0)
diff --git a/src/d/lyt/d2d.cpp b/src/d/lyt/d2d.cpp
index 90e13ff7..5a36550b 100644
--- a/src/d/lyt/d2d.cpp
+++ b/src/d/lyt/d2d.cpp
@@ -754,10 +754,10 @@ bool hasSameBaseName(const char *left, const char *right) {
char *sRef = "ref";
-void LytBase_c::linkMeters(nw4r::lyt::Group *group, LytMeterGroup *meterGroup) {
+void dSubPane::linkMeters(nw4r::lyt::Group *group, d2d::SubPaneList *meterGroup) {
// single regswap
- nw4r::ut::LinkList<LytMeterListNode, 0>::Iterator beginIt = meterGroup->GetBeginIter();
- nw4r::ut::LinkList<LytMeterListNode, 0>::Iterator endIt = meterGroup->GetEndIter();
+ nw4r::ut::LinkList<d2d::SubPaneListNode, 0>::Iterator beginIt = meterGroup->GetBeginIter();
+ nw4r::ut::LinkList<d2d::SubPaneListNode, 0>::Iterator endIt = meterGroup->GetEndIter();
for (nw4r::lyt::PaneList::Iterator paneIt = group->GetPaneList()->GetBeginIter();
paneIt != group->GetPaneList()->GetEndIter(); ++paneIt) {
@@ -766,8 +766,8 @@ void LytBase_c::linkMeters(nw4r::lyt::Group *group, LytMeterGroup *meterGroup) {
if (num != 0) {
const nw4r::lyt::res::ExtUserData *dat = pane->FindExtUserDataByName(sRef);
if (dat != nullptr && dat->GetType() == nw4r::lyt::res::TYPE_STRING) {
- for (nw4r::ut::LinkList<LytMeterListNode, 0>::Iterator it = beginIt; it != endIt; ++it) {
- dLytMeterBase *meter = it->mpMeter;
+ for (nw4r::ut::LinkList<d2d::SubPaneListNode, 0>::Iterator it = beginIt; it != endIt; ++it) {
+ d2d::dSubPane *meter = it->mpLytPane;
if (!meter->LytMeter0x24()) {
if (hasSameBaseName(dat->GetString(), meter->getName())) {
it->mpPane = pane;
diff --git a/src/d/lyt/d_lyt_bird_gauge.cpp b/src/d/lyt/d_lyt_bird_gauge.cpp
new file mode 100644
index 00000000..28095237
--- /dev/null
+++ b/src/d/lyt/d_lyt_bird_gauge.cpp
@@ -0,0 +1,13 @@
+#include "d/lyt/d_lyt_bird_gauge.h"
+
+STATE_DEFINE(dLytBirdGaugeMain_c, ModeNone);
+STATE_DEFINE(dLytBirdGaugeMain_c, ModeIn);
+STATE_DEFINE(dLytBirdGaugeMain_c, ModeDash);
+STATE_DEFINE(dLytBirdGaugeMain_c, ModeRecovery);
+STATE_DEFINE(dLytBirdGaugeMain_c, ModeOut);
+
+STATE_DEFINE(dLytBirdGauge_c, In);
+STATE_DEFINE(dLytBirdGauge_c, None);
+STATE_DEFINE(dLytBirdGauge_c, Dash);
+STATE_DEFINE(dLytBirdGauge_c, Recovery);
+STATE_DEFINE(dLytBirdGauge_c, Out);
diff --git a/src/d/lyt/d_lyt_boss_gauge.cpp b/src/d/lyt/d_lyt_boss_gauge.cpp
new file mode 100644
index 00000000..990dd989
--- /dev/null
+++ b/src/d/lyt/d_lyt_boss_gauge.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/d_lyt_boss_gauge.h"
+
+STATE_DEFINE(dLytBossGauge_c, None);
+STATE_DEFINE(dLytBossGauge_c, In);
+STATE_DEFINE(dLytBossGauge_c, Move);
+STATE_DEFINE(dLytBossGauge_c, Out);
diff --git a/src/d/lyt/d_lyt_common_icon_item.cpp b/src/d/lyt/d_lyt_common_icon_item.cpp
new file mode 100644
index 00000000..54e3d1da
--- /dev/null
+++ b/src/d/lyt/d_lyt_common_icon_item.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/d_lyt_common_icon_item.h"
+
+STATE_DEFINE(dLytCommonIconItem_c, None);
+STATE_DEFINE(dLytCommonIconItem_c, In);
+STATE_DEFINE(dLytCommonIconItem_c, Wait);
+STATE_DEFINE(dLytCommonIconItem_c, Out);
diff --git a/src/d/lyt/d_lyt_note.cpp b/src/d/lyt/d_lyt_note.cpp
new file mode 100644
index 00000000..c9cc356a
--- /dev/null
+++ b/src/d/lyt/d_lyt_note.cpp
@@ -0,0 +1,104 @@
+#include "d/lyt/d_lyt_note.h"
+
+STATE_DEFINE(dLytNote_c, Wait);
+STATE_DEFINE(dLytNote_c, In);
+STATE_DEFINE(dLytNote_c, Move);
+STATE_DEFINE(dLytNote_c, Out);
+
+void dLytNote_c::initializeState_Wait() {
+ field_0x273 = 0;
+}
+void dLytNote_c::executeState_Wait() {
+ if (field_0x270 != 0) {
+ mStateMgr.changeState(StateID_In);
+ }
+}
+void dLytNote_c::finalizeState_Wait() {}
+
+void dLytNote_c::initializeState_In() {}
+void dLytNote_c::executeState_In() {}
+void dLytNote_c::finalizeState_In() {}
+
+void dLytNote_c::initializeState_Move() {
+ field_0x273 = 1;
+}
+void dLytNote_c::executeState_Move() {}
+void dLytNote_c::finalizeState_Move() {}
+
+void dLytNote_c::initializeState_Out() {}
+void dLytNote_c::executeState_Out() {}
+void dLytNote_c::finalizeState_Out() {}
+
+static const d2d::LytBrlanMapping brlanMap[] = {
+ { "suiryuScore_00_noteGet.brlan", "G_mark_00"},
+ { "suiryuScore_00_noteGetLoop.brlan", "G_mark_00"},
+ {"suiryuScore_00_noteLostLoop.brlan", "G_mark_00"},
+ { "suiryuScore_00_noteLost.brlan", "G_mark_00"},
+ { "suiryuScore_00_noteFix.brlan", "G_mark_00"},
+ { "suiryuScore_00_noteColor.brlan", "G_color_00"},
+};
+
+#define NOTE_ANIM_GET 0
+#define NOTE_ANIM_GET_LOOP 1
+#define NOTE_ANIM_LOST_LOOP 2
+#define NOTE_ANIM_LOST 3
+#define NOTE_ANIM_FIX 4
+#define NOTE_ANIM_COLOR 5
+
+bool dLytNote_c::build(d2d::ResAccIf_c *resAcc) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("suiryuScore_00.brlyt", nullptr);
+
+ for (int i = 0; i < 6; i++) {
+ mAnmGroups[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
+ mAnmGroups[i].setDirection(false);
+ mAnmGroups[i].setAnimEnable(false);
+ }
+
+ mAnmGroups[NOTE_ANIM_COLOR].setAnimEnable(true);
+ static const char *sPaneName = "N_inOutAll_00";
+ mpPane = mLyt.findPane(sPaneName);
+ mpPane->SetVisible(false);
+ // FPR Regswap
+ const nw4r::math::VEC3 &translate = mpPane->GetTranslate();
+ mTranslate.set(translate.x, translate.y, translate.z);
+ field_0x268 = 6;
+ field_0x264 = 4;
+ field_0x260 = 0.0f;
+ field_0x270 = 0;
+ field_0x271 = 0;
+ field_0x272 = 0;
+ field_0x273 = 0;
+ field_0x274 = 0;
+ field_0x26C = 0;
+ mStateMgr.changeState(StateID_Wait);
+ return true;
+}
+
+bool dLytNote_c::remove() {
+ for (int i = 0; i < 6; i++) {
+ // @bug? .unbind call is missing
+ mAnmGroups[i].afterUnbind();
+ }
+ return true;
+}
+
+void dLytNote_c::execute() {
+ // TODO
+}
+
+void dLytNote_c::draw() {
+ mLyt.addToDrawList();
+}
+
+f32 dLytNote_c::getField0x260() const {
+ return field_0x260;
+}
+
+void dLytNote_c::setFrame(f32 arg) {
+ if (field_0x268 != 6) {
+ // mysterious frsp here
+ field_0x260 = arg;
+ mAnmGroups[field_0x268].setFrame(arg);
+ }
+}
diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp
index e5205160..b4338f8b 100644
--- a/src/d/lyt/d_lyt_pause_disp_00.cpp
+++ b/src/d/lyt/d_lyt_pause_disp_00.cpp
@@ -28,13 +28,13 @@ void dLytPauseDisp00_c::init() {
for (int i = 0; i < 0x18; i++) {
field_0x2050[i].init(nullptr, lbl_804E8898[i]);
- mLytMeterGroup.PushBack(&field_0xE11C[i]);
+ mSubpanes.PushBack(&field_0xE11C[i]);
}
if (mLytBase.getLayout()->GetGroupContainer() != nullptr) {
nw4r::lyt::Group *group = mLytBase.getLayout()->GetGroupContainer()->FindGroupByName("G_ref_00");
if (group != nullptr) {
- mLytBase.linkMeters(group, &mLytMeterGroup);
+ d2d::dSubPane::linkMeters(group, &mSubpanes);
}
}
diff --git a/src/d/lyt/d_lyt_sky_gauge.cpp b/src/d/lyt/d_lyt_sky_gauge.cpp
new file mode 100644
index 00000000..e1d09e5c
--- /dev/null
+++ b/src/d/lyt/d_lyt_sky_gauge.cpp
@@ -0,0 +1,11 @@
+#include "d/lyt/d_lyt_sky_gauge.h"
+
+STATE_DEFINE(dLytSkyGaugeMain_c, ModeNone);
+STATE_DEFINE(dLytSkyGaugeMain_c, ModeIn);
+STATE_DEFINE(dLytSkyGaugeMain_c, ModeMove);
+STATE_DEFINE(dLytSkyGaugeMain_c, ModeOut);
+
+STATE_DEFINE(dLytSkyGauge_c, ModeNone);
+STATE_DEFINE(dLytSkyGauge_c, ModeIn);
+STATE_DEFINE(dLytSkyGauge_c, ModeMove);
+STATE_DEFINE(dLytSkyGauge_c, ModeOut);
diff --git a/src/d/lyt/d_structd.cpp b/src/d/lyt/d_structd.cpp
index dd249f22..37f3c84e 100644
--- a/src/d/lyt/d_structd.cpp
+++ b/src/d/lyt/d_structd.cpp
@@ -27,4 +27,9 @@ void dLytStructDList::removeFromList2(dLytStructD *other) {
mList2.remove(other);
}
+dLytStructD::~dLytStructD() {
+ delete[] field_0x1C;
+ field_0x1C = nullptr;
+}
+
} // namespace d2d
diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp
index 2b5c6020..f86fb2fe 100644
--- a/src/d/lyt/meter/d_lyt_meter.cpp
+++ b/src/d/lyt/meter/d_lyt_meter.cpp
@@ -1,6 +1,684 @@
+// clang-format off
+#include "common.h"
+#include "d/lyt/d_lyt_area_caption.h"
+#include "d/lyt/d_lyt_meter_configuration.h"
+#include "d/lyt/d_window.h"
#include "d/lyt/meter/d_lyt_meter.h"
+#include "toBeSorted/arc_managers/layout_arc_manager.h"
+#include "toBeSorted/scgame.h"
+// clang-format on
+static dLytMeterConfiguration_c sConf;
+
+STATE_DEFINE(dLytMeter1Button_c, Wait);
+STATE_DEFINE(dLytMeter1Button_c, ToUse);
+STATE_DEFINE(dLytMeter1Button_c, ToUnuse);
+STATE_DEFINE(dLytMeter1Button_c, Unuse);
+
+STATE_DEFINE(dLytMeter2Button_c, Wait);
+STATE_DEFINE(dLytMeter2Button_c, ToUse);
+STATE_DEFINE(dLytMeter2Button_c, ToUnuse);
+STATE_DEFINE(dLytMeter2Button_c, Unuse);
+
+STATE_DEFINE(dLytMeterParts_c, Invisible);
+STATE_DEFINE(dLytMeterParts_c, In);
+STATE_DEFINE(dLytMeterParts_c, Visible);
+STATE_DEFINE(dLytMeterParts_c, Out);
+
+void dLytMeter1Button_c::initializeState_Wait() {}
+void dLytMeter1Button_c::executeState_Wait() {
+ if (dLytMeterContainer_c::sInstance->isButtonFlag(0x80)) {
+ return;
+ }
+ mStateMgr.changeState(StateID_ToUnuse);
+}
+void dLytMeter1Button_c::finalizeState_Wait() {}
+
+void dLytMeter1Button_c::initializeState_ToUse() {
+ mAnmGroups[0].playBackwardsOnce();
+ mAnmGroups[0].setAnimEnable(true);
+}
+void dLytMeter1Button_c::executeState_ToUse() {
+ if (mAnmGroups[0].isStop2()) {
+ mStateMgr.changeState(StateID_Wait);
+ }
+
+ if (mAnmGroups[0].isFlag2()) {
+ mAnmGroups[0].play();
+ }
+}
+void dLytMeter1Button_c::finalizeState_ToUse() {
+ mAnmGroups[0].setAnimEnable(false);
+}
+
+void dLytMeter1Button_c::initializeState_ToUnuse() {
+ mAnmGroups[0].playLoop();
+ mAnmGroups[0].setAnimEnable(true);
+}
+void dLytMeter1Button_c::executeState_ToUnuse() {
+ if (mAnmGroups[0].isStop2()) {
+ mStateMgr.changeState(StateID_Unuse);
+ }
+
+ if (mAnmGroups[0].isFlag2()) {
+ mAnmGroups[0].play();
+ }
+}
+void dLytMeter1Button_c::finalizeState_ToUnuse() {
+ mAnmGroups[0].setAnimEnable(false);
+}
+
+void dLytMeter1Button_c::initializeState_Unuse() {
+ field_0x1A4 = 15;
+}
+void dLytMeter1Button_c::executeState_Unuse() {
+ if (dLytMeterContainer_c::sInstance->isButtonFlag(0x80)) {
+ if (!(field_0x1A4 > 0)) {
+ mStateMgr.changeState(StateID_ToUse);
+ return;
+ }
+ field_0x1A4 -= 1;
+ } else {
+ field_0x1A4 = 15;
+ }
+}
+void dLytMeter1Button_c::finalizeState_Unuse() {}
+
+static const d2d::LytBrlanMapping btn1BrlanMap[] = {
+ {"remoConBtn_04_input.brlan", "G_input_00"},
+ { "remoConBtn_04_call.brlan", "G_call_00"},
+ { "remoConBtn_04_loop.brlan", "G_loop_00"},
+};
+
+static char *sWindowName1 = "W_bgP_00";
+
+bool dLytMeter1Button_c::build(d2d::ResAccIf_c *resAcc) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("remoConBtn_04.brlyt", nullptr);
+
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].init(btn1BrlanMap[i].mFile, resAcc, mLyt.getLayout(), btn1BrlanMap[i].mName);
+ mAnmGroups[i].setDirection(false);
+ mAnmGroups[i].setAnimEnable(false);
+ }
+ // TODO
+ mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtnS_00"), nullptr);
+ mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtn_00"), nullptr);
+ mpWindow = mLyt.getWindow(sWindowName1);
+ mpTextbox = mLyt.getSizeBoxInWindow(sWindowName1);
+ mpWindow->UpdateSize(mpTextbox, 32.0f);
+ field_0x1A4 = 15;
+ field_0x1AC = 0;
+ field_0x1AD = 0;
+ field_0x1A8 = 0;
+ mAnmGroups[1].setToEnd();
+ mAnmGroups[1].setAnimEnable(true);
+ mAnmGroups[2].setAnimEnable(true);
+ mLyt.calc();
+ mAnmGroups[1].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Wait);
+ return true;
+}
+
+bool dLytMeter1Button_c::remove() {
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].unbind();
+ mAnmGroups[i].afterUnbind();
+ }
+ return true;
+}
+
+bool dLytMeter1Button_c::LytMeter0x14() {
+ if (*mStateMgr.getStateID() == StateID_ToUnuse) {
+ // TODO
+ } else {
+ mStateMgr.executeState();
+ }
+}
+
+void dLytMeter2Button_c::initializeState_Wait() {}
+void dLytMeter2Button_c::executeState_Wait() {
+ if (dLytMeterContainer_c::sInstance->isButtonFlag(0x100)) {
+ return;
+ }
+ mStateMgr.changeState(StateID_ToUnuse);
+}
+void dLytMeter2Button_c::finalizeState_Wait() {}
+
+void dLytMeter2Button_c::initializeState_ToUse() {
+ mAnmGroups[0].playBackwardsOnce();
+ mAnmGroups[0].setAnimEnable(true);
+}
+void dLytMeter2Button_c::executeState_ToUse() {
+ if (mAnmGroups[0].isStop2()) {
+ mStateMgr.changeState(StateID_Wait);
+ }
+
+ if (mAnmGroups[0].isFlag2()) {
+ mAnmGroups[0].play();
+ }
+}
+void dLytMeter2Button_c::finalizeState_ToUse() {
+ mAnmGroups[0].setAnimEnable(false);
+}
+
+void dLytMeter2Button_c::initializeState_ToUnuse() {
+ mAnmGroups[0].playLoop();
+ mAnmGroups[0].setAnimEnable(true);
+}
+void dLytMeter2Button_c::executeState_ToUnuse() {
+ if (mAnmGroups[0].isStop2()) {
+ mStateMgr.changeState(StateID_Unuse);
+ }
+
+ if (mAnmGroups[0].isFlag2()) {
+ mAnmGroups[0].play();
+ }
+}
+void dLytMeter2Button_c::finalizeState_ToUnuse() {
+ mAnmGroups[0].setAnimEnable(false);
+}
+
+void dLytMeter2Button_c::initializeState_Unuse() {
+ field_0x1A4 = 15;
+}
+void dLytMeter2Button_c::executeState_Unuse() {
+ if (dLytMeterContainer_c::sInstance->isButtonFlag(0x100)) {
+ if (!(field_0x1A4 > 0)) {
+ mStateMgr.changeState(StateID_ToUse);
+ return;
+ }
+ field_0x1A4 -= 1;
+ } else {
+ field_0x1A4 = 15;
+ }
+}
+void dLytMeter2Button_c::finalizeState_Unuse() {}
+
+static const d2d::LytBrlanMapping btn2BrlanMap[] = {
+ {"remoConBtn_05_input.brlan", "G_input_00"},
+ { "remoConBtn_05_call.brlan", "G_call_00"},
+ { "remoConBtn_05_loop.brlan", "G_loop_00"},
+};
+
+static char *sWindowName2 = "W_bgP_00";
+
+bool dLytMeter2Button_c::build(d2d::ResAccIf_c *resAcc) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("remoConBtn_05.brlyt", nullptr);
+
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].init(btn2BrlanMap[i].mFile, resAcc, mLyt.getLayout(), btn2BrlanMap[i].mName);
+ mAnmGroups[i].setDirection(false);
+ mAnmGroups[i].setAnimEnable(false);
+ }
+ mpWindow = mLyt.getWindow(sWindowName2);
+ mpTextbox = mLyt.getSizeBoxInWindow(sWindowName2);
+ mpWindow->UpdateSize(mpTextbox, 32.0f);
+ field_0x1A4 = 15;
+ field_0x1AC = 0;
+ field_0x1AD = 0;
+ field_0x1A8 = 0;
+ mAnmGroups[1].setToEnd();
+ mAnmGroups[1].setAnimEnable(true);
+ mAnmGroups[2].setAnimEnable(true);
+ mLyt.calc();
+ mAnmGroups[1].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Wait);
+ return true;
+}
+
+bool dLytMeter2Button_c::remove() {
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].unbind();
+ mAnmGroups[i].afterUnbind();
+ }
+ return true;
+}
+
+bool dLytMeter2Button_c::LytMeter0x14() {
+ if (*mStateMgr.getStateID() == StateID_ToUnuse) {
+ // TODO
+ } else {
+ mStateMgr.executeState();
+ }
+}
+
+void dLytMeterParts_c::initializeState_Invisible() {}
+void dLytMeterParts_c::executeState_Invisible() {}
+void dLytMeterParts_c::finalizeState_Invisible() {}
+
+void dLytMeterParts_c::initializeState_In() {}
+void dLytMeterParts_c::executeState_In() {}
+void dLytMeterParts_c::finalizeState_In() {}
+
+void dLytMeterParts_c::initializeState_Visible() {}
+void dLytMeterParts_c::executeState_Visible() {}
+void dLytMeterParts_c::finalizeState_Visible() {}
+
+void dLytMeterParts_c::initializeState_Out() {}
+void dLytMeterParts_c::executeState_Out() {}
+void dLytMeterParts_c::finalizeState_Out() {}
+
+void floats() {
+ 32.0f;
+ 1.0f;
+ 0.0f;
+ int x = 0;
+ f32 f = x;
+}
+
+void floats2() {
+ 5.0f;
+ 3.0f;
+}
+
+#pragma dont_inline on
dLytMeter_c::dLytMeter_c() {}
+#pragma dont_inline off
+
+extern "C" void *GLOBAL_TITLE_RELOADER;
+extern "C" void fn_800D97E0(int i);
+extern "C" void fn_800D9800(int i);
+extern "C" void fn_801B2D10(void *);
+extern "C" void *GLOBAL_MESSAGE_RELATED_CONTEXT;
+
+static const d2d::LytBrlanMapping meterBrlanMap[] = {
+ { "basicPosition_00_in.brlan", "G_remoConBtn_00"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_01"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_02"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_03"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_04"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_05"},
+ { "basicPosition_00_in.brlan", "G_remoConBtn_06"},
+ { "basicPosition_00_in.brlan", "G_remoConBg_00"},
+ { "basicPosition_00_in.brlan", "G_nunBtn_03"},
+ { "basicPosition_00_in.brlan", "G_nunBtn_01"},
+ { "basicPosition_00_in.brlan", "G_nunBtn_02"},
+ { "basicPosition_00_in.brlan", "G_nunBg_00"},
+ { "basicPosition_00_in.brlan", "G_shield_00"},
+ { "basicPosition_00_in.brlan", "G_rupy_00"},
+ { "basicPosition_00_in.brlan", "G_heart_00"},
+ { "basicPosition_00_in.brlan", "G_ganbari_00"},
+
+ { "basicPosition_00_out.brlan", "G_remoConBtn_00"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_01"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_02"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_03"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_04"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_05"},
+ { "basicPosition_00_out.brlan", "G_remoConBtn_06"},
+ { "basicPosition_00_out.brlan", "G_remoConBg_00"},
+ { "basicPosition_00_out.brlan", "G_nunBtn_03"},
+ { "basicPosition_00_out.brlan", "G_nunBtn_01"},
+ { "basicPosition_00_out.brlan", "G_nunBtn_02"},
+ { "basicPosition_00_out.brlan", "G_nunBg_00"},
+ { "basicPosition_00_out.brlan", "G_shield_00"},
+ { "basicPosition_00_out.brlan", "G_rupy_00"},
+ { "basicPosition_00_out.brlan", "G_heart_00"},
+ { "basicPosition_00_out.brlan", "G_ganbari_00"},
+
+ { "basicPosition_00_position.brlan", "G_position_00"},
+ {"basicPosition_00_rupyPosition.brlan", "G_rupyPosi_00"},
+};
+
+extern "C" void *STAGE_MANAGER;
+extern "C" bool StageManager__isAreaTypeSky(void *stageMgr);
+extern "C" bool StageManager__isAreaTypeDungeon(void *stageMgr);
+
+bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("basicPosition_00.brlyt", nullptr);
+ mLyt.setPriority(0x8A);
+ for (int i = 0; i < 34; i++) {
+ mAnmGroups[i].init(meterBrlanMap[i].mFile, resAcc, mLyt.getLayout(), meterBrlanMap[i].mName);
+ mAnmGroups[i].setDirection(false);
+ mAnmGroups[i].setAnimEnable(false);
+ }
+
+ // in G_remoConBtn_06, out G_remoConBtn_06
+ mABtn.setContainerGroups(&mAnmGroups[6], &mAnmGroups[22]);
+ // out G_shield_00
+ mShield.setContainerGroup(&mAnmGroups[28]);
+
+ if (GLOBAL_TITLE_RELOADER == nullptr) {
+ mp1Button = new dLytMeter1Button_c();
+ mp2Button = new dLytMeter2Button_c();
+ } else {
+ mp1Button = nullptr;
+ mp2Button = nullptr;
+ }
+
+ mNodes[0].mpLytPane = &mGanbariGauge;
+ mNodes[1].mpLytPane = &mRupy;
+ mNodes[2].mpLytPane = &mItemSelect;
+ mNodes[3].mpLytPane = &mCrossBtn;
+ mNodes[4].mpLytPane = &mPlusBtn;
+ mNodes[5].mpLytPane = &mMinusBtn;
+ mNodes[6].mpLytPane = &mABtn;
+ mNodes[7].mpLytPane = &mDowsing;
+ mNodes[8].mpLytPane = &mZBtn;
+ mNodes[9].mpLytPane = &mNunStk;
+ mNodes[10].mpLytPane = &mRemoCon;
+ mNodes[11].mpLytPane = &mNunBg;
+ mNodes[12].mpLytPane = &mHeart;
+ mNodes[13].mpLytPane = &mShield;
+ mNodes[14].mpLytPane = mp1Button;
+ mNodes[15].mpLytPane = mp2Button;
+ mPosArray1[0] = mLyt.findPane("N_shield_00")->GetTranslate();
+ mPosArray1[1] = mLyt.findPane("N_shield_01")->GetTranslate();
+
+ mPos1 = mPosArray1[0];
+ mPos2 = mPosArray1[1];
+ mLyt.findPane("N_rupyAll_00")->SetVisible(true);
+ mAnmGroups[33].setAnimEnable(true);
+
+ // Advance through some anim's keyframes and store positions in mPosArray2
+ for (int i = 0; i < 7; i++) {
+ mAnmGroups[33].setFrame(i);
+ mLyt.calc();
+ mPosArray2[i] = mLyt.findPane("N_rupy_00")->GetTranslate();
+ }
+
+ mAnmGroups[33].setAnimEnable(false);
+ mLyt.findPane("N_rupyAll_00")->SetVisible(false);
+
+ for (int i = 0; i < 16; i++) {
+ if (mNodes[i].mpLytPane != nullptr) {
+ mNodes[i].mpLytPane->build(resAcc);
+ mMeters.PushBack(&mNodes[i]);
+ }
+ }
+
+ if (isSilentRealm()) {
+ void *sirenData = LayoutArcManager::sInstance->getLoadedData("Siren");
+ mResAcc.attach(sirenData, "");
+ mpTimer = new dLytMeterTimer_c();
+ mpTimerPart1 = new LytMeterTimerPart1_c();
+ mpTimerPart2 = new LytMeterTimerPart2_c();
+
+ mpTimerPart1->build(&mResAcc);
+ mpTimerPart2->build(&mResAcc);
+ mpTimer->build();
+ } else {
+ mpTimer = nullptr;
+ mpTimerPart1 = nullptr;
+ mpTimerPart2 = nullptr;
+ }
+
+ if (GLOBAL_TITLE_RELOADER == nullptr && StageManager__isAreaTypeSky(STAGE_MANAGER)) {
+ mpSkyGauge = new dLytSkyGauge_c();
+ mpSkyGauge->build(resAcc);
+
+ mpBirdGauge = new dLytBirdGauge_c();
+ mpBirdGauge->build(resAcc);
+ } else {
+ mpSkyGauge = nullptr;
+ mpBirdGauge = nullptr;
+ }
+
+ if (ScGame::currentSpawnInfo.stageName == "F401") {
+ mpBossGauge = new dLytBossGauge_c();
+ mpBossGauge->build();
+ } else {
+ mpBossGauge = nullptr;
+ }
+
+ if (ScGame::isCurrentStage("F200") || ScGame::isCurrentStage("F210") || ScGame::isCurrentStage("F211")) {
+ mpKakeraKey = new dLytMeterKakeraKey_c();
+ mpKakeraKey->build(resAcc);
+ } else {
+ mpKakeraKey = nullptr;
+ }
+
+ if (!StageManager__isAreaTypeDungeon(STAGE_MANAGER) || ScGame::currentSpawnInfo.stageName == "F100_1" ||
+ ScGame::currentSpawnInfo.stageName == "F103_1") {
+ mpBossKey = nullptr;
+ } else {
+ mpBossKey = new dLytMeterBossKey_c();
+ mpBossKey->build(resAcc);
+ }
+
+ if (StageManager__isAreaTypeDungeon(STAGE_MANAGER) &&
+ (!(ScGame::currentSpawnInfo.stageName == "F100_1") && !(ScGame::currentSpawnInfo.stageName == "F103_1")) ||
+ ScGame::currentSpawnInfo.stageName == "F302" || ScGame::currentSpawnInfo.stageName == "F302") {
+ mpSmallKey = new dLytMeterSmallKey_c();
+ mpSmallKey->build(resAcc);
+ } else {
+ mpSmallKey = nullptr;
+ }
+
+ if (GLOBAL_TITLE_RELOADER != nullptr) {
+ mpDrink = nullptr;
+ } else {
+ mpDrink = new dLytMeterDrink_c();
+ mpDrink->build(resAcc);
+ }
+ return true;
+}
+
+bool dLytMeter_c::remove() {
+ for (int i = 0; i < 34; i++) {
+ mAnmGroups[i].afterUnbind();
+ }
+
+
+ for (d2d::SubPaneList::Iterator it = mMeters.GetBeginIter(); it != mMeters.GetEndIter(); ++it) {
+ d2d::dSubPane *m = it->mpLytPane;
+ if (m != nullptr) {
+ m->getPane()->GetParent()->RemoveChild(m->getPane());
+ }
+ }
+
+ for (int i = 0; i < 16; i++) {
+ if (mNodes[i].mpLytPane != nullptr) {
+ mNodes[i].mpLytPane->remove();
+ }
+ }
+
+ if (mp1Button != nullptr) {
+ delete mp1Button;
+ mp1Button = nullptr;
+ }
+
+ if (mp2Button != nullptr) {
+ delete mp2Button;
+ mp2Button = nullptr;
+ }
+
+ if (mpTimerPart1 != nullptr) {
+ mpTimerPart1->remove();
+ delete mpTimerPart1;
+ mpTimerPart1 = nullptr;
+ }
+
+ if (mpTimerPart2 != nullptr) {
+ mpTimerPart2->remove();
+ delete mpTimerPart2;
+ mpTimerPart2 = nullptr;
+ }
+
+ if (mpTimer != nullptr) {
+ mpTimer->remove();
+ delete mpTimer;
+ mpTimer = nullptr;
+ // WHY IS THIS HERE???
+ mResAcc.detach();
+ }
+
+ if (mpSkyGauge != nullptr) {
+ mpSkyGauge->remove();
+ delete mpSkyGauge;
+ mpSkyGauge = nullptr;
+ }
+
+ if (mpBirdGauge != nullptr) {
+ mpBirdGauge->remove();
+ delete mpBirdGauge;
+ mpBirdGauge = nullptr;
+ }
+
+ if (mpBossGauge != nullptr) {
+ mpBossGauge->remove();
+ delete mpBossGauge;
+ mpBossGauge = nullptr;
+ }
+
+ if (mpKakeraKey != nullptr) {
+ mpKakeraKey->remove();
+ delete mpKakeraKey;
+ mpKakeraKey = nullptr;
+ }
+
+ if (mpBossKey != nullptr) {
+ mpBossKey->remove();
+ delete mpBossKey;
+ mpBossKey = nullptr;
+ }
+
+ if (mpSmallKey != nullptr) {
+ mpSmallKey->remove();
+ delete mpSmallKey;
+ mpSmallKey = nullptr;
+ }
+
+ if (mpDrink != nullptr) {
+ mpDrink->remove();
+ delete mpDrink;
+ mpDrink = nullptr;
+ }
+
+
+ return true;
+}
+
+bool dLytMeter_c::draw() {
+ mLyt.addToDrawList();
+ if (mpTimerPart1 != nullptr) {
+ mpTimerPart1->getLyt()->addToDrawList();
+ }
+ if (mpTimerPart2 != nullptr) {
+ mpTimerPart2->getLyt()->addToDrawList();
+ }
+ if (mpSkyGauge != nullptr) {
+ mpSkyGauge->getLyt()->addToDrawList();
+ }
+ if (mpBirdGauge != nullptr) {
+ mpBirdGauge->getLyt()->addToDrawList();
+ }
+
+ if (mpBossGauge != nullptr) {
+ mpBossGauge->draw();
+ }
+
+ if (mpKakeraKey != nullptr) {
+ mpKakeraKey->draw();
+ }
+
+ if (mpBossKey != nullptr) {
+ mpBossKey->draw();
+ }
+
+ if (mpSmallKey != nullptr) {
+ mpSmallKey->draw();
+ }
+
+ if (mpDrink != nullptr) {
+ mpDrink->draw();
+ }
+
+ return true;
+}
+
+dLytMeterContainer_c::dLytMeterContainer_c() {
+ sInstance = this;
+}
+
+bool dLytMeterContainer_c::build() {
+ void *data = LayoutArcManager::sInstance->getLoadedData("DoButton");
+ mResAcc.attach(data, "");
+ if (GLOBAL_TITLE_RELOADER != nullptr) {
+ mpEventSkip = nullptr;
+ } else {
+ mpEventSkip = new dLytMeterEventSkip_c();
+ }
+
+ if (mpEventSkip != nullptr) {
+ mpEventSkip->build(&mResAcc);
+ }
+
+ dLytAreaCaption_c::create();
+ mMeter.build(&mResAcc);
+ if (GLOBAL_TITLE_RELOADER != nullptr) {
+ mpDoButton = nullptr;
+ mpDoButtonRelated = nullptr;
+ mpBirdRelated = nullptr;
+ } else {
+ mpDoButton = new dLytDobutton_c();
+ mpDoButtonRelated = new LytDoButtonRelated();
+ mpBirdRelated = new LytBirdButtonRelated();
+ }
+
+ if (mpDoButton != nullptr) {
+ mpDoButton->init(&mResAcc);
+ }
+ if (mpDoButtonRelated != nullptr) {
+ mpDoButtonRelated->build(&mResAcc);
+ }
+ if (mpBirdRelated != nullptr) {
+ mpBirdRelated->build(&mResAcc);
+ }
+
+ fn_800D97E0(0xb);
+ fn_800D9800(1);
+ fn_801B2D10(GLOBAL_MESSAGE_RELATED_CONTEXT);
+ return true;
+}
+
+bool dLytMeterContainer_c::remove() {
+ if (mpDoButton != nullptr) {
+ mpDoButton->remove();
+ delete mpDoButton;
+ mpDoButton = nullptr;
+ }
+ if (mpDoButtonRelated != nullptr) {
+ mpDoButtonRelated->remove();
+ delete mpDoButtonRelated;
+ mpDoButtonRelated = nullptr;
+
+ }
+ mMeter.remove();
+ if (mpEventSkip != nullptr) {
+ mpEventSkip->remove();
+ delete mpEventSkip;
+ mpEventSkip = nullptr;
+ }
+ if (mpBirdRelated != nullptr) {
+ mpBirdRelated->remove();
+ delete mpBirdRelated;
+ mpBirdRelated = nullptr;
+ }
+ dLytAreaCaption_c::remove();
+ mResAcc.detach();
+ return true;
+}
+
+bool dLytMeterContainer_c::draw() {
+ if (mVisible) {
+ mMeter.draw();
+ if (mMeter.field_0x13750 != 3) {
+ if (mpEventSkip != nullptr) {
+ mpEventSkip->draw();
+ }
+ dLytAreaCaption_c::draw();
+ if (mpDoButton != nullptr) {
+ mpDoButton->draw();
+ }
+ if (mpBirdRelated != nullptr) {
+ mpBirdRelated->draw();
+ }
+ }
+ }
-dLytMeterRemoconBg_c::dLytMeterRemoconBg_c() : mStateMgr(*this, sStateID::null) {}
-dLytMeterRemoconBg_c::~dLytMeterRemoconBg_c() {}
+ return true;
+}
diff --git a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp
new file mode 100644
index 00000000..6b87fc34
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp
@@ -0,0 +1,138 @@
+#include "d/lyt/d_textbox.h"
+#include "d/lyt/d_window.h"
+#include "d/lyt/meter/d_lyt_meter_a_btn.h"
+
+
+STATE_DEFINE(dLytMeterABtn_c, InvisibleWait);
+STATE_DEFINE(dLytMeterABtn_c, In);
+STATE_DEFINE(dLytMeterABtn_c, Out);
+STATE_DEFINE(dLytMeterABtn_c, Wait);
+STATE_DEFINE(dLytMeterABtn_c, On);
+STATE_DEFINE(dLytMeterABtn_c, Active);
+STATE_DEFINE(dLytMeterABtn_c, Off);
+
+void dLytMeterABtn_c::initializeState_InvisibleWait() {}
+void dLytMeterABtn_c::executeState_InvisibleWait() {
+ if (field_0x1C8 == 0) {
+ return;
+ }
+
+ if (field_0x1CA == 0) {
+ return;
+ }
+
+ mStateMgr.changeState(StateID_In);
+}
+void dLytMeterABtn_c::finalizeState_InvisibleWait() {}
+
+void dLytMeterABtn_c::initializeState_In() {
+ mpContainerAnmGroup1->setToEnd2();
+ mpContainerAnmGroup1->setAnimEnable(true);
+ mAnmGroups[0].playBackwardsOnce();
+}
+void dLytMeterABtn_c::executeState_In() {
+ if (mpContainerAnmGroup1->isEndReached()) {
+ mpContainerAnmGroup1->setAnimEnable(false);
+ mStateMgr.changeState(StateID_Wait);
+ }
+ if (mpContainerAnmGroup1->isFlag2()) {
+ mpContainerAnmGroup1->play();
+ }
+}
+void dLytMeterABtn_c::finalizeState_In() {}
+
+void dLytMeterABtn_c::initializeState_Out() {
+ mpContainerAnmGroup2->setToEnd2();
+ mpContainerAnmGroup2->setAnimEnable(true);
+}
+void dLytMeterABtn_c::executeState_Out() {
+ if (mpContainerAnmGroup2->isEndReached()) {
+ mpContainerAnmGroup2->setAnimEnable(false);
+ mStateMgr.changeState(StateID_InvisibleWait);
+ }
+ if (mpContainerAnmGroup2->isFlag2()) {
+ mpContainerAnmGroup2->play();
+ }
+}
+void dLytMeterABtn_c::finalizeState_Out() {}
+
+void dLytMeterABtn_c::initializeState_Wait() {}
+void dLytMeterABtn_c::executeState_Wait() {}
+void dLytMeterABtn_c::finalizeState_Wait() {}
+
+void dLytMeterABtn_c::initializeState_On() {}
+void dLytMeterABtn_c::executeState_On() {}
+void dLytMeterABtn_c::finalizeState_On() {}
+
+void dLytMeterABtn_c::initializeState_Active() {}
+void dLytMeterABtn_c::executeState_Active() {}
+void dLytMeterABtn_c::finalizeState_Active() {}
+
+void dLytMeterABtn_c::initializeState_Off() {}
+void dLytMeterABtn_c::executeState_Off() {}
+void dLytMeterABtn_c::finalizeState_Off() {}
+
+static const d2d::LytBrlanMapping brlanMap[] = {
+ {"remoConBtn_06_input.brlan", "G_input_00"},
+ { "remoConBtn_06_text.brlan", "G_text_00"},
+ { "remoConBtn_06_loop.brlan", "G_loop_00"},
+};
+
+#define A_BTN_ANIM_INPUT 0
+#define A_BTN_ANIM_TEXT 1
+#define A_BTN_ANIM_LOOP 2
+
+static const char *sTextBoxes[] = {
+ "T_aBtn_00",
+ "T_aBtnS_00",
+};
+
+bool dLytMeterABtn_c::build(d2d::ResAccIf_c *resAcc) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("remoConBtn_06.brlyt", nullptr);
+
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
+ mAnmGroups[i].setDirection(false);
+ mAnmGroups[i].setAnimEnable(false);
+ }
+
+ static const char *sPane = "N_all_0";
+ mpPane = mLyt.findPane(sPane);
+
+ for (int i = 0; i < 2; i++) {
+ mpTextBoxes[i] = mLyt.getTextBox(sTextBoxes[i]);
+ }
+
+ static const char *sWindow = "W_bg_P_00";
+ mpWindow = mLyt.getWindow(sWindow);
+ mpSizeBox = mLyt.getSizeBoxInWindow(sWindow);
+
+ field_0x1C4 = 0x5F;
+ field_0x1B8 = 0x5F;
+ field_0x1BC = 0x5F;
+ field_0x1C8 = 0;
+ field_0x1CA = 0;
+ field_0x1C9 = 0;
+ field_0x1C0 = 1;
+ field_0x1CB = 0;
+ field_0x1A4 = 0;
+ mAnmGroups[A_BTN_ANIM_TEXT].setAnimEnable(true);
+ fn_800E0870(field_0x1B8);
+ mAnmGroups[A_BTN_ANIM_TEXT].setFrame(0.0f);
+ mAnmGroups[A_BTN_ANIM_INPUT].setToEnd();
+ mAnmGroups[A_BTN_ANIM_INPUT].setAnimEnable(true);
+ mAnmGroups[A_BTN_ANIM_LOOP].setAnimEnable(true);
+ mLyt.calc();
+ mAnmGroups[A_BTN_ANIM_INPUT].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Wait);
+ return true;
+}
+
+bool dLytMeterABtn_c::remove() {
+ for (int i = 0; i < 3; i++) {
+ mAnmGroups[i].unbind();
+ mAnmGroups[i].afterUnbind();
+ }
+ return true;
+}
diff --git a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp
new file mode 100644
index 00000000..adfc7a09
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp
@@ -0,0 +1,11 @@
+#include "d/lyt/meter/d_lyt_meter_cross_btn.h"
+
+STATE_DEFINE(dLytMeterCrossBtnParts_c, Wait);
+STATE_DEFINE(dLytMeterCrossBtnParts_c, On);
+STATE_DEFINE(dLytMeterCrossBtnParts_c, Active);
+STATE_DEFINE(dLytMeterCrossBtnParts_c, Off);
+
+STATE_DEFINE(dLytMeterCrossBtn_c, Wait);
+STATE_DEFINE(dLytMeterCrossBtn_c, ToUse);
+STATE_DEFINE(dLytMeterCrossBtn_c, ToUnuse);
+STATE_DEFINE(dLytMeterCrossBtn_c, Unuse);
diff --git a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp
new file mode 100644
index 00000000..3086fe25
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp
@@ -0,0 +1,33 @@
+#include "d/lyt/meter/d_lyt_meter_dowsing.h"
+
+STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Wait);
+STATE_DEFINE(dLytMeterDowsingMenuIcon_c, On);
+STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Select);
+STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Off);
+
+STATE_DEFINE(dLytMeterDowsingBlink_c, Wait);
+STATE_DEFINE(dLytMeterDowsingBlink_c, On);
+STATE_DEFINE(dLytMeterDowsingBlink_c, Select);
+STATE_DEFINE(dLytMeterDowsingBlink_c, Off);
+
+STATE_DEFINE(dLytMeterDowsingInput_c, Wait);
+STATE_DEFINE(dLytMeterDowsingInput_c, On);
+STATE_DEFINE(dLytMeterDowsingInput_c, Select);
+STATE_DEFINE(dLytMeterDowsingInput_c, Off);
+
+STATE_DEFINE(dLytMeterDowsingText_c, Wait);
+STATE_DEFINE(dLytMeterDowsingText_c, On);
+STATE_DEFINE(dLytMeterDowsingText_c, Select);
+STATE_DEFINE(dLytMeterDowsingText_c, Off);
+
+STATE_DEFINE(dLytMeterDowsing_c, Invisible);
+STATE_DEFINE(dLytMeterDowsing_c, Wait);
+STATE_DEFINE(dLytMeterDowsing_c, MenuSelectingIn);
+STATE_DEFINE(dLytMeterDowsing_c, MenuSelecting);
+STATE_DEFINE(dLytMeterDowsing_c, MenuSelectingOut);
+STATE_DEFINE(dLytMeterDowsing_c, Reset);
+STATE_DEFINE(dLytMeterDowsing_c, ToUse);
+STATE_DEFINE(dLytMeterDowsing_c, ToUnuse);
+STATE_DEFINE(dLytMeterDowsing_c, Unuse);
+STATE_DEFINE(dLytMeterDowsing_c, DemoMove);
+STATE_DEFINE(dLytMeterDowsing_c, DemoOut);
diff --git a/src/d/lyt/meter/d_lyt_meter_drink.cpp b/src/d/lyt/meter/d_lyt_meter_drink.cpp
new file mode 100644
index 00000000..8e691aab
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_drink.cpp
@@ -0,0 +1,12 @@
+#include "d/lyt/meter/d_lyt_meter_drink.h"
+
+STATE_DEFINE(dLytMeterDrinkParts_c, Invisible);
+STATE_DEFINE(dLytMeterDrinkParts_c, In);
+STATE_DEFINE(dLytMeterDrinkParts_c, Visible);
+STATE_DEFINE(dLytMeterDrinkParts_c, Out);
+
+STATE_DEFINE(dLytMeterDrink_c, Invisible);
+STATE_DEFINE(dLytMeterDrink_c, In);
+STATE_DEFINE(dLytMeterDrink_c, Wait);
+STATE_DEFINE(dLytMeterDrink_c, Move);
+STATE_DEFINE(dLytMeterDrink_c, Out);
diff --git a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp
new file mode 100644
index 00000000..27cc4ae4
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/meter/d_lyt_meter_event_skip.h"
+
+STATE_DEFINE(dLytMeterEventSkip_c, Invisible);
+STATE_DEFINE(dLytMeterEventSkip_c, In);
+STATE_DEFINE(dLytMeterEventSkip_c, Visible);
+STATE_DEFINE(dLytMeterEventSkip_c, Out);
diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
new file mode 100644
index 00000000..640465be
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
@@ -0,0 +1,93 @@
+#include "d/lyt/meter/d_lyt_meter_ganbari_gauge.h"
+
+STATE_DEFINE(dLytMeterGanbariGauge_c, InvisibleWait);
+STATE_DEFINE(dLytMeterGanbariGauge_c, In);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Wait);
+STATE_DEFINE(dLytMeterGanbariGauge_c, OutWait);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Out);
+STATE_DEFINE(dLytMeterGanbariGauge_c, CameraOut);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Full);
+STATE_DEFINE(dLytMeterGanbariGauge_c, FullGutsUse);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Normal);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Caution);
+STATE_DEFINE(dLytMeterGanbariGauge_c, ToMin);
+STATE_DEFINE(dLytMeterGanbariGauge_c, Recovery);
+STATE_DEFINE(dLytMeterGanbariGauge_c, ToMax);
+
+void dLytMeterGanbariGauge_c::initializeState_InvisibleWait() {}
+void dLytMeterGanbariGauge_c::executeState_InvisibleWait() {}
+void dLytMeterGanbariGauge_c::finalizeState_InvisibleWait() {}
+
+void dLytMeterGanbariGauge_c::initializeState_In() {}
+void dLytMeterGanbariGauge_c::executeState_In() {}
+void dLytMeterGanbariGauge_c::finalizeState_In() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Wait() {}
+void dLytMeterGanbariGauge_c::executeState_Wait() {}
+void dLytMeterGanbariGauge_c::finalizeState_Wait() {}
+
+void dLytMeterGanbariGauge_c::initializeState_OutWait() {}
+void dLytMeterGanbariGauge_c::executeState_OutWait() {}
+void dLytMeterGanbariGauge_c::finalizeState_OutWait() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Out() {}
+void dLytMeterGanbariGauge_c::executeState_Out() {}
+void dLytMeterGanbariGauge_c::finalizeState_Out() {}
+
+void dLytMeterGanbariGauge_c::initializeState_CameraOut() {}
+void dLytMeterGanbariGauge_c::executeState_CameraOut() {}
+void dLytMeterGanbariGauge_c::finalizeState_CameraOut() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Full() {}
+void dLytMeterGanbariGauge_c::executeState_Full() {}
+void dLytMeterGanbariGauge_c::finalizeState_Full() {}
+
+void dLytMeterGanbariGauge_c::initializeState_FullGutsUse() {}
+void dLytMeterGanbariGauge_c::executeState_FullGutsUse() {}
+void dLytMeterGanbariGauge_c::finalizeState_FullGutsUse() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Normal() {}
+void dLytMeterGanbariGauge_c::executeState_Normal() {}
+void dLytMeterGanbariGauge_c::finalizeState_Normal() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Caution() {}
+void dLytMeterGanbariGauge_c::executeState_Caution() {}
+void dLytMeterGanbariGauge_c::finalizeState_Caution() {}
+
+void dLytMeterGanbariGauge_c::initializeState_ToMin() {}
+void dLytMeterGanbariGauge_c::executeState_ToMin() {}
+void dLytMeterGanbariGauge_c::finalizeState_ToMin() {}
+
+void dLytMeterGanbariGauge_c::initializeState_Recovery() {}
+void dLytMeterGanbariGauge_c::executeState_Recovery() {}
+void dLytMeterGanbariGauge_c::finalizeState_Recovery() {}
+
+void dLytMeterGanbariGauge_c::initializeState_ToMax() {}
+void dLytMeterGanbariGauge_c::executeState_ToMax() {}
+void dLytMeterGanbariGauge_c::finalizeState_ToMax() {}
+
+bool dLytMeterGanbariGauge_c::build(d2d::ResAccIf_c *resAcc) {
+ // TODO
+ return true;
+}
+
+bool dLytMeterGanbariGauge_c::remove() {
+ return true;
+}
+
+bool dLytMeterGanbariGauge_c::LytMeter0x14() {
+ // TODO
+ return true;
+}
+
+const char *dLytMeterGanbariGauge_c::getName() const {
+ return mLyt.getName();
+}
+
+d2d::LytBase_c *dLytMeterGanbariGauge_c::getLyt() {
+ return &mLyt;
+}
+
+nw4r::lyt::Pane *dLytMeterGanbariGauge_c::getPane() {
+ return mLyt.getLayout()->GetRootPane();
+}
diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp
new file mode 100644
index 00000000..4f57a478
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp
@@ -0,0 +1,12 @@
+#include "d/lyt/meter/d_lyt_meter_item_select.h"
+
+dLytMeterItemSelect_c::dLytMeterItemSelect_c() : mStateMgr(*this, sStateID::null) {
+ field_0x574C = 11;
+ field_0x5750 = 11;
+ field_0x5754 = 0;
+ field_0x5758 = -1;
+ field_0x575C = 0;
+ field_0x5760 = 0;
+ field_0x5764 = -1;
+ field_0x5768 = 2;
+}
diff --git a/src/d/lyt/meter/d_lyt_meter_key.cpp b/src/d/lyt/meter/d_lyt_meter_key.cpp
new file mode 100644
index 00000000..d9bd35fc
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_key.cpp
@@ -0,0 +1,69 @@
+#include "d/lyt/meter/d_lyt_meter_key.h"
+
+STATE_DEFINE(dLytMeterKakeraKey_c, Wait);
+STATE_DEFINE(dLytMeterKakeraKey_c, On);
+STATE_DEFINE(dLytMeterKakeraKey_c, Increase);
+STATE_DEFINE(dLytMeterKakeraKey_c, Active);
+STATE_DEFINE(dLytMeterKakeraKey_c, Off);
+
+STATE_DEFINE(dLytMeterBossKey_c, Wait);
+STATE_DEFINE(dLytMeterBossKey_c, On);
+STATE_DEFINE(dLytMeterBossKey_c, Active);
+STATE_DEFINE(dLytMeterBossKey_c, Off);
+
+STATE_DEFINE(dLytMeterSmallKey_c, Wait);
+STATE_DEFINE(dLytMeterSmallKey_c, On);
+STATE_DEFINE(dLytMeterSmallKey_c, Active);
+STATE_DEFINE(dLytMeterSmallKey_c, Off);
+
+void dLytMeterKakeraKey_c::initializeState_Wait() {}
+void dLytMeterKakeraKey_c::executeState_Wait() {}
+void dLytMeterKakeraKey_c::finalizeState_Wait() {}
+
+void dLytMeterKakeraKey_c::initializeState_On() {}
+void dLytMeterKakeraKey_c::executeState_On() {}
+void dLytMeterKakeraKey_c::finalizeState_On() {}
+
+void dLytMeterKakeraKey_c::initializeState_Increase() {}
+void dLytMeterKakeraKey_c::executeState_Increase() {}
+void dLytMeterKakeraKey_c::finalizeState_Increase() {}
+
+void dLytMeterKakeraKey_c::initializeState_Active() {}
+void dLytMeterKakeraKey_c::executeState_Active() {}
+void dLytMeterKakeraKey_c::finalizeState_Active() {}
+
+void dLytMeterKakeraKey_c::initializeState_Off() {}
+void dLytMeterKakeraKey_c::executeState_Off() {}
+void dLytMeterKakeraKey_c::finalizeState_Off() {}
+
+void dLytMeterBossKey_c::initializeState_Wait() {}
+void dLytMeterBossKey_c::executeState_Wait() {}
+void dLytMeterBossKey_c::finalizeState_Wait() {}
+
+void dLytMeterBossKey_c::initializeState_On() {}
+void dLytMeterBossKey_c::executeState_On() {}
+void dLytMeterBossKey_c::finalizeState_On() {}
+
+void dLytMeterBossKey_c::initializeState_Active() {}
+void dLytMeterBossKey_c::executeState_Active() {}
+void dLytMeterBossKey_c::finalizeState_Active() {}
+
+void dLytMeterBossKey_c::initializeState_Off() {}
+void dLytMeterBossKey_c::executeState_Off() {}
+void dLytMeterBossKey_c::finalizeState_Off() {}
+
+void dLytMeterSmallKey_c::initializeState_Wait() {}
+void dLytMeterSmallKey_c::executeState_Wait() {}
+void dLytMeterSmallKey_c::finalizeState_Wait() {}
+
+void dLytMeterSmallKey_c::initializeState_On() {}
+void dLytMeterSmallKey_c::executeState_On() {}
+void dLytMeterSmallKey_c::finalizeState_On() {}
+
+void dLytMeterSmallKey_c::initializeState_Active() {}
+void dLytMeterSmallKey_c::executeState_Active() {}
+void dLytMeterSmallKey_c::finalizeState_Active() {}
+
+void dLytMeterSmallKey_c::initializeState_Off() {}
+void dLytMeterSmallKey_c::executeState_Off() {}
+void dLytMeterSmallKey_c::finalizeState_Off() {}
diff --git a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp
new file mode 100644
index 00000000..2e388799
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp
@@ -0,0 +1,26 @@
+#include "d/lyt/meter/d_lyt_meter_minus_btn.h"
+
+STATE_DEFINE(dLytMeterMinusBtnMenuIcon_c, Wait);
+STATE_DEFINE(dLytMeterMinusBtnMenuIcon_c, On);
+STATE_DEFINE(dLytMeterMinusBtnMenuIcon_c, Select);
+STATE_DEFINE(dLytMeterMinusBtnMenuIcon_c, Off);
+
+STATE_DEFINE(dLytMeterMinusBtnBlink_c, Wait);
+STATE_DEFINE(dLytMeterMinusBtnBlink_c, On);
+STATE_DEFINE(dLytMeterMinusBtnBlink_c, Select);
+STATE_DEFINE(dLytMeterMinusBtnBlink_c, Off);
+
+STATE_DEFINE(dLytMeterMinusBtnText_c, Wait);
+STATE_DEFINE(dLytMeterMinusBtnText_c, On);
+STATE_DEFINE(dLytMeterMinusBtnText_c, Select);
+STATE_DEFINE(dLytMeterMinusBtnText_c, Off);
+
+STATE_DEFINE(dLytMeterMinusBtn_c, Wait);
+STATE_DEFINE(dLytMeterMinusBtn_c, MenuSelectingIn);
+STATE_DEFINE(dLytMeterMinusBtn_c, MenuSelecting);
+STATE_DEFINE(dLytMeterMinusBtn_c, MenuSelectingOut);
+STATE_DEFINE(dLytMeterMinusBtn_c, ToUse);
+STATE_DEFINE(dLytMeterMinusBtn_c, ToUnuse);
+STATE_DEFINE(dLytMeterMinusBtn_c, Unuse);
+STATE_DEFINE(dLytMeterMinusBtn_c, DemoMove);
+STATE_DEFINE(dLytMeterMinusBtn_c, DemoOut);
diff --git a/src/d/lyt/meter/d_lyt_meter_nun_stk.cpp b/src/d/lyt/meter/d_lyt_meter_nun_stk.cpp
new file mode 100644
index 00000000..44f22d05
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_nun_stk.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/meter/d_lyt_meter_nun_stk.h"
+
+STATE_DEFINE(dLytMeterNunStk_c, Wait);
+STATE_DEFINE(dLytMeterNunStk_c, On);
+STATE_DEFINE(dLytMeterNunStk_c, Active);
+STATE_DEFINE(dLytMeterNunStk_c, Off);
diff --git a/src/d/lyt/meter/d_lyt_meter_nunchaku_bg.cpp b/src/d/lyt/meter/d_lyt_meter_nunchaku_bg.cpp
new file mode 100644
index 00000000..1d53431e
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_nunchaku_bg.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/meter/d_lyt_meter_nunchaku_bg.h"
+
+STATE_DEFINE(dLytMeterNunchakuBg_c, Wait);
+STATE_DEFINE(dLytMeterNunchakuBg_c, On);
+STATE_DEFINE(dLytMeterNunchakuBg_c, Active);
+STATE_DEFINE(dLytMeterNunchakuBg_c, Off);
diff --git a/src/d/lyt/meter/d_lyt_meter_plus_btn.cpp b/src/d/lyt/meter/d_lyt_meter_plus_btn.cpp
new file mode 100644
index 00000000..58601775
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_plus_btn.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/meter/d_lyt_meter_plus_btn.h"
+
+STATE_DEFINE(dLytMeterPlusBtn_c, Wait);
+STATE_DEFINE(dLytMeterPlusBtn_c, ToUse);
+STATE_DEFINE(dLytMeterPlusBtn_c, ToUnuse);
+STATE_DEFINE(dLytMeterPlusBtn_c, Unuse);
diff --git a/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp b/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp
index e2125a52..ad4ca4dc 100644
--- a/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp
+++ b/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp
@@ -1,8 +1,8 @@
#include "d/lyt/meter/d_lyt_meter_remocon_bg.h"
-
+#include "d/lyt/d_lyt_do_button.h"
+#include "d/lyt/meter/d_lyt_meter.h"
#include "toBeSorted/event_manager.h"
-
STATE_DEFINE(dLytMeterRemoconBg_c, Wait);
STATE_DEFINE(dLytMeterRemoconBg_c, On);
STATE_DEFINE(dLytMeterRemoconBg_c, Active);
@@ -24,11 +24,11 @@ void dLytMeterRemoconBg_c::initializeState_Off() {}
void dLytMeterRemoconBg_c::executeState_Off() {}
void dLytMeterRemoconBg_c::finalizeState_Off() {}
-static const char *n1 = "N_remoConBg_00";
bool dLytMeterRemoconBg_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("remoConBg_00.brlyt", nullptr);
+ static const char *n1 = "N_remoConBg_00";
mpPane = mLyt.findPane(n1);
field_0xE8 = 0x61;
field_0xDC = 0x61;
@@ -39,7 +39,7 @@ bool dLytMeterRemoconBg_c::build(d2d::ResAccIf_c *resAcc) {
return true;
}
-bool dLytMeterRemoconBg_c::LytMeter0x10() {
+bool dLytMeterRemoconBg_c::remove() {
return true;
}
@@ -52,7 +52,7 @@ const char *dLytMeterRemoconBg_c::getName() const {
return mLyt.getName();
}
-void *dLytMeterRemoconBg_c::LytMeter0x1C() {
+d2d::LytBase_c *dLytMeterRemoconBg_c::getLyt() {
return &mLyt;
}
diff --git a/src/d/lyt/meter/d_lyt_meter_rupy.cpp b/src/d/lyt/meter/d_lyt_meter_rupy.cpp
new file mode 100644
index 00000000..d6eb5895
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_rupy.cpp
@@ -0,0 +1,12 @@
+#include "d/lyt/meter/d_lyt_meter_rupy.h"
+
+STATE_DEFINE(dLytMeterRupyStart_c, Wait);
+STATE_DEFINE(dLytMeterRupyStart_c, Start);
+
+STATE_DEFINE(dLytMeterRupyBlink_c, Wait);
+STATE_DEFINE(dLytMeterRupyBlink_c, Flash);
+
+STATE_DEFINE(dLytMeterRupy_c, In);
+STATE_DEFINE(dLytMeterRupy_c, Active);
+STATE_DEFINE(dLytMeterRupy_c, Start);
+STATE_DEFINE(dLytMeterRupy_c, Out);
diff --git a/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp
new file mode 100644
index 00000000..0611be14
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp
@@ -0,0 +1,47 @@
+#include "d/lyt/meter/d_lyt_meter_shield_gauge.h"
+
+STATE_DEFINE(dLytMeterShieldGauge_c, Normal);
+STATE_DEFINE(dLytMeterShieldGauge_c, Use);
+STATE_DEFINE(dLytMeterShieldGauge_c, ToMax);
+
+void dLytMeterShieldGauge_c::initializeState_Normal() {}
+void dLytMeterShieldGauge_c::executeState_Normal() {}
+void dLytMeterShieldGauge_c::finalizeState_Normal() {}
+
+void dLytMeterShieldGauge_c::initializeState_Use() {}
+void dLytMeterShieldGauge_c::executeState_Use() {}
+void dLytMeterShieldGauge_c::finalizeState_Use() {}
+
+void dLytMeterShieldGauge_c::initializeState_ToMax() {}
+void dLytMeterShieldGauge_c::executeState_ToMax() {}
+void dLytMeterShieldGauge_c::finalizeState_ToMax() {}
+
+bool dLytMeterShieldGauge_c::build(d2d::ResAccIf_c *resAcc) {
+ // TODO
+ return true;
+}
+
+bool dLytMeterShieldGauge_c::remove() {
+ for (int i = 0; i < 8; i++) {
+ mAnmGroups[i].unbind();
+ mAnmGroups[i].afterUnbind();
+ }
+ return true;
+}
+
+bool dLytMeterShieldGauge_c::LytMeter0x14() {
+ // TODO
+ return true;
+}
+
+const char *dLytMeterShieldGauge_c::getName() const {
+ return mLyt.getName();
+}
+
+d2d::LytBase_c *dLytMeterShieldGauge_c::getLyt() {
+ return &mLyt;
+}
+
+nw4r::lyt::Pane *dLytMeterShieldGauge_c::getPane() {
+ return mLyt.getLayout()->GetRootPane();
+}
diff --git a/src/d/lyt/meter/d_lyt_meter_timer.cpp b/src/d/lyt/meter/d_lyt_meter_timer.cpp
new file mode 100644
index 00000000..91a216dc
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_timer.cpp
@@ -0,0 +1,9 @@
+#include "d/lyt/meter/d_lyt_meter_timer.h"
+
+STATE_DEFINE(dLytMeterTimer_c, ChangeSiren);
+STATE_DEFINE(dLytMeterTimer_c, Siren);
+STATE_DEFINE(dLytMeterTimer_c, ChangeSafeBloom);
+STATE_DEFINE(dLytMeterTimer_c, ChangeSafe);
+STATE_DEFINE(dLytMeterTimer_c, Safe);
+STATE_DEFINE(dLytMeterTimer_c, ChangeFruits);
+STATE_DEFINE(dLytMeterTimer_c, Fruits);
diff --git a/src/d/lyt/meter/d_lyt_meter_z_btn.cpp b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp
new file mode 100644
index 00000000..9a48f924
--- /dev/null
+++ b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp
@@ -0,0 +1,6 @@
+#include "d/lyt/meter/d_lyt_meter_z_btn.h"
+
+STATE_DEFINE(dLytMeterZBtn_c, Wait);
+STATE_DEFINE(dLytMeterZBtn_c, On);
+STATE_DEFINE(dLytMeterZBtn_c, Active);
+STATE_DEFINE(dLytMeterZBtn_c, Off);
diff --git a/src/m/m2d.cpp b/src/m/m2d.cpp
index f5dd3db4..b00cfa65 100644
--- a/src/m/m2d.cpp
+++ b/src/m/m2d.cpp
@@ -149,7 +149,7 @@ bool FrameCtrl_c::isStop() const {
f32 actualEnd;
switch (mFlags) {
case FLAG_NO_LOOP: actualEnd = mEndFrame - 1.0f; return mCurrFrame >= actualEnd;
- case FLAG_NO_LOOP | FLAG_BACKWARDS: return mCurrFrame <= 0;
+ case FLAG_NO_LOOP | FLAG_BACKWARDS: return mCurrFrame <= 0.0f;
default: return false;
}
}