diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 863d21f6..3a8bba0e 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -448,7 +448,9 @@ d/lyt/meter/d_lyt_meter_heart.cpp: d/lyt/meter/d_lyt_meter_shield_gauge.cpp: .text start:0x8010BD50 end:0x8010CEC8 .ctors start:0x804DB724 end:0x804DB728 + .rodata start:0x804E6CF8 end:0x804E6D60 .data start:0x8051A320 end:0x8051A5A8 + .sdata2 start:0x80579D48 end:0x80579D70 .bss start:0x805ACD50 end:0x805ACE10 d/lyt/d_lyt_do_button.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 5440f789..86464a98 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -6499,10 +6499,10 @@ executeState_ToMax__22dLytMeterShieldGauge_cFv = .text:0x8010BDC0; // type:funct finalizeState_ToMax__22dLytMeterShieldGauge_cFv = .text:0x8010BDD0; // type:function size:0x4 build__22dLytMeterShieldGauge_cFPQ23d2d10ResAccIf_c = .text:0x8010BDE0; // type:function size:0x2A0 remove__22dLytMeterShieldGauge_cFv = .text:0x8010C080; // type:function size:0x58 -fn_8010C0E0 = .text:0x8010C0E0; // type:function size:0x9C0 -fn_8010CAA0 = .text:0x8010CAA0; // type:function size:0x40 -fn_8010CAE0 = .text:0x8010CAE0; // type:function size:0x20 -fn_8010CB00 = .text:0x8010CB00; // type:function size:0x2C +execute__22dLytMeterShieldGauge_cFv = .text:0x8010C0E0; // type:function size:0x9C0 +setLevel__22dLytMeterShieldGauge_cFf = .text:0x8010CAA0; // type:function size:0x40 +getLytFrameForShield__22dLytMeterShieldGauge_cCFl = .text:0x8010CAE0; // type:function size:0x20 +calcUpdownRatio__22dLytMeterShieldGauge_cCFf = .text:0x8010CB00; // type:function size:0x2C getName__22dLytMeterShieldGauge_cCFv = .text:0x8010CB30; // type:function size:0x8 getLyt__22dLytMeterShieldGauge_cFv = .text:0x8010CB40; // type:function size:0x8 getPane__22dLytMeterShieldGauge_cFv = .text:0x8010CB50; // type:function size:0x8 @@ -20848,7 +20848,7 @@ fn_8037E230 = .text:0x8037E230; // type:function size:0xEC fn_8037E320 = .text:0x8037E320; // type:function size:0x78 fn_8037E3A0 = .text:0x8037E3A0; // type:function size:0x158 fn_8037E500 = .text:0x8037E500; // type:function size:0x58 -fn_8037E560 = .text:0x8037E560; // type:function size:0xBC +playSoundWithPitch__17SmallSoundManagerF7WZSoundf = .text:0x8037E560; // type:function size:0xBC fn_8037E620 = .text:0x8037E620; // type:function size:0xDC fn_8037E700 = .text:0x8037E700; // type:function size:0x8 fn_8037E710 = .text:0x8037E710; // type:function size:0x8 @@ -31877,25 +31877,25 @@ lbl_8051A234 = .data:0x8051A234; // type:object size:0xC lbl_8051A240 = .data:0x8051A240; // type:object size:0x98 lbl_8051A2D8 = .data:0x8051A2D8; // type:object size:0x10 __vt__16dLytMeterHeart_c = .data:0x8051A2E8; // type:object size:0x38 -lbl_8051A320 = .data:0x8051A320; // type:object size:0x18 -lbl_8051A338 = .data:0x8051A338; // type:object size:0xC -lbl_8051A344 = .data:0x8051A344; // type:object size:0x18 -lbl_8051A35C = .data:0x8051A35C; // type:object size:0xC -lbl_8051A368 = .data:0x8051A368; // type:object size:0x20 +lbl_8051A320 = .data:0x8051A320; // type:object size:0x16 data:string +lbl_8051A338 = .data:0x8051A338; // type:object size:0xB data:string +lbl_8051A344 = .data:0x8051A344; // type:object size:0x16 data:string +lbl_8051A35C = .data:0x8051A35C; // type:object size:0xB data:string +lbl_8051A368 = .data:0x8051A368; // type:object size:0x1D data:string lbl_8051A388 = .data:0x8051A388; // type:object size:0xC data:string -lbl_8051A394 = .data:0x8051A394; // type:object size:0x1C +lbl_8051A394 = .data:0x8051A394; // type:object size:0x1B data:string lbl_8051A3B0 = .data:0x8051A3B0; // type:object size:0x10 data:string -lbl_8051A3C0 = .data:0x8051A3C0; // type:object size:0x1C +lbl_8051A3C0 = .data:0x8051A3C0; // type:object size:0x1A data:string lbl_8051A3DC = .data:0x8051A3DC; // type:object size:0xC data:string -lbl_8051A3E8 = .data:0x8051A3E8; // type:object size:0x18 -lbl_8051A400 = .data:0x8051A400; // type:object size:0xC -lbl_8051A40C = .data:0x8051A40C; // type:object size:0x18 -lbl_8051A424 = .data:0x8051A424; // type:object size:0xC -lbl_8051A430 = .data:0x8051A430; // type:object size:0x10 +lbl_8051A3E8 = .data:0x8051A3E8; // type:object size:0x16 data:string +lbl_8051A400 = .data:0x8051A400; // type:object size:0xB data:string +lbl_8051A40C = .data:0x8051A40C; // type:object size:0x15 data:string +lbl_8051A424 = .data:0x8051A424; // type:object size:0xA data:string +lbl_8051A430 = .data:0x8051A430; // type:object size:0xA data:string lbl_8051A440 = .data:0x8051A440; // type:object size:0x10 data:string -lbl_8051A450 = .data:0x8051A450; // type:object size:0xC +lbl_8051A450 = .data:0x8051A450; // type:object size:0xB data:string __vt__22dLytMeterShieldGauge_c = .data:0x8051A45C; // type:object size:0x34 -__vt__37sFStateID_c<22dLytMeterShieldGauge_c> = .data:0x8051A570; // type:object size:0x38 +__vt__37sFStateID_c<22dLytMeterShieldGauge_c> = .data:0x8051A570; // type:object size:0x34 lbl_8051A5A8 = .data:0x8051A5A8; // type:object size:0x18 lbl_8051A5C0 = .data:0x8051A5C0; // type:object size:0xC lbl_8051A5CC = .data:0x8051A5CC; // type:object size:0x20 @@ -48792,8 +48792,8 @@ LytMeterTimer__STATE_SIREN = .bss:0x805ACBE0; // type:object size:0x80 data:4byt LytMeterTimer__STATE_CHANGE_SAFE = .bss:0x805ACC60; // type:object size:0x40 data:4byte LytMeterTimer__STATE_SAFE = .bss:0x805ACCA0; // type:object size:0x80 data:4byte LytMeterTimer__STATE_FRUITS = .bss:0x805ACD20; // type:object size:0x30 data:4byte -lbl_805ACD50 = .bss:0x805ACD50; // type:object size:0x10 -LytMeterShieldGauge__STATE_NORMAL = .bss:0x805ACD60; // type:object size:0xB0 data:4byte +lbl_805ACD50 = .bss:0x805ACD50; // type:object size:0xC +LytMeterShieldGauge__STATE_NORMAL = .bss:0x805ACD60; // type:object size:0x30 data:4byte lbl_805ACE10 = .bss:0x805ACE10; // type:object size:0x10 lbl_805ACE20 = .bss:0x805ACE20; // type:object size:0x28 LytDoButton__STATE_INVISIBLE_WAIT = .bss:0x805ACE48; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index 1815c918..6dbc967a 100644 --- a/configure.py +++ b/configure.py @@ -403,7 +403,7 @@ config.libs = [ Object(NonMatching, "d/lyt/meter/d_lyt_meter_event_skip.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_timer.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_heart.cpp"), - Object(NonMatching, "d/lyt/meter/d_lyt_meter_shield_gauge.cpp"), + Object(Matching, "d/lyt/meter/d_lyt_meter_shield_gauge.cpp"), Object(NonMatching, "d/lyt/d_lyt_do_button.cpp"), Object(NonMatching, "d/lyt/d_lyt_do_button_related.cpp"), Object(Matching, "d/lyt/d_lyt_common_a_btn.cpp"), diff --git a/include/d/lyt/d_lyt_meter_configuration.h b/include/d/lyt/d_lyt_meter_configuration.h index 181c0db4..87c29f01 100644 --- a/include/d/lyt/d_lyt_meter_configuration.h +++ b/include/d/lyt/d_lyt_meter_configuration.h @@ -12,6 +12,22 @@ public: return sInstance; } + f32 getField_0x1CC() const { + return field_0x1CC; + } + + f32 getField_0x1D0() const { + return field_0x1D0; + } + + f32 getField_0x1C4() const { + return field_0x1C4; + } + + s32 getField_0x1C8() const { + return field_0x1C8; + } + s32 getField_0x1D8() const { return field_0x1D8; } diff --git a/include/d/lyt/meter/d_lyt_meter_shield_gauge.h b/include/d/lyt/meter/d_lyt_meter_shield_gauge.h index 55e87c8f..9e1bf848 100644 --- a/include/d/lyt/meter/d_lyt_meter_shield_gauge.h +++ b/include/d/lyt/meter/d_lyt_meter_shield_gauge.h @@ -2,8 +2,8 @@ #define D_LYT_METER_SHIELD_GAUGE_H #include "d/lyt/d2d.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dLytMeterShieldGauge_c : public d2d::dSubPane { public: @@ -11,25 +11,57 @@ public: virtual bool build(d2d::ResAccIf_c *resAcc) override; virtual bool remove() override; virtual bool execute() override; - virtual nw4r::lyt::Pane *getPane() override; - virtual d2d::LytBase_c *getLyt() override; - virtual const char *getName() const override; + virtual nw4r::lyt::Pane *getPane() override { + return mLyt.getLayout()->GetRootPane(); + } + virtual d2d::LytBase_c *getLyt() override { + return &mLyt; + } + virtual const char *getName() const override { + return mLyt.getName(); + } virtual ~dLytMeterShieldGauge_c() {} void setContainerGroup(d2d::AnmGroup_c *g) { mpContainerAnmGroup = g; } + private: + s32 getLytFrameForShield(s32) const; + void setLevel(f32 level); + f32 calcUpdownRatio(f32) const; + STATE_FUNC_DECLARE(dLytMeterShieldGauge_c, Normal); STATE_FUNC_DECLARE(dLytMeterShieldGauge_c, Use); STATE_FUNC_DECLARE(dLytMeterShieldGauge_c, ToMax); - UI_STATE_MGR_DECLARE(dLytMeterShieldGauge_c); - d2d::dLytSub mLyt; - /* 0x0D8 */ d2d::AnmGroup_c mAnmGroups[8]; - /* 0x??? */ d2d::AnmGroup_c *mpContainerAnmGroup; - /* 0x??? */ u8 padding[0x130C4 - 0x13080]; + /* 0x008 */ UI_STATE_MGR_DECLARE(dLytMeterShieldGauge_c); + /* 0x044 */ d2d::dLytSub mLyt; + /* 0x0D8 */ d2d::AnmGroup_c mAnm[8]; + /* 0x2D8 */ d2d::AnmGroup_c *mpContainerAnmGroup; + /* 0x2DC */ nw4r::lyt::Pane *mpOwnerPane; + /* 0x2E0 */ f32 field_0x2E0; + /* 0x2E4 */ f32 field_0x2E4; + /* 0x2E8 */ f32 field_0x2E8; + /* 0x2EC */ f32 field_0x2EC; + /* 0x2F0 */ f32 field_0x2F0; + /* 0x2F4 */ f32 field_0x2F4; + /* 0x2F8 */ f32 field_0x2F8; + /* 0x2FC */ s32 field_0x2FC; + /* 0x300 */ f32 field_0x300; + /* 0x304 */ f32 field_0x304; + /* 0x308 */ s32 field_0x308; + /* 0x30C */ u8 field_0x30C; + /* 0x30D */ u8 field_0x30D; + /* 0x30E */ u8 field_0x30E; + /* 0x310 */ s32 field_0x310; + /* 0x314 */ s32 field_0x314; + /* 0x318 */ s32 field_0x318; + /* 0x31C */ u8 field_0x31C; + /* 0x31D */ u8 field_0x31D; + /* 0x31E */ u8 field_0x31E; + /* 0x31F */ u8 field_0x31F; }; #endif diff --git a/include/toBeSorted/small_sound_mgr.h b/include/toBeSorted/small_sound_mgr.h index 9c56dab9..06978ad1 100644 --- a/include/toBeSorted/small_sound_mgr.h +++ b/include/toBeSorted/small_sound_mgr.h @@ -6472,6 +6472,7 @@ enum WZSound { class SmallSoundManager { public: void playSound(WZSound id); + void playSoundWithPitch(WZSound id, f32 pitch); void playButtonPressSoundWhenAdvancingTextBoxes(f32); static SmallSoundManager *GetInstance() { diff --git a/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp index 259e9483..09afec6b 100644 --- a/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp +++ b/src/d/lyt/meter/d_lyt_meter_shield_gauge.cpp @@ -1,9 +1,39 @@ #include "d/lyt/meter/d_lyt_meter_shield_gauge.h" +#include "common.h" +#include "d/d_pouch.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_meter_configuration.h" +#include "toBeSorted/file_manager.h" +#include "toBeSorted/small_sound_mgr.h" + STATE_DEFINE(dLytMeterShieldGauge_c, Normal); STATE_DEFINE(dLytMeterShieldGauge_c, Use); STATE_DEFINE(dLytMeterShieldGauge_c, ToMax); +static const d2d::LytBrlanMapping brlanMap[] = { + { "shield_00_break.brlan", "G_break_00"}, + { "shield_00_level.brlan", "G_level_00"}, + {"shield_00_shieldUpDown.brlan", "G_shield_00"}, + { "shield_00_shieldType.brlan", "G_shieldType_00"}, + { "shield_00_shieldUse.brlan", "G_shield_01"}, + { "shield_00_toMax.brlan", "G_toMax_00"}, + { "shield_00_loop.brlan", "G_loop_00"}, + { "shield_00_loop.brlan", "G_loop_01"}, +}; + +#define SHIELD_ANIM_BREAK 0 +#define SHIELD_ANIM_LEVEL 1 +#define SHIELD_ANIM_UPDOWN 2 +#define SHIELD_ANIM_TYPE 3 +#define SHIELD_ANIM_USE 4 +#define SHIELD_ANIM_TO_MAX 5 +#define SHIELD_ANIM_LOOP_0 6 +#define SHIELD_ANIM_LOOP_1 7 + +#define SHIELD_NUM_ANIMS 8 + +// Incredible use of the state manager here void dLytMeterShieldGauge_c::initializeState_Normal() {} void dLytMeterShieldGauge_c::executeState_Normal() {} void dLytMeterShieldGauge_c::finalizeState_Normal() {} @@ -17,31 +47,332 @@ void dLytMeterShieldGauge_c::executeState_ToMax() {} void dLytMeterShieldGauge_c::finalizeState_ToMax() {} bool dLytMeterShieldGauge_c::build(d2d::ResAccIf_c *resAcc) { - // TODO + mLyt.setResAcc(resAcc); + mLyt.build("shield_00.brlyt", nullptr); + + for (int i = 0; i < SHIELD_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mpOwnerPane = nullptr; + field_0x31D = 1; + field_0x2E0 = 0.0f; + field_0x2E4 = 0.0f; + field_0x2E8 = 0.0f; + field_0x2EC = 0.0f; + + field_0x308 = convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot()); + field_0x300 = field_0x2EC; + field_0x304 = field_0x2E0; + field_0x2FC = dLytMeterConfiguration_c::GetInstance()->getField_0x1C8(); + field_0x2F0 = 80.0f; + field_0x2F4 = 80.0f; + + field_0x2F8 = mAnm[SHIELD_ANIM_USE].getAnimDuration() - 1.0f; + field_0x30D = 0; + field_0x30E = 0; + field_0x30C = 0; + field_0x31F = 0; + field_0x31E = 0; + field_0x318 = 0; + field_0x310 = 0; + field_0x314 = -1; + + mAnm[SHIELD_ANIM_UPDOWN].setFrame(field_0x2E0); + mAnm[SHIELD_ANIM_UPDOWN].setAnimEnable(true); + field_0x2E4 = calcUpdownRatio(field_0x2E0); + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + setLevel(field_0x2F0); + mAnm[SHIELD_ANIM_LEVEL].setAnimEnable(true); + mAnm[SHIELD_ANIM_TYPE].setFrame(getLytFrameForShield(0)); + mAnm[SHIELD_ANIM_TYPE].setAnimEnable(true); + mAnm[SHIELD_ANIM_LOOP_0].setAnimEnable(true); + mAnm[SHIELD_ANIM_LOOP_1].setAnimEnable(true); + + mAnm[SHIELD_ANIM_BREAK].setToEnd(); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); + + mLyt.calc(); + + mAnm[SHIELD_ANIM_UPDOWN].setAnimEnable(false); + mAnm[SHIELD_ANIM_LEVEL].setAnimEnable(false); + mAnm[SHIELD_ANIM_TYPE].setAnimEnable(false); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(false); + field_0x31C = 1; + field_0x30C = 1; + mStateMgr.changeState(StateID_Normal); return true; } bool dLytMeterShieldGauge_c::remove() { for (int i = 0; i < 8; i++) { - mAnmGroups[i].unbind(); - mAnmGroups[i].remove(); + mAnm[i].unbind(); + mAnm[i].remove(); } return true; } bool dLytMeterShieldGauge_c::execute() { - // TODO + if (!mpOwnerPane) { + return true; + } + + if (!mpOwnerPane->IsVisible()) { + return true; + } + + if (field_0x2E0 == 0.0f) { + field_0x318 = 2; + } + + bool b1 = false; + bool b2 = true; + bool b3 = false; + bool b4 = false; + + if (field_0x310 != field_0x314 || + field_0x308 != convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot())) { + mLyt.findPane("N_alpha_00")->SetVisible(true); + field_0x314 = field_0x310; + mAnm[SHIELD_ANIM_TYPE].setFrame(getLytFrameForShield(field_0x310)); + mAnm[SHIELD_ANIM_TYPE].setAnimEnable(true); + mAnm[SHIELD_ANIM_LOOP_0].setFrame(0.0f); + field_0x31D = 1; + b2 = false; + b3 = true; + field_0x2E8 = field_0x2E0; + field_0x308 = convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot()); + } + + if (field_0x2E0 != field_0x2E8 || field_0x31D) { + if (field_0x2E0 < field_0x2E8) { + f32 f = calcUpdownRatio(field_0x2E0); + field_0x2E8 = field_0x2E0; + mAnm[SHIELD_ANIM_UPDOWN].setFrame(f); + mAnm[SHIELD_ANIM_UPDOWN].setAnimEnable(true); + b1 = true; + if (field_0x31F && field_0x31D) { + field_0x31F = 0; + b1 = false; + } + field_0x31E = 0; + b4 = true; + } else { + b1 = true; + field_0x2EC += 1.0f; + if (field_0x31F && field_0x31D) { + field_0x31F = 0; + b1 = false; + } + if (field_0x2EC >= field_0x2E0 || field_0x31D) { + field_0x2EC = field_0x2E0; + } + if (field_0x2E0 < field_0x2EC) { + field_0x31E = 1; + } + + if (!field_0x31D) { + if (field_0x2E0 >= field_0x2F0) { + if (field_0x31E) { + SmallSoundManager::GetInstance()->playSoundWithPitch(SE_S_GAUGE_SHIELD_UP_LV, 1.0f); + } + SmallSoundManager::GetInstance()->playSound(SE_S_GAUGE_SHIELD_UP_MAX); + } else { + if (field_0x31E) { + SmallSoundManager::GetInstance()->playSoundWithPitch( + SE_S_GAUGE_SHIELD_UP_LV, field_0x2E0 / field_0x2F0 + ); + } + } + } + f32 tmp = calcUpdownRatio(field_0x2EC); + field_0x2E4 = tmp; + if (!field_0x31F) { + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + } + field_0x2E8 = field_0x2EC; + mAnm[SHIELD_ANIM_UPDOWN].setFrame(tmp); + mAnm[SHIELD_ANIM_UPDOWN].setAnimEnable(true); + } + + if (FileManager::GetInstance()->getShieldPouchSlot() == 8) { + if (field_0x2E0 <= 0.0f && b4) { + mAnm[SHIELD_ANIM_BREAK].setFrame(0.0f); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); + field_0x30D = 1; + } else { + mAnm[SHIELD_ANIM_BREAK].setToEnd(); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); + mLyt.calc(); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(false); + field_0x30C = 1; + } + } else { + if (field_0x2E0 <= 0.0f && b4) { + mAnm[SHIELD_ANIM_BREAK].setFrame(0.0f); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); + field_0x30D = 1; + } else if (b2 && field_0x2E0 >= field_0x2F0) { + mAnm[SHIELD_ANIM_TO_MAX].setFrame(0.0f); + mAnm[SHIELD_ANIM_TO_MAX].setAnimEnable(true); + field_0x30E = 1; + } + } + } + + f32 f1 = dLytMeterConfiguration_c::GetInstance()->getField_0x1CC() * 40.0f / 4.0f; + f32 f2 = dLytMeterConfiguration_c::GetInstance()->getField_0x1D0() * 40.0f / 4.0f; + f32 f3 = dLytMeterConfiguration_c::GetInstance()->getField_0x1C4() * 40.0f / 4.0f; + + (void)calcUpdownRatio(field_0x2E0); + + if (field_0x31F) { + if (field_0x2E0 < field_0x304 && field_0x2E0 < field_0x2EC - f1) { + field_0x2FC = dLytMeterConfiguration_c::GetInstance()->getField_0x1C8(); + field_0x300 = field_0x2EC; + field_0x304 = field_0x2E0; + field_0x2E4 = calcUpdownRatio(field_0x2EC); + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + } else { + if (field_0x2FC > 0) { + field_0x2FC--; + } + if (field_0x2FC == 0) { + field_0x300 = field_0x300 - f2; + if (field_0x300 < field_0x2E0) { + field_0x31F = 0; + field_0x300 = field_0x2E0; + } + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + field_0x2E4 = calcUpdownRatio(field_0x300); + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + } + } + } else if (!field_0x31D && field_0x2E0 < field_0x2EC - f3) { + field_0x31F = 1; + field_0x300 = field_0x2EC; + field_0x304 = field_0x2E0; + field_0x2FC = dLytMeterConfiguration_c::GetInstance()->getField_0x1C8(); + field_0x2E4 = calcUpdownRatio(field_0x2EC); + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + } else if (!b1) { + field_0x2E4 = calcUpdownRatio(field_0x2EC); + mAnm[SHIELD_ANIM_USE].setFrame(field_0x2F8 - field_0x2E4); + mAnm[SHIELD_ANIM_USE].setAnimEnable(true); + } + + if (!b1) { + field_0x2EC = field_0x2E0; + } + field_0x31D = 0; + if (field_0x2F0 != field_0x2F4 || b3) { + setLevel(field_0x2F0); + mAnm[SHIELD_ANIM_LEVEL].setAnimEnable(true); + field_0x2F4 = field_0x2F0; + } + + if (mAnm[SHIELD_ANIM_BREAK].isEnabled()) { + if (field_0x318 == 0 && field_0x2E0 > 0) { + mAnm[SHIELD_ANIM_BREAK].setFrame(0.0f); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); // redundant? + field_0x30C = 0; + field_0x30D = 0; + } else if (mAnm[SHIELD_ANIM_BREAK].isEndReached()) { + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(false); + field_0x30C = 1; + field_0x30D = 0; + } else { + mAnm[SHIELD_ANIM_BREAK].play(); + } + } else if (field_0x30C && !field_0x318 && field_0x2E0 > 0.0f) { + mAnm[SHIELD_ANIM_BREAK].setFrame(0.0f); + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(true); + field_0x30C = 0; + field_0x30D = 0; + } + + if (mAnm[SHIELD_ANIM_TO_MAX].isEnabled()) { + if (mAnm[SHIELD_ANIM_TO_MAX].isEndReached()) { + mAnm[SHIELD_ANIM_TO_MAX].setAnimEnable(false); + field_0x30E = 0; + } else { + mAnm[SHIELD_ANIM_TO_MAX].play(); + } + } + + mStateMgr.executeState(); + + if ((field_0x314 == 6 || field_0x314 == 7 || field_0x314 == 8) && mAnm[SHIELD_ANIM_USE].getFrame() == 0.0f && + mAnm[SHIELD_ANIM_LOOP_0].getFrame() == 0.0f) { + if (mAnm[SHIELD_ANIM_LOOP_0].isEnabled()) { + mAnm[SHIELD_ANIM_LOOP_0].setAnimEnable(false); + } + } else if (!mAnm[SHIELD_ANIM_LOOP_0].isEnabled()) { + mAnm[SHIELD_ANIM_LOOP_0].setAnimEnable(true); + } + + if (mAnm[SHIELD_ANIM_LOOP_0].isEnabled()) { + mAnm[SHIELD_ANIM_LOOP_0].play(); + } + + if (mAnm[SHIELD_ANIM_LOOP_1].isEnabled()) { + mAnm[SHIELD_ANIM_LOOP_1].play(); + } + + mLyt.calc(); + + if (mAnm[SHIELD_ANIM_UPDOWN].isEnabled()) { + mAnm[SHIELD_ANIM_UPDOWN].setAnimEnable(false); + } + + if (mAnm[SHIELD_ANIM_LEVEL].isEnabled()) { + mAnm[SHIELD_ANIM_LEVEL].setAnimEnable(false); + } + + if (mAnm[SHIELD_ANIM_TYPE].isEnabled()) { + mAnm[SHIELD_ANIM_TYPE].setAnimEnable(false); + } + + if (mAnm[SHIELD_ANIM_USE].isEnabled()) { + mAnm[SHIELD_ANIM_USE].setAnimEnable(false); + } + + if (!field_0x30E && mAnm[SHIELD_ANIM_TO_MAX].isEnabled()) { + mAnm[SHIELD_ANIM_TO_MAX].setAnimEnable(false); + } + + if (!field_0x30C && !field_0x30D && mAnm[SHIELD_ANIM_BREAK].isEnabled()) { + mAnm[SHIELD_ANIM_BREAK].setAnimEnable(false); + } + + if (field_0x318 > 0) { + field_0x318--; + } + return true; } -const char *dLytMeterShieldGauge_c::getName() const { - return mLyt.getName(); +void dLytMeterShieldGauge_c::setLevel(f32 lv) { + mAnm[SHIELD_ANIM_LEVEL].setFrame(lv * 0.5f); } -d2d::LytBase_c *dLytMeterShieldGauge_c::getLyt() { - return &mLyt; +s32 dLytMeterShieldGauge_c::getLytFrameForShield(s32 shield) const { + static const int table[] = {0, 4, 7, 1, 5, 8, 2, 6, 9, 3}; + if (shield == 10) { + shield = 0; + } + return table[shield]; } -nw4r::lyt::Pane *dLytMeterShieldGauge_c::getPane() { - return mLyt.getLayout()->GetRootPane(); +f32 dLytMeterShieldGauge_c::calcUpdownRatio(f32 f) const { + f32 duration = mAnm[SHIELD_ANIM_UPDOWN].getAnimDuration() - 1.0f; + f32 bound = 0.0f; + f32 b = (field_0x2F0 > bound ? f / field_0x2F0 : bound); + return b * duration; }