From 4bc598dcd4b7ecf31015550e0ce880d7ca4b58a9 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 17 Sep 2018 08:10:51 +0300 Subject: [PATCH] Added automated exploration for scout units --- core/src/com/unciv/GameStarter.kt | 1 + .../com/unciv/logic/automation/UnitAutomation.kt | 14 +++++++++++++- core/src/com/unciv/logic/map/MapUnit.kt | 5 ++++- core/src/com/unciv/logic/map/TileInfo.kt | 6 +++++- .../com/unciv/logic/map/UnitMovementAlgorithms.kt | 3 +-- .../com/unciv/ui/worldscreen/unit/UnitActions.kt | 9 +++++++++ .../unciv/ui/worldscreen/unit/UnitActionsTable.kt | 2 ++ 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/core/src/com/unciv/GameStarter.kt b/core/src/com/unciv/GameStarter.kt index 712f424039..094ad5e2c7 100644 --- a/core/src/com/unciv/GameStarter.kt +++ b/core/src/com/unciv/GameStarter.kt @@ -58,6 +58,7 @@ class GameStarter(){ civ.placeUnitNearTile(startingLocation, "Settler") civ.placeUnitNearTile(startingLocation, "Warrior") + civ.placeUnitNearTile(startingLocation, "Scout") freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(startingLocation, distanceAroundStartingPointNoOneElseWillStartIn )) } diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index a8d99ce905..6afdc743b8 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -275,7 +275,7 @@ class UnitAutomation{ } fun rankTileAsCityCenter(tileInfo: TileInfo, nearbyTileRankings: Map): Float { - val bestTilesFromOuterLayer = tileInfo.tileMap.getTilesAtDistance(tileInfo.position,2) + val bestTilesFromOuterLayer = tileInfo.getTilesAtDistance(2) .sortedByDescending { nearbyTileRankings[it] }.take(2) val top5Tiles = tileInfo.neighbors.union(bestTilesFromOuterLayer) .sortedByDescending { nearbyTileRankings[it] } @@ -316,4 +316,16 @@ class UnitAutomation{ } } + fun automatedExplore(unit:MapUnit){ + for(i in 1..10){ + val unexploredTilesAtDistance = unit.getTile().getTilesAtDistance(i) + .filter { unit.canMoveTo(it) && it.position !in unit.civInfo.exploredTiles + && unit.movementAlgs().canReach(it) } + if(unexploredTilesAtDistance.isNotEmpty()){ + unit.movementAlgs().headTowards(unexploredTilesAtDistance.getRandom()) + return + } + } + } + } \ No newline at end of file diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index eef8db295b..a6cd527328 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -1,6 +1,7 @@ package com.unciv.logic.map import com.badlogic.gdx.math.Vector2 +import com.unciv.logic.automation.UnitAutomation import com.unciv.logic.automation.WorkerAutomation import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.gamebasics.GameBasics @@ -135,7 +136,7 @@ class MapUnit { if (currentMovement == 0f) return // We've already done stuff this turn, and can't do any more stuff val enemyUnitsInWalkingDistance = getDistanceToTiles().keys - .filter { it.militaryUnit!=null && it.militaryUnit!!.civInfo!=civInfo } + .filter { it.militaryUnit!=null && civInfo.isAtWarWith(it.militaryUnit!!.civInfo)} if(enemyUnitsInWalkingDistance.isNotEmpty()) { if (action != null && action!!.startsWith("moveTo")) action=null return // Don't you dare move. @@ -155,6 +156,8 @@ class MapUnit { } if (action == "automation") WorkerAutomation(this).automateWorkerAction() + + if(action == "explore") UnitAutomation().automatedExplore(this) } private fun doPostTurnAction() { diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index a0f009a95d..fbfe3654c7 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -73,7 +73,7 @@ open class TileInfo { val neighbors: List get(){ if(internalNeighbors==null) - internalNeighbors = tileMap.getTilesAtDistance(position, 1) + internalNeighbors = getTilesAtDistance(1) return internalNeighbors!! } @@ -229,6 +229,10 @@ open class TileInfo { return tileMap.getTilesInDistance(position,distance) } + fun getTilesAtDistance(distance:Int): List { + return tileMap.getTilesAtDistance(position,distance) + } + fun getDefensiveBonus(): Float { var bonus = getBaseTerrain().defenceBonus if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index e098ac8960..819d58ee8a 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -177,12 +177,11 @@ class UnitMovementAlgorithms(val unit:MapUnit) { } fun teleportToClosestMoveableTile(){ - val unitCurrentTilePosition = unit.getTile().position var allowedTile:TileInfo? = null var distance=0 while(allowedTile==null){ distance++ - allowedTile = tileMap.getTilesAtDistance(unitCurrentTilePosition,distance) + allowedTile = unit.getTile().getTilesAtDistance(distance) .firstOrNull{unit.canMoveTo(it)} } unit.removeFromTile() // we "teleport" them away diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 91ee560e6a..3f6ad44220 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -1,6 +1,7 @@ package com.unciv.ui.worldscreen.unit import com.unciv.UnCivGame +import com.unciv.logic.automation.UnitAutomation import com.unciv.logic.automation.WorkerAutomation import com.unciv.logic.map.MapUnit import com.unciv.models.gamebasics.Building @@ -56,6 +57,14 @@ class UnitActions { actionList += UnitAction("Sleep", { unit.action = "Sleep" }, unit.currentMovement != 0f) } + if(unit.baseUnit.unitType == UnitType.Scout){ + if(unit.action != "explore") + actionList += UnitAction("Explore", { UnitAutomation().automatedExplore(unit); unit.action = "explore" }, + unit.currentMovement != 0f) + else + actionList += UnitAction("Stop exploration", { unit.action = null }, true) + } + if(unit.baseUnit().unitType!= UnitType.Civilian && unit.promotions.canBePromoted()){ actionList += UnitAction("Promote", {UnCivGame.Current.screen = PromotionPickerScreen(unit)}, diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt index c8b5bcdea7..ee1f220430 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt @@ -37,6 +37,8 @@ class UnitActionsTable(val worldScreen: WorldScreen) : Table(){ "Set up" -> return ImageGetter.getUnitIcon("Catapult") "Disband unit" -> return ImageGetter.getImage("OtherIcons/DisbandUnit.png") "Sleep" -> return ImageGetter.getImage("OtherIcons/Sleep.png") + "Explore" -> return ImageGetter.getUnitIcon("Scout") + "Stop exploration" -> return ImageGetter.getImage("OtherIcons/Stop.png") else -> return ImageGetter.getImage("OtherIcons/Star.png") } }