diff --git a/Credits.md b/Credits.md index f8dce5b056..d76d872cdc 100644 --- a/Credits.md +++ b/Credits.md @@ -37,6 +37,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Longbow](https://thenounproject.com/search/?q=longbow&i=815991) By Hamish for Longbowman * [Trebuchet](https://thenounproject.com/search/?q=Trebuchet&i=827987) By Ben Davis * [Sword](https://thenounproject.com/search/?q=Sword&i=1432662) By uzeir syarief for Longswordsman +* [Samurai](https://thenounproject.com/search/?q=samurai&i=1683729) By Chanut is Industries * [Spear](https://thenounproject.com/search/?q=Spear&i=1233840) By Alvaro Cabrera for Pikeman * [Knight](https://thenounproject.com/search/?q=Knight&i=30912) By Tyler Glaude diff --git a/android/Images/UnitIcons/Samurai.png b/android/Images/UnitIcons/Samurai.png new file mode 100644 index 0000000000..bbc3cad183 Binary files /dev/null and b/android/Images/UnitIcons/Samurai.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 245999cd35..e5fe2a6266 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -412,161 +412,161 @@ BuildingIcons/SS Stasis Chamber index: -1 BuildingIcons/Seaport rotate: false - xy: 1814, 620 + xy: 1916, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sistine Chapel rotate: false - xy: 653, 520 + xy: 551, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Solar Plant rotate: false - xy: 755, 520 + xy: 551, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Spaceship Factory rotate: false - xy: 551, 316 + xy: 653, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stable rotate: false - xy: 755, 418 + xy: 959, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stadium rotate: false - xy: 959, 520 + xy: 755, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Liberty rotate: false - xy: 755, 316 + xy: 857, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stock Exchange rotate: false - xy: 857, 316 + xy: 959, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stone Works rotate: false - xy: 1163, 520 + xy: 959, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stonehenge rotate: false - xy: 959, 316 + xy: 1061, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sydney Opera House rotate: false - xy: 1163, 316 + xy: 1265, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Taj Mahal rotate: false - xy: 1265, 418 + xy: 1265, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple rotate: false - xy: 1367, 519 + xy: 1367, 417 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Library rotate: false - xy: 1367, 417 + xy: 1367, 315 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Lighthouse rotate: false - xy: 1367, 315 + xy: 1469, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Louvre rotate: false - xy: 1469, 518 + xy: 1469, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Oracle rotate: false - xy: 1469, 416 + xy: 1571, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Pyramids rotate: false - xy: 1571, 518 + xy: 1571, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Theatre rotate: false - xy: 1673, 518 + xy: 1673, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/University rotate: false - xy: 1877, 416 + xy: 1469, 314 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls rotate: false - xy: 1571, 314 + xy: 1673, 314 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Windmill rotate: false - xy: 438, 203 + xy: 438, 101 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Workshop rotate: false - xy: 755, 214 + xy: 857, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -762,7 +762,7 @@ ImprovementIcons/Road index: -1 ImprovementIcons/Trading post rotate: false - xy: 1775, 518 + xy: 1775, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -839,14 +839,14 @@ OtherIcons/Pillage index: -1 OtherIcons/Shield rotate: false - xy: 449, 408 + xy: 449, 306 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Sleep rotate: false - xy: 551, 418 + xy: 755, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -860,7 +860,7 @@ OtherIcons/Star index: -1 OtherIcons/Stop rotate: false - xy: 1061, 418 + xy: 1265, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -909,7 +909,7 @@ PolicyIcons/Civil Society index: -1 PolicyIcons/Collective Rule rotate: false - xy: 959, 264 + xy: 1061, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -930,14 +930,14 @@ PolicyIcons/Democracy index: -1 PolicyIcons/Discipline rotate: false - xy: 1011, 264 + xy: 1113, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Strength rotate: false - xy: 1011, 264 + xy: 1113, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -951,224 +951,224 @@ PolicyIcons/Entrepreneurship index: -1 PolicyIcons/Facism rotate: false - xy: 1063, 264 + xy: 1165, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Religion rotate: false - xy: 1115, 264 + xy: 1217, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Speech rotate: false - xy: 1167, 264 + xy: 1269, 264 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Thought rotate: false - xy: 1219, 264 + xy: 1061, 212 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Humanism rotate: false - xy: 1271, 264 + xy: 1113, 212 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Landed Elite rotate: false - xy: 959, 212 + xy: 1165, 212 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Legalism rotate: false - xy: 1011, 212 + xy: 1217, 212 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mandate Of Heaven rotate: false - xy: 1063, 212 + xy: 1269, 212 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mercantilism rotate: false - xy: 1115, 212 + xy: 492, 49 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Meritocracy rotate: false - xy: 1167, 212 + xy: 1966, 1588 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Militarism rotate: false - xy: 1219, 212 + xy: 1966, 1536 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Caste rotate: false - xy: 1271, 212 + xy: 1966, 1484 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Tradition rotate: false - xy: 492, 49 + xy: 1966, 1432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Monarchy rotate: false - xy: 1966, 1588 + xy: 1966, 1380 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Oligarchy rotate: false - xy: 1966, 1484 + xy: 1966, 1276 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Organized Religion rotate: false - xy: 1966, 1432 + xy: 1966, 1224 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Patronage rotate: false - xy: 1966, 1380 + xy: 1966, 1172 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Police State rotate: false - xy: 1966, 1328 + xy: 1966, 1120 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Populism rotate: false - xy: 1966, 1276 + xy: 1966, 1068 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Professional Army rotate: false - xy: 1966, 1224 + xy: 1966, 1016 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Protectionism rotate: false - xy: 1966, 1172 + xy: 1966, 964 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Reformation rotate: false - xy: 1966, 1068 + xy: 540, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Representation rotate: false - xy: 1966, 1016 + xy: 592, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Republic rotate: false - xy: 1966, 964 + xy: 592, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scientific Revolution rotate: false - xy: 540, 162 + xy: 644, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Secularism rotate: false - xy: 540, 110 + xy: 644, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Sovereignty rotate: false - xy: 592, 162 + xy: 696, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Theocracy rotate: false - xy: 592, 110 + xy: 696, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Total War rotate: false - xy: 644, 162 + xy: 748, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Trade Unions rotate: false - xy: 644, 110 + xy: 748, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Universal Suffrage rotate: false - xy: 696, 162 + xy: 800, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Warrior Code rotate: false - xy: 696, 110 + xy: 800, 110 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1301,70 +1301,70 @@ ResourceIcons/Pearls index: -1 ResourceIcons/Sheep rotate: false - xy: 449, 510 + xy: 449, 408 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silk rotate: false - xy: 449, 306 + xy: 551, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silver rotate: false - xy: 551, 520 + xy: 653, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Spices rotate: false - xy: 653, 316 + xy: 755, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Stone rotate: false - xy: 959, 418 + xy: 1163, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sugar rotate: false - xy: 1061, 316 + xy: 1163, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Uranium rotate: false - xy: 1469, 314 + xy: 1571, 314 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Whales rotate: false - xy: 1775, 314 + xy: 1877, 314 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wheat rotate: false - xy: 1877, 314 + xy: 438, 203 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wine rotate: false - xy: 438, 101 + xy: 551, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1427,7 +1427,7 @@ StatIcons/Malcontent index: -1 StatIcons/Movement rotate: false - xy: 1966, 1536 + xy: 1966, 1328 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1448,7 +1448,7 @@ StatIcons/Production index: -1 StatIcons/RangedStrength rotate: false - xy: 1966, 1120 + xy: 540, 162 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1469,7 +1469,7 @@ StatIcons/Science index: -1 StatIcons/Specialist rotate: false - xy: 857, 520 + xy: 653, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1938,56 +1938,56 @@ TechIcons/Sailing index: -1 TechIcons/Satellites rotate: false - xy: 1508, 620 + xy: 1610, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Scientific Theory rotate: false - xy: 1610, 620 + xy: 1712, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steam Power rotate: false - xy: 857, 418 + xy: 1061, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steel rotate: false - xy: 1061, 520 + xy: 857, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/The Wheel rotate: false - xy: 1571, 416 + xy: 1673, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Theology rotate: false - xy: 1673, 416 + xy: 1775, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Trapping rotate: false - xy: 1775, 416 + xy: 1877, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Writing rotate: false - xy: 857, 214 + xy: 959, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2370,51 +2370,58 @@ UnitIcons/Rocket Artillery orig: 100, 100 offset: 0, 0 index: -1 +UnitIcons/Samurai + rotate: false + xy: 1508, 620 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitIcons/Scout rotate: false - xy: 1712, 620 + xy: 1814, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Settler rotate: false - xy: 1916, 620 + xy: 449, 510 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Spearman rotate: false - xy: 653, 418 + xy: 857, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Submarine rotate: false - xy: 1265, 520 + xy: 1061, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Swordsman rotate: false - xy: 1163, 418 + xy: 1163, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tank rotate: false - xy: 1265, 316 + xy: 1367, 519 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trebuchet rotate: false - xy: 1877, 518 + xy: 1877, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2428,21 +2435,21 @@ UnitIcons/Trireme index: -1 UnitIcons/Warrior rotate: false - xy: 1673, 314 + xy: 1775, 314 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Work Boats rotate: false - xy: 551, 214 + xy: 653, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Worker rotate: false - xy: 653, 214 + xy: 755, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2540,105 +2547,105 @@ UnitPromotionIcons/Bombardment_I_(Civ5) index: -1 UnitPromotionIcons/Charge_(Civ5) rotate: false - xy: 1323, 294 + xy: 1321, 294 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_III_(Civ5) rotate: false - xy: 1345, 294 + xy: 2015, 1822 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_II_(Civ5) rotate: false - xy: 2015, 1822 + xy: 1966, 942 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_I_(Civ5) rotate: false - xy: 1966, 942 + xy: 852, 192 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_II_(Civ5) rotate: false - xy: 748, 192 + xy: 1531, 1952 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_I_(Civ5) rotate: false - xy: 1531, 1952 + xy: 2018, 678 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_III_(Civ5) rotate: false - xy: 2018, 678 + xy: 1979, 576 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_II_(Civ5) rotate: false - xy: 1979, 576 + xy: 1981, 1952 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_I_(Civ5) rotate: false - xy: 1981, 1952 + xy: 2003, 1974 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_II_(Civ5) rotate: false - xy: 2003, 1974 + xy: 336, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_I_(Civ5) rotate: false - xy: 336, 5 + xy: 358, 27 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect_Fire_(Civ5) rotate: false - xy: 358, 27 + xy: 106, 24 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics_(Civ5) rotate: false - xy: 106, 24 + xy: 106, 2 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/March_(Civ5) rotate: false - xy: 106, 2 + xy: 1343, 294 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility_(Civ5) rotate: false - xy: 1323, 272 + xy: 1321, 272 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -2659,14 +2666,14 @@ UnitPromotionIcons/Scouting_III_(Civ5) index: -1 UnitPromotionIcons/Scouting_II_(Civ5) rotate: false - xy: 748, 170 + xy: 852, 170 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting_I_(Civ5) rotate: false - xy: 770, 192 + xy: 874, 192 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -2708,49 +2715,49 @@ UnitPromotionIcons/Siege_(Civ5) index: -1 UnitPromotionIcons/Targeting_III_(Civ5) rotate: false - xy: 1323, 250 + xy: 1321, 250 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_II_(Civ5) rotate: false - xy: 1345, 272 + xy: 1343, 272 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_I_(Civ5) rotate: false - xy: 1367, 293 + xy: 2015, 1778 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Volley_(Civ5) rotate: false - xy: 2015, 1778 + xy: 852, 148 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_III_(Civ5) rotate: false - xy: 748, 148 + xy: 874, 170 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_II_(Civ5) rotate: false - xy: 770, 170 + xy: 896, 192 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_I_(Civ5) rotate: false - xy: 792, 192 + xy: 2018, 634 size: 20, 20 orig: 20, 20 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index dafa229b06..b3ff63dccc 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/Nations.json b/android/assets/jsons/Nations.json index 7d0decfdc9..b588b0c576 100644 --- a/android/assets/jsons/Nations.json +++ b/android/assets/jsons/Nations.json @@ -319,6 +319,36 @@ "Portland","St. Louis","Miami","Buffalo","Detroit","New Orleans","Baltimore","Denver","Cincinnati","Dallas","Memphis", "Cleveland","Kansas City","San Diego","Richmond","Las Vegas","Phoenix","Albuquerque","Minneapolis","Pittsburgh"] }, + { + name:"Japan", + leaderName:"Oda Nobunaga", + + startIntroPart1: "Blessings upon you, noble Oda Nobunaga, ruler of Japan, the land of the Rising Sun! May you long walk among its flowering blossoms. The Japanese are an island people, proud and pious with a rich culture of arts and letters. Your civilization stretches back thousands of years, years of bloody warfare, expansion and isolation, great wealth and great poverty. In addition to their prowess on the frield of battle, your people are also immensely industious, and their technological innovation and mighty factories are the envy of lesser people everywhere." + startIntroPart2: "Legendary damiyo, will you grab the reins of destiny? Will you bring your family and people the honor and glory they deserve? Will you once again pick up the sword and march to triumph? Will you build a civilization that stands the test of time?" + + declaringWar:"I hereby inform you of our intention to wipe out your civilization from this world." + attacked:"Pitiful fool! Now we shall destroy you!" + defeated:"You were much wiser than I thought." + introduction:"We hope for a fair and just relationship with you, who are renowned for military bravery." + + neutralHello:"Hello." + neutralLetsHearIt:["Go on.","Proceed.","I'm listening."] + neutralNo:["Sorry.","No.","Maybe another time."] + neutralYes:["Very well.","Agreed.","Hai. (Yes)"] + + hateHello:"Oh, it's you..." + hateLetsHearIt:["Let me hear it.","Go on","Proceed"] + hateNo:["Hya. (No)","Excuse me?","Maybe another time"] + hateYes:["I agree.","Oh... very well.","There is probably no other way."] + + afterPeace:"It was an honor to fight you." + tradeRequest:"I would be grateful if you agreed on the following proposal." + + mainColor:[215,225,225], + secondaryColor:[185,0,0], + unique: "Units fight as though they were at full strength even when damaged", + cities:["Kyoto","Osaka","Tokyo","Satsuma","Kagoshima","Nara","Nagoya","Izumo","Nagasaki","Yokohama","Shimonoseki","Matsuyama","Sapporo","Hakodate","Ise","Toyama","Fukushima","Suo","Bizen","Echizen","Izumi","Omi","Echigo","Kozuke","Sado","Kobe","Nagano","Hiroshima","Takayama","Akita","Fukuoka","Aomori","Kamakura","Kochi","Naha","Sendai","Gifu","Hakodate","Ota","Tottori"] + }, /* { name:"Germany", @@ -447,36 +477,6 @@ unique:"Melee units cost 50% less maintenance, and all units require 25% less experience to earn their next promotion.", cities:["Ulundi","Umugungundlovu","Nobamba","Bulawayo","KwaDukuza","Nongoma","oNdini","Nodwengu","Ndonakusuka","Babanango","Khangela","KwaHlomendlini","Hlobane","eThekwini","Mlambongwenya","Eziqwaqweni","eMangweni","Isiphezi","Masotsheni","Mtunzini","Nyakamubi","Dumazulu","Hlatikulu","Mthonjaneni","Empangeni","Pongola","Tugela","Kwamashi","Ingwavuma","Hluhluwe","Matubatuba","Mhlahlandlela","Mthatha","Maseru","Lobamba","Qunu"] }, - { - name:"Japan", - leaderName:"Oda Nobunaga", - - startIntroPart1: "Blessings upon you, noble Oda Nobunaga, ruler of Japan, the land of the Rising Sun! May you long walk among its flowering blossoms. The Japanese are an island people, proud and pious with a rich culture of arts and letters. Your civilization stretches back thousands of years, years of bloody warfare, expansion and isolation, great wealth and great poverty. In addition to their prowess on the frield of battle, your people are also immensely industious, and their technological innovation and mighty factories are the envy of lesser people everywhere." - startIntroPart2: "Legendary damiyo, will you grab the reins of destiny? Will you bring your family and people the honor and glory they deserve? Will you once again pick up the sword and march to triumph? Will you build a civilization that stands the test of time?" - - declaringWar:"I hereby inform you of our intention to wipe out your civilization from this world." - attacked:"Pitiful fool! Now we shall destroy you!" - defeated:"You were much wiser than I thought." - introduction:"We hope for a fair and just relationship with you, who are renowned for military bravery." - - neutralHello:"Hello." - neutralLetsHearIt:["Go on.","Proceed.","I'm listening."] - neutralNo:["Sorry.","No.","Maybe another time."] - neutralYes:["Very well.","Agreed.","Hai. (Yes)"] - - hateHello:"Oh, it's you..." - hateLetsHearIt:["Let me hear it.","Go on","Proceed"] - hateNo:["Hya. (No)","Excuse me?","Maybe another time"] - hateYes:["I agree.","Oh... very well.","There is probably no other way."] - - afterPeace:"It was an honor to fight you." - tradeRequest:"I would be grateful if you agreed on the following proposal." - - mainColor:[255,255,255], - secondaryColor:[255,0,0], - unique:"Units fight as though they were at full strength even when damaged. You gain +1 Culture from each Fishing Boat, and +2 Culture from each Atoll.", - cities:["Kyoto","Osaka","Tokyo","Satsuma","Kagoshima","Nara","Nagoya","Izumo","Nagasaki","Yokohama","Shimonoseki","Matsuyama","Sapporo","Hakodate","Ise","Toyama","Fukushima","Suo","Bizen","Echizen","Izumi","Omi","Echigo","Kozuke","Sado","Kobe","Nagano","Hiroshima","Takayama","Akita","Fukuoka","Aomori","Kamakura","Kochi","Naha","Sendai","Gifu","Hakodate","Ota","Tottori"] - }, { name:"Incan", leaderName:"Pachacuti", diff --git a/android/assets/jsons/Translations.json b/android/assets/jsons/Translations.json index 8b456eb4ad..de42c3ec26 100644 --- a/android/assets/jsons/Translations.json +++ b/android/assets/jsons/Translations.json @@ -3872,6 +3872,7 @@ French:"Arabie" } + "America":{ Italian:"Stati Uniti" Romanian:"Statele Unite" @@ -3888,9 +3889,15 @@ 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" } - "Uniques:":{ + + "Japan":{} + "Units fight as though they were at full strength even when damaged":{} + + "Uniques":{ // unit uniques, displayed on the new game screen when choosing a civ Italian:"Abilità unica" } + "Promotions":{} + "units in rough terrain:":{ Italian:"unità in terreno accidentato" } @@ -7476,7 +7483,7 @@ } " OR ":{// as in "Requires Accuracy I OR Barrage I - Italian:"O" + Italian:" O " } "Accuracy I":{ diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index 83d865ea20..7127978b39 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -226,7 +226,7 @@ { name:"Longbowman", unitType:"Ranged", - range:3, + range:2, movement:2, strength:13, rangedStrength:18, @@ -236,6 +236,7 @@ requiredTech:"Machinery", upgradesTo:"Gatling Gun", obsoleteTech:"Industrialization", + promotions:["Range"], hurryCostModifier:20, attackSound:"arrow" }, @@ -266,6 +267,23 @@ hurryCostModifier:20, attackSound:"metalhit" }, + { + name:"Samurai", + replaces:"Longswordsman", + uniqueTo:"Japan", + unitType:"Melee", + movement:2, + strength:21, + cost: 120, + requiredTech:"Steel", + upgradesTo:"Musketman", + obsoleteTech:"Gunpowder", + requiredResource:"Iron", + uniques:["Combat very likely to create Great Generals"] + promotions:["Shock I"] + hurryCostModifier:20, + attackSound:"metalhit" + }, { name:"Pikeman", unitType:"Melee", @@ -390,7 +408,8 @@ requiredTech:"Gunpowder", upgradesTo:"Rifleman" obsoleteTech:"Rifling", - uniques:["Bonus vs units in rough terrain 15%","Ignores terrain cost"] + uniques:["Ignores terrain cost"] + promotions:["Drill I"], hurryCostModifier:20, attackSound:"shot" }, diff --git a/core/src/com/unciv/UnCivGame.kt b/core/src/com/unciv/UnCivGame.kt index c98d93a2ea..065b1f7b07 100644 --- a/core/src/com/unciv/UnCivGame.kt +++ b/core/src/com/unciv/UnCivGame.kt @@ -20,7 +20,7 @@ class UnCivGame : Game() { val viewEntireMapForDebug = false // For when you need to test something in an advanced game and don't have time to faff around - val superchargedForDebug = false + val superchargedForDebug = true lateinit var worldScreen: WorldScreen diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index 18d6dd11c0..e5e9073053 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -124,8 +124,8 @@ class UnitAutomation{ val tileCombatant = Battle(combatant.getCivInfo().gameInfo).getMapCombatantOfTile(tile) if(tileCombatant==null) return false - if(tileCombatant.getCivilization()==combatant.getCivInfo() ) return false - if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivilization())) return false + if(tileCombatant.getCivInfo()==combatant.getCivInfo() ) return false + if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivInfo())) return false //only submarine and destroyer can attack submarine //garisoned submarine can be attacked by anyone, or the city will be in invincible diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 95503d84f1..01f8ed07d4 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -47,7 +47,7 @@ class Battle(val gameInfo:GameInfo) { private fun postBattleAction(attacker: ICombatant, defender: ICombatant, attackedTile:TileInfo){ - if(attacker.getCivilization()!=defender.getCivilization()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function + if(attacker.getCivInfo()!=defender.getCivInfo()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function val whatHappenedString = if (attacker !is CityCombatant && attacker.isDefeated()) " {was destroyed while attacking}" else " has " + (if (defender.isDefeated()) "destroyed" else "attacked") @@ -58,7 +58,7 @@ class Battle(val gameInfo:GameInfo) { if (defender.getUnitType() == UnitType.City) " [" + defender.getName()+"]" else " our [" + defender.getName()+"]" val notificationString = attackerString + whatHappenedString + defenderString - defender.getCivilization().addNotification(notificationString, attackedTile.position, Color.RED) + defender.getCivInfo().addNotification(notificationString, attackedTile.position, Color.RED) } @@ -71,11 +71,11 @@ class Battle(val gameInfo:GameInfo) { // we're a melee unit and we destroyed\captured an enemy unit else if (attacker.isMelee() - && (defender.isDefeated() || defender.getCivilization()==attacker.getCivilization() ) + && (defender.isDefeated() || defender.getCivInfo()==attacker.getCivInfo() ) // This is so that if we attack e.g. a barbarian in enemy territory that we can't enter, we won't enter it && (attacker as MapUnitCombatant).unit.canMoveTo(attackedTile)) { // we destroyed an enemy military unit and there was a civilian unit in the same tile as well - if(attackedTile.civilianUnit!=null && attackedTile.civilianUnit!!.civInfo != attacker.getCivilization()) + if(attackedTile.civilianUnit!=null && attackedTile.civilianUnit!!.civInfo != attacker.getCivInfo()) captureCivilianUnit(attacker,MapUnitCombatant(attackedTile.civilianUnit!!)) attacker.unit.moveToTile(attackedTile) } @@ -98,16 +98,19 @@ class Battle(val gameInfo:GameInfo) { // XP! fun addXp(thisCombatant:ICombatant, amount:Int, otherCombatant:ICombatant){ if(thisCombatant !is MapUnitCombatant) return - if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivilization().isBarbarianCivilization()) + if(thisCombatant.unit.promotions.totalXpProduced() >= 30 && otherCombatant.getCivInfo().isBarbarianCivilization()) return var amountToAdd = amount - if(thisCombatant.getCivilization().policies.isAdopted("Military Tradition")) amountToAdd = (amountToAdd * 1.5f).toInt() + if(thisCombatant.getCivInfo().policies.isAdopted("Military Tradition")) amountToAdd = (amountToAdd * 1.5f).toInt() thisCombatant.unit.promotions.XP += amountToAdd - if(thisCombatant.getCivilization().getNation().unique + if(thisCombatant.getCivInfo().getNation().unique == "Great general provides double combat bonus, and spawns 50% faster") amountToAdd = (amountToAdd * 1.5f).toInt() - thisCombatant.getCivilization().greatPeople.greatGeneralPoints += amountToAdd + if(thisCombatant.unit.hasUnique("Combat very likely to create Great Generals")) + amountToAdd *= 2 + + thisCombatant.getCivInfo().greatPeople.greatGeneralPoints += amountToAdd } if(attacker.isMelee()){ @@ -123,8 +126,8 @@ class Battle(val gameInfo:GameInfo) { } if(defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian() - && attacker.getCivilization().policies.isAdopted("Honor Complete")) - attacker.getCivilization().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10 + && attacker.getCivInfo().policies.isAdopted("Honor Complete")) + attacker.getCivInfo().gold += defender.unit.baseUnit.getGoldCost(hashSetOf()) / 10 if(attacker is MapUnitCombatant && attacker.unit.action!=null && attacker.unit.action!!.startsWith("moveTo")) attacker.unit.action=null @@ -132,14 +135,14 @@ class Battle(val gameInfo:GameInfo) { private fun conquerCity(city: CityInfo, attacker: ICombatant) { val enemyCiv = city.civInfo - attacker.getCivilization().addNotification("We have conquered the city of [${city.name}]!",city.location, Color.RED) + attacker.getCivInfo().addNotification("We have conquered the city of [${city.name}]!",city.location, Color.RED) city.getCenterTile().apply { if(militaryUnit!=null) militaryUnit!!.destroy() if(civilianUnit!=null) captureCivilianUnit(attacker,MapUnitCombatant(civilianUnit!!)) } - if (attacker.getCivilization().isBarbarianCivilization()){ + if (attacker.getCivInfo().isBarbarianCivilization()){ city.destroyCity() } else { @@ -149,12 +152,12 @@ class Battle(val gameInfo:GameInfo) { city.health = city.getMaxHealth() / 2 // I think that cities recover to half health when conquered? - if(!attacker.getCivilization().policies.isAdopted("Police State")) { + if(!attacker.getCivInfo().policies.isAdopted("Police State")) { city.expansion.cultureStored = 0 city.expansion.reset() } - city.moveToCiv(attacker.getCivilization()) + city.moveToCiv(attacker.getCivInfo()) city.resistanceCounter = city.population.population city.cityStats.update() } @@ -183,7 +186,7 @@ class Battle(val gameInfo:GameInfo) { } fun captureCivilianUnit(attacker: ICombatant, defender: ICombatant){ - if(attacker.getCivilization().isBarbarianCivilization()){ + if(attacker.getCivInfo().isBarbarianCivilization()){ defender.takeDamage(100) return } // barbarians don't capture civilians! @@ -192,6 +195,6 @@ class Battle(val gameInfo:GameInfo) { defender.getTile().position, Color.RED) capturedUnit.civInfo.removeUnit(capturedUnit) - capturedUnit.assignOwner(attacker.getCivilization()) + capturedUnit.assignOwner(attacker.getCivInfo()) } } \ No newline at end of file diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 7408f5064d..a83b207128 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -46,19 +46,19 @@ class BattleDamage{ } //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php - if (combatant.getCivilization().happiness < 0) - modifiers["Unhappiness"] = max(0.02f * combatant.getCivilization().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units... + if (combatant.getCivInfo().happiness < 0) + modifiers["Unhappiness"] = max(0.02f * combatant.getCivInfo().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units... - if(combatant.getCivilization().policies.isAdopted("Populism")) + if(combatant.getCivInfo().policies.isAdopted("Populism")) modifiers["Populism"] = 0.25f - if(combatant.getCivilization().policies.isAdopted("Discipline") && combatant.isMelee() + if(combatant.getCivInfo().policies.isAdopted("Discipline") && combatant.isMelee() && combatant.getTile().neighbors.flatMap { it.getUnits() } - .any { it.civInfo==combatant.getCivilization() && !it.type.isCivilian()}) + .any { it.civInfo==combatant.getCivInfo() && !it.type.isCivilian()}) modifiers["Discipline"] = 0.15f val requiredResource = combatant.unit.baseUnit.requiredResource - if(requiredResource!=null && combatant.getCivilization().getCivResourcesByName()[requiredResource]!!<0){ + if(requiredResource!=null && combatant.getCivInfo().getCivResourcesByName()[requiredResource]!!<0){ modifiers["Missing resource"]=-0.25f } @@ -76,7 +76,7 @@ class BattleDamage{ } } - if (combatant.getCivilization().policies.isAdopted("Honor") && enemy.getCivilization().isBarbarianCivilization()) + if (combatant.getCivInfo().policies.isAdopted("Honor") && enemy.getCivInfo().isBarbarianCivilization()) modifiers["vs Barbarians"] = 0.25f return modifiers @@ -119,7 +119,7 @@ class BattleDamage{ if (attacker.isMelee()) { val numberOfAttackersSurroundingDefender = defender.getTile().neighbors.count { it.militaryUnit != null - && it.militaryUnit!!.owner == attacker.getCivilization().civName + && it.militaryUnit!!.owner == attacker.getCivInfo().civName && MapUnitCombatant(it.militaryUnit!!).isMelee() } if (numberOfAttackersSurroundingDefender > 1) @@ -172,13 +172,15 @@ class BattleDamage{ private fun modifiersToMultiplicationBonus(modifiers: HashMap): Float { // modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss - var modifier = 1f - for (m in modifiers.values) modifier *= (1 + m) - return modifier + var finalModifier = 1f + for (modifierValue in modifiers.values) finalModifier *= (1 + modifierValue) + return finalModifier } private fun getHealthDependantDamageRatio(combatant: ICombatant): Float { - if (combatant.getUnitType() == UnitType.City) return 1f + if (combatant.getUnitType() == UnitType.City + || combatant.getCivInfo().getNation().unique == "Units fight as though they were at full strength even when damaged") + return 1f return 1/2f + combatant.getHealth()/200f // Each point of health reduces damage dealt by 0.5% } diff --git a/core/src/com/unciv/logic/battle/CityCombatant.kt b/core/src/com/unciv/logic/battle/CityCombatant.kt index fdd14eaa01..d496dbd607 100644 --- a/core/src/com/unciv/logic/battle/CityCombatant.kt +++ b/core/src/com/unciv/logic/battle/CityCombatant.kt @@ -12,12 +12,11 @@ class CityCombatant(val city: CityInfo) : ICombatant { } override fun getHealth(): Int = city.health - override fun getCivilization(): CivilizationInfo = city.civInfo + override fun getCivInfo(): CivilizationInfo = city.civInfo override fun getTile(): TileInfo = city.getCenterTile() override fun getName(): String = city.name override fun isDefeated(): Boolean = city.health==1 override fun isInvisible(): Boolean = false - override fun getCivInfo(): CivilizationInfo = city.civInfo override fun canAttack(): Boolean = (!city.attackedThisTurn) override fun takeDamage(damage: Int) { diff --git a/core/src/com/unciv/logic/battle/ICombatant.kt b/core/src/com/unciv/logic/battle/ICombatant.kt index 9a547a3dee..58a7f5e301 100644 --- a/core/src/com/unciv/logic/battle/ICombatant.kt +++ b/core/src/com/unciv/logic/battle/ICombatant.kt @@ -13,10 +13,9 @@ interface ICombatant{ fun getDefendingStrength(): Int fun takeDamage(damage:Int) fun isDefeated():Boolean - fun getCivilization(): CivilizationInfo + fun getCivInfo(): CivilizationInfo fun getTile(): TileInfo fun isInvisible(): Boolean - fun getCivInfo(): CivilizationInfo fun canAttack(): Boolean fun isMelee(): Boolean { diff --git a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt index c95fee24ac..3282c781ea 100644 --- a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt +++ b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt @@ -8,12 +8,11 @@ import com.unciv.models.gamebasics.unit.UnitType class MapUnitCombatant(val unit: MapUnit) : ICombatant { override fun getHealth(): Int = unit.health override fun getMaxHealth() = 100 - override fun getCivilization(): CivilizationInfo = unit.civInfo + override fun getCivInfo(): CivilizationInfo = unit.civInfo override fun getTile(): TileInfo = unit.getTile() override fun getName(): String = unit.name override fun isDefeated(): Boolean = unit.health <= 0 override fun isInvisible(): Boolean = unit.isInvisible() - override fun getCivInfo(): CivilizationInfo = unit.civInfo override fun canAttack(): Boolean = unit.canAttack() override fun takeDamage(damage: Int) { diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index 1c7537ce3a..76c663b7b8 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -86,6 +86,10 @@ class TileMap { // only once we know the unit can be placed do we add it to the civ's unit list unit.putInTile(unitToPlaceTile) unit.currentMovement = unit.getMaxMovement().toFloat() + + // 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) + unit.promotions.addPromotion(promotion,true) } else civInfo.removeUnit(unit) // since we added it to the civ units in the previous assignOwner diff --git a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt index 43d1764635..b9512b4272 100644 --- a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt @@ -11,6 +11,9 @@ import com.unciv.models.gamebasics.tr import com.unciv.models.stats.INamed // This is BaseUnit because Unit is already a base Kotlin class and to avoid mixing the two up + +/** This is the basic info of the units, as specified in Units.json, + in contrast to MapUnit, which is a specific unit of a certain type that appears on the map */ class BaseUnit : INamed, IConstruction, ICivilopedia { override lateinit var name: String @@ -25,6 +28,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { var requiredTech:String? = null var requiredResource:String? = null var uniques =HashSet() + var promotions =HashSet() var obsoleteTech:String?=null var upgradesTo:String? = null var replaces:String?=null @@ -40,9 +44,10 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { fun getShortDescription(): String { val infoList= mutableListOf() - for(unique in uniques){ + for(unique in uniques) infoList+=Translations.translateBonusOrPenalty(unique) - } + for(promotion in promotions) + infoList += promotion.tr() if(strength!=0) infoList += "{Strength}: $strength".tr() if(rangedStrength!=0) infoList += "{Ranged strength}: $rangedStrength".tr() if(movement!=2) infoList+="{Movement}: $movement".tr() @@ -67,9 +72,12 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { sb.appendln() } - for(unique in uniques) { + for(unique in uniques) sb.appendln(unique.tr()) - } + + for(promotion in promotions) + sb.appendln(promotion.tr()) + sb.appendln("{Movement}: $movement".tr()) return sb.toString() } @@ -77,7 +85,9 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { fun getMapUnit(): MapUnit { val unit = MapUnit() unit.name = name + unit.setTransients() // must be after setting name because it sets the baseUnit according to the name + return unit } diff --git a/core/src/com/unciv/ui/NationTable.kt b/core/src/com/unciv/ui/NationTable.kt index ddcd4e515f..b9229de01b 100644 --- a/core/src/com/unciv/ui/NationTable.kt +++ b/core/src/com/unciv/ui/NationTable.kt @@ -76,10 +76,10 @@ class NationTable(val nation: Nation, val newGameParameters: GameParameters, ski textList+= " {Range} " + unit.range+ " vs " + originalUnit.range if (unit.movement!= originalUnit.movement) textList+= " {Movement} " + unit.movement+ " vs " + originalUnit.movement - val newUniques = unit.uniques.filterNot { it in originalUnit.uniques } - if(newUniques.isNotEmpty()) - textList+=" {Uniques}: "+newUniques.joinToString{ Translations.translateBonusOrPenalty(it) } - textList+="" + for(unique in unit.uniques.filterNot { it in originalUnit.uniques }) + textList += " "+Translations.translateBonusOrPenalty(unique) + for(promotions in unit.promotions.filter { it !in originalUnit.promotions}) + textList += " "+promotions.tr() } diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index eba5ba3406..0883a4052b 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -49,9 +49,9 @@ class BattleTable(val worldScreen: WorldScreen): Table() { val defender: ICombatant? = Battle(worldScreen.gameInfo).getMapCombatantOfTile(selectedTile) if(defender==null || - defender.getCivilization()==worldScreen.currentPlayerCiv + defender.getCivInfo()==worldScreen.currentPlayerCiv || !(UnCivGame.Current.viewEntireMapForDebug - || attacker.getCivilization().exploredTiles.contains(selectedTile.position))) { + || attacker.getCivInfo().exploredTiles.contains(selectedTile.position))) { hide() return } diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 1d13231577..f63cc60507 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -76,6 +76,11 @@ class UnitActions { val newunit = unit.civInfo.placeUnitNearTile(unitTile.position, upgradedUnit.name) newunit.health = unit.health newunit.promotions = unit.promotions + + for(promotion in unit.baseUnit.promotions) + if(promotion !in newunit.promotions.promotions) + newunit.promotions.addPromotion(promotion,true) + newunit.updateUniques() newunit.currentMovement = 0f worldScreen.shouldUpdate = true