From: "Enrico Weigelt, metux IT consult" <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/freecol-developers