From a7c48959853116fdabecdb2bd7a72c688867dfed Mon Sep 17 00:00:00 2001 From: SimonCeder <63475501+SimonCeder@users.noreply.github.com> Date: Mon, 30 Aug 2021 22:21:02 +0200 Subject: [PATCH] Add Austrian civ (#5026) * Json definition for nation, images * Jsons, Hussar and Coffee House * Diplomatic Marriage Button * Implement Marriage * AI Marriage * template.properties * Popups etc * Strings * reviews * reviews pt 2 --- .../BuildingIcons/Coffee House.png | Bin 0 -> 6302 bytes .../Images.Construction/UnitIcons/Hussar.png | Bin 0 -> 13613 bytes android/Images/NationIcons/Austria.png | Bin 0 -> 9777 bytes .../jsons/Civ V - Vanilla/Buildings.json | 12 +++ .../assets/jsons/Civ V - Vanilla/Nations.json | 28 ++++++ .../assets/jsons/Civ V - Vanilla/Units.json | 16 ++++ .../jsons/translations/template.properties | 4 + .../logic/automation/NextTurnAutomation.kt | 19 ++++ .../com/unciv/logic/battle/BattleDamage.kt | 8 +- .../logic/city/CityInfoConquestFunctions.kt | 1 + core/src/com/unciv/logic/city/CityStats.kt | 2 +- .../logic/civilization/CivilizationInfo.kt | 46 ++++++++++ .../unciv/logic/civilization/PopupAlert.kt | 1 + .../diplomacy/DiplomacyManager.kt | 1 + core/src/com/unciv/models/ruleset/Building.kt | 2 +- .../src/com/unciv/ui/trade/DiplomacyScreen.kt | 20 +++++ .../com/unciv/ui/worldscreen/AlertPopup.kt | 81 ++++++++++++++---- docs/Credits.md | 3 + 18 files changed, 223 insertions(+), 21 deletions(-) create mode 100644 android/Images.Construction/BuildingIcons/Coffee House.png create mode 100644 android/Images.Construction/UnitIcons/Hussar.png create mode 100644 android/Images/NationIcons/Austria.png diff --git a/android/Images.Construction/BuildingIcons/Coffee House.png b/android/Images.Construction/BuildingIcons/Coffee House.png new file mode 100644 index 0000000000000000000000000000000000000000..e12b04528372d20b0cc76a7710d97d9ce32c5c37 GIT binary patch literal 6302 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 literal 0 HcmV?d00001 diff --git a/android/Images.Construction/UnitIcons/Hussar.png b/android/Images.Construction/UnitIcons/Hussar.png new file mode 100644 index 0000000000000000000000000000000000000000..64d51dc5df3ca88a112ad853438ea62b042a4af7 GIT binary patch literal 13613 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 0 + && civInfo.hasUnique("Can spend Gold to annex or puppet a City-State that has been your ally for [] turns.")) { + for (cityState in civInfo.getKnownCivs().filter { it.isCityState() } ) { + if (cityState.canBeMarriedBy(civInfo)) + cityState.diplomaticMarriage(civInfo) + if (civInfo.getHappiness() <= 0) break // Stop marrying if happiness is getting too low + } + } + + if (civInfo.victoryType() == VictoryType.Cultural) { + for (cityState in civInfo.getKnownCivs() + .filter { it.isCityState() && it.cityStateType == CityStateType.Cultured }) { + val diploManager = cityState.getDiplomacyManager(civInfo) + if (diploManager.influence < 40) { // we want to gain influence with them + tryGainInfluence(civInfo, cityState) + return + } + } + } if (!civInfo.isCityState()) { val potentialAllies = civInfo.getKnownCivs().filter { it.isCityState() } diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 2646511431..1ce1e936cd 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -130,9 +130,13 @@ object BattleDamage { && it.militaryUnit!!.owner == attacker.getCivInfo().civName && MapUnitCombatant(it.militaryUnit!!).isMelee() } - if (numberOfAttackersSurroundingDefender > 1) + if (numberOfAttackersSurroundingDefender > 1) { + var flankingBonus = 10f //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php + for (unique in attacker.unit.getMatchingUniques("[]% to Flank Attack bonuses")) + flankingBonus *= unique.params[0].toPercent() modifiers["Flanking"] = - 10 * (numberOfAttackersSurroundingDefender - 1) //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php + (flankingBonus * (numberOfAttackersSurroundingDefender - 1)).toInt() + } if (attacker.getTile() .aerialDistanceTo(defender.getTile()) == 1 && attacker.getTile() .isConnectedByRiver(defender.getTile()) diff --git a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt index cb2fa108dd..f516d60366 100644 --- a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt @@ -249,6 +249,7 @@ class CityInfoConquestFunctions(val city: CityInfo){ if (civInfo.gameInfo.hasReligionEnabled()) religion.removeUnknownPantheons() tryUpdateRoadStatus() + cityStats.update() } } diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 6295c2a1b8..d01f74584a 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -192,7 +192,7 @@ class CityStats(val cityInfo: CityInfo) { } fun hasExtraAnnexUnhappiness(): Boolean { - if (cityInfo.civInfo.civName == cityInfo.foundingCiv || cityInfo.foundingCiv == "" || cityInfo.isPuppet) return false + if (cityInfo.civInfo.civName == cityInfo.foundingCiv || cityInfo.isPuppet) return false return !cityInfo.containsBuildingUnique("Remove extra unhappiness from annexed cities") } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 2523db5a08..6dd3db7e6b 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -979,6 +979,8 @@ class CivilizationInfo { else newAllyCiv.addNotification(text, civName, NotificationIcon.Diplomacy) newAllyCiv.updateViewableTiles() newAllyCiv.updateDetailedCivResources() + for (unique in newAllyCiv.getMatchingUniques("Can spend Gold to annex or puppet a City-State that has been your ally for [] turns.")) + newAllyCiv.getDiplomacyManager(civName).setFlag(DiplomacyFlags.MarriageCooldown, unique.params[0].toInt()) } if (oldAllyName != null) { val oldAllyCiv = gameInfo.getCivilization(oldAllyName) @@ -991,6 +993,50 @@ class CivilizationInfo { } } + fun getDiplomaticMarriageCost(): Int { + // https://github.com/Gedemon/Civ5-DLL/blob/master/CvGameCoreDLL_Expansion1/CvMinorCivAI.cpp, line 7812 + var cost = (500 * gameInfo.gameParameters.gameSpeed.modifier).toInt() + // Plus disband value of all units + for (unit in units) { + cost += unit.baseUnit.getDisbandGold(this) + } + // Round to lower multiple of 5 + cost /= 5 + cost *= 5 + + return cost + } + + fun canBeMarriedBy(otherCiv: CivilizationInfo): Boolean { + return (!isDefeated() + && isCityState() + && getDiplomacyManager(otherCiv).relationshipLevel() == RelationshipLevel.Ally + && !otherCiv.getDiplomacyManager(this).hasFlag(DiplomacyFlags.MarriageCooldown) + && otherCiv.getMatchingUniques("Can spend Gold to annex or puppet a City-State that has been your ally for [] turns.").any() + && otherCiv.gold >= getDiplomaticMarriageCost()) + + } + + fun diplomaticMarriage(otherCiv: CivilizationInfo) { + if (!canBeMarriedBy(otherCiv)) // Just in case + return + + otherCiv.gold -= getDiplomaticMarriageCost() + otherCiv.addNotification("We have married into the ruling family of [${civName}], bringing them under our control.", + getCapital().location, civName, NotificationIcon.Diplomacy, otherCiv.civName) + for (civ in gameInfo.civilizations.filter { it != otherCiv }) + civ.addNotification("[${otherCiv.civName}] has married into the ruling family of [${civName}], bringing them under their control.", + getCapital().location, civName, NotificationIcon.Diplomacy, otherCiv.civName) + for (unit in units) + unit.gift(otherCiv) + for (city in cities) { + city.moveToCiv(otherCiv) + city.isPuppet = true // Human players get a popup that allows them to annex instead + city.foundingCiv = "" // This is no longer a city-state + } + destroy() + } + fun getTributeWillingness(demandingCiv: CivilizationInfo, demandingWorker: Boolean = false): Int { return getTributeModifiers(demandingCiv, demandingWorker).values.sum() } diff --git a/core/src/com/unciv/logic/civilization/PopupAlert.kt b/core/src/com/unciv/logic/civilization/PopupAlert.kt index e86ba4ef0b..672f475623 100644 --- a/core/src/com/unciv/logic/civilization/PopupAlert.kt +++ b/core/src/com/unciv/logic/civilization/PopupAlert.kt @@ -13,6 +13,7 @@ enum class AlertType { GoldenAge, DeclarationOfFriendship, StartIntro, + DiplomaticMarriage, } class PopupAlert { diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 5d5c9c148d..82c07980b6 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -39,6 +39,7 @@ enum class DiplomacyFlags{ IgnoreThemSettlingNearUs, ProvideMilitaryUnit, EverBeenFriends, + MarriageCooldown, NotifiedAfraid } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index a9a2ae18ef..6f18ff9b8e 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -462,7 +462,7 @@ class Building : NamedStats(), INonPerpetualConstruction, ICivilopediaText { "Must have an owned [] within [] tiles" -> if (cityCenter.getTilesInDistance(unique.params[1].toInt()).none { it.matchesFilter(unique.params[0], civInfo) && it.getOwner() == construction.cityInfo.civInfo }) return unique.text - "Can only be built in annexed cities" -> if (construction.cityInfo.isPuppet || construction.cityInfo.foundingCiv == "" + "Can only be built in annexed cities" -> if (construction.cityInfo.isPuppet || construction.cityInfo.civInfo.civName == construction.cityInfo.foundingCiv) return unique.text "Obsolete with []" -> if (civInfo.tech.isResearched(unique.params[0])) return unique.text Constants.hiddenWithoutReligionUnique -> if (!civInfo.gameInfo.hasReligionEnabled()) return unique.text diff --git a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt index 80b0826159..8227d3c6e2 100644 --- a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt @@ -298,6 +298,9 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo):CameraStageBaseScreen() { } } + val diplomaticMarriageButton = getDiplomaticMarriageButton(otherCiv) + if (diplomaticMarriageButton != null) diplomacyTable.add(diplomaticMarriageButton).row() + for (assignedQuest in otherCiv.questManager.assignedQuests.filter { it.assignee == viewingCiv.civName }) { diplomacyTable.addSeparator() diplomacyTable.add(getQuestTable(assignedQuest)).row() @@ -341,6 +344,23 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo):CameraStageBaseScreen() { return improveTileButton } + private fun getDiplomaticMarriageButton(otherCiv: CivilizationInfo): TextButton? { + if (!viewingCiv.hasUnique("Can spend Gold to annex or puppet a City-State that has been your ally for [] turns.")) + return null + + val diplomaticMarriageButton = + "Diplomatic Marriage ([${otherCiv.getDiplomaticMarriageCost()}] Gold)".toTextButton() + diplomaticMarriageButton.onClick { + val newCities = otherCiv.cities + otherCiv.diplomaticMarriage(viewingCiv) + UncivGame.Current.setWorldScreen() // The other civ will no longer exist + for (city in newCities) + viewingCiv.popupAlerts.add(PopupAlert(AlertType.DiplomaticMarriage, city.id)) // Player gets to choose between annex and puppet + } + if (isNotPlayersTurn() || !otherCiv.canBeMarriedBy(viewingCiv)) diplomaticMarriageButton.disable() + return diplomaticMarriageButton + } + private fun getGoldGiftTable(otherCiv: CivilizationInfo): Table { val diplomacyTable = getCityStateDiplomacyTableHeader(otherCiv) diplomacyTable.addSeparator() diff --git a/core/src/com/unciv/ui/worldscreen/AlertPopup.kt b/core/src/com/unciv/ui/worldscreen/AlertPopup.kt index 2e348cabdd..ffe41e1d39 100644 --- a/core/src/com/unciv/ui/worldscreen/AlertPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/AlertPopup.kt @@ -8,6 +8,7 @@ import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.PopupAlert import com.unciv.models.translations.fillPlaceholders +import com.unciv.models.translations.tr import com.unciv.ui.trade.LeaderIntroTable import com.unciv.ui.utils.* @@ -91,10 +92,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu worldScreen.shouldUpdate = true close() } - val liberateText = "Liberate (city returns to [originalOwner])".fillPlaceholders(city.foundingCiv) - add(liberateText.toTextButton().onClick(function = liberateAction)).row() - keyPressDispatcher['l'] = liberateAction - addGoodSizedLabel("Liberating a city returns it to its original owner, giving you a massive relationship boost with them!") + addLiberateOption(city.foundingCiv, liberateAction) addSeparator() } @@ -105,9 +103,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu worldScreen.shouldUpdate = true close() } - add("Destroy".toTextButton().onClick(function = destroyAction)).row() - keyPressDispatcher['d'] = destroyAction - addGoodSizedLabel("Destroying the city instantly razes the city to the ground.").row() + addDestroyOption(destroyAction) } else { val annexAction = { city.puppetCity(conqueringCiv) @@ -115,10 +111,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu worldScreen.shouldUpdate = true close() } - add("Annex".toTextButton().onClick(function = annexAction)).row() - keyPressDispatcher['a'] = annexAction - addGoodSizedLabel("Annexed cities become part of your regular empire.").row() - addGoodSizedLabel("Their citizens generate 2x the unhappiness, unless you build a courthouse.").row() + addAnnexOption(annexAction) addSeparator() val puppetAction = { @@ -126,12 +119,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu worldScreen.shouldUpdate = true close() } - add("Puppet".toTextButton().onClick(function = puppetAction) ).row() - keyPressDispatcher['p'] = puppetAction - addGoodSizedLabel("Puppeted cities do not increase your tech or policy cost, but their citizens generate 1.5x the regular unhappiness.").row() - addGoodSizedLabel("You have no control over the the production of puppeted cities.").row() - addGoodSizedLabel("Puppeted cities also generate 25% less Gold and Science.").row() - addGoodSizedLabel("A puppeted city can be annexed at any time.").row() + addPuppetOption(puppetAction) addSeparator() val razeAction = { @@ -244,9 +232,68 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu addGoodSizedLabel(civInfo.nation.startIntroPart2).row() add(getCloseButton("Let's begin!")) } + AlertType.DiplomaticMarriage -> { + val city = worldScreen.gameInfo.getCities().first { it.id == popupAlert.value } + addGoodSizedLabel(city.name.tr() + ": " + "What would you like to do with the city?".tr(), 24) // Add name because there might be several cities + .padBottom(20f).row() + val marryingCiv = worldScreen.gameInfo.currentPlayerCiv + + if (marryingCiv.isOneCityChallenger()) { + val destroyAction = { + city.destroyCity(overrideSafeties = true) + worldScreen.shouldUpdate = true + close() + } + addDestroyOption(destroyAction) + } else { + val annexAction = { + city.annexCity() + close() + } + addAnnexOption(annexAction) + addSeparator() + + val puppetAction = { + city.isPuppet = true + city.cityStats.update() + worldScreen.shouldUpdate = true + close() + } + addPuppetOption(puppetAction) + } + } } } + private fun addDestroyOption(destroyAction: () -> Unit) { + add("Destroy".toTextButton().onClick(function = destroyAction)).row() + keyPressDispatcher['d'] = destroyAction + addGoodSizedLabel("Destroying the city instantly razes the city to the ground.").row() + } + + private fun addAnnexOption(annexAction: () -> Unit) { + add("Annex".toTextButton().onClick(function = annexAction)).row() + keyPressDispatcher['a'] = annexAction + addGoodSizedLabel("Annexed cities become part of your regular empire.").row() + addGoodSizedLabel("Their citizens generate 2x the unhappiness, unless you build a courthouse.").row() + } + + private fun addPuppetOption(puppetAction: () -> Unit) { + add("Puppet".toTextButton().onClick(function = puppetAction) ).row() + keyPressDispatcher['p'] = puppetAction + addGoodSizedLabel("Puppeted cities do not increase your tech or policy cost, but their citizens generate 1.5x the regular unhappiness.").row() + addGoodSizedLabel("You have no control over the the production of puppeted cities.").row() + addGoodSizedLabel("Puppeted cities also generate 25% less Gold and Science.").row() + addGoodSizedLabel("A puppeted city can be annexed at any time.").row() + } + + private fun addLiberateOption(foundingCiv: String, liberateAction: () -> Unit) { + val liberateText = "Liberate (city returns to [originalOwner])".fillPlaceholders(foundingCiv) + add(liberateText.toTextButton().onClick(function = liberateAction)).row() + keyPressDispatcher['l'] = liberateAction + addGoodSizedLabel("Liberating a city returns it to its original owner, giving you a massive relationship boost with them!") + } + override fun close() { worldScreen.viewingCiv.popupAlerts.remove(popupAlert) super.close() diff --git a/docs/Credits.md b/docs/Credits.md index cb550f3c57..bea8bee1a4 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -99,6 +99,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Bayonet](https://thenounproject.com/term/bayonet/3101681/) By food lover for Carolean * [Horse](https://thenounproject.com/search/?q=Horse&i=1023745) By Bakunetso Kaito for Cavalry * [horse racing](https://thenounproject.com/antimso/uploads/?i=2427932) By Sergio Morozov for Cossack +* [Marching Band](https://thenounproject.com/term/marching-band/871426/) by Darrin Loeliger, US for Hussar * [Artillery](https://thenounproject.com/search/?q=Artillery&i=1165261) By Creative Mania * [Ship](https://thenounproject.com/term/ship/1594793/) By Aisyah for Ironclad @@ -274,6 +275,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Tower of Pisa](https://thenounproject.com/search/?q=leaning%20tower%20of%20pisa&i=1002578) By Pedro Santos * [Himeji Castle](https://thenounproject.com/search/?q=himeji&i=1125277) By Chanut is Industries * [Windmill](https://thenounproject.com/term/windmill/1705107/) By corpus delicti +* [Coffee](https://thenounproject.com/term/coffee/3954451/) by SURYANI, ID for Coffee House * [Taj Mahal](https://thenounproject.com/term/taj-mahal/1907755/) By Felipe Alvarado * [Observatory](https://thenounproject.com/term/observatory/1259/) By Nathan Driskell * [Opera House](https://thenounproject.com/term/opera-house/446672/) By Xinh Studio @@ -549,6 +551,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Sun symbol black](https://en.wikiquote.org/wiki/File:Sun_symbol_black.svg) by Eddo for The Huns * [Lion](https://thenounproject.com/search/?q=lion&i=76154) by Nikki Rodriguez for The Netherlands * [Three Crowns](https://thenounproject.com/search/?q=three+crowns&i=1155972) by Daniel Falk for Sweden +* [Flag of Austria](https://thenounproject.com/term/flag-of-austria/3292053/) by Olena Panasovska, UA for Austria ## Promotions