diff --git a/android/assets/jsons/Civ V - Vanilla/Nations.json b/android/assets/jsons/Civ V - Vanilla/Nations.json index f7d368bbe2..b63edba362 100644 --- a/android/assets/jsons/Civ V - Vanilla/Nations.json +++ b/android/assets/jsons/Civ V - Vanilla/Nations.json @@ -1050,6 +1050,8 @@ "name": "Barbarians", "outerColor": [0,0,0], "innerColor": [182,0,0] + "uniques": ["Can only heal by pillaging"], + } ] diff --git a/core/src/com/unciv/logic/automation/BarbarianAutomation.kt b/core/src/com/unciv/logic/automation/BarbarianAutomation.kt index a094603664..e9e03a018b 100644 --- a/core/src/com/unciv/logic/automation/BarbarianAutomation.kt +++ b/core/src/com/unciv/logic/automation/BarbarianAutomation.kt @@ -1,15 +1,8 @@ package com.unciv.logic.automation import com.unciv.Constants -import com.unciv.logic.battle.Battle -import com.unciv.logic.battle.BattleDamage -import com.unciv.logic.battle.MapUnitCombatant import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.MapUnit -import com.unciv.logic.map.PathsToTilesWithinTurn -import com.unciv.logic.map.TileInfo -import com.unciv.models.AttackableTile -import com.unciv.models.ruleset.unit.UnitType class BarbarianAutomation(val civInfo: CivilizationInfo) { @@ -21,14 +14,11 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { } private fun automateUnit(unit: MapUnit) { - when { - unit.currentTile.improvement == Constants.barbarianEncampment -> automateEncampment(unit) - unit.type == UnitType.Scout -> automateScout(unit) - else -> automateCombatUnit(unit) - } + if (unit.currentTile.improvement == Constants.barbarianEncampment) automateUnitOnEncampment(unit) + else automateCombatUnit(unit) } - private fun automateEncampment(unit: MapUnit) { + private fun automateUnitOnEncampment(unit: MapUnit) { // 1 - trying to upgrade if (UnitAutomation.tryUpgradeUnit(unit)) return @@ -40,25 +30,8 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { } private fun automateCombatUnit(unit: MapUnit) { - val unitDistanceToTiles = unit.movement.getDistanceToTiles() - val nearEnemyTiles = BattleHelper.getAttackableEnemies(unit, unitDistanceToTiles) - - // 1 - heal or fortifying if death is near - if (unit.health < 50) { - val possibleDamage = nearEnemyTiles - .map { - BattleDamage.calculateDamageToAttacker(MapUnitCombatant(unit), - it.tileToAttackFrom, - Battle.getMapCombatantOfTile(it.tileToAttack)!!) - } - .sum() - val possibleHeal = unit.rankTileForHealing(unit.currentTile) - if (possibleDamage > possibleHeal) { - UnitAutomation.runAway(unit) - } - unit.fortifyIfCan() - return - } + // 1 - Try pillaging to restore health (barbs don't auto-heal) + if (unit.health < 50 && UnitAutomation.tryPillageImprovement(unit)) return // 2 - trying to upgrade if (UnitAutomation.tryUpgradeUnit(unit)) return @@ -71,55 +44,8 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { // 4 - trying to pillage tile or route if (UnitAutomation.tryPillageImprovement(unit)) return - // 5 - heal the unit if needed - if (unit.health < 100 && UnitAutomation.tryHealUnit(unit)) return - // 6 - wander UnitAutomation.wander(unit) } - private fun automateScout(unit: MapUnit) { - val unitDistanceToTiles = unit.movement.getDistanceToTiles() - val nearEnemyTiles = BattleHelper.getAttackableEnemies(unit, unitDistanceToTiles) - - // 1 - heal or run if death is near - if (unit.health < 50) { - if (nearEnemyTiles.isNotEmpty()) UnitAutomation.runAway(unit) - unit.fortifyIfCan() - - return - } - - // 2 - trying to capture someone - // TODO - - // 3 - trying to pillage tile or trade route - if (UnitAutomation.tryPillageImprovement(unit)) return - - // 4 - heal the unit if needed - if (unit.health < 100 && UnitAutomation.tryHealUnit(unit)) return - - // 5 - wander - UnitAutomation.wander(unit) - } - - private fun findFurthestTileCanMoveTo( - unit: MapUnit, - unitDistanceToTiles: PathsToTilesWithinTurn, - nearEnemyTiles: List - ): TileInfo? { - val possibleTiles = unitDistanceToTiles.keys.filter { unit.movement.canMoveTo(it) } - if(possibleTiles.isEmpty()) return null - val enemies = nearEnemyTiles.mapNotNull { it.tileToAttack.militaryUnit } - var furthestTile: Pair = possibleTiles.random() to 0f - for (enemy in enemies) { - for (tile in possibleTiles) { - val distance = enemy.movement.getMovementCostBetweenAdjacentTiles(enemy.currentTile, tile, enemy.civInfo) - if (distance > furthestTile.second) { - furthestTile = tile to distance - } - } - } - return furthestTile.first - } } \ 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 09c8255848..07f4d7278e 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -441,6 +441,8 @@ class MapUnit { private fun heal() { if (isEmbarked()) return // embarked units can't heal + if (civInfo.hasUnique("Can only heal by pillaging")) return + var amountToHealBy = rankTileForHealing(getTile()) if (amountToHealBy == 0) return diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index e04fb1be1e..8f6035a654 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -227,10 +227,10 @@ open class TileInfo { val tileType = unique.params[1] if (tileType == improvement) continue // This is added to the calculation in getImprovementStats. we don't want to add it twice if (matchesUniqueFilter(tileType, observingCiv) - || (tileType == "Strategic resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Strategic) - || (tileType == "Luxury resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Luxury) - || (tileType == "Bonus resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Bonus) - || (tileType == "Water resource" && isWater && hasViewableResource(observingCiv)) + || tileType == "Strategic resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Strategic + || tileType == "Luxury resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Luxury + || tileType == "Bonus resource" && hasViewableResource(observingCiv) && getTileResource().resourceType == ResourceType.Bonus + || tileType == "Water resource" && isWater && hasViewableResource(observingCiv) ) stats.add(unique.stats) } } @@ -606,11 +606,12 @@ open class TileInfo { } for (terrainFeature in terrainFeatures.toList()) { - if (!ruleset.terrains.containsKey(terrainFeature)) { + val terrainFeatureObject = ruleset.terrains[terrainFeature] + if (terrainFeatureObject == null) { terrainFeatures.remove(terrainFeature) continue } - val terrainFeatureObject = ruleset.terrains[terrainFeature]!! + if (terrainFeatureObject.occursOn.isNotEmpty() && !terrainFeatureObject.occursOn.contains(baseTerrain)) terrainFeatures.remove(terrainFeature) }