From 27c8a5dac5f9d2299be461649fa344a955c298bf Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 12 Apr 2025 23:53:55 +0200 Subject: [PATCH] d_lyt_meter_cross_btn OK --- config/SOUE01/splits.txt | 4 + config/SOUE01/symbols.txt | 138 ++--- configure.py | 2 +- include/d/a/d_a_player.h | 7 + include/d/d_message.h | 8 +- include/d/lyt/d_lyt_unknowns.h | 8 + include/d/lyt/meter/d_lyt_meter.h | 2 +- include/d/lyt/meter/d_lyt_meter_cross_btn.h | 82 ++- include/d/lyt/meter/d_lyt_meter_minus_btn.h | 2 +- include/d/lyt/meter/d_lyt_meter_plus_btn.h | 4 +- include/s/s_State.hpp | 2 +- src/d/lyt/meter/d_lyt_meter_cross_btn.cpp | 566 ++++++++++++++++++++ src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp | 2 +- 13 files changed, 738 insertions(+), 89 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index d1acb77e..b8695096 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -400,7 +400,11 @@ d/lyt/meter/d_lyt_meter_minus_btn.cpp: d/lyt/meter/d_lyt_meter_cross_btn.cpp: .text start:0x800F8DA0 end:0x800FAFC8 .ctors start:0x804DB70C end:0x804DB710 + .rodata start:0x804E62A8 end:0x804E6568 .data start:0x80517818 end:0x80517CE0 + .sdata start:0x80572480 end:0x805724A8 + .sdata2 start:0x80579C18 end:0x80579C38 + .bss start:0x805ABC90 end:0x805ABE90 d/lyt/meter/d_lyt_meter_dowsing.cpp: .text start:0x800FAFD0 end:0x801003E8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 6cf4547e..499d9650 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -6051,41 +6051,41 @@ isSameName__34sFStateID_c<19dLytMeterMinusBtn_c>CFPCc = .text:0x800F8B60; // typ isSameName__38sFStateID_c<23dLytMeterMinusBtnText_c>CFPCc = .text:0x800F8BF0; // type:function size:0x88 isSameName__39sFStateID_c<24dLytMeterMinusBtnBlink_c>CFPCc = .text:0x800F8C80; // type:function size:0x88 isSameName__42sFStateID_c<27dLytMeterMinusBtnMenuIcon_c>CFPCc = .text:0x800F8D10; // type:function size:0x88 -fn_800F8DA0 = .text:0x800F8DA0; // type:function size:0xC -fn_800F8DB0 = .text:0x800F8DB0; // type:function size:0x138 -fn_800F8EF0 = .text:0x800F8EF0; // type:function size:0x4 -fn_800F8F00 = .text:0x800F8F00; // type:function size:0x70 -fn_800F8F70 = .text:0x800F8F70; // type:function size:0x64 -fn_800F8FE0 = .text:0x800F8FE0; // type:function size:0x4 -fn_800F8FF0 = .text:0x800F8FF0; // type:function size:0x4 -fn_800F9000 = .text:0x800F9000; // type:function size:0xE8 -fn_800F90F0 = .text:0x800F90F0; // type:function size:0x4 -fn_800F9100 = .text:0x800F9100; // type:function size:0x70 -fn_800F9170 = .text:0x800F9170; // type:function size:0x64 -fn_800F91E0 = .text:0x800F91E0; // type:function size:0x4 -fn_800F91F0 = .text:0x800F91F0; // type:function size:0x80 -fn_800F9270 = .text:0x800F9270; // type:function size:0x4C8 -fn_800F9740 = .text:0x800F9740; // type:function size:0x508 -fn_800F9C50 = .text:0x800F9C50; // type:function size:0x4 -fn_800F9C60 = .text:0x800F9C60; // type:function size:0x4 -fn_800F9C70 = .text:0x800F9C70; // type:function size:0x4 -fn_800F9C80 = .text:0x800F9C80; // type:function size:0x60 -fn_800F9CE0 = .text:0x800F9CE0; // type:function size:0x70 -fn_800F9D50 = .text:0x800F9D50; // type:function size:0xC -fn_800F9D60 = .text:0x800F9D60; // type:function size:0x60 -fn_800F9DC0 = .text:0x800F9DC0; // type:function size:0x70 -fn_800F9E30 = .text:0x800F9E30; // type:function size:0xC -fn_800F9E40 = .text:0x800F9E40; // type:function size:0x4 -fn_800F9E50 = .text:0x800F9E50; // type:function size:0x34 -fn_800F9E90 = .text:0x800F9E90; // type:function size:0x4 -fn_800F9EA0 = .text:0x800F9EA0; // type:function size:0x358 -fn_800FA200 = .text:0x800FA200; // type:function size:0x58 -fn_800FA260 = .text:0x800FA260; // type:function size:0x4AC -fn_800FA710 = .text:0x800FA710; // type:function size:0x18 -fn_800FA730 = .text:0x800FA730; // type:function size:0x48 -fn_800FA780 = .text:0x800FA780; // type:function size:0x8 -fn_800FA790 = .text:0x800FA790; // type:function size:0x8 -fn_800FA7A0 = .text:0x800FA7A0; // type:function size:0x8 +initializeState_Wait__24dLytMeterCrossBtnParts_cFv = .text:0x800F8DA0; // type:function size:0xC +executeState_Wait__24dLytMeterCrossBtnParts_cFv = .text:0x800F8DB0; // type:function size:0x138 +finalizeState_Wait__24dLytMeterCrossBtnParts_cFv = .text:0x800F8EF0; // type:function size:0x4 +initializeState_On__24dLytMeterCrossBtnParts_cFv = .text:0x800F8F00; // type:function size:0x70 +executeState_On__24dLytMeterCrossBtnParts_cFv = .text:0x800F8F70; // type:function size:0x64 +finalizeState_On__24dLytMeterCrossBtnParts_cFv = .text:0x800F8FE0; // type:function size:0x4 +initializeState_Active__24dLytMeterCrossBtnParts_cFv = .text:0x800F8FF0; // type:function size:0x4 +executeState_Active__24dLytMeterCrossBtnParts_cFv = .text:0x800F9000; // type:function size:0xE8 +finalizeState_Active__24dLytMeterCrossBtnParts_cFv = .text:0x800F90F0; // type:function size:0x4 +initializeState_Off__24dLytMeterCrossBtnParts_cFv = .text:0x800F9100; // type:function size:0x70 +executeState_Off__24dLytMeterCrossBtnParts_cFv = .text:0x800F9170; // type:function size:0x64 +finalizeState_Off__24dLytMeterCrossBtnParts_cFv = .text:0x800F91E0; // type:function size:0x4 +init__24dLytMeterCrossBtnParts_cFv = .text:0x800F91F0; // type:function size:0x80 +execute__24dLytMeterCrossBtnParts_cFb = .text:0x800F9270; // type:function size:0x4C8 +setMessage__24dLytMeterCrossBtnParts_cFl = .text:0x800F9740; // type:function size:0x508 +initializeState_Wait__19dLytMeterCrossBtn_cFv = .text:0x800F9C50; // type:function size:0x4 +executeState_Wait__19dLytMeterCrossBtn_cFv = .text:0x800F9C60; // type:function size:0x4 +finalizeState_Wait__19dLytMeterCrossBtn_cFv = .text:0x800F9C70; // type:function size:0x4 +initializeState_ToUse__19dLytMeterCrossBtn_cFv = .text:0x800F9C80; // type:function size:0x60 +executeState_ToUse__19dLytMeterCrossBtn_cFv = .text:0x800F9CE0; // type:function size:0x70 +finalizeState_ToUse__19dLytMeterCrossBtn_cFv = .text:0x800F9D50; // type:function size:0xC +initializeState_ToUnuse__19dLytMeterCrossBtn_cFv = .text:0x800F9D60; // type:function size:0x60 +executeState_ToUnuse__19dLytMeterCrossBtn_cFv = .text:0x800F9DC0; // type:function size:0x70 +finalizeState_ToUnuse__19dLytMeterCrossBtn_cFv = .text:0x800F9E30; // type:function size:0xC +initializeState_Unuse__19dLytMeterCrossBtn_cFv = .text:0x800F9E40; // type:function size:0x4 +executeState_Unuse__19dLytMeterCrossBtn_cFv = .text:0x800F9E50; // type:function size:0x34 +finalizeState_Unuse__19dLytMeterCrossBtn_cFv = .text:0x800F9E90; // type:function size:0x4 +build__19dLytMeterCrossBtn_cFPQ23d2d10ResAccIf_c = .text:0x800F9EA0; // type:function size:0x358 +remove__19dLytMeterCrossBtn_cFv = .text:0x800FA200; // type:function size:0x58 +execute__19dLytMeterCrossBtn_cFv = .text:0x800FA260; // type:function size:0x4AC +setOwnerPane__19dLytMeterCrossBtn_cFPQ34nw4r3lyt4Pane = .text:0x800FA710; // type:function size:0x18 +fn_800FA730__19dLytMeterCrossBtn_cCFv = .text:0x800FA730; // type:function size:0x48 +getName__19dLytMeterCrossBtn_cCFv = .text:0x800FA780; // type:function size:0x8 +getLyt__19dLytMeterCrossBtn_cFv = .text:0x800FA790; // type:function size:0x8 +getPane__19dLytMeterCrossBtn_cFv = .text:0x800FA7A0; // type:function size:0x8 __sinit_\d_lyt_meter_cross_btn_cpp = .text:0x800FA7B0; // type:function size:0x634 scope:local __dt__39sFStateID_c<24dLytMeterCrossBtnParts_c>Fv = .text:0x800FADF0; // type:function size:0x58 __dt__34sFStateID_c<19dLytMeterCrossBtn_c>Fv = .text:0x800FAE50; // type:function size:0x58 @@ -6543,8 +6543,8 @@ fn_8010EB30 = .text:0x8010EB30; // type:function size:0x40 __ct__18LytDoButtonRelatedFv = .text:0x8010EB70; // type:function size:0x14 build__18LytDoButtonRelatedFPQ23d2d10ResAccIf_c = .text:0x8010EB90; // type:function size:0x70 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_8010EC10__18LytDoButtonRelatedFQ218LytDoButtonRelated8Action_eb = .text:0x8010EC10; // type:function size:0x134 +fn_8010ED50__18LytDoButtonRelatedFQ218LytDoButtonRelated8Action_eb = .text:0x8010ED50; // type:function size:0x110 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 @@ -31576,34 +31576,34 @@ __vt__38sFStateID_c<23dLytMeterMinusBtnText_c> = .data:0x80517748; // type:objec __vt__39sFStateID_c<24dLytMeterMinusBtnBlink_c> = .data:0x8051777C; // type:object size:0x34 __vt__42sFStateID_c<27dLytMeterMinusBtnMenuIcon_c> = .data:0x805177B0; // type:object size:0x34 __vt__34sFStateID_c<19dLytMeterMinusBtn_c> = .data:0x805177E4; // type:object size:0x34 -lbl_80517818 = .data:0x80517818; // type:object size:0x10 -lbl_80517828 = .data:0x80517828; // type:object size:0x10 -lbl_80517838 = .data:0x80517838; // type:object size:0x1C +lbl_80517818 = .data:0x80517818; // type:object size:0xE data:string +lbl_80517828 = .data:0x80517828; // type:object size:0xD data:string +lbl_80517838 = .data:0x80517838; // type:object size:0x1A data:string lbl_80517854 = .data:0x80517854; // type:object size:0xC data:string lbl_80517860 = .data:0x80517860; // type:object size:0xC data:string lbl_8051786C = .data:0x8051786C; // type:object size:0xC data:string lbl_80517878 = .data:0x80517878; // type:object size:0xC data:string lbl_80517884 = .data:0x80517884; // type:object size:0x1C data:string -lbl_805178A0 = .data:0x805178A0; // type:object size:0x1C -lbl_805178BC = .data:0x805178BC; // type:object size:0xC -lbl_805178C8 = .data:0x805178C8; // type:object size:0xC -lbl_805178D4 = .data:0x805178D4; // type:object size:0xC -lbl_805178E0 = .data:0x805178E0; // type:object size:0x1C -lbl_805178FC = .data:0x805178FC; // type:object size:0xC -lbl_80517908 = .data:0x80517908; // type:object size:0xC -lbl_80517914 = .data:0x80517914; // type:object size:0xC -lbl_80517920 = .data:0x80517920; // type:object size:0xC -lbl_8051792C = .data:0x8051792C; // type:object size:0xC -lbl_80517938 = .data:0x80517938; // type:object size:0xC +lbl_805178A0 = .data:0x805178A0; // type:object size:0x19 data:string +lbl_805178BC = .data:0x805178BC; // type:object size:0xA data:string +lbl_805178C8 = .data:0x805178C8; // type:object size:0xA data:string +lbl_805178D4 = .data:0x805178D4; // type:object size:0xA data:string +lbl_805178E0 = .data:0x805178E0; // type:object size:0x19 data:string +lbl_805178FC = .data:0x805178FC; // type:object size:0xA data:string +lbl_80517908 = .data:0x80517908; // type:object size:0x9 data:string +lbl_80517914 = .data:0x80517914; // type:object size:0xB data:string +lbl_80517920 = .data:0x80517920; // type:object size:0xB data:string +lbl_8051792C = .data:0x8051792C; // type:object size:0xB data:string +lbl_80517938 = .data:0x80517938; // type:object size:0xB data:string lbl_80517944 = .data:0x80517944; // type:object size:0xC data:string lbl_80517950 = .data:0x80517950; // type:object size:0xC data:string lbl_8051795C = .data:0x8051795C; // type:object size:0xC data:string -lbl_80517968 = .data:0x80517968; // type:object size:0x30 -lbl_80517998 = .data:0x80517998; // type:object size:0xC -lbl_805179A4 = .data:0x805179A4; // type:object size:0xC -lbl_805179B0 = .data:0x805179B0; // type:object size:0xC -lbl_805179BC = .data:0x805179BC; // type:object size:0x30 -__vt__19dLytMeterCrossBtn_c = .data:0x805179EC; // type:object size:0x28C +lbl_80517968 = .data:0x80517968; // type:object size:0xC data:string +lbl_80517998 = .data:0x80517998; // type:object size:0x9 data:string +lbl_805179A4 = .data:0x805179A4; // type:object size:0x9 data:string +lbl_805179B0 = .data:0x805179B0; // type:object size:0x9 data:string +lbl_805179BC = .data:0x805179BC; // type:object size:0x9 data:string +__vt__19dLytMeterCrossBtn_c = .data:0x805179EC; // type:object size:0x34 __vt__34sFStateID_c<19dLytMeterCrossBtn_c> = .data:0x80517C78; // type:object size:0x34 __vt__39sFStateID_c<24dLytMeterCrossBtnParts_c> = .data:0x80517CAC; // type:object size:0x34 lbl_80517CE0 = .data:0x80517CE0; // type:object size:0x10 @@ -38160,11 +38160,11 @@ lbl_80572468 = .sdata:0x80572468; // type:object size:0x8 data:4byte lbl_80572470 = .sdata:0x80572470; // type:object size:0x4 data:4byte lbl_80572474 = .sdata:0x80572474; // type:object size:0x4 data:4byte lbl_80572478 = .sdata:0x80572478; // type:object size:0x4 data:4byte -lbl_80572480 = .sdata:0x80572480; // type:object size:0x8 -lbl_80572488 = .sdata:0x80572488; // type:object size:0x8 -lbl_80572490 = .sdata:0x80572490; // type:object size:0x8 -lbl_80572498 = .sdata:0x80572498; // type:object size:0x8 -lbl_805724A0 = .sdata:0x805724A0; // type:object size:0x8 data:4byte +lbl_80572480 = .sdata:0x80572480; // type:object size:0x7 data:string +lbl_80572488 = .sdata:0x80572488; // type:object size:0x7 data:string +lbl_80572490 = .sdata:0x80572490; // type:object size:0x7 data:string +lbl_80572498 = .sdata:0x80572498; // type:object size:0x7 data:string +lbl_805724A0 = .sdata:0x805724A0; // type:object size:0x4 data:4byte lbl_805724A8 = .sdata:0x805724A8; // type:object size:0x8 lbl_805724B0 = .sdata:0x805724B0; // type:object size:0x8 lbl_805724B8 = .sdata:0x805724B8; // type:object size:0x8 @@ -48729,13 +48729,13 @@ LtyMeterMinusBtn__STATE_MENU_SELECTING = .bss:0x805ABAE0; // type:object size:0x LtyMeterMinusBtn__STATE_MENU_SELECTING_OUT = .bss:0x805ABB20; // type:object size:0x30 data:4byte LtyMeterMinusBtn__STATE_UNUSE = .bss:0x805ABBE0; // type:object size:0x30 data:4byte LtyMeterMinusBtn__STATE_DEMO_OUT = .bss:0x805ABC60; // type:object size:0x30 data:4byte -lbl_805ABC90 = .bss:0x805ABC90; // type:object size:0x10 -LytMeterCrossBtnParts__STATE_WAIT = .bss:0x805ABCA0; // type:object size:0x40 data:4byte -LytMeterCrossBtnParts__STATE_ON = .bss:0x805ABCE0; // type:object size:0x40 data:4byte -LytMeterCrossBtnParts__STATE_ACTIVE = .bss:0x805ABD20; // type:object size:0x40 data:4byte -LytMeterCrossBtnParts__STATE_OFF = .bss:0x805ABD60; // type:object size:0x40 data:4byte -LytMeterCrossBtn__STATE_WAIT = .bss:0x805ABDA0; // type:object size:0x40 data:4byte -LytMeterCrossBtn__STATE_TO_USE = .bss:0x805ABDE0; // type:object size:0x80 data:4byte +lbl_805ABC90 = .bss:0x805ABC90; // type:object size:0xC +LytMeterCrossBtnParts__STATE_WAIT = .bss:0x805ABCA0; // type:object size:0x30 data:4byte +LytMeterCrossBtnParts__STATE_ON = .bss:0x805ABCE0; // type:object size:0x30 data:4byte +LytMeterCrossBtnParts__STATE_ACTIVE = .bss:0x805ABD20; // type:object size:0x30 data:4byte +LytMeterCrossBtnParts__STATE_OFF = .bss:0x805ABD60; // type:object size:0x30 data:4byte +LytMeterCrossBtn__STATE_WAIT = .bss:0x805ABDA0; // type:object size:0x30 data:4byte +LytMeterCrossBtn__STATE_TO_USE = .bss:0x805ABDE0; // type:object size:0x30 data:4byte LytMeterCrossBtn__STATE_UNUSE = .bss:0x805ABE60; // type:object size:0x30 data:4byte lbl_805ABE90 = .bss:0x805ABE90; // type:object size:0x10 LytMeterDowsingMenuIcon__STATE_WAIT = .bss:0x805ABEA0; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index ae955acd..3b0cbd72 100644 --- a/configure.py +++ b/configure.py @@ -396,7 +396,7 @@ config.libs = [ Object(Matching, "d/lyt/meter/d_lyt_meter_item_select.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_plus_btn.cpp"), Object(Matching, "d/lyt/meter/d_lyt_meter_minus_btn.cpp"), - Object(NonMatching, "d/lyt/meter/d_lyt_meter_cross_btn.cpp"), + Object(Matching, "d/lyt/meter/d_lyt_meter_cross_btn.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_dowsing.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_rupy.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp"), diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index d3b88a9b..2adfe26a 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -5,6 +5,7 @@ #include "d/a/d_a_base.h" #include "d/a/d_a_itembase.h" #include "d/a/obj/d_a_obj_base.h" +#include "m/m3d/m_anmmatclr.h" #include "m/m_allocator.h" #include "m/m_angle.h" #include "m/m_mtx.h" @@ -248,6 +249,12 @@ public: /* 0x36C */ int mCurrentAction; // TODO (Document Enum) /* 0x370 */ u8 _370[0x3C8 - 0x370]; /* 0x3C8 */ nw4r::g3d::ResFile mSwordRes; + /* 0x3CC */ u8 _0x3CC[0x5B4 - 0x3CC]; + /* 0x5B4 */ m3d::anmMatClr_c mAnmMatClr; + + f32 getAnmMatClrFrame() const { + return mAnmMatClr.getFrame(0); + } inline bool checkFlags0x340(u32 mask) const { return (someFlags_0x340 & mask) != 0; diff --git a/include/d/d_message.h b/include/d/d_message.h index cd075bb0..b7ec7bc4 100644 --- a/include/d/d_message.h +++ b/include/d/d_message.h @@ -36,6 +36,10 @@ public: return field_0x329; } + s32 getField_0x32C() const { + return field_0x32C; + } + void setField_0x329(bool v) { field_0x329 = v; } @@ -107,7 +111,9 @@ private: /* 0x329 */ bool field_0x329; /* 0x32A */ bool field_0x32A; - /* 0x32B */ u8 _0x32B[0x334 - 0x32B]; + /* 0x32B */ u8 field_0x32B; + /* 0x32C */ s32 field_0x32C; + /* 0x330 */ u8 _0x330[0x334 - 0x330]; /* 0x334 */ u32 mMinigameResultPoints; /* 0x338 */ u32 mMinigameTime; diff --git a/include/d/lyt/d_lyt_unknowns.h b/include/d/lyt/d_lyt_unknowns.h index 11c3bb90..7763b4e5 100644 --- a/include/d/lyt/d_lyt_unknowns.h +++ b/include/d/lyt/d_lyt_unknowns.h @@ -36,6 +36,11 @@ public: DO_BUTTON_REMOCON_BG = 5, DO_BUTTON_NUN_BG = 6, + DO_BUTTON_CROSS_T = 7, + DO_BUTTON_CROSS_D = 8, + DO_BUTTON_CROSS_L = 9, + DO_BUTTON_CROSS_R = 10, + DO_BUTTON_PLUS = 11, }; @@ -73,6 +78,9 @@ public: } static Action_e convertDoButton(s32); + + static void fn_8010EC10(Action_e, bool); + static void fn_8010ED50(Action_e, bool); private: diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index dadff933..4a68fb4a 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -188,7 +188,7 @@ public: } } - static bool getItemSelect0x75B2() { + static bool getItemSelect0x75A2() { if (sInstance != nullptr) { return sInstance->mMeter.mItemSelect.getField_0x57A2(); } else { diff --git a/include/d/lyt/meter/d_lyt_meter_cross_btn.h b/include/d/lyt/meter/d_lyt_meter_cross_btn.h index f12c5f3a..571de597 100644 --- a/include/d/lyt/meter/d_lyt_meter_cross_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_cross_btn.h @@ -2,23 +2,53 @@ #define D_LYT_METER_CROSS_BTN_H #include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" // Size 0x80 class dLytMeterCrossBtnParts_c { + friend class dLytMeterCrossBtn_c; + public: - dLytMeterCrossBtnParts_c(): mStateMgr(*this, sStateID::null) {} + dLytMeterCrossBtnParts_c() : mStateMgr(*this, sStateID::null) {} ~dLytMeterCrossBtnParts_c() {} + + void init(); + void execute(bool bIsVisible); + + bool isActive() const { + return *mStateMgr.getStateID() == StateID_Active; + } + private: + void setMessage(s32 id); + STATE_FUNC_DECLARE(dLytMeterCrossBtnParts_c, Wait); STATE_FUNC_DECLARE(dLytMeterCrossBtnParts_c, On); STATE_FUNC_DECLARE(dLytMeterCrossBtnParts_c, Active); STATE_FUNC_DECLARE(dLytMeterCrossBtnParts_c, Off); - + + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterCrossBtnParts_c); + /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMeterCrossBtnParts_c); - /* 0x3C */ u32 padding[17]; + /* 0x3C */ d2d::LytBase_c *mpLyt; + /* 0x40 */ d2d::AnmGroup_c *mpAnm[2]; + /* 0x48 */ dTextBox_c *mpTextBoxes[2]; + /* 0x50 */ dWindow_c *mpWindow; + /* 0x54 */ dTextBox_c *mpSizeBox; + /* 0x58 */ nw4r::lyt::Pane *mpOwnerPane; + /* 0x5C */ s32 mIndex; + /* 0x60 */ s32 field_0x60; + /* 0x64 */ s32 field_0x64; + /* 0x68 */ s32 field_0x68; + /* 0x6C */ s32 field_0x6C; + /* 0x70 */ s32 field_0x70; + /* 0x74 */ s32 field_0x74; + /* 0x78 */ s32 mOnDelay; + /* 0x7C */ u8 field_0x7C; }; class dLytMeterCrossBtn_c : public d2d::dSubPane { @@ -27,28 +57,56 @@ 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 ~dLytMeterCrossBtn_c() {} s32 getField_0x620() const { return field_0x620; } + + void setOwnerPane(nw4r::lyt::Pane *pane); + bool fn_800FA730() const; + private: STATE_FUNC_DECLARE(dLytMeterCrossBtn_c, Wait); STATE_FUNC_DECLARE(dLytMeterCrossBtn_c, ToUse); STATE_FUNC_DECLARE(dLytMeterCrossBtn_c, ToUnuse); STATE_FUNC_DECLARE(dLytMeterCrossBtn_c, Unuse); - /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterCrossBtn_c); - /* 0x040 */ d2d::dLytSub mLyt; - /* 0x0D8 */ d2d::AnmGroup_c mAnmGroups[12]; - /* 0x3D8 */ u8 field_0x3D8[0x420 - 0x3D8]; + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterMinusBtn_c); + + /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMeterCrossBtn_c); + /* 0x044 */ d2d::dLytSub mLyt; + /* 0x0D8 */ d2d::AnmGroup_c mAnm[12]; + /* 0x3D8 */ nw4r::lyt::Pane *mpPane; + /* 0x3DC */ nw4r::lyt::Pane *mpOwnerPane; + /* 0x3E0 */ dTextBox_c *mpTextboxes[8]; + /* 0x400 */ dWindow_c *mpWindows[4]; + /* 0x410 */ dTextBox_c *mpSizeBoxes[4]; /* 0x420 */ dLytMeterCrossBtnParts_c mParts[4]; /* 0x620 */ s32 field_0x620; - /* 0x624 */ u8 padding[0x640 - 0x624]; + /* 0x624 */ s32 field_0x624; + /* 0x628 */ u16 field_0x628; + /* 0x62C */ s32 mCallCount0; + /* 0x630 */ s32 mCallCount1; + /* 0x634 */ u8 field_0x634; + /* 0x635 */ u8 field_0x635; + /* 0x636 */ u8 field_0x636; + /* 0x637 */ u8 field_0x637; + /* 0x638 */ u8 field_0x638; + /* 0x639 */ u8 field_0x639; + /* 0x63A */ u8 field_0x63A; + /* 0x63B */ u8 field_0x63B; + /* 0x63C */ u8 field_0x63C; }; #endif diff --git a/include/d/lyt/meter/d_lyt_meter_minus_btn.h b/include/d/lyt/meter/d_lyt_meter_minus_btn.h index 40a697a6..2e1a2e1a 100644 --- a/include/d/lyt/meter/d_lyt_meter_minus_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_minus_btn.h @@ -147,7 +147,7 @@ private: STATE_FUNC_DECLARE(dLytMeterMinusBtn_c, DemoMove); STATE_FUNC_DECLARE(dLytMeterMinusBtn_c, DemoOut); - STATE_MGR_DECLARE_UTIL_ISSTATE(dLytMeterMinusBtn_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dLytMeterMinusBtn_c); STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterMinusBtn_c); /* 0x0008 */ dLytMeterMinusBtnMenuIcon_c mIcon[8]; diff --git a/include/d/lyt/meter/d_lyt_meter_plus_btn.h b/include/d/lyt/meter/d_lyt_meter_plus_btn.h index 111a3f0c..29e03ede 100644 --- a/include/d/lyt/meter/d_lyt_meter_plus_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_plus_btn.h @@ -39,8 +39,8 @@ private: STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytMeterPlusBtn_c); - /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterPlusBtn_c); - /* 0x040 */ d2d::dLytSub mLyt; + /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMeterPlusBtn_c); + /* 0x044 */ d2d::dLytSub mLyt; /* 0x0D8 */ d2d::AnmGroup_c mAnm[3]; /* 0x198 */ nw4r::lyt::Pane *mpPane[1]; /* 0x19C */ nw4r::lyt::Pane *mpOwnerPane; diff --git a/include/s/s_State.hpp b/include/s/s_State.hpp index 8e68ed91..58a198d2 100644 --- a/include/s/s_State.hpp +++ b/include/s/s_State.hpp @@ -39,7 +39,7 @@ mStateMgr.changeState(value); \ } -#define STATE_MGR_DECLARE_UTIL_ISSTATE(class_name) \ +#define STATE_MGR_DEFINE_UTIL_ISSTATE(class_name) \ bool isState(const sFStateID_c &value) const { \ return *mStateMgr.getStateID() == value; \ } diff --git a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp index adfc7a09..496ecf6f 100644 --- a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp @@ -1,5 +1,15 @@ #include "d/lyt/meter/d_lyt_meter_cross_btn.h" +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/d_message.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_unknowns.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/small_sound_mgr.h" + STATE_DEFINE(dLytMeterCrossBtnParts_c, Wait); STATE_DEFINE(dLytMeterCrossBtnParts_c, On); STATE_DEFINE(dLytMeterCrossBtnParts_c, Active); @@ -9,3 +19,559 @@ STATE_DEFINE(dLytMeterCrossBtn_c, Wait); STATE_DEFINE(dLytMeterCrossBtn_c, ToUse); STATE_DEFINE(dLytMeterCrossBtn_c, ToUnuse); STATE_DEFINE(dLytMeterCrossBtn_c, Unuse); + +void dLytMeterCrossBtnParts_c::initializeState_Wait() { + mOnDelay = 15; +} +void dLytMeterCrossBtnParts_c::executeState_Wait() { + if (dLytMeterContainer_c::GetMeter()->fn_800D5650()) { + mOnDelay = 0; + } + + s32 timer = mOnDelay; + if (field_0x7C) { + if (field_0x68) { + bool bDoUpdate = true; + if (field_0x64 != LytDoButtonRelated::DO_NONE || field_0x70 != field_0x74) { + if (timer <= 0) { + mStateMgr.changeState(StateID_On); + setMessage(field_0x64); + } else { + bDoUpdate = false; + mOnDelay -= 1; + } + } + if (bDoUpdate) { + field_0x60 = field_0x64; + field_0x70 = field_0x74; + } + } else { + if (field_0x64 != LytDoButtonRelated::DO_NONE || field_0x70 != field_0x74) { + setMessage(field_0x64); + } + field_0x60 = field_0x64; + field_0x70 = field_0x74; + } + } + + if (timer == mOnDelay) { + mOnDelay = 15; + } +} +void dLytMeterCrossBtnParts_c::finalizeState_Wait() {} + +void dLytMeterCrossBtnParts_c::initializeState_On() { + mpAnm[0]->setBackwardsOnce(); + mpAnm[0]->setToStart(); + mpAnm[0]->setAnimEnable(true); +} +void dLytMeterCrossBtnParts_c::executeState_On() { + if (mpAnm[0]->isStop2()) { + mpAnm[0]->setAnimEnable(false); + mStateMgr.changeState(StateID_Active); + } +} +void dLytMeterCrossBtnParts_c::finalizeState_On() {} + +void dLytMeterCrossBtnParts_c::initializeState_Active() {} +void dLytMeterCrossBtnParts_c::executeState_Active() { + if (field_0x64 != field_0x60 || !field_0x68 || field_0x70 != field_0x74) { + if ((field_0x64 == LytDoButtonRelated::DO_NONE && field_0x74 == 6) || !field_0x68) { + if (field_0x60 != field_0x6C) { + field_0x64 = field_0x6C; + } + mStateMgr.changeState(StateID_Off); + } else { + setMessage(field_0x64); + } + field_0x60 = field_0x64; + field_0x70 = field_0x74; + } else if (field_0x60 == LytDoButtonRelated::DO_NONE && field_0x74 == 6) { + mStateMgr.changeState(StateID_Off); + } +} +void dLytMeterCrossBtnParts_c::finalizeState_Active() {} + +void dLytMeterCrossBtnParts_c::initializeState_Off() { + mpAnm[0]->setForwardOnce(); + mpAnm[0]->setToStart(); + mpAnm[0]->setAnimEnable(true); +} +void dLytMeterCrossBtnParts_c::executeState_Off() { + if (mpAnm[0]->isStop2()) { + mpAnm[0]->setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + } +} +void dLytMeterCrossBtnParts_c::finalizeState_Off() {} + +void dLytMeterCrossBtnParts_c::init() { + field_0x6C = LytDoButtonRelated::DO_NONE; + field_0x60 = LytDoButtonRelated::DO_NONE; + field_0x64 = LytDoButtonRelated::DO_NONE; + field_0x7C = false; + field_0x70 = 6; + field_0x68 = 1; + mOnDelay = 15; + mpOwnerPane = 0; + setMessage(LytDoButtonRelated::DO_NONE); + mStateMgr.changeState(StateID_Wait); +} + +extern "C" bool checkIsInSkykeepPuzzle(); +void dLytMeterCrossBtnParts_c::execute(bool bIsVisible) { + if (mpOwnerPane == nullptr) { + return; + } + + if (!mpOwnerPane->IsVisible()) { + if (!(*mStateMgr.getStateID() == StateID_On)) { + return; + } + field_0x70 = 6; + mpAnm[0]->setForwardOnce(); + mpAnm[0]->setToEnd2(); + mpAnm[0]->setAnimEnable(true); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[0]->setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + return; + } + + if (dLytMeterContainer_c::GetInstance()->getMeterField_0x13750() == 0) { + if (mIndex == 0) { + LytDoButtonRelated::fn_8010EC10(LytDoButtonRelated::DO_NONE, true); + } else if (mIndex == 1) { + LytDoButtonRelated::fn_8010ED50(LytDoButtonRelated::DO_NONE, true); + } else if (mIndex == 2) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::DO_NONE); + } else if (mIndex == 3) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::DO_NONE); + } + + if (field_0x64 != LytDoButtonRelated::DO_NONE) { + field_0x64 = LytDoButtonRelated::DO_NONE; + field_0x60 = LytDoButtonRelated::DO_NONE; + } + setMessage(field_0x64); + } + + if (!bIsVisible && *mStateMgr.getStateID() == StateID_Off) { + mpAnm[0]->setToEnd(); + mpLyt->calc(); + } + + if ((EventManager::isInEvent() && dMessage_c::getInstance()->getField_0x32C() == 12 && !checkIsInSkykeepPuzzle() && + !dLytMeterContainer_c::GetInstance()->fn_800D5670()) || + ((dLytMeterContainer_c::getItemSelect0x75A2() && (mIndex != 1 || field_0x74 != 0)) || !bIsVisible)) { + field_0x7C = 0; + + if (mIndex == 0) { + LytDoButtonRelated::fn_8010EC10(LytDoButtonRelated::DO_NONE, true); + } else if (mIndex == 1) { + LytDoButtonRelated::fn_8010ED50(LytDoButtonRelated::DO_NONE, true); + } else if (mIndex == 2) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::DO_NONE); + } else if (mIndex == 3) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::DO_NONE); + } + } else { + field_0x7C = 1; + } + + if (mIndex == 0) { + field_0x64 = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_CROSS_T); + field_0x68 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_CROSS_T); + } else if (mIndex == 1) { + field_0x64 = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_CROSS_D); + field_0x68 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_CROSS_D); + } else if (mIndex == 2) { + field_0x64 = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_CROSS_L); + field_0x68 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_CROSS_L); + } else if (mIndex == 3) { + field_0x64 = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_CROSS_R); + field_0x68 = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_CROSS_R); + } + + mStateMgr.executeState(); + + for (int i = 0; i < 2; i++) { + if (mpAnm[i]->isEnabled()) { + mpAnm[i]->play(); + } + } +} + +#include "d/lyt/meter/d_lyt_meter_action_table.inc" + +void dLytMeterCrossBtnParts_c::setMessage(s32 id) { + char buf[11]; + for (int i = 0; i < 11; i++) { + buf[i] = 0; + } + + // If only there was an easier way to write this + if (field_0x74 == 0 || field_0x74 == 1) { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(0.0f); + mpAnm[1]->setAnimEnable(true); + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else if (field_0x74 == 2) { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(2.0f); + mpAnm[1]->setAnimEnable(true); + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else if (field_0x74 == 3) { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(3.0f); + mpAnm[1]->setAnimEnable(true); + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else if (field_0x74 == 4) { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(4.0f); + mpAnm[1]->setAnimEnable(true); + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else if (field_0x74 == 5) { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(5.0f); + mpAnm[1]->setAnimEnable(true); + mpTextBoxes[0]->SetVisible(false); + mpTextBoxes[1]->SetVisible(false); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else if (id < LytDoButtonRelated::DO_NONE) { + if (id < 0x5D) { + sprintf(buf, "ACT_INFO_%03d", sActIds[id]); + } else { + s32 id2 = id - 0x5E; + sprintf(buf, "ACT_ETC_%03d", sActIds[id2]); + } + + for (int i = 0; i < 2; i++) { + mpTextBoxes[i]->SetVisible(true); + mpTextBoxes[i]->setMessageWithGlobalTextProcessor2(buf, nullptr); + } + mpWindow->SetVisible(true); + mpWindow->UpdateSize(mpSizeBox, 32.0f); + field_0x6C = id; + mpAnm[1]->setFrame(1.0f); + mpAnm[1]->setAnimEnable(true); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } else { + mpWindow->SetVisible(false); + mpAnm[1]->setFrame(1.0f); + mpAnm[1]->setAnimEnable(true); + mpLyt->getLayout()->Animate(0); + mpLyt->calc(); + mpAnm[1]->setAnimEnable(false); + } +} + +static const d2d::LytBrlanMapping brlanMap[] = { + { "remoConBtn_03_input.brlan", "G_inputT_00"}, + { "remoConBtn_03_input.brlan", "G_inputD_00"}, + { "remoConBtn_03_input.brlan", "G_inputL_00"}, + { "remoConBtn_03_input.brlan", "G_inputR_00"}, + {"remoConBtn_03_pattern.brlan", "N_T_00"}, + {"remoConBtn_03_pattern.brlan", "N_D_00"}, + {"remoConBtn_03_pattern.brlan", "N_L_00"}, + {"remoConBtn_03_pattern.brlan", "N_R_00"}, + { "remoConBtn_03_call.brlan", "G_call_00"}, + { "remoConBtn_03_call.brlan", "G_call_01"}, + { "remoConBtn_03_call.brlan", "G_call_02"}, + { "remoConBtn_03_loop.brlan", "G_loop_00"}, +}; + +#define CROSS_BTN_ANIM_INPUT_T 0 +#define CROSS_BTN_ANIM_INPUT_OFFSET 0 +#define CROSS_BTN_ANIM_PATTERN_OFFSET 4 +#define CROSS_BTN_ANIM_CALL_0 8 +#define CROSS_BTN_ANIM_CALL_1 9 +#define CROSS_BTN_ANIM_CALL_2 10 +#define CROSS_BTN_ANIM_LOOP 11 + +#define CROSS_BTN_NUM_ANIMS 12 + +void dLytMeterCrossBtn_c::initializeState_Wait() {} +void dLytMeterCrossBtn_c::executeState_Wait() {} +void dLytMeterCrossBtn_c::finalizeState_Wait() {} + +void dLytMeterCrossBtn_c::initializeState_ToUse() { + mAnm[CROSS_BTN_ANIM_INPUT_T].setBackwardsOnce(); + mAnm[CROSS_BTN_ANIM_INPUT_T].setToStart(); + mAnm[CROSS_BTN_ANIM_INPUT_T].setAnimEnable(true); +} +void dLytMeterCrossBtn_c::executeState_ToUse() { + if (mAnm[CROSS_BTN_ANIM_INPUT_T].isStop2()) { + mStateMgr.changeState(StateID_Wait); + } + + if (mAnm[CROSS_BTN_ANIM_INPUT_T].isEnabled()) { + mAnm[CROSS_BTN_ANIM_INPUT_T].play(); + } +} +void dLytMeterCrossBtn_c::finalizeState_ToUse() { + mAnm[CROSS_BTN_ANIM_INPUT_T].setAnimEnable(false); +} + +void dLytMeterCrossBtn_c::initializeState_ToUnuse() { + mAnm[CROSS_BTN_ANIM_INPUT_T].setForwardOnce(); + mAnm[CROSS_BTN_ANIM_INPUT_T].setToStart(); + mAnm[CROSS_BTN_ANIM_INPUT_T].setAnimEnable(true); +} +void dLytMeterCrossBtn_c::executeState_ToUnuse() { + if (mAnm[CROSS_BTN_ANIM_INPUT_T].isStop2()) { + mStateMgr.changeState(StateID_Unuse); + } + + if (mAnm[CROSS_BTN_ANIM_INPUT_T].isEnabled()) { + mAnm[CROSS_BTN_ANIM_INPUT_T].play(); + } +} +void dLytMeterCrossBtn_c::finalizeState_ToUnuse() { + mAnm[CROSS_BTN_ANIM_INPUT_T].setAnimEnable(false); +} + +void dLytMeterCrossBtn_c::initializeState_Unuse() {} +void dLytMeterCrossBtn_c::executeState_Unuse() { + if (dLytMeterContainer_c::GetInstance()->checkAllFlags(0x1)) { + mStateMgr.changeState(StateID_ToUse); + } +} +void dLytMeterCrossBtn_c::finalizeState_Unuse() {} + +static const char *sPane = "N_all_00"; + +static const char *sTextBoxes[] = { + "T_textT_00", "T_textD_00", "T_textL_00", "T_textR_00", "T_textTS_00", "T_textDS_00", "T_textLS_00", "T_textRS_00", +}; + +static const char *sWindows[] = {"W_bgP_01", "W_bgP_00", "W_bgP_02", "W_bgP_03"}; + +bool dLytMeterCrossBtn_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("remoConBtn_03.brlyt", nullptr); + + for (int i = 0; i < CROSS_BTN_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mpPane = mLyt.findPane(sPane); + + for (int i = 0; i < 8; i++) { + mpTextboxes[i] = mLyt.getTextBox(sTextBoxes[i]); + } + + for (int i = 0; i < 4; i++) { + mpWindows[i] = mLyt.getWindow(sWindows[i]); + mpSizeBoxes[i] = mLyt.getSizeBoxInWindow(sWindows[i]); + } + + for (int i = 0; i < 4; i++) { + mParts[i].mIndex = i; + mParts[i].mpLyt = &mLyt; + mParts[i].mpAnm[0] = &mAnm[i + CROSS_BTN_ANIM_INPUT_OFFSET]; + mParts[i].mpAnm[1] = &mAnm[i + CROSS_BTN_ANIM_PATTERN_OFFSET]; + mParts[i].mpTextBoxes[0] = mpTextboxes[i]; + mParts[i].mpTextBoxes[1] = mpTextboxes[i + 4]; + mParts[i].mpWindow = mpWindows[i]; + mParts[i].mpSizeBox = mpSizeBoxes[i]; + mParts[i].field_0x74 = 6; + mParts[i].init(); + } + + field_0x634 = 0; + field_0x635 = 0; + field_0x636 = 0; + + field_0x628 = 0xFFFF; + mCallCount0 = 0; + mCallCount1 = 0; + field_0x620 = 6; + field_0x624 = 6; + + field_0x637 = 0; + field_0x638 = 0; + field_0x639 = 0; + field_0x63A = 0; + field_0x63B = 0; + field_0x63C = 0; + + mpOwnerPane = nullptr; + + for (int i = 0; i < 4; i++) { + mAnm[i + CROSS_BTN_ANIM_INPUT_OFFSET].setToEnd(); + mAnm[i + CROSS_BTN_ANIM_INPUT_OFFSET].setAnimEnable(true); + } + + mAnm[CROSS_BTN_ANIM_CALL_0].setToEnd(); + mAnm[CROSS_BTN_ANIM_CALL_0].setAnimEnable(true); + mAnm[CROSS_BTN_ANIM_CALL_1].setToEnd(); + mAnm[CROSS_BTN_ANIM_CALL_1].setAnimEnable(true); + mAnm[CROSS_BTN_ANIM_CALL_2].setToEnd(); + mAnm[CROSS_BTN_ANIM_CALL_2].setAnimEnable(true); + + mLyt.calc(); + + for (int i = 0; i < 4; i++) { + mAnm[i + CROSS_BTN_ANIM_INPUT_OFFSET].setAnimEnable(false); + } + + mAnm[CROSS_BTN_ANIM_CALL_0].setAnimEnable(false); + mAnm[CROSS_BTN_ANIM_CALL_1].setAnimEnable(false); + mAnm[CROSS_BTN_ANIM_CALL_2].setAnimEnable(false); + mAnm[CROSS_BTN_ANIM_LOOP].setAnimEnable(true); + + mStateMgr.changeState(StateID_Wait); + + return true; +} + +bool dLytMeterCrossBtn_c::remove() { + for (int i = 0; i < CROSS_BTN_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +extern "C" u16 prepareFiHelpIndex(); +bool dLytMeterCrossBtn_c::execute() { + u16 newFiValue = prepareFiHelpIndex(); + if (newFiValue != field_0x628) { + field_0x628 = newFiValue; + mCallCount0 = 0; + } + + mParts[0].field_0x74 = field_0x624; + mParts[1].field_0x74 = field_0x620; + + if (mpOwnerPane != nullptr) { + for (int i = 0; i < 4; i++) { + mParts[i].execute(mpOwnerPane->IsVisible()); + } + } + + mStateMgr.executeState(); + + if (StoryflagManager::sInstance->getCounterOrFlag(43)) { + field_0x63B = 1; + } + + if (field_0x637 != 0) { + if (field_0x620 == 0) { + f32 frame = dAcPy_c::GetLink2()->getAnmMatClrFrame(); + if (frame == 0.0f) { + mAnm[CROSS_BTN_ANIM_CALL_0].setToEnd(); + if (!mAnm[CROSS_BTN_ANIM_CALL_0].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_0].setAnimEnable(true); + } + } + + if (mAnm[CROSS_BTN_ANIM_CALL_0].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_0].play(); + if (mParts[1].isActive() && mCallCount0 < 3 && mAnm[CROSS_BTN_ANIM_CALL_0].getFrame() == 1.0f) { + SmallSoundManager::GetInstance()->playSound(SE_S_SG_CALL); + mCallCount0++; + } + } + } + } else if (field_0x638 == 1) { + mAnm[CROSS_BTN_ANIM_CALL_0].setToEnd(); + } else if (mAnm[CROSS_BTN_ANIM_CALL_0].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_0].setAnimEnable(false); + } + + if (field_0x639 != 0) { + if (field_0x624 == 3) { + if (field_0x63A == 0) { + mAnm[CROSS_BTN_ANIM_CALL_1].setToEnd(); + mAnm[CROSS_BTN_ANIM_CALL_1].setAnimEnable(true); + } + if (mAnm[CROSS_BTN_ANIM_CALL_1].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_1].play(); + if (mParts[0].isActive() && mCallCount1 < 3 && mAnm[CROSS_BTN_ANIM_CALL_1].getFrame() == 1.0f) { + SmallSoundManager::GetInstance()->playSound(SE_S_CATAPULT_READY); + mCallCount1++; + } + } + } + } else if (field_0x63A == 1) { + mAnm[CROSS_BTN_ANIM_CALL_1].setToEnd(); + } else if (mAnm[CROSS_BTN_ANIM_CALL_1].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_1].setAnimEnable(false); + } + + if (field_0x63B != 0) { + if (field_0x620 == 2) { + if (field_0x63C == 0) { + mAnm[CROSS_BTN_ANIM_CALL_2].setToEnd(); + mAnm[CROSS_BTN_ANIM_CALL_2].setRate(2.0f); + mAnm[CROSS_BTN_ANIM_CALL_2].setAnimEnable(true); + } + if (mAnm[CROSS_BTN_ANIM_CALL_2].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_2].play(); + if (mParts[1].isActive() && mAnm[CROSS_BTN_ANIM_CALL_2].getFrame() == 1.0f) { + SmallSoundManager::GetInstance()->playSound(SE_S_BIRD_CALL); + } + } + } + } else if (field_0x63C == 1) { + mAnm[CROSS_BTN_ANIM_CALL_2].setToEnd(); + } else if (mAnm[CROSS_BTN_ANIM_CALL_2].isEnabled()) { + mAnm[CROSS_BTN_ANIM_CALL_2].setAnimEnable(false); + } + + if (mAnm[CROSS_BTN_ANIM_LOOP].isEnabled()) { + mAnm[CROSS_BTN_ANIM_LOOP].play(); + } + + field_0x620 = 6; + field_0x624 = 6; + // Might be arrays + field_0x638 = field_0x637; + field_0x637 = 0; + field_0x63A = field_0x639; + field_0x639 = 0; + field_0x63C = field_0x63B; + field_0x63B = 0; + + return true; +} + +void dLytMeterCrossBtn_c::setOwnerPane(nw4r::lyt::Pane *pane) { + mpOwnerPane = pane; + for (int i = 0; i < 4; i++) { + mParts[i].mpOwnerPane = pane; + } +} + +bool dLytMeterCrossBtn_c::fn_800FA730() const { + if (field_0x620 == 2) { + return true; + } + + return field_0x637 != 0 || field_0x639 != 0 || field_0x63B != 0; +} 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 c5a23427..0d41c298 100644 --- a/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp +++ b/src/d/lyt/meter/d_lyt_meter_remocon_bg.cpp @@ -48,7 +48,7 @@ bool dLytMeterRemoconBg_c::remove() { } bool dLytMeterRemoconBg_c::execute() { - if (EventManager::isInEvent() || dLytMeterContainer_c::getItemSelect0x75B2() != 0) { + if (EventManager::isInEvent() || dLytMeterContainer_c::getItemSelect0x75A2() != 0) { field_0xEC = 0; LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_REMOCON_BG, LytDoButtonRelated::DO_NONE); } else {