From 1227a47ea2f5ab42ac5f8f0e2d28120a0822ef96 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 30 Aug 2018 18:07:04 +0300 Subject: [PATCH] Added nations of Russia, Rome and Arabia! --- Credits.md | 4 +- android/Images/BuildingIcons/Bazaar.png | Bin 0 -> 2091 bytes android/Images/UnitIcons/Ballista.png | Bin 0 -> 2332 bytes android/Images/UnitIcons/Crossbowman.png | Bin 2896 -> 2121 bytes android/assets/jsons/Buildings.json | 69 +++++++++--------- android/assets/jsons/Nations.json | 22 ++++++ android/assets/jsons/Translations.json | 22 ++++-- android/assets/jsons/Units.json | 19 ++++- core/src/com/unciv/logic/city/CityInfo.kt | 15 +++- core/src/com/unciv/logic/city/CityStats.kt | 3 +- .../logic/civilization/CivilizationInfo.kt | 2 +- core/src/com/unciv/logic/map/TileInfo.kt | 19 ++++- .../com/unciv/models/gamebasics/Building.kt | 24 +++--- .../src/com/unciv/models/gamebasics/Nation.kt | 1 + .../models/gamebasics/tile/TileImprovement.kt | 2 +- core/src/com/unciv/ui/NewGameScreen.kt | 12 ++- 16 files changed, 145 insertions(+), 69 deletions(-) create mode 100644 android/Images/BuildingIcons/Bazaar.png create mode 100644 android/Images/UnitIcons/Ballista.png diff --git a/Credits.md b/Credits.md index a592a6096c..0592d2b357 100644 --- a/Credits.md +++ b/Credits.md @@ -24,7 +24,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Spear](https://thenounproject.com/search/?q=Spear&i=11432) By Stephen Copinger * [Spear](https://thenounproject.com/search/?q=Spear&i=1233840) By Alvaro Cabrera * [Catapult](https://thenounproject.com/search/?q=Spear&i=1233840) By Jakub Ukrop -* [Crossbow](https://thenounproject.com/search/?q=Crossbow&i=964657) By Creaticca Creative Agency +* [Crossbow](https://thenounproject.com/term/crossbow/965389/) By Creaticca Creative Agency * [Trebuchet](https://thenounproject.com/search/?q=Trebuchet&i=827987) By Ben Davis * [Knight](https://thenounproject.com/search/?q=Knight&i=30912) By Tyler Glaude * [Lance](https://thenounproject.com/search/?q=Lance&i=440122) By parkjisun @@ -37,6 +37,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Horse](https://thenounproject.com/search/?q=Horse&i=1023745) By Bakunetso Kaito * [Artillery](https://thenounproject.com/search/?q=Artillery&i=1165261) By Creative Mania * [Rapier](https://thenounproject.com/search/?q=musketeer&i=819822) By Hamish +* [Unloaded Crossbow](https://thenounproject.com/term/unloaded-crossbow/815992/) By Hamish ## Resources @@ -143,6 +144,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Chemistry](https://thenounproject.com/term/chemistry/175847/) By Creative Stall * [Solar panel](https://thenounproject.com/term/solar-panel/154447/) By Andrew J. Young * [Cathedral](https://thenounproject.com/term/cathedral/1325415/) By Dairy Free Design +* [Bazaar](https://thenounproject.com/term/bazaar/902288/) By Tokka Elkholy ## Others diff --git a/android/Images/BuildingIcons/Bazaar.png b/android/Images/BuildingIcons/Bazaar.png new file mode 100644 index 0000000000000000000000000000000000000000..475390793c2684d4a62f99f4ed33401daef133b9 GIT binary patch literal 2091 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 Ef-)dOjsO4v diff --git a/android/assets/jsons/Buildings.json b/android/assets/jsons/Buildings.json index 04b06ac3cb..f297b8642a 100644 --- a/android/assets/jsons/Buildings.json +++ b/android/assets/jsons/Buildings.json @@ -58,7 +58,7 @@ name:"Library", hurryCostModifier:25, maintenance:1, - unique:"+1 Science Per 2 Population", + uniques:["+1 Science Per 2 Population"], requiredTech:"Writing" }, { @@ -67,7 +67,7 @@ uniqueTo:"China", hurryCostModifier:25, gold:2, - unique:"+1 Science Per 2 Population", + uniques:["+1 Science Per 2 Population"], requiredTech:"Writing" }, { @@ -90,7 +90,7 @@ culture:1, greatPersonPoints:{production:1}, isWonder:true, - unique:"Worker construction increased 25%, provides 2 free workers", + uniques:["Worker construction increased 25%","Provides 2 free workers"], requiredTech:"Mathematics" }, { @@ -126,7 +126,7 @@ culture:3, greatPersonPoints:{science:1}, isWonder:true, - unique:"Free Social Policy", + uniques:["Free Social Policy"], requiredTech:"Philosophy" }, { @@ -143,7 +143,7 @@ culture:1, greatPersonPoints:{production:1}, isWonder:true, - unique:"Golden Age length increases +50%", + uniques:["Golden Age length increases +50%"], requiredTech:"Civil Service" }, { @@ -185,6 +185,17 @@ percentStatBonus:{gold:25}, requiredTech:"Currency" }, + { + name:"Bazaar", + replaces:"Market", + uniqueTo:"Arabia", + gold:2, + specialistSlots:{gold:1}, + hurryCostModifier:25, + percentStatBonus:{gold:25}, + uniques:["Provides 1 extra copy of each improved luxury resource near this City","+2 Gold for each source of Oil and oasis"], + requiredTech:"Currency" + }, { name:"Monastery", maintenance:0, @@ -203,11 +214,10 @@ }, { name:"Hagia Sophia", - baseDescription: "+33% great person generation in all cities", culture:1, greatPersonPoints:{culture:1}, isWonder:true, - unique:"+33% great person generation in all cities", + uniques:["+33% great person generation in all cities"], requiredTech:"Theology" }, { @@ -220,20 +230,18 @@ }, { name:"Machu Pichu", - baseDescription: "Gold from all trade routes +25%", gold:5, greatPersonPoints:{gold:1}, culture:1, isWonder:true, - unique:"Gold from all trade routes +25%", + uniques:["Gold from all trade routes +25%"], requiredTech:"Guilds" }, { name:"Aqueduct", - baseDescription: "40% of food is carried over after a new citizen is born", maintenance:1, hurryCostModifier:25, - unique:"40% of food is carried over after a new citizen is born" + uniques:["40% of food is carried over after a new citizen is born"] requiredTech:"Engineering" }, { @@ -255,18 +263,16 @@ }, { name:"University", - baseDescription: "Jungles provide +2 science", maintenance:2, hurryCostModifier:15, percentStatBonus:{science:33}, specialistSlots:{science:2}, requiredBuilding:"Library", - unique:"Jungles provide +2 science", + uniques:["Jungles provide +2 science"], requiredTech:"Education" }, { name:"Oxford University", - baseDescription: "+50% science from this city", science:3, culture:1, freeTechs:1, @@ -288,16 +294,15 @@ culture:1, greatPersonPoints:{production:1}, isWonder:true, - unique:"Cost of acquiring new tiles reduced by 25%", + uniques:["Cost of acquiring new tiles reduced by 25%"], requiredTech:"Chivalry" }, { name:"Porcelain Tower", - baseDescription: "A free great scientist appears, production to science conversion in cities increased by 33%", culture:1, greatPersonPoints:{science:2}, isWonder:true, - unique:"ScienceConversionIncrease", + uniques:["Free great scientist appears","Production to science conversion in cities increased by 33%"], requiredTech:"Architecture" }, { @@ -338,7 +343,7 @@ name:"Sistine Chapel", culture:1, isWonder:true, - unique:"Culture in all cities increased by 25%", + uniques:["Culture in all cities increased by 25%"], requiredTech:"Acoustics" }, { @@ -354,7 +359,7 @@ name:"Forbidden Palace", culture:1, isWonder:true, - unique:"Unhappiness from population decreased by 10%", + uniques:["Unhappiness from population decreased by 10%"], requiredTech:"Banking" }, { @@ -371,7 +376,7 @@ culture:1, happiness:4, isWonder:true, - unique:"Empire enters golden age", + uniques:["Empire enters golden age"], requiredTech:"Architecture" }, { @@ -406,18 +411,17 @@ culture:1, happiness:4, isWonder:true, - unique:"Free Great Artist Appears", + uniques:["Free Great Artist Appears"], requiredTech:"Archaeology" }, { name:"Public School", - baseDescription: "+1 science per 2 population", science:3, specialistSlots:{science:1}, requiredBuilding:"University", maintenance:3, hurryCostModifier:0, - unique:"+1 Science Per 2 Population", + uniques:["+1 Science Per 2 Population"], requiredTech:"Scientific Theory" }, { @@ -450,10 +454,9 @@ }, { name:"Cristo Redentor", - baseDescription: "Culture cost of adopting new Policies reduced by 10%", culture:5, isWonder:true, - unique:"Culture cost of adopting new Policies reduced by 10%", + uniques:["Culture cost of adopting new Policies reduced by 10%"], requiredTech:"Flight" }, { @@ -478,7 +481,7 @@ culture:1, happiness:5 isWonder:true, - unique:"Provides 1 happiness per social policy", + uniques:["Provides 1 happiness per social policy"], requiredTech:"Radio" }, { @@ -520,13 +523,13 @@ maintenance:3, cannotBeBuiltWith:"Nuclear Plant", requiredTech:"Ecology", - unique:"Must be next to desert" + uniques:["Must be next to desert"] }, { name:"Apollo Program", cost:1500, isWonder:true, - unique:"Enables construction of Spaceship parts", + uniques:["Enables construction of Spaceship parts"], requiredTech:"Rocketry" }, { @@ -544,31 +547,31 @@ production:3, requiredResource:"Aluminum", cost:360, - unique:"Increases production of spaceship parts by 50%" + uniques:["Increases production of spaceship parts by 50%"] requiredTech:"Robotics" }, { name:"SS Booster", requiredResource:"Aluminum", requiredTech:"Robotics", - unique:"Spaceship part" + uniques:["Spaceship part"] }, { name:"SS Cockpit", requiredResource:"Aluminum", requiredTech:"Satellites", - unique:"Spaceship part" + uniques:["Spaceship part"] }, { name:"SS Engine", requiredResource:"Aluminum", requiredTech:"Particle Physics", - unique:"Spaceship part" + uniques:["Spaceship part"] }, { name:"SS Statis Chamber", requiredResource:"Aluminum", requiredTech:"Nanotechnology", - unique:"Spaceship part" + uniques:["Spaceship part"] } ] \ No newline at end of file diff --git a/android/assets/jsons/Nations.json b/android/assets/jsons/Nations.json index 949741b499..eff36dccdd 100644 --- a/android/assets/jsons/Nations.json +++ b/android/assets/jsons/Nations.json @@ -41,6 +41,28 @@ "Dijon","Amiens","Cherbourg","Poitiers","Toulouse","Bayonne","Strasbourg","Brest","Bordeaux","Rennes", "Nice","Saint Etienne","Nantes","Reims","Le Mans","Montpellier","Limoges","Nancy","Lille","Caen"] }, + { + name:"Russia", + mainColor:[ 255, 215, 0], + unique:"Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity", + cities:["Moscow","St. Petersburg","Novgorod","Rostov","Yaroslavl","Yekaterinburg","Yakutsk","Vladivostok","Smolensk","Orenburg", + "Krasnoyarsk","Khabarovsk","Bryansk","Tver","Novosibirsk","Magadan","Murmansk","Irkutsk","Chita","Samara", + "Arkhangelsk","Chelyabinsk","Tobolsk","Vologda","Omsk","Astrakhan","Kursk","Saratov","Tula","Vladimir"] + }, + { + name:"Rome", + mainColor:[ 75,0,130], + cities:["Rome","Antium","Cumae","Neapolis","Ravenna","Arretium","Mediolanum","Arpinum","Circei","Setia", + "Satricum","Ardea","Ostia","Velitrae","Viroconium","Tarentum","Brundisium","Caesaraugusta","Caesarea","Palmyra", + "Signia","Aquileia","Clusium","Sutrium","Cremona","Placentia","Hispalis","Artaxata","Aurelianorum","Nicopolis"] + }, + { + name:"Arabia", + mainColor:[ 0,100,0], + cities:["Mecca","Medina","Damascus","Baghdad","Najran","Kufah","Basra","Khurasan","Anjar","Fustat", + "Aden","Yamama","Muscat","Mansura","Bukhara","Fez","Shiraz","Merw","Balkh","Mosul", + "Aydab","Bayt","Suhar","Taif","Hama","Tabuk","Sana'a","Shihr","Tripoli","Tunis"] + }, { name:"Barbarians", mainColor:[200,200,200] diff --git a/android/assets/jsons/Translations.json b/android/assets/jsons/Translations.json index aff51e8699..7d8f8f8e81 100644 --- a/android/assets/jsons/Translations.json +++ b/android/assets/jsons/Translations.json @@ -2072,13 +2072,21 @@ German:"+1 Erforschung pro 2 Bewohner" Dutch:"+1 Wetenschap per 2 Populatie" } - "Worker construction increased 25%, provides 2 free workers":{ - Italian:"+25% velocità costruzione lavoratori, offre 2 lavoratori liberi" - Russian:"Увеличивает на 25% скорость создания улучшений на клетках , предоставляет 2 бесплатных рабочих" - French:"La construction des travailleurs a augmenté de 25%, fournit 2 travailleurs libres" - Romanian:"Lucrările de construcție a crescut cu 25%, oferă 2 lucrători liberi" - German:"Arbeiterproduktion um 25% erhöht, gibt 2 freie Arbeiter" - Dutch:"Werkerproducktie met 25% vehoogt, geeft 2 gratis werkers" + "Worker construction increased 25%":{ + Italian:"+25% velocità costruzione lavoratori" + Russian:"Увеличивает на 25% скорость создания улучшений на клетках" + French:"La construction des travailleurs a augmenté de 25%" + Romanian:"Lucrările de construcție a crescut cu 25%" + German:"Arbeiterproduktion um 25% erhöht" + Dutch:"Werkerproducktie met 25% vehoogt" + } + "Provides 2 free workers":{ + Italian:"Offre 2 lavoratori liberi" + Russian:"предоставляет 2 бесплатных рабочих" + French:"Fournit 2 travailleurs libres" + Romanian:"Oferă 2 lucrători liberi" + German:"Gibt 2 freie Arbeiter" + Dutch:"Geeft 2 gratis werkers" } "Free Social Policy":{ Italian:"Politica sociale gratuita" diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index ec1ad28223..cd588baf7d 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -104,6 +104,21 @@ uniques:["Bonus vs City 200%","No defensive terrain bonus","Must set up to ranged attack"], hurryCostModifier:20 }, + { + name:"Ballista", + unitType:"Siege", + uniqueTo:"Rome", + replaces:"Horseman", + movement:2, + strength:8, + rangedStrength:10, + cost: 75, + requiredTech:"Mathematics", + obsoleteTech:"Physics", + upgradesTo: "Trebuchet", + uniques:["Bonus vs City 200%","No defensive terrain bonus","Must set up to ranged attack"], + hurryCostModifier:20 + }, { name:"Swordsman", unitType:"Melee", @@ -130,11 +145,11 @@ { name:"Companion Cavalry", unitType:"Mounted", + uniqueTo:"Greece", + replaces:"Horseman", movement:5, strength:14, cost: 75, - uniqueTo:"Greece", - replaces:"Horseman", requiredTech:"Horseback Riding", requiredResource:"Horses", uniques:["Can move after attacking","No defensive terrain bonus","Penalty vs City 33%" ], diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 731d0aab22..b5f2b597d5 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -95,11 +95,18 @@ class CityInfo { val resource = tileInfo.getTileResource() if(resource.revealedBy!=null && !civInfo.tech.isResearched(resource.revealedBy!!)) continue if (resource.improvement == tileInfo.improvement || tileInfo.isCityCenter()){ + var amountToAdd = 1 if(resource.resourceType == ResourceType.Strategic){ - if(civInfo.policies.isAdopted("Facism")) cityResources.add(resource, 4) - else cityResources.add(resource, 2) + amountToAdd = 2 + if(civInfo.policies.isAdopted("Facism")) amountToAdd*=2 + if(civInfo.getNation().unique=="Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity" + && resource.name in listOf("Horses","Iron","Uranium")) + amountToAdd*=2 } - else cityResources.add(resource, 1) + if(resource.resourceType == ResourceType.Luxury + && getBuildingUniques().contains("Provides 1 extra copy of each improved luxury resource near this City")) + amountToAdd*=2 + cityResources.add(resource, amountToAdd) } } @@ -112,7 +119,7 @@ class CityInfo { return cityResources } - fun getBuildingUniques(): List = cityConstructions.getBuiltBuildings().filter { it.unique != null }.map { it.unique } + fun getBuildingUniques(): List = cityConstructions.getBuiltBuildings().flatMap { it.uniques } fun getGreatPersonPoints(): Stats { var greatPersonPoints = population.getSpecialists().times(3f) diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index b91267d27a..b7656adce7 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -48,7 +48,8 @@ class CityStats { "Gold" -> stats.gold += production / 4 "Science" -> { var scienceProduced = production / 4 - if (cityInfo.civInfo.getBuildingUniques().contains("ScienceConversionIncrease")) scienceProduced *= 1.33f + if (cityInfo.civInfo.getBuildingUniques().contains("Production to science conversion in cities increased by 33%")) + scienceProduced *= 1.33f if (cityInfo.civInfo.policies.isAdopted("Rationalism")) scienceProduced *= 1.33f stats.science += scienceProduced } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 20a11eb5b0..fd18b8076c 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -174,7 +174,7 @@ class CivilizationInfo { return civResources } - fun getBuildingUniques(): List = cities.flatMap { it.cityConstructions.getBuiltBuildings().map { it.unique }.filterNotNull() }.distinct() + fun getBuildingUniques(): List = cities.flatMap { it.getBuildingUniques()}.distinct() fun getCivUnits(): List { return units diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 33420ac409..a0f009a95d 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -5,6 +5,7 @@ import com.unciv.UnCivGame import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.gamebasics.GameBasics +import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.models.gamebasics.tile.Terrain import com.unciv.models.gamebasics.tile.TileImprovement import com.unciv.models.gamebasics.tile.TileResource @@ -107,11 +108,15 @@ open class TileInfo { var stats = getBaseTerrain().clone() if (terrainFeature != null) { - val terrainFeature = getTerrainFeature() - if (terrainFeature!!.overrideStats) - stats = terrainFeature.clone() + val terrainFeatureBase = getTerrainFeature() + if (terrainFeatureBase!!.overrideStats) + stats = terrainFeatureBase.clone() else - stats.add(terrainFeature) + stats.add(terrainFeatureBase) + + if(terrainFeature=="Oasis" && city!=null + && city.getBuildingUniques().contains("+2 Gold for each source of Oil and oasis")) + stats.gold += 2 } if (hasViewableResource(observingCiv)) { @@ -120,6 +125,12 @@ open class TileInfo { if (resource.building != null && city != null && city.cityConstructions.isBuilt(resource.building!!)) { stats.add(resource.getBuilding()!!.resourceBonusStats!!) // resource-specific building (eg forge, stable) bonus } + if(resource.resourceType==ResourceType.Strategic + && observingCiv.getNation().unique=="Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity") + stats.production+=1 + if(resource.name=="Oil" && city!=null + && city.getBuildingUniques().contains("+2 Gold for each source of Oil and oasis")) + stats.gold += 2 } val improvement = getTileImprovement() diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index 3d01ea6623..b8a7de07ed 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -38,7 +38,7 @@ class Building : NamedStats(), IConstruction{ // Uniques var providesFreeBuilding: String? = null var freeTechs: Int = 0 - var unique: String? = null // for wonders which have individual functions that are totally unique + var uniques = ArrayList() /** @@ -57,7 +57,7 @@ class Building : NamedStats(), IConstruction{ // buildings that improve resources infoList += improvedResources.joinToString()+ " {provide} ".tr()+ resourceBonusStats.toString() } - if(unique!=null) infoList += unique!!.tr() + infoList += uniques.map { it.tr() }.joinToString { "\n" } if(cityStrength!=0) infoList+="{City strength} +".tr()+cityStrength if(cityHealth!=0) infoList+="{City health} +".tr()+cityHealth if(xpForNewUnits!=0) infoList+= "+$xpForNewUnits {XP for new units}".tr() @@ -112,7 +112,7 @@ class Building : NamedStats(), IConstruction{ stringBuilder.appendln("Requires a $requiredBuildingInAllCities to be built in all cities") if (providesFreeBuilding != null) stringBuilder.appendln("Provides a free $providesFreeBuilding in this city") - if(unique!=null) stringBuilder.appendln(unique!!.tr()) + if(uniques.isNotEmpty()) stringBuilder.appendln(uniques.map { it.tr() }.joinToString { "\n" }) if (stats.toString() != "") stringBuilder.appendln(stats) if (this.percentStatBonus != null) { @@ -174,7 +174,8 @@ class Building : NamedStats(), IConstruction{ return false if (cannotBeBuiltWith != null && construction.isBuilt(cannotBeBuiltWith!!)) return false - if ("Must be next to desert" == unique && !construction.cityInfo.getCenterTile().getTilesInDistance(1).any { it.baseTerrain == "Desert" }) + if ("Must be next to desert" in uniques + && !construction.cityInfo.getCenterTile().getTilesInDistance(1).any { it.baseTerrain == "Desert" }) return false if (requiredResource != null && !civInfo.getCivResources().containsKey(GameBasics.TileResources[requiredResource!!])) return false @@ -191,7 +192,7 @@ class Building : NamedStats(), IConstruction{ if (!containsResourceWithImprovement) return false } - if ("Spaceship part" == unique) { + if ("Spaceship part" in uniques) { if (!civInfo.getBuildingUniques().contains("Enables construction of Spaceship parts")) return false if (civInfo.scienceVictory.unconstructedParts()[name] == 0) return false // Don't need to build any more of these! } @@ -201,7 +202,7 @@ class Building : NamedStats(), IConstruction{ override fun postBuildEvent(construction: CityConstructions) { val civInfo = construction.cityInfo.civInfo - if (unique == "Spaceship part") { + if ("Spaceship part" in uniques) { civInfo.scienceVictory.currentParts.add(name, 1) return } @@ -209,14 +210,15 @@ class Building : NamedStats(), IConstruction{ if (providesFreeBuilding != null && !construction.builtBuildings.contains(providesFreeBuilding!!)) construction.builtBuildings.add(providesFreeBuilding!!) - when (unique) { - "Empire enters golden age" -> civInfo.goldenAges.enterGoldenAge() - "Free Great Artist Appears" -> civInfo.addGreatPerson("Great Artist") - "Worker construction increased 25%, provides 2 free workers" -> { + when { + "Empire enters golden age" in uniques-> civInfo.goldenAges.enterGoldenAge() + "Free Great Artist Appears" in uniques-> civInfo.addGreatPerson("Great Artist") + "Free great scientist appears" in uniques -> civInfo.addGreatPerson("Great Scientist") + "Provides 2 free workers" in uniques -> { civInfo.placeUnitNearTile(construction.cityInfo.location, "Worker") civInfo.placeUnitNearTile(construction.cityInfo.location, "Worker") } - "Free Social Policy" -> { + "Free Social Policy" in uniques -> { civInfo.policies.freePolicies++ } } diff --git a/core/src/com/unciv/models/gamebasics/Nation.kt b/core/src/com/unciv/models/gamebasics/Nation.kt index 69913e213f..319b3da5a8 100644 --- a/core/src/com/unciv/models/gamebasics/Nation.kt +++ b/core/src/com/unciv/models/gamebasics/Nation.kt @@ -7,6 +7,7 @@ import com.unciv.ui.utils.colorFromRGB class Nation : INamed { override lateinit var name: String lateinit var mainColor: List + var unique:String?=null var secondaryColor: List?=null fun getColor(): Color { return colorFromRGB(mainColor[0], mainColor[1], mainColor[2]) diff --git a/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt b/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt index 50fd1af262..30141c9d2e 100644 --- a/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt @@ -18,7 +18,7 @@ class TileImprovement : NamedStats(), ICivilopedia { private val turnsToBuild: Int = 0 // This is the base cost. fun getTurnsToBuild(civInfo: CivilizationInfo): Int { var realTurnsToBuild = turnsToBuild.toFloat() - if (civInfo.getBuildingUniques().contains("Worker construction increased 25%, provides 2 free workers")) + if (civInfo.getBuildingUniques().contains("Worker construction increased 25%")) realTurnsToBuild *= 0.75f if (civInfo.policies.isAdopted("Citizenship")) realTurnsToBuild *= 0.75f diff --git a/core/src/com/unciv/ui/NewGameScreen.kt b/core/src/com/unciv/ui/NewGameScreen.kt index 11e4f6d6e0..5af66e6f6a 100644 --- a/core/src/com/unciv/ui/NewGameScreen.kt +++ b/core/src/com/unciv/ui/NewGameScreen.kt @@ -27,12 +27,12 @@ class NewGameScreen: PickerScreen(){ val newGameParameters=NewGameParameters() - class NationTable(val nation:Nation,val newGameParameters: NewGameParameters, skin:Skin, onClick:()->Unit):Table(skin){ + class NationTable(val nation:Nation,val newGameParameters: NewGameParameters, skin:Skin, width:Float, onClick:()->Unit):Table(skin){ init { pad(10f) background=ImageGetter.getBackground(nation.getColor().apply { a=0.5f }) add(Label(nation.name, skin).apply { setFontColor(Color.WHITE)}).row() - add(Label(getUniqueLabel(nation), skin).apply { setFontColor(Color.WHITE)}) + add(Label(getUniqueLabel(nation), skin).apply { setWrap(true);setFontColor(Color.WHITE)}).width(width) addClickListener { newGameParameters.nation=nation.name; onClick() } touchable=Touchable.enabled update() @@ -47,6 +47,8 @@ class NewGameScreen: PickerScreen(){ for (stat in building.toHashMap()) if (stat.value != originalBuildingStatMap[stat.key]) text += stat.value.toInt().toString() + " " + stat.key + " vs " + originalBuildingStatMap[stat.key]!!.toInt() + "\n" + for(unique in building.uniques.filter { it !in originalBuilding.uniques }) + text += unique.tr()+"\n" if (building.maintenance != originalBuilding.maintenance) text += "{Maintainance} " + building.maintenance + " vs " + originalBuilding.maintenance + "\n" return text.tr() @@ -67,6 +69,8 @@ class NewGameScreen: PickerScreen(){ return text.tr() } + if(nation.unique!=null) return nation.unique + return "" } @@ -85,9 +89,9 @@ class NewGameScreen: PickerScreen(){ mainTable.add(getOptionsTable()) val civPickerTable = Table().apply { defaults().pad(5f) } for(nation in GameBasics.Nations.values.filterNot { it.name == "Barbarians" }){ - val nationTable = NationTable(nation,newGameParameters,skin){updateNationTables()} + val nationTable = NationTable(nation,newGameParameters,skin,stage.width/3 ){updateNationTables()} nationTables.add(nationTable) - civPickerTable.add(nationTable).width(stage.width/3).row() + civPickerTable.add(nationTable).row() } mainTable.setFillParent(true) mainTable.add(ScrollPane(civPickerTable))