diff --git a/core/src/com/unciv/logic/Automation.kt b/core/src/com/unciv/logic/Automation.kt index dcf65e6e78..019def4a23 100644 --- a/core/src/com/unciv/logic/Automation.kt +++ b/core/src/com/unciv/logic/Automation.kt @@ -8,6 +8,7 @@ import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo +import com.unciv.logic.map.UnitMovementAlgorithms import com.unciv.logic.map.UnitType import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.GameBasics @@ -24,6 +25,8 @@ class Automation { && it.improvement == null && (it.getCity()==null || it.getCity()!!.civInfo == civInfo) // don't work tiles belonging to another civ && it.canBuildImprovement(chooseImprovement(it), civInfo) + && 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) > 1) return selectedTile @@ -129,24 +132,7 @@ class Automation { fun automateUnitMoves(unit: MapUnit) { if (unit.name == "Settler") { - - val tileMap = unit.civInfo.gameInfo.tileMap - - // find best city location within 5 tiles - val bestCityLocation = tileMap.getTilesInDistance(unit.getTile().position, 5) - .filterNot { it.isCityCenter || it.neighbors.any { it.isCityCenter } } - .sortedByDescending { rankTileAsCityCenter(it, unit.civInfo) } - .first() - - if(unit.getTile() == bestCityLocation) - UnitActions().getUnitActions(unit, UnCivGame.Current.worldScreen!!).first { it.name == "Found city" }.action() - - else { - unit.headTowards(bestCityLocation.position) - if(unit.currentMovement>0 && unit.getTile()==bestCityLocation) - UnitActions().getUnitActions(unit, UnCivGame.Current.worldScreen!!).first { it.name == "Found city" }.action() - } - + automateSettlerActions(unit) return } @@ -235,6 +221,24 @@ class Automation { unit.moveToTile(distanceToTiles.keys.filter { it.unit == null }.toList().getRandom()) } + private fun automateSettlerActions(unit: MapUnit) { + val tileMap = unit.civInfo.gameInfo.tileMap + + // find best city location within 5 tiles + val bestCityLocation = tileMap.getTilesInDistance(unit.getTile().position, 7) + .filterNot { tileMap.getTilesInDistance(it.position,2).any { tid -> tid.isCityCenter } } + .sortedByDescending { rankTileAsCityCenter(it, unit.civInfo) } + .first() + + if (unit.getTile() == bestCityLocation) + UnitActions().getUnitActions(unit, UnCivGame.Current.worldScreen!!).first { it.name == "Found city" }.action() + else { + unit.headTowards(bestCityLocation.position) + if (unit.currentMovement > 0 && unit.getTile() == bestCityLocation) + UnitActions().getUnitActions(unit, UnCivGame.Current.worldScreen!!).first { it.name == "Found city" }.action() + } + } + fun chooseNextConstruction(cityConstructions: CityConstructions) { cityConstructions.run { diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index aaf22d7ccf..c67bdccd8d 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -3,6 +3,7 @@ package com.unciv.logic import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.Notification import com.unciv.logic.map.TileMap +import com.unciv.models.gamebasics.GameBasics import com.unciv.ui.utils.getRandom class GameInfo { @@ -21,7 +22,16 @@ class GameInfo { fun nextTurn() { notifications.clear() - for (civInfo in civilizations) civInfo.nextTurn() + for (civInfo in civilizations){ + if(civInfo.tech.techsToResearch.isEmpty()){ + val researchableTechs = GameBasics.Technologies.values + .filter { !civInfo.tech.isResearched(it.name) && civInfo.tech.canBeResearched(it.name) } + civInfo.tech.techsToResearch.add(researchableTechs.minBy { it.cost }!!.name) + } + } + + for (civInfo in civilizations) + civInfo.nextTurn() tileMap.values.filter { it.unit!=null }.map { it.unit!! }.forEach { it.nextTurn() } diff --git a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt index f07ea8f6ac..913770489c 100644 --- a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt +++ b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt @@ -38,4 +38,8 @@ class MapUnitCombatant(val unit: MapUnit) : ICombatant { else -> throw Exception("Should never get here!") } } + + override fun toString(): String { + return unit.name+" of "+unit.civInfo.civName + } } \ No newline at end of file diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 80dd980625..c4ed949983 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -131,4 +131,6 @@ class CityInfo { internal fun getMaxHealth(): Int { return 200 // add more later when walls citadl etc. } + + override fun toString(): String {return name} // for debug } \ No newline at end of file diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index b9eccdc29b..73fd0ac4bc 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -180,4 +180,6 @@ class CivilizationInfo { if(isPlayerCivilization()) gameInfo.notifications.add(Notification(text, location)) } + + override fun toString(): String {return civName} // for debug } \ No newline at end of file diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index 3cbd615620..45e377ad96 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -47,7 +47,8 @@ class TileMap { unit.owner = civInfo.civName unit.civInfo = civInfo val tilesInDistance = getTilesInDistance(position, 2) - tilesInDistance.first { it.unit == null }.unit = unit // And if there's none, then kill me. + val unitToPlaceTile = tilesInDistance.firstOrNull { it.unit == null } + if(unitToPlaceTile!=null) unitToPlaceTile.unit = unit // And if there's none, then kill me. } fun getViewableTiles(position: Vector2, sightDistance: Int): MutableList { diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index 39908624dd..ec7dba03fb 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -77,6 +77,8 @@ class UnitMovementAlgorithms(val tileMap: TileMap){ return path.reversed() // and reverse in order to get the list in chronological order } + if(newTilesToCheck.isEmpty()) return emptyList() // there is NO PATH (eg blocked by enemy units) + tilesToCheck = newTilesToCheck distance++ } diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 06b5de7516..03277d8eca 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.explored) { - hexagon.color = Color.BLACK - return + //hexagon.color = Color.BLACK + //return } updateTerrainFeatureImage()