d_lyt_meter_heart OK

This commit is contained in:
robojumper
2025-04-17 10:36:36 +02:00
parent e8e3de41a1
commit eb32c18c39
6 changed files with 245 additions and 69 deletions
+1
View File
@@ -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:
+53 -53
View File
@@ -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
+1 -1
View File
@@ -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"),
+19
View File
@@ -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
+5 -5
View File
@@ -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;
};
+166 -10
View File
@@ -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 {