mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-21 05:09:25 +07:00
Resolved #647 - Starting locations should not be on tiny Islands
This commit is contained in:
@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2
|
|||||||
import com.unciv.logic.GameInfo
|
import com.unciv.logic.GameInfo
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
import com.unciv.logic.civilization.PlayerType
|
import com.unciv.logic.civilization.PlayerType
|
||||||
|
import com.unciv.logic.map.BFS
|
||||||
import com.unciv.logic.map.MapType
|
import com.unciv.logic.map.MapType
|
||||||
import com.unciv.logic.map.TileInfo
|
import com.unciv.logic.map.TileInfo
|
||||||
import com.unciv.logic.map.TileMap
|
import com.unciv.logic.map.TileMap
|
||||||
@ -75,11 +76,21 @@ class GameStarter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getStartingLocations(numberOfPlayers:Int,tileMap: TileMap): Stack<TileInfo> {
|
fun getStartingLocations(numberOfPlayers:Int,tileMap: TileMap): Stack<TileInfo> {
|
||||||
val landTiles = tileMap.values
|
var landTiles = tileMap.values
|
||||||
.filter { it.isLand() && !it.getBaseTerrain().impassable }
|
.filter { it.isLand() && !it.getBaseTerrain().impassable }
|
||||||
|
|
||||||
|
val landTilesInBigEnoughGroup = ArrayList<TileInfo>()
|
||||||
|
while(landTiles.any()){
|
||||||
|
val bfs = BFS(landTiles.random()){it.isLand() && !it.getBaseTerrain().impassable}
|
||||||
|
bfs.stepToEnd()
|
||||||
|
val tilesInGroup = bfs.tilesReached.keys
|
||||||
|
landTiles = landTiles.filter { it !in tilesInGroup }
|
||||||
|
if(tilesInGroup.size > 20) // is this a good number? I dunno, but it's easy enough to change later on
|
||||||
|
landTilesInBigEnoughGroup.addAll(tilesInGroup)
|
||||||
|
}
|
||||||
|
|
||||||
for(minimumDistanceBetweenStartingLocations in tileMap.tileMatrix.size/2 downTo 0){
|
for(minimumDistanceBetweenStartingLocations in tileMap.tileMatrix.size/2 downTo 0){
|
||||||
val freeTiles = landTiles
|
val freeTiles = landTilesInBigEnoughGroup
|
||||||
.filter { vectorIsWithinNTilesOfEdge(it.position,min(3,minimumDistanceBetweenStartingLocations),tileMap)}
|
.filter { vectorIsWithinNTilesOfEdge(it.position,min(3,minimumDistanceBetweenStartingLocations),tileMap)}
|
||||||
.toMutableList()
|
.toMutableList()
|
||||||
|
|
||||||
|
@ -5,7 +5,8 @@ package com.unciv.logic.map
|
|||||||
*/
|
*/
|
||||||
class BFS(val startingPoint: TileInfo, val predicate : (TileInfo) -> Boolean){
|
class BFS(val startingPoint: TileInfo, val predicate : (TileInfo) -> Boolean){
|
||||||
var tilesToCheck = ArrayList<TileInfo>()
|
var tilesToCheck = ArrayList<TileInfo>()
|
||||||
val tilesReached = HashMap<TileInfo, TileInfo>() // each tile reached points to its parent tile, where we got to it from
|
/** each tile reached points to its parent tile, where we got to it from */
|
||||||
|
val tilesReached = HashMap<TileInfo, TileInfo>()
|
||||||
|
|
||||||
init{
|
init{
|
||||||
tilesToCheck.add(startingPoint)
|
tilesToCheck.add(startingPoint)
|
||||||
|
Reference in New Issue
Block a user