summaryrefslogtreecommitdiff
path: root/src/game-server/object.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-01-03 17:10:43 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-01-03 17:10:43 +0000
commit1673de8b5553f6dcd4898c84b8d44ba8b30740f1 (patch)
tree3dcc47461a6b4914c4e81492e7be885c3a1502ea /src/game-server/object.cpp
parent6b7441516002d6e7cca424416bb67c6bc7d7c9d2 (diff)
downloadmanaserv-1673de8b5553f6dcd4898c84b8d44ba8b30740f1.tar.gz
manaserv-1673de8b5553f6dcd4898c84b8d44ba8b30740f1.tar.bz2
manaserv-1673de8b5553f6dcd4898c84b8d44ba8b30740f1.tar.xz
manaserv-1673de8b5553f6dcd4898c84b8d44ba8b30740f1.zip
Split persistent player data from game server data. Enabled inventory code back.
Diffstat (limited to 'src/game-server/object.cpp')
-rw-r--r--src/game-server/object.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/game-server/object.cpp b/src/game-server/object.cpp
new file mode 100644
index 00000000..9921182d
--- /dev/null
+++ b/src/game-server/object.cpp
@@ -0,0 +1,79 @@
+/*
+ * 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());
+ // TODO: cache pathfinding results
+ std::list<PATH_NODE> path = map->findPath(tileSX, tileSY, tileDX, tileDY);
+ if (path.empty())
+ {
+ // no path was found
+ mDst = mOld;
+ mActionTime = 0;
+ return;
+ }
+
+ PATH_NODE prev(tileSX, tileSY);
+ Point pos;
+ do
+ {
+ PATH_NODE next = path.front();
+ path.pop_front();
+ mActionTime += (prev.x != next.x && prev.y != next.y)
+ ? mSpeed * 362 / 256 : mSpeed;
+ if (path.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;
+}