mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-15 18:28:42 +07:00
Final conversion of existing specialists to the new format
This commit is contained in:
@ -380,10 +380,10 @@ class GameInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As of 3.10.14, specialists are saved by name not by stat
|
// As of 3.10.14, specialists are saved by name not by stat
|
||||||
// for((key, value) in cityInfo.population.specialists.toHashMap())
|
for((key, value) in cityInfo.population.specialists.toHashMap().filter { it.value>0 })
|
||||||
// cityInfo.population.specialistAllocations.add(
|
cityInfo.population.specialistAllocations.add(
|
||||||
// cityInfo.population.specialistNameByStat(key), value.toInt())
|
cityInfo.population.specialistNameByStat(key), value.toInt())
|
||||||
// cityInfo.population.specialists.clear()
|
cityInfo.population.specialists.clear()
|
||||||
|
|
||||||
cityInfo.cityStats.update()
|
cityInfo.cityStats.update()
|
||||||
}
|
}
|
||||||
|
@ -319,7 +319,7 @@ class CityInfo {
|
|||||||
var foodPerTurn = 0f
|
var foodPerTurn = 0f
|
||||||
while (foodWeight < 3 && foodPerTurn <= 0) {
|
while (foodWeight < 3 && foodPerTurn <= 0) {
|
||||||
workedTiles = hashSetOf()
|
workedTiles = hashSetOf()
|
||||||
population.specialists.clear()
|
population.specialistAllocations.clear()
|
||||||
for (i in 0..population.population)
|
for (i in 0..population.population)
|
||||||
population.autoAssignPopulation(foodWeight)
|
population.autoAssignPopulation(foodWeight)
|
||||||
cityStats.update()
|
cityStats.update()
|
||||||
|
@ -18,12 +18,12 @@ class PopulationManager {
|
|||||||
var population = 1
|
var population = 1
|
||||||
var foodStored = 0
|
var foodStored = 0
|
||||||
|
|
||||||
// Being deprecated out
|
@Deprecated("As of 3.10.14, changed to Counter<String> to accomodate dynamic specialist types. Use specialistAllocations instead.")
|
||||||
val specialists = Stats()
|
val specialists = Stats()
|
||||||
// In favor of this bad boy
|
// In favor of this bad boy
|
||||||
val specialistAllocations = Counter<String>()
|
val specialistAllocations = Counter<String>()
|
||||||
|
|
||||||
fun getNewSpecialists() = convertStatsToSpecialistHashmap(specialists)
|
fun getNewSpecialists() = specialistAllocations //convertStatsToSpecialistHashmap(specialists)
|
||||||
|
|
||||||
fun convertStatsToSpecialistHashmap(stats: Stats):Counter<String> {
|
fun convertStatsToSpecialistHashmap(stats: Stats):Counter<String> {
|
||||||
val specialistHashmap = Counter<String>()
|
val specialistHashmap = Counter<String>()
|
||||||
@ -38,7 +38,7 @@ class PopulationManager {
|
|||||||
//region pure functions
|
//region pure functions
|
||||||
fun clone(): PopulationManager {
|
fun clone(): PopulationManager {
|
||||||
val toReturn = PopulationManager()
|
val toReturn = PopulationManager()
|
||||||
toReturn.specialists.add(specialists)
|
toReturn.specialistAllocations.add(specialistAllocations)
|
||||||
toReturn.population = population
|
toReturn.population = population
|
||||||
toReturn.foodStored = foodStored
|
toReturn.foodStored = foodStored
|
||||||
return toReturn
|
return toReturn
|
||||||
@ -105,15 +105,15 @@ class PopulationManager {
|
|||||||
val valueBestTile = if (bestTile == null) 0f
|
val valueBestTile = if (bestTile == null) 0f
|
||||||
else Automation.rankTileForCityWork(bestTile, cityInfo, foodWeight)
|
else Automation.rankTileForCityWork(bestTile, cityInfo, foodWeight)
|
||||||
|
|
||||||
//evaluate specialists
|
val bestJob: String? = getMaxSpecialistsNew()
|
||||||
val maxSpecialistsMap = getMaxSpecialists().toHashMap()
|
.filter { specialistAllocations[it.key]!!<it.value }
|
||||||
val bestJob: Stat? = specialists.toHashMap()
|
|
||||||
.filter { maxSpecialistsMap.containsKey(it.key) && it.value < maxSpecialistsMap[it.key]!! }
|
|
||||||
.map { it.key }
|
.map { it.key }
|
||||||
.maxBy { Automation.rankSpecialist(getStatsOfSpecialist(specialistNameByStat(it)), cityInfo) }
|
.maxBy { Automation.rankSpecialist(getStatsOfSpecialist(it), cityInfo) }
|
||||||
|
|
||||||
|
|
||||||
var valueBestSpecialist = 0f
|
var valueBestSpecialist = 0f
|
||||||
if (bestJob != null) {
|
if (bestJob != null) {
|
||||||
val specialistStats = getStatsOfSpecialist(specialistNameByStat(bestJob))
|
val specialistStats = getStatsOfSpecialist(bestJob)
|
||||||
valueBestSpecialist = Automation.rankSpecialist(specialistStats, cityInfo)
|
valueBestSpecialist = Automation.rankSpecialist(specialistStats, cityInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ class PopulationManager {
|
|||||||
if (valueBestTile > valueBestSpecialist) {
|
if (valueBestTile > valueBestSpecialist) {
|
||||||
if (bestTile != null)
|
if (bestTile != null)
|
||||||
cityInfo.workedTiles = cityInfo.workedTiles.withItem(bestTile.position)
|
cityInfo.workedTiles = cityInfo.workedTiles.withItem(bestTile.position)
|
||||||
} else if (bestJob != null) specialists.add(bestJob, 1f)
|
} else if (bestJob != null) specialistAllocations.add(bestJob, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unassignExtraPopulation() {
|
fun unassignExtraPopulation() {
|
||||||
@ -133,11 +133,13 @@ class PopulationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// unassign specialists that cannot be (e.g. the city was captured and one of the specialist buildings was destroyed)
|
// unassign specialists that cannot be (e.g. the city was captured and one of the specialist buildings was destroyed)
|
||||||
val maxSpecialists = getMaxSpecialists().toHashMap()
|
val maxSpecialists = getMaxSpecialistsNew()
|
||||||
val specialistsHashmap = specialists.toHashMap()
|
val specialistsHashmap = specialistAllocations
|
||||||
for (entry in maxSpecialists)
|
for ((specialistName, amount) in maxSpecialists)
|
||||||
if (specialistsHashmap[entry.key]!! > entry.value)
|
if (specialistsHashmap[specialistName]!! > amount)
|
||||||
specialists.add(entry.key, maxSpecialists[entry.key]!! - specialistsHashmap[entry.key]!!)
|
specialistAllocations[specialistName]=amount
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (getFreePopulation() < 0) {
|
while (getFreePopulation() < 0) {
|
||||||
//evaluate tiles
|
//evaluate tiles
|
||||||
@ -153,21 +155,20 @@ class PopulationManager {
|
|||||||
val valueWorstTile = if (worstWorkedTile == null) 0f
|
val valueWorstTile = if (worstWorkedTile == null) 0f
|
||||||
else Automation.rankTileForCityWork(worstWorkedTile, cityInfo)
|
else Automation.rankTileForCityWork(worstWorkedTile, cityInfo)
|
||||||
|
|
||||||
|
|
||||||
//evaluate specialists
|
//evaluate specialists
|
||||||
val worstJob: Stat? = specialists.toHashMap()
|
val worstJob: String? = specialistAllocations.keys
|
||||||
.filter { it.value > 0 }
|
.minBy { Automation.rankSpecialist(getStatsOfSpecialist(it), cityInfo) }
|
||||||
.map { it.key }
|
|
||||||
.minBy { Automation.rankSpecialist(getStatsOfSpecialist(specialistNameByStat(it)), cityInfo) }
|
|
||||||
var valueWorstSpecialist = 0f
|
var valueWorstSpecialist = 0f
|
||||||
if (worstJob != null)
|
if (worstJob != null)
|
||||||
valueWorstSpecialist = Automation.rankSpecialist(getStatsOfSpecialist(specialistNameByStat(worstJob)), cityInfo)
|
valueWorstSpecialist = Automation.rankSpecialist(getStatsOfSpecialist(worstJob), cityInfo)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//un-assign population
|
//un-assign population
|
||||||
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 specialists.add(worstJob, -1f)
|
} else specialistAllocations.add(worstJob, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ class SpecialistAllocationTable(val cityScreen: CityScreen): Table(CameraStageBa
|
|||||||
.apply { this.setAlignment(Align.center) }
|
.apply { this.setAlignment(Align.center) }
|
||||||
.surroundWithCircle(30f).apply { circle.color= Color.GREEN.cpy().lerp(Color.BLACK,0.2f) }
|
.surroundWithCircle(30f).apply { circle.color= Color.GREEN.cpy().lerp(Color.BLACK,0.2f) }
|
||||||
assignButton.onClick {
|
assignButton.onClick {
|
||||||
cityInfo.population.specialists.add(stat, 1f)
|
cityInfo.population.specialistAllocations.add(cityInfo.population.specialistNameByStat(stat), 1)
|
||||||
cityInfo.cityStats.update()
|
cityInfo.cityStats.update()
|
||||||
cityScreen.update()
|
cityScreen.update()
|
||||||
}
|
}
|
||||||
@ -68,7 +68,7 @@ class SpecialistAllocationTable(val cityScreen: CityScreen): Table(CameraStageBa
|
|||||||
.apply { this.setAlignment(Align.center) }
|
.apply { this.setAlignment(Align.center) }
|
||||||
.surroundWithCircle(30f).apply { circle.color= Color.RED.cpy().lerp(Color.BLACK,0.1f) }
|
.surroundWithCircle(30f).apply { circle.color= Color.RED.cpy().lerp(Color.BLACK,0.1f) }
|
||||||
unassignButton.onClick {
|
unassignButton.onClick {
|
||||||
cityInfo.population.specialists.add(stat, -1f)
|
cityInfo.population.specialistAllocations.add(cityInfo.population.specialistNameByStat(stat), -1)
|
||||||
cityInfo.cityStats.update()
|
cityInfo.cityStats.update()
|
||||||
cityScreen.update()
|
cityScreen.update()
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user