1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-05 16:45:34 +00:00

Merge remote-tracking branch 'potatoesmaster/bug-664'

This commit is contained in:
Marc Zinnschlag 2013-07-21 16:50:02 +02:00
commit 5dc1aceae1
7 changed files with 59 additions and 19 deletions

View file

@ -109,6 +109,11 @@ namespace
creatureStats.getAttribute(attribute).setBase ( std::min(creatureStats.getAttribute(attribute).getBase() creatureStats.getAttribute(attribute).setBase ( std::min(creatureStats.getAttribute(attribute).getBase()
+ static_cast<int>((level-1) * modifierSum+0.5), 100) ); + static_cast<int>((level-1) * modifierSum+0.5), 100) );
} }
// initial health
int strength = creatureStats.getAttribute(ESM::Attribute::Strength).getBase();
int endurance = creatureStats.getAttribute(ESM::Attribute::Endurance).getBase();
creatureStats.setHealth(static_cast<int> (0.5 * (strength + endurance)) + 4 * (creatureStats.getLevel() - 1));
} }
} }

View file

@ -10,7 +10,10 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
#include "../mwmechanics/creaturestats.hpp"
#include "../mwworld/class.hpp"
#include "../mwworld/fallback.hpp" #include "../mwworld/fallback.hpp"
#include "../mwworld/player.hpp"
namespace namespace
{ {
@ -41,6 +44,14 @@ namespace
// Note: Order is taken from http://www.uesp.net/wiki/Morrowind:Class_Quiz // Note: Order is taken from http://www.uesp.net/wiki/Morrowind:Class_Quiz
unsigned int points[3]; unsigned int points[3];
}; };
void updatePlayerHealth()
{
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get(player).getCreatureStats(player);
creatureStats.updateHealth();
}
} }
namespace MWGui namespace MWGui
@ -334,6 +345,8 @@ namespace MWGui
mCreationStage = CSE_ClassChosen; mCreationStage = CSE_ClassChosen;
MWBase::Environment::get().getWindowManager()->popGuiMode(); MWBase::Environment::get().getWindowManager()->popGuiMode();
} }
updatePlayerHealth();
} }
void CharacterCreation::onPickClassDialogBack() void CharacterCreation::onPickClassDialogBack()
@ -461,6 +474,8 @@ namespace MWGui
mCreationStage = CSE_RaceChosen; mCreationStage = CSE_RaceChosen;
MWBase::Environment::get().getWindowManager()->popGuiMode(); MWBase::Environment::get().getWindowManager()->popGuiMode();
} }
updatePlayerHealth();
} }
void CharacterCreation::onBirthSignDialogDone(WindowBase* parWindow) void CharacterCreation::onBirthSignDialogDone(WindowBase* parWindow)
@ -484,6 +499,8 @@ namespace MWGui
mCreationStage = CSE_BirthSignChosen; mCreationStage = CSE_BirthSignChosen;
MWBase::Environment::get().getWindowManager()->popGuiMode(); MWBase::Environment::get().getWindowManager()->popGuiMode();
} }
updatePlayerHealth();
} }
void CharacterCreation::onBirthSignDialogBack() void CharacterCreation::onBirthSignDialogBack()
@ -547,6 +564,8 @@ namespace MWGui
mCreationStage = CSE_ClassChosen; mCreationStage = CSE_ClassChosen;
MWBase::Environment::get().getWindowManager()->popGuiMode(); MWBase::Environment::get().getWindowManager()->popGuiMode();
} }
updatePlayerHealth();
} }
void CharacterCreation::onCreateClassDialogBack() void CharacterCreation::onCreateClassDialogBack()
@ -715,6 +734,8 @@ namespace MWGui
mCreationStage = CSE_ClassChosen; mCreationStage = CSE_ClassChosen;
MWBase::Environment::get().getWindowManager()->popGuiMode(); MWBase::Environment::get().getWindowManager()->popGuiMode();
} }
updatePlayerHealth();
} }
CharacterCreation::~CharacterCreation() CharacterCreation::~CharacterCreation()

View file

