diff --git a/android/Images/FlagIcons/Thai.png b/android/Images/FlagIcons/Thai.png new file mode 100644 index 00000000..df694027 Binary files /dev/null and b/android/Images/FlagIcons/Thai.png differ diff --git a/android/assets/jsons/Nations/Nations_Italian.json b/android/assets/jsons/Nations/Nations_Italian.json index 97edb946..9955397e 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."] diff --git a/android/assets/jsons/Translations/Other.json b/android/assets/jsons/Translations/Other.json index aadd0751..b97115fd 100644 --- a/android/assets/jsons/Translations/Other.json +++ b/android/assets/jsons/Translations/Other.json @@ -53,29 +53,30 @@ /////// Turn "Next turn":{ - Dutch:"Volgende beurt" - French:"Prochain tour" + Dutch:"Volgende beurt" + French:"Prochain tour" German:"Nächste Runde" Italian:"Fine turno" - Japanese:"次のターン" - Portuguese:"Proximo turno" + Japanese:"次のターン" + Portuguese:"Proximo turno" Romanian:"Runda următoare" Russian:"Следующий ход" Simplified_Chinese:"下一回合" Spanish:"Siguiente turno" + Thai:"เริ่มเกมใหม่" } "Turn":{ // For main screen at top left, e.g. Turn 234 - Dutch:"Beurt" + Dutch:"Beurt" French:"Tour" German:"Runde" - Italian:"Turno" + Italian:"Turno" Japanese:"順番" - Portuguese:"Turno" + Portuguese:"Turno" Romanian:"Runda" - Russian:"Ход" - Simplified_Chinese:"回合" + Russian:"Ход" + Simplified_Chinese:"回合" Spanish:"Turno" } @@ -209,7 +210,7 @@ Dutch:"Verbetering bouwen" Spanish:"Construir mejora" Simplified_Chinese:"建造设施" - Portuguese:"Construir melhoria" + Portuguese:"Construir melhoria" Japanese:"構造改善" } @@ -841,6 +842,10 @@ Japanese:"何もない" } + "Annex city":{ // For a puppetted city + Italian:"Annetti città" + } + "Specialist Buildings":{ Italian:"Edifici specialisti" Russian:"Специализированные Здания" @@ -1804,6 +1809,10 @@ Russian:"Аннексировать" } + "Puppet City":{ + Italian:"Riduci a Stato Fantoccio" + } + "Raze":{ Italian:"Distruggi" French:"Razer" @@ -2038,5 +2047,24 @@ Portuguese:"Língua" Russian:"Язык" } + + // Map editor + + + "Terrains & Resources":{ + Italian:"Terreni e risorse" + } + + "Improvements":{ + Italian:"Miglioramenti" + } + + "Barbarian encampment":{ + Italian:"Accampamento barbaro" + } + + "[nation] starting location":{ + Italian:"Punto iniziale di [nation]" + } } diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index c3b2c14e..dd615474 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 2809b04d..1a27c6db 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? { diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 6d79bc00..db290333 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 } } diff --git a/core/src/com/unciv/ui/utils/Fonts.kt b/core/src/com/unciv/ui/utils/Fonts.kt index f2dd77d4..b12b69ba 100644 --- a/core/src/com/unciv/ui/utils/Fonts.kt +++ b/core/src/com/unciv/ui/utils/Fonts.kt @@ -55,9 +55,11 @@ class Fonts { fun getCharsForFont(withChinese:Boolean): String { val defaultText = "ABCČĆDĐEFGHIJKLMNOPQRSŠTUVWXYZŽaäàâăbcčćçdđeéfghiîjklmnoöpqrsșštțuüvwxyzž" + - "АБВГҐДЂЕЁЄЖЗЅИІЇЙЈКЛЉМНЊОПРСТЋУЎФХЦЧЏШЩЪЫЬЭЮЯабвгґдђеёєжзѕиіїйјклљмнњопрстћуўфхцчџшщъыьэюя" + - "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωάßΆέΈέΉίϊΐΊόΌύΰϋΎΫΏ" + - "ÀÄĂÂĎÊĚÉÈÍÎŁĹĽÔÓÖƠŘŔŚŤƯŮÚÜŻŹäâąďêęěłĺľńňôöơřŕśťưůýżźáèìíóú1234567890" + + "АБВГҐДЂЕЁЄЖЗЅИІЇЙЈКЛЉМНЊОПРСТЋУЎФХЦЧЏШЩЪЫЬЭЮЯабвгґдђеёєжзѕиіїйјклљмнњопрстћуўфхцчџшщъыьэюя" + // Russian + "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωάßΆέΈέΉίϊΐΊόΌύΰϋΎΫΏ" + // Greek + "ÀÄĂÂĎÊĚÉÈÍÎŁĹĽÔÓÖƠŘŔŚŤƯŮÚÜŻŹäâąďêęěłĺľńňôöơřŕśťưůýżźáèìíóú" + + "กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛" + // Thai + "1234567890" + "‘?’'“!”(%)[#]{@}/&\\<-+÷×=>®©\$€£¥¢:;,.¡*|" val charSet = HashSet() charSet.addAll(defaultText.asIterable()) diff --git a/docs/Credits.md b/docs/Credits.md index 7a543166..b743404f 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