From eb32c18c392bd3cf641618bc6a52b87bef6c4986 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 17 Apr 2025 10:36:36 +0200 Subject: [PATCH] d_lyt_meter_heart OK --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 106 +++++++------- configure.py | 2 +- include/d/lyt/d_lyt_game_over.h | 19 +++ include/d/lyt/meter/d_lyt_meter_heart.h | 10 +- src/d/lyt/meter/d_lyt_meter_heart.cpp | 176 ++++++++++++++++++++++-- 6 files changed, 245 insertions(+), 69 deletions(-) create mode 100644 include/d/lyt/d_lyt_game_over.h diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 2a2c6759..703b44e4 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -447,6 +447,7 @@ d/lyt/meter/d_lyt_meter_heart.cpp: .text start:0x8010AEC0 end:0x8010BD48 .rodata start:0x804E6C28 end:0x804E6CF8 .data start:0x80519F60 end:0x8051A320 + .sdata start:0x80572518 end:0x80572520 .sdata2 start:0x80579D30 end:0x80579D48 d/lyt/meter/d_lyt_meter_shield_gauge.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index a4203c2e..da5e8bda 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -31822,61 +31822,61 @@ lbl_80519CA8 = .data:0x80519CA8; // type:object size:0x10 __vt__20LytMeterTimerPart2_c = .data:0x80519CB8; // type:object size:0x34 __vt__20LytMeterTimerPart1_c = .data:0x80519CEC; // type:object size:0x23C __vt__31sFStateID_c<16dLytMeterTimer_c> = .data:0x80519F28; // type:object size:0x34 -lbl_80519F60 = .data:0x80519F60; // type:object size:0x18 -lbl_80519F78 = .data:0x80519F78; // type:object size:0xC -lbl_80519F84 = .data:0x80519F84; // type:object size:0xC -lbl_80519F90 = .data:0x80519F90; // type:object size:0xC -lbl_80519F9C = .data:0x80519F9C; // type:object size:0xC -lbl_80519FA8 = .data:0x80519FA8; // type:object size:0xC -lbl_80519FB4 = .data:0x80519FB4; // type:object size:0xC -lbl_80519FC0 = .data:0x80519FC0; // type:object size:0xC -lbl_80519FCC = .data:0x80519FCC; // type:object size:0xC -lbl_80519FD8 = .data:0x80519FD8; // type:object size:0xC -lbl_80519FE4 = .data:0x80519FE4; // type:object size:0xC -lbl_80519FF0 = .data:0x80519FF0; // type:object size:0xC -lbl_80519FFC = .data:0x80519FFC; // type:object size:0xC -lbl_8051A008 = .data:0x8051A008; // type:object size:0xC -lbl_8051A014 = .data:0x8051A014; // type:object size:0xC -lbl_8051A020 = .data:0x8051A020; // type:object size:0xC -lbl_8051A02C = .data:0x8051A02C; // type:object size:0xC -lbl_8051A038 = .data:0x8051A038; // type:object size:0xC -lbl_8051A044 = .data:0x8051A044; // type:object size:0xC -lbl_8051A050 = .data:0x8051A050; // type:object size:0xC -lbl_8051A05C = .data:0x8051A05C; // type:object size:0xC +lbl_80519F60 = .data:0x80519F60; // type:object size:0x17 data:string +lbl_80519F78 = .data:0x80519F78; // type:object size:0xB data:string +lbl_80519F84 = .data:0x80519F84; // type:object size:0xB data:string +lbl_80519F90 = .data:0x80519F90; // type:object size:0xB data:string +lbl_80519F9C = .data:0x80519F9C; // type:object size:0xB data:string +lbl_80519FA8 = .data:0x80519FA8; // type:object size:0xB data:string +lbl_80519FB4 = .data:0x80519FB4; // type:object size:0xB data:string +lbl_80519FC0 = .data:0x80519FC0; // type:object size:0xB data:string +lbl_80519FCC = .data:0x80519FCC; // type:object size:0xB data:string +lbl_80519FD8 = .data:0x80519FD8; // type:object size:0xB data:string +lbl_80519FE4 = .data:0x80519FE4; // type:object size:0xB data:string +lbl_80519FF0 = .data:0x80519FF0; // type:object size:0xB data:string +lbl_80519FFC = .data:0x80519FFC; // type:object size:0xB data:string +lbl_8051A008 = .data:0x8051A008; // type:object size:0xB data:string +lbl_8051A014 = .data:0x8051A014; // type:object size:0xB data:string +lbl_8051A020 = .data:0x8051A020; // type:object size:0xB data:string +lbl_8051A02C = .data:0x8051A02C; // type:object size:0xB data:string +lbl_8051A038 = .data:0x8051A038; // type:object size:0xB data:string +lbl_8051A044 = .data:0x8051A044; // type:object size:0xB data:string +lbl_8051A050 = .data:0x8051A050; // type:object size:0xB data:string +lbl_8051A05C = .data:0x8051A05C; // type:object size:0xB data:string lbl_8051A068 = .data:0x8051A068; // type:object size:0x1C data:string -lbl_8051A084 = .data:0x8051A084; // type:object size:0x14 +lbl_8051A084 = .data:0x8051A084; // type:object size:0xF data:string lbl_8051A098 = .data:0x8051A098; // type:object size:0x18 data:string -lbl_8051A0B0 = .data:0x8051A0B0; // type:object size:0x10 +lbl_8051A0B0 = .data:0x8051A0B0; // type:object size:0xB data:string lbl_8051A0C0 = .data:0x8051A0C0; // type:object size:0x18 data:string -lbl_8051A0D8 = .data:0x8051A0D8; // type:object size:0xC -lbl_8051A0E4 = .data:0x8051A0E4; // type:object size:0x1C -lbl_8051A100 = .data:0x8051A100; // type:object size:0x10 -lbl_8051A110 = .data:0x8051A110; // type:object size:0x18 -lbl_8051A128 = .data:0x8051A128; // type:object size:0xC -lbl_8051A134 = .data:0x8051A134; // type:object size:0x1C +lbl_8051A0D8 = .data:0x8051A0D8; // type:object size:0xB data:string +lbl_8051A0E4 = .data:0x8051A0E4; // type:object size:0x1B data:string +lbl_8051A100 = .data:0x8051A100; // type:object size:0xE data:string +lbl_8051A110 = .data:0x8051A110; // type:object size:0x17 data:string +lbl_8051A128 = .data:0x8051A128; // type:object size:0xA data:string +lbl_8051A134 = .data:0x8051A134; // type:object size:0x19 data:string lbl_8051A150 = .data:0x8051A150; // type:object size:0xC data:string -lbl_8051A15C = .data:0x8051A15C; // type:object size:0xC -lbl_8051A168 = .data:0x8051A168; // type:object size:0xC -lbl_8051A174 = .data:0x8051A174; // type:object size:0xC -lbl_8051A180 = .data:0x8051A180; // type:object size:0xC -lbl_8051A18C = .data:0x8051A18C; // type:object size:0xC -lbl_8051A198 = .data:0x8051A198; // type:object size:0xC -lbl_8051A1A4 = .data:0x8051A1A4; // type:object size:0xC -lbl_8051A1B0 = .data:0x8051A1B0; // type:object size:0xC -lbl_8051A1BC = .data:0x8051A1BC; // type:object size:0xC -lbl_8051A1C8 = .data:0x8051A1C8; // type:object size:0xC -lbl_8051A1D4 = .data:0x8051A1D4; // type:object size:0xC -lbl_8051A1E0 = .data:0x8051A1E0; // type:object size:0xC -lbl_8051A1EC = .data:0x8051A1EC; // type:object size:0xC -lbl_8051A1F8 = .data:0x8051A1F8; // type:object size:0xC -lbl_8051A204 = .data:0x8051A204; // type:object size:0xC -lbl_8051A210 = .data:0x8051A210; // type:object size:0xC -lbl_8051A21C = .data:0x8051A21C; // type:object size:0xC -lbl_8051A228 = .data:0x8051A228; // type:object size:0xC -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_8051A15C = .data:0x8051A15C; // type:object size:0xB data:string +lbl_8051A168 = .data:0x8051A168; // type:object size:0xB data:string +lbl_8051A174 = .data:0x8051A174; // type:object size:0xB data:string +lbl_8051A180 = .data:0x8051A180; // type:object size:0xB data:string +lbl_8051A18C = .data:0x8051A18C; // type:object size:0xB data:string +lbl_8051A198 = .data:0x8051A198; // type:object size:0xB data:string +lbl_8051A1A4 = .data:0x8051A1A4; // type:object size:0xB data:string +lbl_8051A1B0 = .data:0x8051A1B0; // type:object size:0xB data:string +lbl_8051A1BC = .data:0x8051A1BC; // type:object size:0xB data:string +lbl_8051A1C8 = .data:0x8051A1C8; // type:object size:0xB data:string +lbl_8051A1D4 = .data:0x8051A1D4; // type:object size:0xB data:string +lbl_8051A1E0 = .data:0x8051A1E0; // type:object size:0xB data:string +lbl_8051A1EC = .data:0x8051A1EC; // type:object size:0xB data:string +lbl_8051A1F8 = .data:0x8051A1F8; // type:object size:0xB data:string +lbl_8051A204 = .data:0x8051A204; // type:object size:0xB data:string +lbl_8051A210 = .data:0x8051A210; // type:object size:0xB data:string +lbl_8051A21C = .data:0x8051A21C; // type:object size:0xB data:string +lbl_8051A228 = .data:0x8051A228; // type:object size:0xB data:string +lbl_8051A234 = .data:0x8051A234; // type:object size:0xB data:string +lbl_8051A240 = .data:0x8051A240; // type:object size:0xB data:string +lbl_8051A2D8 = .data:0x8051A2D8; // type:object size:0xE data:string +__vt__16dLytMeterHeart_c = .data:0x8051A2E8; // type:object size:0x34 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 @@ -38179,7 +38179,7 @@ lbl_805724F8 = .sdata:0x805724F8; // type:object size:0x8 lbl_80572500 = .sdata:0x80572500; // type:object size:0x8 data:4byte lbl_80572508 = .sdata:0x80572508; // type:object size:0x8 lbl_80572510 = .sdata:0x80572510; // type:object size:0x8 data:4byte -lbl_80572518 = .sdata:0x80572518; // type:object size:0x8 +lbl_80572518 = .sdata:0x80572518; // type:object size:0x5 data:string lbl_80572520 = .sdata:0x80572520; // type:object size:0x8 data:string lbl_80572528 = .sdata:0x80572528; // type:object size:0x8 data:4byte lbl_80572530 = .sdata:0x80572530; // type:object size:0x8 data:4byte @@ -40387,7 +40387,7 @@ lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte lbl_80575938 = .sbss:0x80575938; // type:object size:0x4 data:float lbl_8057593C = .sbss:0x8057593C; // type:object size:0x4 data:float LYT_PAUSE_DISP = .sbss:0x80575940; // type:object size:0x8 data:4byte -lbl_80575948 = .sbss:0x80575948; // type:object size:0x8 data:4byte +sInstance__14dLytGameOver_c = .sbss:0x80575948; // type:object size:0x8 data:4byte LYT_SAVE_MGR = .sbss:0x80575950; // type:object size:0x8 data:4byte lbl_80575958 = .sbss:0x80575958; // type:object size:0x1 data:byte lbl_80575959 = .sbss:0x80575959; // type:object size:0x1 data:byte diff --git a/configure.py b/configure.py index c4fca040..e3c58189 100644 --- a/configure.py +++ b/configure.py @@ -402,7 +402,7 @@ config.libs = [ Object(NonMatching, "d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp"), 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(Matching, "d/lyt/meter/d_lyt_meter_heart.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"), diff --git a/include/d/lyt/d_lyt_game_over.h b/include/d/lyt/d_lyt_game_over.h new file mode 100644 index 00000000..391f0740 --- /dev/null +++ b/include/d/lyt/d_lyt_game_over.h @@ -0,0 +1,19 @@ +#ifndef D_LYT_GAME_OVER_H +#define D_LYT_GAME_OVER_H + +#include "d/d_base.h" + +class dLytGameOver_c : public dBase_c { +public: + dLytGameOver_c(); + virtual ~dLytGameOver_c(); + + static dLytGameOver_c *GetInstance() { + return sInstance; + } + +private: + static dLytGameOver_c *sInstance; +}; + +#endif diff --git a/include/d/lyt/meter/d_lyt_meter_heart.h b/include/d/lyt/meter/d_lyt_meter_heart.h index c1e60d93..27e34c71 100644 --- a/include/d/lyt/meter/d_lyt_meter_heart.h +++ b/include/d/lyt/meter/d_lyt_meter_heart.h @@ -39,16 +39,16 @@ private: /* 0x778 */ s32 mCurrentHealthCapacity; /* 0x77C */ s32 mStoredHealth; /* 0x780 */ s32 mStoredHealthCapacity; - /* 0x784 */ s32 field_0x784; - /* 0x788 */ s32 field_0x788; + /* 0x784 */ s32 mHealthCapacityIncreaseDelayTimer; + /* 0x788 */ s32 mEffectHeartIdx; /* 0x78C */ s32 field_0x78C; /* 0x790 */ s32 field_0x790; /* 0x794 */ u8 field_0x794; /* 0x795 */ u8 field_0x795; /* 0x796 */ u8 field_0x796; - /* 0x797 */ u8 field_0x797; - /* 0x798 */ u8 field_0x798; - /* 0x799 */ u8 field_0x799; + /* 0x797 */ bool field_0x797; + /* 0x798 */ bool mIsLoop; + /* 0x799 */ bool mIsDanger; /* 0x79A */ u8 field_0x79A; }; diff --git a/src/d/lyt/meter/d_lyt_meter_heart.cpp b/src/d/lyt/meter/d_lyt_meter_heart.cpp index 480fc46d..0c6ed76a 100644 --- a/src/d/lyt/meter/d_lyt_meter_heart.cpp +++ b/src/d/lyt/meter/d_lyt_meter_heart.cpp @@ -1,8 +1,15 @@ #include "d/lyt/meter/d_lyt_meter_heart.h" +#include "common.h" #include "d/a/d_a_player.h" +#include "d/d_sc_game.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_game_over.h" +#include "nw4r/math/math_types.h" +#include "toBeSorted/effects_struct.h" +#include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" +#include "toBeSorted/small_sound_mgr.h" static const d2d::LytBrlanMapping brlanMap[] = { { "heartAll_00_heat.brlan", "G_heart_00"}, @@ -77,14 +84,14 @@ bool dLytMeterHeart_c::build(d2d::ResAccIf_c *resAcc) { mCurrentHealthCapacity = 0; mStoredHealth = 0; mStoredHealthCapacity = 0; - field_0x784 = 0; - field_0x788 = -1; + mHealthCapacityIncreaseDelayTimer = 0; + mEffectHeartIdx = -1; field_0x78C = 0; field_0x790 = 0; field_0x794 = 0; field_0x797 = 0; - field_0x798 = 0; - field_0x799 = 0; + mIsLoop = false; + mIsDanger = false; field_0x79A = 0; mCurrentHealth = getCurrentHealth(); @@ -113,7 +120,7 @@ bool dLytMeterHeart_c::execute() { } executeInternal(); - if (field_0x798) { + if (mIsLoop) { if (!mAnm[HEART_ANIM_LOOP].isEnabled()) { mAnm[HEART_ANIM_LOOP].setFrame(0.0f); mAnm[HEART_ANIM_LOOP].setAnimEnable(true); @@ -126,7 +133,7 @@ bool dLytMeterHeart_c::execute() { } } - if (field_0x799) { + if (mIsDanger) { if (dAcPy_c::GetLink2()->getField_0x4564() == 1.0f) { if (!mAnm[HEART_ANIM_DANGER].isEnabled()) { mAnm[HEART_ANIM_DANGER].setAnimEnable(true); @@ -191,7 +198,7 @@ bool dLytMeterHeart_c::execute() { } } - if (field_0x799 && mAnm[HEART_ANIM_DANGER].isEndReached()) { + if (mIsDanger && mAnm[HEART_ANIM_DANGER].isEndReached()) { mAnm[HEART_ANIM_DANGER].setToEnd(); mAnm[HEART_ANIM_DANGER].setAnimEnable(false); } @@ -210,11 +217,160 @@ s32 dLytMeterHeart_c::getDisplayedHealthCapacity() const { } void dLytMeterHeart_c::realizeHeartsState() { - // TODO -} + s32 hearts = getNumDisplayedHearts(); + (void)getDisplayedHealthCapacity(); + s32 health = mStoredHealth; + s32 healthCapacity = mStoredHealthCapacity; + s32 numFilledHearts = health / 4; + s32 partialHeartFill = health % 4; // Wrong + s32 displayedFilledHearts = healthCapacity / 4; + s32 mNumTotalHeartsIncludingPartial = (getCurrentHealthCapacity() + 3) / 4; + if (displayedFilledHearts < mNumTotalHeartsIncludingPartial) { + mNumTotalHeartsIncludingPartial = displayedFilledHearts; + } + mIsLoop = false; + mIsDanger = false; + + for (int i = 0; i < HEART_NUM_HEARTS; i++) { + if (i < mNumTotalHeartsIncludingPartial) { + mpHeartPanes[i]->SetVisible(true); + if (i < displayedFilledHearts) { + if (i < hearts) { + if (numFilledHearts == 0 && partialHeartFill == 0) { + if (i == 0) { + mpMainPane->SetVisible(false); + } + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(1.0f); + } else if (i < numFilledHearts) { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(0.0f); + if (i == numFilledHearts - 1 && partialHeartFill == 0) { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(2.0f); + mpMainPane->SetVisible(true); + mpMainPane->SetTranslate(mpHeartPanes[i]->GetTranslate()); + mAnm[HEART_ANIM_MAIN].setFrame(4.0f); + if (dAcPy_c::GetLink2() != nullptr && + dAcPy_c::GetLink2()->hasLessThanQuarterHealth(false)) { + mIsDanger = true; + } else { + mIsLoop = true; + } + } else { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(0.0f); + } + } else if (i == numFilledHearts && partialHeartFill != 0) { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(2.0f); + mpMainPane->SetVisible(true); + mpMainPane->SetTranslate(mpHeartPanes[i]->GetTranslate()); + mAnm[HEART_ANIM_MAIN].setFrame(partialHeartFill); + if (dAcPy_c::GetLink2() != nullptr && dAcPy_c::GetLink2()->hasLessThanQuarterHealth(false)) { + mIsDanger = true; + } else { + mIsLoop = true; + } + } else { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(1.0f); + } + } else { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(1.0f); + } + } else { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(1.0f); + } + } else { + mpHeartPanes[i]->SetVisible(false); + } + } +} +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_972_; void dLytMeterHeart_c::executeInternal() { - // TODO + if (mEffectHeartIdx >= 0) { + nw4r::math::MTX34 mtx = mpHeartPanes[mEffectHeartIdx]->GetGlobalMtx(); + mVec3_c pos(mtx._03, mtx._13, 0.0f); + EffectsStruct::fn_800298C0(PARTICLE_RESOURCE_ID_MAPPING_972_, &pos, nullptr, nullptr, nullptr, nullptr); + SmallSoundManager::GetInstance()->playSound(SE_S_HEART_ADD); + mEffectHeartIdx = -1; + } + + // Redundant + if (!field_0x794) { + mCurrentHealth = getCurrentHealth(); + mCurrentHealthCapacity = getCurrentHealthCapacity(); + field_0x794 = 1; + } + + mCurrentHealthCapacity = getCurrentHealthCapacity(); + mCurrentHealth = getCurrentHealth(); + + if (field_0x796) { + for (int i = 0; i < HEART_NUM_HEARTS; i++) { + mAnm[i + HEART_ANIM_HEAT_OFFSET].setFrame(1.0f); + } + mLyt.calc(); + field_0x796 = 0; + } + + bool isDanger = dAcPy_c::GetLink2()->hasLessThanQuarterHealth(0); + bool healthDifferent = mStoredHealth != mCurrentHealth; + bool healthCapacityDifferent = mStoredHealthCapacity != mCurrentHealthCapacity; + if (healthCapacityDifferent && field_0x790 < 20) { + field_0x790 = 20; + } + if (healthDifferent || field_0x797 != isDanger) { + s32 current = mCurrentHealth; + if (mStoredHealth + 1 <= current) { + mStoredHealth = mStoredHealth + 1; + if (mpAlphaPane->IsVisible() && mpAlphaPane->GetGlobalAlpha() != 0 && mStoredHealth % 4 == 0 && + (!(dScGame_c::currentSpawnInfo.stageName == "F406") || dScGame_c::currentSpawnInfo.layer != 13) && + dLytGameOver_c::GetInstance() == nullptr) { + SmallSoundManager::GetInstance()->playSound(SE_S_HP_GAUGE_UP); + } + } else { + if (mStoredHealth - 1 >= current) { + mStoredHealth = mStoredHealth - 1; + if (EventManager::isInEvent() && !strcmp(EventManager::getCurrentEventName(), ("MoleF202Start")) && + mStoredHealth % 4 == 0) { + SmallSoundManager::GetInstance()->playSound(SE_S_HP_GAUGE_DOWN); + } + } + } + realizeHeartsState(); + if (healthDifferent && field_0x78C < 10) { + field_0x78C = 10; + } + field_0x797 = isDanger; + } else if (healthCapacityDifferent) { + if (mStoredHealthCapacity + 1 <= mCurrentHealthCapacity) { + if ((mStoredHealthCapacity + 1) % 4 == 0) { + if (mHealthCapacityIncreaseDelayTimer < 15) { + mHealthCapacityIncreaseDelayTimer += 1; + return; + } + mHealthCapacityIncreaseDelayTimer = 0; + } + mStoredHealthCapacity++; + if (mStoredHealthCapacity % 4 == 0) { + field_0x79A = 1; + } + } else { + if (mStoredHealthCapacity - 1 >= mCurrentHealthCapacity) { + mStoredHealthCapacity = mStoredHealthCapacity - 1; + } + } + if (field_0x79A && mStoredHealth > mCurrentHealthCapacity - 3) { + s32 numDisplayed = getNumDisplayedHearts(); + if (numDisplayed >= 1 && numDisplayed <= 20) { + mEffectHeartIdx = numDisplayed - 1; + field_0x79A = 0; + } + } + realizeHeartsState(); + if (field_0x78C < 20) { + field_0x78C = 20; + } + } else if (field_0x79A) { + field_0x79A = 0; + } } u8 dLytMeterHeart_c::getCurrentHealth() const {