From 5943d1e12ecba7c8eeee1818990d957f04a40688 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 13 Jun 2019 22:10:52 +0300 Subject: [PATCH] Apollo Program is now a NATIONAL wonder, so multiple civs can compete for Science Victory --- android/assets/jsons/Buildings.json | 12 ++++++------ android/assets/jsons/Translations/Other.json | 4 ++++ core/src/com/unciv/logic/automation/Automation.kt | 4 ++-- .../src/com/unciv/logic/city/CityConstructions.kt | 2 +- core/src/com/unciv/models/gamebasics/Building.kt | 15 ++++++++------- .../src/com/unciv/models/gamebasics/GameBasics.kt | 2 +- .../unciv/models/gamebasics/tech/Technology.kt | 4 ++-- core/src/com/unciv/ui/cityscreen/CityInfoTable.kt | 4 ++-- .../com/unciv/ui/cityscreen/ConstructionsTable.kt | 5 +++++ 9 files changed, 31 insertions(+), 21 deletions(-) diff --git a/android/assets/jsons/Buildings.json b/android/assets/jsons/Buildings.json index 4de62a4681..37776d29a9 100644 --- a/android/assets/jsons/Buildings.json +++ b/android/assets/jsons/Buildings.json @@ -2,7 +2,7 @@ // Ancient Era { name:"Palace", - isWonder:true, + isNationalWonder:true, production:3, science:3, gold:3, @@ -159,7 +159,7 @@ name:"Circus Maximus", happiness:5, culture:1, - isWonder:true, + isNationalWonder:true, requiredBuildingInAllCities:"Colosseum", requiredTech:"Horseback Riding" }, @@ -292,7 +292,7 @@ name:"National College", science:3, culture:1, - isWonder:true, + isNationalWonder:true, percentStatBonus:{science:50}, requiredBuildingInAllCities:"Library", requiredTech:"Civil Service" @@ -367,7 +367,7 @@ science:3, culture:1, freeTechs:1, - isWonder:true, + isNationalWonder:true, percentStatBonus:{science:50}, requiredBuildingInAllCities:"University", requiredTech:"Education" @@ -555,7 +555,7 @@ name:"Hermitage", percentStatBonus:{culture:50}, culture:5, - isWonder:true, + isNationalWonder:true, requiredBuildingInAllCities:"Opera House", requiredTech:"Archaeology" }, @@ -794,7 +794,7 @@ { name:"Apollo Program", cost:1500, - isWonder:true, + isNationalWonder:true, uniques:["Enables construction of Spaceship parts"], requiredTech:"Rocketry" }, diff --git a/android/assets/jsons/Translations/Other.json b/android/assets/jsons/Translations/Other.json index 456be6d825..c966c51159 100644 --- a/android/assets/jsons/Translations/Other.json +++ b/android/assets/jsons/Translations/Other.json @@ -1090,6 +1090,8 @@ Japanese:"ワンダー" } + "National Wonder":{} + "Wonders enabled":{ Italian:"Meraviglie sbloccate" Russian:"Активные чудеса" @@ -1561,6 +1563,8 @@ Simplified_Chinese:"奇观" Portuguese:"Maravilhas" } + + "National Wonders":{} "Specialist Buildings":{ Italian:"Edifici specialisti" diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index c699cc9683..a15c7a1c7f 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -87,8 +87,8 @@ class Automation { cityConstructions.run { if (getCurrentConstruction() !is SpecialConstruction) return // don't want to be stuck on these forever - val buildableNotWonders = getBuildableBuildings().filterNot { it.isWonder } - val buildableWonders = getBuildableBuildings().filter { it.isWonder } + val buildableNotWonders = getBuildableBuildings().filterNot { it.isWonder || it.isNationalWonder } + val buildableWonders = getBuildableBuildings().filter { it.isWonder || it.isNationalWonder } val civUnits = cityInfo.civInfo.getCivUnits() val militaryUnits = civUnits.filter { !it.type.isCivilian()}.size diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index bc82835a3b..2bf9f41e83 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -182,7 +182,7 @@ class CityConstructions { construction.postBuildEvent(this) inProgressConstructions.remove(currentConstruction) - if (construction is Building && construction.isWonder && construction.requiredBuildingInAllCities == null) { + if (construction is Building && construction.requiredBuildingInAllCities == null) { for (civ in cityInfo.civInfo.gameInfo.civilizations) { if (civ.exploredTiles.contains(cityInfo.location)) civ.addNotification("[$currentConstruction] has been built in [${cityInfo.name}]", cityInfo.location, Color.BROWN) diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index 7d1d6a79d6..26d286244d 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -24,6 +24,7 @@ class Building : NamedStats(), IConstruction{ /** Extra cost percentage when purchasing */ var hurryCostModifier: Int = 0 var isWonder = false + var isNationalWonder = false var requiredBuilding: String? = null var requiredBuildingInAllCities: String? = null /** A strategic resource that will be consumed by this building */ @@ -78,6 +79,7 @@ class Building : NamedStats(), IConstruction{ if(uniqueTo!=null) stringBuilder.appendln("Unique to [$uniqueTo], replaces [$replaces]".tr()) if (!forBuildingPickerScreen) stringBuilder.appendln("{Cost}: $cost".tr()) if (isWonder) stringBuilder.appendln("Wonder".tr()) + if(isNationalWonder) stringBuilder.appendln("National Wonder".tr()) if (!forBuildingPickerScreen && requiredTech != null) stringBuilder.appendln("Required tech: [$requiredTech]".tr()) if (!forBuildingPickerScreen && requiredBuilding != null) @@ -165,7 +167,7 @@ class Building : NamedStats(), IConstruction{ } override fun canBePurchased(): Boolean { - return !isWonder + return !isWonder && !isNationalWonder } override fun getProductionCost(adoptedPolicies: HashSet): Int { @@ -219,7 +221,7 @@ class Building : NamedStats(), IConstruction{ if (requiredTech != null && !civInfo.tech.isResearched(requiredTech!!)) return "$requiredTech not researched" // Regular wonders - if (isWonder && requiredBuildingInAllCities==null){ + if (isWonder){ if(civInfo.gameInfo.civilizations.flatMap { it.cities } .any {it.cityConstructions.isBuilt(name)}) return "Wonder is already built" @@ -233,16 +235,15 @@ class Building : NamedStats(), IConstruction{ // National wonders - if(requiredBuildingInAllCities!=null) { - + if(isNationalWonder) { if (civInfo.cities.any {it.cityConstructions.isBuilt(name) }) - return "Wonder is already built" + return "National Wonder is already built" if (civInfo.cities.any { !it.cityConstructions.containsBuildingOrEquivalent(requiredBuildingInAllCities!!) }) return "Requires a [$requiredBuildingInAllCities] in all cities" if (civInfo.cities.any {it!=construction.cityInfo && it.cityConstructions.isBeingConstructed(name) }) - return "Wonder is being built elsewhere" + return "National Wonder is being built elsewhere" if(civInfo.isCityState()) - return "No world wonders for city-states" + return "No national wonders for city-states" } if (requiredBuilding != null && !construction.containsBuildingOrEquivalent(requiredBuilding!!)) diff --git a/core/src/com/unciv/models/gamebasics/GameBasics.kt b/core/src/com/unciv/models/gamebasics/GameBasics.kt index eb0b43d9ae..bf65702249 100644 --- a/core/src/com/unciv/models/gamebasics/GameBasics.kt +++ b/core/src/com/unciv/models/gamebasics/GameBasics.kt @@ -60,7 +60,7 @@ object GameBasics { if (building.requiredTech == null) continue val column = building.getRequiredTech().column if (building.cost == 0) - building.cost = if (building.isWonder) column!!.wonderCost else column!!.buildingCost + building.cost = if (building.isWonder || building.isNationalWonder) column!!.wonderCost else column!!.buildingCost } for (branch in PolicyBranches.values) { diff --git a/core/src/com/unciv/models/gamebasics/tech/Technology.kt b/core/src/com/unciv/models/gamebasics/tech/Technology.kt index 70dd9040cc..922888c2be 100644 --- a/core/src/com/unciv/models/gamebasics/tech/Technology.kt +++ b/core/src/com/unciv/models/gamebasics/tech/Technology.kt @@ -39,13 +39,13 @@ class Technology : ICivilopedia { } val replacedBuildings = enabledBuildings.mapNotNull { it.replaces } enabledBuildings = enabledBuildings.filter { it.name !in replacedBuildings } - val regularBuildings = enabledBuildings.filter { !it.isWonder } + val regularBuildings = enabledBuildings.filter { !it.isWonder && !it.isNationalWonder } if (regularBuildings.isNotEmpty()) { lineList += "{Buildings enabled}: " for (building in regularBuildings) lineList += "* " + building.name.tr() + " (" + building.getShortDescription() + ")" } - val wonders = enabledBuildings.filter { it.isWonder } + val wonders = enabledBuildings.filter { it.isWonder || it.isNationalWonder } if (wonders.isNotEmpty()) { lineList += "{Wonders enabled}: " for (wonder in wonders) diff --git a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt index 046b51778f..4c9ae9df26 100644 --- a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt @@ -63,7 +63,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS cityScreen.city.civInfo) wonderDetailsTable.add(detailsString.toLabel().apply { setWrap(true)}) .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.isWonder) { + if(!building.isWonder && !building.isNationalWonder) { val sellAmount = cityScreen.city.getGoldForSellingBuilding(building.name) val sellBuildingButton = TextButton("Sell for [$sellAmount] gold".tr(),skin) wonderDetailsTable.add(sellBuildingButton).pad(5f).row() @@ -90,7 +90,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS for (building in cityInfo.cityConstructions.getBuiltBuildings()) { when { - building.isWonder -> wonders.add(building) + building.isWonder || building.isNationalWonder -> wonders.add(building) building.specialistSlots != null -> specialistBuildings.add(building) else -> otherBuildings.add(building) } diff --git a/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt b/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt index 03bf5b9e1b..aae1728466 100644 --- a/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt +++ b/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt @@ -97,7 +97,9 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre constructionPickerTable.addCategory("Units",units) val buildableWonders = ArrayList() + val buildableNationalWonders = ArrayList
() val buildableBuildings = ArrayList
() + for (building in GameBasics.Buildings.values) { if (!building.shouldBeDisplayed(cityConstructions) && building.name != cityConstructions.currentConstruction) continue val productionTextButton = getProductionButton(building.name, @@ -106,11 +108,14 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre ) if (building.isWonder) buildableWonders += productionTextButton + else if(building.isNationalWonder) + buildableNationalWonders += productionTextButton else buildableBuildings += productionTextButton } constructionPickerTable.addCategory("Wonders",buildableWonders) + constructionPickerTable.addCategory("National Wonders",buildableNationalWonders) constructionPickerTable.addCategory("Buildings",buildableBuildings) val specialConstructions = ArrayList
()