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