Made code a bit more standardized and added a good bit of documentation.

This commit is contained in:
Thomas 2014-04-29 23:40:59 -04:00
parent 8f90dd43ec
commit 10a5bb9464
11 changed files with 152 additions and 107 deletions

View file

@ -46,10 +46,7 @@ namespace MyGUI
namespace MWInput namespace MWInput
{ {
/// \brief Class that handles all input and key bindings for OpenMW.
/**
* @brief Class that handles all input and key bindings for OpenMW.
*/
class InputManager : class InputManager :
public MWBase::InputManager, public MWBase::InputManager,
public SFO::KeyListener, public SFO::KeyListener,
@ -68,6 +65,7 @@ namespace MWInput
/// Clear all savegame-specific data /// Clear all savegame-specific data
virtual void clear(); virtual void clear();
virtual void update(float dt, bool disableControls=false, bool disableEvents=false); virtual void update(float dt, bool disableControls=false, bool disableEvents=false);
void setPlayer (MWWorld::Player* player) { mPlayer = player; } void setPlayer (MWWorld::Player* player) { mPlayer = player; }

View file

@ -8,14 +8,15 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief Causes actor to walk to activatable object and activate it
class AiActivate : public AiPackage class AiActivate : public AiPackage
{ {
public: public:
/// Constructor
/** \param objectId Reference to object to activate **/
AiActivate(const std::string &objectId); AiActivate(const std::string &objectId);
virtual AiActivate *clone() const; virtual AiActivate *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;
private: private:

View file

@ -14,20 +14,23 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief Causes the actor to fight another actor
class AiCombat : public AiPackage class AiCombat : public AiPackage
{ {
public: public:
///Constructor
/** \param actor Actor to fight **/
AiCombat(const MWWorld::Ptr& actor); AiCombat(const MWWorld::Ptr& actor);
virtual AiCombat *clone() const; virtual AiCombat *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;
virtual unsigned int getPriority() const; virtual unsigned int getPriority() const;
///Returns target ID
const std::string &getTargetId() const; const std::string &getTargetId() const;
private: private:

View file

@ -8,18 +8,22 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief AI Package to have an NPC lead the player to a specific point
class AiEscort : public AiPackage class AiEscort : public AiPackage
{ {
public: public:
/// Implementation of AiEscort
/** The Actor will escort the specified actor to the world position x, y, z until they reach their position, or they run out of time
\implement AiEscort **/
AiEscort(const std::string &actorId,int duration, float x, float y, float z); AiEscort(const std::string &actorId,int duration, float x, float y, float z);
///< \implement AiEscort /// Implementation of AiEscortCell
/** The Actor will escort the specified actor to the cell position x, y, z until they reach their position, or they run out of time
\implement AiEscortCell **/
AiEscort(const std::string &actorId,const std::string &cellId,int duration, float x, float y, float z); AiEscort(const std::string &actorId,const std::string &cellId,int duration, float x, float y, float z);
///< \implement AiEscortCell
virtual AiEscort *clone() const; virtual AiEscort *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;

View file

@ -8,22 +8,32 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief AiPackage for an actor to follow another actor/the PC
/** The AI will follow the target until a condition (time, or position) are set. Both can be disabled to cause the actor to follow the other indefinitely
**/
class AiFollow : public AiPackage class AiFollow : public AiPackage
{ {
public: public:
/// Follow Actor for duration or until you arrive at a world position
AiFollow(const std::string &ActorId,float duration, float X, float Y, float Z); AiFollow(const std::string &ActorId,float duration, float X, float Y, float Z);
/// Follow Actor for duration or until you arrive at a position in a cell
AiFollow(const std::string &ActorId,const std::string &CellId,float duration, float X, float Y, float Z); AiFollow(const std::string &ActorId,const std::string &CellId,float duration, float X, float Y, float Z);
/// Follow Actor indefinitively
AiFollow(const std::string &ActorId); AiFollow(const std::string &ActorId);
virtual AiFollow *clone() const; virtual AiFollow *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;
/// Returns the actor being followed
std::string getFollowedActor(); std::string getFollowedActor();
private: private:
bool mAlwaysFollow; //this will make the actor always follow, thus ignoring mDuration and mX,mY,mZ (used for summoned creatures). /// This will make the actor always follow.
/** Thus ignoring mDuration and mX,mY,mZ (used for summoned creatures). **/
bool mAlwaysFollow;
float mDuration; float mDuration;
float mX; float mX;
float mY; float mY;

View file

@ -12,6 +12,7 @@ namespace MWMechanics
class AiPackage class AiPackage
{ {
public: public:
///Enumerates the various AITypes availible.
enum TypeId { enum TypeId {
TypeIdNone = -1, TypeIdNone = -1,
TypeIdWander = 0, TypeIdWander = 0,
@ -23,18 +24,22 @@ namespace MWMechanics
TypeIdPersue = 6 TypeIdPersue = 6
}; };
///Default Deconstructor
virtual ~AiPackage(); virtual ~AiPackage();
///Clones the package
virtual AiPackage *clone() const = 0; virtual AiPackage *clone() const = 0;
/// Updates and runs the package (Should run every frame)
/// \return Package completed?
virtual bool execute (const MWWorld::Ptr& actor,float duration) = 0; virtual bool execute (const MWWorld::Ptr& actor,float duration) = 0;
///< \return Package completed?
/// Returns the TypeID of the AiPackage
/// \see enum TypeId
virtual int getTypeId() const = 0; virtual int getTypeId() const = 0;
///< @see enum TypeId
/// Higher number is higher priority (0 beeing the lowest)
virtual unsigned int getPriority() const {return 0;} virtual unsigned int getPriority() const {return 0;}
///< higher number is higher priority (0 beeing the lowest)
}; };
} }

View file

@ -8,14 +8,16 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief Makes the actor very closely follow the actor
/** Used for getting closer to fight, or to arrest (I think?) **/
class AiPersue : public AiPackage class AiPersue : public AiPackage
{ {
public: public:
///Constructor
/** \param objectId Actor to pursue **/
AiPersue(const std::string &objectId); AiPersue(const std::string &objectId);
virtual AiPersue *clone() const; virtual AiPersue *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;
private: private:

View file

@ -15,63 +15,77 @@ namespace MWMechanics
class AiPackage; class AiPackage;
/// \brief Sequence of AI-packages for a single actor /// \brief Sequence of AI-packages for a single actor
/** Each package will be run in succession for an actor until completed **/
class AiSequence class AiSequence
{ {
///AiPackages to run though
std::list<AiPackage *> mPackages; std::list<AiPackage *> mPackages;
///Finished with all AiPackages
bool mDone; bool mDone;
///Copy AiSequence
void copy (const AiSequence& sequence); void copy (const AiSequence& sequence);
// The type of AI package that ran last /// The type of AI package that ran last
int mLastAiPackage; int mLastAiPackage;
public: public:
///Default constructor
AiSequence(); AiSequence();
/// Copy Constructor
AiSequence (const AiSequence& sequence); AiSequence (const AiSequence& sequence);
/// Assignment operator
AiSequence& operator= (const AiSequence& sequence); AiSequence& operator= (const AiSequence& sequence);
/// Destructor
virtual ~AiSequence(); virtual ~AiSequence();
/// Returns currently executing AiPackage type
/** \see enum AiPackage::TypeId **/
int getTypeId() const; int getTypeId() const;
///< @see enum AiPackage::TypeId
/// Get the typeid of the Ai package that ran last
/** NOT the currently "active" Ai package that will be run in the next frame.
This difference is important when an Ai package has just finished and been removed.
\see enum AiPackage::TypeId **/
int getLastRunTypeId() const { return mLastAiPackage; } int getLastRunTypeId() const { return mLastAiPackage; }
///< Get the typeid of the Ai package that ran last, NOT the currently "active" Ai package that will be run in the next frame.
/// This difference is important when an Ai package has just finished and been removed.
/// Return true and assign target if combat package is currently active, return false otherwise
bool getCombatTarget (std::string &targetActorId) const; bool getCombatTarget (std::string &targetActorId) const;
///< Return true and assign target if combat package is currently
/// active, return false otherwise
/// Removes all combat packages until first non-combat or stack empty.
void stopCombat(); void stopCombat();
///< Removes all combat packages until first non-combat or stack empty.
/// Removes all persue packages until first non-persue or stack empty.
void stopPersue(); void stopPersue();
///< Removes all persue packages until first non-persue or stack empty.
/// Has a package been completed during the last update?
bool isPackageDone() const; bool isPackageDone() const;
///< Has a package been completed during the last update?
/// Execute current package, switching if needed.
void execute (const MWWorld::Ptr& actor,float duration); void execute (const MWWorld::Ptr& actor,float duration);
///< Execute package.
/// Remove all packages.
void clear(); void clear();
///< Remove all packages.
///< Add \a package to the front of the sequence
/** Suspends current package **/
void stack (const AiPackage& package, const MWWorld::Ptr& actor); void stack (const AiPackage& package, const MWWorld::Ptr& actor);
///< Add \a package to the front of the sequence (suspends current package)
/// Add \a package to the end of the sequence
/** Executed after all other packages have been completed **/
void queue (const AiPackage& package); void queue (const AiPackage& package);
///< Add \a package to the end of the sequence (executed after all other packages have been
/// completed)
/// Return the current active package.
/** If there is no active package, it will throw an exception **/
AiPackage* getActivePackage(); AiPackage* getActivePackage();
///< return the current active package. If there is no active package, throw an exeption
/// Fills the AiSequence with packages
/** Typically used for loading from the ESM
\see ESM::AIPackageList **/
void fill (const ESM::AIPackageList& list); void fill (const ESM::AIPackageList& list);
}; };
} }

View file

@ -7,14 +7,15 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief Causes the AI to travel to the specified point
class AiTravel : public AiPackage class AiTravel : public AiPackage
{ {
public: public:
/// Default constructor
AiTravel(float x, float y, float z); AiTravel(float x, float y, float z);
virtual AiTravel *clone() const; virtual AiTravel *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration); virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const; virtual int getTypeId() const;

View file

@ -14,20 +14,27 @@
namespace MWMechanics namespace MWMechanics
{ {
/// \brief Causes the Actor to wander within a specified range
class AiWander : public AiPackage class AiWander : public AiPackage
{ {
public: public:
/// Constructor
/** \param distance Max distance the ACtor will wander
\param duration Time, in hours, that this package will be preformed
\param timeOfDay Start time of the package, if it has a duration. Currently unimplemented
\param idle Chances of each idle to play (9 in total)
\param repeat Repeat wander or not **/
AiWander(int distance, int duration, int timeOfDay, const std::vector<int>& idle, bool repeat); AiWander(int distance, int duration, int timeOfDay, const std::vector<int>& idle, bool repeat);
virtual AiPackage *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration);
///< \return Package completed?
virtual int getTypeId() const;
///< 0: Wander
virtual AiPackage *clone() const;
virtual bool execute (const MWWorld::Ptr& actor,float duration);
virtual int getTypeId() const;
/// Set the position to return to for a stationary (non-wandering) actor
/** In case another AI package moved the actor elsewhere **/
void setReturnPosition (const Ogre::Vector3& position); void setReturnPosition (const Ogre::Vector3& position);
///< Set the position to return to for a stationary (non-wandering) actor, in case
/// another AI package moved the actor elsewhere
private: private:
void stopWalking(const MWWorld::Ptr& actor); void stopWalking(const MWWorld::Ptr& actor);

View file

@ -31,6 +31,8 @@ namespace MWMechanics
typedef std::vector<ESM::ENAMstruct> TEffectsContainer; typedef std::vector<ESM::ENAMstruct> TEffectsContainer;
typedef TEffectsContainer::const_iterator TEffectsIterator; typedef TEffectsContainer::const_iterator TEffectsIterator;
/// Result of potion creation
/** Only Result_Success results in success **/
enum Result enum Result
{ {
Result_Success, Result_Success,
@ -42,6 +44,46 @@ namespace MWMechanics
Result_RandomFailure Result_RandomFailure
}; };
/// Set alchemist and configure alchemy setup accordingly.
/** \a npc may be empty to indicate that there is no alchemist (alchemy session has ended). **/
void setAlchemist (const MWWorld::Ptr& npc);
/// \attention Iterates over tool slots, not over tools. Some of the slots may be empty.
TToolsIterator beginTools() const;
TToolsIterator endTools() const;
/// \attention Iterates over ingredient slots, not over ingredients. Some of the slots may be empty.
TIngredientsIterator beginIngredients() const;
TIngredientsIterator endIngredients() const;
/// Remove alchemist, tools and ingredients.
void clear();
/// Add ingredient into the next free slot.
///
/// \return Slot index or -1, if adding failed because of no free slot or the ingredient type being
/// listed already.
int addIngredient (const MWWorld::Ptr& ingredient);
/// Remove ingredient from slot (calling this function on an empty slot is a no-op).
void removeIngredient (int index);
TEffectsIterator beginEffects() const;
TEffectsIterator endEffects() const;
/// Return the name of the potion that would be created when calling create (if a record for such
/// a potion already exists) or return an empty string.
std::string getPotionName() const;
/// Try to create a potion from the ingredients, place it in the inventory of the alchemist and
/// adjust the skills of the alchemist accordingly.
/// \param name must not be an empty string, unless there is already a potion record (
/// getPotionName() does not return an empty string).
Result create (const std::string& name);
private: private:
MWWorld::Ptr mAlchemist; MWWorld::Ptr mAlchemist;
@ -50,19 +92,19 @@ namespace MWMechanics
TEffectsContainer mEffects; TEffectsContainer mEffects;
int mValue; int mValue;
/// List all effects shared by at least two ingredients.
std::set<EffectKey> listEffects() const; std::set<EffectKey> listEffects() const;
///< List all effects shared by at least two ingredients.
void applyTools (int flags, float& value) const; void applyTools (int flags, float& value) const;
void updateEffects(); void updateEffects();
/// Return existing recrod for created potion (may return 0)
const ESM::Potion *getRecord() const; const ESM::Potion *getRecord() const;
///< Return existing recrod for created potion (may return 0)
void removeIngredients(); /// Remove selected ingredients from alchemist's inventory, cleanup selected ingredients and
///< Remove selected ingredients from alchemist's inventory, cleanup selected ingredients and
/// update effect list accordingly. /// update effect list accordingly.
void removeIngredients();
void addPotion (const std::string& name); void addPotion (const std::string& name);
///< Add a potion to the alchemist's inventory. ///< Add a potion to the alchemist's inventory.
@ -74,48 +116,6 @@ namespace MWMechanics
///< Return chance of success. ///< Return chance of success.
int countIngredients() const; int countIngredients() const;
public:
void setAlchemist (const MWWorld::Ptr& npc);
///< Set alchemist and configure alchemy setup accordingly. \a npc may be empty to indicate that
/// there is no alchemist (alchemy session has ended).
TToolsIterator beginTools() const;
///< \attention Iterates over tool slots, not over tools. Some of the slots may be empty.
TToolsIterator endTools() const;
TIngredientsIterator beginIngredients() const;
///< \attention Iterates over ingredient slots, not over ingredients. Some of the slots may be empty.
TIngredientsIterator endIngredients() const;
void clear();
///< Remove alchemist, tools and ingredients.
int addIngredient (const MWWorld::Ptr& ingredient);
///< Add ingredient into the next free slot.
///
/// \return Slot index or -1, if adding failed because of no free slot or the ingredient type being
/// listed already.
void removeIngredient (int index);
///< Remove ingredient from slot (calling this function on an empty slot is a no-op).
TEffectsIterator beginEffects() const;
TEffectsIterator endEffects() const;
std::string getPotionName() const;
///< Return the name of the potion that would be created when calling create (if a record for such
/// a potion already exists) or return an empty string.
Result create (const std::string& name);
///< Try to create a potion from the ingredients, place it in the inventory of the alchemist and
/// adjust the skills of the alchemist accordingly.
/// \param name must not be an empty string, unless there is already a potion record (
/// getPotionName() does not return an empty string).
}; };
} }