From 11eea560a1255a8f58ee440c12b1225bd1570b60 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 17 Apr 2025 16:59:28 +0200 Subject: [PATCH] d_lyt_meter_event_skip OK --- config/SOUE01/splits.txt | 4 + config/SOUE01/symbols.txt | 54 ++++---- configure.py | 2 +- include/d/lyt/meter/d_lyt_meter_event_skip.h | 18 ++- include/toBeSorted/event_manager.h | 1 + src/d/lyt/meter/d_lyt_meter_event_skip.cpp | 127 +++++++++++++++++++ 6 files changed, 172 insertions(+), 34 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index e0cb8ad1..8da0a0ef 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -437,7 +437,11 @@ d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp: d/lyt/meter/d_lyt_meter_event_skip.cpp: .text start:0x80105550 end:0x80105F68 .ctors start:0x804DB71C end:0x804DB720 + .rodata start:0x804E6A58 end:0x804E6A68 .data start:0x80519578 end:0x80519748 + .sdata start:0x80572500 end:0x80572510 + .sdata2 start:0x80579CF8 end:0x80579D00 + .bss start:0x805ACA90 end:0x805ACB90 d/lyt/meter/d_lyt_meter_timer.cpp: .text start:0x80105F70 end:0x8010AEB8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index e562266a..89c78c89 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3593,7 +3593,7 @@ findActorBySpecialName = .text:0x800A0880; // type:function size:0x10 getCurrentEventActorBasedOnGroup = .text:0x800A0890; // type:function size:0x58 fn_800A08F0__12EventManagerFQ27fBase_c12GROUP_TYPE_e = .text:0x800A08F0; // type:function size:0x58 checkButton2HeldForCutscenes = .text:0x800A0950; // type:function size:0x60 -fn_800A09B0 = .text:0x800A09B0; // type:function size:0x1D0 +canSkipCurrentEvent__12EventManagerFv = .text:0x800A09B0; // type:function size:0x1D0 fn_800A0B80 = .text:0x800A0B80; // type:function size:0x10 eventRelatedStateFlags_shift0x11_1 = .text:0x800A0B90; // type:function size:0x10 fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94 @@ -6316,23 +6316,23 @@ getPane__23dLytMeterGanbariGauge_cFv = .text:0x80104A70; // type:function size:0 __sinit_\d_lyt_meter_ganbari_gauge_cpp = .text:0x80104A80; // type:function size:0x9D4 scope:local __dt__38sFStateID_c<23dLytMeterGanbariGauge_c>Fv = .text:0x80105460; // type:function size:0x58 isSameName__38sFStateID_c<23dLytMeterGanbariGauge_c>CFPCc = .text:0x801054C0; // type:function size:0x88 -fn_80105550 = .text:0x80105550; // type:function size:0x4 -fn_80105560 = .text:0x80105560; // type:function size:0x114 -fn_80105680 = .text:0x80105680; // type:function size:0x4 -fn_80105690 = .text:0x80105690; // type:function size:0x4 -fn_801056A0 = .text:0x801056A0; // type:function size:0x74 -fn_80105720 = .text:0x80105720; // type:function size:0x4 -fn_80105730 = .text:0x80105730; // type:function size:0x4 -fn_80105740 = .text:0x80105740; // type:function size:0x84 -fn_801057D0 = .text:0x801057D0; // type:function size:0x4 -fn_801057E0 = .text:0x801057E0; // type:function size:0x4 -fn_801057F0 = .text:0x801057F0; // type:function size:0x68 -fn_80105860 = .text:0x80105860; // type:function size:0x4 +initializeState_Invisible__20dLytMeterEventSkip_cFv = .text:0x80105550; // type:function size:0x4 +executeState_Invisible__20dLytMeterEventSkip_cFv = .text:0x80105560; // type:function size:0x114 +finalizeState_Invisible__20dLytMeterEventSkip_cFv = .text:0x80105680; // type:function size:0x4 +initializeState_In__20dLytMeterEventSkip_cFv = .text:0x80105690; // type:function size:0x4 +executeState_In__20dLytMeterEventSkip_cFv = .text:0x801056A0; // type:function size:0x74 +finalizeState_In__20dLytMeterEventSkip_cFv = .text:0x80105720; // type:function size:0x4 +initializeState_Visible__20dLytMeterEventSkip_cFv = .text:0x80105730; // type:function size:0x4 +executeState_Visible__20dLytMeterEventSkip_cFv = .text:0x80105740; // type:function size:0x84 +finalizeState_Visible__20dLytMeterEventSkip_cFv = .text:0x801057D0; // type:function size:0x4 +initializeState_Out__20dLytMeterEventSkip_cFv = .text:0x801057E0; // type:function size:0x4 +executeState_Out__20dLytMeterEventSkip_cFv = .text:0x801057F0; // type:function size:0x68 +finalizeState_Out__20dLytMeterEventSkip_cFv = .text:0x80105860; // type:function size:0x4 build__20dLytMeterEventSkip_cFPQ23d2d10ResAccIf_c = .text:0x80105870; // type:function size:0x140 remove__20dLytMeterEventSkip_cFv = .text:0x801059B0; // type:function size:0x50 -fn_80105A00 = .text:0x80105A00; // type:function size:0xB4 +execute__20dLytMeterEventSkip_cFv = .text:0x80105A00; // type:function size:0xB4 draw__20dLytMeterEventSkip_cFv = .text:0x80105AC0; // type:function size:0x34 -fn_80105B00 = .text:0x80105B00; // type:function size:0x40 +shouldPromptForSkip__20dLytMeterEventSkip_cCFv = .text:0x80105B00; // type:function size:0x40 __sinit_\d_lyt_meter_event_skip_cpp = .text:0x80105B40; // type:function size:0x338 scope:local __dt__35sFStateID_c<20dLytMeterEventSkip_c>Fv = .text:0x80105E80; // type:function size:0x58 isSameName__35sFStateID_c<20dLytMeterEventSkip_c>CFPCc = .text:0x80105EE0; // type:function size:0x88 @@ -31732,13 +31732,13 @@ lbl_805190E8 = .data:0x805190E8; // type:object size:0x18 data:string lbl_80519100 = .data:0x80519100; // type:object size:0xE data:string __vt__23dLytMeterGanbariGauge_c = .data:0x80519110; // type:object size:0x34 __vt__38sFStateID_c<23dLytMeterGanbariGauge_c> = .data:0x80519540; // type:object size:0x34 -lbl_80519578 = .data:0x80519578; // type:object size:0x14 -lbl_8051958C = .data:0x8051958C; // type:object size:0xC -lbl_80519598 = .data:0x80519598; // type:object size:0x14 -lbl_805195AC = .data:0x805195AC; // type:object size:0x10 -lbl_805195BC = .data:0x805195BC; // type:object size:0x10 -lbl_805195CC = .data:0x805195CC; // type:object size:0x10 -lbl_805195DC = .data:0x805195DC; // type:object size:0x134 +lbl_80519578 = .data:0x80519578; // type:object size:0x11 data:string +lbl_8051958C = .data:0x8051958C; // type:object size:0xB data:string +lbl_80519598 = .data:0x80519598; // type:object size:0x12 data:string +lbl_805195AC = .data:0x805195AC; // type:object size:0xE data:string +lbl_805195BC = .data:0x805195BC; // type:object size:0xF data:string +lbl_805195CC = .data:0x805195CC; // type:object size:0xE data:string +lbl_805195DC = .data:0x805195DC; // type:object size:0x9 data:string __vt__35sFStateID_c<20dLytMeterEventSkip_c> = .data:0x80519710; // type:object size:0x34 lbl_80519748 = .data:0x80519748; // type:object size:0x14 lbl_8051975C = .data:0x8051975C; // type:object size:0xC @@ -38177,7 +38177,7 @@ lbl_805724E8 = .sdata:0x805724E8; // type:object size:0x4 data:4byte lbl_805724F0 = .sdata:0x805724F0; // type:object size:0x5 data:string lbl_805724F8 = .sdata:0x805724F8; // type:object size:0x6 data:string lbl_80572500 = .sdata:0x80572500; // type:object size:0x8 data:4byte -lbl_80572508 = .sdata:0x80572508; // type:object size:0x8 +lbl_80572508 = .sdata:0x80572508; // type:object size:0x5 data:string lbl_80572510 = .sdata:0x80572510; // type:object size:0x8 data:4byte lbl_80572518 = .sdata:0x80572518; // type:object size:0x5 data:string lbl_80572520 = .sdata:0x80572520; // type:object size:0x8 data:string @@ -48782,10 +48782,10 @@ LytMeterGanbariGauge__STATE_CAUTION = .bss:0x805AC9A0; // type:object size:0x30 LytMeterGanbariGauge__STATE_TO_MIN = .bss:0x805AC9E0; // type:object size:0x30 data:4byte lbl_805ACA20 = .bss:0x805ACA20; // type:object size:0x30 data:4byte LytMeterGanbariGauge__STATE_TO_MAX = .bss:0x805ACA60; // type:object size:0x30 data:4byte -lbl_805ACA90 = .bss:0x805ACA90; // type:object size:0x10 -LytMeterEventSkip__STATE_INVISIBLE = .bss:0x805ACAA0; // type:object size:0x40 data:4byte -LytMeterEventSkip__STATE_IN = .bss:0x805ACAE0; // type:object size:0x40 data:4byte -LytMeterEventSkip__STATE_VISIBLE = .bss:0x805ACB20; // type:object size:0x40 data:4byte +lbl_805ACA90 = .bss:0x805ACA90; // type:object size:0xC +LytMeterEventSkip__STATE_INVISIBLE = .bss:0x805ACAA0; // type:object size:0x30 data:4byte +LytMeterEventSkip__STATE_IN = .bss:0x805ACAE0; // type:object size:0x30 data:4byte +LytMeterEventSkip__STATE_VISIBLE = .bss:0x805ACB20; // type:object size:0x30 data:4byte LytMeterEventSkip__STATE_OUT = .bss:0x805ACB60; // type:object size:0x30 data:4byte lbl_805ACB90 = .bss:0x805ACB90; // type:object size:0x50 LytMeterTimer__STATE_SIREN = .bss:0x805ACBE0; // type:object size:0x80 data:4byte diff --git a/configure.py b/configure.py index 3f1e09d4..25c0f43b 100644 --- a/configure.py +++ b/configure.py @@ -400,7 +400,7 @@ config.libs = [ Object(Matching, "d/lyt/meter/d_lyt_meter_dowsing.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_rupy.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp"), - Object(NonMatching, "d/lyt/meter/d_lyt_meter_event_skip.cpp"), + Object(Matching, "d/lyt/meter/d_lyt_meter_event_skip.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_timer.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_heart.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_shield_gauge.cpp"), diff --git a/include/d/lyt/meter/d_lyt_meter_event_skip.h b/include/d/lyt/meter/d_lyt_meter_event_skip.h index 464fd068..0f6d7119 100644 --- a/include/d/lyt/meter/d_lyt_meter_event_skip.h +++ b/include/d/lyt/meter/d_lyt_meter_event_skip.h @@ -2,28 +2,34 @@ #define D_LYT_METER_EVENT_SKIP_H #include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" -// size 0x164 class dLytMeterEventSkip_c { public: dLytMeterEventSkip_c() : mStateMgr(*this, sStateID::null) {} virtual ~dLytMeterEventSkip_c() {} bool build(d2d::ResAccIf_c *resAcc); bool remove(); + bool execute(); bool draw(); private: + bool shouldPromptForSkip() const; + STATE_FUNC_DECLARE(dLytMeterEventSkip_c, Invisible); STATE_FUNC_DECLARE(dLytMeterEventSkip_c, In); STATE_FUNC_DECLARE(dLytMeterEventSkip_c, Visible); STATE_FUNC_DECLARE(dLytMeterEventSkip_c, Out); - UI_STATE_MGR_DECLARE(dLytMeterEventSkip_c); - d2d::LytBase_c mLyt; - /* 0x0D0 */ d2d::AnmGroup_c mAnmGroups[2]; - /* 0x150 */ u8 field_0x150[0x164 - 0x150]; + /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMeterEventSkip_c); + /* 0x03C */ d2d::LytBase_c mLyt; + /* 0x0D0 */ d2d::AnmGroup_c mAnm[2]; + /* 0x150 */ dTextBox_c *mpTextBoxes[2]; + /* 0x158 */ dWindow_c *mpWindow; + /* 0x15C */ dTextBox_c *mpSizeBox; + /* 0x160 */ bool mVisible; }; #endif diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 9c524aec..f921ab2b 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -17,6 +17,7 @@ public: static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD); static bool alsoSetAsCurrentEvent(dAcBase_c *actor, Event *event, void *unknown); static dAcObjBase_c *fn_800A08F0(fBase_c::GROUP_TYPE_e); + static bool canSkipCurrentEvent(); static EventManager *sInstance; diff --git a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp index 27cc4ae4..38a8c778 100644 --- a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp +++ b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp @@ -1,6 +1,133 @@ #include "d/lyt/meter/d_lyt_meter_event_skip.h" +#include "d/d_sc_game.h" +#include "d/lyt/d2d.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "toBeSorted/event_manager.h" + STATE_DEFINE(dLytMeterEventSkip_c, Invisible); STATE_DEFINE(dLytMeterEventSkip_c, In); STATE_DEFINE(dLytMeterEventSkip_c, Visible); STATE_DEFINE(dLytMeterEventSkip_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "skip_00_in.brlan", "G_inOut_00"}, + {"skip_00_out.brlan", "G_inOut_00"}, +}; + +#define SKIP_ANIM_IN 0 +#define SKIP_ANIM_OUT 1 + +#define SKIP_NUM_ANIMS 2 + +void dLytMeterEventSkip_c::initializeState_Invisible() {} +void dLytMeterEventSkip_c::executeState_Invisible() { + if (shouldPromptForSkip() || dLytMeterContainer_c::GetInstance()->getMeterField_0x13774()) { + if (dLytMeterContainer_c::GetInstance()->getMeterField_0x13774()) { + for (int i = 0; i < 2; i++) { + mLyt.fn_800AB9A0(mpTextBoxes[i], 1); + } + } else { + for (int i = 0; i < 2; i++) { + mLyt.fn_800AB9A0(mpTextBoxes[i], 0); + } + } + + mpWindow->UpdateSize(mpSizeBox, 32.0f); + mVisible = true; + mAnm[SKIP_ANIM_IN].setAnimEnable(true); + mAnm[SKIP_ANIM_IN].setFrame(0.0f); + mStateMgr.changeState(StateID_In); + } +} +void dLytMeterEventSkip_c::finalizeState_Invisible() {} + +void dLytMeterEventSkip_c::initializeState_In() {} +void dLytMeterEventSkip_c::executeState_In() { + if (mAnm[SKIP_ANIM_IN].isStop2()) { + mLyt.calc(); // ??? + mAnm[SKIP_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_Visible); + } +} +void dLytMeterEventSkip_c::finalizeState_In() {} + +void dLytMeterEventSkip_c::initializeState_Visible() {} +void dLytMeterEventSkip_c::executeState_Visible() { + if (!shouldPromptForSkip() && !dLytMeterContainer_c::GetInstance()->getMeterField_0x13774()) { + mAnm[SKIP_ANIM_OUT].setAnimEnable(true); + mAnm[SKIP_ANIM_OUT].setFrame(0.0f); + mStateMgr.changeState(StateID_Out); + } +} +void dLytMeterEventSkip_c::finalizeState_Visible() {} + +void dLytMeterEventSkip_c::initializeState_Out() {} +void dLytMeterEventSkip_c::executeState_Out() { + if (mAnm[SKIP_ANIM_OUT].isStop2()) { + mAnm[SKIP_ANIM_OUT].setAnimEnable(false); + mVisible = false; + mStateMgr.changeState(StateID_Invisible); + } +} +void dLytMeterEventSkip_c::finalizeState_Out() {} + +static const char *sTextBoxes[] = { + "T_skipText_00", + "T_skipTextS_00", +}; + +bool dLytMeterEventSkip_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("skip_00.brlyt", nullptr); + + for (int i = 0; i < SKIP_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 < 2; i++) { + mpTextBoxes[i] = mLyt.getTextBox(sTextBoxes[i]); + } + + mpWindow = mLyt.getWindow("W_bgP_00"); + mpSizeBox = mLyt.getSizeBoxInWindow("W_bgP_00"); + mpWindow->UpdateSize(mpSizeBox, 32.0f); + mLyt.setPriority(0x8A); + mVisible = false; + mStateMgr.changeState(StateID_Invisible); + + return true; +} + +bool dLytMeterEventSkip_c::remove() { + for (int i = 0; i < 2; i++) { + mAnm[i].remove(); + } + return true; +} + +bool dLytMeterEventSkip_c::execute() { + mStateMgr.executeState(); + if (mVisible) { + for (int i = 0; i < 2; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + } + return true; +} + +bool dLytMeterEventSkip_c::draw() { + if (mVisible) { + mLyt.addToDrawList(); + } + return true; +} + +bool dLytMeterEventSkip_c::shouldPromptForSkip() const { + return dScGame_c::currentSpawnInfo.stageName == "Demo" ? false : EventManager::canSkipCurrentEvent(); +}