diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-04-23 21:00:16 +0200 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-04-26 17:18:21 +0200 |
commit | e726c34606f85347e70a0deb6b180db03b6d0c25 (patch) | |
tree | e78e5ba07dd9484abed035cc3e63744101bbef57 /src/game-server/movingobject.cpp | |
parent | a3f72002fa02cd4c525f101c5f240a22d4480119 (diff) | |
download | manaserv-e726c34606f85347e70a0deb6b180db03b6d0c25.tar.gz manaserv-e726c34606f85347e70a0deb6b180db03b6d0c25.tar.bz2 manaserv-e726c34606f85347e70a0deb6b180db03b6d0c25.tar.xz manaserv-e726c34606f85347e70a0deb6b180db03b6d0c25.zip |
Merged MovingObject into the Being class
Also renamed Object to Actor, to make it sound a little less generic.
Cleans up a bit the rather big hierarchy of different object types we
have.
Diffstat (limited to 'src/game-server/movingobject.cpp')
-rw-r--r-- | src/game-server/movingobject.cpp | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/src/game-server/movingobject.cpp b/src/game-server/movingobject.cpp deleted file mode 100644 index 281513ff..00000000 --- a/src/game-server/movingobject.cpp +++ /dev/null @@ -1,149 +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 - */ - -#include <cassert> - -#include "game-server/map.hpp" -#include "game-server/mapcomposite.hpp" -#include "game-server/movingobject.hpp" - - -void MovingObject::setPosition(const Point &p) -{ - //update blockmap - if (getMap()) - { - Point oldP = getPosition(); - if ((oldP.x / 32 != p.x / 32 || oldP.y / 32 != p.y / 32)) - { - getMap()->getMap()->freeTile(oldP.x / 32, oldP.y / 32, getBlockType()); - getMap()->getMap()->blockTile(p.x / 32, p.y / 32, getBlockType()); - } - } - - Object::setPosition(p); -} - -void MovingObject::setMap(MapComposite *map) -{ - assert (map); - MapComposite *oldMap = getMap(); - Point p = getPosition(); - - if (oldMap) - { - oldMap->getMap()->freeTile(p.x / 32, p.y / 32, getBlockType()); - } - Object::setMap(map); - map->getMap()->blockTile(p.x / 32, p.y / 32, getBlockType()); - /* the last line might look illogical because the current position is - * invalid on the new map, but it is necessary to block the old position - * because the next call of setPosition() will automatically free the old - * position. When we don't block the position now the occupation counting - * will be off. - */ -} - -void MovingObject::setDestination(Point const &dst) -{ - mDst = dst; - raiseUpdateFlags(UPDATEFLAG_NEW_DESTINATION); - mPath.clear(); -} - -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 = getMap()->getMap(); - - /* 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<PATH_NODE>::iterator pathIterator = mPath.begin(); - pathIterator != mPath.end(); pathIterator++) - { - if (!map->getWalk(pathIterator->x, pathIterator->y, getWalkMask())) - { - 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, getWalkMask()); - } - - 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(); - // 362 / 256 is square root of 2, used for walking diagonally - mActionTime += (prev.x != next.x && prev.y != next.y) - ? mSpeed * 362 / 256 : mSpeed; - if (mPath.empty()) - { - // skip last tile center - pos = mDst; - break; - } - // position the object in the middle of the tile for pathfinding purposes - pos.x = next.x * 32 + 16; - pos.y = next.y * 32 + 16; - } - while (mActionTime < 100); - setPosition(pos); - - mActionTime = mActionTime > 100 ? mActionTime - 100 : 0; -} |