From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>

Instead of several list operations w/ lambda callbacks, do it in one pass.

Note: the previous implementation used an caching function - but the
cache was quite unlikely to hit, as the surrounding tiles are fed in just
once anyways.
---
 .../common/model/pathfinding/GoalDeciders.java     | 67 ++++++++++++++--------
 1 file changed, 42 insertions(+), 25 deletions(-)

diff --git a/src/net/sf/freecol/common/model/pathfinding/GoalDeciders.java 
b/src/net/sf/freecol/common/model/pathfinding/GoalDeciders.java
index 6928b82be9f..9a729f9b9ab 100644
--- a/src/net/sf/freecol/common/model/pathfinding/GoalDeciders.java
+++ b/src/net/sf/freecol/common/model/pathfinding/GoalDeciders.java
@@ -23,8 +23,6 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
-import java.util.function.Predicate;
-import java.util.function.ToDoubleFunction;
 
 import net.sf.freecol.common.model.Ability;
 import net.sf.freecol.common.model.FreeColObject;
@@ -312,6 +310,29 @@ public final class GoalDeciders {
             public PathNode getGoal() { return goal; }
             @Override
             public boolean hasSubGoals() { return true; }
+
+            private boolean isDanger(Tile t, Player owner, Unit u) {
+                Settlement settlement = t.getSettlement();
+                return (settlement != null
+                    && !owner.owns(settlement)
+                    && settlement.hasAbility(Ability.BOMBARD_SHIPS)
+                    && (owner.atWarWith(settlement.getOwner())
+                        || u.hasAbility(Ability.PIRACY)));
+            };
+
+            private double getDangerBonus(Tile t, Player owner, Unit u) {
+                for (Tile walk : t.getSurroundingTiles(1, 1))
+                    if (isDanger(walk, owner, u))
+                        return 0.0;
+
+                return NO_DANGER_BONUS;
+            }
+
+            private double getTileScore(Tile t, Player owner, Unit u, Map map) 
{
+                return (t.getDefenceValue() / (1.0 + map.getDistance(target, 
t))
+                        + getDangerBonus(t, owner, u));
+            }
+
             @Override
             public boolean check(Unit u, PathNode pathNode) {
                 final Tile tile = pathNode.getTile();
@@ -320,30 +341,26 @@ public final class GoalDeciders {
 
                 final Player owner = u.getOwner();
                 final Map map = u.getGame().getMap();
-                final Predicate<Tile> dockPred = t ->
-                    t.isHighSeasConnected() && !t.isLand();
-                final Predicate<Tile> dangerPred = t -> {
-                    Settlement settlement = t.getSettlement();
-                    return (settlement != null
-                        && !owner.owns(settlement)
-                        && settlement.hasAbility(Ability.BOMBARD_SHIPS)
-                        && (owner.atWarWith(settlement.getOwner())
-                            || u.hasAbility(Ability.PIRACY)));
-                };
-                final ToDoubleFunction<Tile> tileScorer = cacheDouble(t ->
-                    (t.getDefenceValue() / (1.0 + map.getDistance(target, t))
-                        + ((none(t.getSurroundingTiles(1, 1), dangerPred))
-                            ? NO_DANGER_BONUS : 0.0)));
-                Tile best = maximize(tile.getSurroundingTiles(1, 1), dockPred,
-                                     Comparator.comparingDouble(tileScorer));
-                double score;
-                if (best != null
-                    && (score = tileScorer.applyAsDouble(best)) > bestScore) {
-                    bestScore = score;
-                    goal = pathNode;
-                    return true;
+
+                Tile best = null;
+                double best_score = -1.0;
+                for (Tile walk : tile.getSurroundingTiles(1, 1)) {
+                    if (!walk.isHighSeasConnected() || walk.isLand())
+                        continue;
+
+                    double sc = getTileScore(tile, owner, u, map);
+                    if (sc > best_score) {
+                        best_score = sc;
+                        best = walk;
+                    }
                 }
-                return false;
+
+                if ((best == null) || (best_score <= bestScore))
+                    return false;
+
+                bestScore = best_score;
+                goal = pathNode;
+                return true;
             }
         };
     }
-- 
2.11.0.rc0.7.gbe5a750


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Freecol-developers mailing list
Freecol-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freecol-developers

Reply via email to