chore: separated tile description into a separate file

This commit is contained in:
Yair Morgenstern
2023-02-02 20:14:33 +02:00
parent e84887b8c2
commit e21cfe8145
10 changed files with 116 additions and 102 deletions

View File

@ -528,7 +528,7 @@ class CityConstructions : IsPartOfGameInfoSerialization {
val finalTile = tile val finalTile = tile
?: Automation.getTileForConstructionImprovement(city, improvementToPlace) ?: Automation.getTileForConstructionImprovement(city, improvementToPlace)
?: return false // This was never reached in testing ?: return false // This was never reached in testing
finalTile.markForCreatesOneImprovement(improvementToPlace.name) finalTile.improvementFunctions.markForCreatesOneImprovement(improvementToPlace.name)
// postBuildEvent does the rest by calling cityConstructions.applyCreateOneImprovement // postBuildEvent does the rest by calling cityConstructions.applyCreateOneImprovement
} }
@ -599,7 +599,7 @@ class CityConstructions : IsPartOfGameInfoSerialization {
val improvement = building.getImprovementToCreate(city.getRuleset()) ?: return val improvement = building.getImprovementToCreate(city.getRuleset()) ?: return
if (getTileForImprovement(improvement.name) != null) return if (getTileForImprovement(improvement.name) != null) return
val newTile = Automation.getTileForConstructionImprovement(city, improvement) ?: return val newTile = Automation.getTileForConstructionImprovement(city, improvement) ?: return
newTile.markForCreatesOneImprovement(improvement.name) newTile.improvementFunctions.markForCreatesOneImprovement(improvement.name)
} }
fun addToQueue(constructionName: String) { fun addToQueue(constructionName: String) {

View File

@ -136,7 +136,7 @@ class CityExpansionManager : IsPartOfGameInfoSerialization {
city.lockedTiles.remove(tile.position) city.lockedTiles.remove(tile.position)
} }
tile.removeCreatesOneImprovementMarker() tile.improvementFunctions.removeCreatesOneImprovementMarker()
tile.setOwningCity(null) tile.setOwningCity(null)

View File

@ -21,9 +21,6 @@ import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.Unique import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueMap import com.unciv.models.ruleset.unique.UniqueMap
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.translations.tr
import com.unciv.ui.civilopedia.FormattedLine
import com.unciv.ui.utils.Fonts
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.min import kotlin.math.min
import kotlin.random.Random import kotlin.random.Random
@ -646,82 +643,6 @@ open class Tile : IsPartOfGameInfoSerialization {
return true return true
} }
/** Get info on a selected tile, used on WorldScreen (right side above minimap), CityScreen or MapEditorViewTab. */
fun toMarkup(viewingCiv: Civilization?): ArrayList<FormattedLine> {
val lineList = ArrayList<FormattedLine>()
val isViewableToPlayer = viewingCiv == null || UncivGame.Current.viewEntireMapForDebug
|| viewingCiv.viewableTiles.contains(this)
if (isCityCenter()) {
val city = getCity()!!
var cityString = city.name.tr()
if (isViewableToPlayer) cityString += " (${city.health})"
lineList += FormattedLine(cityString)
if (UncivGame.Current.viewEntireMapForDebug || city.civ == viewingCiv)
lineList += city.cityConstructions.getProductionMarkup(ruleset)
}
lineList += FormattedLine(baseTerrain, link="Terrain/$baseTerrain")
for (terrainFeature in terrainFeatures)
lineList += FormattedLine(terrainFeature, link="Terrain/$terrainFeature")
if (resource != null && (viewingCiv == null || hasViewableResource(viewingCiv)))
lineList += if (tileResource.resourceType == ResourceType.Strategic)
FormattedLine("{$resource} ($resourceAmount)", link="Resource/$resource")
else
FormattedLine(resource!!, link="Resource/$resource")
if (resource != null && viewingCiv != null && hasViewableResource(viewingCiv)) {
val resourceImprovement = tileResource.getImprovements().firstOrNull { improvementFunctions.canBuildImprovement(ruleset.tileImprovements[it]!!, viewingCiv) }
val tileImprovement = ruleset.tileImprovements[resourceImprovement]
if (tileImprovement?.techRequired != null
&& !viewingCiv.tech.isResearched(tileImprovement.techRequired!!)) {
lineList += FormattedLine(
"Requires [${tileImprovement.techRequired}]",
link="Technology/${tileImprovement.techRequired}",
color= "#FAA"
)
}
}
if (naturalWonder != null)
lineList += FormattedLine(naturalWonder!!, link="Terrain/$naturalWonder")
if (roadStatus !== RoadStatus.None && !isCityCenter()) {
val pillageText = if (roadIsPillaged) " (Pillaged!)" else ""
lineList += FormattedLine("[${roadStatus.name}]$pillageText", link = "Improvement/${roadStatus.name}")
}
val shownImprovement = getShownImprovement(viewingCiv)
if (shownImprovement != null) {
val pillageText = if (improvementIsPillaged) " (Pillaged!)" else ""
lineList += FormattedLine("[$shownImprovement]$pillageText", link = "Improvement/$shownImprovement")
}
if (improvementInProgress != null && isViewableToPlayer) {
// Negative turnsToImprovement is used for UniqueType.CreatesOneImprovement
val line = "{$improvementInProgress}" +
if (turnsToImprovement > 0) " - $turnsToImprovement${Fonts.turn}" else " ({Under construction})"
lineList += FormattedLine(line, link="Improvement/$improvementInProgress")
}
if (civilianUnit != null && isViewableToPlayer)
lineList += FormattedLine(civilianUnit!!.name.tr() + " - " + civilianUnit!!.civ.civName.tr(),
link="Unit/${civilianUnit!!.name}")
if (militaryUnit != null && isViewableToPlayer && (viewingCiv == null || !militaryUnit!!.isInvisible(viewingCiv))) {
val milUnitString = militaryUnit!!.name.tr() +
(if (militaryUnit!!.health < 100) "(" + militaryUnit!!.health + ")" else "") +
" - " + militaryUnit!!.civ.civName.tr()
lineList += FormattedLine(milUnitString, link="Unit/${militaryUnit!!.name}")
}
val defenceBonus = getDefensiveBonus()
if (defenceBonus != 0f) {
var defencePercentString = (defenceBonus * 100).toInt().toString() + "%"
if (!defencePercentString.startsWith("-")) defencePercentString = "+$defencePercentString"
lineList += FormattedLine("[$defencePercentString] to unit defence")
}
if (isImpassible()) lineList += FormattedLine(Constants.impassable)
if (isLand && isAdjacentTo(Constants.freshWater)) lineList += FormattedLine(Constants.freshWater)
return lineList
}
fun hasEnemyInvisibleUnit(viewingCiv: Civilization): Boolean { fun hasEnemyInvisibleUnit(viewingCiv: Civilization): Boolean {
val unitsInTile = getUnits() val unitsInTile = getUnits()
if (unitsInTile.none()) return false if (unitsInTile.none()) return false
@ -909,7 +830,7 @@ open class Tile : IsPartOfGameInfoSerialization {
if (!isLand) { changeImprovement(null); return } if (!isLand) { changeImprovement(null); return }
// Setting turnsToImprovement might interfere with UniqueType.CreatesOneImprovement // Setting turnsToImprovement might interfere with UniqueType.CreatesOneImprovement
removeCreatesOneImprovementMarker() improvementFunctions.removeCreatesOneImprovementMarker()
improvementInProgress = null // remove any in progress work as well improvementInProgress = null // remove any in progress work as well
turnsToImprovement = 0 turnsToImprovement = 0
// if no Repair action, destroy improvements instead // if no Repair action, destroy improvements instead
@ -941,20 +862,6 @@ open class Tile : IsPartOfGameInfoSerialization {
roadIsPillaged = false roadIsPillaged = false
} }
/** Marks tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique */
fun markForCreatesOneImprovement(improvement: String) {
improvementInProgress = improvement
turnsToImprovement = -1
}
/** Un-Marks a tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique,
* and ensures that matching queued buildings are removed. */
fun removeCreatesOneImprovementMarker() {
if (!isMarkedForCreatesOneImprovement()) return
owningCity?.cityConstructions?.removeCreateOneImprovementConstruction(improvementInProgress!!)
stopWorkingOnImprovement()
}
/** /**
* Assign a continent ID to this tile. * Assign a continent ID to this tile.

View File

@ -0,0 +1,89 @@
package com.unciv.logic.map.tile
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.civilization.Civilization
import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.translations.tr
import com.unciv.ui.civilopedia.FormattedLine
import com.unciv.ui.utils.Fonts
object TileDescription {
/** Get info on a selected tile, used on WorldScreen (right side above minimap), CityScreen or MapEditorViewTab. */
fun toMarkup(tile: Tile, viewingCiv: Civilization?): ArrayList<FormattedLine> {
val lineList = ArrayList<FormattedLine>()
val isViewableToPlayer = viewingCiv == null || UncivGame.Current.viewEntireMapForDebug
|| viewingCiv.viewableTiles.contains(tile)
if (tile.isCityCenter()) {
val city = tile.getCity()!!
var cityString = city.name.tr()
if (isViewableToPlayer) cityString += " (${city.health})"
lineList += FormattedLine(cityString)
if (UncivGame.Current.viewEntireMapForDebug || city.civ == viewingCiv)
lineList += city.cityConstructions.getProductionMarkup(tile.ruleset)
}
lineList += FormattedLine(tile.baseTerrain, link="Terrain/${tile.baseTerrain}")
for (terrainFeature in tile.terrainFeatures)
lineList += FormattedLine(terrainFeature, link="Terrain/$terrainFeature")
if (tile.resource != null && (viewingCiv == null || tile.hasViewableResource(viewingCiv)))
lineList += if (tile.tileResource.resourceType == ResourceType.Strategic)
FormattedLine("{${tile.resource}} (${tile.resourceAmount})", link="Resource/${tile.resource}")
else
FormattedLine(tile.resource!!, link="Resource/${tile.resource}")
if (tile.resource != null && viewingCiv != null && tile.hasViewableResource(viewingCiv)) {
val resourceImprovement = tile.tileResource.getImprovements().firstOrNull { tile.improvementFunctions.canBuildImprovement(tile.ruleset.tileImprovements[it]!!, viewingCiv) }
val tileImprovement = tile.ruleset.tileImprovements[resourceImprovement]
if (tileImprovement?.techRequired != null
&& !viewingCiv.tech.isResearched(tileImprovement.techRequired!!)) {
lineList += FormattedLine(
"Requires [${tileImprovement.techRequired}]",
link="Technology/${tileImprovement.techRequired}",
color= "#FAA"
)
}
}
if (tile.naturalWonder != null)
lineList += FormattedLine(tile.naturalWonder!!, link="Terrain/${tile.naturalWonder}")
if (tile.roadStatus !== RoadStatus.None && !tile.isCityCenter()) {
val pillageText = if (tile.roadIsPillaged) " (Pillaged!)" else ""
lineList += FormattedLine("[${tile.roadStatus.name}]$pillageText", link = "Improvement/${tile.roadStatus.name}")
}
val shownImprovement = tile.getShownImprovement(viewingCiv)
if (shownImprovement != null) {
val pillageText = if (tile.improvementIsPillaged) " (Pillaged!)" else ""
lineList += FormattedLine("[$shownImprovement]$pillageText", link = "Improvement/$shownImprovement")
}
if (tile.improvementInProgress != null && isViewableToPlayer) {
// Negative turnsToImprovement is used for UniqueType.CreatesOneImprovement
val line = "{${tile.improvementInProgress}}" +
if (tile.turnsToImprovement > 0) " - ${tile.turnsToImprovement}${Fonts.turn}" else " ({Under construction})"
lineList += FormattedLine(line, link="Improvement/${tile.improvementInProgress}")
}
if (tile.civilianUnit != null && isViewableToPlayer)
lineList += FormattedLine(tile.civilianUnit!!.name.tr() + " - " + tile.civilianUnit!!.civ.civName.tr(),
link="Unit/${tile.civilianUnit!!.name}")
if (tile.militaryUnit != null && isViewableToPlayer && (viewingCiv == null || !tile.militaryUnit!!.isInvisible(viewingCiv))) {
val milUnitString = tile.militaryUnit!!.name.tr() +
(if (tile.militaryUnit!!.health < 100) "(" + tile.militaryUnit!!.health + ")" else "") +
" - " + tile.militaryUnit!!.civ.civName.tr()
lineList += FormattedLine(milUnitString, link="Unit/${tile.militaryUnit!!.name}")
}
val defenceBonus = tile.getDefensiveBonus()
if (defenceBonus != 0f) {
var defencePercentString = (defenceBonus * 100).toInt().toString() + "%"
if (!defencePercentString.startsWith("-")) defencePercentString = "+$defencePercentString"
lineList += FormattedLine("[$defencePercentString] to unit defence")
}
if (tile.isImpassible()) lineList += FormattedLine(Constants.impassable)
if (tile.isLand && tile.isAdjacentTo(Constants.freshWater)) lineList += FormattedLine(Constants.freshWater)
return lineList
}
}

View File

@ -306,4 +306,19 @@ class TileInfoImprovementFunctions(val tile: Tile) {
} }
/** Marks tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique */
fun markForCreatesOneImprovement(improvement: String) {
tile.improvementInProgress = improvement
tile.turnsToImprovement = -1
}
/** Un-Marks a tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique,
* and ensures that matching queued buildings are removed. */
fun removeCreatesOneImprovementMarker() {
if (!tile.isMarkedForCreatesOneImprovement()) return
tile.owningCity?.cityConstructions?.removeCreateOneImprovementConstruction(tile.improvementInProgress!!)
tile.stopWorkingOnImprovement()
}
} }

