Resolves #12307 - Unit icon falls back to UnitTypeIcons/<unitType> successfully

This commit is contained in:
yairm210 2024-10-20 22:48:42 +03:00
parent 9497c17b8d
commit e0864bebf0
9 changed files with 18 additions and 27 deletions

View File

@ -57,7 +57,7 @@ class Notification() : IsPartOfGameInfoSerialization, Json.Serializable {
companion object { companion object {
fun safeValueOf(name: String): NotificationCategory? = fun safeValueOf(name: String): NotificationCategory? =
values().firstOrNull { it.name == name } entries.firstOrNull { it.name == name }
} }
} }
@ -74,7 +74,7 @@ class Notification() : IsPartOfGameInfoSerialization, Json.Serializable {
ruleset.nations.containsKey(icon) -> ruleset.nations.containsKey(icon) ->
ImageGetter.getNationPortrait(ruleset.nations[icon]!!, iconSize) ImageGetter.getNationPortrait(ruleset.nations[icon]!!, iconSize)
ruleset.units.containsKey(icon) -> ruleset.units.containsKey(icon) ->
ImageGetter.getUnitIcon(icon) ImageGetter.getUnitIcon(ruleset.units[icon]!!)
else -> else ->
ImageGetter.getImage(icon) ImageGetter.getImage(icon)
} }

View File

