added spell list to creature stats (for now only type Ability; magic effects not applied yet), generate spell list according to race and birthsign during character creation

This commit is contained in:
Marc Zinnschlag 2010-09-30 14:28:01 +02:00
parent 770276281b
commit eeca39220b
3 changed files with 50 additions and 2 deletions

View file

@ -1,6 +1,9 @@
#ifndef GAME_MWMECHANICS_CREATURESTATS_H #ifndef GAME_MWMECHANICS_CREATURESTATS_H
#define GAME_MWMECHANICS_CREATURESTATS_H #define GAME_MWMECHANICS_CREATURESTATS_H
#include <set>
#include <string>
#include "stat.hpp" #include "stat.hpp"
namespace MWMechanics namespace MWMechanics
@ -10,6 +13,7 @@ namespace MWMechanics
Stat<int> mAttributes[8]; Stat<int> mAttributes[8];
DynamicStat<int> mDynamic[3]; // health, magicka, fatigue DynamicStat<int> mDynamic[3]; // health, magicka, fatigue
int mLevel; int mLevel;
std::set<std::string> mAbilities;
}; };
} }

View file

@ -22,6 +22,7 @@ namespace MWMechanics
// reset // reset
creatureStats.mLevel = player->npdt52.level; creatureStats.mLevel = player->npdt52.level;
creatureStats.mAbilities.clear();
for (int i=0; i<27; ++i) for (int i=0; i<27; ++i)
npcStats.mSkill[i].setBase (player->npdt52.skills[i]); npcStats.mSkill[i].setBase (player->npdt52.skills[i]);
@ -65,13 +66,25 @@ namespace MWMechanics
} }
} }
// TODO handle magic effects for (std::vector<std::string>::const_iterator iter (race->powers.list.begin());
iter!=race->powers.list.end(); ++iter)
{
insertSpell (*iter, ptr);
}
} }
// birthsign // birthsign
if (!mEnvironment.mWorld->getPlayerPos().getBirthsign().empty()) if (!mEnvironment.mWorld->getPlayerPos().getBirthsign().empty())
{ {
// TODO handle magic effects const ESM::BirthSign *sign =
mEnvironment.mWorld->getStore().birthSigns.find (
mEnvironment.mWorld->getPlayerPos().getBirthsign());
for (std::vector<std::string>::const_iterator iter (sign->powers.list.begin());
iter!=sign->powers.list.end(); ++iter)
{
insertSpell (*iter, ptr);
}
} }
// class // class
@ -139,6 +152,35 @@ namespace MWMechanics
creatureStats.mDynamic[i].setCurrent (creatureStats.mDynamic[i].getModified()); creatureStats.mDynamic[i].setCurrent (creatureStats.mDynamic[i].getModified());
} }
void MechanicsManager::insertSpell (const std::string& id, MWWorld::Ptr& creature)
{
MWMechanics::CreatureStats& creatureStats =
MWWorld::Class::get (creature).getCreatureStats (creature);
const ESM::Spell *spell = mEnvironment.mWorld->getStore().spells.find (id);
switch (spell->data.type)
{
case ESM::Spell::ST_Ability:
if (creatureStats.mAbilities.find (id)==creatureStats.mAbilities.end())
{
creatureStats.mAbilities.insert (id);
// TODO apply effects
}
break;
// TODO ST_SPELL, ST_Blight, ST_Disease, ST_Curse, ST_Power
default:
std::cout
<< "adding unsupported spell type (" << spell->data.type
<< ") to creature: " << id << std::endl;
}
}
MechanicsManager::MechanicsManager (MWWorld::Environment& environment) MechanicsManager::MechanicsManager (MWWorld::Environment& environment)
: mEnvironment (environment), mUpdatePlayer (true), mClassSelected (false), : mEnvironment (environment), mUpdatePlayer (true), mClassSelected (false),
mRaceSelected (false) mRaceSelected (false)

View file

@ -30,6 +30,8 @@ namespace MWMechanics
///< build player according to stored class/race/birthsign information. Will ///< build player according to stored class/race/birthsign information. Will
/// default to the values of the ESM::NPC object, if no explicit information is given. /// default to the values of the ESM::NPC object, if no explicit information is given.
void insertSpell (const std::string& id, MWWorld::Ptr& creature);
public: public:
MechanicsManager (MWWorld::Environment& environment); MechanicsManager (MWWorld::Environment& environment);