This commit is contained in:
YueR 2019-09-05 22:23:18 +08:00
commit 8e79800f80
17 changed files with 190 additions and 76 deletions

1
.gitignore vendored
View file

@ -134,3 +134,4 @@ android/assets/fonts/
android/release/android.aab android/release/android.aab
android/assets/maps/ android/assets/maps/
android/release/android.aab.sig android/release/android.aab.sig
android/release/android-release.aab

View file

@ -9,10 +9,10 @@ android:
- platform-tools - platform-tools
# The BuildTools version used by your project # The BuildTools version used by your project
- build-tools-28.0.3 - build-tools-29.0.2
# The SDK version used to compile your project # The SDK version used to compile your project
- android-28 - android-29
jdk: jdk:

View file

@ -4,7 +4,7 @@
[![Travis CI w/ Logo](https://img.shields.io/travis/yairm210/UnCiv/master.svg?logo=travis)](https://travis-ci.org/yairm210/UnCiv) [![Travis CI w/ Logo](https://img.shields.io/travis/yairm210/UnCiv/master.svg?logo=travis)](https://travis-ci.org/yairm210/UnCiv)
[![LibGDX](https://img.shields.io/badge/libgdx-1.9.10-red.svg)](https://libgdx.badlogicgames.com/) [![LibGDX](https://img.shields.io/badge/libgdx-1.9.10-red.svg)](https://libgdx.badlogicgames.com/)
[![Kotlin](https://img.shields.io/badge/kotlin-1.3.41-orange.svg)](http://kotlinlang.org/) [![Kotlin](https://img.shields.io/badge/kotlin-1.3.50-orange.svg)](http://kotlinlang.org/)
[![Discord Chat](https://img.shields.io/discord/586194543280390151.svg)](https://discord.gg/bjrB4Xw) [![Discord Chat](https://img.shields.io/discord/586194543280390151.svg)](https://discord.gg/bjrB4Xw)
@ -18,6 +18,7 @@ Made with LibGDX on Android Studio
* Map tiles (including water), resources and improvements * Map tiles (including water), resources and improvements
* Units and movement * Units and movement
* Air units
* Cities, production and buildings * Cities, production and buildings
* Population and Specialists * Population and Specialists
* Science, Cultural and Domination victories * Science, Cultural and Domination victories
@ -26,13 +27,14 @@ Made with LibGDX on Android Studio
* Promotions and combat modifiers * Promotions and combat modifiers
* Other civilizations, diplomacy and trade * Other civilizations, diplomacy and trade
* City-states * City-states
* Hotseat multiplayer * Multiplayer (hotseat and across internet)
* Map editor * Map editor
# What's next? # What's next?
* UI+UX improvements (suggestions welcome!) * UI+UX improvements (suggestions welcome!)
* Air units * Filling out gaps (missing civs etc)
I'd love to hear your feedback, either here or via mail to yairm210@hotmail.com! I'd love to hear your feedback, either here or via mail to yairm210@hotmail.com!

View file

@ -56,6 +56,7 @@
Simplified_Chinese:"向[civName]宣战吗?" Simplified_Chinese:"向[civName]宣战吗?"
Portuguese:"Deseja declarar guerra a [civName]?" Portuguese:"Deseja declarar guerra a [civName]?"
Polish:"Wypowiedz wojnę cywilizacji [civName]" Polish:"Wypowiedz wojnę cywilizacji [civName]"
Russian:"Объявить войну [civName]?"
} }
"[civName] has declared war on us!":{ "[civName] has declared war on us!":{
@ -101,6 +102,7 @@
Portuguese:"Negociar paz" Portuguese:"Negociar paz"
French:"Négocier la paix" French:"Négocier la paix"
Polish:"Negocjuj pokój" Polish:"Negocjuj pokój"
Russian:"Предложить мир"
} }
"Very well.":{ "Very well.":{
@ -109,6 +111,7 @@
Simplified_Chinese:"很好。" Simplified_Chinese:"很好。"
Portuguese:"Muito bem." Portuguese:"Muito bem."
Polish:"Niech tak będzie." Polish:"Niech tak będzie."
Russian:"Очень хорошо."
} }
"Farewell.":{ "Farewell.":{
@ -117,12 +120,14 @@
Simplified_Chinese:"再见。" Simplified_Chinese:"再见。"
Portuguese:"Adeus." Portuguese:"Adeus."
Polish:"Żegnaj." Polish:"Żegnaj."
Russian:"До встречи."
} }
"Sounds good!":{ "Sounds good!":{
Italian:"Sta bene!" Italian:"Sta bene!"
French:"Très bien!" French:"Très bien!"
Polish:"Bardzo dobrze!" Polish:"Bardzo dobrze!"
Russian:"Звучит неплохо!"
} }
"Not this time.":{ // declining trade text "Not this time.":{ // declining trade text
@ -131,6 +136,7 @@
French:"Pas cette fois." French:"Pas cette fois."
Portuguese:"Dessa vez não." Portuguese:"Dessa vez não."
Polish:"To się nie uda" Polish:"To się nie uda"
Russian:"Не в этот раз."
} }
"Excellent!":{ // AI statement after we accept a trade they proposed, and when we meet a city state, and our response when they agree to our diplomatic demand "Excellent!":{ // AI statement after we accept a trade they proposed, and when we meet a city state, and our response when they agree to our diplomatic demand
@ -139,6 +145,7 @@
French:"Excellent!" French:"Excellent!"
Portuguese:"Excelente!" Portuguese:"Excelente!"
Polish:"Wyśmienicie!" Polish:"Wyśmienicie!"
Russian:"Превосходно!"
} }
"How about something else...":{ // Counteroffer to AI offer //shouldn't it be 'How about somenthing else?' ? "How about something else...":{ // Counteroffer to AI offer //shouldn't it be 'How about somenthing else?' ?
@ -147,6 +154,7 @@
French:"Pourquoi pas autre chose..." French:"Pourquoi pas autre chose..."
Portuguese:"Porque não algo mais..." Portuguese:"Porque não algo mais..."
Polish:"Oto nasza oferta." Polish:"Oto nasza oferta."
Russian:"Как насчёт другого..."
} }
"A pleasure to meet you.":{ "A pleasure to meet you.":{
@ -155,6 +163,7 @@
Simplified_Chinese:"很高兴见到你。" Simplified_Chinese:"很高兴见到你。"
Portuguese:"Prazer conhece-lo" Portuguese:"Prazer conhece-lo"
Polish:"Czuję się zaszczycony." Polish:"Czuję się zaszczycony."
Russian:"Рады видеть вас."
} }
"Our relationship: ":{ "Our relationship: ":{
@ -163,6 +172,7 @@
Simplified_Chinese:"我们的关系:" Simplified_Chinese:"我们的关系:"
Portuguese:"Nossas relações" Portuguese:"Nossas relações"
Polish:"Nasze relacje:" Polish:"Nasze relacje:"
Russian:"Наши отношения"
} }
"We have encountered the City-State of [name]!":{ // e.g. the Cultured city state of Vienna "We have encountered the City-State of [name]!":{ // e.g. the Cultured city state of Vienna
@ -170,6 +180,7 @@
Portuguese:"Nós encontramos a cidade-estado de [name]" Portuguese:"Nós encontramos a cidade-estado de [name]"
French:"Nous avons rencontré la cité-état de [name]!" French:"Nous avons rencontré la cité-état de [name]!"
Polish:"Napotkaliśmy państwo-miasto o nazwie [name]!" Polish:"Napotkaliśmy państwo-miasto o nazwie [name]!"
Russian:"Мы обнаружили город-государство [name]!"
} }
// Friendship declaration flavor texts // Friendship declaration flavor texts
@ -179,6 +190,7 @@
Simplified_Chinese:"宣布相互友善([numberOfTurns]回合)" Simplified_Chinese:"宣布相互友善([numberOfTurns]回合)"
Portuguese:"Declarar amizade ([numberOfTurns] turns)" Portuguese:"Declarar amizade ([numberOfTurns] turns)"
Polish:"Zadeklaruj przyjaźń na [numberOfTurns] tur" Polish:"Zadeklaruj przyjaźń na [numberOfTurns] tur"
Russian:"Объявить о дружбе на [numberOfTurns] ходов"
} }
"May our nations forever remain united!":{ "May our nations forever remain united!":{
@ -187,6 +199,7 @@
Simplified_Chinese:"我们两个文明将永远肝胆相照、休戚与共地站在一起!" Simplified_Chinese:"我们两个文明将永远肝胆相照、休戚与共地站在一起!"
Portuguese:"Que nossas nações se mantenho unidas para sempre!" Portuguese:"Que nossas nações se mantenho unidas para sempre!"
Polish:"Oby ta przyjaźń już zawsze łączyła nasze cywilizacje!" Polish:"Oby ta przyjaźń już zawsze łączyła nasze cywilizacje!"
Russian:"Да будут наши державы навеки едины!"
} }
"Indeed!":{ "Indeed!":{
@ -195,6 +208,7 @@
Simplified_Chinese:"这是无比正确的命运抉择!" Simplified_Chinese:"这是无比正确的命运抉择!"
Portuguese:"Perfeito!" Portuguese:"Perfeito!"
Polish:"Wspaniale!" Polish:"Wspaniale!"
Russian:"Разумеется!"
} }
// Denunceation flavour texts // Denunceation flavour texts
@ -202,11 +216,13 @@
Italian:"Denuncia ([numberOfTurns] turni)" Italian:"Denuncia ([numberOfTurns] turni)"
French:"Dénoncer ([numberOfTurns] tours)" French:"Dénoncer ([numberOfTurns] tours)"
Polish:"Potęp cywilizację na [numberOfTurns] tur" Polish:"Potęp cywilizację na [numberOfTurns] tur"
Russian:"Осуждение на [numberOfTurns] ходов"
} }
"We will remember this.":{ "We will remember this.":{
Italian:"Non credere che ce lo scorderemo!" Italian:"Non credere che ce lo scorderemo!"
French:"Nous nous en souviendrons." French:"Nous nous en souviendrons."
Russian:"Мы это запомним"
} }
@ -217,6 +233,7 @@
French:"Impardonnable" French:"Impardonnable"
Simplified_Chinese:"仇深似海" Simplified_Chinese:"仇深似海"
Portuguese:"Imperdoável" Portuguese:"Imperdoável"
Russian:"Непростительно враждебные"
} }
"Enemy":{ "Enemy":{
@ -224,6 +241,7 @@
French:"Ennemi" French:"Ennemi"
Simplified_Chinese:"宿命之敌" Simplified_Chinese:"宿命之敌"
Portuguese:"Inimigos" //as in 'we are enemies' not just 'they are our enemy' Portuguese:"Inimigos" //as in 'we are enemies' not just 'they are our enemy'
Russian:"Враждебные"
} }
"Competitor":{ "Competitor":{
@ -231,6 +249,7 @@
French:"Adversaire" //or en compétition French:"Adversaire" //or en compétition
Simplified_Chinese:"瑜亮之争" Simplified_Chinese:"瑜亮之争"
Portuguese:"Adversários" Portuguese:"Adversários"
Russian:"Соперничающие"
} }
"Neutral":{ "Neutral":{
@ -238,6 +257,7 @@
French:"Neutre" French:"Neutre"
Simplified_Chinese:"泛泛之交" Simplified_Chinese:"泛泛之交"
Portuguese:"Neutra" // relation=relação relação is in feminine so therefore neutral(= neutro/neutra) deve ser feminino Portuguese:"Neutra" // relation=relação relação is in feminine so therefore neutral(= neutro/neutra) deve ser feminino
Russian:"Нейтральные"
} }
"Favorable":{ "Favorable":{
@ -245,6 +265,7 @@
French:"Favorable" French:"Favorable"
Simplified_Chinese:"惺惺相惜" Simplified_Chinese:"惺惺相惜"
Portuguese:"Favorável" Portuguese:"Favorável"
Russian:"Приемлемые"
} }
"Friend":{ "Friend":{
@ -252,6 +273,7 @@
French:"Ami" French:"Ami"
Simplified_Chinese:"秦晋之好" Simplified_Chinese:"秦晋之好"
Portuguese:"Amigos" Portuguese:"Amigos"
Russian:"Дружеские"
} }
"Ally":{ "Ally":{
@ -259,6 +281,7 @@
French:"Allié" French:"Allié"
Simplified_Chinese:"歃血之盟" Simplified_Chinese:"歃血之盟"
Portuguese:"Aliado" Portuguese:"Aliado"
Russian:"Союзнические"
} }
// City States // City States
@ -266,31 +289,37 @@
"Provides [amountOfCulture] culture at 30 Influence":{ "Provides [amountOfCulture] culture at 30 Influence":{
Italian:"Dona [amountOfCulture] punti Cultura a minimo 30 Punti Influenza" Italian:"Dona [amountOfCulture] punti Cultura a minimo 30 Punti Influenza"
French:"Fournit [amountOfCulture] de Culture à 30 d'influence" French:"Fournit [amountOfCulture] de Culture à 30 d'influence"
Russian:"Даёт [amountOfCulture] культуры при 30 Влияния"
} }
"Provides 3 food in capital and 1 food in other cities at 30 Influence":{ "Provides 3 food in capital and 1 food in other cities at 30 Influence":{
Italian:"Dona 3 Cibo alla Capitale e 1 Cibo alle altre Città a minimo 30 Punti Influenza" Italian:"Dona 3 Cibo alla Capitale e 1 Cibo alle altre Città a minimo 30 Punti Influenza"
French:"Fournit 3 Nourriture à la capitale et 1 nourriture pour les autres villes à 30 d'influence" French:"Fournit 3 Nourriture à la capitale et 1 nourriture pour les autres villes à 30 d'influence"
Russian:"Даёт 3 Еды в столице и 1 Еда в остальных городах при 30 Влияния"
} }
"Provides 3 happiness at 30 Influence":{ "Provides 3 happiness at 30 Influence":{
Italian:"Dona 3 Punti Felicità a minimo 30 Punti Influenza" Italian:"Dona 3 Punti Felicità a minimo 30 Punti Influenza"
French:"Fournit 3 de Bonheur à 30 d'influence" French:"Fournit 3 de Bonheur à 30 d'influence"
Russian:"Даёт 3 Счастья при 30 Влияния"
}, },
"Provides land units every 20 turns at 30 Influence":{ "Provides land units every 20 turns at 30 Influence":{
Italian:"Concede un'unità terrestre ogni 20 turni a minimo 30 Punti Influenza" Italian:"Concede un'unità terrestre ogni 20 turni a minimo 30 Punti Influenza"
French:"Fournit des unités terrestres tous les 20 tours à 30 d'influence" French:"Fournit des unités terrestres tous les 20 tours à 30 d'influence"
Russian:"Даёт сухопутные юниты каждые 20 ходов при 30 Влияния"
}, },
"Gift [goldAmount] gold":{ "Gift [goldAmount] gold":{
Italian:"Dona [goldAmount] Oro" Italian:"Dona [goldAmount] Oro"
French:"Donner [goldAmount] ors" French:"Donner [goldAmount] ors"
Russian:"Дарит [goldAmount] золота"
} }
"Relationship changes in another [turnsToRelationshipChange] turns":{ "Relationship changes in another [turnsToRelationshipChange] turns":{
Italian:"I rapporti cambieranno tra [turnsToRelationshipChange] turni" Italian:"I rapporti cambieranno tra [turnsToRelationshipChange] turni"
French:"Les relations changent dans [turnsToRelationshipChange] tours" French:"Les relations changent dans [turnsToRelationshipChange] tours"
Russian:"Отношения изменятся в следующие [turnsToRelationshipChange] ходов"
} }
@ -302,6 +331,7 @@
French:"Vous nous avez déclaré la guerre!" French:"Vous nous avez déclaré la guerre!"
Simplified_Chinese:"不知死活的蠢货!你竟敢向我们宣战!" Simplified_Chinese:"不知死活的蠢货!你竟敢向我们宣战!"
Portuguese:"Você declarou guerra contra nós!" Portuguese:"Você declarou guerra contra nós!"
Russian:"Вы объявляли нам войну!"
} }
"Your warmongering ways are unacceptable to us.":{ "Your warmongering ways are unacceptable to us.":{
@ -309,6 +339,7 @@
French:"Votre bellicisme est inacceptable pour nous." French:"Votre bellicisme est inacceptable pour nous."
Simplified_Chinese:"你的穷兵黩武行径是我们无法容忍的!" Simplified_Chinese:"你的穷兵黩武行径是我们无法容忍的!"
Portuguese:"Seus costumes de guerra são inaceitáveis para nós." Portuguese:"Seus costumes de guerra são inaceitáveis para nós."
Russian:"Ваша воинственность для нас неприемлема."
} }
"You have captured our cities!":{ "You have captured our cities!":{
@ -316,6 +347,7 @@
French:"Vous avez capturé nos villes!" French:"Vous avez capturé nos villes!"
Simplified_Chinese:"多行不义必自毙!你竟敢占领我们的城市!" Simplified_Chinese:"多行不义必自毙!你竟敢占领我们的城市!"
Portuguese:"Você capturou nossas(nossa) cidades(cidade)!" Portuguese:"Você capturou nossas(nossa) cidades(cidade)!"
Russian:"Вы захватывали наши города!"
} }
"Years of peace have strengthened our relations.":{ "Years of peace have strengthened our relations.":{
@ -323,6 +355,7 @@
French:"Les années de paix ont renforcées notre relation" French:"Les années de paix ont renforcées notre relation"
Simplified_Chinese:"多年的和平时光让我们更加珍视彼此的关系。" Simplified_Chinese:"多年的和平时光让我们更加珍视彼此的关系。"
Portuguese:"Anos de paz fortaleceram nossas relações." Portuguese:"Anos de paz fortaleceram nossas relações."
Russian:"Годы мира укрепили наши отношения"
} }
"Our mutual military struggle brings us closer together.":{ "Our mutual military struggle brings us closer together.":{
@ -330,6 +363,7 @@
French:"Nos problèmes militaires communs nous ont rapprochés" French:"Nos problèmes militaires communs nous ont rapprochés"
Simplified_Chinese:"共同的戎马岁月拉近了彼此的距离。" Simplified_Chinese:"共同的戎马岁月拉近了彼此的距离。"
Portuguese:"Nossas lutas mutuas nos fazem mais próximos." Portuguese:"Nossas lutas mutuas nos fazem mais próximos."
Russian:"Наши совместные боевые действия сблизили нас"
} }
"We have signed a public declaration of friendship":{ "We have signed a public declaration of friendship":{
@ -337,6 +371,7 @@
Simplified_Chinese:"真是美好的一天!我们宣布:两个文明间将彼此尊重、相互友善!" Simplified_Chinese:"真是美好的一天!我们宣布:两个文明间将彼此尊重、相互友善!"
French:"Nous avons publiquement signé une Déclaration d'Amitié" French:"Nous avons publiquement signé une Déclaration d'Amitié"
Portuguese:"Assinamos uma declaração pública de amizade" Portuguese:"Assinamos uma declaração pública de amizade"
Russian:"Мы подписали публичную декларацию дружбы"
} }
"You have declared friendship with our enemies!":{ "You have declared friendship with our enemies!":{
@ -344,12 +379,14 @@
French:"Vous avez signé une Déclaration d'Amitié avec nos ennemis!" French:"Vous avez signé une Déclaration d'Amitié avec nos ennemis!"
Simplified_Chinese:"渡尽劫波兄弟在,相逢一笑泯恩仇!我们宣布:冰释前嫌、携手前进!" Simplified_Chinese:"渡尽劫波兄弟在,相逢一笑泯恩仇!我们宣布:冰释前嫌、携手前进!"
Portuguese:"Voçê declarou amizade a um de nossos inimigos!" Portuguese:"Voçê declarou amizade a um de nossos inimigos!"
Russian:"Вы дружите с нашими врагами!"
} }
"You have declared friendship with our allies":{ "You have declared friendship with our allies":{
Italian:"Hai dichiarato un'amicizia con i nostri alleati." Italian:"Hai dichiarato un'amicizia con i nostri alleati."
French:"Vous avez signé une Déclaration d'Amitié avec nos alliés" French:"Vous avez signé une Déclaration d'Amitié avec nos alliés"
Simplified_Chinese:"兄弟齐心、其利断金!我们宣布:我们与盟友间兄弟般的友谊永世长存!" Simplified_Chinese:"兄弟齐心、其利断金!我们宣布:我们与盟友间兄弟般的友谊永世长存!"
Portuguese:"Voçê declarou amizade a um de nossos aliados" Portuguese:"Voçê declarou amizade a um de nossos aliados"
Russian:"Вы дружите с нашими союзниками"
} }
"Our open borders have brought us closer together.":{ "Our open borders have brought us closer together.":{
@ -357,6 +394,7 @@
French:"Notre Accord de libre passage nous a rapprochés" French:"Notre Accord de libre passage nous a rapprochés"
Simplified_Chinese:"开放的边界促进了彼此的了解,让我们的人民心心相通!" Simplified_Chinese:"开放的边界促进了彼此的了解,让我们的人民心心相通!"
Portuguese:"Nossa fronteiras abertas nos fizeram mais próximos." Portuguese:"Nossa fronteiras abertas nos fizeram mais próximos."
Russian:"Наши открытые границы сблизили нас"
} }
@ -364,64 +402,77 @@
Italian:"La tua cosiddetta 'amicizia' non vale nulla!" Italian:"La tua cosiddetta 'amicizia' non vale nulla!"
Portuguese:"Sua chamada 'amizade' não vale nada." Portuguese:"Sua chamada 'amizade' não vale nada."
French:"Votre soi-disant 'amitié' ne vaut rien." French:"Votre soi-disant 'amitié' ne vaut rien."
Russian:"Ваше так называемое дружелюбие ничего не значит."
} }
"You have publicly denounced us!":{ "You have publicly denounced us!":{
Italian:"Ci hai denunciato pubblicamente di fronte al mondo!" Italian:"Ci hai denunciato pubblicamente di fronte al mondo!"
French:"Vous nous avez dénoncé publiquement!" French:"Vous nous avez dénoncé publiquement!"
Russian:"Вы публично осудили нас!"
} }
"You have denounced our allies":{ "You have denounced our allies":{
Italian:"Hai denunciato i nostri alleati!" Italian:"Hai denunciato i nostri alleati!"
French:"Vous avez dénoncé nos alliées" French:"Vous avez dénoncé nos alliées"
Russian:"Вы осудили наших союзников!"
} }
"You have denounced our enemies":{ "You have denounced our enemies":{
Italian:"Hai denunciato i nostri nemici!" Italian:"Hai denunciato i nostri nemici!"
French:"Vous avez dénoncé nos ennemies" French:"Vous avez dénoncé nos ennemies"
Russian:"Вы осудили наших врагов"
} }
// Demands // Demands
"Demands":{ "Demands":{
Italian:"Richieste" Italian:"Richieste"
French:"Demandes" French:"Demandes"
Russian:"Требования"
} }
"Please don't settle new cities near us.":{ "Please don't settle new cities near us.":{
Italian:"Smetti di fondare città vicino a noi." Italian:"Smetti di fondare città vicino a noi."
French:"Veuillez ne pas construire de villes proches de nous." French:"Veuillez ne pas construire de villes proches de nous."
Russian:"Пожалуйста, не закладывайте новых городов рядом с нами."
} }
"Very well, we shall look for new lands to settle.":{ "Very well, we shall look for new lands to settle.":{
Italian:"Ti porgiamo le nostre scuse." Italian:"Ti porgiamo le nostre scuse."
French:"Très bien, nous chercherons d'autres terres à coloniser" French:"Très bien, nous chercherons d'autres terres à coloniser"
Russian:"Хорошо, мы найдем другие земли для поселений"
} }
"We shall do as we please.":{ "We shall do as we please.":{
Italian:"Colonizzeremo la terra che ci pare e piace." Italian:"Colonizzeremo la terra che ci pare e piace."
French:"Nous faisons ce que nous voulons." French:"Nous faisons ce que nous voulons."
Russian:"Мы поступим, как сочтем нужным"
} }
"You betrayed your promise to not settle cities near us":{ "You betrayed your promise to not settle cities near us":{
Italian:"Hai tradito la tua promessa di non fondare città nelle nostre vicinanze." Italian:"Hai tradito la tua promessa di non fondare città nelle nostre vicinanze."
French:"Vous avez trahis votre promesse de ne pas fonder de ville proche de nous" French:"Vous avez trahis votre promesse de ne pas fonder de ville proche de nous"
Russian:"Вы нарушили ваше обещание не закладывать города рядом с нами"
} }
"You fulfilled your promise to stop settling cities near us!":{ "You fulfilled your promise to stop settling cities near us!":{
Italian:"Hai mantenuto la tua promessa di non fondare città nelle nostre vicinanze." Italian:"Hai mantenuto la tua promessa di non fondare città nelle nostre vicinanze."
French:"Vous avez tenu votre promesse de ne pas fonder de ville proche de nous!" French:"Vous avez tenu votre promesse de ne pas fonder de ville proche de nous!"
Russian:"Вы выполнили ваше обещание не закладывать города рядом с нами"
} }
"You refused to stop settling cities near us":{ "You refused to stop settling cities near us":{
Italian:"Hai continuato a fondare città nelle nostre vicinanze." Italian:"Hai continuato a fondare città nelle nostre vicinanze."
French:"Vous avez refusez de ne pas fonder de villes proches de nous" French:"Vous avez refusez de ne pas fonder de villes proches de nous"
Russian:"Вы отказались не закладывать города рядом с нами"
} }
"We noticed your new city near our borders, despite your promise. This will have....implications.":{ "We noticed your new city near our borders, despite your promise. This will have....implications.":{
Italian:"Abbiamo notato la la tua nuova città vicino ai nostri confini. E questo avrà... ripercussioni sui nostri rapporti." Italian:"Abbiamo notato la la tua nuova città vicino ai nostri confini. E questo avrà... ripercussioni sui nostri rapporti."
French:"Nous avons remarquez votre nouvelle ville à notre frontière, malgré votre promesse. Cela aura des... conséquences." French:"Nous avons remarquez votre nouvelle ville à notre frontière, malgré votre promesse. Cela aura des... conséquences."
Russian:"Мы заметили ваш новый город около наших границ. Это может повлечь... последствия."
} }
"Your arrogant demands are in bad taste":{ "Your arrogant demands are in bad taste":{
Italian:"Hai fatto una richiesta arrogante." Italian:"Hai fatto una richiesta arrogante."
French:"Vos arrogantes demandes sont de mauvais goût" French:"Vos arrogantes demandes sont de mauvais goût"
Russian:"Ваши высокомерные требования раздражают"
} }
@ -432,24 +483,28 @@
Italian:"Acculturata" Italian:"Acculturata"
French:"Cultivée" French:"Cultivée"
Simplified_Chinese:"文化型" Simplified_Chinese:"文化型"
Russian:"Культурный"
} }
"Maritime":{ "Maritime":{
Italian:"Marittima" Italian:"Marittima"
French:"Maritime" //same French:"Maritime" //same
Simplified_Chinese:"航海型" Simplified_Chinese:"航海型"
Russian:"Морской"
} }
"Mercantile":{ "Mercantile":{
Italian:"Mercantile" Italian:"Mercantile"
//same in french //same in french
Simplified_Chinese:"商业型" Simplified_Chinese:"商业型"
Russian:"Торговый"
} }
"Militaristic":{ "Militaristic":{
Italian:"Militaristica" Italian:"Militaristica"
French:"Militarisée" French:"Militarisée"
Simplified_Chinese:"军事型" Simplified_Chinese:"军事型"
Russian:"Воинственный"
} }
////// Trade ////// Trade
@ -478,6 +533,7 @@
"Retract offer":{ "Retract offer":{
Italian:"Ritira offerta" Italian:"Ritira offerta"
Russian:"Отменить предложение"
} }
"What do you have in mind?":{ "What do you have in mind?":{
@ -504,7 +560,7 @@
"Our trade offer":{ "Our trade offer":{
Italian:"La nostra offerta" Italian:"La nostra offerta"
Russian:"Наше предложение\n обмена" Russian:"Наше предложение"
French:"Notre offre d'échange" French:"Notre offre d'échange"
Romanian:"Oferta noastră" Romanian:"Oferta noastră"
Spanish:"Nuestra oferta" Spanish:"Nuestra oferta"
@ -515,7 +571,7 @@
"[otherCiv]'s trade offer":{ "[otherCiv]'s trade offer":{
Italian:"Offerta di [otherCiv]" Italian:"Offerta di [otherCiv]"
Russian:"Предложение обмена \n цивилизации [otherCiv]" Russian:"Предложение от [otherCiv]"
French:"L'offre d'échange de [otherCiv]" French:"L'offre d'échange de [otherCiv]"
Romanian:"Ofertă de schimb a [otherCiv]" Romanian:"Ofertă de schimb a [otherCiv]"
Spanish:"Oferta de [otherCiv]" Spanish:"Oferta de [otherCiv]"
@ -584,6 +640,7 @@
French:"Continuer..." French:"Continuer..."
Simplified_Chinese:"继续..." Simplified_Chinese:"继续..."
Portuguese:"Prossiga" Portuguese:"Prossiga"
Russian:"Продолжить"
} }
"There's nothing on the table":{ "There's nothing on the table":{
@ -613,6 +670,7 @@
Simplified_Chinese:"协定" Simplified_Chinese:"协定"
French:"Accords" French:"Accords"
Portuguese:"Acordos" Portuguese:"Acordos"
Russian:"Соглашения"
} }
"Open Borders":{ "Open Borders":{
@ -620,6 +678,7 @@
Simplified_Chinese:"开放边境" Simplified_Chinese:"开放边境"
French:"Accord de libre passage" French:"Accord de libre passage"
Portuguese:"Acordo de fronteiras abertas" Portuguese:"Acordo de fronteiras abertas"
Russian:"Открытые границы"
} }
"Gold per turn":{ "Gold per turn":{
@ -651,6 +710,7 @@
French:"Technologies" French:"Technologies"
Simplified_Chinese:"科技" Simplified_Chinese:"科技"
Portuguese:"Tecnologias" Portuguese:"Tecnologias"
Russian:"Технологии"
} }
"Declarations of war":{ "Declarations of war":{
@ -658,6 +718,7 @@
French:"Déclarations de guerre" French:"Déclarations de guerre"
Simplified_Chinese:"宣战" Simplified_Chinese:"宣战"
Portuguese:"Declarações de guerra" Portuguese:"Declarações de guerra"
Russian:"Объявления войны"
} }
"Introduction to [nation]":{ "Introduction to [nation]":{
@ -669,6 +730,7 @@
French:"Ressources de luxes" French:"Ressources de luxes"
Simplified_Chinese:"奢侈资源" Simplified_Chinese:"奢侈资源"
Portuguese:"Recursos raros/luxuosos" //raros = rare luxuosos = luxurious Portuguese:"Recursos raros/luxuosos" //raros = rare luxuosos = luxurious
Russian:"Редкие ресуры"
} }
"Strategic resources":{ "Strategic resources":{
@ -676,6 +738,7 @@
French:"Ressources stratégiques" French:"Ressources stratégiques"
Simplified_Chinese:"战略资源" Simplified_Chinese:"战略资源"
Portuguese:"Recursos estratégicos" Portuguese:"Recursos estratégicos"
Russian:"Стратегические ресуры"
} }
@ -698,11 +761,13 @@
Simplified_Chinese:"无需战略资源[resourceName]" Simplified_Chinese:"无需战略资源[resourceName]"
French:"[resourceName] non requis" French:"[resourceName] non requis"
Portuguese:"[resourceName] não requirido" Portuguese:"[resourceName] não requirido"
Russian:"[resourceName] не требуется"
} }
"Lost ability":{ // as in Does not have +1 Visibility Range (or any other unit unique) "Lost ability":{ // as in Does not have +1 Visibility Range (or any other unit unique)
Italian:"Non possiede " Italian:"Non possiede "
Simplified_Chinese:"失去能力" Simplified_Chinese:"失去能力"
Russian:"Не имеет "
} }
"National ability":{ // the unique ability that each nation has "National ability":{ // the unique ability that each nation has
@ -712,7 +777,7 @@
German:"Nationalfähigkeit" German:"Nationalfähigkeit"
French:"Capacité de la civilisation" French:"Capacité de la civilisation"
Portuguese:"Habilidade nacional" Portuguese:"Habilidade nacional"
Russian:"Национальная способность" Russian:"Национальная особенность"
Simplified_Chinese:"民族特性" Simplified_Chinese:"民族特性"
} }
@ -733,7 +798,7 @@
German:"Ein kostenloser Großer Wissenschaftler erscheint, wenn Schrift erforscht wurde; Große Wissenschaftler erscheinen 50% häufiger" German:"Ein kostenloser Großer Wissenschaftler erscheint, wenn Schrift erforscht wurde; Große Wissenschaftler erscheinen 50% häufiger"
French:"Gagner un scientifique illustre lorsque Ecriture est dévouvert, les scientifiques illustres apparaissent 50% plus vite" French:"Gagner un scientifique illustre lorsque Ecriture est dévouvert, les scientifiques illustres apparaissent 50% plus vite"
Portuguese:"Receba gratuitamente um grande cientista quando você descobrir Escritura, ganhe grandes cientistas 50% mais rápido" Portuguese:"Receba gratuitamente um grande cientista quando você descobrir Escritura, ganhe grandes cientistas 50% mais rápido"
Russian:"Получите бесплатно великого ученого, когда откроете для себя написание, заработайте великих ученых на 50% быстрее" Russian:"Бесплатный Великий Ученый при исследовании Письменности. Великие Ученые появляются на 50% быстрее"
Simplified_Chinese:"发明文字后立即获得一个大科学家,大科学家点数积累速率+50%" Simplified_Chinese:"发明文字后立即获得一个大科学家,大科学家点数积累速率+50%"
Spanish:"Reciba un Gran Científico gratis cuando descubra Escribir, Gane Grandes Científicos 50% más rápido" Spanish:"Reciba un Gran Científico gratis cuando descubra Escribir, Gane Grandes Científicos 50% más rápido"
} }
@ -742,6 +807,7 @@
Italian:"Nabucodonosor II" Italian:"Nabucodonosor II"
French:"Nabuchodonosor II" French:"Nabuchodonosor II"
Simplified_Chinese:"尼布甲尼撒二世" Simplified_Chinese:"尼布甲尼撒二世"
Russian:"Навуходоносор II"
} }
"Greece":{ "Greece":{
@ -759,11 +825,13 @@
Italian:"Alessandro" Italian:"Alessandro"
French:"Alexandre le Grand" French:"Alexandre le Grand"
Simplified_Chinese:"亚历山大" Simplified_Chinese:"亚历山大"
Russian:"Александр Македонский"
}, },
"City-State Influence degrades at half and recovers at twice the normal rate": { "City-State Influence degrades at half and recovers at twice the normal rate": {
Simplified_Chinese:"对城邦影响力衰减速度减半,恢复速度加倍" Simplified_Chinese:"对城邦影响力衰减速度减半,恢复速度加倍"
Italian:"L'influenza sulle città-stato diminuisce il doppio più lentamente e aumenta il doppio più velocemente." Italian:"L'influenza sulle città-stato diminuisce il doppio più lentamente e aumenta il doppio più velocemente."
Russian:"Влияние на города-государства снижается вдвое медленнее и увеличивается вдвое быстрее"
}, },
"China":{ "China":{
@ -779,6 +847,7 @@
"Wu Zetian":{ "Wu Zetian":{
Simplified_Chinese:"武则天" Simplified_Chinese:"武则天"
Russian:"У Цзэтянь"
}, },
"Great general provides double combat bonus, and spawns 50% faster":{ "Great general provides double combat bonus, and spawns 50% faster":{
@ -790,6 +859,7 @@
Portuguese:"Grande general fornece bônus de combate duplo e é gerado 50% mais rápido" Portuguese:"Grande general fornece bônus de combate duplo e é gerado 50% mais rápido"
Russian:"Великий полководец дает двойной боевой бонус и появляется на 50% быстрее" Russian:"Великий полководец дает двойной боевой бонус и появляется на 50% быстрее"
Spanish:"El gran general proporciona bonificación de combate doble y genera un 50% más rápido." Spanish:"El gran general proporciona bonificación de combate doble y genera un 50% más rápido."
Russian:"Великий Полководец дает двойной бонус в бою и появляется на 50% быстрее"
} }
"Egypt":{ "Egypt":{
@ -807,6 +877,7 @@
Italian:"Ramses II" Italian:"Ramses II"
French:"Ramsès II" French:"Ramsès II"
Simplified_Chinese:"拉美西斯二世" Simplified_Chinese:"拉美西斯二世"
Russian:"Рамзес II"
} }
"+20% production towards Wonder construction":{ "+20% production towards Wonder construction":{
@ -835,6 +906,7 @@
Italian:"Elisabetta" Italian:"Elisabetta"
//same in french //same in french
Simplified_Chinese:"伊丽莎白" Simplified_Chinese:"伊丽莎白"
Russian:"Елизавета"
} }
"+2 movement for all naval units":{ "+2 movement for all naval units":{
@ -863,6 +935,7 @@
Italian:"Napoleone" Italian:"Napoleone"
French:"Napoléon" French:"Napoléon"
Simplified_Chinese:"拿破仑" Simplified_Chinese:"拿破仑"
Russian:"Наполеон"
} }
"+2 Culture per turn from cities before discovering Steam Power":{ "+2 Culture per turn from cities before discovering Steam Power":{
@ -872,7 +945,7 @@
Spanish:"+2 Cultura por turno desde las ciudades antes de descubrir la Energía de Vapor." Spanish:"+2 Cultura por turno desde las ciudades antes de descubrir la Energía de Vapor."
Romanian:"+2 Cultură pe turn de la orașe înainte de a descoperi puterea de abur" Romanian:"+2 Cultură pe turn de la orașe înainte de a descoperi puterea de abur"
Portuguese:"+2 Cultura por turno das cidades antes de descobrir o poder do vapor" //'poder do vapor' means the power of steam Portuguese:"+2 Cultura por turno das cidades antes de descobrir o poder do vapor" //'poder do vapor' means the power of steam
Russian:"+2 Культура за ход из городов, прежде чем открыть для себя силу пара" Russian:"+2 Культура за ход от городов до открытия Парового Двигателя"
Simplified_Chinese:"在发明蒸汽机之前,每座城市的文化+2" Simplified_Chinese:"在发明蒸汽机之前,每座城市的文化+2"
} }
@ -891,6 +964,7 @@
Italian:"Caterina II" Italian:"Caterina II"
French:"Catherine II" French:"Catherine II"
Simplified_Chinese:"叶卡捷琳娜二世" Simplified_Chinese:"叶卡捷琳娜二世"
Russian:"Екатерина Великая"
} }
"Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity":{ "Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity":{
@ -901,7 +975,7 @@
German:"Strategische Ressourcen geben +1 Produktion und Pferde, Eisen und Uran Ressourcen geben die doppelte Menge" German:"Strategische Ressourcen geben +1 Produktion und Pferde, Eisen und Uran Ressourcen geben die doppelte Menge"
French:"Les ressources stratégiques donnent +1 production, et les quantités de chevaux, fer et uranium sont doublés" French:"Les ressources stratégiques donnent +1 production, et les quantités de chevaux, fer et uranium sont doublés"
Portuguese:"Recursos Estratégicos fornecem Produção de +1, recursos de cavalos, ferro e urânio fornecem quantidade dupla" Portuguese:"Recursos Estratégicos fornecem Produção de +1, recursos de cavalos, ferro e urânio fornecem quantidade dupla"
Russian:"Стратегические ресурсы дают +1 к добыче, а ресурсы для лошадей, железа и урана дают двойное количество" Russian:"Стратегические ресурсы дают +1 к производству, а количество ресуров Лошади, Железо и Уран удваивается"
} }
"Rome":{ "Rome":{
@ -919,6 +993,7 @@
Italian:"Cesare Augusto" Italian:"Cesare Augusto"
French:"Jule César" French:"Jule César"
Simplified_Chinese:"奥古斯都·恺撒" Simplified_Chinese:"奥古斯都·恺撒"
Russian:"Октавиан Август"
} }
"+25% Production towards any buildings that already exist in the Capital":{ "+25% Production towards any buildings that already exist in the Capital":{
@ -948,6 +1023,7 @@
Italian:"Harun al-Rashid" //Same as Italian Italian:"Harun al-Rashid" //Same as Italian
French:"Hâroun ar-Rachîd" French:"Hâroun ar-Rachîd"
Simplified_Chinese:"哈伦·拉希德" Simplified_Chinese:"哈伦·拉希德"
Russian:"Гарун-аль-Рашид"
} }
"+1 Gold from each Trade Route, Oil resources provide double quantity":{ "+1 Gold from each Trade Route, Oil resources provide double quantity":{
@ -955,6 +1031,7 @@
Simplified_Chinese:"每条贸易路线+1金钱石油储量加倍" Simplified_Chinese:"每条贸易路线+1金钱石油储量加倍"
Portuguese:"1 ouro adicional de rotas comerciais e recursos de petróleo geram o dobro" // óleo could mean normal kitchen oil and even fuel from sugar cane Portuguese:"1 ouro adicional de rotas comerciais e recursos de petróleo geram o dobro" // óleo could mean normal kitchen oil and even fuel from sugar cane
French:"+1 Or pour chaque route commerciale, la quantité de pétrole est doublée" French:"+1 Or pour chaque route commerciale, la quantité de pétrole est doublée"
Russian:"+1 Золото от каждого торгового маршрута, количество ресурса Нефть удваивается"
} }
"America":{ "America":{
@ -972,6 +1049,7 @@
Italian:"George Washington" //Same as Italian Italian:"George Washington" //Same as Italian
//same in french //same in french
Simplified_Chinese:"乔治·华盛顿" Simplified_Chinese:"乔治·华盛顿"
Russian:"Джордж Вашингтон"
} }
"All land military units have +1 sight, 50% discount when purchasing tiles":{ "All land military units have +1 sight, 50% discount when purchasing tiles":{
@ -982,7 +1060,7 @@
German:"Alle militärischen Landeinheiten haben +1 Sicht; 50% niedrigerer Preis beim Kauf von Feldern" German:"Alle militärischen Landeinheiten haben +1 Sicht; 50% niedrigerer Preis beim Kauf von Feldern"
French:"Toutes les unités terrestres ont +1 porté de vision, les cases coutent 50% de leurs prix à l'achat" French:"Toutes les unités terrestres ont +1 porté de vision, les cases coutent 50% de leurs prix à l'achat"
Portuguese:"Todas as unidades militares terrestres ganham +1 alcançe devisão e 50% de desconto na compra de terrenos" //i don't remember my translations being this bad? who was the monster? Portuguese:"Todas as unidades militares terrestres ganham +1 alcançe devisão e 50% de desconto na compra de terrenos" //i don't remember my translations being this bad? who was the monster?
Russian:"Все наземные воинские части имеют +1 прицел, скидка 50% при покупке плитки" Russian:"Все наземные военные юниты имеют +1 обзор, скидка 50% при покупке клетки"
} }
"Japan":{ "Japan":{
@ -1000,6 +1078,7 @@
Italian:"Oda Nobunaga" //Same as Italian Italian:"Oda Nobunaga" //Same as Italian
//same in french //same in french
Simplified_Chinese:"织田信长" Simplified_Chinese:"织田信长"
Russian:"Ода Нобунага"
} }
"Units fight as though they were at full strength even when damaged":{ "Units fight as though they were at full strength even when damaged":{
@ -1010,7 +1089,7 @@
German:"Einheiten kämpfen so, als wären sie selbst bei Beschädigung in voller Stärke" German:"Einheiten kämpfen so, als wären sie selbst bei Beschädigung in voller Stärke"
French:"Les unités combattent comme si elles étaient à pleine force même lorsqu'elles sont endommagées" French:"Les unités combattent comme si elles étaient à pleine force même lorsqu'elles sont endommagées"
Portuguese:"Unidades lutam como se estivessem em força total mesmo quando danificadas" Portuguese:"Unidades lutam como se estivessem em força total mesmo quando danificadas"
Russian:"Юниты сражаются, как будто они в полной силе, даже когда повреждены" Russian:"Юниты сражаются в полную силу, даже будучи ранеными"
} }
"Germany":{ "Germany":{
@ -1018,18 +1097,21 @@
French:"Allemagne" French:"Allemagne"
Simplified_Chinese:"德意志" Simplified_Chinese:"德意志"
Portuguese:"Alemanha" Portuguese:"Alemanha"
Russian:"Германия"
} }
"Otto von Bismark":{ "Otto von Bismark":{
Italian:"Otto von Bismark" //Same as Italian Italian:"Otto von Bismark" //Same as Italian
French:"Otto von Bismarck" French:"Otto von Bismarck"
Simplified_Chinese:"奥托·冯·俾斯麦" Simplified_Chinese:"奥托·冯·俾斯麦"
Russian:"Отто фон Бисмарк"
} }
"67% chance to earn 25 Gold and recruit a Barbarian unit from a conquered encampment, -25% land units maintenance.":{ "67% chance to earn 25 Gold and recruit a Barbarian unit from a conquered encampment, -25% land units maintenance.":{
Italian:"67% di probabilità di ottenere 25 Oro e reclutare un'unità barbara da un accampamento catturato. -25% mantenimento delle unità terrestri." Italian:"67% di probabilità di ottenere 25 Oro e reclutare un'unità barbara da un accampamento catturato. -25% mantenimento delle unità terrestri."
French:"67% de chance de gagner 25 or et d'enroler une unité barbare lors de la prise d'un campement barbare. -25% de coût de maintenance pour les unités terrestres." French:"67% de chance de gagner 25 or et d'enroler une unité barbare lors de la prise d'un campement barbare. -25% de coût de maintenance pour les unités terrestres."
Simplified_Chinese:"击败蛮族营地中的蛮族单位有67%几率得到25金钱并使其加入陆上单位维护费-25%" Simplified_Chinese:"击败蛮族营地中的蛮族单位有67%几率得到25金钱并使其加入陆上单位维护费-25%"
Russian:"Шанс 67% получить 25 Золото и варварский юнит из захваченного лагеря. -25% к стоимости содержания наземных юнитов.
} }
"India":{ "India":{
@ -1037,12 +1119,14 @@
French:"Inde" French:"Inde"
Portuguese:"Índia" Portuguese:"Índia"
Simplified_Chinese:"印度" Simplified_Chinese:"印度"
Russian:"Индия"
} }
"Gandhi":{ "Gandhi":{
Italian:"Gandhi" //Same as Italian Italian:"Gandhi" //Same as Italian
//same in french //same in french
Simplified_Chinese:"甘地" Simplified_Chinese:"甘地"
Russian:"Махатма Ганди"
} }
"Unhappiness from number of Cities doubled, Unhappiness from number of Citizens halved.":{ "Unhappiness from number of Cities doubled, Unhappiness from number of Citizens halved.":{
@ -1050,6 +1134,7 @@
Portuguese:"Tristeza por número de cidades dobrada e tristeza por número de cidadões reduzida pela metade" Portuguese:"Tristeza por número de cidades dobrada e tristeza por número de cidadões reduzida pela metade"
French:"Le mécontentement dut au nombre de villes est doublé. Le mécontentement dut au nombre de citoyens est réduit de moitié" French:"Le mécontentement dut au nombre de villes est doublé. Le mécontentement dut au nombre de citoyens est réduit de moitié"
Simplified_Chinese:"城市数量导致的不满加倍,市民数量导致的不满减半" Simplified_Chinese:"城市数量导致的不满加倍,市民数量导致的不满减半"
Russian:"Удвоенное недовольство от числа городов. Недовольство от количества горожан в два раза меньше."
} }
"The Ottomans":{ "The Ottomans":{
@ -1057,12 +1142,14 @@
French:"Turquie" French:"Turquie"
Portuguese:"Turquia" Portuguese:"Turquia"
Simplified_Chinese:"奥斯曼" Simplified_Chinese:"奥斯曼"
Russian:"Турция"
} }
"Suleiman I":{ "Suleiman I":{
Italian:"Solimano I" Italian:"Solimano I"
French:"Soliman le Magnifique" French:"Soliman le Magnifique"
Simplified_Chinese:"苏莱曼一世" Simplified_Chinese:"苏莱曼一世"
Russian:"Сулейман I"
} }
"Pay only one third the usual cost for naval unit maintenance. Melee naval units have a 1/3 chance to capture defeated naval units.":{ "Pay only one third the usual cost for naval unit maintenance. Melee naval units have a 1/3 chance to capture defeated naval units.":{
@ -1070,6 +1157,7 @@
Portuguese:"50% de chance de converter uma unidade naval bárbara para ti e ganhar 25 ouro. Gaste apenas 1/3 do custo normal para manter unidades navais." Portuguese:"50% de chance de converter uma unidade naval bárbara para ti e ganhar 25 ouro. Gaste apenas 1/3 do custo normal para manter unidades navais."
French:"50% de chance de convertir une unité barbare navale et de gagner 25 Or. Les unités navales coutent 3 fois moins à entretenir." French:"50% de chance de convertir une unité barbare navale et de gagner 25 Or. Les unités navales coutent 3 fois moins à entretenir."
Simplified_Chinese:"海上单位维护费为正常值的1/3海军近战单位拥有1/3几率俘获战败的敌方海军单位" Simplified_Chinese:"海上单位维护费为正常值的1/3海军近战单位拥有1/3几率俘获战败的敌方海军单位"
Russian:"Содержание морских юнитов стоит треть обычной цены. Морские юниты ближнего боя имеют 1/3 шанс захвата побеждённых кораблей."
} }
"Korea":{ "Korea":{
@ -1077,6 +1165,7 @@
French:"Corée" French:"Corée"
Portuguese:"Coréia" Portuguese:"Coréia"
Simplified_Chinese:"朝鲜" Simplified_Chinese:"朝鲜"
Russian:"Корея"
} }
"Sejong":{ "Sejong":{
@ -1087,6 +1176,13 @@
Simplified_Chinese:"所有专业人员和所有伟人设施+2科研" Simplified_Chinese:"所有专业人员和所有伟人设施+2科研"
} }
"+1 Science for all Specialists and Great Person tile improvements. Receive a tech boost each time a scientific building/Wonder is built in the Korean Capital.":{
Italian:"+1 Scienza per ogni Specialista e miglioramento Grande Personaggio. Ricevi uno sprint tecnologico ogni volta che la tua Capitale costruisce un edificio o una Meraviglia scientifica."
Portuguese:"+1 ciência por todas as melhorias de terras de especialístas e grandes pessoas. Receba um bonus de pesquisa a cada construção/maravilha ciêntifica é construida na capital"
French:"+1 Science pour chaque spécialistes et amélioration de case de personnage illustre. Reçoit un bonus de science à chaque fois qu'un batiment ou une merveille scientifique est construit dans la capitale"
Russian:"+1 Наука для всех специалистов и улучшений клеток Великими людьми. Получите бонус к исследованию каждый раз при создании научного здания/чуда в Корейской столице"
}
/* /*
"Iroquois":{ "Iroquois":{
@ -1201,7 +1297,7 @@
German:"Unikate" German:"Unikate"
French:"Uniques" French:"Uniques"
Portuguese:"Únicos(a)" Portuguese:"Únicos(a)"
Russian:"уникальный" Russian:"Уникальные юниты"
} }
"Promotions":{ "Promotions":{
@ -1212,7 +1308,7 @@
German:"Beförderungen" German:"Beförderungen"
French:"Promotions" French:"Promotions"
Portuguese:"Promoções" Portuguese:"Promoções"
Russian:"промо акции" Russian:"Повышения"
} }
"units in rough terrain":{ "units in rough terrain":{

View file

@ -251,7 +251,7 @@
EnemyCity: [ EnemyCity: [
[ [
"You have encoutered an enemy city!", "You have encountered an enemy city!",
"Cities can be conquered by reducing their health to 1,", "Cities can be conquered by reducing their health to 1,",
" and entering the city with a melee unit.", " and entering the city with a melee unit.",
"Since cities heal each turn, it is best to attack with ranged units" "Since cities heal each turn, it is best to attack with ranged units"

View file

@ -20,9 +20,9 @@ android {
defaultConfig { defaultConfig {
applicationId "com.unciv.app" applicationId "com.unciv.app"
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 28 targetSdkVersion 29
versionCode 293 versionCode 294
versionName "3.0.0" versionName "3.0.1"
} }
// Had to add this crap for Travis to build, it wanted to sign the app // Had to add this crap for Travis to build, it wanted to sign the app

View file

@ -8,6 +8,7 @@ buildscript {
repositories { repositories {
// Chinese mirrors for quicker loading for chinese devs
maven{ url 'https://maven.aliyun.com/repository/jcenter'} maven{ url 'https://maven.aliyun.com/repository/jcenter'}
maven{ url 'https://maven.aliyun.com/repository/google'} maven{ url 'https://maven.aliyun.com/repository/google'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'} maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
@ -40,6 +41,7 @@ allprojects {
} }
repositories { repositories {
// Chinese mirrors for quicker loading for chinese devs
maven{ url 'https://maven.aliyun.com/repository/jcenter'} maven{ url 'https://maven.aliyun.com/repository/jcenter'}
maven{ url 'https://maven.aliyun.com/repository/google'} maven{ url 'https://maven.aliyun.com/repository/google'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'} maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}

View file

@ -87,7 +87,7 @@ class TileMap {
// Only once we add the unit to the civ we can activate addPromotion, because it will try to update civ viewable tiles // Only once we add the unit to the civ we can activate addPromotion, because it will try to update civ viewable tiles
for(promotion in unit.baseUnit.promotions) for(promotion in unit.baseUnit.promotions)
unit.promotions.addPromotion(promotion,true) unit.promotions.addPromotion(promotion, true)
// And update civ stats, since the new unit changes both unit upkeep and resource consumption // And update civ stats, since the new unit changes both unit upkeep and resource consumption
civInfo.updateStatsForNextTurn() civInfo.updateStatsForNextTurn()

View file

@ -15,7 +15,7 @@ class UnitPromotions{
fun xpForNextPromotion() = (numberOfPromotions+1)*10 fun xpForNextPromotion() = (numberOfPromotions+1)*10
fun canBePromoted() = XP >= xpForNextPromotion() fun canBePromoted() = XP >= xpForNextPromotion()
fun addPromotion(promotionName:String, isFree:Boolean = false, updateViewableTiles:Boolean=true){ fun addPromotion(promotionName: String, isFree: Boolean = false){
if (!isFree) { if (!isFree) {
XP -= xpForNextPromotion() XP -= xpForNextPromotion()
numberOfPromotions++ numberOfPromotions++
@ -29,7 +29,6 @@ class UnitPromotions{
// Since some units get promotions upon construction, they will get the addPromotion from the unit.postBuildEvent // Since some units get promotions upon construction, they will get the addPromotion from the unit.postBuildEvent
// upon creation, BEFORE they are assigned to a tile, so the updateViewableTiles() would crash. // upon creation, BEFORE they are assigned to a tile, so the updateViewableTiles() would crash.
// So, if the addPromotion was triggered from there, simply don't update // So, if the addPromotion was triggered from there, simply don't update
// if(updateViewableTiles)
unit.updateViewableTiles() // some promotions/uniques give the unit bonus sight unit.updateViewableTiles() // some promotions/uniques give the unit bonus sight
} }

View file

@ -29,7 +29,7 @@ class TileImprovement : NamedStats(), ICivilopedia {
override val description: String override val description: String
get() { get() {
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
if (!this.clone().toString().isEmpty()) stringBuilder.appendln(this.clone().toString()) if (this.clone().toString().isNotEmpty()) stringBuilder.appendln(this.clone().toString())
if (!terrainsCanBeBuiltOn.isEmpty()) { if (!terrainsCanBeBuiltOn.isEmpty()) {
val terrainsCanBeBuiltOnString:ArrayList<String> = arrayListOf() val terrainsCanBeBuiltOnString:ArrayList<String> = arrayListOf()
for (i in terrainsCanBeBuiltOn) { for (i in terrainsCanBeBuiltOn) {

View file

@ -3,6 +3,7 @@ package com.unciv.ui.mapeditor
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
@ -68,7 +69,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
onClick { onClick {
clearSelection() clearSelection()
clearImprovement = true clearImprovement = true
setCurrentHex(ImageGetter.getCircle().apply { setSize(60f,60f) }) setCurrentHex(getHex(Color.WHITE), "Clear improvements")
} }
}).row() }).row()
@ -78,7 +79,8 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
improvementImage.onClick { improvementImage.onClick {
clearSelection() clearSelection()
selectedImprovement=improvement selectedImprovement=improvement
setCurrentHex(getHex(Color.WHITE,ImageGetter.getImprovementIcon(improvement.name,40f))) val improvementIcon = getHex(Color.WHITE,ImageGetter.getImprovementIcon(improvement.name,40f))
setCurrentHex(improvementIcon, improvement.name+"\n"+improvement.clone().toString())
} }
improvementsTable.add(improvementImage).row() improvementsTable.add(improvementImage).row()
} }
@ -90,7 +92,8 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
nationImage.onClick { nationImage.onClick {
clearSelection() clearSelection()
selectedImprovement=TileImprovement().apply { name="StartingLocation "+nation.name } selectedImprovement=TileImprovement().apply { name="StartingLocation "+nation.name }
setCurrentHex(getHex(Color.WHITE,ImageGetter.getNationIndicator(nation,40f))) val nationIcon = getHex(Color.WHITE,ImageGetter.getNationIndicator(nation,40f))
setCurrentHex(nationIcon, nation.name+" starting location")
} }
nationsTable.add(nationImage).row() nationsTable.add(nationImage).row()
} }
@ -106,7 +109,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
onClick { onClick {
clearSelection() clearSelection()
clearTerrainFeature = true clearTerrainFeature = true
setCurrentHex(ImageGetter.getCircle().apply { setSize(60f,60f) }) setCurrentHex(getHex(Color.WHITE), "Clear terrain features")
} }
}) })
@ -127,7 +130,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
group.onClick { group.onClick {
clearSelection() clearSelection()
selectedTerrain = terrain selectedTerrain = terrain
setCurrentHex(tileInfo) setCurrentHex(tileInfo,terrain.name+"\n"+terrain.clone().toString())
} }
if (terrain.type == TerrainType.TerrainFeature) if (terrain.type == TerrainType.TerrainFeature)
@ -141,7 +144,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
onClick { onClick {
clearSelection() clearSelection()
clearResource = true clearResource = true
setCurrentHex(ImageGetter.getCircle().apply { setSize(60f,60f) }) setCurrentHex(getHex(Color.WHITE),"Clear resource")
} }
}) })
@ -162,7 +165,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
tileInfo.resource = resource.name tileInfo.resource = resource.name
tileInfo.setTransients() tileInfo.setTransients()
setCurrentHex(tileInfo) setCurrentHex(tileInfo,resource.name+"\n"+resource.clone().toString())
} }
resources.add(resourceHex) resources.add(resourceHex)
} }
@ -178,7 +181,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
val terrainFeaturesTable = Table().apply { defaults().pad(20f) } val terrainFeaturesTable = Table().apply { defaults().pad(20f) }
for(terrainFeature in terrainFeatures) terrainFeaturesTable.add(terrainFeature).row() for(terrainFeature in terrainFeatures) terrainFeaturesTable.add(terrainFeature).row()
terrainFeaturesTable.pack() terrainFeaturesTable.pack()
terrainsAndResourcesTable.add(terrainFeaturesTable) terrainsAndResourcesTable.add(ScrollPane(terrainFeaturesTable).apply { setScrollingDisabled(true,false) }).height(mapEditorScreen.stage.height*0.7f)
val resourcesTable = Table() val resourcesTable = Table()
for(resource in resources) resourcesTable.add(resource).row() for(resource in resources) resourcesTable.add(resource).row()
@ -244,19 +247,23 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
} }
fun setCurrentHex(tileInfo: TileInfo){ fun setCurrentHex(tileInfo: TileInfo, text:String){
val tileGroup = TileGroup(tileInfo,TileSetStrings()) val tileGroup = TileGroup(tileInfo,TileSetStrings())
.apply { .apply {
showEntireMap=true showEntireMap=true
forMapEditorIcon=true forMapEditorIcon=true
update() update()
} }
setCurrentHex(tileGroup) setCurrentHex(tileGroup,text)
} }
fun setCurrentHex(actor:Actor){ fun setCurrentHex(actor:Actor, text:String){
currentHex.remove() currentHex.remove()
currentHex=actor val currentHexTable = Table()
currentHexTable.add(Label(text,skin)).padRight(20f)
currentHexTable.add(actor).pad(10f)
currentHexTable.pack()
currentHex=currentHexTable
currentHex.setPosition(stage.width-currentHex.width-10, 10f) currentHex.setPosition(stage.width-currentHex.width-10, 10f)
stage.addActor(currentHex) stage.addActor(currentHex)
} }

View file

@ -1,5 +1,6 @@
package com.unciv.ui.newgamescreen package com.unciv.ui.newgamescreen
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
@ -60,11 +61,12 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
playerIdTable.add("Player ID:".toLabel()) playerIdTable.add("Player ID:".toLabel())
val playerIdTextfield = TextField(player.playerId, CameraStageBaseScreen.skin) val playerIdTextfield = TextField(player.playerId, CameraStageBaseScreen.skin)
playerIdTable.add(playerIdTextfield) playerIdTable.add(playerIdTextfield).colspan(2)
val errorLabel = "Not a valid user id!".toLabel().setFontColor(Color.RED) val errorLabel = "Not a valid user id!".toLabel().setFontColor(Color.RED)
errorLabel.isVisible=false errorLabel.isVisible=false
playerIdTable.add(errorLabel) playerIdTable.add(errorLabel)
playerIdTextfield.addListener {
fun onPlayerIdTextUpdated(){
try { try {
val uuid = UUID.fromString(playerIdTextfield.text) val uuid = UUID.fromString(playerIdTextfield.text)
player.playerId = playerIdTextfield.text player.playerId = playerIdTextfield.text
@ -72,19 +74,27 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
} catch (ex: Exception) { } catch (ex: Exception) {
errorLabel.isVisible=true errorLabel.isVisible=true
} }
true
} }
playerIdTextfield.addListener { onPlayerIdTextUpdated(); true }
playerIdTable.row() playerIdTable.row()
val currentUserId = UnCivGame.Current.settings.userId val currentUserId = UnCivGame.Current.settings.userId
val setCurrentUserButton = TextButton("Set current user", CameraStageBaseScreen.skin) val setCurrentUserButton = TextButton("Set current user".tr(), CameraStageBaseScreen.skin)
setCurrentUserButton.onClick { setCurrentUserButton.onClick {
playerIdTextfield.text = currentUserId playerIdTextfield.text = currentUserId
errorLabel.isVisible = false onPlayerIdTextUpdated()
} }
playerIdTable.add(setCurrentUserButton) playerIdTable.add(setCurrentUserButton)
val copyFromClipboardButton = TextButton("Player ID from clipboard",CameraStageBaseScreen.skin)
copyFromClipboardButton.onClick {
playerIdTextfield.text = Gdx.app.clipboard.contents
onPlayerIdTextUpdated()
}
playerIdTable.add(copyFromClipboardButton).pad(5f)
playerTable.add(playerIdTable).colspan(playerTable.columns) playerTable.add(playerIdTable).colspan(playerTable.columns)
} }

View file

@ -23,7 +23,7 @@ import com.unciv.ui.utils.*
import com.unciv.ui.worldscreen.optionstable.YesNoPopupTable import com.unciv.ui.worldscreen.optionstable.YesNoPopupTable
import kotlin.math.roundToInt import kotlin.math.roundToInt
class DiplomacyScreen:CameraStageBaseScreen() { class DiplomacyScreen(val viewingCiv:CivilizationInfo):CameraStageBaseScreen() {
val leftSideTable = Table().apply { defaults().pad(10f) } val leftSideTable = Table().apply { defaults().pad(10f) }
val rightSideTable = Table() val rightSideTable = Table()
@ -53,15 +53,14 @@ class DiplomacyScreen:CameraStageBaseScreen() {
private fun updateLeftSideTable() { private fun updateLeftSideTable() {
leftSideTable.clear() leftSideTable.clear()
val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization()
for (civ in UnCivGame.Current.gameInfo.civilizations for (civ in UnCivGame.Current.gameInfo.civilizations
.filterNot { it.isDefeated() || it == currentPlayerCiv || it.isBarbarian() }) { .filterNot { it.isDefeated() || it == viewingCiv || it.isBarbarian() }) {
if (!currentPlayerCiv.knows(civ)) continue if (!viewingCiv.knows(civ)) continue
val civIndicator = ImageGetter.getNationIndicator(civ.nation,100f) val civIndicator = ImageGetter.getNationIndicator(civ.nation,100f)
val relationship = ImageGetter.getCircle() val relationship = ImageGetter.getCircle()
if(currentPlayerCiv.isAtWarWith(civ)) relationship.color = Color.RED if(viewingCiv.isAtWarWith(civ)) relationship.color = Color.RED
else relationship.color = Color.GREEN else relationship.color = Color.GREEN
relationship.setSize(30f,30f) relationship.setSize(30f,30f)
civIndicator.addActor(relationship) civIndicator.addActor(relationship)
@ -90,8 +89,7 @@ class DiplomacyScreen:CameraStageBaseScreen() {
private fun getCityStateDiplomacyTable(otherCiv: CivilizationInfo): Table { private fun getCityStateDiplomacyTable(otherCiv: CivilizationInfo): Table {
val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() val otherCivDiplomacyManager = otherCiv.getDiplomacyManager(viewingCiv)
val otherCivDiplomacyManager = otherCiv.getDiplomacyManager(currentPlayerCiv)
val diplomacyTable = Table() val diplomacyTable = Table()
diplomacyTable.defaults().pad(10f) diplomacyTable.defaults().pad(10f)
@ -102,7 +100,7 @@ class DiplomacyScreen:CameraStageBaseScreen() {
diplomacyTable.add(getRelationshipTable(otherCivDiplomacyManager)).row() diplomacyTable.add(getRelationshipTable(otherCivDiplomacyManager)).row()
val friendBonusText = when (otherCiv.getCityStateType()) { val friendBonusText = when (otherCiv.getCityStateType()) {
CityStateType.Cultured -> "Provides [" + (3 * (currentPlayerCiv.getEra().ordinal + 1)).toString() + "] culture at [30] Influence" CityStateType.Cultured -> "Provides [" + (3 * (viewingCiv.getEra().ordinal + 1)).toString() + "] culture at [30] Influence"
CityStateType.Maritime -> "Provides 3 food in capital and 1 food in other cities at [30] Influence" CityStateType.Maritime -> "Provides 3 food in capital and 1 food in other cities at [30] Influence"
CityStateType.Mercantile -> "Provides 3 happiness at [30] Influence" CityStateType.Mercantile -> "Provides 3 happiness at [30] Influence"
CityStateType.Militaristic -> "Provides land units every 20 turns at [30] Influence" CityStateType.Militaristic -> "Provides land units every 20 turns at [30] Influence"
@ -124,19 +122,19 @@ class DiplomacyScreen:CameraStageBaseScreen() {
val influenceAmount = giftAmount / 10 val influenceAmount = giftAmount / 10
val giftButton = TextButton("Gift [$giftAmount] gold (+[$influenceAmount] influence)".tr(), skin) val giftButton = TextButton("Gift [$giftAmount] gold (+[$influenceAmount] influence)".tr(), skin)
giftButton.onClick { giftButton.onClick {
currentPlayerCiv.giveGoldGift(otherCiv, giftAmount) viewingCiv.giveGoldGift(otherCiv, giftAmount)
updateRightSide(otherCiv) updateRightSide(otherCiv)
} }
diplomacyTable.add(giftButton).row() diplomacyTable.add(giftButton).row()
if (currentPlayerCiv.gold < giftAmount || isNotPlayersTurn()) giftButton.disable() if (viewingCiv.gold < giftAmount || isNotPlayersTurn()) giftButton.disable()
val diplomacyManager = currentPlayerCiv.getDiplomacyManager(otherCiv) val diplomacyManager = viewingCiv.getDiplomacyManager(otherCiv)
if (currentPlayerCiv.isAtWarWith(otherCiv)) { if (viewingCiv.isAtWarWith(otherCiv)) {
val peaceButton = TextButton("Negotiate Peace".tr(), skin) val peaceButton = TextButton("Negotiate Peace".tr(), skin)
peaceButton.onClick { peaceButton.onClick {
YesNoPopupTable("Peace with [${otherCiv.civName}]?".tr(), { YesNoPopupTable("Peace with [${otherCiv.civName}]?".tr(), {
val tradeLogic = TradeLogic(currentPlayerCiv, otherCiv) val tradeLogic = TradeLogic(viewingCiv, otherCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty, 30)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty, 30))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty, 30)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty, 30))
tradeLogic.acceptTrade() tradeLogic.acceptTrade()
@ -155,8 +153,7 @@ class DiplomacyScreen:CameraStageBaseScreen() {
} }
private fun getMajorCivDiplomacyTable(otherCiv: CivilizationInfo): Table { private fun getMajorCivDiplomacyTable(otherCiv: CivilizationInfo): Table {
val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() val otherCivDiplomacyManager = otherCiv.getDiplomacyManager(viewingCiv)
val otherCivDiplomacyManager = otherCiv.getDiplomacyManager(currentPlayerCiv)
val diplomacyTable = Table() val diplomacyTable = Table()
diplomacyTable.defaults().pad(10f) diplomacyTable.defaults().pad(10f)
@ -169,7 +166,7 @@ class DiplomacyScreen:CameraStageBaseScreen() {
diplomacyTable.add(translatedNation.neutralHello.toLabel()).row() diplomacyTable.add(translatedNation.neutralHello.toLabel()).row()
diplomacyTable.addSeparator() diplomacyTable.addSeparator()
if(!currentPlayerCiv.isAtWarWith(otherCiv)) { if(!viewingCiv.isAtWarWith(otherCiv)) {
val tradeButton = TextButton("Trade".tr(), skin) val tradeButton = TextButton("Trade".tr(), skin)
tradeButton.onClick { setTrade(otherCiv) } tradeButton.onClick { setTrade(otherCiv) }
diplomacyTable.add(tradeButton).row() diplomacyTable.add(tradeButton).row()
@ -190,11 +187,11 @@ class DiplomacyScreen:CameraStageBaseScreen() {
diplomacyTable.add(negotiatePeaceButton).row() diplomacyTable.add(negotiatePeaceButton).row()
} }
val diplomacyManager = currentPlayerCiv.getDiplomacyManager(otherCiv) val diplomacyManager = viewingCiv.getDiplomacyManager(otherCiv)
if (!currentPlayerCiv.isAtWarWith(otherCiv)) { if (!viewingCiv.isAtWarWith(otherCiv)) {
if(otherCivDiplomacyManager.relationshipLevel() > RelationshipLevel.Neutral if(otherCivDiplomacyManager.relationshipLevel() > RelationshipLevel.Neutral
&& !diplomacyManager.hasFlag(DiplomacyFlags.DeclarationOfFriendship) && !diplomacyManager.hasFlag(DiplomacyFlags.DeclarationOfFriendship)
&& !diplomacyManager.hasFlag(DiplomacyFlags.Denunceation)){ && !diplomacyManager.hasFlag(DiplomacyFlags.Denunceation)){
@ -226,7 +223,7 @@ class DiplomacyScreen:CameraStageBaseScreen() {
val demandsButton = TextButton("Demands".tr(),skin) val demandsButton = TextButton("Demands".tr(),skin)
demandsButton.onClick { demandsButton.onClick {
rightSideTable.clear() rightSideTable.clear()
rightSideTable.add(getDemandsTable(currentPlayerCiv,otherCiv)) rightSideTable.add(getDemandsTable(viewingCiv,otherCiv))
} }
diplomacyTable.add(demandsButton).row() diplomacyTable.add(demandsButton).row()
if(isNotPlayersTurn()) demandsButton.disable() if(isNotPlayersTurn()) demandsButton.disable()
@ -270,15 +267,15 @@ class DiplomacyScreen:CameraStageBaseScreen() {
return diplomacyModifiersTable return diplomacyModifiersTable
} }
private fun getDemandsTable(currentPlayerCiv: CivilizationInfo, otherCiv: CivilizationInfo): Table { private fun getDemandsTable(viewingCiv: CivilizationInfo, otherCiv: CivilizationInfo): Table {
val demandsTable = Table() val demandsTable = Table()
demandsTable.defaults().pad(10f) demandsTable.defaults().pad(10f)
val dontSettleCitiesButton = TextButton("Please don't settle new cities near us.".tr(),skin) val dontSettleCitiesButton = TextButton("Please don't settle new cities near us.".tr(),skin)
if(otherCiv.popupAlerts.any { it.type==AlertType.DemandToStopSettlingCitiesNear && it.value==currentPlayerCiv.civName }) if(otherCiv.popupAlerts.any { it.type==AlertType.DemandToStopSettlingCitiesNear && it.value==viewingCiv.civName })
dontSettleCitiesButton.disable() dontSettleCitiesButton.disable()
dontSettleCitiesButton.onClick { dontSettleCitiesButton.onClick {
otherCiv.popupAlerts.add(PopupAlert(AlertType.DemandToStopSettlingCitiesNear, currentPlayerCiv.civName)) otherCiv.popupAlerts.add(PopupAlert(AlertType.DemandToStopSettlingCitiesNear, viewingCiv.civName))
dontSettleCitiesButton.disable() dontSettleCitiesButton.disable()
} }
demandsTable.add(dontSettleCitiesButton).row() demandsTable.add(dontSettleCitiesButton).row()

View file

@ -15,8 +15,8 @@ import kotlin.math.max
class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){ class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){
init{ init{
val currentPlayerCiv = worldScreen.viewingCiv val viewingCiv = worldScreen.viewingCiv
val tradeRequest = currentPlayerCiv.tradeRequests.first() val tradeRequest = viewingCiv.tradeRequests.first()
val requestingCiv = worldScreen.gameInfo.getCivilization(tradeRequest.requestingCiv) val requestingCiv = worldScreen.gameInfo.getCivilization(tradeRequest.requestingCiv)
val translatedNation = requestingCiv.getTranslatedNation() val translatedNation = requestingCiv.getTranslatedNation()
@ -39,10 +39,10 @@ class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){
addGoodSizedLabel(translatedNation.tradeRequest).colspan(columns).row() addGoodSizedLabel(translatedNation.tradeRequest).colspan(columns).row()
addButton("Sounds good!"){ addButton("Sounds good!"){
val tradeLogic = TradeLogic(currentPlayerCiv, requestingCiv) val tradeLogic = TradeLogic(viewingCiv, requestingCiv)
tradeLogic.currentTrade.set(trade) tradeLogic.currentTrade.set(trade)
tradeLogic.acceptTrade() tradeLogic.acceptTrade()
currentPlayerCiv.tradeRequests.remove(tradeRequest) viewingCiv.tradeRequests.remove(tradeRequest)
close() close()
PopupTable(worldScreen).apply { PopupTable(worldScreen).apply {
add(otherCivLeaderName.toLabel()).colspan(2) add(otherCivLeaderName.toLabel()).colspan(2)
@ -56,12 +56,12 @@ class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){
} }
open() open()
} }
requestingCiv.addNotification("[${currentPlayerCiv.civName}] has accepted your trade request", Color.GOLD) requestingCiv.addNotification("[${viewingCiv.civName}] has accepted your trade request", Color.GOLD)
} }
addButton("Not this time.".tr()){ addButton("Not this time.".tr()){
currentPlayerCiv.tradeRequests.remove(tradeRequest) viewingCiv.tradeRequests.remove(tradeRequest)
val diplomacyManager = requestingCiv.getDiplomacyManager(currentPlayerCiv) val diplomacyManager = requestingCiv.getDiplomacyManager(viewingCiv)
if(trade.ourOffers.all { it.type==TradeType.Luxury_Resource } && trade.theirOffers.all { it.type==TradeType.Luxury_Resource }) if(trade.ourOffers.all { it.type==TradeType.Luxury_Resource } && trade.theirOffers.all { it.type==TradeType.Luxury_Resource })
diplomacyManager.setFlag(DiplomacyFlags.DeclinedLuxExchange,20) // offer again in 20 turns diplomacyManager.setFlag(DiplomacyFlags.DeclinedLuxExchange,20) // offer again in 20 turns
@ -69,15 +69,15 @@ class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){
diplomacyManager.setFlag(DiplomacyFlags.DeclinedPeace,5) diplomacyManager.setFlag(DiplomacyFlags.DeclinedPeace,5)
close() close()
requestingCiv.addNotification("[${currentPlayerCiv.civName}] has denied your trade request", Color.GOLD) requestingCiv.addNotification("[${viewingCiv.civName}] has denied your trade request", Color.GOLD)
worldScreen.shouldUpdate=true worldScreen.shouldUpdate=true
} }
addButton("How about something else...".tr()){ addButton("How about something else...".tr()){
currentPlayerCiv.tradeRequests.remove(tradeRequest) viewingCiv.tradeRequests.remove(tradeRequest)
close() close()
val diplomacyScreen= DiplomacyScreen() val diplomacyScreen= DiplomacyScreen(viewingCiv)
val tradeTable = diplomacyScreen.setTrade(requestingCiv) val tradeTable = diplomacyScreen.setTrade(requestingCiv)
tradeTable.tradeLogic.currentTrade.set(trade) tradeTable.tradeLogic.currentTrade.set(trade)
tradeTable.offerColumnsTable.update() tradeTable.offerColumnsTable.update()

View file

@ -231,7 +231,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
.any()) { .any()) {
displayTutorials("OtherCivEncountered") displayTutorials("OtherCivEncountered")
val btn = TextButton("Diplomacy".tr(), skin) val btn = TextButton("Diplomacy".tr(), skin)
btn.onClick { UnCivGame.Current.screen = DiplomacyScreen() } btn.onClick { UnCivGame.Current.screen = DiplomacyScreen(viewingCiv) }
btn.label.setFontSize(30) btn.label.setFontSize(30)
btn.labelCell.pad(10f) btn.labelCell.pad(10f)
diplomacyButtonWrapper.add(btn) diplomacyButtonWrapper.add(btn)

View file

@ -96,9 +96,9 @@ class WorldScreenMenuTable(val worldScreen: WorldScreen) : PopupTable(worldScree
val badGameIdLabel = "".toLabel().setFontColor(Color.RED) val badGameIdLabel = "".toLabel().setFontColor(Color.RED)
badGameIdLabel.isVisible = false badGameIdLabel.isVisible = false
multiplayerPopup.addButton("Join Game") { multiplayerPopup.addButton("Join Game") {
val gameId = Gdx.app.clipboard.contents.trim() val gameId = Gdx.app.clipboard.contents
try { try {
UUID.fromString(gameId) UUID.fromString(gameId.trim())
} catch (ex: Exception) { } catch (ex: Exception) {
badGameIdLabel.setText("Invalid game ID!") badGameIdLabel.setText("Invalid game ID!")
badGameIdLabel.isVisible = true badGameIdLabel.isVisible = true

View file

@ -96,7 +96,7 @@ class UnitActions {
for(promotion in unit.baseUnit.promotions) for(promotion in unit.baseUnit.promotions)
if(promotion !in newunit.promotions.promotions) if(promotion !in newunit.promotions.promotions)
newunit.promotions.addPromotion(promotion,true) newunit.promotions.addPromotion(promotion, true)
newunit.updateUniques() newunit.updateUniques()
newunit.updateViewableTiles() newunit.updateViewableTiles()