From 75d444475b83bc4066754bf366686fa7eae2a1ee Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 8 Jan 2026 20:45:44 -0800 Subject: [PATCH] Match and link CIceBeam --- config/GM8E01_01/symbols.txt | 2 +- configure.py | 2 +- include/MetroidPrime/Weapons/CGameProjectile.hpp | 2 +- include/MetroidPrime/Weapons/CGunWeapon.hpp | 4 +++- src/MetroidPrime/Weapons/CIceBeam.cpp | 9 ++++----- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/config/GM8E01_01/symbols.txt b/config/GM8E01_01/symbols.txt index 5c60731a..63e1ffa8 100644 --- a/config/GM8E01_01/symbols.txt +++ b/config/GM8E01_01/symbols.txt @@ -18259,7 +18259,7 @@ __vt__41TObjOwnerDerivedFromIObj<13CStateMachine> = .data:0x803DF8E0; // type:ob __vt__11CPlasmaBeam = .data:0x803DF8F0; // type:object size:0x44 __vt__10CPowerBeam = .data:0x803DF938; // type:object size:0x44 lbl_803DF980 = .data:0x803DF980; // type:object size:0x48 -lbl_803DF9C8 = .data:0x803DF9C8; // type:object size:0x48 +__vt__8CIceBeam = .data:0x803DF9C8; // type:object size:0x48 __vt__12CScriptRelay = .data:0x803DFA10; // type:object size:0x20 lbl_803DFA30 = .data:0x803DFA30; // type:object size:0x20 lbl_803DFA50 = .data:0x803DFA50; // type:object size:0x20 diff --git a/configure.py b/configure.py index a4ddd750..e065401f 100755 --- a/configure.py +++ b/configure.py @@ -580,7 +580,7 @@ config.libs = [ "MetroidPrime/Weapons/CPowerBeam.cpp", ), Object(NonMatching, "MetroidPrime/Weapons/CWaveBeam.cpp"), - Object(NonMatching, "MetroidPrime/Weapons/CIceBeam.cpp"), + Object(MatchingFor("GM8E01_00", "GM8E01_01"), "MetroidPrime/Weapons/CIceBeam.cpp"), Object( MatchingFor("GM8E01_00", "GM8E01_01"), "MetroidPrime/CScriptMailbox.cpp" ), diff --git a/include/MetroidPrime/Weapons/CGameProjectile.hpp b/include/MetroidPrime/Weapons/CGameProjectile.hpp index fa875367..c36e7025 100644 --- a/include/MetroidPrime/Weapons/CGameProjectile.hpp +++ b/include/MetroidPrime/Weapons/CGameProjectile.hpp @@ -32,7 +32,7 @@ public: const ushort visorSfx, bool sendCollideMsg); // CEntity - ~CGameProjectile() override {} + ~CGameProjectile() override; // Remove this when possible void Accept(IVisitor& visitor) override; void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override; diff --git a/include/MetroidPrime/Weapons/CGunWeapon.hpp b/include/MetroidPrime/Weapons/CGunWeapon.hpp index cf6996eb..82fa3747 100644 --- a/include/MetroidPrime/Weapons/CGunWeapon.hpp +++ b/include/MetroidPrime/Weapons/CGunWeapon.hpp @@ -10,7 +10,6 @@ #include "MetroidPrime/Weapons/WeaponCommon.hpp" #include "MetroidPrime/Weapons/WeaponTypes.hpp" - #include "Kyoto/Math/CAABox.hpp" #include "Kyoto/Math/CVector3f.hpp" #include "Kyoto/TToken.hpp" @@ -60,6 +59,7 @@ private: }; class CGunWeapon { + public: CGunWeapon(CAssetId ancsId, EWeaponType type, TUniqueId playerId, EMaterialTypes playerMaterial, const CVector3f& scale); @@ -125,6 +125,8 @@ public: float chargeFactor); CDamageInfo GetShotDamageInfo(const SShotParam& shotParam, CStateManager& mgr) const; + static const char* GetMuzzleLocator() { return skMuzzleLocator; } + protected: // x0 is vtable CVector3f x4_scale; diff --git a/src/MetroidPrime/Weapons/CIceBeam.cpp b/src/MetroidPrime/Weapons/CIceBeam.cpp index 79de448a..bd2581bb 100644 --- a/src/MetroidPrime/Weapons/CIceBeam.cpp +++ b/src/MetroidPrime/Weapons/CIceBeam.cpp @@ -44,12 +44,11 @@ void CIceBeam::PostRenderGunFx(const CStateManager& mgr, const CTransform4f& xf) CElementGen::SetSubtractBlend(false); } -static const char* LBEAM = "LBEAM"; - void CIceBeam::UpdateGunFx(bool shotSmoke, float dt, const CStateManager& mgr, const CTransform4f& xf) { if (x240_smokeGen.get()) { - CTransform4f beamLoc = x10_solidModelData->GetScaledLocatorTransform(rstl::string_l(LBEAM)); + CTransform4f beamLoc = + x10_solidModelData->GetScaledLocatorTransform(rstl::string_l(GetMuzzleLocator())); x240_smokeGen->SetTranslation(beamLoc.GetTranslation()); x240_smokeGen->SetOrientation(beamLoc.GetRotation()); x240_smokeGen->Update(dt); @@ -78,7 +77,7 @@ void CIceBeam::Update(float dt, CStateManager& mgr) { CGunWeapon::Update(dt, mgr); if (!x248_24_loaded) { - x248_24_loaded = x21c_iceSmoke.IsLoaded() && x228_ice2nd1.IsLoaded() && x234_ice2nd2.IsLoaded(); + x248_24_loaded = x21c_iceSmoke.TryCache() && x228_ice2nd1.TryCache() && x234_ice2nd2.TryCache(); if (x248_24_loaded) { x240_smokeGen = rs_new CElementGen(x21c_iceSmoke); x240_smokeGen->SetGlobalScale(x4_scale); @@ -90,7 +89,7 @@ void CIceBeam::Update(float dt, CStateManager& mgr) { void CIceBeam::Fire(bool underwater, float dt, CPlayerState::EChargeStage chargeState, const CTransform4f& xf, CStateManager& mgr, TUniqueId homingTarget, float chargeFactor1, float chargeFactor2) { - static ushort soundId[2] = {SFXwpn_fire_ice_normal, SFXwpn_fire_ice_charged}; + static const ushort soundId[2] = {SFXwpn_fire_ice_normal, SFXwpn_fire_ice_charged}; CGunWeapon::Fire(underwater, dt, chargeState, xf, mgr, homingTarget, chargeFactor1, chargeFactor2);