|
From: <mp...@us...> - 2009-08-25 10:42:31
|
Revision: 5732
http://freecol.svn.sourceforge.net/freecol/?rev=5732&view=rev
Author: mpope
Date: 2009-08-25 10:42:13 +0000 (Tue, 25 Aug 2009)
Log Message:
-----------
Back out 5370, fix the underlying issue with path finding this time.
Modified Paths:
--------------
freecol/trunk/src/net/sf/freecol/common/model/Map.java
freecol/trunk/src/net/sf/freecol/common/model/PathNode.java
freecol/trunk/src/net/sf/freecol/common/model/Unit.java
Modified: freecol/trunk/src/net/sf/freecol/common/model/Map.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/Map.java 2009-08-24 19:38:55 UTC (rev 5731)
+++ freecol/trunk/src/net/sf/freecol/common/model/Map.java 2009-08-25 10:42:13 UTC (rev 5732)
@@ -544,8 +544,11 @@
return currentNode.next;
}
- // Only check further if it is possible to transit *through* this node.
+ // Only check further along a path if it is possible to
+ // transit *through* it (isProgress()), but not if the
+ // unit is already there, as is the case for firstNode.
if (currentUnit != null
+ && currentUnit.getTile() != currentNode.getTile()
&& !currentUnit.getSimpleMoveType(currentNode.getTile()).isProgress()) {
continue;
}
@@ -559,9 +562,12 @@
continue;
}
- // If the new tile is the tile we just visited, skip it. We can use == because PathNode.getTile()
- // and getNeighborOrNull both return references to the actual Tile in tiles[][].
- if (currentNode.previous != null && currentNode.previous.getTile() == newTile) {
+ // If the new tile is the tile we just visited, skip
+ // it. We can use == because PathNode.getTile() and
+ // getNeighborOrNull both return references to the
+ // actual Tile in tiles[][].
+ if (currentNode.previous != null
+ && currentNode.previous.getTile() == newTile) {
continue;
}
@@ -573,38 +579,35 @@
int movesLeft = currentNode.getMovesLeft();
int turns = currentNode.getTurns();
boolean onCarrier = currentNode.isOnCarrier();
-
+ Unit moveUnit;
+
// Check for disembark:
if (carrier != null
- && onCarrier
- && newTile.isLand()
- && (newTile.getSettlement() == null || newTile
- .getSettlement().getOwner() == currentUnit.getOwner())) {
+ && onCarrier
+ && newTile.isLand()
+ && (newTile.getSettlement() == null
+ || newTile.getSettlement().getOwner() == carrier.getOwner())) {
onCarrier = false;
- currentUnit = unit;
- movesLeft = currentUnit.getInitialMovesLeft();
+ moveUnit = unit;
+ movesLeft = moveUnit.getInitialMovesLeft();
} else {
- if (currentNode.isOnCarrier()) {
- currentUnit = carrier;
- } else {
- currentUnit = unit;
- }
+ moveUnit = (currentNode.isOnCarrier()) ? carrier : unit;
}
- if (currentUnit != null) {
- int extraCost = costDecider.getCost(currentUnit,
- currentNode.getTile(), newTile, movesLeft, turns);
+ if (moveUnit != null) {
+ int extraCost = costDecider.getCost(moveUnit,
+ currentNode.getTile(), newTile, movesLeft, turns);
if (extraCost == CostDecider.ILLEGAL_MOVE && !newTile.equals(end)) {
continue;
}
if (extraCost == CostDecider.ILLEGAL_MOVE) {
if (newTile.equals(end)) {
- cost += currentUnit.getInitialMovesLeft();
+ cost += moveUnit.getInitialMovesLeft();
movesLeft = 0;
}
} else {
if (carrier != null) {
- if (currentUnit.equals(carrier)) {
+ if (moveUnit.equals(carrier)) {
extraCost *= unit.getInitialMovesLeft();
} else {
extraCost *= carrier.getInitialMovesLeft();
@@ -920,8 +923,11 @@
}
}
- // Only check further if it is possible to transit *through* this node.
+ // Only check further along a path if it is possible to
+ // transit *through* it (isProgress()), but not if the
+ // unit is already there, as is the case for firstNode.
if (currentUnit != null
+ && currentUnit.getTile() != currentNode.getTile()
&& !currentUnit.getSimpleMoveType(currentNode.getTile()).isProgress()) {
continue;
}
@@ -936,9 +942,12 @@
continue;
}
- // If the new tile is the tile we just visited, skip it. We can use == because PathNode.getTile()
- // and getNeighborOrNull both return references to the actual Tile in tiles[][].
- if (currentNode.previous != null && currentNode.previous.getTile() == newTile) {
+ // If the new tile is the tile we just visited, skip
+ // it. We can use == because PathNode.getTile() and
+ // getNeighborOrNull both return references to the
+ // actual Tile in tiles[][].
+ if (currentNode.previous != null
+ && currentNode.previous.getTile() == newTile) {
continue;
}
@@ -950,33 +959,30 @@
int movesLeft = currentNode.getMovesLeft();
int turns = currentNode.getTurns();
boolean onCarrier = currentNode.isOnCarrier();
-
+ Unit moveUnit;
+
// Check for disembark:
if (carrier != null
- && onCarrier
- && newTile.isLand()
- && (newTile.getSettlement() == null || newTile
- .getSettlement().getOwner() == currentUnit.getOwner())) {
+ && onCarrier
+ && newTile.isLand()
+ && (newTile.getSettlement() == null
+ || newTile.getSettlement().getOwner() == currentUnit.getOwner())) {
onCarrier = false;
- currentUnit = unit;
- movesLeft = currentUnit.getInitialMovesLeft();
+ moveUnit = unit;
+ movesLeft = moveUnit.getInitialMovesLeft();
} else {
- if (currentNode.isOnCarrier()) {
- currentUnit = carrier;
- } else {
- currentUnit = unit;
- }
+ moveUnit = (currentNode.isOnCarrier()) ? carrier : unit;
}
- int extraCost = costDecider.getCost(currentUnit,
+ int extraCost = costDecider.getCost(moveUnit,
currentNode.getTile(), newTile, movesLeft, turns);
if (extraCost == CostDecider.ILLEGAL_MOVE) {
continue;
}
- if (carrier != null && currentUnit.equals(unit)) {
+ if (carrier != null && moveUnit.equals(unit)) {
cost += extraCost
- * (1 + (carrier.getInitialMovesLeft() / ((double) unit
- .getInitialMovesLeft())));
+ * (1 + (carrier.getInitialMovesLeft()
+ / ((double) unit.getInitialMovesLeft())));
} else {
cost += extraCost;
}
Modified: freecol/trunk/src/net/sf/freecol/common/model/PathNode.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/PathNode.java 2009-08-24 19:38:55 UTC (rev 5731)
+++ freecol/trunk/src/net/sf/freecol/common/model/PathNode.java 2009-08-25 10:42:13 UTC (rev 5732)
@@ -291,4 +291,20 @@
public int hashCode() {
return tile.getX() * 10000 + tile.getY();
}
+
+ /**
+ * Debug helper.
+ */
+ public String toString() {
+ return "PathNode"
+ + " tile=\"" + tile.getId() + "(" + Integer.toString(tile.getX())
+ + "," + Integer.toString(tile.getY()) + ")\""
+ + " cost=\"" + Integer.toString(cost) + "\""
+ + " f=\"" + Integer.toString(f) + "\""
+ + " direction=\"" + String.valueOf(direction) + "\""
+ + " movesLeft=\"" + Integer.toString(movesLeft) + "\""
+ + " turns=\"" + Integer.toString(turns) + "\""
+ + " onCarrier=\"" + Boolean.toString(onCarrier) + "\""
+ ;
+ }
}
Modified: freecol/trunk/src/net/sf/freecol/common/model/Unit.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/Unit.java 2009-08-24 19:38:55 UTC (rev 5731)
+++ freecol/trunk/src/net/sf/freecol/common/model/Unit.java 2009-08-25 10:42:13 UTC (rev 5732)
@@ -104,8 +104,8 @@
MOVE_HIGH_SEAS(null, true),
EXPLORE_LOST_CITY_RUMOUR(null, true),
ATTACK(null, false),
- EMBARK(null, true),
- DISEMBARK(null, true),
+ EMBARK(null, false),
+ DISEMBARK(null, false),
ENTER_INDIAN_VILLAGE_WITH_FREE_COLONIST(null, false),
ENTER_INDIAN_VILLAGE_WITH_SCOUT(null, false),
ENTER_INDIAN_VILLAGE_WITH_MISSIONARY(null, false),
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|