From 8e5c06ea13140ddaeac8fa528b09f6a2765ec9dd Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 19 Apr 2025 12:38:35 +0200 Subject: [PATCH] dLytMeter_c::execute OK --- config/SOUE01/symbols.txt | 8 +- include/d/lyt/d_lyt_boss_gauge.h | 1 + include/d/lyt/d_lyt_unknowns.h | 8 + include/d/lyt/meter/d_lyt_meter.h | 18 +- include/d/lyt/meter/d_lyt_meter_heart.h | 3 +- include/d/lyt/meter/d_lyt_meter_parts.h | 6 +- include/d/lyt/meter/d_lyt_meter_rupy.h | 4 + .../d/lyt/meter/d_lyt_meter_shield_gauge.h | 8 + include/d/lyt/msg_window/d_lyt_msg_window.h | 8 + src/d/lyt/meter/d_lyt_meter.cpp | 216 +++++++++++++++++- src/d/lyt/meter/d_lyt_meter_key.cpp | 15 +- 11 files changed, 266 insertions(+), 29 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8ad20404..a0eac5fd 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4740,7 +4740,7 @@ __dt__16dLytMeterTimer_cFv = .text:0x800D4DE0; // type:function size:0xB4 __dt__14dLytSkyGauge_cFv = .text:0x800D4EA0; // type:function size:0x164 __dt__15dLytBirdGauge_cFv = .text:0x800D5010; // type:function size:0x164 __dt__15dLytBossGauge_cFv = .text:0x800D5180; // type:function size:0x108 -fn_800D5290 = .text:0x800D5290; // type:function size:0xB4 +fn_800D5290__11dLytMeter_cFv = .text:0x800D5290; // type:function size:0xB4 fn_800D5350 = .text:0x800D5350; // type:function size:0x30 fn_800D5380__11dLytMeter_cFUc = .text:0x800D5380; // type:function size:0x44 fn_800D53D0 = .text:0x800D53D0; // type:function size:0x50 @@ -4751,9 +4751,9 @@ fn_800D5630 = .text:0x800D5630; // type:function size:0x18 fn_800D5650__11dLytMeter_cFv = .text:0x800D5650; // type:function size:0x24 fn_800D5680__11dLytMeter_cFv = .text:0x800D5680; // type:function size:0x28 fn_800D56B0 = .text:0x800D56B0; // type:function size:0xFC -fn_800D57B0 = .text:0x800D57B0; // type:function size:0x1A58 +fn_800D57B0__11dLytMeter_cFv = .text:0x800D57B0; // type:function size:0x1A58 execute__11dLytMeter_cFv = .text:0x800D7210; // type:function size:0x92C -fn_800D7B40 = .text:0x800D7B40; // type:function size:0xC +fn_800D7B40__15dLytMsgWindow_cFv = .text:0x800D7B40; // type:function size:0xC draw__11dLytMeter_cFv = .text:0x800D7B50; // type:function size:0x128 getLyt__20LytMeterTimerPart1_cFv = .text:0x800D7C80; // type:function size:0x8 getLyt__20LytMeterTimerPart2_cFv = .text:0x800D7C90; // type:function size:0x8 @@ -8724,7 +8724,7 @@ fn_80158530 = .text:0x80158530; // type:function size:0x4 fn_80158540 = .text:0x80158540; // type:function size:0x80 fn_801585C0 = .text:0x801585C0; // type:function size:0x4 build__15dLytBossGauge_cFv = .text:0x801585D0; // type:function size:0x188 -fn_80158760 = .text:0x80158760; // type:function size:0x100 +execute__15dLytBossGauge_cFv = .text:0x80158760; // type:function size:0x100 draw__15dLytBossGauge_cFv = .text:0x80158860; // type:function size:0x68 remove__15dLytBossGauge_cFv = .text:0x801588D0; // type:function size:0x5C fn_80158930 = .text:0x80158930; // type:function size:0x10 diff --git a/include/d/lyt/d_lyt_boss_gauge.h b/include/d/lyt/d_lyt_boss_gauge.h index b1dd6cde..ab959bf7 100644 --- a/include/d/lyt/d_lyt_boss_gauge.h +++ b/include/d/lyt/d_lyt_boss_gauge.h @@ -12,6 +12,7 @@ public: bool build(); bool remove(); + bool execute(); bool draw(); private: diff --git a/include/d/lyt/d_lyt_unknowns.h b/include/d/lyt/d_lyt_unknowns.h index 806c4b9f..a6f22db2 100644 --- a/include/d/lyt/d_lyt_unknowns.h +++ b/include/d/lyt/d_lyt_unknowns.h @@ -54,6 +54,14 @@ public: } } + static void reset(DoButton_e button, Action_e value) { + LytDoButtonRelated *b = sInstance; + if (b != nullptr) { + b->field_0x04[button] = value; + b->field_0x34[button] = false; + } + } + static Action_e get(DoButton_e button) { if (sInstance != nullptr) { return sInstance->field_0x04[button]; diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index 62252b84..4c2e158e 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -71,9 +71,11 @@ public: bool fn_800CA040(); bool fn_800D5380(u8); + bool fn_800D5290(); bool fn_800D5650(); bool fn_800D5680(); bool fn_800D56B0(); + bool fn_800D57B0(); bool execute(); bool isSilentRealm(); @@ -145,12 +147,12 @@ public: /* 0x1374C */ s32 field_0x1374C; /* 0x13750 */ s32 field_0x13750; /* 0x13754 */ s32 field_0x13754; - /* 0x13758 */ s32 field_0x13758; - /* 0x1375C */ s32 field_0x1375C; - /* 0x13760 */ s32 field_0x13760; - /* 0x13764 */ s32 field_0x13764; - /* 0x13768 */ s32 field_0x13768; - /* 0x1376C */ s32 field_0x1376C; + /* 0x13758 */ s32 mShieldPosIndex; + /* 0x1375C */ s32 mRupyPosIndex; + /* 0x13760 */ s32 mRupyPosInterpFrame; + /* 0x13764 */ s32 mShieldPosInterpFrame; + /* 0x13768 */ s32 mOldShieldPosIndex; + /* 0x1376C */ s32 mOldRupyPosIndex; /* 0x13770 */ u8 field_0x13770; /* 0x13771 */ u8 field_0x13771; /* 0x13772 */ u8 field_0x13772; @@ -252,6 +254,10 @@ public: mFlags = mFlags & ~mask; } + void resetFlags() { + mFlags = 0xFFFFFFFF; + } + static s32 getCrossBtn0x7BF8() { if (sInstance != nullptr) { return sInstance->mMeter.mCrossBtn.getField_0x620(); diff --git a/include/d/lyt/meter/d_lyt_meter_heart.h b/include/d/lyt/meter/d_lyt_meter_heart.h index c89fe181..bd16388b 100644 --- a/include/d/lyt/meter/d_lyt_meter_heart.h +++ b/include/d/lyt/meter/d_lyt_meter_heart.h @@ -26,9 +26,10 @@ public: return field_0x78C; } + u8 getCurrentHealthCapacity() const; + private: u8 getCurrentHealth() const; - u8 getCurrentHealthCapacity() const; void realizeHeartsState(); void executeInternal(); s32 getNumDisplayedHearts() const; diff --git a/include/d/lyt/meter/d_lyt_meter_parts.h b/include/d/lyt/meter/d_lyt_meter_parts.h index 871d2b94..459ab21b 100644 --- a/include/d/lyt/meter/d_lyt_meter_parts.h +++ b/include/d/lyt/meter/d_lyt_meter_parts.h @@ -99,6 +99,10 @@ public: mpAnm2 = outAnm; } + void setShouldBeVisible(bool val) { + mShouldBeVisible = val; + } + private: STATE_FUNC_DECLARE(dLytMeterParts_c, Invisible); STATE_FUNC_DECLARE(dLytMeterParts_c, In); @@ -109,7 +113,7 @@ private: /* 0x3C */ d2d::AnmGroup_c *mpAnm1; /* 0x40 */ d2d::AnmGroup_c *mpAnm2; /* 0x44 */ s32 mIndex; - /* 0x48 */ u8 mShouldBeVisible; + /* 0x48 */ bool mShouldBeVisible; }; #endif diff --git a/include/d/lyt/meter/d_lyt_meter_rupy.h b/include/d/lyt/meter/d_lyt_meter_rupy.h index fc33335d..f2d3c06c 100644 --- a/include/d/lyt/meter/d_lyt_meter_rupy.h +++ b/include/d/lyt/meter/d_lyt_meter_rupy.h @@ -93,6 +93,10 @@ public: field_0x8A9 = val; } + u8 getField_0x8A9() const { + return field_0x8A9; + } + void setField_0x8AA(u8 val) { field_0x8AA = val; } 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 13568143..12a4d730 100644 --- a/include/d/lyt/meter/d_lyt_meter_shield_gauge.h +++ b/include/d/lyt/meter/d_lyt_meter_shield_gauge.h @@ -31,6 +31,14 @@ public: mpOwnerPane = pane; } + f32 getGaugePercentMaybe() const { + return field_0x2E0; + } + + void setfield_0x318(s32 v) { + field_0x318 = v; + } + private: s32 getLytFrameForShield(s32) const; void setLevel(f32 level); diff --git a/include/d/lyt/msg_window/d_lyt_msg_window.h b/include/d/lyt/msg_window/d_lyt_msg_window.h index ad6be3c2..7c8ad633 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window.h @@ -50,6 +50,14 @@ public: const char *fn_80117390(bool) const; + // This function appears to be related to a compiler quirk. + // 0x800D7B40 is in d_lyt_meter, but calling a static method + // on an instance via dLytMsgWindow_c::getInstance()->fn_800D7B40() + // causes the method to be emitted there. + static u16 fn_800D7B40() { + return sInstance->mEntryPointToTrigger; + } + private: bool setTextToDisplay(const wchar_t *text); void createSubMsgManager(u8 type); diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 987c6609..9610abca 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -1,4 +1,5 @@ // clang-format off +#include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" #include "d/d_message.h" @@ -9,8 +10,10 @@ #include "d/lyt/d_lyt_area_caption.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_meter_configuration.h" +#include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/d_window.h" #include "d/lyt/meter/d_lyt_meter.h" +#include "d/lyt/msg_window/d_lyt_msg_window.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_group.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" @@ -644,10 +647,10 @@ bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) { mShieldPositions[0].copyFrom(mLyt.findPane("N_shield_00")->GetTranslate()); mShieldPositions[1].copyFrom(mLyt.findPane("N_shield_01")->GetTranslate()); - field_0x13758 = 0; - field_0x13768 = 0; - field_0x13764 = 0; - mShieldPos = mShieldPositions[field_0x13764]; + mShieldPosIndex = 0; + mOldShieldPosIndex = 0; + mShieldPosInterpFrame = 0; + mShieldPos = mShieldPositions[mShieldPosIndex]; mLyt.findPane("N_rupyAll_00")->SetVisible(true); mAnmGroups[METER_ANIM_RUPY_POSITION].setAnimEnable(true); @@ -662,10 +665,10 @@ bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) { mAnmGroups[METER_ANIM_RUPY_POSITION].setAnimEnable(false); mLyt.findPane("N_rupyAll_00")->SetVisible(false); - field_0x1375C = 0; - field_0x1376C = 0; - field_0x13760 = 0; - mRupyPos = mRupyPositions[field_0x13760]; + mRupyPosIndex = 0; + mOldRupyPosIndex = 0; + mRupyPosInterpFrame = 0; + mRupyPos = mRupyPositions[mRupyPosIndex]; mPos3.x = mPos3.y = mPos3.z = 0.0f; field_0x137C0 = 0x3C; @@ -946,6 +949,203 @@ bool dLytMeter_c::remove() { return true; } +bool dLytMeter_c::execute() { + dLytMeterContainer_c *container = dLytMeterContainer_c::GetInstance(); + if (field_0x13775 && !EventManager::isInEvent()) { + field_0x13775 = 0; + } + + if (isSilentRealm()) { + container->clearFlags(0x40); + container->clearFlags(0xF); + } + + if (dStageMgr_c::GetInstance()->isInLastBoss()) { + container->clearFlags(0x20); + } + + if (field_0x13750 != 0 && field_0x13748 == 1) { + fn_800D5290(); + } + + fn_800D57B0(); + + s32 heartsHeight; + s32 rupeePos; + s32 kakeraKeyPos; + s32 bossKeyPos; + s32 smallKeyPos; + + if (mHeart.getCurrentHealthCapacity() / 4 <= 10) { + heartsHeight = 0; + if (mShield.getGaugePercentMaybe() > 0.0f && + (mLyt.findPane("N_shieldAll_00")->IsVisible() || isNotSilentRealmOrLoftwing())) { + rupeePos = 0; + kakeraKeyPos = 1; + bossKeyPos = 1; + smallKeyPos = 1; + } else { + rupeePos = 2; + kakeraKeyPos = 0; + bossKeyPos = 0; + smallKeyPos = 0; + } + } else { + heartsHeight = 1; + if (mShield.getGaugePercentMaybe() > 0.0f && + (mLyt.findPane("N_shieldAll_00")->IsVisible() || isNotSilentRealmOrLoftwing())) { + rupeePos = 1; + kakeraKeyPos = 1; + bossKeyPos = 3; + smallKeyPos = 3; + } else { + rupeePos = 4; + kakeraKeyPos = 0; + bossKeyPos = 2; + smallKeyPos = 2; + } + } + + if (dMessage_c::getInstance()->getField_0x2FC() != 0) { + rupeePos = 3; + if (dLytMsgWindow_c::getInstance() != nullptr && (dLytMsgWindow_c::getInstance()->fn_800D7B40() == 0x9E02 || + dLytMsgWindow_c::getInstance()->fn_800D7B40() == 0x768C)) { + s32 off = -(mHeart.getCurrentHealthCapacity() / 4 <= 10); + rupeePos = 6 + off; + } + } + + if (mShieldPosIndex != heartsHeight) { + mOldShieldPosIndex = mShieldPosIndex; + mShieldPosIndex = heartsHeight; + mShieldPosInterpFrame = 0; + } + + if (mRupyPosIndex != rupeePos) { + mOldRupyPosIndex = mRupyPosIndex; + mRupyPosIndex = rupeePos; + mRupyPosInterpFrame = 0; + } + + if (mpKakeraKey != nullptr) { + mpKakeraKey->setPosition(kakeraKeyPos); + } + + if (mpBossKey != nullptr) { + mpBossKey->setPosition(bossKeyPos); + } + + if (mpSmallKey != nullptr) { + mpSmallKey->setPosition(smallKeyPos); + } + + if (mShieldPos != mShieldPositions[mShieldPosIndex]) { + if (mShieldPosInterpFrame < 5) { + mVec3_c diff = mShieldPositions[mShieldPosIndex] - mShieldPositions[mOldShieldPosIndex]; + mShieldPos = + diff * cLib::easeOut(++mShieldPosInterpFrame / 5.0f, 3.0f) + mShieldPositions[mOldShieldPosIndex]; + } else { + mShieldPosInterpFrame = 0; + mShieldPos = mShieldPositions[mShieldPosIndex]; + } + mNodes[METER_SHIELD].mpPane->SetTranslate(mShieldPos); + } + + if (field_0x13748 != field_0x1374C) { + field_0x1374C = field_0x13748; + mAnmGroups[METER_ANIM_POSITION].setFrame(field_0x13748); + mAnmGroups[METER_ANIM_POSITION].setAnimEnable(true); + } + + for (int i = 0; i < METER_NUM_PANES; i++) { + bool visible = true; + if (!field_0x137A2[i]) { + bool b = field_0x13782[i] && field_0x13792[i]; + if (!b) { + visible = false; + } + } + mParts[i].setShouldBeVisible(visible); + mParts[i].execute(); + } + + if (mRupyPos != mRupyPositions[mRupyPosIndex]) { + mShield.setfield_0x318(2); + if (mRupy.getField_0x8A9() == 1) { + mRupyPosInterpFrame = 5; + } + if (mRupyPosInterpFrame < 5) { + mVec3_c diff = mRupyPositions[mRupyPosIndex] - mRupyPositions[mOldRupyPosIndex]; + mRupyPos = diff * cLib::easeOut(++mRupyPosInterpFrame / 5.0f, 3.0f) + mRupyPositions[mOldRupyPosIndex]; + } else { + mRupyPosInterpFrame = 0; + mRupyPos = mRupyPositions[mRupyPosIndex]; + } + mNodes[METER_RUPY].mpPane->SetTranslate(mRupyPos); + } + + for (int i = 0; i < METER_NUM_PANES; i++) { + if (mNodes[i].mpLytPane != nullptr) { + mNodes[i].mpLytPane->execute(); + } + } + + mLyt.calc(); + mItemSelect.fn_800EF580(); + + if (mAnmGroups[METER_ANIM_POSITION].isEnabled()) { + mAnmGroups[METER_ANIM_POSITION].setAnimEnable(false); + } + + container->resetFlags(); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::DO_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_B, LytDoButtonRelated::DO_NONE); + + LytDoButtonRelated::fn_8010EC10(LytDoButtonRelated::DO_NONE, true); + LytDoButtonRelated::fn_8010ED50(LytDoButtonRelated::DO_NONE, true); + + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::DO_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::DO_NONE); + + LytDoButtonRelated::reset(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::DO_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::DO_NONE); + LytDoButtonRelated::reset(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::DO_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_BG, LytDoButtonRelated::DO_NONE); + + if (mpTimer != nullptr) { + mpTimer->execute(); + } + if (mpTimerPart1 != nullptr) { + mpTimerPart1->execute(); + } + if (mpTimerPart2 != nullptr) { + mpTimerPart2->execute(); + } + if (mpSkyGauge != nullptr) { + mpSkyGauge->execute(); + } + if (mpBirdGauge != nullptr) { + mpBirdGauge->execute(); + } + if (mpBossGauge != nullptr) { + mpBossGauge->execute(); + } + if (mpKakeraKey != nullptr) { + mpKakeraKey->execute(); + } + if (mpBossKey != nullptr) { + mpBossKey->execute(); + } + if (mpSmallKey != nullptr) { + mpSmallKey->execute(); + } + if (mpDrink != nullptr) { + mpDrink->execute(); + } + + return true; +} + bool dLytMeter_c::draw() { mLyt.addToDrawList(); if (mpTimerPart1 != nullptr) { diff --git a/src/d/lyt/meter/d_lyt_meter_key.cpp b/src/d/lyt/meter/d_lyt_meter_key.cpp index 6feb5957..824d4f10 100644 --- a/src/d/lyt/meter/d_lyt_meter_key.cpp +++ b/src/d/lyt/meter/d_lyt_meter_key.cpp @@ -173,9 +173,8 @@ bool dLytMeterKakeraKey_c::execute() { mStateMgr.executeState(); if (mPosition != mPanePositions[mPosititionIndex]) { if (mMovementFrame < 5) { - mPosition = (mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]) * - cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + - mPanePositions[mOldPosititionIndex]; + mVec3_c diff = mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]; + mPosition = diff * cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + mPanePositions[mOldPosititionIndex]; } else { mMovementFrame = 0; mPosition = mPanePositions[mPosititionIndex]; @@ -337,9 +336,8 @@ bool dLytMeterBossKey_c::execute() { if (mPosition != mPanePositions[mPosititionIndex]) { if (mMovementFrame < 5) { - mPosition = (mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]) * - cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + - mPanePositions[mOldPosititionIndex]; + mVec3_c diff = mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]; + mPosition = diff * cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + mPanePositions[mOldPosititionIndex]; } else { mMovementFrame = 0; mPosition = mPanePositions[mPosititionIndex]; @@ -494,9 +492,8 @@ bool dLytMeterSmallKey_c::execute() { if (mPosition != mPanePositions[mPosititionIndex]) { if (mMovementFrame < 5) { - mPosition = (mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]) * - cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + - mPanePositions[mOldPosititionIndex]; + mVec3_c diff = mPanePositions[mPosititionIndex] - mPanePositions[mOldPosititionIndex]; + mPosition = diff * cLib::easeOut(++mMovementFrame / 5.0f, 3.0f) + mPanePositions[mOldPosititionIndex]; } else { mMovementFrame = 0; mPosition = mPanePositions[mPosititionIndex];