Handle werewolf stats

actorid
Chris Robinson 11 years ago
parent 72a399054f
commit ae183cb3e4

@ -13,7 +13,8 @@ namespace MWMechanics
: mLevel (0), mLevelHealthBonus(0.f), mDead (false), mDied (false), mFriendlyHits (0),
mTalkedTo (false), mAlarmed (false),
mAttacked (false), mHostile (false),
mAttackingOrSpell(false), mAttackType(AT_Chop)
mAttackingOrSpell(false), mAttackType(AT_Chop),
mIsWerewolf(false)
{
for (int i=0; i<4; ++i)
mAiSettings[i] = 0;
@ -77,7 +78,7 @@ namespace MWMechanics
if (index < 0 || index > 7) {
throw std::runtime_error("attribute index is out of range");
}
return mAttributes[index];
return (!mIsWerewolf ? mAttributes[index] : mWerewolfAttributes[index]);
}
const DynamicStat<float> &CreatureStats::getHealth() const
@ -131,7 +132,7 @@ namespace MWMechanics
if (index < 0 || index > 7) {
throw std::runtime_error("attribute index is out of range");
}
return mAttributes[index];
return (!mIsWerewolf ? mAttributes[index] : mWerewolfAttributes[index]);
}
const DynamicStat<float> &CreatureStats::getDynamic(int index) const
@ -167,7 +168,10 @@ namespace MWMechanics
if (index < 0 || index > 7) {
throw std::runtime_error("attribute index is out of range");
}
mAttributes[index] = value;
if(!mIsWerewolf)
mAttributes[index] = value;
else
mWerewolfAttributes[index] = value;
}
void CreatureStats::setHealth(const DynamicStat<float> &value)

@ -40,6 +40,10 @@ namespace MWMechanics
std::string mLastHitObject; // The last object to hit this actor
protected:
bool mIsWerewolf;
Stat<int> mWerewolfAttributes[8];
public:
CreatureStats();

@ -30,7 +30,6 @@ MWMechanics::NpcStats::NpcStats()
, mDisposition(0)
, mVampire (0)
, mReputation(0)
, mWerewolf (false)
, mWerewolfKills (0)
, mProfit(0)
, mAttackStrength(0.0f)
@ -90,7 +89,7 @@ const MWMechanics::Stat<float>& MWMechanics::NpcStats::getSkill (int index) cons
if (index<0 || index>=27)
throw std::runtime_error ("skill index out of range");
return mSkill[index];
return (!mIsWerewolf ? mSkill[index] : mWerewolfSkill[index]);
}
MWMechanics::Stat<float>& MWMechanics::NpcStats::getSkill (int index)
@ -98,7 +97,7 @@ MWMechanics::Stat<float>& MWMechanics::NpcStats::getSkill (int index)
if (index<0 || index>=27)
throw std::runtime_error ("skill index out of range");
return mSkill[index];
return (!mIsWerewolf ? mSkill[index] : mWerewolfSkill[index]);
}
const std::map<std::string, int>& MWMechanics::NpcStats::getFactionRanks() const
@ -194,6 +193,10 @@ float MWMechanics::NpcStats::getSkillGain (int skillIndex, const ESM::Class& cla
void MWMechanics::NpcStats::useSkill (int skillIndex, const ESM::Class& class_, int usageType)
{
// Don't increase skills as a werewolf
if(mIsWerewolf)
return;
float base = getSkill (skillIndex).getBase();
int level = static_cast<int> (base);
@ -369,12 +372,34 @@ bool MWMechanics::NpcStats::hasSkillsForRank (const std::string& factionId, int
bool MWMechanics::NpcStats::isWerewolf() const
{
return mWerewolf;
return mIsWerewolf;
}
void MWMechanics::NpcStats::setWerewolf (bool set)
{
mWerewolf = set;
if(set != false)
{
const MWWorld::Store<ESM::GameSetting> &gmst = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
for(size_t i = 0;i < ESM::Attribute::Length;i++)
{
mWerewolfAttributes[i] = getAttribute(i);
// Oh, Bethesda. It's "Intelligence".
std::string name = "fWerewolf"+((i==ESM::Attribute::Intelligence) ? std::string("Intellegence") :
ESM::Attribute::sAttributeNames[i]);
mWerewolfAttributes[i].setModified(int(gmst.find(name)->getFloat()), 0);
}
for(size_t i = 0;i < ESM::Skill::Length;i++)
{
mWerewolfSkill[i] = getSkill(i);
// "Mercantile"! >_<
std::string name = "fWerewolf"+((i==ESM::Skill::Mercantile) ? std::string("Merchantile") :
ESM::Skill::sSkillNames[i]);
mWerewolfSkill[i].setModified(int(gmst.find(name)->getFloat()), 0);
}
}
mIsWerewolf = set;
}
int MWMechanics::NpcStats::getWerewolfKills() const

@ -46,12 +46,12 @@ namespace MWMechanics
int mDisposition;
unsigned int mMovementFlags;
Stat<float> mSkill[27];
Stat<float> mWerewolfSkill[27];
int mBounty;
std::set<std::string> mExpelled;
std::map<std::string, int> mFactionReputation;
bool mVampire;
int mReputation;
bool mWerewolf;
int mWerewolfKills;
int mProfit;
float mAttackStrength;
@ -143,7 +143,7 @@ namespace MWMechanics
bool isWerewolf() const;
void setWerewolf (bool set);
void setWerewolf(bool set);
int getWerewolfKills() const;

@ -13,6 +13,17 @@ const Attribute::AttributeID Attribute::sAttributeIds[Attribute::Length] = {
Attribute::Luck
};
const std::string Attribute::sAttributeNames[Attribute::Length] = {
"Strength",
"Intelligence",
"Willpower",
"Agility",
"Speed",
"Endurance",
"Personality",
"Luck"
};
const std::string Attribute::sGmstAttributeIds[Attribute::Length] = {
"sAttributeStrength",
"sAttributeIntelligence",

@ -28,6 +28,7 @@ struct Attribute
std::string mName, mDescription;
static const AttributeID sAttributeIds[Length];
static const std::string sAttributeNames[Length];
static const std::string sGmstAttributeIds[Length];
static const std::string sGmstAttributeDescIds[Length];
static const std::string sAttributeIcons[Length];

@ -9,6 +9,35 @@
namespace ESM
{
const std::string Skill::sSkillNames[Length] = {
"Block",
"Armorer",
"Mediumarmor",
"Heavyarmor",
"Bluntweapon",
"Longblade",
"Axe",
"Spear",
"Athletics",
"Enchant",
"Destruction",
"Alteration",
"Illusion",
"Conjuration",
"Mysticism",
"Restoration",
"Alchemy",
"Unarmored",
"Security",
"Sneak",
"Acrobatics",
"Lightarmor",
"Shortblade",
"Marksman",
"Mercantile",
"Speechcraft",
"Handtohand",
};
const std::string Skill::sSkillNameIds[Length] = {
"sSkillBlock",
"sSkillArmorer",

@ -69,6 +69,7 @@ struct Skill
HandToHand = 26,
Length
};
static const std::string sSkillNames[Length];
static const std::string sSkillNameIds[Length];
static const std::string sIconNames[Length];
static const boost::array<SkillEnum, Length> sSkillIds;

Loading…
Cancel
Save