diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index e54a508b2b..de46164f58 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -14,6 +14,7 @@ import com.unciv.models.metadata.GameParameters import com.unciv.models.ruleset.Difficulty import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache +import com.unciv.models.ruleset.Specialist import java.util.* import kotlin.collections.ArrayList @@ -382,7 +383,7 @@ class GameInfo { // As of 3.10.14, specialists are saved by name not by stat for((key, value) in cityInfo.population.specialists.toHashMap().filter { it.value>0 }) cityInfo.population.specialistAllocations.add( - cityInfo.population.specialistNameByStat(key), value.toInt()) + Specialist.specialistNameByStat(key), value.toInt()) cityInfo.population.specialists.clear() cityInfo.cityStats.update() diff --git a/core/src/com/unciv/logic/city/PopulationManager.kt b/core/src/com/unciv/logic/city/PopulationManager.kt index 8e7614aa56..a0290243ea 100644 --- a/core/src/com/unciv/logic/city/PopulationManager.kt +++ b/core/src/com/unciv/logic/city/PopulationManager.kt @@ -4,7 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.unciv.logic.automation.Automation import com.unciv.logic.map.TileInfo import com.unciv.models.Counter -import com.unciv.models.stats.Stat +import com.unciv.models.ruleset.Specialist import com.unciv.models.stats.Stats import com.unciv.ui.utils.withItem import com.unciv.ui.utils.withoutItem @@ -25,15 +25,6 @@ class PopulationManager { fun getNewSpecialists() = specialistAllocations //convertStatsToSpecialistHashmap(specialists) - fun convertStatsToSpecialistHashmap(stats: Stats):Counter { - val specialistHashmap = Counter() - for ((stat, amount) in stats.toHashMap()) { - if (amount == 0f) continue - val specialistName = specialistNameByStat(stat) - specialistHashmap[specialistName] = amount.toInt() - } - return specialistHashmap - } //region pure functions fun clone(): PopulationManager { @@ -83,13 +74,6 @@ class PopulationManager { 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! // if small city, favor production above all, ignore gold! @@ -173,13 +157,11 @@ class PopulationManager { } - fun getMaxSpecialists(): Stats { - val maximumSpecialists = Stats() - for (building in cityInfo.cityConstructions.getBuiltBuildings().filter { it.specialistSlots!=null }) - maximumSpecialists.add(building.specialistSlots!!) - return maximumSpecialists + fun getMaxSpecialistsNew(): Counter { + val counter = Counter() + for (building in cityInfo.cityConstructions.getBuiltBuildings()) + counter.add(building.newSpecialists()) + return counter } - fun getMaxSpecialistsNew() = convertStatsToSpecialistHashmap(getMaxSpecialists()) - } \ No newline at end of file diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 5c9b58a8d4..66671d8468 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -4,6 +4,7 @@ import com.unciv.Constants import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.IConstruction import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.models.Counter import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stat import com.unciv.models.stats.Stats @@ -19,6 +20,10 @@ class Building : NamedStats(), IConstruction { var maintenance = 0 private var percentStatBonus: Stats? = null var specialistSlots: Stats? = null + fun newSpecialists(): Counter { + if(specialistSlots==null) return Counter() + return Specialist.convertStatsToSpecialistHashmap(specialistSlots!!) + } var greatPersonPoints: Stats? = null /** Extra cost percentage when purchasing */ private var hurryCostModifier = 0 diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 2ec9ce906c..091dc9f6ce 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.files.FileHandle import com.unciv.JsonParser import com.unciv.logic.UncivShowableException +import com.unciv.models.Counter import com.unciv.models.metadata.BaseRuleset import com.unciv.models.metadata.GameParameters import com.unciv.models.ruleset.tech.TechColumn @@ -15,6 +16,7 @@ import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.ruleset.unit.Promotion import com.unciv.models.stats.INamed import com.unciv.models.stats.NamedStats +import com.unciv.models.stats.Stat import com.unciv.models.stats.Stats import com.unciv.ui.utils.colorFromRGB import kotlin.collections.set @@ -318,4 +320,26 @@ class Specialist: NamedStats() { var color = ArrayList() val colorObject by lazy { colorFromRGB(color) } var greatPersonPoints= Stats() + + companion object { + + fun convertStatsToSpecialistHashmap(stats: Stats): Counter { + val specialistHashmap = Counter() + for ((stat, amount) in stats.toHashMap()) { + if (amount == 0f) continue + val specialistName = specialistNameByStat(stat) + specialistHashmap[specialistName] = amount.toInt() + } + return specialistHashmap + } + + + internal fun specialistNameByStat(stat: Stat) = when (stat) { + Stat.Production -> "Engineer" + Stat.Gold -> "Merchant" + Stat.Science -> "Scientist" + Stat.Culture -> "Artist" + else -> TODO() + } + } } \ No newline at end of file diff --git a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt index a2f35ec8d7..fe3ab20bf4 100644 --- a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt @@ -8,6 +8,7 @@ import com.unciv.UncivGame import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.GreatPersonManager import com.unciv.models.ruleset.Building +import com.unciv.models.ruleset.Specialist import com.unciv.models.stats.Stat import com.unciv.models.translations.tr import com.unciv.ui.utils.* @@ -152,7 +153,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS specialistIcons.row().size(20f).pad(5f) for (stat in building.specialistSlots!!.toHashMap()) { if (stat.value == 0f) continue - val specialist = cityInfo.getRuleset().specialists[cityInfo.population.specialistNameByStat(stat.key)] + val specialist = cityInfo.getRuleset().specialists[Specialist.specialistNameByStat(stat.key)] if (specialist == null) continue // probably a mod that doesn't have the specialist defined yet for (i in 0 until stat.value.toInt()) specialistIcons.add(ImageGetter.getSpecialistIcon(specialist.colorObject)).size(20f) diff --git a/core/src/com/unciv/ui/cityscreen/SpecialistAllocationTable.kt b/core/src/com/unciv/ui/cityscreen/SpecialistAllocationTable.kt index 612f87d6e7..8b8454e16c 100644 --- a/core/src/com/unciv/ui/cityscreen/SpecialistAllocationTable.kt +++ b/core/src/com/unciv/ui/cityscreen/SpecialistAllocationTable.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align import com.unciv.UncivGame +import com.unciv.models.ruleset.Specialist import com.unciv.models.stats.Stat import com.unciv.ui.utils.* @@ -14,19 +15,14 @@ class SpecialistAllocationTable(val cityScreen: CityScreen): Table(CameraStageBa fun update() { clear() - for (statToMaximumSpecialist in cityInfo.population.getMaxSpecialists().toHashMap()) { - if (statToMaximumSpecialist.value == 0f) continue - - val stat = statToMaximumSpecialist.key - - val specialistName = cityInfo.population.specialistNameByStat(stat) + for ((specialistName, amount) in cityInfo.population.getMaxSpecialistsNew()) { val newSpecialists = cityInfo.population.getNewSpecialists() val assignedSpecialists = newSpecialists[specialistName]!! val maxSpecialists = cityInfo.population.getMaxSpecialistsNew()[specialistName]!! - if (cityScreen.canChangeState) add(getUnassignButton(assignedSpecialists, stat)) + if (cityScreen.canChangeState) add(getUnassignButton(assignedSpecialists, specialistName)) add(getAllocationTable(assignedSpecialists, maxSpecialists, specialistName)).pad(10f) - if (cityScreen.canChangeState) add(getAssignButton(assignedSpecialists, maxSpecialists, stat)) + if (cityScreen.canChangeState) add(getAssignButton(assignedSpecialists, maxSpecialists, specialistName)) addSeparatorVertical().pad(10f) add(getSpecialistStatsTable(specialistName)).row() } @@ -47,14 +43,14 @@ class SpecialistAllocationTable(val cityScreen: CityScreen): Table(CameraStageBa return specialistIconTable } - private fun getAssignButton(assignedSpecialists: Int, maxSpecialists: Int, stat: Stat):Actor { + private fun getAssignButton(assignedSpecialists: Int, maxSpecialists: Int, specialistName: String):Actor { if (assignedSpecialists >= maxSpecialists || cityInfo.isPuppet) return Table() val assignButton = "+".toLabel(Color.BLACK,24) .apply { this.setAlignment(Align.center) } .surroundWithCircle(30f).apply { circle.color= Color.GREEN.cpy().lerp(Color.BLACK,0.2f) } assignButton.onClick { - cityInfo.population.specialistAllocations.add(cityInfo.population.specialistNameByStat(stat), 1) + cityInfo.population.specialistAllocations.add(specialistName, 1) cityInfo.cityStats.update() cityScreen.update() } @@ -63,12 +59,12 @@ class SpecialistAllocationTable(val cityScreen: CityScreen): Table(CameraStageBa return assignButton } - private fun getUnassignButton(assignedSpecialists: Int, stat: Stat):Actor { + private fun getUnassignButton(assignedSpecialists: Int, specialistName: String):Actor { val unassignButton = "-".toLabel(Color.BLACK,24) .apply { this.setAlignment(Align.center) } .surroundWithCircle(30f).apply { circle.color= Color.RED.cpy().lerp(Color.BLACK,0.1f) } unassignButton.onClick { - cityInfo.population.specialistAllocations.add(cityInfo.population.specialistNameByStat(stat), -1) + cityInfo.population.specialistAllocations.add(specialistName, -1) cityInfo.cityStats.update() cityScreen.update() }