View File

@ -347,7 +347,7 @@ class CityScreen(
// might get a bit fragile if several buildings constructing the same improvement type // might get a bit fragile if several buildings constructing the same improvement type
// were to be allowed in the queue - or a little nontransparent to the user why they // were to be allowed in the queue - or a little nontransparent to the user why they
// won't reorder - maybe one day redesign to have the target tiles attached to queue entries. // won't reorder - maybe one day redesign to have the target tiles attached to queue entries.
tileInfo.markForCreatesOneImprovement(improvement.name) tileInfo.improvementFunctions.markForCreatesOneImprovement(improvement.name)
city.cityConstructions.addToQueue(pickTileData.building.name) city.cityConstructions.addToQueue(pickTileData.building.name)
} }
} }

View File

@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.map.tile.Tile import com.unciv.logic.map.tile.Tile
import com.unciv.logic.map.tile.TileDescription
import com.unciv.models.UncivSound import com.unciv.models.UncivSound
import com.unciv.models.stats.Stat import com.unciv.models.stats.Stat
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
@ -52,7 +53,7 @@ class CityScreenTileTable(private val cityScreen: CityScreen): Table() {
val stats = selectedTile.stats.getTileStats(city, city.civ) val stats = selectedTile.stats.getTileStats(city, city.civ)
innerTable.pad(5f) innerTable.pad(5f)
innerTable.add( MarkupRenderer.render(selectedTile.toMarkup(city.civ), iconDisplay = IconDisplay.None) { innerTable.add(MarkupRenderer.render(TileDescription.toMarkup(selectedTile, city.civ), iconDisplay = IconDisplay.None) {
UncivGame.Current.pushScreen(CivilopediaScreen(city.getRuleset(), link = it)) UncivGame.Current.pushScreen(CivilopediaScreen(city.getRuleset(), link = it))
} ) } )
innerTable.row() innerTable.row()

View File

@ -8,6 +8,7 @@ import com.unciv.logic.GameInfo
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.logic.map.tile.Tile import com.unciv.logic.map.tile.Tile
import com.unciv.logic.map.tile.TileDescription
import com.unciv.models.Counter import com.unciv.models.Counter
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
@ -167,7 +168,7 @@ class MapEditorViewTab(
lines += FormattedLine("Position: [${tile.position.toString().replace(".0","")}]") lines += FormattedLine("Position: [${tile.position.toString().replace(".0","")}]")
lines += FormattedLine() lines += FormattedLine()
lines.addAll(tile.toMarkup(null)) lines.addAll(TileDescription.toMarkup(tile, null))
val stats = try { val stats = try {
tile.stats.getTileStats(null, mockCiv) tile.stats.getTileStats(null, mockCiv)

View File

@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.Align
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.tile.Tile import com.unciv.logic.map.tile.Tile
import com.unciv.logic.map.tile.TileDescription
import com.unciv.ui.civilopedia.CivilopediaScreen import com.unciv.ui.civilopedia.CivilopediaScreen
import com.unciv.ui.civilopedia.FormattedLine.IconDisplay import com.unciv.ui.civilopedia.FormattedLine.IconDisplay
import com.unciv.ui.civilopedia.MarkupRenderer import com.unciv.ui.civilopedia.MarkupRenderer
@ -28,7 +29,7 @@ class TileInfoTable(private val viewingCiv :Civilization) : Table(BaseScreen.ski
if (tile != null && (UncivGame.Current.viewEntireMapForDebug || viewingCiv.hasExplored(tile)) ) { if (tile != null && (UncivGame.Current.viewEntireMapForDebug || viewingCiv.hasExplored(tile)) ) {
add(getStatsTable(tile)) add(getStatsTable(tile))
add( MarkupRenderer.render(tile.toMarkup(viewingCiv), padding = 0f, iconDisplay = IconDisplay.None) { add(MarkupRenderer.render(TileDescription.toMarkup(tile, viewingCiv), padding = 0f, iconDisplay = IconDisplay.None) {
UncivGame.Current.pushScreen(CivilopediaScreen(viewingCiv.gameInfo.ruleSet, link = it)) UncivGame.Current.pushScreen(CivilopediaScreen(viewingCiv.gameInfo.ruleSet, link = it))
} ).pad(5f).row() } ).pad(5f).row()
if (UncivGame.Current.viewEntireMapForDebug) if (UncivGame.Current.viewEntireMapForDebug)

View File

@ -468,7 +468,7 @@ object UnitActions {
title = "Create [$improvementName]", title = "Create [$improvementName]",
action = { action = {
val unitTile = unit.getTile() val unitTile = unit.getTile()
unitTile.removeCreatesOneImprovementMarker() unitTile.improvementFunctions.removeCreatesOneImprovementMarker()
unitTile.changeImprovement(improvementName) unitTile.changeImprovement(improvementName)
unitTile.stopWorkingOnImprovement() unitTile.stopWorkingOnImprovement()
improvement.handleImprovementCompletion(unit) improvement.handleImprovementCompletion(unit)