forked from teamnwah/openmw-tes3coop
factored out actor related game mechanics code into a separate class
This commit is contained in:
parent
8d7bf34348
commit
d717b7b9dd
5 changed files with 97 additions and 24 deletions
|
@ -54,7 +54,7 @@ add_openmw_dir (mwclass
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwmechanics
|
add_openmw_dir (mwmechanics
|
||||||
mechanicsmanager stat creaturestats magiceffects movement
|
mechanicsmanager stat creaturestats magiceffects movement actors
|
||||||
)
|
)
|
||||||
|
|
||||||
# Main executable
|
# Main executable
|
||||||
|
|
44
apps/openmw/mwmechanics/actors.cpp
Normal file
44
apps/openmw/mwmechanics/actors.cpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
|
||||||
|
#include "actors.hpp"
|
||||||
|
|
||||||
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
|
namespace MWMechanics
|
||||||
|
{
|
||||||
|
Actors::Actors (MWWorld::Environment& environment) : mEnvironment (environment) {}
|
||||||
|
|
||||||
|
void Actors::addActor (const MWWorld::Ptr& ptr)
|
||||||
|
{
|
||||||
|
mActors.insert (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actors::removeActor (const MWWorld::Ptr& ptr)
|
||||||
|
{
|
||||||
|
mActors.erase (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actors::dropActors (const MWWorld::Ptr::CellStore *cellStore)
|
||||||
|
{
|
||||||
|
std::set<MWWorld::Ptr>::iterator iter = mActors.begin();
|
||||||
|
|
||||||
|
while (iter!=mActors.end())
|
||||||
|
if (iter->getCell()==cellStore)
|
||||||
|
{
|
||||||
|
mActors.erase (iter++);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actors::update (std::vector<std::pair<std::string, Ogre::Vector3> >& movement)
|
||||||
|
{
|
||||||
|
for (std::set<MWWorld::Ptr>::iterator iter (mActors.begin()); iter!=mActors.end();
|
||||||
|
++iter)
|
||||||
|
{
|
||||||
|
Ogre::Vector3 vector = MWWorld::Class::get (*iter).getMovementVector (*iter);
|
||||||
|
|
||||||
|
if (vector!=Ogre::Vector3::ZERO)
|
||||||
|
movement.push_back (std::make_pair (iter->getRefData().getHandle(), vector));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
apps/openmw/mwmechanics/actors.hpp
Normal file
45
apps/openmw/mwmechanics/actors.hpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#ifndef GAME_MWMECHANICS_ACTORS_H
|
||||||
|
#define GAME_MWMECHANICS_ACTORS_H
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
|
namespace Ogre
|
||||||
|
{
|
||||||
|
class Vector3;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
class Environment;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace MWMechanics
|
||||||
|
{
|
||||||
|
class Actors
|
||||||
|
{
|
||||||
|
MWWorld::Environment& mEnvironment;
|
||||||
|
std::set<MWWorld::Ptr> mActors;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Actors (MWWorld::Environment& environment);
|
||||||
|
|
||||||
|
void addActor (const MWWorld::Ptr& ptr);
|
||||||
|
///< Register an actor for stats management
|
||||||
|
|
||||||
|
void removeActor (const MWWorld::Ptr& ptr);
|
||||||
|
///< Deregister an actor for stats management
|
||||||
|
|
||||||
|
void dropActors (const MWWorld::Ptr::CellStore *cellStore);
|
||||||
|
///< Deregister all actors in the given cell.
|
||||||
|
|
||||||
|
void update (std::vector<std::pair<std::string, Ogre::Vector3> >& movement);
|
||||||
|
///< Update actor stats and store desired velocity vectors in \a movement
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -222,14 +222,14 @@ namespace MWMechanics
|
||||||
|
|
||||||
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), mActors (environment)
|
||||||
{
|
{
|
||||||
buildPlayer();
|
buildPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::addActor (const MWWorld::Ptr& ptr)
|
void MechanicsManager::addActor (const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
mActors.insert (ptr);
|
mActors.addActor (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::removeActor (const MWWorld::Ptr& ptr)
|
void MechanicsManager::removeActor (const MWWorld::Ptr& ptr)
|
||||||
|
@ -237,7 +237,7 @@ namespace MWMechanics
|
||||||
if (ptr==mWatched)
|
if (ptr==mWatched)
|
||||||
mWatched = MWWorld::Ptr();
|
mWatched = MWWorld::Ptr();
|
||||||
|
|
||||||
mActors.erase (ptr);
|
mActors.removeActor (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::dropActors (const MWWorld::Ptr::CellStore *cellStore)
|
void MechanicsManager::dropActors (const MWWorld::Ptr::CellStore *cellStore)
|
||||||
|
@ -245,16 +245,7 @@ namespace MWMechanics
|
||||||
if (!mWatched.isEmpty() && mWatched.getCell()==cellStore)
|
if (!mWatched.isEmpty() && mWatched.getCell()==cellStore)
|
||||||
mWatched = MWWorld::Ptr();
|
mWatched = MWWorld::Ptr();
|
||||||
|
|
||||||
std::set<MWWorld::Ptr>::iterator iter = mActors.begin();
|
mActors.dropActors (cellStore);
|
||||||
|
|
||||||
while (iter!=mActors.end())
|
|
||||||
if (iter->getCell()==cellStore)
|
|
||||||
{
|
|
||||||
//std::cout << "Erasing an actor";
|
|
||||||
mActors.erase (iter++);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++iter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::watchActor (const MWWorld::Ptr& ptr)
|
void MechanicsManager::watchActor (const MWWorld::Ptr& ptr)
|
||||||
|
@ -345,14 +336,7 @@ namespace MWMechanics
|
||||||
mEnvironment.mWindowManager->configureSkills (majorSkills, minorSkills);
|
mEnvironment.mWindowManager->configureSkills (majorSkills, minorSkills);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::set<MWWorld::Ptr>::iterator iter (mActors.begin()); iter!=mActors.end();
|
mActors.update (movement);
|
||||||
++iter)
|
|
||||||
{
|
|
||||||
Ogre::Vector3 vector = MWWorld::Class::get (*iter).getMovementVector (*iter);
|
|
||||||
|
|
||||||
if (vector!=Ogre::Vector3::ZERO)
|
|
||||||
movement.push_back (std::make_pair (iter->getRefData().getHandle(), vector));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::setPlayerName (const std::string& name)
|
void MechanicsManager::setPlayerName (const std::string& name)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef GAME_MWMECHANICS_MECHANICSMANAGER_H
|
#ifndef GAME_MWMECHANICS_MECHANICSMANAGER_H
|
||||||
#define GAME_MWMECHANICS_MECHANICSMANAGER_H
|
#define GAME_MWMECHANICS_MECHANICSMANAGER_H
|
||||||
|
|
||||||
#include <set>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -9,6 +8,7 @@
|
||||||
|
|
||||||
#include "creaturestats.hpp"
|
#include "creaturestats.hpp"
|
||||||
#include "npcstats.hpp"
|
#include "npcstats.hpp"
|
||||||
|
#include "actors.hpp"
|
||||||
|
|
||||||
namespace Ogre
|
namespace Ogre
|
||||||
{
|
{
|
||||||
|
@ -25,13 +25,13 @@ namespace MWMechanics
|
||||||
class MechanicsManager
|
class MechanicsManager
|
||||||
{
|
{
|
||||||
MWWorld::Environment& mEnvironment;
|
MWWorld::Environment& mEnvironment;
|
||||||
std::set<MWWorld::Ptr> mActors;
|
|
||||||
MWWorld::Ptr mWatched;
|
MWWorld::Ptr mWatched;
|
||||||
CreatureStats mWatchedCreature;
|
CreatureStats mWatchedCreature;
|
||||||
NpcStats mWatchedNpc;
|
NpcStats mWatchedNpc;
|
||||||
bool mUpdatePlayer;
|
bool mUpdatePlayer;
|
||||||
bool mClassSelected;
|
bool mClassSelected;
|
||||||
bool mRaceSelected;
|
bool mRaceSelected;
|
||||||
|
Actors mActors;
|
||||||
|
|
||||||
void buildPlayer();
|
void buildPlayer();
|
||||||
///< build player according to stored class/race/birthsign information. Will
|
///< build player according to stored class/race/birthsign information. Will
|
||||||
|
|
Loading…
Reference in a new issue