@ -81,7 +81,7 @@ private class FlagBackground(drawable: TextureRegionDrawable, size: Float) : Ima
class UnitIconGroup(val unit: MapUnit, val size: Float) : Group() { class UnitIconGroup(val unit: MapUnit, val size: Float) : Group() {
var actionGroup: Group? = null var actionGroup: Group? = null
private val flagIcon = ImageGetter.getUnitIcon(unit.name, unit.civ.nation.getInnerColor()) private val flagIcon = ImageGetter.getUnitIcon(unit.baseUnit, unit.civ.nation.getInnerColor())
private var flagBg: FlagBackground = FlagBackground(getBackgroundDrawableForUnit(), size) private var flagBg: FlagBackground = FlagBackground(getBackgroundDrawableForUnit(), size)
private var flagSelection: Image = getBackgroundSelectionForUnit() private var flagSelection: Image = getBackgroundSelectionForUnit()
private var flagMask: Image? = getBackgroundMaskForUnit() private var flagMask: Image? = getBackgroundMaskForUnit()

View File

@ -22,6 +22,7 @@ import com.unciv.json.json
import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.models.ruleset.PerpetualConstruction
import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.nation.Nation import com.unciv.models.ruleset.nation.Nation
import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.skins.SkinCache import com.unciv.models.skins.SkinCache
import com.unciv.models.tilesets.TileSetCache import com.unciv.models.tilesets.TileSetCache
import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.center
@ -249,10 +250,10 @@ object ImageGetter {
fun getRandomNationPortrait(size: Float): Portrait = PortraitNation(Constants.random, size) fun getRandomNationPortrait(size: Float): Portrait = PortraitNation(Constants.random, size)
fun getUnitIcon(unitName: String, color: Color = Color.BLACK): Image = fun getUnitIcon(unit: BaseUnit, color: Color = Color.BLACK): Image =
if (imageExists("UnitIcons/$unitName")) if (imageExists("UnitIcons/${unit.name}"))
getImage("UnitIcons/$unitName").apply { this.color = color } getImage("UnitIcons/${unit.name}").apply { this.color = color }
else getImage("UnitTypeIcons/$unitName").apply { this.color = color } else getImage("UnitTypeIcons/${unit.type}").apply { this.color = color }
fun getConstructionPortrait(construction: String, size: Float): Group { fun getConstructionPortrait(construction: String, size: Float): Group {
if (ruleset.buildings.containsKey(construction)) { if (ruleset.buildings.containsKey(construction)) {

View File

@ -7,25 +7,14 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.Align
import com.unciv.Constants import com.unciv.Constants
import com.unciv.UncivGame import com.unciv.logic.city.*
import com.unciv.logic.city.City
import com.unciv.logic.city.CityFlags
import com.unciv.logic.city.CityFocus
import com.unciv.logic.city.CityResources
import com.unciv.logic.city.GreatPersonPointsBreakdown
import com.unciv.models.Counter import com.unciv.models.Counter
import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.Building
import com.unciv.models.ruleset.tile.TileResource import com.unciv.models.ruleset.tile.TileResource
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.stats.Stat import com.unciv.models.stats.Stat
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.*
import com.unciv.ui.components.extensions.center
import com.unciv.ui.components.extensions.colorFromRGB
import com.unciv.ui.components.extensions.surroundWithCircle
import com.unciv.ui.components.extensions.toGroup
import com.unciv.ui.components.extensions.toLabel
import com.unciv.ui.components.extensions.toTextButton
import com.unciv.ui.components.fonts.Fonts import com.unciv.ui.components.fonts.Fonts
import com.unciv.ui.components.input.KeyboardBinding import com.unciv.ui.components.input.KeyboardBinding
import com.unciv.ui.components.input.onActivation import com.unciv.ui.components.input.onActivation
@ -33,7 +22,6 @@ import com.unciv.ui.components.input.onClick
import com.unciv.ui.components.widgets.ExpanderTab import com.unciv.ui.components.widgets.ExpanderTab
import com.unciv.ui.images.ImageGetter import com.unciv.ui.images.ImageGetter
import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.basescreen.BaseScreen
import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.round import kotlin.math.round
import com.unciv.ui.components.widgets.AutoScrollPane as ScrollPane import com.unciv.ui.components.widgets.AutoScrollPane as ScrollPane
@ -364,7 +352,8 @@ class CityStatsTable(private val cityScreen: CityScreen) : Table() {
val info = Table() val info = Table()
info.add(ImageGetter.getUnitIcon(greatPersonName, Color.GOLD).toGroup(20f)) val greatPerson = city.getRuleset().units[greatPersonName] ?: continue
info.add(ImageGetter.getUnitIcon(greatPerson, Color.GOLD).toGroup(20f))
.left().padBottom(4f).padRight(5f) .left().padBottom(4f).padRight(5f)
info.add("{$greatPersonName} (+$gppPerTurn)".toLabel(hideIcons = true)).left().padBottom(4f).expandX().row() info.add("{$greatPersonName} (+$gppPerTurn)".toLabel(hideIcons = true)).left().padBottom(4f).expandX().row()

View File

@ -137,7 +137,8 @@ class SpecialistAllocationTable(private val cityScreen: CityScreen) : Table(Base
// greatPersonPoints is a Counter so iteration order is potentially random: // greatPersonPoints is a Counter so iteration order is potentially random:
// Sort by unit name without collator to ensure consistency in those rare mods where one Specialist gives points to several GP counters // Sort by unit name without collator to ensure consistency in those rare mods where one Specialist gives points to several GP counters
for ((gpName, gpPoints) in specialist.greatPersonPoints.asSequence().sortedBy { it.key }) { for ((gpName, gpPoints) in specialist.greatPersonPoints.asSequence().sortedBy { it.key }) {
addWrapping(gpPoints, Color.GOLD, ImageGetter.getUnitIcon(gpName, Color.GOLD)) val greatPerson = city.getRuleset().units[gpName] ?: continue
addWrapping(gpPoints, Color.GOLD, ImageGetter.getUnitIcon(greatPerson, Color.GOLD))
} }
// This uses Stats.iterator() which ensures consistent Stat order and returns no zero value // This uses Stats.iterator() which ensures consistent Stat order and returns no zero value

View File

@ -38,7 +38,7 @@ enum class CityOverviewTabColumn : ISortableGridContentProvider<City, EmpireOver
override val defaultSort get() = SortableGrid.SortDirection.Ascending override val defaultSort get() = SortableGrid.SortDirection.Ascending
override fun getComparator() = compareBy<City, String>(collator) { it.name.tr(hideIcons = true) } override fun getComparator() = compareBy<City, String>(collator) { it.name.tr(hideIcons = true) }
override fun getHeaderActor(iconSize: Float) = override fun getHeaderActor(iconSize: Float) =
ImageGetter.getUnitIcon("Settler") ImageGetter.getImage("UnitIcons/Settler").apply { color = Color.BLACK }
.surroundWithCircle(iconSize) .surroundWithCircle(iconSize)
override fun getEntryValue(item: City) = 0 // make sure that `stat!!` in the super isn't used override fun getEntryValue(item: City) = 0 // make sure that `stat!!` in the super isn't used
override fun getEntryActor(item: City, iconSize: Float, actionContext: EmpireOverviewScreen) = override fun getEntryActor(item: City, iconSize: Float, actionContext: EmpireOverviewScreen) =

View File

@ -73,7 +73,7 @@ open class UnitOverviewTabHelpers {
val enable = canEnable && unitAction.action != null val enable = canEnable && unitAction.action != null
val unitToUpgradeTo = (unitAction as UpgradeUnitAction).unitToUpgradeTo val unitToUpgradeTo = (unitAction as UpgradeUnitAction).unitToUpgradeTo
val selectKey = getUnitIdentifier(unit, unitToUpgradeTo) val selectKey = getUnitIdentifier(unit, unitToUpgradeTo)
val upgradeIcon = ImageGetter.getUnitIcon(unitToUpgradeTo.name, val upgradeIcon = ImageGetter.getUnitIcon(unitToUpgradeTo,
if (enable) Color.GREEN else Color.GREEN.darken(0.5f)) if (enable) Color.GREEN else Color.GREEN.darken(0.5f))
upgradeIcon.onClick { upgradeIcon.onClick {
UnitUpgradeMenu(actionContext.overviewScreen.stage, upgradeIcon, unit, unitAction, enable) { UnitUpgradeMenu(actionContext.overviewScreen.stage, upgradeIcon, unit, unitAction, enable) {

View File

@ -24,7 +24,7 @@ class GreatPersonPickerScreen(val worldScreen: WorldScreen, val civInfo: Civiliz
for (unit in greatPersonUnits) { for (unit in greatPersonUnits) {
val button = val button =
PickerPane.getPickerOptionButton(ImageGetter.getUnitIcon(unit.name), unit.name) PickerPane.getPickerOptionButton(ImageGetter.getUnitIcon(unit), unit.name)
button.pack() button.pack()
button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool
if (button.isEnabled) { if (button.isEnabled) {

View File

@ -12,7 +12,7 @@ class UnitRenamePopup(val screen: BaseScreen, val unit: MapUnit, val actionOnClo
AskTextPopup( AskTextPopup(
screen, screen,
label = "Choose name for [${unit.baseUnit.name}]", label = "Choose name for [${unit.baseUnit.name}]",
icon = ImageGetter.getUnitIcon(unit.name).surroundWithCircle(80f), icon = ImageGetter.getUnitIcon(unit.baseUnit).surroundWithCircle(80f),
defaultText = unit.instanceName ?: unit.baseUnit.name.tr(hideIcons = true), defaultText = unit.instanceName ?: unit.baseUnit.name.tr(hideIcons = true),
validate = { it != unit.name }, validate = { it != unit.name },
actionOnOk = { userInput -> actionOnOk = { userInput ->