summaryrefslogtreecommitdiff
path: root/src/game-server
diff options
context:
space:
mode:
authorBertram <bertram@cegetel.net>2009-10-15 00:46:27 +0200
committerBertram <bertram@cegetel.net>2009-10-15 00:46:27 +0200
commit6bdbbe247566728390ad7fee19ea233405433651 (patch)
tree5ecb1d81221299dbf2ec4375cb769b7d783b9859 /src/game-server
parent257b9e19f26ecd29cd86177dd70765517bbc9863 (diff)
downloadmanaserv-6bdbbe247566728390ad7fee19ea233405433651.tar.gz
manaserv-6bdbbe247566728390ad7fee19ea233405433651.tar.bz2
manaserv-6bdbbe247566728390ad7fee19ea233405433651.tar.xz
manaserv-6bdbbe247566728390ad7fee19ea233405433651.zip
Speed code unification part 1: Made the server accept speed values in tiles per second.
Diffstat (limited to 'src/game-server')
-rw-r--r--src/game-server/accountconnection.cpp4
-rw-r--r--src/game-server/being.cpp12
-rw-r--r--src/game-server/being.hpp16
-rw-r--r--src/game-server/monster.cpp2
-rw-r--r--src/game-server/monster.hpp10
-rw-r--r--src/game-server/monstermanager.cpp12
-rw-r--r--src/game-server/state.cpp5
7 files changed, 42 insertions, 19 deletions
diff --git a/src/game-server/accountconnection.cpp b/src/game-server/accountconnection.cpp
index e0e8f737..7a221e53 100644
--- a/src/game-server/accountconnection.cpp
+++ b/src/game-server/accountconnection.cpp
@@ -127,7 +127,9 @@ void AccountConnection::processMessage(MessageIn &msg)
{
std::string token = msg.readString(MAGIC_TOKEN_LENGTH);
Character *ptr = new Character(msg);
- ptr->setSpeed(250); // TODO
+ ptr->setSpeed(6.0); // The speed is set in tiles per seconds, and transformed by the function
+ // into the server corresponding internal value.
+ // TODO: Make this computed somehow...
gameHandler->addPendingCharacter(token, ptr);
} break;
diff --git a/src/game-server/being.cpp b/src/game-server/being.cpp
index 634d566a..de7ac69f 100644
--- a/src/game-server/being.cpp
+++ b/src/game-server/being.cpp
@@ -135,8 +135,20 @@ Path Being::findPath()
return map->findPath(startX, startY, destX, destY, getWalkMask());
}
+void Being::setSpeed(float s)
+{
+ if (s > 0)
+ mSpeed = (int)(32000 / (s * (float)DEFAULT_TILE_LENGTH));
+ else
+ mSpeed = 0;
+}
+
void Being::move()
{
+ // Don't deal with not moving beings
+ if (mSpeed <= 0 && mSpeed >= 32000)
+ return;
+
mOld = getPosition();
if (mActionTime > 100)
diff --git a/src/game-server/being.hpp b/src/game-server/being.hpp
index c25e24e2..3116d900 100644
--- a/src/game-server/being.hpp
+++ b/src/game-server/being.hpp
@@ -193,10 +193,18 @@ class Being : public Actor
/**
* Gets beings speed.
- * @todo Document what kind of units actor speed is in!
+ * The speed is given in tiles per second.
*/
- int getSpeed() const { return mSpeed; }
- void setSpeed(int s) { mSpeed = s; }
+ float getSpeed() const
+ { return (float)(1000 / (float)mSpeed); }
+
+ /**
+ * Gets beings speed.
+ * The speed is to be set in tiles per second
+ * This function automatically transform it
+ * into millsecond per tile.
+ */
+ void setSpeed(float s);
/**
* Gets the damage list.
@@ -343,7 +351,7 @@ class Being : public Actor
Being &operator=(const Being &rhs);
Path mPath;
- unsigned short mSpeed; /**< Speed. */
+ unsigned int mSpeed; /**< Speed. */
unsigned char mDirection; /**< Facing direction. */
std::string mName;
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index 4d13ac0e..08ddb2aa 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -84,7 +84,7 @@ Monster::Monster(MonsterClass *specy):
setAttribute(i, (int)std::ceil(attr));
}
- setSpeed(specy->getSpeed());
+ setSpeed(specy->getSpeed()); // Put in tiles per second.
setSize(specy->getSize());
// Set positions relative to target from which the monster can attack
diff --git a/src/game-server/monster.hpp b/src/game-server/monster.hpp
index 08b5fa86..dd064073 100644
--- a/src/game-server/monster.hpp
+++ b/src/game-server/monster.hpp
@@ -107,11 +107,11 @@ class MonsterClass
int getAttribute(size_t attribute) const
{ return mAttributes.at(attribute); }
- /** Sets inverted movement speed. */
- void setSpeed(int speed) { mSpeed = speed; }
+ /** Sets movement speed in tiles per second. */
+ void setSpeed(float speed) { mSpeed = speed; }
- /** Returns inverted movement speed. */
- int getSpeed() const { return mSpeed; }
+ /** Returns movement speed in tiles per second. */
+ float getSpeed() const { return mSpeed; }
/** Sets collision circle radius. */
void setSize(int size) { mSize = size; }
@@ -181,7 +181,7 @@ class MonsterClass
unsigned short mID;
MonsterDrops mDrops;
std::vector<int> mAttributes; /**< Base attributes of the monster. */
- int mSpeed;
+ float mSpeed; /**< The monster class speed in tiles per second */
int mSize;
int mExp;
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 0e51990b..144de6fd 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -160,11 +160,10 @@ void MonsterManager::reload()
monster->setAttribute(BASE_ATTR_MAG_RES,
XML::getProperty(subnode, "magical-defence", -1));
monster->setSize(XML::getProperty(subnode, "size", 0));
- int speed = (XML::getProperty(subnode, "speed", 0));
+ float speed = (XML::getFloatProperty(subnode, "speed", -1.0f));
monster->setMutation(XML::getProperty(subnode, "mutation", 0));
//checking attributes for completeness and plausibility
-
if (monster->getMutation() > 99)
{
LOG_WARN(monsterReferenceFile
@@ -187,18 +186,17 @@ void MonsterManager::reload()
monster->setSize(16);
attributesComplete = false;
}
- if (speed == 0)
+ if (speed == -1.0f)
{
- speed = 1;
+ speed = 4.0f;
attributesComplete = false;
}
if (!attributesComplete) LOG_WARN(monsterReferenceFile
<<": Attributes incomplete for monster #"<<id);
- //for usability reasons we set the speed in the monsters.xml as pixels
- //per second instead of miliseconds per tile.
- monster->setSpeed(32000/speed);
+ //The speed is set in tiles per second in the monsters.xml
+ monster->setSpeed(speed);
}
else if (xmlStrEqual(subnode->name, BAD_CAST "exp"))
diff --git a/src/game-server/state.cpp b/src/game-server/state.cpp
index f346f32d..445989e7 100644
--- a/src/game-server/state.cpp
+++ b/src/game-server/state.cpp
@@ -316,7 +316,10 @@ static void informPlayer(MapComposite *map, Character *p)
{
moveMsg.writeShort(opos.x);
moveMsg.writeShort(opos.y);
- moveMsg.writeByte(o->getSpeed() / 10);
+ // We multiply the sent speed (in tiles per second) by ten
+ // to get it within a byte with decimal precision.
+ // For instance, a value of 4.5 will be sent as 45.
+ moveMsg.writeByte((unsigned short) (o->getSpeed() * 10));
}
}