Merge branch 'master' into characterpreview
commit
d90af9c524
@ -1,58 +1,206 @@
|
|||||||
#include "creaturestats.hpp"
|
#include "creaturestats.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <components/esm_store/store.hpp>
|
||||||
|
|
||||||
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
namespace MWMechanics
|
namespace MWMechanics
|
||||||
{
|
{
|
||||||
CreatureStats::CreatureStats()
|
const AiSequence& CreatureStats::getAiSequence() const
|
||||||
{}
|
{
|
||||||
|
return mAiSequence;
|
||||||
|
}
|
||||||
|
|
||||||
// Can't use all benefits of members initialization because of
|
AiSequence& CreatureStats::getAiSequence()
|
||||||
// lack of copy constructors
|
{
|
||||||
CreatureStats::CreatureStats(const CreatureStats &orig)
|
return mAiSequence;
|
||||||
: mLevel(orig.mLevel), mHello(orig.mHello), mFight(orig.mFight),
|
}
|
||||||
mFlee(orig.mFlee), mAlarm(orig.mAlarm)
|
|
||||||
{
|
float CreatureStats::getFatigueTerm() const
|
||||||
for (int i = 0; i < 8; ++i) {
|
{
|
||||||
mAttributes[i] = orig.mAttributes[i];
|
int max = getFatigue().getModified();
|
||||||
|
int current = getFatigue().getCurrent();
|
||||||
|
|
||||||
|
float normalised = max==0 ? 1 : std::max (0.0f, static_cast<float> (current)/max);
|
||||||
|
|
||||||
|
const ESMS::ESMStore& store = MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
|
return store.gameSettings.find ("fFatigueBase")->getFloat()
|
||||||
|
- store.gameSettings.find ("fFatigueMult")->getFloat() * (1-normalised);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Stat<int> &CreatureStats::getAttribute(int index) const
|
||||||
|
{
|
||||||
|
if (index < 0 || index > 7) {
|
||||||
|
throw std::runtime_error("attribute index is out of range");
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 3; ++i) {
|
return mAttributes[index];
|
||||||
mDynamic[i] = orig.mDynamic[i];
|
}
|
||||||
|
|
||||||
|
const DynamicStat<int> &CreatureStats::getHealth() const
|
||||||
|
{
|
||||||
|
return mDynamic[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
const DynamicStat<int> &CreatureStats::getMagicka() const
|
||||||
|
{
|
||||||
|
return mDynamic[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
const DynamicStat<int> &CreatureStats::getFatigue() const
|
||||||
|
{
|
||||||
|
return mDynamic[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
const Spells &CreatureStats::getSpells() const
|
||||||
|
{
|
||||||
|
return mSpells;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ActiveSpells &CreatureStats::getActiveSpells() const
|
||||||
|
{
|
||||||
|
return mActiveSpells;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MagicEffects &CreatureStats::getMagicEffects() const
|
||||||
|
{
|
||||||
|
return mMagicEffects;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreatureStats::getLevel() const
|
||||||
|
{
|
||||||
|
return mLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreatureStats::getHello() const
|
||||||
|
{
|
||||||
|
return mHello;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreatureStats::getFight() const
|
||||||
|
{
|
||||||
|
return mFight;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreatureStats::getFlee() const
|
||||||
|
{
|
||||||
|
return mFlee;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreatureStats::getAlarm() const
|
||||||
|
{
|
||||||
|
return mAlarm;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stat<int> &CreatureStats::getAttribute(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || index > 7) {
|
||||||
|
throw std::runtime_error("attribute index is out of range");
|
||||||
}
|
}
|
||||||
mSpells = orig.mSpells;
|
return mAttributes[index];
|
||||||
mActiveSpells = orig.mActiveSpells;
|
|
||||||
mMagicEffects = orig.mMagicEffects;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatureStats::~CreatureStats()
|
DynamicStat<int> &CreatureStats::getHealth()
|
||||||
{}
|
{
|
||||||
|
return mDynamic[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicStat<int> &CreatureStats::getMagicka()
|
||||||
|
{
|
||||||
|
return mDynamic[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicStat<int> &CreatureStats::getFatigue()
|
||||||
|
{
|
||||||
|
return mDynamic[2];
|
||||||
|
}
|
||||||
|
|
||||||
const CreatureStats &
|
DynamicStat<int> &CreatureStats::getDynamic(int index)
|
||||||
CreatureStats::operator=(const CreatureStats &orig)
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 8; ++i) {
|
if (index < 0 || index > 2) {
|
||||||
mAttributes[i] = orig.mAttributes[i];
|
throw std::runtime_error("dynamic stat index is out of range");
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 3; ++i) {
|
return mDynamic[index];
|
||||||
mDynamic[i] = orig.mDynamic[i];
|
}
|
||||||
|
|
||||||
|
Spells &CreatureStats::getSpells()
|
||||||
|
{
|
||||||
|
return mSpells;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setSpells(const Spells &spells)
|
||||||
|
{
|
||||||
|
mSpells = spells;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActiveSpells &CreatureStats::getActiveSpells()
|
||||||
|
{
|
||||||
|
return mActiveSpells;
|
||||||
|
}
|
||||||
|
|
||||||
|
MagicEffects &CreatureStats::getMagicEffects()
|
||||||
|
{
|
||||||
|
return mMagicEffects;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setAttribute(int index, const Stat<int> &value)
|
||||||
|
{
|
||||||
|
if (index < 0 || index > 7) {
|
||||||
|
throw std::runtime_error("attribute index is out of range");
|
||||||
}
|
}
|
||||||
mLevel = orig.mLevel;
|
mAttributes[index] = value;
|
||||||
mSpells = orig.mSpells;
|
}
|
||||||
mActiveSpells = orig.mActiveSpells;
|
|
||||||
mMagicEffects = orig.mMagicEffects;
|
|
||||||
mHello = orig.mHello;
|
|
||||||
mFight = orig.mFight;
|
|
||||||
mFlee = orig.mFlee;
|
|
||||||
mAlarm = orig.mAlarm;
|
|
||||||
|
|
||||||
return *this;
|
void CreatureStats::setHealth(const DynamicStat<int> &value)
|
||||||
|
{
|
||||||
|
mDynamic[0] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const AiSequence& CreatureStats::getAiSequence() const
|
void CreatureStats::setMagicka(const DynamicStat<int> &value)
|
||||||
{
|
{
|
||||||
return mAiSequence;
|
mDynamic[1] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
AiSequence& CreatureStats::getAiSequence()
|
void CreatureStats::setFatigue(const DynamicStat<int> &value)
|
||||||
{
|
{
|
||||||
return mAiSequence;
|
mDynamic[2] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setLevel(int level)
|
||||||
|
{
|
||||||
|
mLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setActiveSpells(const ActiveSpells &active)
|
||||||
|
{
|
||||||
|
mActiveSpells = active;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setMagicEffects(const MagicEffects &effects)
|
||||||
|
{
|
||||||
|
mMagicEffects = effects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setHello(int value)
|
||||||
|
{
|
||||||
|
mHello = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setFight(int value)
|
||||||
|
{
|
||||||
|
mFight = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setFlee(int value)
|
||||||
|
{
|
||||||
|
mFlee = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureStats::setAlarm(int value)
|
||||||
|
{
|
||||||
|
mAlarm = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
#include "actioneat.hpp"
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#include <components/esm/loadskil.hpp>
|
||||||
|
|
||||||
|
#include <components/esm_store/store.hpp>
|
||||||
|
|
||||||
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
|
|
||||||
|
#include "class.hpp"
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
void ActionEat::executeImp (const Ptr& actor)
|
||||||
|
{
|
||||||
|
// remove used item
|
||||||
|
getTarget().getRefData().setCount (getTarget().getRefData().getCount()-1);
|
||||||
|
|
||||||
|
// check for success
|
||||||
|
const MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get (actor).getCreatureStats (actor);
|
||||||
|
MWMechanics::NpcStats& npcStats = MWWorld::Class::get (actor).getNpcStats (actor);
|
||||||
|
|
||||||
|
float x =
|
||||||
|
(npcStats.getSkill (ESM::Skill::Alchemy).getModified() +
|
||||||
|
0.2 * creatureStats.getAttribute (1).getModified()
|
||||||
|
+ 0.1 * creatureStats.getAttribute (7).getModified())
|
||||||
|
* creatureStats.getFatigueTerm();
|
||||||
|
|
||||||
|
if (x>=100*static_cast<float> (std::rand()) / RAND_MAX)
|
||||||
|
{
|
||||||
|
// apply to actor
|
||||||
|
std::string id = Class::get (getTarget()).getId (getTarget());
|
||||||
|
|
||||||
|
Class::get (actor).apply (actor, id, actor);
|
||||||
|
// we ignore the result here. Skill increases no matter if the ingredient did something or not.
|
||||||
|
|
||||||
|
// increase skill
|
||||||
|
Class::get (actor).skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ActionEat::ActionEat (const MWWorld::Ptr& object) : Action (false, object) {}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef GAME_MWWORLD_ACTIONEAT_H
|
||||||
|
#define GAME_MWWORLD_ACTIONEAT_H
|
||||||
|
|
||||||
|
#include "action.hpp"
|
||||||
|
#include "ptr.hpp"
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
class ActionEat : public Action
|
||||||
|
{
|
||||||
|
virtual void executeImp (const Ptr& actor);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ActionEat (const MWWorld::Ptr& object);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue