diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index bb3273981d..a9d10180d0 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -407,6 +407,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 b18bca98d5..a8c98b3fa2 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -695,4 +695,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 f65e1a000f..c0dd6b9118 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; @@ -303,6 +306,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 46f6440ae6..0285934d83 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1657,8 +1657,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(