1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-13 18:36:43 +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;
short unsigned selectedAnimation = 0;
for(unsigned int counter = 0; counter < mIdle.size(); counter++)
{ {
MWBase::World* world = MWBase::Environment::get().getWorld(); MWBase::World* world = MWBase::Environment::get().getWorld();
static float fIdleChanceMultiplier = world->getStore().get<ESM::GameSetting>().find("fIdleChanceMultiplier")->mValue.getFloat(); static const float fIdleChanceMultiplier = world->getStore().get<ESM::GameSetting>().find("fIdleChanceMultiplier")->mValue.getFloat();
if (Misc::Rng::rollClosedProbability(world->getPrng()) > fIdleChanceMultiplier)
return 0;
unsigned short idleChance = static_cast<unsigned short>(fIdleChanceMultiplier * mIdle[counter]); int newIdle = 0;
unsigned short randSelect = (int)(Misc::Rng::rollProbability(world->getPrng()) * int(100 / fIdleChanceMultiplier)); float maxRoll = 0.f;
if(randSelect < idleChance && randSelect > idleRoll) for (size_t i = 0; i < mIdle.size(); i++)
{ {
selectedAnimation = counter + GroupIndex_MinIdle; float roll = Misc::Rng::rollClosedProbability(world->getPrng()) * 100.f;
idleRoll = randSelect; if (roll <= mIdle[i] && roll > maxRoll)
{
newIdle = GroupIndex_MinIdle + i;
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);