|
From: <mp...@us...> - 2012-01-15 06:28:54
|
Revision: 9561
http://freecol.svn.sourceforge.net/freecol/?rev=9561&view=rev
Author: mpope
Date: 2012-01-15 06:28:48 +0000 (Sun, 15 Jan 2012)
Log Message:
-----------
Accurately account in-game for the tiles a settlement owns.
Forestalls a more complex form of BR#3375773 where tiles owned by a settlement
were not losing their ownership when the settlement was destroyed.
Modified Paths:
--------------
freecol/trunk/src/net/sf/freecol/common/model/Settlement.java
freecol/trunk/src/net/sf/freecol/common/model/Tile.java
freecol/trunk/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java
freecol/trunk/src/net/sf/freecol/server/generator/SimpleMapGenerator.java
freecol/trunk/test/src/net/sf/freecol/common/model/IndividualFatherTest.java
freecol/trunk/test/src/net/sf/freecol/server/ai/TensionTest.java
freecol/trunk/test/src/net/sf/freecol/server/model/ServerIndianSettlementTest.java
Modified: freecol/trunk/src/net/sf/freecol/common/model/Settlement.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/Settlement.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/src/net/sf/freecol/common/model/Settlement.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -52,11 +52,12 @@
/** The <code>Tile</code> where this <code>Settlement</code> is located. */
protected Tile tile;
- /**
- * Contains the abilities and modifiers of this Colony.
- */
+ /** Contains the abilities and modifiers of this Settlement. */
private FeatureContainer featureContainer;
+ /** The tiles this settlement owns. */
+ private List<Tile> ownedTiles = new ArrayList<Tile>();
+
/**
* Describe type here.
*/
@@ -370,31 +371,32 @@
/**
* Get the tiles this settlement owns.
- * Exploits the fact that the map generator only grows connected tiles.
*
* @return A list of tiles.
*/
public List<Tile> getOwnedTiles() {
- Tile settlementTile = getTile();
- List<Tile> tiles = new ArrayList<Tile>();
- tiles.add(settlementTile);
- for (Tile t : settlementTile.getSurroundingTiles(getRadius())) {
- if (t.getOwningSettlement() == this) tiles.add(t);
- }
- List<Tile> todo = new ArrayList<Tile>(tiles);
- while (!todo.isEmpty()) {
- Tile t = todo.remove(0);
- for (Tile s : t.getSurroundingTiles(1)) {
- if (s.getOwningSettlement() == this && !tiles.contains(s)) {
- tiles.add(s);
- todo.add(s);
- }
- }
- }
- return tiles;
+ return new ArrayList<Tile>(ownedTiles);
}
/**
+ * Adds a tile to this settlement.
+ *
+ * @param tile The <code>Tile</code> to add.
+ */
+ public void addTile(Tile tile) {
+ ownedTiles.add(tile);
+ }
+
+ /**
+ * Removes a tile from this settlement.
+ *
+ * @param tile The <code>Tile</code> to remove.
+ */
+ public void removeTile(Tile tile) {
+ ownedTiles.remove(tile);
+ }
+
+ /**
* Dispose of this settlement.
*
* @return A list of disposed objects.
Modified: freecol/trunk/src/net/sf/freecol/common/model/Tile.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/Tile.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/src/net/sf/freecol/common/model/Tile.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -762,7 +762,7 @@
*/
public void setSettlement(Settlement s) {
settlement = s;
- owningSettlement = s;
+ changeOwningSettlement(s);
}
/**
@@ -809,10 +809,19 @@
}
/**
- * Sets the owner of this tile. A <code>Settlement</code> become an owner
- * of a <code>Tile</code> when having workers placed on it.
+ * Gets the owning settlement for this tile.
*
- * @param owner The Settlement that owns this tile.
+ * @return The <code>Settlement</code> that owns this tile.
+ * @see #setOwner
+ */
+ public Settlement getOwningSettlement() {
+ return owningSettlement;
+ }
+
+ /**
+ * Sets the settlement that owns this tile.
+ *
+ * @param owner The <code>Settlement</code> to own this tile.
* @see #getOwner
*/
public void setOwningSettlement(Settlement owner) {
@@ -820,13 +829,18 @@
}
/**
- * Gets the owner of this tile.
+ * Changes the owning settlement for this tile.
*
- * @return The Settlement that owns this tile.
- * @see #setOwner
+ * @param settlement The new owning <code>Settlement</code> for this tile.
*/
- public Settlement getOwningSettlement() {
- return owningSettlement;
+ public void changeOwningSettlement(Settlement settlement) {
+ if (owningSettlement != null) {
+ owningSettlement.removeTile(this);
+ }
+ setOwningSettlement(settlement);
+ if (settlement != null) {
+ settlement.addTile(this);
+ }
}
/**
@@ -839,7 +853,7 @@
public void changeOwnership(Player player, Settlement settlement) {
Player old = getOwner();
setOwner(player);
- setOwningSettlement(settlement);
+ changeOwningSettlement(settlement);
updatePlayerExploredTiles(old);
}
@@ -1531,8 +1545,8 @@
public Unit getOccupyingUnit() {
Unit unit = getFirstUnit();
Player owner = null;
- if (owningSettlement != null) {
- owner = owningSettlement.getOwner();
+ if (getOwningSettlement() != null) {
+ owner = getOwningSettlement().getOwner();
}
if (owner != null && unit != null && unit.getOwner() != owner
&& owner.getStance(unit.getOwner()) != Stance.ALLIANCE) {
@@ -1880,20 +1894,22 @@
final String owningSettlementStr
= in.getAttributeValue(null, "owningSettlement");
+ Settlement newOwningSettlement = null;
if (owningSettlementStr != null) {
- owningSettlement = (Settlement) getGame().getFreeColGameObject(owningSettlementStr);
- if (owningSettlement == null) {
+ newOwningSettlement = (Settlement) getGame().getFreeColGameObject(owningSettlementStr);
+ if (newOwningSettlement == null) {
if (owningSettlementStr.startsWith(IndianSettlement.getXMLElementTagName())) {
- owningSettlement = new IndianSettlement(getGame(), owningSettlementStr);
+ newOwningSettlement = new IndianSettlement(getGame(), owningSettlementStr);
} else if (owningSettlementStr.startsWith(Colony.getXMLElementTagName())) {
- owningSettlement = new Colony(getGame(), owningSettlementStr);
+ newOwningSettlement = new Colony(getGame(), owningSettlementStr);
} else {
logger.warning("Unknown type of Settlement.");
}
}
} else {
- owningSettlement = null;
+ newOwningSettlement = null;
}
+ changeOwningSettlement(newOwningSettlement);
}
/**
Modified: freecol/trunk/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -1019,7 +1019,11 @@
}
if (unit.isColonist()) {
- giveColonistMission(aiUnit, fewColonies, workerWishes);
+ try {
+ giveColonistMission(aiUnit, fewColonies, workerWishes);
+ } catch (Exception e) {
+ throw new IllegalStateException("GCM: " + unit);
+ }
}
if (!aiUnit.hasMission()) {
Modified: freecol/trunk/src/net/sf/freecol/server/generator/SimpleMapGenerator.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/server/generator/SimpleMapGenerator.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/src/net/sf/freecol/server/generator/SimpleMapGenerator.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -479,8 +479,7 @@
i > 0; i--) {
Tile tile = findFreeNeighbouringTile(is, tiles, random);
if (tile == null) break;
- tile.setOwner(is.getOwner());
- tile.setOwningSettlement(is);
+ tile.changeOwnership(is.getOwner(), is);
tiles.add(tile);
}
}
@@ -899,8 +898,7 @@
if (tile.getSettlement() == null
&& (tile.getOwner() == null
|| !tile.getOwner().isEuropean())) {
- tile.setOwner(player);
- tile.setOwningSettlement(colony);
+ tile.changeOwnership(player, colony);
if (tile.hasLostCityRumour()) {
tile.removeLostCityRumour();
}
Modified: freecol/trunk/test/src/net/sf/freecol/common/model/IndividualFatherTest.java
===================================================================
--- freecol/trunk/test/src/net/sf/freecol/common/model/IndividualFatherTest.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/test/src/net/sf/freecol/common/model/IndividualFatherTest.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -122,8 +122,7 @@
for (Unit u : colonyTile.getUnitList()) {
u.setLocation(colony.getTile());
}
- disputedTile.setOwner(iroquois);
- disputedTile.setOwningSettlement(indianSettlement);
+ disputedTile.changeOwnership(iroquois, indianSettlement);
assertNotNull(settlementTile.getSettlement());
assertTrue(player.getLandPrice(disputedTile) > 0);
Modified: freecol/trunk/test/src/net/sf/freecol/server/ai/TensionTest.java
===================================================================
--- freecol/trunk/test/src/net/sf/freecol/server/ai/TensionTest.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/test/src/net/sf/freecol/server/ai/TensionTest.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -76,11 +76,6 @@
FreeColTestCase.IndianSettlementBuilder builder = new FreeColTestCase.IndianSettlementBuilder(game);
IndianSettlement settlement = builder.player(indian).settlementTile(tile).skillToTeach(null).capital(true).build();
- tile.setOwningSettlement(settlement);
- for (Tile newTile: tile.getSurroundingTiles(settlement.getRadius())) {
- newTile.setOwningSettlement(settlement);
- newTile.setOwner(indian);
- }
int unitCount = settlement.getType().getMaximumSize();
for (int i = 0; i < unitCount; i++) {
UnitType unitType = spec().getUnitType("model.unit.brave");
Modified: freecol/trunk/test/src/net/sf/freecol/server/model/ServerIndianSettlementTest.java
===================================================================
--- freecol/trunk/test/src/net/sf/freecol/server/model/ServerIndianSettlementTest.java 2012-01-15 06:25:48 UTC (rev 9560)
+++ freecol/trunk/test/src/net/sf/freecol/server/model/ServerIndianSettlementTest.java 2012-01-15 06:28:48 UTC (rev 9561)
@@ -126,7 +126,7 @@
// Simulate that only the center tile is owned by camp 1
// Does not matter where camp 2 is, so we put it in the same tile as camp1
for (Tile t: camp1.getTile().getSurroundingTiles(camp1.getRadius())) {
- t.setOwningSettlement(camp2);
+ t.changeOwnership(camp2.getOwner(), camp2);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|