From 3ce1c7ee9de3c7e9f03a73df8a5869f2b64ca937 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 29 Sep 2019 11:53:54 +0300 Subject: [PATCH 1/5] Made battle damage more readable --- .../com/unciv/logic/battle/BattleDamage.kt | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 6c79d86fe7..db29033383 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -4,7 +4,9 @@ import com.unciv.Constants import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.unit.UnitType -import java.util.Random +import java.util.* +import kotlin.collections.HashMap +import kotlin.collections.set import kotlin.math.max import kotlin.math.pow @@ -226,13 +228,21 @@ class BattleDamage{ if(attacker.isRanged()) return 0 if(defender.getUnitType().isCivilian()) return 0 val ratio = getAttackingStrength(attacker,defender) / getDefendingStrength(attacker,defender) - val i = if (ratio < 1) -1 else 1 - return ((24 + 12 * Random().nextFloat()) * ((ratio.pow(i) + 3).pow(4) / 512 + 0.5).pow(i) * getHealthDependantDamageRatio(defender)).toInt() + return (damageModifier(ratio, true) * getHealthDependantDamageRatio(defender)).toInt() } fun calculateDamageToDefender(attacker: ICombatant, defender: ICombatant): Int { val ratio = getAttackingStrength(attacker,defender) / getDefendingStrength(attacker,defender) - val i = if (ratio < 1) -1 else 1 - return ((24 + 12 * Random().nextFloat()) * ((ratio.pow(i) + 3).pow(4) / 512 + 0.5).pow(i) * getHealthDependantDamageRatio(attacker)).toInt() + return (damageModifier(ratio,false) * getHealthDependantDamageRatio(attacker)).toInt() + } + + fun damageModifier(attackerToDefenderRatio:Float, damageToAttacker:Boolean): Float { + // https://forums.civfanatics.com/threads/getting-the-combat-damage-math.646582/#post-15468029 + val strongerToWeakerRatio = attackerToDefenderRatio.pow(if (attackerToDefenderRatio < 1) -1 else 1) + var ratioModifier = ((((strongerToWeakerRatio + 3)/4).pow(4) +1)/2) + if((damageToAttacker && attackerToDefenderRatio>1) || (!damageToAttacker && attackerToDefenderRatio<1)) // damage ratio from the weaker party is inverted + ratioModifier = ratioModifier.pow(-1) + val randomCenteredAround30 = (24 + 12 * Random().nextFloat()) + return randomCenteredAround30 * ratioModifier } } From 1607d0b17c2ad7be4cc0f7a3a8cf9fff0fbcae2c Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Sun, 29 Sep 2019 16:54:43 +0800 Subject: [PATCH 2/5] Better AI choice for annexing and razing cities. (#1132) --- core/src/com/unciv/logic/automation/NextTurnAutomation.kt | 5 +++++ core/src/com/unciv/logic/battle/Battle.kt | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index c3b2c14e9f..dd61547433 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -429,6 +429,11 @@ class NextTurnAutomation{ private fun reassignWorkedTiles(civInfo: CivilizationInfo) { for (city in civInfo.cities) { + if (city.isPuppet && city.population.population > 9 + && city.resistanceCounter == 0) { + city.annexCity() + } + city.reassignWorkers() city.cityConstructions.chooseNextConstruction() diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 2809b04dd8..1a27c6db0d 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -230,7 +230,13 @@ class Battle(val gameInfo:GameInfo) { if (attacker.getCivInfo().isPlayerCivilization()) attackerCiv.popupAlerts.add(PopupAlert(AlertType.CityConquered, city.name)) - else city.puppetCity(attacker.getCivInfo()) + else { + city.puppetCity(attacker.getCivInfo()) + if (city.population.population < 4) { + city.annexCity() + city.isBeingRazed = true + } + } } fun getMapCombatantOfTile(tile:TileInfo): ICombatant? { From 3abd25c1304113677c3c142924373a4a3f0ae84c Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 29 Sep 2019 12:44:02 +0300 Subject: [PATCH 3/5] Added Thai, although the symbols on top don't seem to render well =( --- android/Images/FlagIcons/Thai.png | Bin 0 -> 3384 bytes android/assets/jsons/Translations/Other.json | 40 ++++++++++++++----- core/src/com/unciv/ui/utils/Fonts.kt | 8 ++-- docs/Credits.md | 2 +- 4 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 android/Images/FlagIcons/Thai.png diff --git a/android/Images/FlagIcons/Thai.png b/android/Images/FlagIcons/Thai.png new file mode 100644 index 0000000000000000000000000000000000000000..df694027cbb1d758f68040f8a775795c94042a04 GIT binary patch literal 3384 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®©\$€£¥¢:;,.¡*|" val charSet = HashSet() charSet.addAll(defaultText.asIterable()) diff --git a/docs/Credits.md b/docs/Credits.md index 7a5431665a..b743404f34 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -26,7 +26,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Fishing Vessel](https://thenounproject.com/term/fishing-vessel/23815/) By Luis Prado for Work Boats * [Greek Trireme](https://thenounproject.com/search/?q=ancient%20boat&i=1626303) By Zachary McCune for Trireme * [Chariot](https://thenounproject.com/search/?q=Chariot&i=1189930) By Andrew Doane for Chariot Archer -* [Elephant](https://thenounproject.com/Luis/uploads/?i=14048) By Luis Prado, US for War Elephant +* [Elephant](https://thenounproject.com/Luis/uploads/?i=14048) By Luis Prado for War Elephant * [Spear](https://thenounproject.com/search/?q=Spear&i=11432) By Stephen Copinger for Spearman * [Greek shield](https://thenounproject.com/search/?q=hoplite&i=440135) for Hoplite * [Spiked club](https://thenounproject.com/search/?q=club%20weapon&creator=1933477&i=831794) for Brute From f4243550ce34bc9e80becc877f2dcdd118290740 Mon Sep 17 00:00:00 2001 From: Smashfanful <41149920+Smashfanful@users.noreply.github.com> Date: Sun, 29 Sep 2019 12:35:32 +0200 Subject: [PATCH 4/5] Update Other.json --- android/assets/jsons/Translations/Other.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/android/assets/jsons/Translations/Other.json b/android/assets/jsons/Translations/Other.json index 177396d772..b97115fd44 100644 --- a/android/assets/jsons/Translations/Other.json +++ b/android/assets/jsons/Translations/Other.json @@ -842,6 +842,10 @@ Japanese:"何もない" } + "Annex city":{ // For a puppetted city + Italian:"Annetti città" + } + "Specialist Buildings":{ Italian:"Edifici specialisti" Russian:"Специализированные Здания" @@ -1805,6 +1809,10 @@ Russian:"Аннексировать" } + "Puppet City":{ + Italian:"Riduci a Stato Fantoccio" + } + "Raze":{ Italian:"Distruggi" French:"Razer" From a91fe87e261369f183daf849b76b2cbc82c26475 Mon Sep 17 00:00:00 2001 From: Smashfanful <41149920+Smashfanful@users.noreply.github.com> Date: Sun, 29 Sep 2019 12:57:43 +0200 Subject: [PATCH 5/5] Update Nations_Italian.json --- .../assets/jsons/Nations/Nations_Italian.json | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/android/assets/jsons/Nations/Nations_Italian.json b/android/assets/jsons/Nations/Nations_Italian.json index 97edb9465b..9955397e26 100644 --- a/android/assets/jsons/Nations/Nations_Italian.json +++ b/android/assets/jsons/Nations/Nations_Italian.json @@ -48,7 +48,7 @@ declaringWar:"Sei sulla mia strada, e pertanto devo distruggerti." attacked:"Ad essere onesto, mi sono stancato di starmene impalato e di riposare sugli allori. Vieni, le mie armate ti accoglieranno a braccia aperte!" defeated:"Così come in fretta era iniziata, così ora la mia lunga marcia giunge alla fine." - introduction:"Benvenuto, straniero! Sono Alexandros, figlio di re e nipote degli dei! Cerco amici gagliardi o nemici degni della mia lama. A quale dei due gruppi appartieni?" + introduction:"Benvenuto, straniero! Sono Alexandros, erede di Eracle, figlio di re e nipote degli dei! Cerco amici gagliardi o nemici degni della mia lama. A quale dei due gruppi appartieni?" neutralHello:"Saluti..." neutralLetsHearIt:["Ti ascolto.","Avanti.","Sì?","Parla."] @@ -65,10 +65,8 @@ outerColor:[181, 232, 232], innerColor:[68,142,249], - /* uniqueName:"Lega Ellenica", unique:"L'Influenza delle Città-Stato cala il doppio più lentamente e cresce il doppio rispetto al normale.", - */ cities:["Atene","Sparta","Corinto","Argo","Cnosso","Micene","Farsalo","Efeso","Alicarnasso","Rodi", "Eretria","Pergamo","Mileto","Megara","Focea","Sicyon","Tirinto","Samo","Mitilene","Chio", "Paros","Ellis","Siracusa","Eracleia","Gortyn","Chalkis","Pilo","Pella","Naxos"] @@ -85,7 +83,7 @@ declaringWar:"Non ti permetterò più di infastidirmi. Preparati a incontrare Yama." attacked:"Folle! Ti costringerò a guardare il tuo popolo venire massacrato!" defeated:"Ti sei dimostrato un avversario astuto e competente. Mi congratulo per la tua vittoria." - introduction:"Saluti! Sono l'imperatrice della Cina Wu Zetian. La Cina desidera solo una coesistenza pacifica e un commercio equo, ma risponderà con la forza a ogni aggressione. Spero che condividiate la nostra visione." + introduction:"Saluti! Sono l'imperatrice della Cina, Wu Zetian. La Cina desidera solo una coesistenza pacifica e un commercio equo, ma risponderà con la forza a ogni aggressione. Spero che condividiate la nostra visione." neutralHello:"Bella giornata, oggi, vero?" neutralLetsHearIt:["Continua.","Ebbene?","Dunque?"] @@ -265,7 +263,7 @@ declaringWar:"Il mio tesoro va scarseggiando e i miei soldati si stanno spazientendo... ...pertanto, credo proprio che dovrò muoverti guerra. Alea jacta eat - il dado è tratto!" attacked:"La tua arroganza sarà la tua rovina! Nessun potere, per quanto prode o forte, può sconfiggere Roma!" defeated:"Gli dei hanno privato Roma del loro favore. Siamo stati sconfitti." - introduction:"Ave. Sono Augusto, Princeps, Imperator e Pontifex Maximus di Roma. Se sei amico di Roma, sei il benvenuto." + introduction:"Ave. Sono Augusto, Princeps, Imperator e Pontifex Maximus di Roma. Se sei amico di Roma, sei il benvenuto, ma sappi che Roma è mortale contro i suoi nemici." neutralHello:"Saluti." neutralLetsHearIt:["Comincia pure.","Continua."] @@ -300,7 +298,7 @@ declaringWar:"Invero, è un peccato che dobbiamo passare alle maniere forti... non è tradizione per un re uccidere un altro re, né per un regno uccidere un altro regno." attacked:"Ti avverto almeno di non farti un'abitudine di spargere sangue. Il sangue non dorme mai." defeated:"Hai vinto. Complimenti. Ora il palazzo è nelle tue mani. Ti prego di prenderti cura del mio pavone." - introduction:"Salve, straniero. Sono Harun Al-Rashid, Califfo degli Arabi. Vieni, raccontami del tuo impero." + introduction:"Salve, straniero. Sono Harun Al-Rashid, Califfo degli Arabi. Vieni ad ammirare la sontuosità del mio palazzo, e parlami del tuo impero." neutralHello:"Pace a te." neutralLetsHearIt:["Cos'é questo?","Cosa stavi dicendo?"] @@ -371,7 +369,7 @@ declaringWar:"Come samurai siamo gente onesta, e noi troviamo onesto volerti esprimere la nostra intenzione di cancellarti dalla faccia della terra con questo messaggio." attacked:"Fatti pure avanti! Il kamikaze (vento divino) ci proteggerà, e tu cadrai, come altri prima di te!" defeated:"Poni fine al disonore che è caduto sulla mia famiglia... sul mio popolo." - introduction:"Io sono Oda Nobunaga, capo del grande clan Oda. Mi auguro una relazione giusta e leale nei vostri confronti." + introduction:"In verità, il cielo ci ha rivolto il suo sorriso conducendoci alla vostra augusta presenza. Io sono Oda Nobunaga, capo del grande clan Oda. Mi auguro una relazione giusta ed equa tra i nostri popoli." neutralHello:"Salve." neutralLetsHearIt:["Vai avanti.","Procedi.","Ti ascolto."] @@ -517,7 +515,7 @@ declaringWar:"Jip-hyun-jun (la Sala dei Giusti) non tollera più la tua insolenza. Libereremo i tuoi cittadini oppressi anche con la forza, e li illumineremo!" attacked:"Sciocca progenie di una megera! Sarete distrutti dalla magnifica potenza scientifica del mio paese!" defeated:"Ora resta da vedere chi proteggerà il mio popolo... Il buio è giunto." - introduction:"Benvenuto nel palazzo dei Choson, straniero. Io sono il re Sejong l'Istruito, sovrano di queste terre e di questo popolo." + introduction:"Benvenuto nel palazzo dei Choson, onorato straniero. Io sono il re Sejong l'Istruito, condottiero illuminato e sovrano di queste terre e di questo popolo." neutralHello:"Salve." neutralLetsHearIt:["Sentiamo.","Vai avanti","Continue."] @@ -589,7 +587,7 @@ declaringWar:"La tua continua esistenza rappresenta un imbarazzo per tutti i leader del mondo! Farò loro un favore distruggendoti!" attacked:"Non hai forse udito le storie sulla potenza e sulla grandezza delle mie armate? Forse, se le vedrai, ci penserai due volte prima di affrontarmi!" defeated:"Canaglia! Che Ahura Mazda ti maledica! Il mondo ricorderà a lungo l'errore che hai commesso!" - introduction:"Che la pace scenda su di te! Io sono Dario, il grande re dei re della Persia... ma sono certo che tu già lo sappia." + introduction:"Ti saluto con calore, e generosamente ti offro la mia mano in amicizia. Io sono Dario, il grande re dei re della Persia... ma sono certo che tu già lo sappia." neutralHello:"Buona giornata!" neutralLetsHearIt:["Va' avanti.","Parla."]