diff --git a/src/net/sf/freecol/server/generator/EuropeanStartingPositionsGenerator.java b/src/net/sf/freecol/server/generator/EuropeanStartingPositionsGenerator.java index 4ac7d52ff..4804ef1f3 100644 --- a/src/net/sf/freecol/server/generator/EuropeanStartingPositionsGenerator.java +++ b/src/net/sf/freecol/server/generator/EuropeanStartingPositionsGenerator.java @@ -115,6 +115,17 @@ class EuropeanStartingPositionsGenerator { return determineStartingTilesWithoutUsingPredeterminedPositions(map, europeanPlayers, playerStartingUnits); } + final java.util.Map startingPositions = determineStartingTilesUsingMapDefinedPositions(europeanPlayers, playerStartingUnits, game); + if (startingPositions.size() < playerStartingUnits.size()) { + logger.info("Unable to use map defined starting positions - possibly caused by overlapping nation areas."); + return determineStartingTilesWithoutUsingPredeterminedPositions(map, europeanPlayers, playerStartingUnits); + } + return startingPositions; + } + + + private java.util.Map determineStartingTilesUsingMapDefinedPositions(List europeanPlayers, java.util.Map playerStartingUnits, Game game) { + final Specification spec = game.getSpecification(); final int positionType = spec.getInteger(GameOptions.STARTING_POSITIONS); switch (positionType) { case GameOptions.STARTING_POSITIONS_CLASSIC: @@ -160,9 +171,15 @@ class EuropeanStartingPositionsGenerator { possibleStartingTiles = startingArea.getTiles(); } - final int randomIndex = random.nextInt(possibleStartingTiles.size()); - final Tile startingTile = possibleStartingTiles.get(randomIndex); - startingTiles.put(player, startingTile); + while (!possibleStartingTiles.isEmpty()) { + final int randomIndex = random.nextInt(possibleStartingTiles.size()); + final Tile startingTile = possibleStartingTiles.get(randomIndex); + if (!startingTiles.values().contains(startingTile)) { + startingTiles.put(player, startingTile); + break; + } + possibleStartingTiles.remove(randomIndex); + } } return startingTiles; }