1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-26 09:35:28 +00:00

Merge branch 'rm_actors_static' into 'master'

Make MWMechanics::Actors local static variables to be members

See merge request OpenMW/openmw!1839
This commit is contained in:
psi29a 2022-05-09 07:31:15 +00:00
commit 8bf5de69ad
2 changed files with 66 additions and 57 deletions

View File

@ -380,7 +380,7 @@ namespace MWMechanics
return;
// Play a random voice greeting if the player gets too close
static int iGreetDistanceMultiplier = MWBase::Environment::get().getWorld()->getStore()
static const int iGreetDistanceMultiplier = MWBase::Environment::get().getWorld()->getStore()
.get<ESM::GameSetting>().find("iGreetDistanceMultiplier")->mValue.getInteger();
float helloDistance = static_cast<float>(actorStats.getAiSetting(CreatureStats::AI_Hello).getModified() * iGreetDistanceMultiplier);
@ -1207,18 +1207,17 @@ namespace MWMechanics
}
// check if we still have any player enemies to switch music
static int currentMusic = 0;
if (currentMusic != 1 && !hasHostiles && !(player.getClass().getCreatureStats(player).isDead() &&
MWBase::Environment::get().getSoundManager()->isMusicPlaying()))
if (mCurrentMusic != MusicType::Explore && !hasHostiles
&& !(player.getClass().getCreatureStats(player).isDead()
&& MWBase::Environment::get().getSoundManager()->isMusicPlaying()))
{
MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Explore"));
currentMusic = 1;
mCurrentMusic = MusicType::Explore;
}
else if (currentMusic != 2 && hasHostiles)
else if (mCurrentMusic != MusicType::Battle && hasHostiles)
{
MWBase::Environment::get().getSoundManager()->playPlaylist(std::string("Battle"));
currentMusic = 2;
mCurrentMusic = MusicType::Battle;
}
}
@ -1374,15 +1373,19 @@ namespace MWMechanics
{
if(!paused)
{
static float timerUpdateHeadTrack = 0;
static float timerUpdateEquippedLight = 0;
static float timerUpdateHello = 0;
const float updateEquippedLightInterval = 1.0f;
if (timerUpdateHeadTrack >= 0.3f) timerUpdateHeadTrack = 0;
if (timerUpdateHello >= 0.25f) timerUpdateHello = 0;
if (mTimerDisposeSummonsCorpses >= 0.2f) mTimerDisposeSummonsCorpses = 0;
if (timerUpdateEquippedLight >= updateEquippedLightInterval) timerUpdateEquippedLight = 0;
if (mTimerUpdateHeadTrack >= 0.3f)
mTimerUpdateHeadTrack = 0;
if (mTimerUpdateHello >= 0.25f)
mTimerUpdateHello = 0;
if (mTimerDisposeSummonsCorpses >= 0.2f)
mTimerDisposeSummonsCorpses = 0;
if (mTimerUpdateEquippedLight >= updateEquippedLightInterval)
mTimerUpdateEquippedLight = 0;
// show torches only when there are darkness and no precipitations
MWBase::World* world = MWBase::Environment::get().getWorld();
@ -1470,7 +1473,7 @@ namespace MWMechanics
engageCombat(iter->first, it->first, cachedAllies, it->first == player);
}
}
if (timerUpdateHeadTrack == 0)
if (mTimerUpdateHeadTrack == 0)
{
float sqrHeadTrackDistance = std::numeric_limits<float>::max();
MWWorld::Ptr headTrackTarget;
@ -1518,7 +1521,7 @@ namespace MWMechanics
if (isConscious(iter->first) && !(luaControls && luaControls->mDisableAI))
{
stats.getAiSequence().execute(iter->first, *ctrl, duration);
updateGreetingState(iter->first, *iter->second, timerUpdateHello > 0);
updateGreetingState(iter->first, *iter->second, mTimerUpdateHello > 0);
playIdleDialogue(iter->first);
updateMovementSpeed(iter->first);
}
@ -1535,7 +1538,7 @@ namespace MWMechanics
// We can not update drowning state for actors outside of AI distance - they can not resurface to breathe
updateDrowning(iter->first, duration, ctrl->isKnockedOut(), isPlayer);
}
if(timerUpdateEquippedLight == 0 && iter->first.getClass().hasInventoryStore(iter->first))
if(mTimerUpdateEquippedLight == 0 && iter->first.getClass().hasInventoryStore(iter->first))
updateEquippedLight(iter->first, updateEquippedLightInterval, showTorches);
if (luaControls && isConscious(iter->first))
@ -1577,9 +1580,9 @@ namespace MWMechanics
if (avoidCollisions)
predictAndAvoidCollisions(duration);
timerUpdateHeadTrack += duration;
timerUpdateEquippedLight += duration;
timerUpdateHello += duration;
mTimerUpdateHeadTrack += duration;
mTimerUpdateEquippedLight += duration;
mTimerUpdateHello += duration;
mTimerDisposeSummonsCorpses += duration;
// Animation/movement update
@ -1829,8 +1832,6 @@ namespace MWMechanics
void Actors::updateSneaking(CharacterController* ctrl, float duration)
{
static float sneakTimer = 0.f; // Times update of sneak icon
if (!ctrl)
{
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
@ -1845,17 +1846,15 @@ namespace MWMechanics
return;
}
static float sneakSkillTimer = 0.f; // Times sneak skill progress from "avoid notice"
MWBase::World* world = MWBase::Environment::get().getWorld();
const MWWorld::Store<ESM::GameSetting>& gmst = world->getStore().get<ESM::GameSetting>();
static const float fSneakUseDist = gmst.find("fSneakUseDist")->mValue.getFloat();
static const float fSneakUseDelay = gmst.find("fSneakUseDelay")->mValue.getFloat();
if (sneakTimer >= fSneakUseDelay)
sneakTimer = 0.f;
if (mSneakTimer >= fSneakUseDelay)
mSneakTimer = 0.f;
if (sneakTimer == 0.f)
if (mSneakTimer == 0.f)
{
// Set when an NPC is within line of sight and distance, but is still unaware. Used for skill progress.
bool avoidedNotice = false;
@ -1893,18 +1892,18 @@ namespace MWMechanics
}
}
if (sneakSkillTimer >= fSneakUseDelay)
sneakSkillTimer = 0.f;
if (mSneakSkillTimer >= fSneakUseDelay)
mSneakSkillTimer = 0.f;
if (avoidedNotice && sneakSkillTimer == 0.f)
if (avoidedNotice && mSneakSkillTimer == 0.f)
player.getClass().skillUsageSucceeded(player, ESM::Skill::Sneak, 0);
if (!detected)
MWBase::Environment::get().getWindowManager()->setSneakVisibility(true);
}
sneakTimer += duration;
sneakSkillTimer += duration;
mSneakTimer += duration;
mSneakSkillTimer += duration;
}
int Actors::getHoursToRest(const MWWorld::Ptr &ptr) const

