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, "Warrior")
civ.placeUnitNearTile(startingLocation, "Scout")
freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(startingLocation, distanceAroundStartingPointNoOneElseWillStartIn ))
}

View File

@ -275,7 +275,7 @@ class UnitAutomation{
}
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)
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
}
}
}
}

View File

@ -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() {

View File

@ -73,7 +73,7 @@ open class TileInfo {
val neighbors: List<TileInfo>
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<TileInfo> {
return tileMap.getTilesAtDistance(position,distance)
}
fun getDefensiveBonus(): Float {
var bonus = getBaseTerrain().defenceBonus
if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus

View File

@ -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

View File

@ -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)},

View File

@ -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")
}
}