diff --git a/Runtime/CBasics.hpp b/Runtime/CBasics.hpp index 32f24a297..508361231 100644 --- a/Runtime/CBasics.hpp +++ b/Runtime/CBasics.hpp @@ -66,6 +66,8 @@ public: static void Swap8Bytes(u8* v); static int RecursiveMakeDir(const char* dir); static void MakeDir(const char* dir); + static bool IsDir(const char* path); + static bool IsFile(const char* path); static int Stat(const char* path, Sstat* statOut); }; diff --git a/Runtime/CBasicsPC.cpp b/Runtime/CBasicsPC.cpp index 2c7f4a579..0d78f70f4 100644 --- a/Runtime/CBasicsPC.cpp +++ b/Runtime/CBasicsPC.cpp @@ -360,4 +360,18 @@ void CBasics::MakeDir(const char* dir) { #endif } +bool CBasics::IsDir(const char* path) { + Sstat theStat; + Stat(path, &theStat); + + return S_ISDIR(theStat.st_mode); +} + +bool CBasics::IsFile(const char* path) { + Sstat theStat; + Stat(path, &theStat); + + return S_ISREG(theStat.st_mode); +} + } // namespace metaforce diff --git a/Runtime/CMain.cpp b/Runtime/CMain.cpp index 4217088e8..0e9ce3a65 100644 --- a/Runtime/CMain.cpp +++ b/Runtime/CMain.cpp @@ -197,9 +197,10 @@ public: #if TARGET_OS_IOS || TARGET_OS_TV m_deferredProject = std::string{m_fileMgr.getStoreRoot()} + "game.iso"; #else + bool inArg = false; for (int i = 1; i < m_argc; ++i) { std::string arg = m_argv[i]; - if (m_deferredProject.empty() && !arg.starts_with('-') && !arg.starts_with('+')) + if (m_deferredProject.empty() && !arg.starts_with('-') && !arg.starts_with('+') && CBasics::IsDir(arg.c_str())) m_deferredProject = arg; else if (arg == "--no-sound") m_voiceEngine->setVolume(0.f); diff --git a/Runtime/CMayaSpline.cpp b/Runtime/CMayaSpline.cpp index 583877a01..5f90b5c20 100644 --- a/Runtime/CMayaSpline.cpp +++ b/Runtime/CMayaSpline.cpp @@ -222,7 +222,7 @@ float CMayaSpline::EvaluateAtUnclamped(float time) { } return EvaluateInfinities(time, true); } else if (x8_knots[lastIdx].GetTime() >= time) { - bool bVar2 = false; + bVar2 = false; s32 local_68 = -1; s32 iVar1 = x24_chachedKnotIndex; if (iVar1 != -1) { diff --git a/Runtime/MP1/World/CElitePirate.hpp b/Runtime/MP1/World/CElitePirate.hpp index 03f99770b..9340b102f 100644 --- a/Runtime/MP1/World/CElitePirate.hpp +++ b/Runtime/MP1/World/CElitePirate.hpp @@ -196,7 +196,7 @@ public: virtual bool IsElitePirate() const { return true; } virtual void SetupHealthInfo(CStateManager& mgr); virtual void SetLaunchersActive(CStateManager& mgr, bool val); - virtual SShockWaveData GetShockWaveData() const { + virtual CShockWaveInfo GetShockWaveData() const { return {x5d8_data.GetShockwaveParticleDescId(), x5d8_data.GetShockwaveDamageInfo(), 16.5217f, x5d8_data.GetShockwaveWeaponDescId(), x5d8_data.GetShockwaveElectrocuteSfxId()}; } diff --git a/Runtime/MP1/World/CMetroidPrimeEssence.cpp b/Runtime/MP1/World/CMetroidPrimeEssence.cpp index b4d4c97a6..3fb1ecfa0 100644 --- a/Runtime/MP1/World/CMetroidPrimeEssence.cpp +++ b/Runtime/MP1/World/CMetroidPrimeEssence.cpp @@ -179,7 +179,7 @@ void CMetroidPrimeEssence::DoUserAnimEvent(CStateManager& mgr, const CInt32POINo switch (type) { case EUserEventType::EggLay: { - if (x70e_29_ && x6d8_ != 0 && x6e4_ < x6f8_) { + if (x70e_29_ && x6d8_ != 0 && x6e4_spawnedAiCount < x6f8_maxSpawnedCount) { const float ang1 = zeus::degToRad(22.5f) * mgr.GetActiveRandom()->Range(-1, 1); const float ang2 = zeus::degToRad(45.0f) * mgr.GetActiveRandom()->Range(-1, 1); zeus::CVector3f pos = @@ -203,9 +203,9 @@ void CMetroidPrimeEssence::DoUserAnimEvent(CStateManager& mgr, const CInt32POINo return; } case EUserEventType::BeginAction: { - SShockWaveData data(x660_, x698_, 2.f, x664_, x70c_); + CShockWaveInfo data(x660_, x698_, 2.f, x664_, x70c_); data.SetSpeedIncrease(180.f); - DropShockwave(mgr, data); + CreateShockWave(mgr, data); ShakeCamera(mgr, 1.f); return; } @@ -290,7 +290,7 @@ void CMetroidPrimeEssence::Skid(CStateManager& mgr, EStateMsg msg, float dt) { void CMetroidPrimeEssence::FadeIn(CStateManager& mgr, EStateMsg msg, float dt) { if (msg == EStateMsg::Activate) { - x6f8_ = sub8027d428(); + x6f8_maxSpawnedCount = GetMaxSpawnCount(mgr); x32c_animState = EAnimState::Ready; x70e_24_ = true; } else if (msg == EStateMsg::Update) { @@ -537,7 +537,7 @@ void CMetroidPrimeEssence::ShakeCamera(CStateManager& mgr, float f1) { mgr.GetCameraManager()->AddCameraShaker(CCameraShakeData(0.5f, mag), true); } -void CMetroidPrimeEssence::DropShockwave(CStateManager& mgr, const SShockWaveData& shockWaveData) { +void CMetroidPrimeEssence::CreateShockWave(CStateManager& mgr, const CShockWaveInfo& shockWaveData) { CRayCastResult res = RayStaticIntersection(mgr); if (res.IsInvalid()) { return; @@ -616,7 +616,7 @@ void CMetroidPrimeEssence::CountListeningAi(CStateManager& mgr) { for (auto* ent : mgr.GetListeningAiObjectList()) { if (TCastToPtr ai = ent) { if (ai != this && ai->GetActive() && ai->GetAreaIdAlways() == GetAreaIdAlways()) { - ++x6e4_; + ++x6e4_spawnedAiCount; } } } diff --git a/Runtime/MP1/World/CMetroidPrimeEssence.hpp b/Runtime/MP1/World/CMetroidPrimeEssence.hpp index 283a74445..535e5c724 100644 --- a/Runtime/MP1/World/CMetroidPrimeEssence.hpp +++ b/Runtime/MP1/World/CMetroidPrimeEssence.hpp @@ -27,12 +27,12 @@ class CMetroidPrimeEssence : public CPatterned { u32 x6d8_ = 0; u32 x6dc_ = 0; u32 x6e0_ = x6dc_; - u32 x6e4_ = 0; + u32 x6e4_spawnedAiCount = 0; u32 x6e8_ = 2; u32 x6ec_ = 4; u32 x6f0_ = 0; u32 x6f4_ = x6e8_ - 1; - u32 x6f8_ = 2; + u32 x6f8_maxSpawnedCount = 2; u32 x6fc_ = 0; u32 x700_ = 1; TUniqueId x704_bossUtilityWaypointId = kInvalidUniqueId; @@ -55,9 +55,9 @@ class CMetroidPrimeEssence : public CPatterned { void sub8027cee0(CStateManager& mgr); u32 sub8027cfd4(CStateManager& mgr, bool w1); void DoPhaseTransition(CStateManager& mgr); - u32 sub8027d428() { return 2; /* Decided by fair dice roll, guaranteed to be random */ } + u32 GetMaxSpawnCount(CStateManager& mgr) { return 2; } void ShakeCamera(CStateManager& mgr, float f1); - void DropShockwave(CStateManager& mgr, const SShockWaveData& shockWaveData); + void CreateShockWave(CStateManager& mgr, const CShockWaveInfo& shockWaveData); CRayCastResult RayStaticIntersection(CStateManager& mgr); void SetParticleEffectState(CStateManager& mgr, bool active); void sub8027d824(CStateManager& mgr); diff --git a/Runtime/MP1/World/CMetroidPrimeExo.cpp b/Runtime/MP1/World/CMetroidPrimeExo.cpp index 1e3c8ebeb..dd08d92dd 100644 --- a/Runtime/MP1/World/CMetroidPrimeExo.cpp +++ b/Runtime/MP1/World/CMetroidPrimeExo.cpp @@ -271,7 +271,7 @@ SPrimeExoParameters::SPrimeExoParameters(CInputStream& in) , xa28_particle4(in.Get()) , xa2c_(LoadPrimeStruct6s(in)) {} -SPrimeExoRoomParameters::SPrimeExoRoomParameters(CInputStream& in) { +CMetroidPrimeAttackWeights::CMetroidPrimeAttackWeights(CInputStream& in) { u32 propCount = std::min(14, in.ReadLong()); for (u32 i = 0; i < propCount; ++i) { x0_.push_back(in.ReadFloat()); @@ -1292,7 +1292,7 @@ void CMetroidPrimeExo::sub802759a8(CStateManager& mgr, u32 w1) { } } -float CMetroidPrimeExo::sub80275b04(const SPrimeExoRoomParameters& roomParms, int w2) { +float CMetroidPrimeExo::sub80275b04(const CMetroidPrimeAttackWeights& roomParms, int w2) { float dVar1 = 0.f; if (!zeus::close_enough(0.f, x1258_[w2])) { const float tmpFloat = roomParms.GetFloatValue(w2); diff --git a/Runtime/MP1/World/CMetroidPrimeExo.hpp b/Runtime/MP1/World/CMetroidPrimeExo.hpp index 5a843e5e7..c0dced83b 100644 --- a/Runtime/MP1/World/CMetroidPrimeExo.hpp +++ b/Runtime/MP1/World/CMetroidPrimeExo.hpp @@ -82,9 +82,9 @@ struct SPrimeExoParameters { explicit SPrimeExoParameters(CInputStream& in); }; -struct SPrimeExoRoomParameters { +struct CMetroidPrimeAttackWeights { rstl::reserved_vector x0_; - explicit SPrimeExoRoomParameters(CInputStream& in); + explicit CMetroidPrimeAttackWeights(CInputStream& in); float GetFloatValue(size_t idx) const { return x0_[idx]; } }; @@ -191,7 +191,7 @@ class CMetroidPrimeExo : public CPatterned { float x1084_ = 0.f; float x1088_ = 0.f; CCameraShakeData x108c_; - rstl::reserved_vector x1160_; + rstl::reserved_vector x1160_; s32 x1254_ = -1; rstl::reserved_vector x1258_; CCameraShakeData x1294_; @@ -222,7 +222,7 @@ class CMetroidPrimeExo : public CPatterned { void UpdateTimers(float mgr); void sub80275800(CStateManager& mgr); void sub802759a8(CStateManager& mgr, u32 w1); - float sub80275b04(const SPrimeExoRoomParameters& roomParms, int w2); + float sub80275b04(const CMetroidPrimeAttackWeights& roomParms, int w2); void sub80275b68(); void sub80275c60(CStateManager& mgr, int w1); bool sub80275d68(int w1); diff --git a/Runtime/MP1/World/CMetroidPrimeRelay.cpp b/Runtime/MP1/World/CMetroidPrimeRelay.cpp index 43f7d934a..b496755c6 100644 --- a/Runtime/MP1/World/CMetroidPrimeRelay.cpp +++ b/Runtime/MP1/World/CMetroidPrimeRelay.cpp @@ -10,7 +10,7 @@ CMetroidPrimeRelay::CMetroidPrimeRelay(TUniqueId uid, std::string_view name, con const zeus::CTransform& xf, const zeus::CVector3f& scale, SPrimeExoParameters&& parms, float f1, float f2, float f3, u32 w1, bool b1, u32 w2, const CHealthInfo& hInfo1, const CHealthInfo& hInfo2, u32 w3, u32 w4, - u32 w5, rstl::reserved_vector&& roomParms) + u32 w5, rstl::reserved_vector&& roomParms) : CEntity(uid, info, active, name) , x38_xf(xf) , x68_scale(scale) diff --git a/Runtime/MP1/World/CMetroidPrimeRelay.hpp b/Runtime/MP1/World/CMetroidPrimeRelay.hpp index 54f734954..efdc56c5b 100644 --- a/Runtime/MP1/World/CMetroidPrimeRelay.hpp +++ b/Runtime/MP1/World/CMetroidPrimeRelay.hpp @@ -26,7 +26,7 @@ class CMetroidPrimeRelay : public CEntity { u32 xcac_w3; u32 xcb0_w4; u32 xcb4_w5; - rstl::reserved_vector xcb8_roomParms; + rstl::reserved_vector xcb8_roomParms; void ForwardMessageToMetroidPrimeExo(EScriptObjectMessage msg, CStateManager& mgr); void GetOrBuildMetroidPrimeExo(CStateManager& mgr); @@ -36,7 +36,7 @@ public: CMetroidPrimeRelay(TUniqueId uid, std::string_view name, const CEntityInfo& info, bool active, const zeus::CTransform& xf, const zeus::CVector3f& scale, SPrimeExoParameters&& parms, float f1, float f2, float f3, u32 w1, bool b1, u32 w2, const CHealthInfo& hInfo1, const CHealthInfo& hInfo2, - u32 w3, u32 w4, u32 w5, rstl::reserved_vector&& roomParms); + u32 w3, u32 w4, u32 w5, rstl::reserved_vector&& roomParms); void Accept(IVisitor& visitor) override; void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) override; [[nodiscard]] TUniqueId GetMetroidPrimeExoId() const { return x34_mpUid; } @@ -52,7 +52,7 @@ public: [[nodiscard]] u32 Get_xcac() const { return xcac_w3; } [[nodiscard]] u32 Get_xcb0() const { return xcb0_w4; } [[nodiscard]] u32 Get_xcb4() const { return xcb4_w5; } - [[nodiscard]] rstl::reserved_vector GetRoomParameters() const { return xcb8_roomParms; } + [[nodiscard]] rstl::reserved_vector GetRoomParameters() const { return xcb8_roomParms; } }; } // namespace metaforce::MP1 diff --git a/Runtime/MP1/World/COmegaPirate.hpp b/Runtime/MP1/World/COmegaPirate.hpp index f1bb1d341..33c4d57a7 100644 --- a/Runtime/MP1/World/COmegaPirate.hpp +++ b/Runtime/MP1/World/COmegaPirate.hpp @@ -161,7 +161,7 @@ public: bool IsElitePirate() const override { return false; } void SetupHealthInfo(CStateManager& mgr) override; void SetLaunchersActive(CStateManager& mgr, bool val) override; - SShockWaveData GetShockWaveData() const override { + CShockWaveInfo GetShockWaveData() const override { return {GetData().GetShockwaveParticleDescId(), GetData().GetShockwaveDamageInfo(), 24.78255f, GetData().GetShockwaveWeaponDescId(), GetData().GetShockwaveElectrocuteSfxId()}; } diff --git a/Runtime/MP1/World/CShockWave.cpp b/Runtime/MP1/World/CShockWave.cpp index 9f8161567..ffa45f7bd 100644 --- a/Runtime/MP1/World/CShockWave.cpp +++ b/Runtime/MP1/World/CShockWave.cpp @@ -14,7 +14,7 @@ namespace metaforce::MP1 { CShockWave::CShockWave(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, - TUniqueId parent, const SShockWaveData& data, float minActiveTime, float knockback) + TUniqueId parent, const CShockWaveInfo& data, float minActiveTime, float knockback) : CActor(uid, true, name, info, xf, CModelData::CModelDataNull(), {EMaterialTypes::Projectile}, CActorParameters::None(), kInvalidUniqueId) , xe8_parentId(parent) @@ -148,7 +148,7 @@ void CShockWave::Touch(CActor& actor, CStateManager& mgr) { if (isPlayer && (x164_timeSinceHitPlayerInAir >= 0.1333f || x168_timeSinceHitPlayer >= 0.2666f)) { return; } - if (!IsHit(actor.GetUniqueId())) { + if (!WasAlreadyDamaged(actor.GetUniqueId())) { mgr.ApplyDamage(GetUniqueId(), actor.GetUniqueId(), GetUniqueId(), damageInfo, CMaterialFilter::MakeInclude({EMaterialTypes::Solid}), zeus::skZero3f); if (isPlayer && x974_electricDesc) { @@ -172,7 +172,7 @@ void CShockWave::Touch(CActor& actor, CStateManager& mgr) { } } -bool CShockWave::IsHit(TUniqueId id) const { +bool CShockWave::WasAlreadyDamaged(TUniqueId id) const { return std::find(x170_hitIds.begin(), x170_hitIds.end(), id) != x170_hitIds.end(); } } // namespace metaforce::MP1 diff --git a/Runtime/MP1/World/CShockWave.hpp b/Runtime/MP1/World/CShockWave.hpp index 2d12cda6c..22fecc08b 100644 --- a/Runtime/MP1/World/CShockWave.hpp +++ b/Runtime/MP1/World/CShockWave.hpp @@ -5,7 +5,7 @@ #include "Runtime/World/CDamageInfo.hpp" namespace metaforce::MP1 { -struct SShockWaveData { +struct CShockWaveInfo { private: u32 x0_ = 8; CAssetId x4_particleDesc; @@ -18,7 +18,7 @@ private: u16 x38_electrocuteSfx; public: - SShockWaveData(CAssetId part, const CDamageInfo& dInfo, float initialExpansionSpeed, CAssetId weapon, u16 sfx) + CShockWaveInfo(CAssetId part, const CDamageInfo& dInfo, float initialExpansionSpeed, CAssetId weapon, u16 sfx) : x4_particleDesc(part) , x8_damageInfo(dInfo) , x2c_initialExpansionSpeed(initialExpansionSpeed) @@ -42,7 +42,7 @@ private: CDamageInfo xec_damageInfo; TToken x108_elementGenDesc; std::unique_ptr x110_elementGen; - SShockWaveData x114_data; + CShockWaveInfo x114_data; float x150_radius; float x154_expansionSpeed; float x158_activeTime = 0.f; @@ -59,7 +59,7 @@ private: public: DEFINE_ENTITY CShockWave(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, - TUniqueId parent, const SShockWaveData& data, float minActiveTime, float knockback); + TUniqueId parent, const CShockWaveInfo& data, float minActiveTime, float knockback); void Accept(IVisitor& visitor) override; void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override; @@ -70,6 +70,6 @@ public: void Touch(CActor& actor, CStateManager& mgr) override; private: - [[nodiscard]] bool IsHit(TUniqueId id) const; + [[nodiscard]] bool WasAlreadyDamaged(TUniqueId id) const; }; } // namespace metaforce::MP1 diff --git a/Runtime/World/ScriptLoader.cpp b/Runtime/World/ScriptLoader.cpp index d5eecdc1f..ccd4ab5d7 100644 --- a/Runtime/World/ScriptLoader.cpp +++ b/Runtime/World/ScriptLoader.cpp @@ -3704,7 +3704,7 @@ CEntity* ScriptLoader::LoadMetroidPrimeStage1(CStateManager& mgr, CInputStream& CHealthInfo hInfo1(in); CHealthInfo hInfo2(in); u32 w3 = in.ReadLong(); - rstl::reserved_vector roomParms; + rstl::reserved_vector roomParms; for (int i = 0; i < 4; ++i) roomParms.emplace_back(in); u32 w4 = in.ReadLong();