mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-29 06:51:30 -04:00
Spruced up Civilopedia - phase 5 - buildings (#4391)
* Spruced up Civilopedia - phase 5 - buildings * Finish merging master into Civilopedia-Buildings * Spruced up Civilopedia - phase 5 - buildings - patch * Spruced up Civilopedia - phase 5 - buildings - patch2 * Spruced up Civilopedia - phase 5 - buildings - patch3 * Spruced up Civilopedia - phase 5 - buildings - patch4 * Spruced up Civilopedia - phase 5 - buildings - patch5
This commit is contained in:
parent
118c1fc888
commit
50cec97354
@ -33,6 +33,7 @@ Requires [buildingName] to be built in the city = Benötigt den Bau von [buildin
|
|||||||
Requires [buildingName] to be built in all cities = Benötigt den Bau von [buildingName] in allen Städten
|
Requires [buildingName] to be built in all cities = Benötigt den Bau von [buildingName] in allen Städten
|
||||||
Provides a free [buildingName] in the city = Stellt das Gebäude [buildingName] in der Stadt kostenlos bereit
|
Provides a free [buildingName] in the city = Stellt das Gebäude [buildingName] in der Stadt kostenlos bereit
|
||||||
Requires worked [resource] near city = Benötigt eine Bewirtschaftung von [resource] in der Nähe der Stadt
|
Requires worked [resource] near city = Benötigt eine Bewirtschaftung von [resource] in der Nähe der Stadt
|
||||||
|
Requires at least one of the following resources worked near the city: = Benötigt mindestens eine der folgenden Ressourcen bewirtschaftet in der Nähe der Stadt:
|
||||||
Wonder is being built elsewhere = Das Wunder wird woanders gebaut
|
Wonder is being built elsewhere = Das Wunder wird woanders gebaut
|
||||||
National Wonder is being built elsewhere = Das Nationale Wunder wird woanders gebaut
|
National Wonder is being built elsewhere = Das Nationale Wunder wird woanders gebaut
|
||||||
Requires a [buildingName] in all cities = Benötigt das Gebäude [buildingName] in allen Städten
|
Requires a [buildingName] in all cities = Benötigt das Gebäude [buildingName] in allen Städten
|
||||||
@ -42,6 +43,7 @@ Consumes [amount] [resource] = Verbraucht [amount] [resource]
|
|||||||
Required tech: [requiredTech] = Benötigt Technologie: [requiredTech]
|
Required tech: [requiredTech] = Benötigt Technologie: [requiredTech]
|
||||||
Requires [PolicyOrNationalWonder] = Benötigt [PolicyOrNationalWonder]
|
Requires [PolicyOrNationalWonder] = Benötigt [PolicyOrNationalWonder]
|
||||||
Cannot be purchased = Kann nicht gekauft werden
|
Cannot be purchased = Kann nicht gekauft werden
|
||||||
|
See also = Siehe auch
|
||||||
|
|
||||||
Current construction = Aktuelle Produktion
|
Current construction = Aktuelle Produktion
|
||||||
Construction queue = Produktionswarteschlange
|
Construction queue = Produktionswarteschlange
|
||||||
@ -599,6 +601,7 @@ Maintenance cost = Wartungskosten
|
|||||||
Pick construction = Produktion auswählen
|
Pick construction = Produktion auswählen
|
||||||
Pick improvement = Verbesserung auswählen
|
Pick improvement = Verbesserung auswählen
|
||||||
Provides [resource] = Stellt [resource] zur Verfügung
|
Provides [resource] = Stellt [resource] zur Verfügung
|
||||||
|
Provides [amount] [resource] = Stellt [amount] × [resource] zur Verfügung
|
||||||
Replaces [improvement] = Ersetzt [improvement]
|
Replaces [improvement] = Ersetzt [improvement]
|
||||||
Pick now! = Wähle jetzt!
|
Pick now! = Wähle jetzt!
|
||||||
Build [building] = [building] bauen
|
Build [building] = [building] bauen
|
||||||
@ -1007,6 +1010,7 @@ Dogfighting I = Kurvenkampf I
|
|||||||
Dogfighting II = Kurvenkampf II
|
Dogfighting II = Kurvenkampf II
|
||||||
Dogfighting III = Kurvenkampf III
|
Dogfighting III = Kurvenkampf III
|
||||||
Choose name for [unitName] = Wähle Namen für [unitName]
|
Choose name for [unitName] = Wähle Namen für [unitName]
|
||||||
|
[unitFilter] units gain the [promotion] promotion = [unitFilter] Einheiten erhalten die [promotion] Beförderung
|
||||||
|
|
||||||
# Multiplayer Turn Checker Service
|
# Multiplayer Turn Checker Service
|
||||||
|
|
||||||
@ -1063,6 +1067,7 @@ Must be on [terrain] = Muss sich auf [terrain] befinden
|
|||||||
Can only be built on [tileFilter] tiles = Kann nur auf [tileFilter]-Feldern gebaut werden
|
Can only be built on [tileFilter] tiles = Kann nur auf [tileFilter]-Feldern gebaut werden
|
||||||
Cannot be built on [tileFilter] tiles = Kann nicht auf [tileFilter]-Feldern gebaut werden
|
Cannot be built on [tileFilter] tiles = Kann nicht auf [tileFilter]-Feldern gebaut werden
|
||||||
Does not need removal of [feature] = Hierfür muß [feature] nicht entfernt werden
|
Does not need removal of [feature] = Hierfür muß [feature] nicht entfernt werden
|
||||||
|
Gain a free [building] [cityFilter] = Erhalte [building] umsonst [cityFilter]
|
||||||
|
|
||||||
# City filters
|
# City filters
|
||||||
in this city = in dieser Stadt
|
in this city = in dieser Stadt
|
||||||
@ -1145,7 +1150,7 @@ The Great Lighthouse = Der Große Leuchtturm
|
|||||||
|
|
||||||
Stable = Stall
|
Stable = Stall
|
||||||
|
|
||||||
Cost increases by [amount] per owned city = Kosten erhöhen sich um [amount] per Stadt in Eurem Besitz
|
Cost increases by [amount] per owned city = Kosten erhöhen sich um [amount] pro Stadt in Eurem Besitz
|
||||||
Circus Maximus = Circus Maximus
|
Circus Maximus = Circus Maximus
|
||||||
|
|
||||||
Remove extra unhappiness from annexed cities = Entferne zusätzliche Unzufriedenheit von annektierten Städten
|
Remove extra unhappiness from annexed cities = Entferne zusätzliche Unzufriedenheit von annektierten Städten
|
||||||
@ -1163,7 +1168,7 @@ Terracotta Army = Terrakotta-Armee
|
|||||||
National College = Nationale Hochschule
|
National College = Nationale Hochschule
|
||||||
|
|
||||||
'The ancient Oracle said that I was the wisest of all the Greeks. It is because I alone, of all the Greeks, know that I know nothing' - Socrates = 'Das alte Orakel sagte, dass ich der weiseste aller Griechen sei. Weil ich allein, von allen Griechen, weiß, dass ich nichts weiß.' - Sokrates
|
'The ancient Oracle said that I was the wisest of all the Greeks. It is because I alone, of all the Greeks, know that I know nothing' - Socrates = 'Das alte Orakel sagte, dass ich der weiseste aller Griechen sei. Weil ich allein, von allen Griechen, weiß, dass ich nichts weiß.' - Sokrates
|
||||||
Free Social Policy = Kostenloser Sozialpolitik
|
Free Social Policy = Kostenlose Sozialpolitik
|
||||||
The Oracle = Das Orakel
|
The Oracle = Das Orakel
|
||||||
|
|
||||||
Amphitheater = Amphitheater
|
Amphitheater = Amphitheater
|
||||||
@ -1173,7 +1178,7 @@ Burial Tomb = Grabstätte
|
|||||||
|
|
||||||
Mud Pyramid Mosque = Lehmmoschee
|
Mud Pyramid Mosque = Lehmmoschee
|
||||||
|
|
||||||
[amount]% great person generation [cityFilter] = [amount]% für die Generierung Großer Persönlichkeiten [cityFilter]
|
[amount]% great person generation [cityFilter] = Große Persönlichkeiten generieren [amount]% schneller [cityFilter]
|
||||||
National Epic = Nationalepos
|
National Epic = Nationalepos
|
||||||
|
|
||||||
Market = Markt
|
Market = Markt
|
||||||
@ -1192,7 +1197,7 @@ Aqueduct = Aquädukt
|
|||||||
|
|
||||||
'The art of war teaches us to rely not on the likelihood of the enemy's not attacking, but rather on the fact that we have made our position unassailable.' - Sun Tzu = 'Die Kunst des Krieges lehrt uns, uns nicht auf die Wahrscheinlichkeit zu verlassen, dass der Feind nicht angreift, sondern auf die Tatsache, dass wir unsere Position unangreifbar gemacht haben.' - Sun Tzu
|
'The art of war teaches us to rely not on the likelihood of the enemy's not attacking, but rather on the fact that we have made our position unassailable.' - Sun Tzu = 'Die Kunst des Krieges lehrt uns, uns nicht auf die Wahrscheinlichkeit zu verlassen, dass der Feind nicht angreift, sondern auf die Tatsache, dass wir unsere Position unangreifbar gemacht haben.' - Sun Tzu
|
||||||
Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite) = Feindliche Landeinheiten müssen 1 extra Bewegungspunkt innerhalb deines Territoriums ausgeben (veraltet durch Dynamit)
|
Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite) = Feindliche Landeinheiten müssen 1 extra Bewegungspunkt innerhalb deines Territoriums ausgeben (veraltet durch Dynamit)
|
||||||
Great Wall = die Große Mauer
|
Great Wall = Die Große Mauer
|
||||||
|
|
||||||
All newly-trained [unitType] units [cityFilter] receive the [promotion] promotion = Alle neu ausgebildeten [unitType] Einheiten [cityFilter] erhalten die [promotion] Beförderung
|
All newly-trained [unitType] units [cityFilter] receive the [promotion] promotion = Alle neu ausgebildeten [unitType] Einheiten [cityFilter] erhalten die [promotion] Beförderung
|
||||||
Heroic Epic = Heldenepos
|
Heroic Epic = Heldenepos
|
||||||
@ -1215,7 +1220,7 @@ National Treasury = Nationale Schatzkammer
|
|||||||
|
|
||||||
'Few romances can ever surpass that of the granite citadel on top of the beetling precipices of Machu Picchu, the crown of Inca Land.' - Hiram Bingham = 'Nur wenige Romanzen können jemals die der Granitzitadelle über den bedrohlichen Steilhängen von Machu Picchu, der Krönung des Landes der Inka, übersteigen.' - Hiram Bingham
|
'Few romances can ever surpass that of the granite citadel on top of the beetling precipices of Machu Picchu, the crown of Inca Land.' - Hiram Bingham = 'Nur wenige Romanzen können jemals die der Granitzitadelle über den bedrohlichen Steilhängen von Machu Picchu, der Krönung des Landes der Inka, übersteigen.' - Hiram Bingham
|
||||||
Gold from all trade routes +25% = Gold von allen Handelsrouten um 25% erhöht
|
Gold from all trade routes +25% = Gold von allen Handelsrouten um 25% erhöht
|
||||||
Must have an owned [tileFilter] within [amount] tiles = Benötigt ein [tileFilter] im Besitz innerhalb von [amount] Feldern
|
Must have an owned [tileFilter] within [amount] tiles = Benötigt [tileFilter] im Besitz innerhalb von [amount] Feldern
|
||||||
Machu Picchu = Machu Picchu
|
Machu Picchu = Machu Picchu
|
||||||
|
|
||||||
Workshop = Werkstatt
|
Workshop = Werkstatt
|
||||||
@ -1266,7 +1271,7 @@ Satrap's Court = Satraps Gerichtshaus
|
|||||||
Hanse = Hanse
|
Hanse = Hanse
|
||||||
|
|
||||||
'Most of us can, as we choose, make of this world either a palace or a prison' - John Lubbock = 'Die meisten von uns können, wie sie wollen, aus dieser Welt entweder einen Palast oder ein Gefängnis machen.' - John Lubbock
|
'Most of us can, as we choose, make of this world either a palace or a prison' - John Lubbock = 'Die meisten von uns können, wie sie wollen, aus dieser Welt entweder einen Palast oder ein Gefängnis machen.' - John Lubbock
|
||||||
Unhappiness from population decreased by [amount]% = Unzufriedenheit der Bevölkerung verringert um [amount]%
|
Unhappiness from population decreased by [amount]% = Unzufriedenheit durch Überbevölkerung verringert um [amount]%
|
||||||
Forbidden Palace = Verbotener Palast
|
Forbidden Palace = Verbotener Palast
|
||||||
|
|
||||||
Theatre = Theater
|
Theatre = Theater
|
||||||
|
@ -21,6 +21,10 @@ Oh no! It looks like something went DISASTROUSLY wrong! This is ABSOLUTELY not s
|
|||||||
|
|
||||||
# Buildings
|
# Buildings
|
||||||
|
|
||||||
|
Unsellable =
|
||||||
|
Not displayed as an available construction unless [building] is built =
|
||||||
|
Not displayed as an available construction without [resource] =
|
||||||
|
|
||||||
Choose a free great person =
|
Choose a free great person =
|
||||||
Get [unitName] =
|
Get [unitName] =
|
||||||
|
|
||||||
@ -33,6 +37,7 @@ Requires [buildingName] to be built in the city =
|
|||||||
Requires [buildingName] to be built in all cities =
|
Requires [buildingName] to be built in all cities =
|
||||||
Provides a free [buildingName] in the city =
|
Provides a free [buildingName] in the city =
|
||||||
Requires worked [resource] near city =
|
Requires worked [resource] near city =
|
||||||
|
Requires at least one of the following resources worked near the city: =
|
||||||
Wonder is being built elsewhere =
|
Wonder is being built elsewhere =
|
||||||
National Wonder is being built elsewhere =
|
National Wonder is being built elsewhere =
|
||||||
Requires a [buildingName] in all cities =
|
Requires a [buildingName] in all cities =
|
||||||
@ -42,6 +47,7 @@ Consumes [amount] [resource] =
|
|||||||
Required tech: [requiredTech] =
|
Required tech: [requiredTech] =
|
||||||
Requires [PolicyOrNationalWonder] =
|
Requires [PolicyOrNationalWonder] =
|
||||||
Cannot be purchased =
|
Cannot be purchased =
|
||||||
|
See also =
|
||||||
|
|
||||||
Current construction =
|
Current construction =
|
||||||
Construction queue =
|
Construction queue =
|
||||||
@ -602,6 +608,7 @@ Maintenance cost =
|
|||||||
Pick construction =
|
Pick construction =
|
||||||
Pick improvement =
|
Pick improvement =
|
||||||
Provides [resource] =
|
Provides [resource] =
|
||||||
|
Provides [amount] [resource] =
|
||||||
Replaces [improvement] =
|
Replaces [improvement] =
|
||||||
Pick now! =
|
Pick now! =
|
||||||
Build [building] =
|
Build [building] =
|
||||||
@ -1007,6 +1014,7 @@ Dogfighting I =
|
|||||||
Dogfighting II =
|
Dogfighting II =
|
||||||
Dogfighting III =
|
Dogfighting III =
|
||||||
Choose name for [unitName] =
|
Choose name for [unitName] =
|
||||||
|
[unitFilter] units gain the [promotion] promotion =
|
||||||
|
|
||||||
# Multiplayer Turn Checker Service
|
# Multiplayer Turn Checker Service
|
||||||
|
|
||||||
@ -1063,6 +1071,7 @@ Must be on [terrain] =
|
|||||||
Can only be built on [tileFilter] tiles =
|
Can only be built on [tileFilter] tiles =
|
||||||
Cannot be built on [tileFilter] tiles =
|
Cannot be built on [tileFilter] tiles =
|
||||||
Does not need removal of [feature] =
|
Does not need removal of [feature] =
|
||||||
|
Gain a free [building] [cityFilter] =
|
||||||
|
|
||||||
# City filters
|
# City filters
|
||||||
in this city =
|
in this city =
|
||||||
|
@ -10,11 +10,13 @@ class GreatPersonManager {
|
|||||||
var greatGeneralPoints = 0
|
var greatGeneralPoints = 0
|
||||||
var freeGreatPeople = 0
|
var freeGreatPeople = 0
|
||||||
|
|
||||||
val statToGreatPersonMapping = HashMap<Stat, String>().apply {
|
companion object {
|
||||||
put(Stat.Science, "Great Scientist")
|
val statToGreatPersonMapping = hashMapOf<Stat, String>(
|
||||||
put(Stat.Production, "Great Engineer")
|
Stat.Science to "Great Scientist",
|
||||||
put(Stat.Gold, "Great Merchant")
|
Stat.Production to "Great Scientist",
|
||||||
put(Stat.Culture, "Great Artist")
|
Stat.Gold to "Great Scientist",
|
||||||
|
Stat.Culture to "Great Scientist",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clone(): GreatPersonManager {
|
fun clone(): GreatPersonManager {
|
||||||
|
@ -4,6 +4,7 @@ import com.unciv.logic.city.CityConstructions
|
|||||||
import com.unciv.logic.city.CityInfo
|
import com.unciv.logic.city.CityInfo
|
||||||
import com.unciv.logic.city.IConstruction
|
import com.unciv.logic.city.IConstruction
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
|
import com.unciv.logic.civilization.GreatPersonManager
|
||||||
import com.unciv.models.Counter
|
import com.unciv.models.Counter
|
||||||
import com.unciv.models.ruleset.tile.TileImprovement
|
import com.unciv.models.ruleset.tile.TileImprovement
|
||||||
import com.unciv.models.stats.NamedStats
|
import com.unciv.models.stats.NamedStats
|
||||||
@ -11,13 +12,15 @@ import com.unciv.models.stats.Stat
|
|||||||
import com.unciv.models.stats.Stats
|
import com.unciv.models.stats.Stats
|
||||||
import com.unciv.models.translations.fillPlaceholders
|
import com.unciv.models.translations.fillPlaceholders
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
|
import com.unciv.ui.civilopedia.FormattedLine
|
||||||
|
import com.unciv.ui.civilopedia.ICivilopediaText
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.collections.HashMap
|
import kotlin.collections.HashMap
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
|
|
||||||
|
|
||||||
class Building : NamedStats(), IConstruction {
|
class Building : NamedStats(), IConstruction, ICivilopediaText {
|
||||||
|
|
||||||
var requiredTech: String? = null
|
var requiredTech: String? = null
|
||||||
|
|
||||||
@ -65,6 +68,8 @@ class Building : NamedStats(), IConstruction {
|
|||||||
var replacementTextForUniques = ""
|
var replacementTextForUniques = ""
|
||||||
val uniqueObjects: List<Unique> by lazy { uniques.map { Unique(it) } }
|
val uniqueObjects: List<Unique> by lazy { uniques.map { Unique(it) } }
|
||||||
|
|
||||||
|
override var civilopediaText = listOf<FormattedLine>()
|
||||||
|
|
||||||
fun getShortDescription(ruleset: Ruleset): String { // should fit in one line
|
fun getShortDescription(ruleset: Ruleset): String { // should fit in one line
|
||||||
val infoList = mutableListOf<String>()
|
val infoList = mutableListOf<String>()
|
||||||
val str = getStats(null).toString()
|
val str = getStats(null).toString()
|
||||||
@ -98,19 +103,12 @@ class Building : NamedStats(), IConstruction {
|
|||||||
return finalUniques
|
return finalUniques
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDescription(forBuildingPickerScreen: Boolean, cityInfo: CityInfo?, ruleset: Ruleset): String {
|
fun getDescription(cityInfo: CityInfo?, ruleset: Ruleset): String {
|
||||||
val stats = getStats(cityInfo)
|
val stats = getStats(cityInfo)
|
||||||
val stringBuilder = StringBuilder()
|
val stringBuilder = StringBuilder()
|
||||||
if (uniqueTo != null) stringBuilder.appendLine("Unique to [$uniqueTo], replaces [$replaces]".tr())
|
if (uniqueTo != null) stringBuilder.appendLine("Unique to [$uniqueTo], replaces [$replaces]".tr())
|
||||||
if (!forBuildingPickerScreen) stringBuilder.appendLine("{Cost}: $cost".tr())
|
|
||||||
if (isWonder) stringBuilder.appendLine("Wonder".tr())
|
if (isWonder) stringBuilder.appendLine("Wonder".tr())
|
||||||
if (isNationalWonder) stringBuilder.appendLine("National Wonder".tr())
|
if (isNationalWonder) stringBuilder.appendLine("National Wonder".tr())
|
||||||
if (!forBuildingPickerScreen && requiredTech != null)
|
|
||||||
stringBuilder.appendLine("Required tech: [$requiredTech]".tr())
|
|
||||||
if (!forBuildingPickerScreen && requiredBuilding != null)
|
|
||||||
stringBuilder.appendLine("Requires [$requiredBuilding] to be built in the city".tr())
|
|
||||||
if (!forBuildingPickerScreen && requiredBuildingInAllCities != null)
|
|
||||||
stringBuilder.appendLine("Requires [$requiredBuildingInAllCities] to be built in all cities".tr())
|
|
||||||
for ((resource, amount) in getResourceRequirements()) {
|
for ((resource, amount) in getResourceRequirements()) {
|
||||||
if (amount == 1) stringBuilder.appendLine("Consumes 1 [$resource]".tr()) // For now, to keep the existing translations
|
if (amount == 1) stringBuilder.appendLine("Consumes 1 [$resource]".tr()) // For now, to keep the existing translations
|
||||||
else stringBuilder.appendLine("Consumes [$amount] [$resource]".tr())
|
else stringBuilder.appendLine("Consumes [$amount] [$resource]".tr())
|
||||||
@ -197,6 +195,131 @@ class Building : NamedStats(), IConstruction {
|
|||||||
return stats
|
return stats
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun makeLink() = if (isWonder || isNationalWonder) "Wonder/$name" else "Building/$name"
|
||||||
|
override fun getCivilopediaTextHeader() = FormattedLine(name, header=2, icon=makeLink())
|
||||||
|
override fun hasCivilopediaTextLines() = true
|
||||||
|
override fun replacesCivilopediaDescription() = true
|
||||||
|
override fun getCivilopediaTextLines(ruleset: Ruleset): List<FormattedLine> {
|
||||||
|
fun Float.formatSignedInt() = (if (this > 0f) "+" else "") + this.toInt().toString()
|
||||||
|
|
||||||
|
val textList = ArrayList<FormattedLine>()
|
||||||
|
|
||||||
|
if (isWonder || isNationalWonder) {
|
||||||
|
textList += FormattedLine( if (isWonder) "Wonder" else "National Wonder", color="#CA4", header=3 )
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uniqueTo != null) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
textList += FormattedLine("Unique to [$uniqueTo]", link="Nation/$uniqueTo")
|
||||||
|
if (replaces != null) {
|
||||||
|
val replacesBuilding = ruleset.buildings[replaces]
|
||||||
|
textList += FormattedLine("Replaces [$replaces]", link=replacesBuilding?.makeLink() ?: "", indent=1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cost > 0) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
textList += FormattedLine("{Cost}: $cost")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiredTech != null || requiredBuilding != null || requiredBuildingInAllCities != null)
|
||||||
|
textList += FormattedLine()
|
||||||
|
if (requiredTech != null)
|
||||||
|
textList += FormattedLine("Required tech: [$requiredTech]",
|
||||||
|
link="Technology/$requiredTech")
|
||||||
|
if (requiredBuilding != null)
|
||||||
|
textList += FormattedLine("Requires [$requiredBuilding] to be built in the city",
|
||||||
|
link="Building/$requiredBuilding")
|
||||||
|
if (requiredBuildingInAllCities != null)
|
||||||
|
textList += FormattedLine("Requires [$requiredBuildingInAllCities] to be built in all cities",
|
||||||
|
link="Building/$requiredBuildingInAllCities")
|
||||||
|
|
||||||
|
val resourceRequirements = getResourceRequirements()
|
||||||
|
if (resourceRequirements.isNotEmpty()) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
for ((resource, amount) in resourceRequirements) {
|
||||||
|
textList += FormattedLine(
|
||||||
|
// the 1 variant should deprecate some time
|
||||||
|
if (amount == 1) "Consumes 1 [$resource]" else "Consumes [$amount] [$resource]",
|
||||||
|
link="Resources/$resource", color="#F42" )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (providesFreeBuilding != null) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
textList += FormattedLine("Provides a free [$providesFreeBuilding] in the city",
|
||||||
|
link="Building/$providesFreeBuilding")
|
||||||
|
}
|
||||||
|
|
||||||
|
val stats = this.clone()
|
||||||
|
val percentStats = getStatPercentageBonuses(null)
|
||||||
|
val specialists = newSpecialists()
|
||||||
|
if (uniques.isNotEmpty() || !stats.isEmpty() || !percentStats.isEmpty() || this.greatPersonPoints != null || specialists.isNotEmpty())
|
||||||
|
textList += FormattedLine()
|
||||||
|
|
||||||
|
if (uniques.isNotEmpty()) {
|
||||||
|
if (replacementTextForUniques.isNotEmpty())
|
||||||
|
textList += FormattedLine(replacementTextForUniques)
|
||||||
|
else
|
||||||
|
for (unique in getUniquesStrings()) textList += FormattedLine(unique)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stats.isEmpty()) {
|
||||||
|
textList += FormattedLine(stats.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!percentStats.isEmpty()) {
|
||||||
|
for ( (key, value) in percentStats.toHashMap()) {
|
||||||
|
if (value == 0f) continue
|
||||||
|
textList += FormattedLine(value.formatSignedInt() + "% {$key}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (greatPersonPoints != null) {
|
||||||
|
for ( (key, value) in greatPersonPoints!!.toHashMap()) {
|
||||||
|
if (value == 0f) continue
|
||||||
|
val gppName = GreatPersonManager.statToGreatPersonMapping[key]
|
||||||
|
?: continue
|
||||||
|
textList += FormattedLine(value.formatSignedInt() + " " + "[$gppName] points".tr(),
|
||||||
|
link = "Unit/$gppName")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (specialists.isNotEmpty()) {
|
||||||
|
for ((specialistName, amount) in specialists)
|
||||||
|
textList += FormattedLine("+$amount " + "[$specialistName] slots".tr())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiredNearbyImprovedResources != null) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
textList += FormattedLine("Requires at least one of the following resources worked near the city:")
|
||||||
|
requiredNearbyImprovedResources!!.forEach {
|
||||||
|
textList += FormattedLine(it, indent = 1, link = "Resource/$it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cityStrength != 0 || cityHealth != 0 || xpForNewUnits != 0 || maintenance != 0) textList += FormattedLine()
|
||||||
|
if (cityStrength != 0) textList += FormattedLine("{City strength} +$cityStrength")
|
||||||
|
if (cityHealth != 0) textList += FormattedLine("{City health} +$cityHealth")
|
||||||
|
if (xpForNewUnits != 0) textList += FormattedLine("+$xpForNewUnits {XP for new units}")
|
||||||
|
if (maintenance != 0) textList += FormattedLine("{Maintenance cost}: $maintenance {Gold}")
|
||||||
|
|
||||||
|
val seeAlso = ArrayList<FormattedLine>()
|
||||||
|
for ((other, building) in ruleset.buildings) {
|
||||||
|
if (building.replaces == name || building.providesFreeBuilding == name || uniques.contains("[$name]") ) {
|
||||||
|
seeAlso += FormattedLine(other, link=building.makeLink(), indent=1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (seeAlso.isNotEmpty()) {
|
||||||
|
textList += FormattedLine()
|
||||||
|
textList += FormattedLine("{See also}:")
|
||||||
|
textList += seeAlso
|
||||||
|
}
|
||||||
|
|
||||||
|
return textList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun canBePurchased(): Boolean {
|
override fun canBePurchased(): Boolean {
|
||||||
return !isWonder && !isNationalWonder && "Cannot be purchased" !in uniques
|
return !isWonder && !isNationalWonder && "Cannot be purchased" !in uniques
|
||||||
}
|
}
|
||||||
@ -399,7 +522,7 @@ class Building : NamedStats(), IConstruction {
|
|||||||
if (!civInfo.gameInfo.gameParameters.victoryTypes.contains(VictoryType.Scientific)
|
if (!civInfo.gameInfo.gameParameters.victoryTypes.contains(VictoryType.Scientific)
|
||||||
&& "Enables construction of Spaceship parts" in uniques)
|
&& "Enables construction of Spaceship parts" in uniques)
|
||||||
return "Can't construct spaceship parts if scientific victory is not enabled!"
|
return "Can't construct spaceship parts if scientific victory is not enabled!"
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.unciv.ui.cityscreen
|
package com.unciv.ui.cityscreen
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.scenes.scene2d.Touchable
|
|
||||||
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.UncivGame
|
import com.unciv.UncivGame
|
||||||
@ -65,9 +64,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS
|
|||||||
private fun addBuildingInfo(building: Building, destinationTable: Table) {
|
private fun addBuildingInfo(building: Building, destinationTable: Table) {
|
||||||
val icon = ImageGetter.getConstructionImage(building.name).surroundWithCircle(30f)
|
val icon = ImageGetter.getConstructionImage(building.name).surroundWithCircle(30f)
|
||||||
val buildingNameAndIconTable = ExpanderTab(building.name, 18, icon, false, 5f) {
|
val buildingNameAndIconTable = ExpanderTab(building.name, 18, icon, false, 5f) {
|
||||||
//todo: getDescription signature changes with civilopedia phase 5
|
val detailsString = building.getDescription(cityScreen.city, cityScreen.city.civInfo.gameInfo.ruleSet)
|
||||||
val detailsString = building.getDescription(true,
|
|
||||||
cityScreen.city, cityScreen.city.civInfo.gameInfo.ruleSet)
|
|
||||||
it.add(detailsString.toLabel().apply { wrap = true })
|
it.add(detailsString.toLabel().apply { wrap = true })
|
||||||
.width(cityScreen.stage.width / 4 - 2 * pad).row() // when you set wrap, then you need to manually set the size of the label
|
.width(cityScreen.stage.width / 4 - 2 * pad).row() // when you set wrap, then you need to manually set the size of the label
|
||||||
if (building.isSellable()) {
|
if (building.isSellable()) {
|
||||||
@ -211,7 +208,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS
|
|||||||
|
|
||||||
private fun Table.addGreatPersonPointInfo(cityInfo: CityInfo) {
|
private fun Table.addGreatPersonPointInfo(cityInfo: CityInfo) {
|
||||||
val greatPersonPoints = cityInfo.getGreatPersonPointsForNextTurn()
|
val greatPersonPoints = cityInfo.getGreatPersonPointsForNextTurn()
|
||||||
val statToGreatPerson = GreatPersonManager().statToGreatPersonMapping
|
val statToGreatPerson = GreatPersonManager.statToGreatPersonMapping
|
||||||
for (stat in Stat.values()) {
|
for (stat in Stat.values()) {
|
||||||
if (!statToGreatPerson.containsKey(stat)) continue
|
if (!statToGreatPerson.containsKey(stat)) continue
|
||||||
if (greatPersonPoints.all { it.value.get(stat) == 0f }) continue
|
if (greatPersonPoints.all { it.value.get(stat) == 0f }) continue
|
||||||
|
@ -59,7 +59,7 @@ class ConstructionInfoTable(val city: CityInfo): Table() {
|
|||||||
|
|
||||||
val description: String = when (construction) {
|
val description: String = when (construction) {
|
||||||
is BaseUnit -> construction.getDescription()
|
is BaseUnit -> construction.getDescription()
|
||||||
is Building -> construction.getDescription(true, city, city.civInfo.gameInfo.ruleSet)
|
is Building -> construction.getDescription(city, city.civInfo.gameInfo.ruleSet)
|
||||||
is PerpetualConstruction -> construction.description.replace("[rate]", "[${construction.getConversionRate(city)}]").tr()
|
is PerpetualConstruction -> construction.description.replace("[rate]", "[${construction.getConversionRate(city)}]").tr()
|
||||||
else -> "" // Should never happen
|
else -> "" // Should never happen
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.*
|
|||||||
import com.unciv.Constants
|
import com.unciv.Constants
|
||||||
import com.unciv.UncivGame
|
import com.unciv.UncivGame
|
||||||
import com.unciv.models.ruleset.Ruleset
|
import com.unciv.models.ruleset.Ruleset
|
||||||
|
import com.unciv.models.ruleset.VictoryType
|
||||||
import com.unciv.models.stats.INamed
|
import com.unciv.models.stats.INamed
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.utils.*
|
import com.unciv.ui.utils.*
|
||||||
@ -163,22 +164,31 @@ class CivilopediaScreen(
|
|||||||
val imageSize = 50f
|
val imageSize = 50f
|
||||||
onBackButtonClicked { UncivGame.Current.setWorldScreen() }
|
onBackButtonClicked { UncivGame.Current.setWorldScreen() }
|
||||||
|
|
||||||
|
val hideReligionItems = !game.gameInfo.hasReligionEnabled()
|
||||||
|
val noCulturalVictory = VictoryType.Cultural !in game.gameInfo.gameParameters.victoryTypes
|
||||||
|
|
||||||
categoryToEntries[CivilopediaCategories.Building] = ruleset.buildings.values
|
categoryToEntries[CivilopediaCategories.Building] = ruleset.buildings.values
|
||||||
.filter { "Will not be displayed in Civilopedia" !in it.uniques && !(it.isWonder || it.isNationalWonder) }
|
.filter { "Will not be displayed in Civilopedia" !in it.uniques
|
||||||
|
&& !(hideReligionItems && "Hidden when religion is disabled" in it.uniques)
|
||||||
|
&& !(noCulturalVictory && "Hidden when cultural victory is disabled" in it.uniques)
|
||||||
|
&& !(it.isWonder || it.isNationalWonder) }
|
||||||
.map {
|
.map {
|
||||||
CivilopediaEntry(
|
CivilopediaEntry(
|
||||||
it.name,
|
it.name,
|
||||||
it.getDescription(false, null, ruleset),
|
"",
|
||||||
CivilopediaCategories.Building.getImage?.invoke(it.name, imageSize),
|
CivilopediaCategories.Building.getImage?.invoke(it.name, imageSize),
|
||||||
(it as? ICivilopediaText).takeUnless { ct -> ct==null || ct.isCivilopediaTextEmpty() }
|
(it as? ICivilopediaText).takeUnless { ct -> ct==null || ct.isCivilopediaTextEmpty() }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
categoryToEntries[CivilopediaCategories.Wonder] = ruleset.buildings.values
|
categoryToEntries[CivilopediaCategories.Wonder] = ruleset.buildings.values
|
||||||
.filter { "Will not be displayed in Civilopedia" !in it.uniques && (it.isWonder || it.isNationalWonder) }
|
.filter { "Will not be displayed in Civilopedia" !in it.uniques
|
||||||
|
&& !(hideReligionItems && "Hidden when religion is disabled" in it.uniques)
|
||||||
|
&& !(noCulturalVictory && "Hidden when cultural victory is disabled" in it.uniques)
|
||||||
|
&& (it.isWonder || it.isNationalWonder) }
|
||||||
.map {
|
.map {
|
||||||
CivilopediaEntry(
|
CivilopediaEntry(
|
||||||
it.name,
|
it.name,
|
||||||
it.getDescription(false, null, ruleset),
|
"",
|
||||||
CivilopediaCategories.Wonder.getImage?.invoke(it.name, imageSize),
|
CivilopediaCategories.Wonder.getImage?.invoke(it.name, imageSize),
|
||||||
(it as? ICivilopediaText).takeUnless { ct -> ct==null || ct.isCivilopediaTextEmpty() }
|
(it as? ICivilopediaText).takeUnless { ct -> ct==null || ct.isCivilopediaTextEmpty() }
|
||||||
)
|
)
|
||||||
|
@ -212,7 +212,7 @@ class FormattedLine (
|
|||||||
}
|
}
|
||||||
if (textToDisplay.isNotEmpty()) {
|
if (textToDisplay.isNotEmpty()) {
|
||||||
val usedWidth = iconCount * (iconSize + iconPad)
|
val usedWidth = iconCount * (iconSize + iconPad)
|
||||||
val padIndent = when {
|
val indentWidth = when {
|
||||||
centered -> -usedWidth
|
centered -> -usedWidth
|
||||||
indent == 0 && iconCount == 0 -> 0f
|
indent == 0 && iconCount == 0 -> 0f
|
||||||
indent == 0 -> iconPad
|
indent == 0 -> iconPad
|
||||||
@ -224,10 +224,10 @@ class FormattedLine (
|
|||||||
label.setAlignment(align)
|
label.setAlignment(align)
|
||||||
if (labelWidth == 0f)
|
if (labelWidth == 0f)
|
||||||
table.add(label)
|
table.add(label)
|
||||||
.padLeft(padIndent).align(align)
|
.padLeft(indentWidth).align(align)
|
||||||
else
|
else
|
||||||
table.add(label).width(labelWidth - usedWidth - padIndent)
|
table.add(label).width(labelWidth - usedWidth - indentWidth)
|
||||||
.padLeft(padIndent).align(align)
|
.padLeft(indentWidth).align(align)
|
||||||
}
|
}
|
||||||
return table
|
return table
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color
|
|||||||
import com.badlogic.gdx.scenes.scene2d.ui.Slider
|
import com.badlogic.gdx.scenes.scene2d.ui.Slider
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
|
import com.unciv.logic.civilization.GreatPersonManager
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.utils.*
|
import com.unciv.ui.utils.*
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@ -120,7 +121,7 @@ class StatsOverviewTable (
|
|||||||
greatPeopleTable.add("Current points".tr())
|
greatPeopleTable.add("Current points".tr())
|
||||||
greatPeopleTable.add("Points per turn".tr()).row()
|
greatPeopleTable.add("Points per turn".tr()).row()
|
||||||
|
|
||||||
val mapping = viewingPlayer.greatPeople.statToGreatPersonMapping
|
val mapping = GreatPersonManager.statToGreatPersonMapping
|
||||||
for(entry in mapping){
|
for(entry in mapping){
|
||||||
greatPeopleTable.add(entry.value.tr())
|
greatPeopleTable.add(entry.value.tr())
|
||||||
greatPeopleTable.add(greatPersonPoints[entry.key]!!.toInt().toString()+"/"+pointsToGreatPerson)
|
greatPeopleTable.add(greatPersonPoints[entry.key]!!.toInt().toString()+"/"+pointsToGreatPerson)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user