diff --git a/android/Images.Construction/OtherIcons/ConvertGold.png b/android/Images.Construction/OtherIcons/ConvertGold.png new file mode 100644 index 0000000000..6ae159ff33 Binary files /dev/null and b/android/Images.Construction/OtherIcons/ConvertGold.png differ diff --git a/android/Images.Construction/OtherIcons/ConvertNothing.png b/android/Images.Construction/OtherIcons/ConvertNothing.png new file mode 100644 index 0000000000..e87cc3b4e6 Binary files /dev/null and b/android/Images.Construction/OtherIcons/ConvertNothing.png differ diff --git a/android/Images.Construction/OtherIcons/ConvertScience.png b/android/Images.Construction/OtherIcons/ConvertScience.png new file mode 100644 index 0000000000..ccfb3f80ab Binary files /dev/null and b/android/Images.Construction/OtherIcons/ConvertScience.png differ diff --git a/android/Images/ImprovementIcons/Remove Fallout.png b/android/Images/ImprovementIcons/Remove Fallout.png new file mode 100644 index 0000000000..8987c1b4d3 Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Fallout.png differ diff --git a/android/Images/ImprovementIcons/Remove Forest.png b/android/Images/ImprovementIcons/Remove Forest.png new file mode 100644 index 0000000000..dcf07cdc8c Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Forest.png differ diff --git a/android/Images/ImprovementIcons/Remove Jungle.png b/android/Images/ImprovementIcons/Remove Jungle.png new file mode 100644 index 0000000000..aa1b347e94 Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Jungle.png differ diff --git a/android/Images/ImprovementIcons/Remove Marsh.png b/android/Images/ImprovementIcons/Remove Marsh.png new file mode 100644 index 0000000000..46500cf469 Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Marsh.png differ diff --git a/android/Images/ImprovementIcons/Remove Railroad.png b/android/Images/ImprovementIcons/Remove Railroad.png new file mode 100644 index 0000000000..cfa0f69d33 Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Railroad.png differ diff --git a/android/Images/ImprovementIcons/Remove Road.png b/android/Images/ImprovementIcons/Remove Road.png new file mode 100644 index 0000000000..2cc35b4692 Binary files /dev/null and b/android/Images/ImprovementIcons/Remove Road.png differ diff --git a/android/Images/OtherIcons/Unique.png b/android/Images/OtherIcons/Unique.png new file mode 100644 index 0000000000..8a5df70b64 Binary files /dev/null and b/android/Images/OtherIcons/Unique.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 320ffa8ad4..e6663ec49e 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -263,6 +263,48 @@ ImprovementIcons/Railroad orig: 100, 100 offset: 0, 0 index: -1 +ImprovementIcons/Remove Fallout + rotate: false + xy: 250, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Forest + rotate: false + xy: 350, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Jungle + rotate: false + xy: 350, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Marsh + rotate: false + xy: 450, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Railroad + rotate: false + xy: 550, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Road + rotate: false + xy: 650, 0 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 ImprovementIcons/Repair rotate: false xy: 1270, 1720 @@ -361,6 +403,13 @@ StatIcons/Science orig: 100, 100 offset: 0, 0 index: -1 +OtherIcons/ConvertScience + rotate: false + xy: 622, 886 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 OtherIcons/AirSweep rotate: false xy: 4, 369 @@ -543,6 +592,13 @@ OtherIcons/Improvements orig: 50, 50 offset: 0, 0 index: -1 +OtherIcons/Unique + rotate: false + xy: 1921, 1655 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 OtherIcons/Link rotate: false xy: 1004, 906 @@ -1194,6 +1250,20 @@ StatIcons/Gold orig: 100, 100 offset: 0, 0 index: -1 +OtherIcons/ConvertGold + rotate: false + xy: 298, 1426 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/ConvertNothing + rotate: false + xy: 1923, 1545 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 StatIcons/Happiness rotate: false xy: 514, 1642 diff --git a/android/assets/game.png b/android/assets/game.png index ff6396dcbb..0c7aa209c8 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/core/src/com/unciv/ui/images/ImageGetter.kt b/core/src/com/unciv/ui/images/ImageGetter.kt index 433d6d904c..8668fa4348 100644 --- a/core/src/com/unciv/ui/images/ImageGetter.kt +++ b/core/src/com/unciv/ui/images/ImageGetter.kt @@ -18,6 +18,7 @@ import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.UncivGame import com.unciv.json.json +import com.unciv.logic.city.PerpetualConstruction import com.unciv.models.ruleset.Nation import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.tile.ResourceType @@ -238,17 +239,19 @@ object ImageGetter { } - fun getImprovementIcon(improvementName: String, size: Float = 20f): Group { - if (improvementName.startsWith(Constants.remove) || improvementName == Constants.cancelImprovementOrder) + fun getImprovementIcon(improvementName: String, size: Float = 20f, withCircle: Boolean = true): Group { + if (improvementName == Constants.cancelImprovementOrder) return getImage("OtherIcons/Stop").surroundWithCircle(size) - val iconGroup = getImage("ImprovementIcons/$improvementName").surroundWithCircle(size) + val icon = getImage("ImprovementIcons/$improvementName") + if (!withCircle) return icon.toGroup(size) + + val group = icon.surroundWithCircle(size) val improvement = ruleset.tileImprovements[improvementName] if (improvement != null) - iconGroup.circle.color = getColorFromStats(improvement) - - return iconGroup.surroundWithThinCircle() + group.circle.color = getColorFromStats(improvement) + return group.surroundWithThinCircle() } fun getPortraitImage(construction: String, size: Float): Group { @@ -269,8 +272,8 @@ object ImageGetter { } else getUnitIcon(construction).surroundWithCircle(size).surroundWithThinCircle() } - if (construction == "Nothing") - return getImage("OtherIcons/Sleep").surroundWithCircle(size).surroundWithThinCircle() + if (construction in PerpetualConstruction.perpetualConstructionsMap) + return getImage("OtherIcons/Convert$construction").toGroup(size) return getStatIcon(construction).surroundWithCircle(size).surroundWithThinCircle() } diff --git a/core/src/com/unciv/ui/pickerscreens/TechButton.kt b/core/src/com/unciv/ui/pickerscreens/TechButton.kt index dc490d7da0..7c2a565622 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechButton.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechButton.kt @@ -1,35 +1,57 @@ package com.unciv.ui.pickerscreens import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.Touchable +import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align import com.unciv.logic.civilization.TechManager import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileResource +import com.unciv.models.ruleset.unique.UniqueType import com.unciv.ui.images.IconCircleGroup import com.unciv.ui.images.ImageGetter import com.unciv.ui.utils.BaseScreen import com.unciv.ui.utils.extensions.addBorder import com.unciv.ui.utils.extensions.brighten import com.unciv.ui.utils.extensions.center +import com.unciv.ui.utils.extensions.centerY import com.unciv.ui.utils.extensions.darken +import com.unciv.ui.utils.extensions.setFontSize +import com.unciv.ui.utils.extensions.setSize import com.unciv.ui.utils.extensions.surroundWithCircle import com.unciv.ui.utils.extensions.surroundWithThinCircle +import com.unciv.ui.utils.extensions.toGroup import com.unciv.ui.utils.extensions.toLabel class TechButton(techName:String, private val techManager: TechManager, isWorldScreen: Boolean = true) : Table(BaseScreen.skin) { - val text = "".toLabel().apply { setAlignment(Align.center) } + val text = "".toLabel().apply { + wrap = false + setFontSize(14) + setAlignment(Align.left) + setEllipsis(true) + } + val turns = "".toLabel().apply { + setFontSize(14) + setAlignment(Align.right) + } var orderIndicator: IconCircleGroup? = null + var bg = Image(BaseScreen.skinStrings.getUiBackground("TechPickerScreen/TechButton", BaseScreen.skinStrings.roundedEdgeRectangleShape)) init { touchable = Touchable.enabled - background = BaseScreen.skinStrings.getUiBackground("TechPickerScreen/TechButton", BaseScreen.skinStrings.roundedEdgeRectangleShape) - pad(10f) + background = BaseScreen.skinStrings.getUiBackground("TechPickerScreen/TechButton", BaseScreen.skinStrings.roundedEdgeRectangleShape, + tintColor = Color.WHITE.darken(0.3f)) + + bg.toBack() + addActor(bg) + + pad(0f).padBottom(5f).padTop(5f).padLeft(5f).padRight(5f) if (ImageGetter.techIconExists(techName)) - add(ImageGetter.getTechIconGroup(techName, 60f)).left() + add(ImageGetter.getTechIconGroup(techName, 45f)).padRight(5f).left() val rightSide = Table() @@ -45,18 +67,37 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS .addColor(Color.BLUE.brighten(0.3f), percentWillBeComplete) .addColor(Color.BLUE.darken(0.5f), percentComplete) add(progressBar.addBorder(1f, Color.GRAY)).pad(10f) - rightSide.add(text).padBottom(5f).row() - } else rightSide.add(text).height(25f).padBottom(5f).row() + } + rightSide.add(text).width(145f).top().left().padRight(15f) + rightSide.add(turns).width(40f).top().right().padRight(10f).row() addTechEnabledIcons(techName, isWorldScreen, rightSide) - add(rightSide) + rightSide.centerY(this) + add(rightSide).expandX().left() + pack() + + bg.setSize(width-3f, height-3f) + bg.align = Align.center + bg.center(this) + + pack() + } + + fun setButtonColor(color: Color) { + bg.color = color pack() } private fun addTechEnabledIcons(techName: String, isWorldScreen: Boolean, rightSide: Table) { - val techEnabledIcons = Table() - techEnabledIcons.defaults().pad(5f) + val techEnabledIcons = Table().align(Align.left) + techEnabledIcons.background = BaseScreen.skinStrings.getUiBackground( + "TechPickerScreen/TechButtonIconsOutline", + BaseScreen.skinStrings.rectangleWithOutlineShape, + tintColor = Color.BLACK.cpy().apply { a = 0.7f } + ) + techEnabledIcons.pad(0f).padLeft(10f).padTop(2f).padBottom(2f) + techEnabledIcons.defaults().padRight(5f) val techIconSize = 30f val civName = techManager.civInfo.civName @@ -64,11 +105,15 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS val tech = ruleset.technologies[techName]!! - for (unit in tech.getEnabledUnits(ruleset, techManager.civInfo)) - techEnabledIcons.add(ImageGetter.getPortraitImage(unit.name, techIconSize)) + val icons = ArrayList() - for (building in tech.getEnabledBuildings(ruleset, techManager.civInfo)) - techEnabledIcons.add(ImageGetter.getPortraitImage(building.name, techIconSize)) + for (unit in tech.getEnabledUnits(ruleset, techManager.civInfo)) { + icons.add(ImageGetter.getPortraitImage(unit.name, techIconSize)) + } + + for (building in tech.getEnabledBuildings(ruleset, techManager.civInfo)) { + icons.add(ImageGetter.getPortraitImage(building.name, techIconSize)) + } for (obj in tech.getObsoletedObjects(ruleset, techManager.civInfo)) { val obsoletedIcon = when (obj) { @@ -81,34 +126,56 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS closeImage.center(it) it.addActor(closeImage) } - techEnabledIcons.add(obsoletedIcon) + icons.add(obsoletedIcon) } + for (resource in ruleset.tileResources.values.filter { it.revealedBy == techName }) { + icons.add(ImageGetter.getResourceImage(resource.name, techIconSize)) + } for (improvement in ruleset.tileImprovements.values.asSequence() - .filter { - it.techRequired == techName - || it.uniqueObjects.any { u -> u.allParams.contains(techName) } - } + .filter { it.techRequired == techName } .filter { it.uniqueTo == null || it.uniqueTo == civName } ) { - techEnabledIcons.add(ImageGetter.getImprovementIcon(improvement.name, techIconSize)) + icons.add(ImageGetter.getImprovementIcon(improvement.name, techIconSize, true)) } - - for (resource in ruleset.tileResources.values.filter { it.revealedBy == techName }) - techEnabledIcons.add(ImageGetter.getResourceImage(resource.name, techIconSize)) - - for (unique in tech.uniques) - techEnabledIcons.add( - ImageGetter.getImage("OtherIcons/Star") - .apply { color = Color.BLACK } + for (improvement in ruleset.tileImprovements.values.asSequence() + .filter { it.uniqueObjects.any { u -> u.allParams.contains(techName) } } + .filter { it.uniqueTo == null || it.uniqueTo == civName } + ) { + icons.add( + ImageGetter.getImage("OtherIcons/Unique") .surroundWithCircle(techIconSize) .surroundWithThinCircle()) + } - if (isWorldScreen) rightSide.add(techEnabledIcons) - else rightSide.add(techEnabledIcons) - .minWidth(225f) + for (unique in tech.uniques) { + icons.add( + when (unique) { + UniqueType.EnablesCivWideStatProduction.text.replace("civWideStat", "Gold" ) + -> ImageGetter.getImage("OtherIcons/ConvertGold").toGroup(techIconSize) + UniqueType.EnablesCivWideStatProduction.text.replace("civWideStat", "Science" ) + -> ImageGetter.getImage("OtherIcons/ConvertScience").toGroup(techIconSize) + else -> ImageGetter.getImage("OtherIcons/Unique") + .surroundWithCircle(techIconSize) + .surroundWithThinCircle() + } + ) + } + + for (i in 0..4) { + val icon = icons.getOrNull(i) + if (icon != null) + techEnabledIcons.add(icon) + } + + rightSide.add(techEnabledIcons) + .colspan(2) + .minWidth(195f) + .prefWidth(195f) + .maxWidth(195f) + .expandX().left().row() } fun addOrderIndicator(number:Int){ @@ -119,4 +186,5 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS orderIndicator!!.setPosition(0f, height, Align.topLeft) addActor(orderIndicator) } + } diff --git a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt index 9551467f45..0434feab6b 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt @@ -3,7 +3,9 @@ package com.unciv.ui.pickerscreens import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Table +import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.UncivGame import com.unciv.logic.civilization.CivilizationInfo @@ -16,14 +18,17 @@ import com.unciv.ui.civilopedia.CivilopediaCategories import com.unciv.ui.civilopedia.CivilopediaScreen import com.unciv.ui.images.ImageGetter import com.unciv.ui.popup.ToastPopup +import com.unciv.ui.utils.BaseScreen import com.unciv.ui.utils.Fonts import com.unciv.ui.utils.extensions.addBorder +import com.unciv.ui.utils.extensions.brighten import com.unciv.ui.utils.extensions.colorFromRGB import com.unciv.ui.utils.extensions.darken import com.unciv.ui.utils.extensions.disable import com.unciv.ui.utils.extensions.onClick import com.unciv.ui.utils.extensions.toLabel import com.unciv.utils.concurrency.Concurrency +import kotlin.math.abs class TechPickerScreen( @@ -37,6 +42,7 @@ class TechPickerScreen( private var civTech: TechManager = civInfo.tech private var tempTechsToResearch: ArrayList private var lines = ArrayList() + private var eraLabels = ArrayList