From 9fe83ca23b72a2f13024b0839656d5b00b28b419 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Fri, 23 Sep 2011 01:56:52 +0300
Subject: Improve target monster selection if option "target only reachanble"
 disabled.

---
 src/localplayer.cpp | 28 ++++++++++++++++++++++------
 src/localplayer.h   |  1 +
 2 files changed, 23 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 20d4094d6..11333af42 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -171,6 +171,7 @@ LocalPlayer::LocalPlayer(int id, int subtype):
     mShowJobExp = config.getBoolValue("showJobExp");
     mEnableAdvert = config.getBoolValue("enableAdvert");
     mTradebot = config.getBoolValue("tradebot");
+    mTargetOnlyReachable = config.getBoolValue("targetOnlyReachable");
 
     mPingSendTick = 0;
     mWaitPing = false;
@@ -192,6 +193,7 @@ LocalPlayer::LocalPlayer(int id, int subtype):
     config.addListener("showJobExp", this);
     config.addListener("enableAdvert", this);
     config.addListener("tradebot", this);
+    config.addListener("targetOnlyReachable", this);
     setShowName(config.getBoolValue("showownname"));
 }
 
@@ -209,6 +211,7 @@ LocalPlayer::~LocalPlayer()
     config.removeListener("showJobExp", this);
     config.removeListener("enableAdvert", this);
     config.removeListener("tradebot", this);
+    config.removeListener("targetOnlyReachable", this);
 
     delete mAwayDialog;
     mAwayDialog = 0;
@@ -1631,6 +1634,8 @@ void LocalPlayer::optionChanged(const std::string &value)
         mEnableAdvert = config.getBoolValue("enableAdvert");
     else if (value == "tradebot")
         mTradebot = config.getBoolValue("tradebot");
+    else if (value == "targetOnlyReachable")
+        mTargetOnlyReachable = config.getBoolValue("targetOnlyReachable");
 }
 
 void LocalPlayer::processEvent(Mana::Channels channel,
@@ -3420,12 +3425,23 @@ int LocalPlayer::getPathLength(Being* being)
         return 1;
     }
 
-    Path debugPath = mMap->findPath(
-        static_cast<int>(playerPos.x - 16) / 32,
-        static_cast<int>(playerPos.y - 32) / 32,
-        being->getTileX(), being->getTileY(),
-        getWalkMask(), 0);
-    return static_cast<int>(debugPath.size());
+    if (mTargetOnlyReachable)
+    {
+        Path debugPath = mMap->findPath(
+            static_cast<int>(playerPos.x - 16) / 32,
+            static_cast<int>(playerPos.y - 32) / 32,
+            being->getTileX(), being->getTileY(),
+            getWalkMask(), 0);
+        return static_cast<int>(debugPath.size());
+    }
+    else
+    {
+        const int dx = static_cast<int>(abs(being->mX - mX));
+        const int dy = static_cast<int>(abs(being->mY - mY));
+        if (dx > dy)
+            return dx;
+        return dy;
+    }
 }
 
 void LocalPlayer::attack2(Being *target, bool keep, bool dontChangeEquipment)
diff --git a/src/localplayer.h b/src/localplayer.h
index cb23d855e..278598d58 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -601,6 +601,7 @@ class LocalPlayer : public Being, public ActorSpriteListener,
         bool mBlockAdvert;
         bool mEnableAdvert;
         bool mTradebot;
+        bool mTargetOnlyReachable;
         bool mNextStep;
 };
 
-- 
cgit v1.2.3-70-g09d2