From ace5a6efbf05121a1052c6f557b0bfb8247eb577 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 26 Apr 2018 21:29:20 +0300 Subject: [PATCH] Worker automation fixed - ready for big update! --- android/build.gradle | 4 ++-- core/src/com/unciv/logic/Automation.kt | 6 ++++-- core/src/com/unciv/logic/WorkerAutomation.kt | 10 +++++++--- core/src/com/unciv/logic/map/MapUnit.kt | 2 +- core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt | 4 ++-- core/src/com/unciv/ui/tilegroups/TileGroup.kt | 4 ++-- core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt | 4 ++-- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 84070ccb54..80329e1cf0 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.game" minSdkVersion 14 targetSdkVersion 26 - versionCode 42 - versionName "1.4.9" + versionCode 43 + versionName "2.0.0" } buildTypes { release { diff --git a/core/src/com/unciv/logic/Automation.kt b/core/src/com/unciv/logic/Automation.kt index cf95b0db67..891501c2f1 100644 --- a/core/src/com/unciv/logic/Automation.kt +++ b/core/src/com/unciv/logic/Automation.kt @@ -168,8 +168,10 @@ class Automation { val tileMap = unit.civInfo.gameInfo.tileMap // find best city location within 5 tiles - val bestCityLocation = unit.getTile().getTilesInDistance(7) - .filterNot { it.getTilesInDistance(2).any { tid -> tid.isCityCenter } } + val tilesNearCities = unit.civInfo.gameInfo.civilizations.flatMap { it.cities } + .flatMap { it.getCenterTile().getTilesInDistance(2) } + val bestCityLocation = unit.getTile().getTilesInDistance(5) + .minus(tilesNearCities) .sortedByDescending { rankTileAsCityCenter(it, unit.civInfo) } .first() diff --git a/core/src/com/unciv/logic/WorkerAutomation.kt b/core/src/com/unciv/logic/WorkerAutomation.kt index de92421489..e54d90eead 100644 --- a/core/src/com/unciv/logic/WorkerAutomation.kt +++ b/core/src/com/unciv/logic/WorkerAutomation.kt @@ -26,7 +26,7 @@ public class WorkerAutomation(){ } private fun findTileToWork(currentTile: TileInfo, civInfo: CivilizationInfo): TileInfo { - val selectedTile = currentTile.getTilesInDistance(4) + val workableTiles = currentTile.getTilesInDistance(4) .filter { (it.unit == null || it == currentTile) && it.improvement == null @@ -35,8 +35,12 @@ public class WorkerAutomation(){ && UnitMovementAlgorithms(currentTile.tileMap) // the tile is actually reachable - more difficult than it seems! .getShortestPath(currentTile.position, it.position, 2f, 2, civInfo).isNotEmpty() } - .maxBy { getPriority(it, civInfo) } - if (selectedTile != null && getPriority(selectedTile, civInfo) > getPriority(currentTile,civInfo)) return selectedTile + val selectedTile = workableTiles.maxBy { getPriority(it, civInfo) } + if (selectedTile != null + && getPriority(selectedTile, civInfo)>1 + && (!workableTiles.contains(currentTile) + || getPriority(selectedTile, civInfo) > getPriority(currentTile,civInfo))) + return selectedTile else return currentTile } diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 81a9c16265..b1ccbac4dd 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -79,7 +79,7 @@ class MapUnit { val currentTile = getTile() val tileMap = currentTile.tileMap - val finalDestinationTile = tileMap.get(destination) + val finalDestinationTile = tileMap[destination] val distanceToTiles = getDistanceToTiles() val destinationTileThisTurn:TileInfo diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index 0112e6e049..3036ebb214 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -44,7 +44,7 @@ class UnitMovementAlgorithms(val tileMap: TileMap){ fun getShortestPath(origin: Vector2, destination: Vector2, currentMovement: Float, maxMovement: Int, civInfo: CivilizationInfo): List { - if(origin.equals(destination)) return listOf(tileMap[origin]) // edge case that's needed, so that workers will know that they can reach their own tile. *sigh* + if(origin.equals(destination)) return listOf(tileMap[origin]) // edge case that's needed, so that workers will know that they can reach their own tile. *sig var tilesToCheck: List = listOf(tileMap[origin]) val movementTreeParents = HashMap() // contains a map of "you can get from X to Y in that turn" @@ -70,7 +70,7 @@ class UnitMovementAlgorithms(val tileMap: TileMap){ } if (distanceToDestination.isNotEmpty()) { - val path = ArrayList() // Traverse the tree upwards to get the list of tiles leading to the destination, + val path = mutableListOf(tileMap[destination]) // Traverse the tree upwards to get the list of tiles leading to the destination, var currentTile = distanceToDestination.minBy { it.value }!!.key while (currentTile.position != origin) { path.add(currentTile) diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 713c60eafd..206a077998 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -53,8 +53,8 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { open fun update(isViewable: Boolean) { if (!tileInfo.tileMap.gameInfo.getPlayerCivilization().exploredTiles.contains(tileInfo.position)) { -// hexagon.color = Color.BLACK -// return + hexagon.color = Color.BLACK + return } updateTerrainFeatureImage() diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index fe052f95b5..1f2c385442 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -47,7 +47,7 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { override fun update(isViewable: Boolean) { super.update(isViewable) - //if (!tileInfo.explored) return + if (!tileInfo.tileMap.gameInfo.getPlayerCivilization().exploredTiles.contains(tileInfo.position)) return if (populationImage != null) removePopulationIcon() @@ -94,7 +94,7 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { unitImage = null } - if (tileInfo.unit != null /*&& isViewable*/) { // Tile is visible + if (tileInfo.unit != null && isViewable) { // Tile is visible val unit = tileInfo.unit!! unitImage = getUnitImage(unit.name, unit.civInfo.getCivilization().getColor()) addActor(unitImage!!)