Resolved #3076 - automation now happens at the end of turn rather than the beginning
This commit is contained in:
parent
def96071e7
commit
1b3469ea2e
4 changed files with 48 additions and 59 deletions
|
@ -27,7 +27,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
|||
|
||||
if (tileToWork != currentTile) {
|
||||
val reachedTile = unit.movement.headTowards(tileToWork)
|
||||
if (reachedTile != currentTile) unit.doPreTurnAction() // otherwise, we get a situation where the worker is automated, so it tries to move but doesn't, then tries to automate, then move, etc, forever. Stack overflow exception!
|
||||
if (reachedTile != currentTile) unit.doAction() // otherwise, we get a situation where the worker is automated, so it tries to move but doesn't, then tries to automate, then move, etc, forever. Stack overflow exception!
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
|||
|
||||
if (mostUndevelopedCity != null && mostUndevelopedCity != unit.currentTile.owningCity) {
|
||||
val reachedTile = unit.movement.headTowards(mostUndevelopedCity.getCenterTile())
|
||||
if (reachedTile != currentTile) unit.doPreTurnAction() // since we've moved, maybe we can do something here - automate
|
||||
if (reachedTile != currentTile) unit.doAction() // since we've moved, maybe we can do something here - automate
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -86,12 +86,10 @@ object Battle {
|
|||
}
|
||||
|
||||
if (attacker is MapUnitCombatant) {
|
||||
if (attacker.getUnitType()==UnitType.Missile) {
|
||||
if (attacker.getUnitType() == UnitType.Missile)
|
||||
attacker.unit.destroy()
|
||||
} else if (attacker.unit.action != null
|
||||
&& attacker.unit.action!!.startsWith("moveTo")) {
|
||||
else if (attacker.unit.isMoving())
|
||||
attacker.unit.action = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -179,16 +179,14 @@ class MapUnit {
|
|||
civInfo.updateViewableTiles() // for the civ
|
||||
}
|
||||
|
||||
fun isFortified(): Boolean {
|
||||
return action?.startsWith("Fortify") == true
|
||||
}
|
||||
fun isFortified() = action?.startsWith("Fortify") == true
|
||||
|
||||
fun isSleeping(): Boolean {
|
||||
return action?.startsWith("Sleep") == true
|
||||
}
|
||||
fun isSleeping() = action?.startsWith("Sleep") == true
|
||||
|
||||
fun isMoving() = action?.startsWith("moveTo") == true
|
||||
|
||||
fun getFortificationTurns(): Int {
|
||||
if(!isFortified()) return 0
|
||||
if (!isFortified()) return 0
|
||||
return action!!.split(" ")[1].toInt()
|
||||
}
|
||||
|
||||
|
@ -200,17 +198,17 @@ class MapUnit {
|
|||
fun isIdle(): Boolean {
|
||||
if (currentMovement == 0f) return false
|
||||
if (hasUnique(Constants.workerUnique) && getTile().improvementInProgress != null) return false
|
||||
if (hasUnique("Can construct roads") && currentTile.improvementInProgress=="Road") return false
|
||||
if (hasUnique("Can construct roads") && currentTile.improvementInProgress == "Road") return false
|
||||
if (isFortified()) return false
|
||||
if (action==Constants.unitActionExplore || isSleeping()
|
||||
|| action == Constants.unitActionAutomation) return false
|
||||
if (action == Constants.unitActionExplore || isSleeping()
|
||||
|| action == Constants.unitActionAutomation || isMoving()) return false
|
||||
return true
|
||||
}
|
||||
|
||||
fun canAttack(): Boolean {
|
||||
if(currentMovement==0f) return false
|
||||
if(attacksThisTurn>0 && !hasUnique("1 additional attack per turn")) return false
|
||||
if(attacksThisTurn>1) return false
|
||||
if (currentMovement == 0f) return false
|
||||
if (attacksThisTurn > 0 && !hasUnique("1 additional attack per turn")) return false
|
||||
if (attacksThisTurn > 1) return false
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -235,9 +233,9 @@ class MapUnit {
|
|||
}
|
||||
|
||||
fun getEmbarkedMovement(): Int {
|
||||
var movement=2
|
||||
var movement = 2
|
||||
movement += civInfo.tech.getTechUniques().count { it == "Increases embarked movement +1" }
|
||||
if (civInfo.hasUnique("+1 Movement for all embarked units")) movement +=1
|
||||
if (civInfo.hasUnique("+1 Movement for all embarked units")) movement += 1
|
||||
return movement
|
||||
}
|
||||
|
||||
|
@ -267,30 +265,26 @@ class MapUnit {
|
|||
fun getCostOfUpgrade(): Int {
|
||||
val unitToUpgradeTo = getUnitToUpgradeTo()
|
||||
var goldCostOfUpgrade = (unitToUpgradeTo.cost - baseUnit().cost) * 2 + 10
|
||||
for(unique in civInfo.getMatchingUniques("Gold cost of upgrading military units reduced by 33%"))
|
||||
for (unique in civInfo.getMatchingUniques("Gold cost of upgrading military units reduced by 33%"))
|
||||
goldCostOfUpgrade = (goldCostOfUpgrade * 0.66f).toInt()
|
||||
if(goldCostOfUpgrade<0) return 0 // For instance, Landsknecht costs less than Spearman, so upgrading would cost negative gold
|
||||
if (goldCostOfUpgrade < 0) return 0 // For instance, Landsknecht costs less than Spearman, so upgrading would cost negative gold
|
||||
return goldCostOfUpgrade
|
||||
}
|
||||
|
||||
|
||||
fun canFortify(): Boolean {
|
||||
if(type.isWaterUnit()) return false
|
||||
if(type.isCivilian()) return false
|
||||
if(type.isAirUnit()) return false
|
||||
if(isEmbarked()) return false
|
||||
if(hasUnique("No defensive terrain bonus")) return false
|
||||
if(isFortified()) return false
|
||||
if (type.isWaterUnit()) return false
|
||||
if (type.isCivilian()) return false
|
||||
if (type.isAirUnit()) return false
|
||||
if (isEmbarked()) return false
|
||||
if (hasUnique("No defensive terrain bonus")) return false
|
||||
if (isFortified()) return false
|
||||
return true
|
||||
}
|
||||
|
||||
fun fortify() {
|
||||
action = "Fortify 0"
|
||||
}
|
||||
fun fortify() { action = "Fortify 0" }
|
||||
|
||||
fun fortifyUntilHealed() {
|
||||
action = "Fortify 0 until healed"
|
||||
}
|
||||
fun fortifyUntilHealed() { action = "Fortify 0 until healed" }
|
||||
|
||||
fun fortifyIfCan() {
|
||||
if (canFortify()) {
|
||||
|
@ -323,9 +317,8 @@ class MapUnit {
|
|||
if(currentMovement<0) currentMovement = 0f
|
||||
}
|
||||
|
||||
fun doPreTurnAction() {
|
||||
fun doAction() {
|
||||
if (action == null) return
|
||||
val currentTile = getTile()
|
||||
if (currentMovement == 0f) return // We've already done stuff this turn, and can't do any more stuff
|
||||
|
||||
val enemyUnitsInWalkingDistance = movement.getDistanceToTiles().keys
|
||||
|
@ -338,16 +331,17 @@ class MapUnit {
|
|||
|
||||
mapUnitAction?.doPreTurnAction()
|
||||
|
||||
if (action != null && action!!.startsWith("moveTo")) {
|
||||
val currentTile = getTile()
|
||||
if (isMoving()) {
|
||||
val destination = action!!.replace("moveTo ", "").split(",").dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
val destinationVector = Vector2(Integer.parseInt(destination[0]).toFloat(), Integer.parseInt(destination[1]).toFloat())
|
||||
val destinationVector = Vector2(destination[0].toFloat(), destination[1].toFloat())
|
||||
val destinationTile = currentTile.tileMap[destinationVector]
|
||||
if (!movement.canReach(destinationTile)) return // That tile that we were moving towards is now unreachable
|
||||
val gotTo = movement.headTowards(destinationTile)
|
||||
if (gotTo == currentTile) // We didn't move at all
|
||||
return
|
||||
if (gotTo.position == destinationVector) action = null
|
||||
if (currentMovement > 0) doPreTurnAction()
|
||||
if (currentMovement > 0) doAction()
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -356,18 +350,6 @@ class MapUnit {
|
|||
if (action == Constants.unitActionExplore) UnitAutomation.automatedExplore(this)
|
||||
}
|
||||
|
||||
private fun doPostTurnAction() {
|
||||
if (hasUnique(Constants.workerUnique) && getTile().improvementInProgress != null) workOnImprovement()
|
||||
if(hasUnique("Can construct roads") && currentTile.improvementInProgress=="Road") workOnImprovement()
|
||||
if(currentMovement == getMaxMovement().toFloat()
|
||||
&& isFortified()){
|
||||
val currentTurnsFortified = getFortificationTurns()
|
||||
if(currentTurnsFortified<2)
|
||||
action = action!!.replace(currentTurnsFortified.toString(),(currentTurnsFortified+1).toString(), true)
|
||||
}
|
||||
if (hasUnique("Heal adjacent units for an additional 15 HP per turn"))
|
||||
currentTile.neighbors.flatMap{ it.getUnits() }.forEach{ it.healBy(15) }
|
||||
}
|
||||
|
||||
private fun workOnImprovement() {
|
||||
val tile = getTile()
|
||||
|
@ -462,12 +444,22 @@ class MapUnit {
|
|||
}
|
||||
|
||||
fun endTurn() {
|
||||
doPostTurnAction()
|
||||
if (currentMovement == getMaxMovement().toFloat() // didn't move this turn
|
||||
|| hasUnique("Unit will heal every turn, even if it performs an action")){
|
||||
heal()
|
||||
doAction()
|
||||
|
||||
if (hasUnique(Constants.workerUnique) && getTile().improvementInProgress != null) workOnImprovement()
|
||||
if (hasUnique("Can construct roads") && currentTile.improvementInProgress == "Road") workOnImprovement()
|
||||
if (currentMovement == getMaxMovement().toFloat() && isFortified()) {
|
||||
val currentTurnsFortified = getFortificationTurns()
|
||||
if (currentTurnsFortified < 2)
|
||||
action = action!!.replace(currentTurnsFortified.toString(), (currentTurnsFortified + 1).toString(), true)
|
||||
}
|
||||
if(action != null && health > 99)
|
||||
if (hasUnique("Heal adjacent units for an additional 15 HP per turn"))
|
||||
currentTile.neighbors.flatMap { it.getUnits() }.forEach { it.healBy(15) }
|
||||
|
||||
if (currentMovement == getMaxMovement().toFloat() // didn't move this turn
|
||||
|| hasUnique("Unit will heal every turn, even if it performs an action")) heal()
|
||||
|
||||
if (action != null && health > 99)
|
||||
if (action!!.endsWith(" until healed")) {
|
||||
action = null // wake up when healed
|
||||
}
|
||||
|
@ -490,7 +482,6 @@ class MapUnit {
|
|||
val tileOwner = getTile().getOwner()
|
||||
if (tileOwner != null && !civInfo.canEnterTiles(tileOwner) && !tileOwner.isCityState()) // if an enemy city expanded onto this tile while I was in it
|
||||
movement.teleportToClosestMoveableTile()
|
||||
doPreTurnAction()
|
||||
}
|
||||
|
||||
fun destroy(){
|
||||
|
|
|
@ -32,7 +32,7 @@ object UnitActions {
|
|||
val unitTable = worldScreen.bottomUnitTable
|
||||
val actionList = ArrayList<UnitAction>()
|
||||
|
||||
if (unit.action != null && unit.action!!.startsWith("moveTo")) {
|
||||
if (unit.isMoving()) {
|
||||
actionList += UnitAction(
|
||||
type = UnitActionType.StopMovement,
|
||||
action = { unit.action = null }
|
||||
|
|
Loading…
Reference in a new issue