diff options
Diffstat (limited to 'src/game-server/monster.cpp')
-rw-r--r-- | src/game-server/monster.cpp | 250 |
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); - } - } -} |