From eeca39220b7a9ec53750a295dd4434e49b31c123 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 30 Sep 2010 14:28:01 +0200 Subject: [PATCH] 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 --- apps/openmw/mwmechanics/creaturestats.hpp | 4 ++ apps/openmw/mwmechanics/mechanicsmanager.cpp | 46 +++++++++++++++++++- apps/openmw/mwmechanics/mechanicsmanager.hpp | 2 + 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index c1eae578f..9c6481da9 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -1,6 +1,9 @@ #ifndef GAME_MWMECHANICS_CREATURESTATS_H #define GAME_MWMECHANICS_CREATURESTATS_H +#include +#include + #include "stat.hpp" namespace MWMechanics @@ -10,6 +13,7 @@ namespace MWMechanics Stat mAttributes[8]; DynamicStat mDynamic[3]; // health, magicka, fatigue int mLevel; + std::set mAbilities; }; } diff --git a/apps/openmw/mwmechanics/mechanicsmanager.cpp b/apps/openmw/mwmechanics/mechanicsmanager.cpp index c0aec2308..34fffa13e 100644 --- a/apps/openmw/mwmechanics/mechanicsmanager.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanager.cpp @@ -22,6 +22,7 @@ namespace MWMechanics // reset creatureStats.mLevel = player->npdt52.level; + creatureStats.mAbilities.clear(); for (int i=0; i<27; ++i) npcStats.mSkill[i].setBase (player->npdt52.skills[i]); @@ -65,13 +66,25 @@ namespace MWMechanics } } - // TODO handle magic effects + for (std::vector::const_iterator iter (race->powers.list.begin()); + iter!=race->powers.list.end(); ++iter) + { + insertSpell (*iter, ptr); + } } // birthsign 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::const_iterator iter (sign->powers.list.begin()); + iter!=sign->powers.list.end(); ++iter) + { + insertSpell (*iter, ptr); + } } // class @@ -139,6 +152,35 @@ namespace MWMechanics 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) : mEnvironment (environment), mUpdatePlayer (true), mClassSelected (false), mRaceSelected (false) diff --git a/apps/openmw/mwmechanics/mechanicsmanager.hpp b/apps/openmw/mwmechanics/mechanicsmanager.hpp index 96926a8ff..2d85c2ac2 100644 --- a/apps/openmw/mwmechanics/mechanicsmanager.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanager.hpp @@ -30,6 +30,8 @@ namespace MWMechanics ///< 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. + void insertSpell (const std::string& id, MWWorld::Ptr& creature); + public: MechanicsManager (MWWorld::Environment& environment);