From b3fe84a56009b844697a6e7492a9284f6082582e Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Tue, 29 Oct 2024 20:24:14 +0100 Subject: [PATCH] Cache awareness rolls for 5 seconds to make sneaking easier --- apps/openmw/mwmechanics/actors.cpp | 1 + apps/openmw/mwmechanics/creaturestats.cpp | 20 +++++++++++++++++++ apps/openmw/mwmechanics/creaturestats.hpp | 6 ++++++ .../mwmechanics/mechanicsmanagerimp.cpp | 3 +-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 3ba6bfdc8d..3180fc0129 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -409,6 +409,7 @@ namespace MWMechanics void Actors::updateActor(const MWWorld::Ptr& ptr, float duration) const { + ptr.getClass().getCreatureStats(ptr).updateAwareness(duration); // magic effects adjustMagicEffects(ptr, duration); diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 41af96a630..0a14d46097 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -686,4 +686,24 @@ namespace MWMechanics { return mSummonGraveyard; } + + void CreatureStats::updateAwareness(float duration) + { + mAwarenessTimer += duration; + // Only reroll for awareness every 5 seconds + if (mAwarenessTimer >= 5.f) + { + mAwarenessTimer = 0.f; + mAwarenessRoll = -1; + } + } + + int CreatureStats::getAwarenessRoll() + { + if (mAwarenessRoll >= 0) + return mAwarenessRoll; + auto& prng = MWBase::Environment::get().getWorld()->getPrng(); + mAwarenessRoll = Misc::Rng::roll0to99(prng); + return mAwarenessRoll; + } } diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index 02312385d7..aa46e9504f 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -90,6 +90,9 @@ namespace MWMechanics // This may be necessary when the creature is in an inactive cell. std::vector mSummonGraveyard; + float mAwarenessTimer = 0.f; + int mAwarenessRoll = -1; + protected: std::string mAttackType; int mLevel = 0; @@ -300,6 +303,9 @@ namespace MWMechanics void setTeleported(bool v) { mTeleported = v; } const std::map& getAttributes() const { return mAttributes; } + + void updateAwareness(float duration); + int getAwarenessRoll(); }; } diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index c20061d022..f0089a82ad 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1675,8 +1675,7 @@ namespace MWMechanics } float target = x - y; - auto& prng = MWBase::Environment::get().getWorld()->getPrng(); - return (Misc::Rng::roll0to99(prng) >= target); + return observerStats.getAwarenessRoll() >= target; } void MechanicsManager::startCombat(