diff --git a/android/Images/UnitIcons/Landsknecht.png b/android/Images/UnitIcons/Landsknecht.png index 476c8ab205..d4e5db8075 100644 Binary files a/android/Images/UnitIcons/Landsknecht.png and b/android/Images/UnitIcons/Landsknecht.png differ diff --git a/android/assets/game.png b/android/assets/game.png index c9aed7c00c..75eaa62330 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/core/src/com/unciv/GameStarter.kt b/core/src/com/unciv/GameStarter.kt index 1dd67d1a9a..6d403f815a 100644 --- a/core/src/com/unciv/GameStarter.kt +++ b/core/src/com/unciv/GameStarter.kt @@ -35,9 +35,6 @@ class GameStarter{ gameInfo.tileMap = TileMap(newGameParameters) gameInfo.tileMap.gameInfo = gameInfo // need to set this transient before placing units in the map - val startingLocations = getStartingLocations( - newGameParameters.numberOfEnemies+newGameParameters.numberOfHumanPlayers+newGameParameters.numberOfCityStates, - gameInfo.tileMap) val availableCivNames = Stack() availableCivNames.addAll(GameBasics.Nations.filter { !it.value.isCityState() }.keys.shuffled()) @@ -75,8 +72,13 @@ class GameStarter{ // and only now do we add units for everyone, because otherwise both the gameInfo.setTransients() and the placeUnit will both add the unit to the civ's unit list! + + val startingLocations = getStartingLocations( + gameInfo.civilizations.filter { !it.isBarbarianCivilization() }, + gameInfo.tileMap) + for (civ in gameInfo.civilizations.filter { !it.isBarbarianCivilization() }) { - val startingLocation = startingLocations.pop()!! + val startingLocation = startingLocations[civ]!! civ.placeUnitNearTile(startingLocation.position, Constants.settler) civ.placeUnitNearTile(startingLocation.position, "Warrior") @@ -86,7 +88,7 @@ class GameStarter{ return gameInfo } - fun getStartingLocations(numberOfPlayers:Int,tileMap: TileMap): Stack { + fun getStartingLocations(civs:List,tileMap: TileMap): HashMap { var landTiles = tileMap.values .filter { it.isLand && !it.getBaseTerrain().impassable } @@ -105,17 +107,23 @@ class GameStarter{ .filter { vectorIsAtLeastNTilesAwayFromEdge(it.position,minimumDistanceBetweenStartingLocations,tileMap)} .toMutableList() - val startingLocations = ArrayList() - for(player in 0..numberOfPlayers){ + val startingLocations = HashMap() + for(civ in civs){ if(freeTiles.isEmpty()) break // we failed to get all the starting locations with this minimum distance - val randomLocation = freeTiles.random() - startingLocations.add(randomLocation) + var preferredTiles = freeTiles.toList() + for(startBias in civ.getNation().startBias){ + if(startBias.startsWith("Avoid ")) { + val tileToAvoid = startBias.removePrefix("Avoid ") + preferredTiles = preferredTiles.filter { it.baseTerrain != tileToAvoid && it.terrainFeature != tileToAvoid} + } + else preferredTiles = preferredTiles.filter { it.baseTerrain == startBias || it.terrainFeature==startBias } + } + val randomLocation = if(preferredTiles.isNotEmpty()) preferredTiles.random() else freeTiles.random() + startingLocations.put(civ, randomLocation) freeTiles.removeAll(tileMap.getTilesInDistance(randomLocation.position,minimumDistanceBetweenStartingLocations)) } - if(startingLocations.size < numberOfPlayers) continue // let's try again with less minimum distance! - val stack = Stack() - stack.addAll(startingLocations) - return stack + if(startingLocations.size < civs.size) continue // let's try again with less minimum distance! + return startingLocations } throw Exception("Didn't manage to get starting locations even with distance of 1?") } diff --git a/core/src/com/unciv/models/gamebasics/Nation.kt b/core/src/com/unciv/models/gamebasics/Nation.kt index 6a394669a9..32b5c1146c 100644 --- a/core/src/com/unciv/models/gamebasics/Nation.kt +++ b/core/src/com/unciv/models/gamebasics/Nation.kt @@ -48,6 +48,9 @@ class Nation : INamed { lateinit var mainColor: List var unique:String?=null var secondaryColor: List?=null + var startBias = ArrayList() + + fun getColor(): Color { return colorFromRGB(mainColor[0], mainColor[1], mainColor[2]) }