summaryrefslogtreecommitdiffstats
path: root/src/game-server/monster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/monster.cpp')
-rw-r--r--src/game-server/monster.cpp250
1 files changed, 0 insertions, 250 deletions
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index 5d77db4..e0feed9 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -28,7 +28,6 @@
#include "game-server/item.h"
#include "game-server/map.h"
#include "game-server/mapcomposite.h"
-#include "game-server/monstercombatcomponent.h"
#include "game-server/state.h"
#include "scripting/scriptmanager.h"
#include "utils/logger.h"
@@ -36,15 +35,6 @@
#include <cmath>
-MonsterClass::~MonsterClass()
-{
- for (std::vector<AttackInfo *>::iterator it = mAttacks.begin(),
- it_end = mAttacks.end(); it != it_end; ++it)
- {
- delete *it;
- }
-}
-
double MonsterClass::getVulnerability(Element element) const
{
Vulnerabilities::const_iterator it = mVulnerabilities.find(element);
@@ -98,24 +88,6 @@ MonsterComponent::MonsterComponent(Entity &entity, MonsterClass *specy):
beingComponent->signal_died.connect(sigc::mem_fun(this,
&MonsterComponent::monsterDied));
-
- // Set positions relative to target from which the monster can attack
- int dist = specy->getAttackDistance();
- mAttackPositions.push_back(AttackPosition(dist, 0, LEFT));
- mAttackPositions.push_back(AttackPosition(-dist, 0, RIGHT));
- mAttackPositions.push_back(AttackPosition(0, -dist, DOWN));
- mAttackPositions.push_back(AttackPosition(0, dist, UP));
-
- MonsterCombatComponent *combatComponent =
- new MonsterCombatComponent(entity, specy);
- entity.addComponent(combatComponent);
-
- double damageMutation = mutation ?
- (100.0 + (rand() % (mutation * 2)) - mutation) / 100.0 : 1.0;
- combatComponent->setDamageMutation(damageMutation);
-
- combatComponent->signal_damaged.connect(
- sigc::mem_fun(this, &MonsterComponent::receivedDamage));
}
MonsterComponent::~MonsterComponent()
@@ -146,12 +118,6 @@ void MonsterComponent::update(Entity &entity)
script->execute(entity.getMap());
}
- refreshTarget(entity);
-
- // Cancel the rest when we have a target
- if (entity.getComponent<CombatComponent>()->getTarget())
- return;
-
const Point &position =
entity.getComponent<ActorComponent>()->getPosition();
@@ -176,97 +142,6 @@ void MonsterComponent::update(Entity &entity)
}
}
-void MonsterComponent::refreshTarget(Entity &entity)
-{
- auto *beingComponent = entity.getComponent<BeingComponent>();
-
- // We are dead and sadly not possible to keep attacking :(
- if (beingComponent->getAction() == DEAD)
- return;
-
- // Check potential attack positions
- int bestTargetPriority = 0;
- Entity *bestTarget = 0;
- Point bestAttackPosition;
-
- // reset Target. We will find a new one if possible
- entity.getComponent<CombatComponent>()->clearTarget();
-
- // Iterate through objects nearby
- int aroundArea = Configuration::getValue("game_visualRange", 448);
- for (BeingIterator i(entity.getMap()->getAroundBeingIterator(&entity,
- aroundArea));
- i; ++i)
- {
- // We only want to attack player characters
- if ((*i)->getType() != OBJECT_CHARACTER)
- continue;
-
- Entity *target = *i;
-
- // Dead characters are ignored
- if (beingComponent->getAction() == DEAD)
- continue;
-
- // Determine how much we hate the target
- int targetPriority = 0;
- std::map<Entity *, AggressionInfo>::iterator angerIterator =
- mAnger.find(target);
- if (angerIterator != mAnger.end())
- {
- const AggressionInfo &aggressionInfo = angerIterator->second;
- targetPriority = aggressionInfo.anger;
- }
- else if (mSpecy->isAggressive())
- {
- targetPriority = 1;
- }
- else
- {
- continue;
- }
-
- // Check all attack positions
- for (std::list<AttackPosition>::iterator j = mAttackPositions.begin();
- j != mAttackPositions.end(); j++)
- {
- Point attackPosition =
- target->getComponent<ActorComponent>()->getPosition();
- attackPosition.x += j->x;
- attackPosition.y += j->y;
-
- int posPriority = calculatePositionPriority(entity,
- attackPosition,
- targetPriority);
- if (posPriority > bestTargetPriority)
- {
- bestTargetPriority = posPriority;
- bestTarget = target;
- bestAttackPosition = attackPosition;
- }
- }
- }
- if (bestTarget)
- {
- const Point &ownPosition =
- entity.getComponent<ActorComponent>()->getPosition();
- const Point &targetPosition =
- bestTarget->getComponent<ActorComponent>()->getPosition();
-
- entity.getComponent<CombatComponent>()->setTarget(bestTarget);
- if (bestAttackPosition == ownPosition)
- {
- beingComponent->setAction(entity, ATTACK);
- beingComponent->updateDirection(entity, ownPosition,
- targetPosition);
- }
- else
- {
- beingComponent->setDestination(entity, bestAttackPosition);
- }
- }
-}
-
int MonsterComponent::calculatePositionPriority(Entity &entity,
Point position,
int targetPriority)
@@ -301,133 +176,8 @@ int MonsterComponent::calculatePositionPriority(Entity &entity,
return targetPriority * (range - path.size());
}
}
-
-void MonsterComponent::forgetTarget(Entity *entity)
-{
- {
- AggressionInfo &aggressionInfo = mAnger[entity];
- aggressionInfo.removedConnection.disconnect();
- aggressionInfo.diedConnection.disconnect();
- }
- mAnger.erase(entity);
-
- if (entity->getType() == OBJECT_CHARACTER)
- {
- mExpReceivers.erase(entity);
- mLegalExpReceivers.erase(entity);
- }
-}
-
-void MonsterComponent::changeAnger(Entity *target, int amount)
-{
- const EntityType type = target->getType();
- if (type != OBJECT_MONSTER && type != OBJECT_CHARACTER)
- return;
-
- if (mAnger.find(target) != mAnger.end())
- {
- mAnger[target].anger += amount;
- }
- else
- {
- AggressionInfo &aggressionInfo = mAnger[target];
- aggressionInfo.anger = amount;
-
- // Forget target either when it's removed or died, whichever
- // happens first.
- aggressionInfo.removedConnection =
- target->signal_removed.connect(sigc::mem_fun(this, &MonsterComponent::forgetTarget));
- aggressionInfo.diedConnection = target->getComponent<BeingComponent>()
- ->signal_died.connect(
- sigc::mem_fun(this, &MonsterComponent::forgetTarget));
- }
-}
-
-std::map<Entity *, int> MonsterComponent::getAngerList() const
-{
- std::map<Entity *, int> result;
- std::map<Entity *, AggressionInfo>::const_iterator i, i_end;
-
- for (i = mAnger.begin(), i_end = mAnger.end(); i != i_end; ++i)
- {
- const AggressionInfo &aggressionInfo = i->second;
- result.insert(std::make_pair(i->first, aggressionInfo.anger));
- }
-
- return result;
-}
-
void MonsterComponent::monsterDied(Entity *monster)
{
mDecayTimeout.set(DECAY_TIME);
-
- if (mExpReceivers.size() > 0)
- {
- // If the monster was killed by players, randomly drop items.
- const unsigned size = mSpecy->mDrops.size();
- for (unsigned i = 0; i < size; i++)
- {
- const int p = rand() / (RAND_MAX / 10000);
- const MonsterDrop &drop = mSpecy->mDrops[i];
-
- if (p <= drop.probability)
- {
- const Point &position =
- monster->getComponent<ActorComponent>()->getPosition();
- Entity *item = Item::create(monster->getMap(), position,
- drop.item, 1);
- GameState::enqueueInsert(item);
- }
- }
-
- // Distribute exp reward.
- std::map<Entity *, std::set <size_t> > ::iterator iChar;
- std::set<size_t>::iterator iSkill;
-
-
- float expPerChar = (float)mSpecy->getExp() / mExpReceivers.size();
-
- for (iChar = mExpReceivers.begin(); iChar != mExpReceivers.end();
- iChar++)
- {
- auto *character = (*iChar).first;
- const std::set<size_t> &skillSet = (*iChar).second;
-
- if (mLegalExpReceivers.find(character) == mLegalExpReceivers.end()
- || skillSet.empty())
- continue;
-
- auto characterComponent =
- character->getComponent<CharacterComponent>();
-
- int expPerSkill = int(expPerChar / skillSet.size());
- for (iSkill = skillSet.begin(); iSkill != skillSet.end();
- iSkill++)
- {
- characterComponent->receiveExperience(*iSkill, expPerSkill,
- mSpecy->getOptimalLevel());
- }
- characterComponent->incrementKillCount(mSpecy->getId());
- }
- }
}
-
-void MonsterComponent::receivedDamage(Entity *source, const Damage &damage, int hpLoss)
-{
- if (source)
- changeAnger(source, hpLoss);
-
- if (hpLoss && source && source->getType() == OBJECT_CHARACTER)
- {
- mExpReceivers[source].insert(damage.skill);
- if (mKillStealProtectedTimeout.expired() || mOwner == source
- || mOwner->getComponent<CharacterComponent>()->getParty() ==
- source->getComponent<CharacterComponent>()->getParty())
- {
- mOwner = source;
- mLegalExpReceivers.insert(source);
- mKillStealProtectedTimeout.set(KILLSTEAL_PROTECTION_TIME);
- }
- }
-}