1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-13 00:06:58 +00:00

Fix Wander idle chance

This commit is contained in:
Alexei Kotov 2022-08-02 12:10:18 +03:00
parent 44339889dd
commit b4f743ad60
2 changed files with 15 additions and 14 deletions

View file

@ -670,25 +670,26 @@ namespace MWMechanics
} }
} }
short unsigned AiWander::getRandomIdle() int AiWander::getRandomIdle() const
{ {
unsigned short idleRoll = 0; MWBase::World* world = MWBase::Environment::get().getWorld();
short unsigned selectedAnimation = 0; static const float fIdleChanceMultiplier = world->getStore().get<ESM::GameSetting>().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(); float roll = Misc::Rng::rollClosedProbability(world->getPrng()) * 100.f;
static float fIdleChanceMultiplier = world->getStore().get<ESM::GameSetting>().find("fIdleChanceMultiplier")->mValue.getFloat(); if (roll <= mIdle[i] && roll > maxRoll)
unsigned short idleChance = static_cast<unsigned short>(fIdleChanceMultiplier * mIdle[counter]);
unsigned short randSelect = (int)(Misc::Rng::rollProbability(world->getPrng()) * int(100 / fIdleChanceMultiplier));
if(randSelect < idleChance && randSelect > idleRoll)
{ {
selectedAnimation = counter + GroupIndex_MinIdle; newIdle = GroupIndex_MinIdle + i;
idleRoll = randSelect; maxRoll = roll;
} }
} }
return selectedAnimation;
return newIdle;
} }
void AiWander::fastForward(const MWWorld::Ptr& actor, AiState &state) void AiWander::fastForward(const MWWorld::Ptr& actor, AiState &state)

View file

@ -112,7 +112,7 @@ namespace MWMechanics
/// @return Success or error /// @return Success or error
bool playIdle(const MWWorld::Ptr& actor, unsigned short idleSelect); bool playIdle(const MWWorld::Ptr& actor, unsigned short idleSelect);
bool checkIdle(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 setPathToAnAllowedNode(const MWWorld::Ptr& actor, AiWanderStorage& storage, const ESM::Position& actorPos);
void evadeObstacles(const MWWorld::Ptr& actor, AiWanderStorage& storage); void evadeObstacles(const MWWorld::Ptr& actor, AiWanderStorage& storage);
void doPerFrameActionsForState(const MWWorld::Ptr& actor, float duration, AiWanderStorage& storage); void doPerFrameActionsForState(const MWWorld::Ptr& actor, float duration, AiWanderStorage& storage);