Added automated exploration for scout units

This commit is contained in:
Yair Morgenstern
2018-09-17 08:10:51 +03:00
parent a1f824842d
commit 4bc598dcd4
7 changed files with 35 additions and 5 deletions

View File

@ -58,6 +58,7 @@ class GameStarter(){
civ.placeUnitNearTile(startingLocation, "Settler") civ.placeUnitNearTile(startingLocation, "Settler")
civ.placeUnitNearTile(startingLocation, "Warrior") civ.placeUnitNearTile(startingLocation, "Warrior")
civ.placeUnitNearTile(startingLocation, "Scout")
freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(startingLocation, distanceAroundStartingPointNoOneElseWillStartIn )) freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(startingLocation, distanceAroundStartingPointNoOneElseWillStartIn ))
} }

View File

@ -275,7 +275,7 @@ class UnitAutomation{
} }
fun rankTileAsCityCenter(tileInfo: TileInfo, nearbyTileRankings: Map<TileInfo, Float>): Float { fun rankTileAsCityCenter(tileInfo: TileInfo, nearbyTileRankings: Map<TileInfo, Float>): Float {
val bestTilesFromOuterLayer = tileInfo.tileMap.getTilesAtDistance(tileInfo.position,2) val bestTilesFromOuterLayer = tileInfo.getTilesAtDistance(2)
.sortedByDescending { nearbyTileRankings[it] }.take(2) .sortedByDescending { nearbyTileRankings[it] }.take(2)
val top5Tiles = tileInfo.neighbors.union(bestTilesFromOuterLayer) val top5Tiles = tileInfo.neighbors.union(bestTilesFromOuterLayer)
.sortedByDescending { nearbyTileRankings[it] } .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
}
}
}
} }

View File

@ -1,6 +1,7 @@
package com.unciv.logic.map package com.unciv.logic.map
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.logic.automation.UnitAutomation
import com.unciv.logic.automation.WorkerAutomation import com.unciv.logic.automation.WorkerAutomation
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.gamebasics.GameBasics 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 if (currentMovement == 0f) return // We've already done stuff this turn, and can't do any more stuff
val enemyUnitsInWalkingDistance = getDistanceToTiles().keys 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(enemyUnitsInWalkingDistance.isNotEmpty()) {
if (action != null && action!!.startsWith("moveTo")) action=null if (action != null && action!!.startsWith("moveTo")) action=null
return // Don't you dare move. return // Don't you dare move.
@ -155,6 +156,8 @@ class MapUnit {
} }
if (action == "automation") WorkerAutomation(this).automateWorkerAction() if (action == "automation") WorkerAutomation(this).automateWorkerAction()
if(action == "explore") UnitAutomation().automatedExplore(this)
} }
private fun doPostTurnAction() { private fun doPostTurnAction() {

View File

@ -73,7 +73,7 @@ open class TileInfo {
val neighbors: List<TileInfo> val neighbors: List<TileInfo>
get(){ get(){
if(internalNeighbors==null) if(internalNeighbors==null)
internalNeighbors = tileMap.getTilesAtDistance(position, 1) internalNeighbors = getTilesAtDistance(1)
return internalNeighbors!! return internalNeighbors!!
} }
@ -229,6 +229,10 @@ open class TileInfo {
return tileMap.getTilesInDistance(position,distance) return tileMap.getTilesInDistance(position,distance)
} }
fun getTilesAtDistance(distance:Int): List<TileInfo> {
return tileMap.getTilesAtDistance(position,distance)
}
fun getDefensiveBonus(): Float { fun getDefensiveBonus(): Float {
var bonus = getBaseTerrain().defenceBonus var bonus = getBaseTerrain().defenceBonus
if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus

View File

@ -177,12 +177,11 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
} }
fun teleportToClosestMoveableTile(){ fun teleportToClosestMoveableTile(){
val unitCurrentTilePosition = unit.getTile().position
var allowedTile:TileInfo? = null var allowedTile:TileInfo? = null
var distance=0 var distance=0
while(allowedTile==null){ while(allowedTile==null){
distance++ distance++
allowedTile = tileMap.getTilesAtDistance(unitCurrentTilePosition,distance) allowedTile = unit.getTile().getTilesAtDistance(distance)
.firstOrNull{unit.canMoveTo(it)} .firstOrNull{unit.canMoveTo(it)}
} }
unit.removeFromTile() // we "teleport" them away unit.removeFromTile() // we "teleport" them away

View File

@ -1,6 +1,7 @@
package com.unciv.ui.worldscreen.unit package com.unciv.ui.worldscreen.unit
import com.unciv.UnCivGame import com.unciv.UnCivGame
import com.unciv.logic.automation.UnitAutomation
import com.unciv.logic.automation.WorkerAutomation import com.unciv.logic.automation.WorkerAutomation
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
@ -56,6 +57,14 @@ class UnitActions {
actionList += UnitAction("Sleep", { unit.action = "Sleep" }, unit.currentMovement != 0f) 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()){ if(unit.baseUnit().unitType!= UnitType.Civilian && unit.promotions.canBePromoted()){
actionList += UnitAction("Promote", actionList += UnitAction("Promote",
{UnCivGame.Current.screen = PromotionPickerScreen(unit)}, {UnCivGame.Current.screen = PromotionPickerScreen(unit)},

View File

@ -37,6 +37,8 @@ class UnitActionsTable(val worldScreen: WorldScreen) : Table(){
"Set up" -> return ImageGetter.getUnitIcon("Catapult") "Set up" -> return ImageGetter.getUnitIcon("Catapult")
"Disband unit" -> return ImageGetter.getImage("OtherIcons/DisbandUnit.png") "Disband unit" -> return ImageGetter.getImage("OtherIcons/DisbandUnit.png")
"Sleep" -> return ImageGetter.getImage("OtherIcons/Sleep.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") else -> return ImageGetter.getImage("OtherIcons/Star.png")
} }
} }