1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-05-04 22:11:25 +00:00

Merge branch 'idlechance' into 'master'

Fix Wander random idle chance

See merge request OpenMW/openmw!2242
This commit is contained in:
psi29a 2022-08-04 09:55:05 +00:00
commit b55a511ad8
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);