mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-26 13:27:22 -04:00
Ai now cares about city distances (#4680)
* Ai now cares about distance from it's cities * Ai now cares about distance from it's cities * Ai now cares about distance from it's cities * Ai will pay extra pay extra for bordering cities or surrounding cities * Ai will pay extra pay extra for bordering cities or surrounding cities * Ai will pay extra for cities that are closer to their territory * The code is cleaner * The code is cleaner * The code is cleaner * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance * Ai now values distance
This commit is contained in:
parent
3b4b9a27bf
commit
bb5392db4a
@ -13,6 +13,7 @@ import com.unciv.models.ruleset.tile.ResourceSupplyList
|
||||
import com.unciv.models.ruleset.tile.ResourceType
|
||||
import com.unciv.models.ruleset.unit.BaseUnit
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
import kotlin.collections.HashMap
|
||||
import kotlin.collections.HashSet
|
||||
import kotlin.math.ceil
|
||||
@ -231,6 +232,7 @@ class CityInfo {
|
||||
fun isConnectedToCapital(connectionTypePredicate: (Set<String>) -> Boolean = { true }): Boolean {
|
||||
val mediumTypes = civInfo.citiesConnectedToCapitalToMediums[this] ?: return false
|
||||
return connectionTypePredicate(mediumTypes)
|
||||
|
||||
}
|
||||
|
||||
fun isInResistance() = resistanceCounter > 0
|
||||
@ -629,5 +631,21 @@ class CityInfo {
|
||||
return !isOriginalCapital && !isCapital() && !isHolyCity()
|
||||
}
|
||||
|
||||
|
||||
fun getNeighbouringCivs(): List<String> {
|
||||
val tilesList: HashSet<TileInfo> = getTiles().toHashSet()
|
||||
val cityPositionList: ArrayList<TileInfo> = arrayListOf()
|
||||
|
||||
for (tiles in tilesList)
|
||||
for (tile in tiles.neighbors)
|
||||
if (!tilesList.contains(tile))
|
||||
cityPositionList.add(tile)
|
||||
|
||||
return cityPositionList.asSequence()
|
||||
.map { it.getOwner()?.civName }.filterNotNull().toSet()
|
||||
.distinct().toList()
|
||||
}
|
||||
|
||||
|
||||
//endregion
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package com.unciv.logic.trade
|
||||
import com.unciv.Constants
|
||||
import com.unciv.logic.automation.Automation
|
||||
import com.unciv.logic.automation.ThreatLevel
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.diplomacy.RelationshipLevel
|
||||
import com.unciv.models.ruleset.tile.ResourceType
|
||||
@ -147,9 +148,10 @@ class TradeEvaluation {
|
||||
TradeType.City -> {
|
||||
val city = tradePartner.cities.first { it.id == offer.name }
|
||||
val stats = city.cityStats.currentCityStats
|
||||
val surrounded: Int = surroundedByOurCities(city, civInfo)
|
||||
if (civInfo.getHappiness() + city.cityStats.happinessList.values.sum() < 0)
|
||||
return 0 // we can't really afford to go into negative happiness because of buying a city
|
||||
val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food
|
||||
val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food + surrounded
|
||||
return sumOfStats.toInt() * 100
|
||||
}
|
||||
TradeType.Agreement -> {
|
||||
@ -158,6 +160,16 @@ class TradeEvaluation {
|
||||
}
|
||||
}
|
||||
}
|
||||
fun surroundedByOurCities(city: CityInfo, civInfo: CivilizationInfo): Int{
|
||||
val borderingCivs: List<String> = city.getNeighbouringCivs()
|
||||
if (borderingCivs.size == 1 && borderingCivs.contains(civInfo.civName)){
|
||||
return 10*civInfo.getEraNumber() // if the city is surrounded only by trading civ
|
||||
}
|
||||
if (borderingCivs.contains(civInfo.civName))
|
||||
return 2*civInfo.getEraNumber() // if the city has a border with trading civ
|
||||
return 0
|
||||
|
||||
}
|
||||
|
||||
fun evaluateSellCost(offer: TradeOffer, civInfo: CivilizationInfo, tradePartner: CivilizationInfo): Int {
|
||||
when (offer.type) {
|
||||
@ -217,8 +229,10 @@ class TradeEvaluation {
|
||||
|
||||
TradeType.City -> {
|
||||
val city = civInfo.cities.first { it.id == offer.name }
|
||||
val capitalcity = civInfo.getCapital()
|
||||
val distanceCost = distanceCityTradeModifier(civInfo, capitalcity, city)
|
||||
val stats = city.cityStats.currentCityStats
|
||||
val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food
|
||||
val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food - distanceCost
|
||||
return sumOfStats.toInt() * 100
|
||||
}
|
||||
TradeType.Agreement -> {
|
||||
@ -235,6 +249,12 @@ class TradeEvaluation {
|
||||
}
|
||||
}
|
||||
}
|
||||
fun distanceCityTradeModifier(civInfo: CivilizationInfo, capitalcity: CityInfo, city: CityInfo): Int{
|
||||
val distanceBetweenCities = capitalcity.getCenterTile().aerialDistanceTo(city.getCenterTile())
|
||||
|
||||
if (distanceBetweenCities < 500) return 0
|
||||
return min(50, (500 - distanceBetweenCities) * civInfo.getEraNumber())
|
||||
}
|
||||
|
||||
fun evaluatePeaceCostForThem(ourCivilization: CivilizationInfo, otherCivilization: CivilizationInfo): Int {
|
||||
val ourCombatStrength = Automation.evaluateCombatStrength(ourCivilization)
|
||||
|
Loading…
x
Reference in New Issue
Block a user