View File

@ -39,24 +39,6 @@ namespace MWMechanics
class Actors
{
std::map<std::string, int> mDeathCount;
void adjustMagicEffects (const MWWorld::Ptr& creature, float duration);
void calculateRestoration (const MWWorld::Ptr& ptr, float duration);
void updateDrowning (const MWWorld::Ptr& ptr, float duration, bool isKnockedOut, bool isPlayer);
void updateEquippedLight (const MWWorld::Ptr& ptr, float duration, bool mayEquip);
void updateCrimePursuit (const MWWorld::Ptr& ptr, float duration);
void killDeadActors ();
void purgeSpellEffects (int casterActorId);
void predictAndAvoidCollisions(float duration);
public:
Actors();
@ -200,14 +182,42 @@ namespace MWMechanics
GreetingState getGreetingState(const MWWorld::Ptr& ptr) const;
bool isTurningToPlayer(const MWWorld::Ptr& ptr) const;
private:
void updateVisibility (const MWWorld::Ptr& ptr, CharacterController* ctrl);
private:
enum class MusicType
{
Explore,
Battle
};
PtrActorMap mActors;
float mTimerDisposeSummonsCorpses;
float mActorsProcessingRange;
std::map<std::string, int> mDeathCount;
PtrActorMap mActors;
float mTimerDisposeSummonsCorpses;
float mTimerUpdateHeadTrack = 0;
float mTimerUpdateEquippedLight = 0;
float mTimerUpdateHello = 0;
float mSneakTimer = 0; // Times update of sneak icon
float mSneakSkillTimer = 0; // Times sneak skill progress from "avoid notice"
float mActorsProcessingRange;
bool mSmoothMovement;
MusicType mCurrentMusic = MusicType::Explore;
bool mSmoothMovement;
void updateVisibility (const MWWorld::Ptr& ptr, CharacterController* ctrl);
void adjustMagicEffects (const MWWorld::Ptr& creature, float duration);
void calculateRestoration (const MWWorld::Ptr& ptr, float duration);
void updateDrowning (const MWWorld::Ptr& ptr, float duration, bool isKnockedOut, bool isPlayer);
void updateEquippedLight (const MWWorld::Ptr& ptr, float duration, bool mayEquip);
void updateCrimePursuit (const MWWorld::Ptr& ptr, float duration);
void killDeadActors ();
void purgeSpellEffects (int casterActorId);
void predictAndAvoidCollisions(float duration);
};
}