diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index fee89686..5a5c1a42 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -316,7 +316,10 @@ d/lyt/meter/d_lyt_meter_unk.cpp: d/lyt/meter/d_lyt_meter_a_btn.cpp: .text start:0x800DFCC0 end:0x800E1188 .ctors start:0x804DB6E4 end:0x804DB6E8 - .data start:0x80513BE8 end:0x80513F38 + .rodata start:0x804E5020 end:0x804E5298 + .data start:0x80513B70 end:0x80513F38 + .sdata start:0x80572380 end:0x80572398 + .sdata2 start:0x80579B60 end:0x80579B70 .bss start:0x805AA190 end:0x805AA350 d/lyt/meter/d_lyt_meter_z_btn.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 84bb0bc8..d630fde6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4776,7 +4776,7 @@ fn_800D92C0 = .text:0x800D92C0; // type:function size:0x48 fn_800D9310 = .text:0x800D9310; // type:function size:0xD8 fn_800D93F0 = .text:0x800D93F0; // type:function size:0x1F0 draw__20dLytMeterContainer_cFv = .text:0x800D95E0; // type:function size:0x90 -fn_800D9670 = .text:0x800D9670; // type:function size:0x8 +fn_800D5670__20dLytMeterContainer_cFv = .text:0x800D9670; // type:function size:0x8 fn_800D9680 = .text:0x800D9680; // type:function size:0x64 fn_800D96F0 = .text:0x800D96F0; // type:function size:0x20 fn_800D9710 = .text:0x800D9710; // type:function size:0x10 @@ -5464,8 +5464,8 @@ executeState_Off__15dLytMeterABtn_cFv = .text:0x800E0230; // type:function size: finalizeState_Off__15dLytMeterABtn_cFv = .text:0x800E02B0; // type:function size:0x4 build__15dLytMeterABtn_cFPQ23d2d10ResAccIf_c = .text:0x800E02C0; // type:function size:0x1E0 remove__15dLytMeterABtn_cFv = .text:0x800E04A0; // type:function size:0x58 -fn_800E0500 = .text:0x800E0500; // type:function size:0x370 -fn_800E0870 = .text:0x800E0870; // type:function size:0x1E4 +execute__15dLytMeterABtn_cFv = .text:0x800E0500; // type:function size:0x370 +setMessage__15dLytMeterABtn_cFl = .text:0x800E0870; // type:function size:0x1E4 setMessageWithGlobalTextProcessor2__10dTextBox_cFPCcPve = .text:0x800E0A60; // type:function size:0xA0 getName__15dLytMeterABtn_cCFv = .text:0x800E0B00; // type:function size:0x8 getLyt__15dLytMeterABtn_cFv = .text:0x800E0B10; // type:function size:0x8 @@ -6545,7 +6545,7 @@ build__18LytDoButtonRelatedFPQ23d2d10ResAccIf_c = .text:0x8010EB90; // type:func remove__18LytDoButtonRelatedFv = .text:0x8010EC00; // type:function size:0x8 fn_8010EC10 = .text:0x8010EC10; // type:function size:0x134 fn_8010ED50 = .text:0x8010ED50; // type:function size:0x110 -fn_8010EE60 = .text:0x8010EE60; // type:function size:0xE8 +convertDoButton__18LytDoButtonRelatedFl = .text:0x8010EE60; // type:function size:0xE8 fn_8010EF50 = .text:0x8010EF50; // type:function size:0x3C build__16dLytCommonABtn_cFPQ23d2d10ResAccIf_c = .text:0x8010EF90; // type:function size:0xAC remove__16dLytCommonABtn_cFv = .text:0x8010F040; // type:function size:0x50 @@ -31265,22 +31265,22 @@ __vt__31sFStateID_c<16dLytMeterParts_c> = .data:0x80513AC4; // type:object size: __vt__33sFStateID_c<18dLytMeter2Button_c> = .data:0x80513AF8; // type:object size:0x34 __vt__33sFStateID_c<18dLytMeter1Button_c> = .data:0x80513B2C; // type:object size:0x34 lbl_80513B60 = .data:0x80513B60; // type:object size:0x10 -lbl_80513B70 = .data:0x80513B70; // type:object size:0x1C -lbl_80513B8C = .data:0x80513B8C; // type:object size:0xC -lbl_80513B98 = .data:0x80513B98; // type:object size:0x1C -lbl_80513BB4 = .data:0x80513BB4; // type:object size:0xC -lbl_80513BC0 = .data:0x80513BC0; // type:object size:0x1C -lbl_80513BDC = .data:0x80513BDC; // type:object size:0xC -lbl_80513BE8 = .data:0x80513BE8; // type:object size:0xC -lbl_80513BF4 = .data:0x80513BF4; // type:object size:0xC -lbl_80513C00 = .data:0x80513C00; // type:object size:0xC -lbl_80513C0C = .data:0x80513C0C; // type:object size:0xC +lbl_80513B70 = .data:0x80513B70; // type:object size:0x1A data:string +lbl_80513B8C = .data:0x80513B8C; // type:object size:0xB data:string +lbl_80513B98 = .data:0x80513B98; // type:object size:0x19 data:string +lbl_80513BB4 = .data:0x80513BB4; // type:object size:0xA data:string +lbl_80513BC0 = .data:0x80513BC0; // type:object size:0x19 data:string +lbl_80513BDC = .data:0x80513BDC; // type:object size:0xA data:string +lbl_80513BE8 = .data:0x80513BE8; // type:object size:0x9 data:string +lbl_80513BF4 = .data:0x80513BF4; // type:object size:0xA data:string +lbl_80513C00 = .data:0x80513C00; // type:object size:0xB data:string +lbl_80513C0C = .data:0x80513C0C; // type:object size:0x9 data:string lbl_80513C18 = .data:0x80513C18; // type:object size:0x14 data:string jumptable_80513C2C = .data:0x80513C2C; // type:object size:0xA4 scope:local -lbl_80513CD0 = .data:0x80513CD0; // type:object size:0x10 -lbl_80513CE0 = .data:0x80513CE0; // type:object size:0x10 -__vt__15dLytMeterABtn_c = .data:0x80513CF0; // type:object size:0x210 -__vt__30sFStateID_c<15dLytMeterABtn_c> = .data:0x80513F00; // type:object size:0x38 +lbl_80513CD0 = .data:0x80513CD0; // type:object size:0xE data:string +lbl_80513CE0 = .data:0x80513CE0; // type:object size:0xD data:string +__vt__15dLytMeterABtn_c = .data:0x80513CF0; // type:object size:0x34 +__vt__30sFStateID_c<15dLytMeterABtn_c> = .data:0x80513F00; // type:object size:0x34 lbl_80513F38 = .data:0x80513F38; // type:object size:0x18 lbl_80513F50 = .data:0x80513F50; // type:object size:0xC lbl_80513F5C = .data:0x80513F5C; // type:object size:0x18 @@ -38126,9 +38126,9 @@ lbl_80572360 = .sdata:0x80572360; // type:object size:0x8 lbl_80572368 = .sdata:0x80572368; // type:object size:0x8 lbl_80572370 = .sdata:0x80572370; // type:object size:0x8 lbl_80572378 = .sdata:0x80572378; // type:object size:0x8 -lbl_80572380 = .sdata:0x80572380; // type:object size:0x8 data:4byte +lbl_80572380 = .sdata:0x80572380; // type:object size:0x4 data:4byte lbl_80572388 = .sdata:0x80572388; // type:object size:0x8 data:4byte -lbl_80572390 = .sdata:0x80572390; // type:object size:0x8 data:4byte +lbl_80572390 = .sdata:0x80572390; // type:object size:0x4 data:4byte lbl_80572398 = .sdata:0x80572398; // type:object size:0x8 data:4byte lbl_805723A0 = .sdata:0x805723A0; // type:object size:0x8 data:4byte lbl_805723A8 = .sdata:0x805723A8; // type:object size:0x4 data:4byte @@ -48625,12 +48625,12 @@ StateID_Invisible__16dLytMeterParts_c = .bss:0x805AA0A0; // type:object size:0x3 StateID_In__16dLytMeterParts_c = .bss:0x805AA0E0; // type:object size:0x30 data:4byte StateID_Visible__16dLytMeterParts_c = .bss:0x805AA120; // type:object size:0x30 data:4byte StateID_Out__16dLytMeterParts_c = .bss:0x805AA160; // type:object size:0x30 data:4byte -lbl_805AA190 = .bss:0x805AA190; // type:object size:0x10 -StateID_InvisibleWait__15dLytMeterABtn_c = .bss:0x805AA1A0; // type:object size:0x40 data:4byte -StateID_In__15dLytMeterABtn_c = .bss:0x805AA1E0; // type:object size:0x80 data:4byte -StateID_Wait__15dLytMeterABtn_c = .bss:0x805AA260; // type:object size:0x40 data:4byte -LytMeterABtn__STATE_ON = .bss:0x805AA2A0; // type:object size:0x40 data:4byte -LytMeterABtn__STATE_ACTIVE = .bss:0x805AA2E0; // type:object size:0x40 data:4byte +lbl_805AA190 = .bss:0x805AA190; // type:object size:0xC +StateID_InvisibleWait__15dLytMeterABtn_c = .bss:0x805AA1A0; // type:object size:0x30 data:4byte +StateID_In__15dLytMeterABtn_c = .bss:0x805AA1E0; // type:object size:0x30 data:4byte +StateID_Wait__15dLytMeterABtn_c = .bss:0x805AA260; // type:object size:0x30 data:4byte +LytMeterABtn__STATE_ON = .bss:0x805AA2A0; // type:object size:0x30 data:4byte +LytMeterABtn__STATE_ACTIVE = .bss:0x805AA2E0; // type:object size:0x30 data:4byte LytMeterABtn__STATE_OFF = .bss:0x805AA320; // type:object size:0x30 data:4byte lbl_805AA350 = .bss:0x805AA350; // type:object size:0x10 LytMeterZBtn__STATE_WAIT = .bss:0x805AA360; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index 0ffb3de9..0a90d3b2 100644 --- a/configure.py +++ b/configure.py @@ -386,7 +386,7 @@ config.libs = [ Object(NonMatching, "d/d_tag_processor.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_unk.cpp"), - Object(NonMatching, "d/lyt/meter/d_lyt_meter_a_btn.cpp"), + Object(Matching, "d/lyt/meter/d_lyt_meter_a_btn.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_z_btn.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_key.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_drink.cpp"), diff --git a/include/d/lyt/d_lyt_do_button.h b/include/d/lyt/d_lyt_do_button.h index 06e2fd4c..915ae8e3 100644 --- a/include/d/lyt/d_lyt_do_button.h +++ b/include/d/lyt/d_lyt_do_button.h @@ -1,6 +1,7 @@ #ifndef D_LYT_DO_BUTTON_H #define D_LYT_DO_BUTTON_H +#include "common.h" #include "d/lyt/d2d.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" @@ -22,8 +23,20 @@ public: return sInstance; } - s32 getField0x47C() const { - return field_0x47C; + static s32 getField0x47C() { + if (sInstance != nullptr) { + return sInstance->field_0x47C; + } else { + return 0x5E; + } + } + + static s32 getField0x480() { + if (sInstance != nullptr) { + return sInstance->field_0x480; + } else { + return 0x29; + } } private: diff --git a/include/d/lyt/d_lyt_unknowns.h b/include/d/lyt/d_lyt_unknowns.h index 4d78f2e9..219ab3f3 100644 --- a/include/d/lyt/d_lyt_unknowns.h +++ b/include/d/lyt/d_lyt_unknowns.h @@ -16,6 +16,7 @@ public: } enum Action_e { + DO_DASH = 0x5F, DO_RETURN = 0x7F, DO_STOP = 0x84, DO_ITEMS = 0x85, @@ -27,12 +28,13 @@ public: }; enum DoButton_e { - DO_BUTTON_B = 1 + DO_BUTTON_A = 0, + DO_BUTTON_B = 1, }; void set(DoButton_e button, Action_e value) { field_0x04[button] = value; - field_0x34[button] = 1; + field_0x34[button] = true; } static Action_e get(DoButton_e button) { @@ -43,6 +45,14 @@ public: } } + static bool getHas(DoButton_e button) { + if (sInstance != nullptr) { + return sInstance->field_0x34[button]; + } else { + return false; + } + } + static Action_e get0x08() { if (sInstance != nullptr) { @@ -51,12 +61,14 @@ public: return DO_NONE; } } + + static Action_e convertDoButton(s32); private: static LytDoButtonRelated *sInstance; /* 0x04 */ Action_e field_0x04[12]; - /* 0x34 */ u8 field_0x34[12]; + /* 0x34 */ bool field_0x34[12]; }; // size 0x27C diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index 039e48f0..a9bbfb65 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -138,6 +138,8 @@ public: bool remove(); bool draw(); + bool fn_800D5670(); + static dLytMeterContainer_c *GetInstance() { return sInstance; } @@ -146,6 +148,14 @@ public: return &sInstance->mMeter; } + // Not all of these inlines exist on dLytMeter_c + // because accessing via GetMeter->get... causes + // different instructions sometimes + + s32 getMeterField_0x13750() const { + return mMeter.field_0x13750; + } + u8 getMeterField_0x13770() const { return mMeter.field_0x13770; } @@ -162,6 +172,8 @@ public: } } + + private: /* 0x00004 */ d2d::ResAccIf_c mResAcc; /* 0x00374 */ dLytMeterEventSkip_c *mpEventSkip; diff --git a/include/d/lyt/meter/d_lyt_meter_a_btn.h b/include/d/lyt/meter/d_lyt_meter_a_btn.h index 7b17e5c9..7c020169 100644 --- a/include/d/lyt/meter/d_lyt_meter_a_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_a_btn.h @@ -3,7 +3,6 @@ #include "d/lyt/d2d.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dLytMeterABtn_c : public d2d::dSubPane { public: @@ -26,8 +25,9 @@ public: mpContainerAnmGroup1 = g1; mpContainerAnmGroup2 = g2; } + private: - void fn_800E0870(u32); + void setMessage(s32 id); STATE_FUNC_DECLARE(dLytMeterABtn_c, InvisibleWait); STATE_FUNC_DECLARE(dLytMeterABtn_c, In); @@ -37,24 +37,24 @@ private: STATE_FUNC_DECLARE(dLytMeterABtn_c, Active); STATE_FUNC_DECLARE(dLytMeterABtn_c, Off); - UI_STATE_MGR_DECLARE(dLytMeterABtn_c); - d2d::dLytSub mLyt; - /* 0x0D8 */ d2d::AnmGroup_c mAnmGroups[3]; + /* 0x008 */ UI_STATE_MGR_DECLARE(dLytMeterABtn_c); + /* 0x044 */ d2d::dLytSub mLyt; + /* 0x0D8 */ d2d::AnmGroup_c mAnm[3]; /* 0x198 */ d2d::AnmGroup_c *mpContainerAnmGroup1; /* 0x19C */ d2d::AnmGroup_c *mpContainerAnmGroup2; /* 0x1A0 */ nw4r::lyt::Pane *mpPane; - /* 0x1A4 */ void *field_0x1A4; + /* 0x1A4 */ nw4r::lyt::Pane *mpOwnerPane; /* 0x1A8 */ dTextBox_c *mpTextBoxes[2]; /* 0x1B0 */ dWindow_c *mpWindow[1]; /* 0x1B4 */ dTextBox_c *mpSizeBox[1]; - /* 0x1B8 */ u32 field_0x1B8; - /* 0x1BC */ u32 field_0x1BC; - /* 0x1C0 */ u32 field_0x1C0; - /* 0x1C4 */ u32 field_0x1C4; + /* 0x1B8 */ s32 field_0x1B8; + /* 0x1BC */ s32 field_0x1BC; + /* 0x1C0 */ BOOL field_0x1C0; + /* 0x1C4 */ s32 field_0x1C4; /* 0x1C8 */ u8 field_0x1C8; /* 0x1C9 */ u8 field_0x1C9; /* 0x1CA */ u8 field_0x1CA; - /* 0x1CB */ u8 field_0x1CB; + /* 0x1CB */ bool mOldTextState; }; #endif diff --git a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp index c41ccf8a..15865fdf 100644 --- a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp @@ -1,8 +1,12 @@ #include "d/lyt/meter/d_lyt_meter_a_btn.h" #include "common.h" +#include "d/lyt/d_lyt_do_button.h" +#include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "toBeSorted/event_manager.h" STATE_DEFINE(dLytMeterABtn_c, InvisibleWait); STATE_DEFINE(dLytMeterABtn_c, In); @@ -12,6 +16,18 @@ STATE_DEFINE(dLytMeterABtn_c, On); STATE_DEFINE(dLytMeterABtn_c, Active); STATE_DEFINE(dLytMeterABtn_c, 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 + +#define A_BTN_NUM_ANIMS 3 + void dLytMeterABtn_c::initializeState_InvisibleWait() {} void dLytMeterABtn_c::executeState_InvisibleWait() { if (field_0x1C8 == 0) { @@ -29,8 +45,8 @@ void dLytMeterABtn_c::finalizeState_InvisibleWait() {} void dLytMeterABtn_c::initializeState_In() { mpContainerAnmGroup1->setToStart(); mpContainerAnmGroup1->setAnimEnable(true); - mAnmGroups[0].setBackwardsOnce(); - mAnmGroups[0].setToStart(); + mAnm[A_BTN_ANIM_INPUT].setBackwardsOnce(); + mAnm[A_BTN_ANIM_INPUT].setToStart(); } void dLytMeterABtn_c::executeState_In() { if (mpContainerAnmGroup1->isEndReached()) { @@ -59,30 +75,72 @@ void dLytMeterABtn_c::executeState_Out() { void dLytMeterABtn_c::finalizeState_Out() {} void dLytMeterABtn_c::initializeState_Wait() {} -void dLytMeterABtn_c::executeState_Wait() {} +void dLytMeterABtn_c::executeState_Wait() { + if (field_0x1C9 == 0) { + return; + } + + if (field_0x1C0) { + if (field_0x1BC != LytDoButtonRelated::DO_NONE) { + mAnm[A_BTN_ANIM_INPUT].setBackwardsOnce(); + mAnm[A_BTN_ANIM_INPUT].setToStart(); + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(true); + mStateMgr.changeState(StateID_On); + setMessage(field_0x1BC); + } + field_0x1B8 = field_0x1BC; + } else { + if (field_0x1BC != LytDoButtonRelated::DO_NONE) { + setMessage(field_0x1BC); + } + field_0x1B8 = field_0x1BC; + } +} void dLytMeterABtn_c::finalizeState_Wait() {} void dLytMeterABtn_c::initializeState_On() {} -void dLytMeterABtn_c::executeState_On() {} +void dLytMeterABtn_c::executeState_On() { + if (mAnm[A_BTN_ANIM_INPUT].isStop2()) { + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} void dLytMeterABtn_c::finalizeState_On() {} void dLytMeterABtn_c::initializeState_Active() {} -void dLytMeterABtn_c::executeState_Active() {} +void dLytMeterABtn_c::executeState_Active() { + if (field_0x1BC != field_0x1B8 || !field_0x1C0) { + if (field_0x1BC == LytDoButtonRelated::DO_NONE || !field_0x1C0) { + mAnm[A_BTN_ANIM_INPUT].setForwardOnce(); + mAnm[A_BTN_ANIM_INPUT].setFrame(0.0f); + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(true); + if (field_0x1B8 != field_0x1C4) { + field_0x1BC = field_0x1C4; + } + mStateMgr.changeState(StateID_Off); + } else { + setMessage(field_0x1BC); + } + field_0x1B8 = field_0x1BC; + } else if (field_0x1B8 == LytDoButtonRelated::DO_NONE) { + mAnm[A_BTN_ANIM_INPUT].setForwardOnce(); + mAnm[A_BTN_ANIM_INPUT].setFrame(0.0f); + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(true); + mStateMgr.changeState(StateID_Off); + } +} void dLytMeterABtn_c::finalizeState_Active() {} void dLytMeterABtn_c::initializeState_Off() {} -void dLytMeterABtn_c::executeState_Off() {} +void dLytMeterABtn_c::executeState_Off() { + if (mAnm[A_BTN_ANIM_INPUT].isEndReached()) { + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + } +} 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 *sPane = "N_all_00"; static const char *sTextBoxes[] = { "T_aBtn_00", @@ -93,55 +151,204 @@ 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].bind(false); - mAnmGroups[i].setAnimEnable(false); + for (int i = 0; i < A_BTN_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[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 *sWindows[] = {"W_bg_P_00"}; + static const char *sWindows[] = {"W_bgP_00"}; for (int i = 0; i < 1; i++) { mpWindow[i] = mLyt.getWindow(sWindows[i]); mpSizeBox[i] = mLyt.getSizeBoxInWindow(sWindows[i]); } - field_0x1C4 = 0x5F; - field_0x1B8 = 0x5F; - field_0x1BC = 0x5F; + field_0x1C4 = LytDoButtonRelated::DO_DASH; + field_0x1B8 = LytDoButtonRelated::DO_DASH; + field_0x1BC = LytDoButtonRelated::DO_DASH; 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); + field_0x1C0 = true; + mOldTextState = false; + mpOwnerPane = nullptr; + mAnm[A_BTN_ANIM_TEXT].setAnimEnable(true); + setMessage(field_0x1B8); + mAnm[A_BTN_ANIM_TEXT].setFrame(0.0f); + mAnm[A_BTN_ANIM_INPUT].setToEnd(); + mAnm[A_BTN_ANIM_INPUT].setAnimEnable(true); + mAnm[A_BTN_ANIM_LOOP].setAnimEnable(true); mLyt.calc(); - mAnmGroups[A_BTN_ANIM_INPUT].setAnimEnable(false); + mAnm[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].remove(); + for (int i = 0; i < A_BTN_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); } return true; } -void dLytMeterABtn_c::fn_800E0870(u32) { - // TODO, just getting this function to spawn to figure out its signature - mpTextBoxes[0]->setMessageWithGlobalTextProcessor2("", nullptr); +extern "C" bool checkIsInSkykeepPuzzle(); + +bool dLytMeterABtn_c::execute() { + if (mpOwnerPane == nullptr) { + return true; + } + + if (!mpOwnerPane->IsVisible()) { + if (*mStateMgr.getStateID() == StateID_Off) { + mAnm[A_BTN_ANIM_INPUT].setToEnd2(); + } + if (LytDoButtonRelated::GetInstance() != nullptr) { + LytDoButtonRelated::GetInstance()->set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::DO_NONE); + } + return true; + } + + if (dLytMeterContainer_c::GetInstance()->getMeterField_0x13750() == 0) { + if (LytDoButtonRelated::GetInstance() != nullptr) { + LytDoButtonRelated::GetInstance()->set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::DO_NONE); + } + + if (field_0x1BC != LytDoButtonRelated::DO_NONE) { + field_0x1BC = LytDoButtonRelated::DO_NONE; + field_0x1B8 = LytDoButtonRelated::DO_NONE; + } + setMessage(field_0x1BC); + } + + bool state = false; + + if (EventManager::isInEvent() && !dLytMeterContainer_c::GetInstance()->fn_800D5670() && + dLytMeterContainer_c::GetMeter()->getField_0x1377E() == 0 && !checkIsInSkykeepPuzzle() && + LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_A) == LytDoButtonRelated::DO_NONE) { + field_0x1C9 = 0; + if (LytDoButtonRelated::GetInstance() != nullptr) { + LytDoButtonRelated::GetInstance()->set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::DO_NONE); + } + } else { + field_0x1C9 = 1; + } + + field_0x1CA = 1; + + // TODO + switch (dLytDobutton_c::getField0x480()) { + case 0x0: + case 0x7: + case 0xB: + case 0x15: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1F: + case 0x21: + case 0x22: + case 0x23: + case 0x27: + case 0x28: { + LytDoButtonRelated::Action_e action = LytDoButtonRelated::convertDoButton(dLytDobutton_c::getField0x47C()); + if (action >= 0) { + state = true; + if (LytDoButtonRelated::GetInstance() != nullptr) { + LytDoButtonRelated::GetInstance()->set(LytDoButtonRelated::DO_BUTTON_A, action); + } + } + field_0x1CA = 0; + break; + } + } + + field_0x1BC = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_A); + field_0x1C0 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_A); + + if (field_0x1BC == 0x76) { + state = true; + } else if (field_0x1BC == 0x57) { + state = false; + } + + mStateMgr.executeState(); + + if (mOldTextState != state) { + if (*mStateMgr.getStateID() != StateID_Off) { + if (state) { + mAnm[A_BTN_ANIM_TEXT].setFrame(1.0f); + } else { + mAnm[A_BTN_ANIM_TEXT].setFrame(0.0f); + } + mOldTextState = state; + } + } + + for (int i = 0; i < A_BTN_NUM_ANIMS; i++) { + if (i != 1 && mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + return true; +} + +// TODO +static const s32 sActIds[] = { + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, + 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, -1, 0x1, + 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +void dLytMeterABtn_c::setMessage(s32 id) { + char buf[11]; + for (int i = 0; i < 11; i++) { + buf[i] = 0; + } + + if (id < LytDoButtonRelated::DO_NONE) { + if (id < 0x5D) { + sprintf(buf, "ACT_INFO_%03d", sActIds[id]); + } else if (id == 0x5D) { + wchar_t b2[2]; + b2[0] = b2[1] = 0; + for (int i = 0; i < 2; i++) { + mpTextBoxes[i]->setTextWithGlobalTextProcessor(b2); + } + } else { + s32 id2 = id - 0x5E; + sprintf(buf, "ACT_ETC_%03d", sActIds[id2]); + } + + if (id != 0x5D) { + for (int i = 0; i < 2; i++) { + mpTextBoxes[i]->SetVisible(true); + mpTextBoxes[i]->setMessageWithGlobalTextProcessor2(buf, nullptr); + } + mpWindow[0]->SetVisible(true); + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); + } else { + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpWindow[0]->SetVisible(false); + } + field_0x1C4 = id; + } else { + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpWindow[0]->SetVisible(false); + } } diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index 56e86514..c6a31879 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -1971,15 +1971,8 @@ bool dLytMeterItemSelect_c::execute() { mStateMgr.changeState(StateID_Wait); } } - // TODO maybe an inline - s32 tmp; - if (dLytDobutton_c::GetInstance() != nullptr) { - tmp = dLytDobutton_c::GetInstance()->getField0x47C(); - } else { - tmp = 0x5E; - } - if (tmp == 0x28) { + if (dLytDobutton_c::getField0x47C() == 0x28) { if (field_0x5774 == 0) { SmallSoundManager::GetInstance()->playSound(SE_S_PARACHUTE_CALL); } @@ -2062,15 +2055,7 @@ bool dLytMeterItemSelect_c::execute() { mStateMgr.executeState(); fn_800EF8C0(false); - // TODO maybe an inline - s32 tmp; - if (dLytDobutton_c::GetInstance() != nullptr) { - tmp = dLytDobutton_c::GetInstance()->getField0x47C(); - } else { - tmp = 0x5E; - } - - if (tmp == 0x28) { + if (dLytDobutton_c::getField0x47C() == 0x28) { if (field_0x57C3 != 0) { field_0x57BB = 1; }