@ -173,12 +173,7 @@ namespace MWGui
attribute.setBase(100); attribute.setBase(100);
} }
// "When you gain a level, in addition to increasing three primary attributes, your Health creatureStats.levelUp();
// will automatically increase by 10% of your Endurance attribute. If you increased Endurance this level,
// the Health increase is calculated from the increased Endurance"
creatureStats.increaseLevelHealthBonus (creatureStats.getAttribute(ESM::Attribute::Endurance).getBase() * 0.1f);
creatureStats.setLevel (creatureStats.getLevel()+1);
pcStats.levelUp (); pcStats.levelUp ();
MWBase::Environment::get().getWindowManager()->removeGuiMode (GM_Levelup); MWBase::Environment::get().getWindowManager()->removeGuiMode (GM_Levelup);

View file

@ -76,10 +76,6 @@ namespace MWMechanics
double magickaFactor = double magickaFactor =
creatureStats.getMagicEffects().get (EffectKey (ESM::MagicEffect::FortifyMaximumMagicka)).mMagnitude * 0.1 + 0.5; creatureStats.getMagicEffects().get (EffectKey (ESM::MagicEffect::FortifyMaximumMagicka)).mMagnitude * 0.1 + 0.5;
DynamicStat<float> health = creatureStats.getHealth();
health.setBase (static_cast<int> (0.5 * (strength + endurance)) + creatureStats.getLevelHealthBonus ());
creatureStats.setHealth (health);
DynamicStat<float> magicka = creatureStats.getMagicka(); DynamicStat<float> magicka = creatureStats.getMagicka();
magicka.setBase (static_cast<int> (intelligence + magickaFactor * intelligence)); magicka.setBase (static_cast<int> (intelligence + magickaFactor * intelligence));
creatureStats.setMagicka (magicka); creatureStats.setMagicka (magicka);

View file

@ -18,16 +18,35 @@ namespace MWMechanics
mAiSettings[i] = 0; mAiSettings[i] = 0;
} }
void CreatureStats::increaseLevelHealthBonus (float value)
{
mLevelHealthBonus += value;
}
float CreatureStats::getLevelHealthBonus () const float CreatureStats::getLevelHealthBonus () const
{ {
return mLevelHealthBonus; return mLevelHealthBonus;
} }
void CreatureStats::levelUp()
{
const MWWorld::Store<ESM::GameSetting> &gmst =
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
const int endurance = getAttribute(ESM::Attribute::Endurance).getBase();
// "When you gain a level, in addition to increasing three primary attributes, your Health
// will automatically increase by 10% of your Endurance attribute. If you increased Endurance this level,
// the Health increase is calculated from the increased Endurance"
mLevelHealthBonus += endurance * gmst.find("fLevelUpHealthEndMult")->getFloat();
updateHealth();
mLevel++;
}
void CreatureStats::updateHealth()
{
const int endurance = getAttribute(ESM::Attribute::Endurance).getBase();
const int strength = getAttribute(ESM::Attribute::Strength).getBase();
setHealth(static_cast<int> (0.5 * (strength + endurance)) + mLevelHealthBonus);
}
const AiSequence& CreatureStats::getAiSequence() const const AiSequence& CreatureStats::getAiSequence() const
{ {
return mAiSequence; return mAiSequence;

View file

@ -95,10 +95,14 @@ namespace MWMechanics
float getFatigueTerm() const; float getFatigueTerm() const;
///< Return effective fatigue ///< Return effective fatigue
// small hack to allow the fact that Health permanently increases by 10% of endurance on each level up
void increaseLevelHealthBonus(float value);
float getLevelHealthBonus() const; float getLevelHealthBonus() const;
void levelUp();
void updateHealth();
///< Calculate health based on endurance and strength.
/// Called at character creation and at level up.
bool isDead() const; bool isDead() const;
bool hasDied() const; bool hasDied() const;

View file

@ -98,8 +98,8 @@ namespace MWMechanics
public: public:
typedef T Type; typedef T Type;
DynamicStat() : mCurrent (0) {} DynamicStat() : mStatic (0), mCurrent (0) {}
DynamicStat(T current) : mCurrent (current) {} DynamicStat(T base) : mStatic (base), mCurrent (base) {}
DynamicStat(T base, T modified, T current) : mStatic(base, modified), mCurrent (current) {} DynamicStat(T base, T modified, T current) : mStatic(base, modified), mCurrent (current) {}
DynamicStat(const Stat<T> &stat, T current) : mStatic(stat), mCurrent (current) {} DynamicStat(const Stat<T> &stat, T current) : mStatic(stat), mCurrent (current) {}