From 851bee28374c5c60114c9f78299e28eaa14891b3 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Tue, 4 Oct 2011 02:18:31 +0300
Subject: Dont select in archer mode very closer mobs if no other mobs in
 attack distance.

---
 src/actorspritemanager.cpp | 27 ++++++++++++++++++++++++---
 src/being.h                |  2 +-
 2 files changed, 25 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index 155fe05ef..ba303e800 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -119,8 +119,18 @@ class SortBeingFunctor
             }
             if (being1->getDistance() != being2->getDistance())
             {
-                if (specialDistance && being1->getDistance() <= 2)
+                if (specialDistance && being1->getDistance() <= 2
+                    && being2->getDistance() <= attackRange
+                    && being2->getDistance() > 2)
+                {
                     return false;
+                }
+                else if (specialDistance && being2->getDistance() <= 2
+                    && being1->getDistance() <= attackRange
+                    && being1->getDistance() > 2)
+                {
+                    return true;
+                }
                 return being1->getDistance() < being2->getDistance();
             }
 
@@ -169,6 +179,7 @@ class SortBeingFunctor
         std::map<std::string, int> *priorityBeings;
         int defaultPriorityIndex;
         bool specialDistance;
+        int attackRange;
 } beingSorter;
 
 ActorSpriteManager::ActorSpriteManager() :
@@ -768,6 +779,8 @@ Being *ActorSpriteManager::findNearestLivingBeing(Being *aroundBeing,
     std::map<std::string, int> priorityMobsMap;
     int defaultAttackIndex = 10000;
     int defaultPriorityIndex = 10000;
+    const int attackRange = player_node->getAttackRange();
+
     bool specialDistance = false;
     if (player_node->getMoveToTargetType() == 7
         && player_node->getAttackRange() > 2)
@@ -794,6 +807,7 @@ Being *ActorSpriteManager::findNearestLivingBeing(Being *aroundBeing,
         beingSorter.attackBeings = &attackMobsMap;
         beingSorter.priorityBeings = &priorityMobsMap;
         beingSorter.specialDistance = specialDistance;
+        beingSorter.attackRange = attackRange;
         if (ignoreAttackMobs.find("") != ignoreAttackMobs.end())
             ignoreDefault = true;
         std::map<std::string, int>::const_iterator
@@ -872,8 +886,15 @@ Being *ActorSpriteManager::findNearestLivingBeing(Being *aroundBeing,
 
         if (player_node->getTarget() == NULL)
         {
-            // if no selected being, return first nearest being
-            return sortedBeings.at(0);
+            Being *target = sortedBeings.at(0);
+
+            if (specialDistance && target->getType() == Being::MONSTER
+                && target->getDistance() <= 2)
+            {
+                return 0;
+            }
+            // if no selected being in vector, return first nearest being
+            return target;
         }
 
         beingEqualFinder.findBeing = player_node->getTarget();
diff --git a/src/being.h b/src/being.h
index 2c37ffeb5..90bfcfb54 100644
--- a/src/being.h
+++ b/src/being.h
@@ -540,7 +540,7 @@ class Being : public ActorSprite, public ConfigListener
         const Path &getPath() const
         { return mPath; }
 
-        int getDistance()
+        int getDistance() const
         { return mDistance; }
 
         void setDistance(int n)
-- 
cgit v1.2.3-70-g09d2