mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-14 01:39:40 +07:00
[663] Allow unit rename on promote (#3620)
* Add nullable "instanceName" field to MapUnit to capture name for individual units * Add "displayName" property to MapUnit which takes instanceName if set, name otherwise * Add dialog to PromotionPicker to allow setting instanceName of unit, if not already set
This commit is contained in:
@ -902,6 +902,7 @@ Bonus when performing air sweep [bonusAmount]% =
|
|||||||
Dogfighting I =
|
Dogfighting I =
|
||||||
Dogfighting II =
|
Dogfighting II =
|
||||||
Dogfighting III =
|
Dogfighting III =
|
||||||
|
Choose name for [unitName] =
|
||||||
|
|
||||||
# Multiplayer Turn Checker Service
|
# Multiplayer Turn Checker Service
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ object UnitAutomation {
|
|||||||
if (tryGoToRuinAndEncampment(unit) && unit.currentMovement == 0f) return
|
if (tryGoToRuinAndEncampment(unit) && unit.currentMovement == 0f) return
|
||||||
if (unit.health < 80 && tryHealUnit(unit)) return
|
if (unit.health < 80 && tryHealUnit(unit)) return
|
||||||
if (tryExplore(unit)) return
|
if (tryExplore(unit)) return
|
||||||
unit.civInfo.addNotification("[${unit.name}] finished exploring.", unit.currentTile.position, Color.GRAY)
|
unit.civInfo.addNotification("[${unit.displayName()}] finished exploring.", unit.currentTile.position, Color.GRAY)
|
||||||
unit.action = null
|
unit.action = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
unit.civInfo.addNotification("[${unit.name}] has no work to do.", unit.currentTile.position, Color.GRAY)
|
unit.civInfo.addNotification("[${unit.displayName()}] has no work to do.", unit.currentTile.position, Color.GRAY)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -508,7 +508,7 @@ class CivilizationInfo {
|
|||||||
val unitToDisband = civMilitaryUnits.first()
|
val unitToDisband = civMilitaryUnits.first()
|
||||||
unitToDisband.disband()
|
unitToDisband.disband()
|
||||||
civMilitaryUnits -= unitToDisband
|
civMilitaryUnits -= unitToDisband
|
||||||
val unitName = unitToDisband.name
|
val unitName = unitToDisband.displayName()
|
||||||
addNotification("Cannot provide unit upkeep for [$unitName] - unit has been disbanded!", null, Color.RED)
|
addNotification("Cannot provide unit upkeep for [$unitName] - unit has been disbanded!", null, Color.RED)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,9 @@ import com.unciv.models.ruleset.unit.UnitType
|
|||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The immutable properties and mutable game state of an individual unit present on the map
|
||||||
|
*/
|
||||||
class MapUnit {
|
class MapUnit {
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
@ -57,7 +60,29 @@ class MapUnit {
|
|||||||
var cannotEnterOceanTilesUntilAstronomy = false
|
var cannotEnterOceanTilesUntilAstronomy = false
|
||||||
|
|
||||||
lateinit var owner: String
|
lateinit var owner: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name key of the unit, used for serialization
|
||||||
|
*/
|
||||||
lateinit var name: String
|
lateinit var name: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of this individual unit, usually resulting from promotion
|
||||||
|
*/
|
||||||
|
var instanceName: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name which should be displayed in UI
|
||||||
|
*/
|
||||||
|
fun displayName(): String {
|
||||||
|
return if(instanceName == null) {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
"$instanceName ($name)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var currentMovement: Float = 0f
|
var currentMovement: Float = 0f
|
||||||
var health: Int = 100
|
var health: Int = 100
|
||||||
|
|
||||||
@ -77,8 +102,11 @@ class MapUnit {
|
|||||||
//region pure functions
|
//region pure functions
|
||||||
fun clone(): MapUnit {
|
fun clone(): MapUnit {
|
||||||
val toReturn = MapUnit()
|
val toReturn = MapUnit()
|
||||||
toReturn.owner = owner
|
toReturn.baseUnit = baseUnit
|
||||||
toReturn.name = name
|
toReturn.name = name
|
||||||
|
toReturn.civInfo = civInfo
|
||||||
|
toReturn.owner = owner
|
||||||
|
toReturn.instanceName = instanceName
|
||||||
toReturn.currentMovement = currentMovement
|
toReturn.currentMovement = currentMovement
|
||||||
toReturn.health = health
|
toReturn.health = health
|
||||||
toReturn.action = action
|
toReturn.action = action
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.unciv.models.ruleset
|
package com.unciv.models.ruleset
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.unciv.Constants
|
import com.unciv.Constants
|
||||||
|
@ -350,10 +350,10 @@ class EmpireOverviewScreen(private var viewingPlayer:CivilizationInfo, defaultPa
|
|||||||
table.row()
|
table.row()
|
||||||
table.addSeparator()
|
table.addSeparator()
|
||||||
|
|
||||||
for (unit in viewingPlayer.getCivUnits().sortedWith(compareBy({ it.name }, { !it.due },
|
for (unit in viewingPlayer.getCivUnits().sortedWith(compareBy({ it.displayName() }, { !it.due },
|
||||||
{ it.currentMovement < 0.1f }, { abs(it.currentTile.position.x) + abs(it.currentTile.position.y) }))) {
|
{ it.currentMovement < 0.1f }, { abs(it.currentTile.position.x) + abs(it.currentTile.position.y) }))) {
|
||||||
val baseUnit = unit.baseUnit()
|
val baseUnit = unit.baseUnit()
|
||||||
val button = unit.name.toTextButton()
|
val button = unit.displayName().toTextButton()
|
||||||
button.onClick {
|
button.onClick {
|
||||||
game.setWorldScreen()
|
game.setWorldScreen()
|
||||||
game.worldScreen.mapHolder.setCenterPosition(unit.currentTile.position)
|
game.worldScreen.mapHolder.setCenterPosition(unit.currentTile.position)
|
||||||
|
@ -14,6 +14,11 @@ open class PickerScreen : CameraStageBaseScreen() {
|
|||||||
protected var rightSideGroup = VerticalGroup()
|
protected var rightSideGroup = VerticalGroup()
|
||||||
protected var rightSideButton: TextButton
|
protected var rightSideButton: TextButton
|
||||||
private var screenSplit = 0.85f
|
private var screenSplit = 0.85f
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The table displaying the choices from which to pick (usually).
|
||||||
|
* Also the element which most of the screen realestate is devoted to displaying.
|
||||||
|
*/
|
||||||
protected var topTable: Table
|
protected var topTable: Table
|
||||||
var bottomTable:Table = Table()
|
var bottomTable:Table = Table()
|
||||||
internal var splitPane: SplitPane
|
internal var splitPane: SplitPane
|
||||||
|
@ -40,7 +40,8 @@ class PromotionPickerScreen(val unit: MapUnit) : PickerScreen() {
|
|||||||
}
|
}
|
||||||
val canBePromoted = unit.promotions.canBePromoted()
|
val canBePromoted = unit.promotions.canBePromoted()
|
||||||
val canChangeState = game.worldScreen.canChangeState
|
val canChangeState = game.worldScreen.canChangeState
|
||||||
if (!canBePromoted || !canChangeState)
|
val canPromoteNow = canBePromoted && canChangeState
|
||||||
|
if (!canPromoteNow)
|
||||||
rightSideButton.disable()
|
rightSideButton.disable()
|
||||||
|
|
||||||
val availablePromotionsGroup = Table()
|
val availablePromotionsGroup = Table()
|
||||||
@ -52,6 +53,15 @@ class PromotionPickerScreen(val unit: MapUnit) : PickerScreen() {
|
|||||||
|| unit.promotions.promotions.contains(it.name) }
|
|| unit.promotions.promotions.contains(it.name) }
|
||||||
val unitAvailablePromotions = unit.promotions.getAvailablePromotions()
|
val unitAvailablePromotions = unit.promotions.getAvailablePromotions()
|
||||||
|
|
||||||
|
if(canPromoteNow && unit.instanceName == null) {
|
||||||
|
val renameButton = "Choose name for [${unit.name}]".toTextButton()
|
||||||
|
renameButton.touchable = Touchable.enabled
|
||||||
|
renameButton.onClick {
|
||||||
|
RenameUnitPopup(unit, this).open()
|
||||||
|
}
|
||||||
|
availablePromotionsGroup.add(renameButton)
|
||||||
|
availablePromotionsGroup.row()
|
||||||
|
}
|
||||||
for (promotion in promotionsForUnitType) {
|
for (promotion in promotionsForUnitType) {
|
||||||
if(promotion.name=="Heal Instantly" && unit.health==100) continue
|
if(promotion.name=="Heal Instantly" && unit.health==100) continue
|
||||||
val isPromotionAvailable = promotion in unitAvailablePromotions
|
val isPromotionAvailable = promotion in unitAvailablePromotions
|
||||||
|
31
core/src/com/unciv/ui/pickerscreens/RenameUnitPopup.kt
Normal file
31
core/src/com/unciv/ui/pickerscreens/RenameUnitPopup.kt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package com.unciv.ui.pickerscreens
|
||||||
|
|
||||||
|
import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
||||||
|
import com.unciv.logic.map.MapUnit
|
||||||
|
import com.unciv.models.translations.tr
|
||||||
|
import com.unciv.ui.utils.*
|
||||||
|
|
||||||
|
class RenameUnitPopup(unit: MapUnit, screen: CameraStageBaseScreen): Popup(screen) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
addGoodSizedLabel("Choose name for [${unit.baseUnit.name}]").row()
|
||||||
|
|
||||||
|
val nameField = TextField("", skin)
|
||||||
|
// Disallowed special characters determined with US keyboard and a certain binary
|
||||||
|
// copyrighted by Firaxis Games
|
||||||
|
val illegal_chars = "%*[]\"\\|<>/?"
|
||||||
|
nameField.textFieldFilter = TextField.TextFieldFilter { _, char -> !(char in illegal_chars)}
|
||||||
|
// Max name length decided arbitrarily
|
||||||
|
nameField.maxLength = 10
|
||||||
|
add(nameField)
|
||||||
|
row()
|
||||||
|
add("OK".toTextButton().onClick {
|
||||||
|
if (nameField.text != "") {
|
||||||
|
unit.instanceName = nameField.text
|
||||||
|
}
|
||||||
|
screen.game.setScreen(PromotionPickerScreen(unit))
|
||||||
|
})
|
||||||
|
add("Close".toTextButton().onClick { close() })
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -110,7 +110,7 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){
|
|||||||
if(selectedUnits.size==1) { //single selected unit
|
if(selectedUnits.size==1) { //single selected unit
|
||||||
separator.isVisible = true
|
separator.isVisible = true
|
||||||
val unit = selectedUnit!!
|
val unit = selectedUnit!!
|
||||||
var nameLabelText = unit.name.tr()
|
var nameLabelText = unit.displayName().tr()
|
||||||
if (unit.health < 100) nameLabelText += " (" + unit.health + ")"
|
if (unit.health < 100) nameLabelText += " (" + unit.health + ")"
|
||||||
if (nameLabelText != unitNameLabel.text.toString()) {
|
if (nameLabelText != unitNameLabel.text.toString()) {
|
||||||
unitNameLabel.setText(nameLabelText)
|
unitNameLabel.setText(nameLabelText)
|
||||||
|
Reference in New Issue
Block a user