#include "mechanicsmanager.hpp" #include #include "../mwgui/window_manager.hpp" #include "../mwworld/class.hpp" #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" namespace MWMechanics { void MechanicsManager::buildPlayer() { MWWorld::Ptr ptr = mEnvironment.mWorld->getPlayerPos().getPlayer(); MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get (ptr).getCreatureStats (ptr); // MWMechanics::NpcStats& npcStats = MWWorld::Class::get (ptr).getNpcStats (ptr); const ESM::NPC *player = ptr.get()->base; // reset creatureStats.mAttributes[0].setBase (player->npdt52.strength); creatureStats.mAttributes[1].setBase (player->npdt52.intelligence); creatureStats.mAttributes[2].setBase (player->npdt52.willpower); creatureStats.mAttributes[3].setBase (player->npdt52.agility); creatureStats.mAttributes[4].setBase (player->npdt52.speed); creatureStats.mAttributes[5].setBase (player->npdt52.endurance); creatureStats.mAttributes[6].setBase (player->npdt52.personality); creatureStats.mAttributes[7].setBase (player->npdt52.luck); // race // birthsign // class // calculate dynamic stats int strength = creatureStats.mAttributes[0].getBase(); int intelligence = creatureStats.mAttributes[1].getBase(); int willpower = creatureStats.mAttributes[2].getBase(); int agility = creatureStats.mAttributes[3].getBase(); int endurance = creatureStats.mAttributes[5].getBase(); creatureStats.mDynamic[0].setBase (static_cast (0.5 * (strength + endurance))); // TODO: calculate factor creatureStats.mDynamic[1].setBase (static_cast (intelligence + 1 * intelligence)); creatureStats.mDynamic[2].setBase (strength+willpower+agility+endurance); for (int i=0; i<3; ++i) creatureStats.mDynamic[i].setCurrent (creatureStats.mDynamic[i].getModified()); } MechanicsManager::MechanicsManager (MWWorld::Environment& environment) : mEnvironment (environment), mUpdatePlayer (true) { buildPlayer(); } void MechanicsManager::addActor (const MWWorld::Ptr& ptr) { mActors.insert (ptr); } void MechanicsManager::removeActor (const MWWorld::Ptr& ptr) { mActors.erase (ptr); } void MechanicsManager::dropActors (const MWWorld::Ptr::CellStore *cellStore) { std::set::iterator iter = mActors.begin(); while (iter!=mActors.end()) if (iter->getCell()==cellStore) { mActors.erase (iter++); } else ++iter; } void MechanicsManager::watchActor (const MWWorld::Ptr& ptr) { mWatched = ptr; } void MechanicsManager::update() { if (!mWatched.isEmpty()) { MWMechanics::CreatureStats& stats = MWWorld::Class::get (mWatched).getCreatureStats (mWatched); static const char *attributeNames[8] = { "AttribVal1", "AttribVal2", "AttribVal3", "AttribVal4", "AttribVal5", "AttribVal6", "AttribVal7", "AttribVal8" }; static const char *dynamicNames[3] = { "HBar", "MBar", "FBar" }; for (int i=0; i<8; ++i) { if (stats.mAttributes[i]!=mWatchedCreature.mAttributes[i]) { mWatchedCreature.mAttributes[i] = stats.mAttributes[i]; mEnvironment.mWindowManager->setValue (attributeNames[i], stats.mAttributes[i]); } } for (int i=0; i<3; ++i) { if (stats.mDynamic[i]!=mWatchedCreature.mDynamic[i]) { mWatchedCreature.mDynamic[i] = stats.mDynamic[i]; mEnvironment.mWindowManager->setValue (dynamicNames[i], stats.mDynamic[i]); } } } if (mUpdatePlayer) { // basic player profile; should not change anymore after the creation phase is finished. mEnvironment.mWindowManager->setValue ("name", mEnvironment.mWorld->getPlayerPos().getName()); mEnvironment.mWindowManager->setValue ("race", mEnvironment.mWorld->getPlayerPos().getRace()); mEnvironment.mWindowManager->setValue ("class", mEnvironment.mWorld->getPlayerPos().getClass().name); mUpdatePlayer = false; } } void MechanicsManager::setPlayerName (const std::string& name) { mEnvironment.mWorld->getPlayerPos().setName (name); mUpdatePlayer = true; } void MechanicsManager::setPlayerRace (const std::string& race, bool male) { mEnvironment.mWorld->getPlayerPos().setGender (male); mEnvironment.mWorld->getPlayerPos().setRace (race); buildPlayer(); mUpdatePlayer = true; } void MechanicsManager::setPlayerBirthsign (const std::string& id) { mEnvironment.mWorld->getPlayerPos().setBirthsign (id); buildPlayer(); } void MechanicsManager::setPlayerClass (const std::string& id) { mEnvironment.mWorld->getPlayerPos().setClass (*mEnvironment.mWorld->getStore().classes.find (id)); buildPlayer(); mUpdatePlayer = true; } void MechanicsManager::setPlayerClass (const ESM::Class& class_) { mEnvironment.mWorld->getPlayerPos().setClass (class_); buildPlayer(); mUpdatePlayer = true; } }