diff --git a/apps/openmw/mwmechanics/aiwander.cpp b/apps/openmw/mwmechanics/aiwander.cpp index a2c97d641a..c5e15497ac 100644 --- a/apps/openmw/mwmechanics/aiwander.cpp +++ b/apps/openmw/mwmechanics/aiwander.cpp @@ -670,25 +670,26 @@ namespace MWMechanics } } - short unsigned AiWander::getRandomIdle() + int AiWander::getRandomIdle() const { - unsigned short idleRoll = 0; - short unsigned selectedAnimation = 0; + MWBase::World* world = MWBase::Environment::get().getWorld(); + static const float fIdleChanceMultiplier = world->getStore().get().find("fIdleChanceMultiplier")->mValue.getFloat(); + if (Misc::Rng::rollClosedProbability(world->getPrng()) > fIdleChanceMultiplier) + return 0; - for(unsigned int counter = 0; counter < mIdle.size(); counter++) + int newIdle = 0; + float maxRoll = 0.f; + for (size_t i = 0; i < mIdle.size(); i++) { - MWBase::World* world = MWBase::Environment::get().getWorld(); - static float fIdleChanceMultiplier = world->getStore().get().find("fIdleChanceMultiplier")->mValue.getFloat(); - - unsigned short idleChance = static_cast(fIdleChanceMultiplier * mIdle[counter]); - unsigned short randSelect = (int)(Misc::Rng::rollProbability(world->getPrng()) * int(100 / fIdleChanceMultiplier)); - if(randSelect < idleChance && randSelect > idleRoll) + float roll = Misc::Rng::rollClosedProbability(world->getPrng()) * 100.f; + if (roll <= mIdle[i] && roll > maxRoll) { - selectedAnimation = counter + GroupIndex_MinIdle; - idleRoll = randSelect; + newIdle = GroupIndex_MinIdle + i; + maxRoll = roll; } } - return selectedAnimation; + + return newIdle; } void AiWander::fastForward(const MWWorld::Ptr& actor, AiState &state) diff --git a/apps/openmw/mwmechanics/aiwander.hpp b/apps/openmw/mwmechanics/aiwander.hpp index 1adb4ed84e..1151005eb4 100644 --- a/apps/openmw/mwmechanics/aiwander.hpp +++ b/apps/openmw/mwmechanics/aiwander.hpp @@ -112,7 +112,7 @@ namespace MWMechanics /// @return Success or error bool playIdle(const MWWorld::Ptr& actor, unsigned short idleSelect); bool checkIdle(const MWWorld::Ptr& actor, unsigned short idleSelect); - short unsigned getRandomIdle(); + int getRandomIdle() const; void setPathToAnAllowedNode(const MWWorld::Ptr& actor, AiWanderStorage& storage, const ESM::Position& actorPos); void evadeObstacles(const MWWorld::Ptr& actor, AiWanderStorage& storage); void doPerFrameActionsForState(const MWWorld::Ptr& actor, float duration, AiWanderStorage& storage);