From 4684bfb34ca0ed06c998bfe3c1369f94e8532b0d Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Fri, 30 Mar 2007 21:48:39 +0000 Subject: Separated the Thing and MovingObject classes from the Object module. --- src/Makefile.am | 6 +- src/game-server/being.hpp | 2 +- src/game-server/movingobject.cpp | 102 ++++++++++++++++++++ src/game-server/movingobject.hpp | 134 ++++++++++++++++++++++++++ src/game-server/object.cpp | 102 -------------------- src/game-server/object.hpp | 198 ++------------------------------------- src/game-server/thing.hpp | 113 ++++++++++++++++++++++ src/game-server/trigger.cpp | 4 +- src/game-server/trigger.hpp | 12 ++- 9 files changed, 374 insertions(+), 299 deletions(-) create mode 100644 src/game-server/movingobject.cpp create mode 100644 src/game-server/movingobject.hpp delete mode 100644 src/game-server/object.cpp create mode 100644 src/game-server/thing.hpp (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index c8a9037f..3df85d79 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -102,11 +102,13 @@ tmwserv_game_SOURCES = \ game-server/mapreader.cpp \ game-server/monster.hpp \ game-server/monster.cpp \ + game-server/movingobject.hpp \ + game-server/movingobject.cpp \ game-server/object.hpp \ - game-server/object.cpp \ game-server/state.hpp \ game-server/state.cpp \ game-server/testing.cpp \ + game-server/thing.hpp \ game-server/trigger.hpp \ game-server/trigger.cpp \ net/connection.hpp \ @@ -170,4 +172,4 @@ bindings_wrap.cpp: bindings.i $(SWIG) $(SWIGFLAGS) -o bindings_wrap.cpp bindings.i tmwserv_game_SOURCES += \ bindings_wrap.cpp -endif \ No newline at end of file +endif diff --git a/src/game-server/being.hpp b/src/game-server/being.hpp index cd613376..4423c68e 100644 --- a/src/game-server/being.hpp +++ b/src/game-server/being.hpp @@ -28,7 +28,7 @@ #include #include "defines.h" -#include "game-server/object.hpp" +#include "game-server/movingobject.hpp" class Being; class MapComposite; diff --git a/src/game-server/movingobject.cpp b/src/game-server/movingobject.cpp new file mode 100644 index 00000000..7eb040e3 --- /dev/null +++ b/src/game-server/movingobject.cpp @@ -0,0 +1,102 @@ +/* + * The Mana World Server + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or any later version. + * + * The Mana World is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with The Mana World; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "game-server/map.hpp" +#include "game-server/mapmanager.hpp" +#include "game-server/movingobject.hpp" + +void MovingObject::move() +{ + mOld = getPosition(); + if (mActionTime > 100) + { + // Current move has not yet ended + mActionTime -= 100; + return; + } + + int tileSX = mOld.x / 32, tileSY = mOld.y / 32; + int tileDX = mDst.x / 32, tileDY = mDst.y / 32; + if (tileSX == tileDX && tileSY == tileDY) + { + // Moving while staying on the same tile is free + setPosition(mDst); + mActionTime = 0; + return; + } + + Map *map = mapManager->getMap(getMapId()); + + /* If no path exists, the for-loop won't be entered. Else a path for the + * current destination has already been calculated. + * The tiles in this path have to be checked for walkability, + * in case there have been changes. The 'getWalk' method of the Map + * class has been used, because that seems to be the most logical + * place extra functionality will be added. + */ + for (std::list::iterator pathIterator = mPath.begin(); + pathIterator != mPath.end(); pathIterator++) + { + if (!map->getWalk(pathIterator->x, pathIterator->y)) + { + mPath.clear(); + break; + } + } + + if (mPath.empty()) + { + // No path exists: the walkability of cached path has changed, the + // destination has changed, or a path was never set. + mPath = map->findPath(tileSX, tileSY, tileDX, tileDY); + } + + if (mPath.empty()) + { + // no path was found + mDst = mOld; + mActionTime = 0; + return; + } + + PATH_NODE prev(tileSX, tileSY); + Point pos; + do + { + PATH_NODE next = mPath.front(); + mPath.pop_front(); + mActionTime += (prev.x != next.x && prev.y != next.y) + ? mSpeed * 362 / 256 : mSpeed; + if (mPath.empty()) + { + // skip last tile center + pos = mDst; + break; + } + pos.x = next.x * 32 + 16; + pos.y = next.y * 32 + 16; + } + while (mActionTime < 100); + setPosition(pos); + + mActionTime = mActionTime > 100 ? mActionTime - 100 : 0; +} diff --git a/src/game-server/movingobject.hpp b/src/game-server/movingobject.hpp new file mode 100644 index 00000000..99f1caa3 --- /dev/null +++ b/src/game-server/movingobject.hpp @@ -0,0 +1,134 @@ +/* + * The Mana World Server + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or any later version. + * + * The Mana World is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with The Mana World; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMWSERV_MOVINGOBJECT_H_ +#define _TMWSERV_MOVINGOBJECT_H_ + +#include "point.h" +#include "game-server/map.hpp" +#include "game-server/object.hpp" + + +/** + * Base class for in-game moving objects. This class adds a sense of direction, + * destination and size. + */ +class MovingObject : public Object +{ + public: + /** + * Proxy constructor. + */ + MovingObject(int type, int id) + : Object(type), + mPublicID(id), + mDirection(0), + mActionTime(0) + {} + + /** + * Gets the destination coordinates of the object. + */ + Point const &getDestination() const + { return mDst; } + + /** + * Sets the destination coordinates of the object. + */ + void setDestination(const Point &dst) + { + mDst = dst; + raiseUpdateFlags(UPDATEFLAG_NEW_DESTINATION); + mPath.clear(); + } + + /** + * Gets the old coordinates of the object. + */ + Point getOldPosition() const + { return mOld; } + + /** + * Sets object direction. + */ + void setDirection(int direction) + { mDirection = direction; } + + /** + * Gets object direction. + */ + unsigned char getDirection() const + { return mDirection; } + + /** + * Sets object speed. + */ + void setSpeed(unsigned s) + { mSpeed = s; } + + /** + * Sets object bounding circle radius. + */ + void setSize(unsigned s) + { mSize = s; } + + /** + * Gets object bounding circle radius. + */ + unsigned getSize() + { return mSize; } + + /** + * Moves the object toward its destination. + */ + virtual void move(); + + /** + * Get public ID. + * + * @return the public ID, 65535 if none yet. + */ + int getPublicID() const + { return mPublicID; } + + /** + * Set public ID. The object shall not have any public ID yet. + */ + void setPublicID(int id) + { mPublicID = id; } + + private: + /** Object ID sent to clients (unique with respect to the map). */ + unsigned short mPublicID; + + Point mDst; /**< Target coordinates. */ + Point mOld; /**< Old coordinates. */ + unsigned short mSpeed; /**< Speed. */ + std::list mPath; + + protected: + unsigned char mDirection; /**< Facing direction. */ + unsigned short mActionTime; /**< Delay until next action. */ + unsigned mSize; /**< Radius of bounding circle. */ +}; + +#endif // _TMWSERV_OBJECT_H_ diff --git a/src/game-server/object.cpp b/src/game-server/object.cpp deleted file mode 100644 index 5dcafb15..00000000 --- a/src/game-server/object.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * The Mana World Server - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or any later version. - * - * The Mana World is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with The Mana World; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "game-server/map.hpp" -#include "game-server/mapmanager.hpp" -#include "game-server/object.hpp" - -void MovingObject::move() -{ - mOld = getPosition(); - if (mActionTime > 100) - { - // Current move has not yet ended - mActionTime -= 100; - return; - } - - int tileSX = mOld.x / 32, tileSY = mOld.y / 32; - int tileDX = mDst.x / 32, tileDY = mDst.y / 32; - if (tileSX == tileDX && tileSY == tileDY) - { - // Moving while staying on the same tile is free - setPosition(mDst); - mActionTime = 0; - return; - } - - Map *map = mapManager->getMap(getMapId()); - - /* If no path exists, the for-loop won't be entered. Else a path for the - * current destination has already been calculated. - * The tiles in this path have to be checked for walkability, - * in case there have been changes. The 'getWalk' method of the Map - * class has been used, because that seems to be the most logical - * place extra functionality will be added. - */ - for (std::list::iterator pathIterator = mPath.begin(); - pathIterator != mPath.end(); pathIterator++) - { - if (!map->getWalk(pathIterator->x, pathIterator->y)) - { - mPath.clear(); - break; - } - } - - if (mPath.empty()) - { - // No path exists: the walkability of cached path has changed, the - // destination has changed, or a path was never set. - mPath = map->findPath(tileSX, tileSY, tileDX, tileDY); - } - - if (mPath.empty()) - { - // no path was found - mDst = mOld; - mActionTime = 0; - return; - } - - PATH_NODE prev(tileSX, tileSY); - Point pos; - do - { - PATH_NODE next = mPath.front(); - mPath.pop_front(); - mActionTime += (prev.x != next.x && prev.y != next.y) - ? mSpeed * 362 / 256 : mSpeed; - if (mPath.empty()) - { - // skip last tile center - pos = mDst; - break; - } - pos.x = next.x * 32 + 16; - pos.y = next.y * 32 + 16; - } - while (mActionTime < 100); - setPosition(pos); - - mActionTime = mActionTime > 100 ? mActionTime - 100 : 0; -} diff --git a/src/game-server/object.hpp b/src/game-server/object.hpp index 3071f710..6c30bb0d 100644 --- a/src/game-server/object.hpp +++ b/src/game-server/object.hpp @@ -20,28 +20,16 @@ * $Id$ */ - #ifndef _TMWSERV_OBJECT_H_ #define _TMWSERV_OBJECT_H_ -#include - #include "point.h" -#include "game-server/map.hpp" - -// Object type enumeration -enum -{ - OBJECT_ITEM = 0, // A simple item - OBJECT_ACTOR, // An item that toggle map/quest actions (doors, switchs, ...) and can speak (map panels). - OBJECT_NPC, // Non-Playable-Character is an actor capable of movement and maybe actions - OBJECT_MONSTER, // A monster (moving actor with AI. Should be able to toggle map/quest actions, too) - OBJECT_CHARACTER,// A normal being - OBJECT_OTHER // Server-only object -}; - -class MapComposite; +#include "game-server/thing.hpp" +/** + * Flags that are raised as necessary. They trigger messages that are sent to + * the clients. + */ enum { UPDATEFLAG_NEW_ON_MAP = 1, @@ -52,79 +40,10 @@ enum }; /** - * Base class for in-game objects. - */ -class Thing -{ - public: - /** - * Constructor. - */ - Thing(int type) - : mType(type) - {} - - /** - * Empty virtual destructor. - */ - virtual ~Thing() {} - - /** - * Gets type. - * - * @return the type. - */ - int getType() const - { return mType; } - - /** - * Returns whether this thing is visible on the map or not. (Object) - */ - bool isVisible() const - { return mType != OBJECT_OTHER; } - - /** - * Returns whether this thing can move on the map or not. (MovingObject) - */ - bool canMove() const - { return mType == OBJECT_CHARACTER || mType == OBJECT_MONSTER || - mType == OBJECT_NPC; } - - /** - * Returns whether this thing can fight or not. (Being) - */ - bool canFight() const - { return mType == OBJECT_CHARACTER || mType == OBJECT_MONSTER; } - - /** - * Updates the internal status. - */ - virtual void - update() = 0; - - /** - * Gets the map this thing is located on. - * - * @return ID of map. - */ - int getMapId() const - { return mMapId; } - - /** - * Sets the map this thing is located on. - */ - void setMapId(int mapId) - { mMapId = mapId; } - - private: - unsigned short mMapId; /**< id of the map being is on */ - char mType; /**< Object type */ -}; - -/** - * Generic client-visible object definition. + * Generic client-visible object definition. Keeps track of position and what + * to update clients about. */ -class Object: public Thing +class Object : public Thing { public: /** @@ -170,105 +89,8 @@ class Object: public Thing { mUpdateFlags = 0; } private: - char mUpdateFlags; /**< changes in object status */ - Point mPos; /**< coordinates */ -}; - -/** - * Base class for in-game moving objects. - */ -class MovingObject: public Object -{ - public: - /** - * Proxy constructor. - */ - MovingObject(int type, int id) - : Object(type), - mPublicID(id), - mDirection(0), - mActionTime(0) - {} - - /** - * Gets the destination coordinates of the object. - */ - Point const &getDestination() const - { return mDst; } - - /** - * Sets the destination coordinates of the object. - */ - void setDestination(Point dst) - { mDst = dst; raiseUpdateFlags(UPDATEFLAG_NEW_DESTINATION); mPath.clear(); } - - /** - * Gets the old coordinates of the object. - */ - Point getOldPosition() const - { return mOld; } - - /** - * Sets object direction - */ - void setDirection(int direction) - { mDirection = direction; } - - /** - * Gets object direction - */ - unsigned char getDirection() const - { return mDirection; } - - /** - * Sets object speed. - */ - void setSpeed(unsigned s) - { mSpeed = s; } - - /** - * Sets object bounding circle radius - */ - void setSize(unsigned s) - { mSize = s; } - - /** - * Gets object bounding circle radius - */ - unsigned getSize() - { return mSize; } - - /** - * Moves the object toward its destination. - */ - virtual void move(); - - /** - * Get public ID. - * - * @return the public ID, 65535 if none yet. - */ - int getPublicID() const - { return mPublicID; } - - /** - * Set public ID. - * The object shall not have any public ID yet. - */ - void setPublicID(int id) - { mPublicID = id; } - - private: - unsigned short mPublicID; /**< Object ID sent to clients (unique with respect to the map) */ - Point mDst; /**< target coordinates */ - Point mOld; /**< old coordinates */ - unsigned short mSpeed; /**< speed */ - std::list mPath; - - protected: - unsigned char mDirection; /**< Facing direction */ - unsigned short mActionTime; /**< delay until next action */ - unsigned mSize; /**< radius of bounding circle */ + char mUpdateFlags; /**< Changes in object status. */ + Point mPos; /**< Coordinates. */ }; #endif // _TMWSERV_OBJECT_H_ diff --git a/src/game-server/thing.hpp b/src/game-server/thing.hpp new file mode 100644 index 00000000..547885c4 --- /dev/null +++ b/src/game-server/thing.hpp @@ -0,0 +1,113 @@ +/* + * The Mana World Server + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or any later version. + * + * The Mana World is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with The Mana World; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMWSERV_THING_H_ +#define _TMWSERV_THING_H_ + +/** + * Object type enumeration. + */ +enum +{ + OBJECT_ITEM = 0, /**< A simple item. */ + OBJECT_ACTOR, /**< An item that toggle map/quest actions (doors, + switchs, ...) and can speak (map panels). */ + OBJECT_NPC, /**< Non-Playable-Character is an actor capable of + movement and maybe actions. */ + OBJECT_MONSTER, /**< A monster (moving actor with AI. Should be able to + toggle map/quest actions, too). */ + OBJECT_CHARACTER, /**< A normal being. */ + OBJECT_OTHER /**< Server-only object. */ +}; + +/** + * Base class for in-game objects. Knows only its type and the map is resides + * on. + */ +class Thing +{ + public: + /** + * Constructor. + */ + Thing(int type) + : mType(type) + {} + + /** + * Empty virtual destructor. + */ + virtual ~Thing() {} + + /** + * Gets type of this thing. + * + * @return the type of this thing. + */ + int getType() const + { return mType; } + + /** + * Returns whether this thing is visible on the map or not. (Object) + */ + bool isVisible() const + { return mType != OBJECT_OTHER; } + + /** + * Returns whether this thing can move on the map or not. (MovingObject) + */ + bool canMove() const + { return mType == OBJECT_CHARACTER || mType == OBJECT_MONSTER || + mType == OBJECT_NPC; } + + /** + * Returns whether this thing can fight or not. (Being) + */ + bool canFight() const + { return mType == OBJECT_CHARACTER || mType == OBJECT_MONSTER; } + + /** + * Updates the internal status. + */ + virtual void + update() = 0; + + /** + * Gets the map this thing is located on. + * + * @return ID of map. + */ + int getMapId() const + { return mMapId; } + + /** + * Sets the map this thing is located on. + */ + void setMapId(int mapId) + { mMapId = mapId; } + + private: + unsigned short mMapId; /**< ID of the map this thing is on. */ + char mType; /**< Type of this thing. */ +}; + +#endif // _TMWSERV_THING_H_ diff --git a/src/game-server/trigger.cpp b/src/game-server/trigger.cpp index 4e593f4f..d658c7ae 100644 --- a/src/game-server/trigger.cpp +++ b/src/game-server/trigger.cpp @@ -21,10 +21,12 @@ * $Id$ */ +#include "game-server/trigger.hpp" + #include "game-server/mapcomposite.hpp" +#include "game-server/movingobject.hpp" #include "game-server/object.hpp" #include "game-server/state.hpp" -#include "game-server/trigger.hpp" void WarpAction::process(Object *obj) { diff --git a/src/game-server/trigger.hpp b/src/game-server/trigger.hpp index a3455ae4..c24e73be 100644 --- a/src/game-server/trigger.hpp +++ b/src/game-server/trigger.hpp @@ -25,28 +25,30 @@ #define _TMWSERV_TRIGGER #include "point.h" -#include "game-server/object.hpp" +#include "game-server/thing.hpp" + +class Object; class TriggerAction { public: virtual ~TriggerAction() {} - virtual void process(Object *) = 0; + virtual void process(Object *obj) = 0; }; -class WarpAction: public TriggerAction +class WarpAction : public TriggerAction { public: WarpAction(int m, int x, int y) : mMap(m), mX(x), mY(y) {} - virtual void process(Object *); + virtual void process(Object *obj); private: unsigned short mMap, mX, mY; }; -class TriggerArea: public Thing +class TriggerArea : public Thing { public: /** -- cgit v1.2.3-70-g09d2