Specialist information is now hybrid

This commit is contained in:
Yair Morgenstern
2020-09-30 18:03:26 +03:00
parent 9f9d89af9d
commit 43f5799578
2 changed files with 37 additions and 36 deletions

View File

@ -252,19 +252,14 @@ class CityStats {
} }
fun getStatsOfSpecialist(specialistName:String): Stats { fun getStatsOfSpecialist(specialistName:String): Stats {
val stats = cityInfo.getRuleset().specialists[specialistName]!!.clone() val specialist = cityInfo.getRuleset().specialists[specialistName]
if (specialist == null) return Stats()
val stats = specialist.clone()
for (unique in cityInfo.civInfo.getMatchingUniques("[] from every specialist")) for (unique in cityInfo.civInfo.getMatchingUniques("[] from every specialist"))
stats.add(Stats.parse(unique.params[0])) stats.add(Stats.parse(unique.params[0]))
return stats return stats
} }
private fun getStatsFromSpecialists(specialists: Stats): Stats {
val stats = Stats()
for (entry in specialists.toHashMap().filter { it.value > 0 })
stats.add(getStatsOfSpecialist(entry.key) * entry.value)
return stats
}
private fun getStatsFromSpecialists(specialists: HashMap<String, Int>): Stats { private fun getStatsFromSpecialists(specialists: HashMap<String, Int>): Stats {
val stats = Stats() val stats = Stats()
for (entry in specialists.filter { it.value > 0 }) for (entry in specialists.filter { it.value > 0 })

View File

@ -7,6 +7,8 @@ import com.unciv.models.stats.Stat
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import com.unciv.ui.utils.withItem import com.unciv.ui.utils.withItem
import com.unciv.ui.utils.withoutItem import com.unciv.ui.utils.withoutItem
import kotlin.math.floor
import kotlin.math.pow
class PopulationManager { class PopulationManager {
@Transient @Transient
@ -18,17 +20,13 @@ class PopulationManager {
// Being deprecated out // Being deprecated out
val specialists = Stats() val specialists = Stats()
fun getNewSpecialists(): HashMap<String, Int> { fun getNewSpecialists() = convertStatsToSpecialistHashmap(specialists)
fun convertStatsToSpecialistHashmap(stats: Stats):HashMap<String,Int> {
val specialistHashmap = HashMap<String, Int>() val specialistHashmap = HashMap<String, Int>()
for ((stat, amount) in specialists.toHashMap()) { for ((stat, amount) in stats.toHashMap()) {
if (amount == 0f) continue if (amount == 0f) continue
val specialistName = when (stat) { val specialistName = specialistNameByStat(stat)
Stat.Production -> "Engineer"
Stat.Gold -> "Merchant"
Stat.Science -> "Scientist"
Stat.Culture -> "Artist"
else -> TODO()
}
specialistHashmap[specialistName] = amount.toInt() specialistHashmap[specialistName] = amount.toInt()
} }
return specialistHashmap return specialistHashmap
@ -43,9 +41,7 @@ class PopulationManager {
return toReturn return toReturn
} }
fun getNumberOfSpecialists(): Int { fun getNumberOfSpecialists() = getNewSpecialists().values.sum()
return getNewSpecialists().values.sum()
}
fun getFreePopulation(): Int { fun getFreePopulation(): Int {
val workingPopulation = cityInfo.workedTiles.size val workingPopulation = cityInfo.workedTiles.size
@ -54,7 +50,7 @@ class PopulationManager {
fun getFoodToNextPopulation(): Int { fun getFoodToNextPopulation(): Int {
// civ v math, civilization.wikia // civ v math, civilization.wikia
var foodRequired = 15 + 6 * (population - 1) + Math.floor(Math.pow((population - 1).toDouble(), 1.8)) var foodRequired = 15 + 6 * (population - 1) + floor((population - 1).toDouble().pow(1.8))
if(!cityInfo.civInfo.isPlayerCivilization()) if(!cityInfo.civInfo.isPlayerCivilization())
foodRequired *= cityInfo.civInfo.gameInfo.getDifficulty().aiCityGrowthModifier foodRequired *= cityInfo.civInfo.gameInfo.getDifficulty().aiCityGrowthModifier
return foodRequired.toInt() return foodRequired.toInt()
@ -84,6 +80,16 @@ class PopulationManager {
internal fun getStatsOfSpecialist(stat: Stat) = cityInfo.cityStats.getStatsOfSpecialist(stat) internal fun getStatsOfSpecialist(stat: Stat) = cityInfo.cityStats.getStatsOfSpecialist(stat)
internal fun getStatsOfSpecialist(name:String) = cityInfo.cityStats.getStatsOfSpecialist(name)
internal fun specialistNameByStat(stat: Stat) = when (stat) {
Stat.Production -> "Engineer"
Stat.Gold -> "Merchant"
Stat.Science -> "Scientist"
Stat.Culture -> "Artist"
else -> TODO()
}
// todo - change tile choice according to city! // todo - change tile choice according to city!
// if small city, favor production above all, ignore gold! // if small city, favor production above all, ignore gold!
// if larger city, food should be worth less! // if larger city, food should be worth less!
@ -138,8 +144,10 @@ class PopulationManager {
else { else {
cityInfo.workedTiles.asSequence() cityInfo.workedTiles.asSequence()
.map { cityInfo.tileMap[it] } .map { cityInfo.tileMap[it] }
.minBy { Automation.rankTileForCityWork(it, cityInfo) .minBy {
+ (if(it.isLocked()) 10 else 0) }!! Automation.rankTileForCityWork(it, cityInfo)
+(if (it.isLocked()) 10 else 0)
}!!
} }
val valueWorstTile = if (worstWorkedTile == null) 0f val valueWorstTile = if (worstWorkedTile == null) 0f
else Automation.rankTileForCityWork(worstWorkedTile, cityInfo) else Automation.rankTileForCityWork(worstWorkedTile, cityInfo)
@ -158,9 +166,7 @@ class PopulationManager {
if ((worstWorkedTile != null && valueWorstTile < valueWorstSpecialist) if ((worstWorkedTile != null && valueWorstTile < valueWorstSpecialist)
|| worstJob == null) { || worstJob == null) {
cityInfo.workedTiles = cityInfo.workedTiles.withoutItem(worstWorkedTile!!.position) cityInfo.workedTiles = cityInfo.workedTiles.withoutItem(worstWorkedTile!!.position)
} else { } else specialists.add(worstJob, -1f)
specialists.add(worstJob, -1f)
}
} }
} }