summaryrefslogtreecommitdiff
path: root/src/game-server/monster.h
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-11-14 13:18:14 +0100
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-11-14 13:18:14 +0100
commit196c1c0bffa8bb594ff0a7442748030f47cc9c58 (patch)
treeb60b3e3eff38907e2d8a94ce6aa7e63cd1a741c8 /src/game-server/monster.h
parent23a94e7b154726599b9112b91ebedb32af9ff22c (diff)
downloadmanaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.gz
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.bz2
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.tar.xz
manaserv-196c1c0bffa8bb594ff0a7442748030f47cc9c58.zip
Renamed .hpp files into .h for consistency.
Also added an header to the autoattack.{h,cpp} files. Big but trivial fix.
Diffstat (limited to 'src/game-server/monster.h')
-rw-r--r--src/game-server/monster.h351
1 files changed, 351 insertions, 0 deletions
diff --git a/src/game-server/monster.h b/src/game-server/monster.h
new file mode 100644
index 00000000..0028920a
--- /dev/null
+++ b/src/game-server/monster.h
@@ -0,0 +1,351 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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 Server 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 Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MONSTER_H
+#define MONSTER_H
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include "game-server/being.h"
+#include "game-server/eventlistener.h"
+#include "defines.h"
+
+class ItemClass;
+class Script;
+
+/**
+ * Structure containing an item class and its probability to be dropped
+ * (unit: 1/10000).
+ */
+struct MonsterDrop
+{
+ ItemClass *item;
+ int probability;
+};
+
+typedef std::vector< MonsterDrop > MonsterDrops;
+
+/**
+ * Structure containing different attack types of a monster type
+ */
+struct MonsterAttack
+{
+ unsigned id;
+ int priority;
+ float damageFactor;
+ int element;
+ DMG_TY type;
+ int preDelay;
+ int aftDelay;
+ int range;
+ std::string scriptFunction;
+};
+
+typedef std::vector< MonsterAttack *> MonsterAttacks;
+
+/**
+ * Class describing the characteristics of a generic monster.
+ */
+class MonsterClass
+{
+ public:
+ MonsterClass(int id):
+ mId(id),
+ mSpeed(1),
+ mSize(16),
+ mExp(-1),
+ mAggressive(false),
+ mTrackRange(1),
+ mStrollRange(0),
+ mMutation(0),
+ mAttackDistance(0),
+ mOptimalLevel(0),
+ mScript("")
+ {}
+
+ /**
+ * Returns monster type. This is the Id of the monster class.
+ */
+ int getId() const
+ { return mId; }
+
+ /**
+ * Sets monster drops. These are the items the monster drops when it
+ * dies.
+ */
+ void setDrops(const MonsterDrops &v)
+ { mDrops = v; }
+
+ /**
+ * Sets a being base attribute.
+ */
+ void setAttribute(int attribute, double value)
+ { mAttributes[attribute] = value; }
+
+ /**
+ * Returns a being base attribute.
+ */
+ double getAttribute(int attribute) const
+ { return mAttributes.at(attribute); }
+
+ /**
+ * Returns whether the monster has got the attribute.
+ */
+ bool hasAttribute(int attribute) const
+ { return (mAttributes.find(attribute) != mAttributes.end()); }
+
+
+ /** Sets collision circle radius. */
+ void setSize(int size) { mSize = size; }
+
+ /** Returns collision circle radius. */
+ int getSize() const { return mSize; }
+
+ /** Sets experience reward for killing the monster. */
+ void setExp(int exp) { mExp = exp; }
+
+ /** Returns experience reward for killing the monster. */
+ int getExp() const { return mExp; }
+
+ /** Gets maximum skill level after which exp reward is reduced */
+ void setOptimalLevel(int level) { mOptimalLevel = level; }
+
+ /** Sets maximum skill level after which exp reward is reduced. */
+ int getOptimalLevel() const { return mOptimalLevel; }
+
+ /** Sets if the monster attacks without being attacked first. */
+ void setAggressive(bool aggressive) { mAggressive = aggressive; }
+
+ /** Returns if the monster attacks without being attacked first. */
+ bool isAggressive() const { return mAggressive; }
+
+ /** Sets range in tiles in which the monster searches for enemies. */
+ void setTrackRange(unsigned range){ mTrackRange = range; }
+
+ /**
+ * Returns range in tiles in which the monster searches for enemies.
+ */
+ unsigned getTrackRange() const { return mTrackRange; }
+
+ /** Sets range in tiles in which the monster moves around when idle. */
+ void setStrollRange(unsigned range) { mStrollRange = range; }
+
+ /**
+ * Returns range in tiles in which the monster moves around when idle.
+ */
+ unsigned getStrollRange() const { return mStrollRange; }
+
+ /** Sets mutation factor in percent. */
+ void setMutation(unsigned factor) { mMutation = factor; }
+
+ /** Returns mutation factor in percent. */
+ unsigned getMutation() const { return mMutation; }
+
+ /** Sets preferred combat distance in pixels. */
+ void setAttackDistance(unsigned distance)
+ { mAttackDistance = distance; }
+
+ /** Returns preferred combat distance in pixels. */
+ unsigned getAttackDistance() const { return mAttackDistance; }
+
+ /** Adds an attack to the monsters repertoire. */
+ void addAttack(MonsterAttack *type) { mAttacks.push_back(type); }
+
+ /** Returns all attacks of the monster. */
+ const MonsterAttacks &getAttacks() const { return mAttacks; }
+
+ /** sets the script file for the monster */
+ void setScript(const std::string &filename) { mScript = filename; }
+
+ /** Returns script filename */
+ const std::string &getScript() const { return mScript; }
+
+ /**
+ * Randomly selects a monster drop
+ * @returns A class of item to drop, or NULL if none was found.
+ */
+ ItemClass *getRandomDrop() const;
+
+ private:
+ unsigned short mId;
+ MonsterDrops mDrops;
+ std::map<int, double> mAttributes; /**< Base attributes of the monster. */
+ float mSpeed; /**< The monster class speed in tiles per second */
+ int mSize;
+ int mExp;
+
+ bool mAggressive;
+ int mTrackRange;
+ int mStrollRange;
+ int mMutation;
+ int mAttackDistance;
+ int mOptimalLevel;
+ MonsterAttacks mAttacks;
+ std::string mScript;
+
+ friend class MonsterManager;
+};
+
+/**
+ * Structure holding possible positions relative to the target from which
+ * the monster can attack
+ */
+struct AttackPosition
+{
+ AttackPosition(int posX, int posY, Direction dir):
+ x(posX),
+ y(posY),
+ direction(dir)
+ {}
+
+ int x;
+ int y;
+ Direction direction;
+};
+
+/**
+ * The class for a fightable monster with its own AI
+ */
+class Monster : public Being
+{
+ public:
+ /** Time in game ticks until ownership of a monster can change. */
+ static const int KILLSTEAL_PROTECTION_TIME = 100;
+
+ /**
+ * Constructor.
+ */
+ Monster(MonsterClass *);
+
+ /**
+ * Destructor.
+ */
+ ~Monster();
+
+ /**
+ * Returns monster specy.
+ */
+ MonsterClass *getSpecy() const
+ { return mSpecy; }
+
+ /**
+ * Performs one step of controller logic.
+ */
+ void update();
+
+ /**
+ * Performs an attack, if needed.
+ */
+ void perform();
+
+ /**
+ * Loads a script file for this monster
+ */
+ void loadScript(const std::string &scriptName);
+
+ /**
+ *
+ */
+ virtual int getAttackType() const
+ { return mCurrentAttack->id; }
+
+ /**
+ * Kills the being.
+ */
+ void died();
+
+ /**
+ * Alters hate for the monster
+ */
+ void changeAnger(Actor *target, int amount);
+
+ /**
+ * Calls the damage function in Being and updates the aggro list
+ */
+ virtual int damage(Actor *source, const Damage &damage);
+
+ /**
+ * Removes a being from the anger list.
+ */
+ void forgetTarget(Thing *being);
+
+ /**
+ * Returns the way the actor is blocked by other things on the map.
+ */
+ virtual unsigned char getWalkMask() const
+ {
+ // blocked walls, other monsters and players ( bin 1000 0011)
+ return 0x83;
+ }
+
+ protected:
+ /**
+ * Returns the way the actor blocks pathfinding for other objects.
+ */
+ virtual Map::BlockType getBlockType() const
+ { return Map::BLOCKTYPE_MONSTER; }
+
+ private:
+ static const int DECAY_TIME = 50;
+
+ int calculatePositionPriority(Point position, int targetPriority);
+
+ MonsterClass *mSpecy;
+
+ /**
+ * Stores individual script for the monster, when NULL the script
+ * from mSpecy is used.
+ */
+ Script *mScript;
+
+ /** Aggression towards other beings. */
+ std::map<Being *, int> mAnger;
+
+ /** Listener for updating the anger list. */
+ EventListener mTargetListener;
+
+ /**
+ * Character who currently owns this monster (killsteal protection).
+ */
+ Character *mOwner;
+
+ /** List of characters and their skills that attacked this monster. */
+ std::map<Character *, std::set <size_t> > mExpReceivers;
+
+ /**
+ * List of characters who are entitled to receive exp (killsteal
+ * protection).
+ */
+ std::set<Character *> mLegalExpReceivers;
+
+ /** Attack the monster is currently performing. */
+ MonsterAttack *mCurrentAttack;
+
+ /**
+ * Set positions relative to target from which the monster can attack.
+ */
+ std::list<AttackPosition> mAttackPositions;
+
+ friend struct MonsterTargetEventDispatch;
+};
+
+#endif // MONSTER_H