mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-21 09:53:50 +00:00
Fix code duplication
This commit is contained in:
parent
0d0005c433
commit
95651857f3
6 changed files with 69 additions and 60 deletions
|
@ -80,6 +80,9 @@ namespace MWBase
|
||||||
///< If the player is sleeping or waiting, this should be called every hour.
|
///< If the player is sleeping or waiting, this should be called every hour.
|
||||||
/// @param sleep is the player sleeping or waiting?
|
/// @param sleep is the player sleeping or waiting?
|
||||||
|
|
||||||
|
virtual int getHoursToRest() const = 0;
|
||||||
|
///< Calculate how many hours the player needs to rest in order to be fully healed
|
||||||
|
|
||||||
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying) = 0;
|
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying) = 0;
|
||||||
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
||||||
|
|
||||||
|
|
|
@ -144,43 +144,7 @@ namespace MWGui
|
||||||
|
|
||||||
void WaitDialog::onUntilHealedButtonClicked(MyGUI::Widget* sender)
|
void WaitDialog::onUntilHealedButtonClicked(MyGUI::Widget* sender)
|
||||||
{
|
{
|
||||||
// we need to sleep for a specific time, and since that isn't calculated yet, we'll do it here
|
int autoHours = MWBase::Environment::get().getMechanicsManager()->getHoursToRest();
|
||||||
// I'm making the assumption here that the # of hours rested is calculated when rest is started
|
|
||||||
// TODO: the rougher logic here (calculating the hourly deltas) should really go into helper funcs elsewhere
|
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
||||||
const MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player);
|
|
||||||
const MWWorld::ESMStore& store = MWBase::Environment::get().getWorld()->getStore();
|
|
||||||
|
|
||||||
float hourlyHealthDelta = stats.getAttribute(ESM::Attribute::Endurance).getModified() * 0.1;
|
|
||||||
|
|
||||||
bool stunted = (stats.getMagicEffects().get(ESM::MagicEffect::StuntedMagicka).mMagnitude > 0);
|
|
||||||
float fRestMagicMult = store.get<ESM::GameSetting>().find("fRestMagicMult")->getFloat();
|
|
||||||
float hourlyMagickaDelta = fRestMagicMult * stats.getAttribute(ESM::Attribute::Intelligence).getModified();
|
|
||||||
|
|
||||||
// this massive duplication is why it has to be put into helper functions instead
|
|
||||||
float fFatigueReturnBase = store.get<ESM::GameSetting>().find("fFatigueReturnBase")->getFloat();
|
|
||||||
float fFatigueReturnMult = store.get<ESM::GameSetting>().find("fFatigueReturnMult")->getFloat();
|
|
||||||
float fEndFatigueMult = store.get<ESM::GameSetting>().find("fEndFatigueMult")->getFloat();
|
|
||||||
float capacity = MWWorld::Class::get(player).getCapacity(player);
|
|
||||||
float encumbrance = MWWorld::Class::get(player).getEncumbrance(player);
|
|
||||||
float normalizedEncumbrance = (capacity == 0 ? 1 : encumbrance/capacity);
|
|
||||||
if (normalizedEncumbrance > 1)
|
|
||||||
normalizedEncumbrance = 1;
|
|
||||||
float hourlyFatigueDelta = fFatigueReturnBase + fFatigueReturnMult * (1 - normalizedEncumbrance);
|
|
||||||
hourlyFatigueDelta *= 3600 * fEndFatigueMult * stats.getAttribute(ESM::Attribute::Endurance).getModified();
|
|
||||||
|
|
||||||
float healthHours = hourlyHealthDelta >= 0.0
|
|
||||||
? (stats.getHealth().getBase() - stats.getHealth().getCurrent()) / hourlyHealthDelta
|
|
||||||
: 1.0f;
|
|
||||||
float magickaHours = stunted ? 0.0 :
|
|
||||||
hourlyMagickaDelta >= 0.0
|
|
||||||
? (stats.getMagicka().getBase() - stats.getMagicka().getCurrent()) / hourlyMagickaDelta
|
|
||||||
: 1.0f;
|
|
||||||
float fatigueHours = hourlyFatigueDelta >= 0.0
|
|
||||||
? (stats.getFatigue().getBase() - stats.getFatigue().getCurrent()) / hourlyFatigueDelta
|
|
||||||
: 1.0f;
|
|
||||||
|
|
||||||
int autoHours = int(std::ceil( std::max(std::max(healthHours, magickaHours), std::max(fatigueHours, 1.0f)) )); // this should use a variadic max if possible
|
|
||||||
|
|
||||||
startWaiting(autoHours);
|
startWaiting(autoHours);
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,23 @@ bool disintegrateSlot (MWWorld::Ptr ptr, int slot, float disintegrate)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getRestorationPerHourOfSleep (const MWWorld::Ptr& ptr, float& health, float& magicka)
|
||||||
|
{
|
||||||
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr);
|
||||||
|
const MWWorld::Store<ESM::GameSetting>& settings = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||||
|
|
||||||
|
bool stunted = stats.getMagicEffects ().get(ESM::MagicEffect::StuntedMagicka).mMagnitude > 0;
|
||||||
|
int endurance = stats.getAttribute (ESM::Attribute::Endurance).getModified ();
|
||||||
|
|
||||||
|
health = 0.1 * endurance;
|
||||||
|
|
||||||
|
magicka = 0;
|
||||||
|
if (!stunted)
|
||||||
|
{
|
||||||
|
float fRestMagicMult = settings.find("fRestMagicMult")->getFloat ();
|
||||||
|
magicka = fRestMagicMult * stats.getAttribute(ESM::Attribute::Intelligence).getModified();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,37 +278,32 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
if (ptr.getClass().getCreatureStats(ptr).isDead())
|
if (ptr.getClass().getCreatureStats(ptr).isDead())
|
||||||
return;
|
return;
|
||||||
CreatureStats& stats = MWWorld::Class::get (ptr).getCreatureStats (ptr);
|
|
||||||
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr);
|
||||||
const MWWorld::Store<ESM::GameSetting>& settings = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
const MWWorld::Store<ESM::GameSetting>& settings = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||||
|
|
||||||
int endurance = stats.getAttribute (ESM::Attribute::Endurance).getModified ();
|
|
||||||
|
|
||||||
float capacity = MWWorld::Class::get(ptr).getCapacity(ptr);
|
|
||||||
float encumbrance = MWWorld::Class::get(ptr).getEncumbrance(ptr);
|
|
||||||
float normalizedEncumbrance = (capacity == 0 ? 1 : encumbrance/capacity);
|
|
||||||
if (normalizedEncumbrance > 1)
|
|
||||||
normalizedEncumbrance = 1;
|
|
||||||
|
|
||||||
if (sleep)
|
if (sleep)
|
||||||
{
|
{
|
||||||
// the actor is sleeping, restore health and magicka
|
float health, magicka;
|
||||||
bool stunted = stats.getMagicEffects ().get(ESM::MagicEffect::StuntedMagicka).mMagnitude > 0;
|
getRestorationPerHourOfSleep(ptr, health, magicka);
|
||||||
|
|
||||||
DynamicStat<float> health = stats.getHealth();
|
DynamicStat<float> stat = stats.getHealth();
|
||||||
health.setCurrent (health.getCurrent() + 0.1 * endurance);
|
stat.setCurrent(stat.getCurrent() + health);
|
||||||
stats.setHealth (health);
|
stats.setHealth(stat);
|
||||||
|
|
||||||
if (!stunted)
|
stat = stats.getMagicka();
|
||||||
{
|
stat.setCurrent(stat.getCurrent() + magicka);
|
||||||
float fRestMagicMult = settings.find("fRestMagicMult")->getFloat ();
|
stats.setMagicka(stat);
|
||||||
|
|
||||||
DynamicStat<float> magicka = stats.getMagicka();
|
|
||||||
magicka.setCurrent (magicka.getCurrent()
|
|
||||||
+ fRestMagicMult * stats.getAttribute(ESM::Attribute::Intelligence).getModified());
|
|
||||||
stats.setMagicka (magicka);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int endurance = stats.getAttribute (ESM::Attribute::Endurance).getModified ();
|
||||||
|
|
||||||
|
float capacity = ptr.getClass().getCapacity(ptr);
|
||||||
|
float encumbrance = ptr.getClass().getEncumbrance(ptr);
|
||||||
|
float normalizedEncumbrance = (capacity == 0 ? 1 : encumbrance/capacity);
|
||||||
|
if (normalizedEncumbrance > 1)
|
||||||
|
normalizedEncumbrance = 1;
|
||||||
|
|
||||||
// restore fatigue
|
// restore fatigue
|
||||||
float fFatigueReturnBase = settings.find("fFatigueReturnBase")->getFloat ();
|
float fFatigueReturnBase = settings.find("fFatigueReturnBase")->getFloat ();
|
||||||
float fFatigueReturnMult = settings.find("fFatigueReturnMult")->getFloat ();
|
float fFatigueReturnMult = settings.find("fFatigueReturnMult")->getFloat ();
|
||||||
|
@ -303,6 +315,7 @@ namespace MWMechanics
|
||||||
DynamicStat<float> fatigue = stats.getFatigue();
|
DynamicStat<float> fatigue = stats.getFatigue();
|
||||||
fatigue.setCurrent (fatigue.getCurrent() + duration * x);
|
fatigue.setCurrent (fatigue.getCurrent() + duration * x);
|
||||||
stats.setFatigue (fatigue);
|
stats.setFatigue (fatigue);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actors::calculateCreatureStatModifiers (const MWWorld::Ptr& ptr, float duration)
|
void Actors::calculateCreatureStatModifiers (const MWWorld::Ptr& ptr, float duration)
|
||||||
|
@ -851,6 +864,24 @@ namespace MWMechanics
|
||||||
calculateRestoration(iter->first, 3600, sleep);
|
calculateRestoration(iter->first, 3600, sleep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Actors::getHoursToRest(const MWWorld::Ptr &ptr) const
|
||||||
|
{
|
||||||
|
float healthPerHour, magickaPerHour;
|
||||||
|
getRestorationPerHourOfSleep(ptr, healthPerHour, magickaPerHour);
|
||||||
|
|
||||||
|
CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
||||||
|
|
||||||
|
float healthHours = healthPerHour >= 0
|
||||||
|
? (stats.getHealth().getModified() - stats.getHealth().getCurrent()) / healthPerHour
|
||||||
|
: 1.0f;
|
||||||
|
float magickaHours = magickaPerHour >= 0
|
||||||
|
? (stats.getMagicka().getModified() - stats.getMagicka().getCurrent()) / magickaPerHour
|
||||||
|
: 1.0f;
|
||||||
|
|
||||||
|
int autoHours = std::ceil(std::max(1.f, std::max(healthHours, magickaHours)));
|
||||||
|
return autoHours;
|
||||||
|
}
|
||||||
|
|
||||||
int Actors::countDeaths (const std::string& id) const
|
int Actors::countDeaths (const std::string& id) const
|
||||||
{
|
{
|
||||||
std::map<std::string, int>::const_iterator iter = mDeathCount.find(id);
|
std::map<std::string, int>::const_iterator iter = mDeathCount.find(id);
|
||||||
|
|
|
@ -82,6 +82,9 @@ namespace MWMechanics
|
||||||
void restoreDynamicStats(bool sleep);
|
void restoreDynamicStats(bool sleep);
|
||||||
///< If the player is sleeping, this should be called every hour.
|
///< If the player is sleeping, this should be called every hour.
|
||||||
|
|
||||||
|
int getHoursToRest(const MWWorld::Ptr& ptr) const;
|
||||||
|
///< Calculate how many hours the given actor needs to rest in order to be fully healed
|
||||||
|
|
||||||
int countDeaths (const std::string& id) const;
|
int countDeaths (const std::string& id) const;
|
||||||
///< Return the number of deaths for actors with the given ID.
|
///< Return the number of deaths for actors with the given ID.
|
||||||
|
|
||||||
|
|
|
@ -375,6 +375,11 @@ namespace MWMechanics
|
||||||
mActors.restoreDynamicStats (sleep);
|
mActors.restoreDynamicStats (sleep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MechanicsManager::getHoursToRest() const
|
||||||
|
{
|
||||||
|
return mActors.getHoursToRest(mWatched);
|
||||||
|
}
|
||||||
|
|
||||||
void MechanicsManager::setPlayerName (const std::string& name)
|
void MechanicsManager::setPlayerName (const std::string& name)
|
||||||
{
|
{
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
|
|
@ -85,6 +85,9 @@ namespace MWMechanics
|
||||||
///< If the player is sleeping or waiting, this should be called every hour.
|
///< If the player is sleeping or waiting, this should be called every hour.
|
||||||
/// @param sleep is the player sleeping or waiting?
|
/// @param sleep is the player sleeping or waiting?
|
||||||
|
|
||||||
|
virtual int getHoursToRest() const;
|
||||||
|
///< Calculate how many hours the player needs to rest in order to be fully healed
|
||||||
|
|
||||||
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying);
|
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying);
|
||||||
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue