diff --git a/android/Images/StatIcons/ReligiousStrength.png b/android/Images/StatIcons/ReligiousStrength.png new file mode 100644 index 0000000000..f9d793ade4 Binary files /dev/null and b/android/Images/StatIcons/ReligiousStrength.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 1d818936be..d00daf0929 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -6,56 +6,56 @@ filter: MipMapLinearLinear, MipMapLinearLinear repeat: none EmojiIcons/Culture rotate: false - xy: 412, 50 + xy: 354, 58 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Faith rotate: false - xy: 660, 432 + xy: 776, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Food rotate: false - xy: 834, 432 + xy: 950, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Gold rotate: false - xy: 1124, 432 + xy: 660, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Happiness rotate: false - xy: 560, 208 + xy: 834, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Production rotate: false - xy: 792, 200 + xy: 842, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Science rotate: false - xy: 1082, 200 + xy: 1074, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Turn rotate: false - xy: 1348, 482 + xy: 1190, 280 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -214,37 +214,23 @@ ImprovementIcons/Quarry orig: 100, 100 offset: 0, 0 index: -1 -ImprovementIcons/Railroad - rotate: false - xy: 1508, 1080 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/Railroad - rotate: false - xy: 1508, 1080 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 ImprovementIcons/Road rotate: false - xy: 1832, 1296 + xy: 1400, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Terrace farm rotate: false - xy: 1508, 540 + xy: 1616, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Trading post rotate: false - xy: 220, 332 + xy: 328, 440 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -391,98 +377,98 @@ NationIcons/Polynesia index: -1 NationIcons/Rome rotate: false - xy: 1616, 972 + xy: 1724, 1080 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Russia rotate: false - xy: 1724, 1080 + xy: 1832, 1188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Siam rotate: false - xy: 1832, 972 + xy: 1724, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Songhai rotate: false - xy: 1508, 648 + xy: 1616, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Spain rotate: false - xy: 1616, 648 + xy: 1724, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Sweden rotate: false - xy: 1940, 756 + xy: 1940, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Huns rotate: false - xy: 1616, 540 + xy: 1724, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Netherlands rotate: false - xy: 1724, 540 + xy: 1832, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Ottomans rotate: false - xy: 1832, 540 + xy: 1940, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Aircraft rotate: false - xy: 112, 12 + xy: 436, 216 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/ArrowLeft rotate: false - xy: 942, 490 + xy: 884, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/ArrowRight rotate: false - xy: 1000, 490 + xy: 942, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Movement rotate: false - xy: 1000, 490 + xy: 942, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/BackArrow rotate: false - xy: 1058, 490 + xy: 1000, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -503,7 +489,7 @@ OtherIcons/Border-inner index: -1 OtherIcons/Border-outer rotate: false - xy: 1348, 547 + xy: 1792, 34 size: 31, 15 orig: 31, 15 offset: 0, 0 @@ -566,7 +552,7 @@ OtherIcons/DisbandUnit index: -1 OtherIcons/Down rotate: false - xy: 552, 266 + xy: 412, 42 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -601,7 +587,7 @@ TileSets/FantasyHex/Hexagon index: -1 OtherIcons/Link rotate: false - xy: 726, 316 + xy: 1298, 396 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -706,21 +692,21 @@ OtherIcons/Quickstart index: -1 OtherIcons/Resume rotate: false - xy: 1616, 1080 + xy: 1724, 1188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Shield rotate: false - xy: 1616, 756 + xy: 1724, 864 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Sleep rotate: false - xy: 1400, 648 + xy: 1508, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -734,14 +720,14 @@ OtherIcons/Star index: -1 OtherIcons/Stop rotate: false - xy: 1940, 1080 + xy: 1940, 972 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Swap rotate: false - xy: 1940, 864 + xy: 1940, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -755,7 +741,7 @@ OtherIcons/Triangle index: -1 OtherIcons/Up rotate: false - xy: 1522, 482 + xy: 1190, 164 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -769,14 +755,14 @@ OtherIcons/whiteDot index: -1 PolicyIcons/Aesthetics rotate: false - xy: 436, 274 + xy: 544, 382 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Aristocracy rotate: false - xy: 826, 490 + xy: 768, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -790,322 +776,322 @@ PolicyIcons/Citizenship index: -1 PolicyIcons/Civil Society rotate: false - xy: 1232, 490 + xy: 436, 100 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Collective Rule rotate: false - xy: 180, 52 + xy: 1232, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Communism rotate: false - xy: 238, 58 + xy: 1290, 512 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Constitution rotate: false - xy: 1290, 454 + xy: 180, 52 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Cultural Diplomacy rotate: false - xy: 354, 50 + xy: 296, 58 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Democracy rotate: false - xy: 552, 324 + xy: 1290, 454 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Educated Elite rotate: false - xy: 610, 266 + xy: 528, 42 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Fascism rotate: false - xy: 718, 432 + xy: 834, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Religion rotate: false - xy: 950, 432 + xy: 1066, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Speech rotate: false - xy: 1008, 432 + xy: 1124, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Thought rotate: false - xy: 1066, 432 + xy: 1182, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Humanism rotate: false - xy: 560, 150 + xy: 950, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Landed Elite rotate: false - xy: 668, 316 + xy: 1182, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Legalism rotate: false - xy: 726, 374 + xy: 1240, 396 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mandate Of Heaven rotate: false - xy: 784, 316 + xy: 1298, 338 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mercantilism rotate: false - xy: 900, 374 + xy: 552, 208 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Merchant Navy rotate: false - xy: 900, 316 + xy: 552, 150 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Meritocracy rotate: false - xy: 958, 374 + xy: 610, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Militarism rotate: false - xy: 958, 316 + xy: 610, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Caste rotate: false - xy: 1016, 374 + xy: 668, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Tradition rotate: false - xy: 1016, 316 + xy: 610, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Monarchy rotate: false - xy: 1074, 316 + xy: 726, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Nationalism rotate: false - xy: 1132, 316 + xy: 726, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Naval Tradition rotate: false - xy: 1190, 374 + xy: 784, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Oligarchy rotate: false - xy: 1190, 316 + xy: 726, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Organized Religion rotate: false - xy: 676, 258 + xy: 784, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Philantropy rotate: false - xy: 676, 200 + xy: 842, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Planned Economy rotate: false - xy: 734, 258 + xy: 784, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Police State rotate: false - xy: 734, 200 + xy: 842, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Populism rotate: false - xy: 792, 258 + xy: 900, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Professional Army rotate: false - xy: 850, 258 + xy: 900, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Protectionism rotate: false - xy: 850, 200 + xy: 958, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Reformation rotate: false - xy: 966, 258 + xy: 1016, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Representation rotate: false - xy: 1024, 258 + xy: 1016, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Republic rotate: false - xy: 1024, 200 + xy: 1074, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scholasticism rotate: false - xy: 1082, 258 + xy: 1016, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scientific Revolution rotate: false - xy: 1140, 258 + xy: 1132, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Secularism rotate: false - xy: 676, 142 + xy: 1132, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Socialism rotate: false - xy: 850, 142 + xy: 668, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Sovereignty rotate: false - xy: 966, 142 + xy: 784, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Theocracy rotate: false - xy: 1198, 258 + xy: 1016, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Total War rotate: false - xy: 1198, 200 + xy: 1074, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Trade Unions rotate: false - xy: 1198, 142 + xy: 1132, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/United Front rotate: false - xy: 1406, 482 + xy: 1190, 222 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Universal Suffrage rotate: false - xy: 1464, 482 + xy: 1248, 280 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Warrior Code rotate: false - xy: 1638, 482 + xy: 1248, 164 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1175,35 +1161,35 @@ ReligionIcons/Religion index: -1 ReligionIcons/Shinto rotate: false - xy: 1724, 864 + xy: 1832, 972 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Sikhism rotate: false - xy: 1724, 756 + xy: 1832, 864 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Taoism rotate: false - xy: 1940, 648 + xy: 1292, 570 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Tengriism rotate: false - xy: 1400, 540 + xy: 1508, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Zoroastrianism rotate: false - xy: 544, 440 + xy: 328, 116 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1371,84 +1357,84 @@ ResourceIcons/Porcelain index: -1 ResourceIcons/Salt rotate: false - xy: 1508, 756 + xy: 1616, 864 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sheep rotate: false - xy: 1832, 1080 + xy: 1616, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silk rotate: false - xy: 1832, 864 + xy: 1832, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silver rotate: false - xy: 1832, 756 + xy: 1400, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Spices rotate: false - xy: 1832, 648 + xy: 1940, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Stone rotate: false - xy: 1940, 1188 + xy: 1940, 1080 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sugar rotate: false - xy: 1940, 972 + xy: 1940, 864 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Truffles rotate: false - xy: 220, 224 + xy: 328, 332 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Uranium rotate: false - xy: 328, 332 + xy: 436, 440 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Whales rotate: false - xy: 436, 440 + xy: 220, 116 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wheat rotate: false - xy: 220, 116 + xy: 328, 224 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wine rotate: false - xy: 328, 224 + xy: 436, 332 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1504,7 +1490,7 @@ StatIcons/Happiness index: -1 StatIcons/InterceptRange rotate: false - xy: 618, 150 + xy: 1066, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1532,21 +1518,28 @@ StatIcons/Production index: -1 StatIcons/Range rotate: false - xy: 908, 258 + xy: 900, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/RangedStrength rotate: false - xy: 908, 200 + xy: 958, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +StatIcons/ReligiousStrength + rotate: false + xy: 1400, 864 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 StatIcons/Resistance rotate: false - xy: 1508, 972 + xy: 1616, 1080 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1560,14 +1553,14 @@ StatIcons/Science index: -1 StatIcons/Specialist rotate: false - xy: 1724, 648 + xy: 1832, 648 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Strength rotate: false - xy: 1024, 142 + xy: 842, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -2036,105 +2029,105 @@ TechIcons/Refrigeration index: -1 TechIcons/Replaceable Parts rotate: false - xy: 1400, 864 + xy: 1508, 972 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Rifling rotate: false - xy: 1724, 1188 + xy: 1832, 1296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Robotics rotate: false - xy: 1400, 756 + xy: 1508, 864 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Rocketry rotate: false - xy: 1508, 864 + xy: 1616, 972 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Sailing rotate: false - xy: 1832, 1188 + xy: 1508, 756 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Satellites rotate: false - xy: 1616, 864 + xy: 1724, 972 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Scientific Theory rotate: false - xy: 1724, 972 + xy: 1832, 1080 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Stealth rotate: false - xy: 1940, 1512 + xy: 1940, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steam Power rotate: false - xy: 1940, 1404 + xy: 1940, 1296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steel rotate: false - xy: 1940, 1296 + xy: 1940, 1188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Telecommunications rotate: false - xy: 1292, 570 + xy: 1400, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/The Wheel rotate: false - xy: 1940, 540 + xy: 220, 440 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Theology rotate: false - xy: 220, 440 + xy: 220, 332 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Trapping rotate: false - xy: 328, 440 + xy: 220, 224 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Writing rotate: false - xy: 436, 332 + xy: 544, 440 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2244,6 +2237,20 @@ TileSets/Default/OasisOverlay orig: 100, 100 offset: 0, 0 index: -1 +TileSets/Default/Railroad + rotate: false + xy: 1508, 1080 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Railroad + rotate: false + xy: 1508, 1080 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 TileSets/Default/Road rotate: false xy: 1153, 1739 @@ -2253,21 +2260,21 @@ TileSets/Default/Road index: -1 TileSets/Default/Tiles/River-Bottom rotate: false - xy: 1296, 219 + xy: 1512, 36 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/Default/Tiles/River-BottomLeft rotate: false - xy: 1296, 147 + xy: 1644, 251 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/Default/Tiles/River-BottomRight rotate: false - xy: 1336, 220 + xy: 1684, 284 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2288,1099 +2295,1099 @@ TileSets/FantasyHex/Road index: -1 TileSets/FantasyHex/Tiles/Academy rotate: false - xy: 444, 114 + xy: 1348, 526 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Academy-Snow rotate: false - xy: 1240, 447 + xy: 552, 107 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Aluminum rotate: false - xy: 1812, 504 + xy: 1240, 454 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins rotate: false - xy: 1852, 504 + xy: 1190, 338 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Jungle rotate: false - xy: 1932, 500 + xy: 1348, 486 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Sand rotate: false - xy: 1972, 504 + xy: 170, 16 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Snow rotate: false - xy: 2012, 504 + xy: 1388, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins2 rotate: false - xy: 1892, 504 + xy: 1306, 186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Atoll rotate: false - xy: 1588, 446 + xy: 1668, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bananas rotate: false - xy: 1708, 446 + xy: 1788, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment rotate: false - xy: 1748, 446 + xy: 1828, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment-Snow rotate: false - xy: 170, 15 + xy: 1868, 503 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barringer Crater rotate: false - xy: 210, 16 + xy: 1908, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bison rotate: false - xy: 1972, 468 + xy: 330, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bison+Camp rotate: false - xy: 2012, 468 + xy: 370, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cattle rotate: false - xy: 524, 114 + xy: 1708, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cattle+Pasture rotate: false - xy: 564, 110 + xy: 1748, 464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cerro de Potosi rotate: false - xy: 470, 78 + xy: 1828, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citadel rotate: false - xy: 510, 35 + xy: 1948, 461 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citadel-Snow rotate: false - xy: 450, 4 + xy: 410, 4 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citrus rotate: false - xy: 550, 74 + xy: 1988, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citrus+Plantation rotate: false - xy: 550, 38 + xy: 450, 6 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center rotate: false - xy: 1328, 403 + xy: 592, 99 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Ancient era rotate: false - xy: 1328, 363 + xy: 632, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Classical era rotate: false - xy: 1368, 406 + xy: 672, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Future era rotate: false - xy: 1368, 364 + xy: 712, 100 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Industrial era rotate: false - xy: 1408, 405 + xy: 752, 101 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Information era rotate: false - xy: 1408, 361 + xy: 792, 98 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Medieval era rotate: false - xy: 1448, 406 + xy: 832, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Modern era rotate: false - xy: 1448, 364 + xy: 872, 100 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Renaissance era rotate: false - xy: 1488, 406 + xy: 912, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City ruins rotate: false - xy: 1488, 370 + xy: 490, 6 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coal rotate: false - xy: 1528, 374 + xy: 530, 6 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coast rotate: false - xy: 1568, 410 + xy: 992, 106 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cocoa rotate: false - xy: 1568, 374 + xy: 1032, 106 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cocoa+Plantation rotate: false - xy: 1608, 410 + xy: 1072, 106 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Copper rotate: false - xy: 1688, 374 + xy: 1310, 150 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cotton rotate: false - xy: 1728, 374 + xy: 1310, 114 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Crab rotate: false - xy: 1328, 327 + xy: 1350, 114 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Customs house rotate: false - xy: 1408, 318 + xy: 1988, 425 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer rotate: false - xy: 1448, 328 + xy: 1468, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer+Camp rotate: false - xy: 1488, 334 + xy: 1508, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert rotate: false - xy: 1528, 338 + xy: 1548, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Farm rotate: false - xy: 1568, 338 + xy: 1588, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Flood plains+Farm rotate: false - xy: 1608, 337 + xy: 1628, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes rotate: false - xy: 1728, 338 + xy: 1748, 428 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes+Plantation rotate: false - xy: 1288, 310 + xy: 1788, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/El Dorado rotate: false - xy: 1768, 409 + xy: 1828, 431 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fallout rotate: false - xy: 1768, 366 + xy: 1868, 424 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fish rotate: false - xy: 1768, 330 + xy: 1908, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fishing Boats rotate: false - xy: 1328, 291 + xy: 1948, 391 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Flood plains rotate: false - xy: 1368, 292 + xy: 1988, 389 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Forest rotate: false - xy: 1448, 288 + xy: 872, 60 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fort rotate: false - xy: 1488, 293 + xy: 912, 61 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fountain of Youth rotate: false - xy: 1528, 298 + xy: 952, 66 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs rotate: false - xy: 1608, 301 + xy: 1032, 70 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs+Camp rotate: false - xy: 1648, 301 + xy: 1072, 70 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gems rotate: false - xy: 1368, 256 + xy: 1868, 388 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gold Ore rotate: false - xy: 1448, 252 + xy: 1948, 355 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grand Mesa rotate: false - xy: 1488, 253 + xy: 1988, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland rotate: false - xy: 1528, 262 + xy: 952, 30 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Farm rotate: false - xy: 1568, 266 + xy: 992, 34 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Camp rotate: false - xy: 1608, 262 + xy: 1032, 31 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Deer+Camp rotate: false - xy: 1648, 262 + xy: 1072, 31 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Furs+Camp rotate: false - xy: 1688, 263 + xy: 1112, 30 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Lumber mill rotate: false - xy: 1728, 263 + xy: 912, 22 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Truffles+Camp rotate: false - xy: 1768, 255 + xy: 626, 60 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Farm rotate: false - xy: 590, 74 + xy: 626, 24 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Camp rotate: false - xy: 590, 38 + xy: 666, 66 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Lumber mill rotate: false - xy: 1808, 432 + xy: 666, 30 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Trading post rotate: false - xy: 1808, 396 + xy: 706, 64 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Jungle+Trading post rotate: false - xy: 1848, 428 + xy: 706, 24 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/GrasslandForest rotate: false - xy: 1808, 357 + xy: 746, 61 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Great Barrier Reef rotate: false - xy: 1808, 321 + xy: 786, 26 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Hill rotate: false - xy: 1928, 316 + xy: 1356, 356 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillForest+Lumber mill rotate: false - xy: 1808, 246 + xy: 1364, 320 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMarbleQuarry rotate: false - xy: 1848, 245 + xy: 1364, 284 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMine rotate: false - xy: 1888, 252 + xy: 1364, 248 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillStoneQuarry rotate: false - xy: 1928, 280 + xy: 1396, 390 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Holy Site rotate: false - xy: 1928, 236 + xy: 1436, 382 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses rotate: false - xy: 1568, 230 + xy: 1596, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses+Pasture rotate: false - xy: 1608, 222 + xy: 1636, 392 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ice rotate: false - xy: 1728, 227 + xy: 1516, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense rotate: false - xy: 1448, 216 + xy: 1636, 356 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense+Plantation rotate: false - xy: 1808, 210 + xy: 1676, 359 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Iron rotate: false - xy: 1888, 180 + xy: 1716, 356 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory rotate: false - xy: 1568, 194 + xy: 1716, 320 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory+Camp rotate: false - xy: 1528, 190 + xy: 1756, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Jungle rotate: false - xy: 1688, 187 + xy: 1796, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Krakatoa rotate: false - xy: 1848, 171 + xy: 1836, 314 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Lakes rotate: false - xy: 1888, 144 + xy: 1876, 321 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Landmark rotate: false - xy: 1768, 136 + xy: 1916, 311 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Manufactory rotate: false - xy: 1648, 142 + xy: 1996, 230 size: 32, 39 orig: 32, 39 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marble rotate: false - xy: 1728, 119 + xy: 1996, 194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marsh rotate: false - xy: 1768, 99 + xy: 1232, 54 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mine rotate: false - xy: 1728, 83 + xy: 1312, 78 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Moai rotate: false - xy: 1848, 62 + xy: 1272, 5 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mount Fuji rotate: false - xy: 1608, 112 + xy: 1404, 282 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mountain rotate: false - xy: 1648, 98 + xy: 1404, 238 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oasis rotate: false - xy: 630, 42 + xy: 1392, 94 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ocean rotate: false - xy: 1972, 432 + xy: 1392, 58 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Offshore Platform rotate: false - xy: 2012, 432 + xy: 1392, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil rotate: false - xy: 1968, 396 + xy: 1432, 94 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil well rotate: false - xy: 1968, 360 + xy: 1432, 58 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Old Faithful rotate: false - xy: 2008, 392 + xy: 1432, 18 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pasture rotate: false - xy: 1968, 284 + xy: 1444, 248 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pearls rotate: false - xy: 1968, 248 + xy: 1524, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains rotate: false - xy: 1968, 176 + xy: 1524, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Farm rotate: false - xy: 2008, 212 + xy: 1524, 252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Camp rotate: false - xy: 1968, 136 + xy: 1564, 284 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Lumber mill rotate: false - xy: 2008, 172 + xy: 1564, 244 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Jungle+Trading post rotate: false - xy: 1968, 96 + xy: 1604, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsForest rotate: false - xy: 2008, 132 + xy: 1604, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsJungle rotate: false - xy: 1968, 56 + xy: 1604, 236 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation rotate: false - xy: 2008, 96 + xy: 1466, 212 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Bananas rotate: false - xy: 1968, 20 + xy: 1506, 216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Cotton rotate: false - xy: 2008, 60 + xy: 1470, 176 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Polder rotate: false - xy: 2008, 24 + xy: 1470, 140 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry rotate: false - xy: 1256, 202 + xy: 1472, 104 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Marble rotate: false - xy: 1256, 166 + xy: 1472, 68 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Stone rotate: false - xy: 1256, 130 + xy: 1472, 32 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-Bottom rotate: false - xy: 1296, 183 + xy: 1644, 287 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomLeft rotate: false - xy: 1296, 111 + xy: 1644, 215 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomRight rotate: false - xy: 1336, 184 + xy: 1684, 248 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Rock of Gibraltar rotate: false - xy: 1336, 144 + xy: 1684, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Salt rotate: false - xy: 1376, 207 + xy: 1724, 216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep rotate: false - xy: 1416, 143 + xy: 1804, 242 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep+Pasture rotate: false - xy: 1416, 103 + xy: 1804, 202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk rotate: false - xy: 1456, 72 + xy: 1844, 177 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk+Plantation rotate: false - xy: 1416, 67 + xy: 1844, 141 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silver rotate: false - xy: 1456, 36 + xy: 1884, 203 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow rotate: false - xy: 1496, 44 + xy: 1924, 169 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow+Farm rotate: false - xy: 1496, 8 + xy: 1924, 133 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices rotate: false - xy: 1536, 50 + xy: 2004, 158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices+Plantation rotate: false - xy: 1536, 14 + xy: 1964, 122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Stone rotate: false - xy: 1576, 76 + xy: 2004, 122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar rotate: false - xy: 1576, 40 + xy: 1924, 97 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar+Plantation rotate: false - xy: 1576, 4 + xy: 1964, 86 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Terrace farm rotate: false - xy: 1656, 7 + xy: 1552, 72 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Trading post rotate: false - xy: 670, 106 + xy: 1590, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Truffles rotate: false - xy: 750, 106 + xy: 1592, 36 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Truffles+Camp rotate: false - xy: 670, 34 + xy: 1630, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra rotate: false - xy: 710, 70 + xy: 1632, 108 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Farm rotate: false - xy: 790, 106 + xy: 1632, 72 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp rotate: false - xy: 710, 30 + xy: 1632, 32 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp+Furs rotate: false - xy: 750, 66 + xy: 1672, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Deer+Camp rotate: false - xy: 790, 66 + xy: 1672, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Lumber mill rotate: false - xy: 830, 102 + xy: 1672, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Truffles+Camp rotate: false - xy: 870, 102 + xy: 1712, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/TundraForest rotate: false - xy: 910, 102 + xy: 1712, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Uranium rotate: false - xy: 830, 66 + xy: 1670, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales rotate: false - xy: 830, 30 + xy: 1792, 129 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales+Fishing Boats rotate: false - xy: 910, 66 + xy: 1792, 93 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wheat rotate: false - xy: 950, 70 + xy: 1792, 57 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine rotate: false - xy: 990, 72 + xy: 1832, 105 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine+Plantation rotate: false - xy: 1030, 106 + xy: 1832, 69 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/TopBorder rotate: false - xy: 1696, 11 + xy: 1552, 36 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3394,945 +3401,945 @@ TileSets/FantasyHex/Units/African Forest Elephant index: -1 TileSets/FantasyHex/Units/Anti-Aircraft Gun rotate: false - xy: 1348, 446 + xy: 1428, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Anti-Tank Gun rotate: false - xy: 1388, 446 + xy: 1468, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Archaeologist rotate: false - xy: 1428, 446 + xy: 1508, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Archer rotate: false - xy: 1468, 446 + xy: 1548, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Artillery rotate: false - xy: 1508, 446 + xy: 1588, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Atlatlist rotate: false - xy: 1548, 446 + xy: 1628, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Axe Thrower rotate: false - xy: 1628, 446 + xy: 1708, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ballista rotate: false - xy: 1668, 446 + xy: 1748, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battering Ram rotate: false - xy: 250, 22 + xy: 1948, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battleship rotate: false - xy: 1812, 468 + xy: 1988, 504 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bazooka rotate: false - xy: 1852, 468 + xy: 210, 16 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berber Cavalry rotate: false - xy: 1892, 468 + xy: 250, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berserker rotate: false - xy: 1932, 464 + xy: 290, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bowman rotate: false - xy: 290, 14 + xy: 1190, 128 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Brute rotate: false - xy: 330, 14 + xy: 1230, 128 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Camel Archer rotate: false - xy: 370, 13 + xy: 1270, 127 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cannon rotate: false - xy: 410, 14 + xy: 1388, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Caravan rotate: false - xy: 1248, 405 + xy: 1428, 462 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Caravel rotate: false - xy: 1248, 369 + xy: 1468, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cargo Ship rotate: false - xy: 1248, 333 + xy: 1508, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carolean rotate: false - xy: 1288, 418 + xy: 1548, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carrier rotate: false - xy: 1288, 382 + xy: 1588, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cataphract rotate: false - xy: 1288, 346 + xy: 1628, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Catapult rotate: false - xy: 484, 114 + xy: 1668, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cavalry rotate: false - xy: 604, 114 + xy: 1788, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Chariot Archer rotate: false - xy: 510, 78 + xy: 1868, 467 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Chu-Ko-Nu rotate: false - xy: 470, 42 + xy: 1908, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/CivilianLandUnit rotate: false - xy: 1528, 410 + xy: 952, 106 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Comanche Rider rotate: false - xy: 1608, 373 + xy: 1112, 105 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Companion Cavalry rotate: false - xy: 1648, 409 + xy: 586, 62 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Composite Bowman rotate: false - xy: 1648, 373 + xy: 586, 26 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Conquistador rotate: false - xy: 1688, 410 + xy: 1346, 186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cossack rotate: false - xy: 1728, 410 + xy: 1350, 150 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Crossbowman rotate: false - xy: 1368, 328 + xy: 1908, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cruiser rotate: false - xy: 550, 4 + xy: 1948, 427 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Destroyer rotate: false - xy: 1648, 337 + xy: 1668, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Dromon rotate: false - xy: 1688, 338 + xy: 1708, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Foreign Legion rotate: false - xy: 1408, 282 + xy: 832, 66 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Frigate rotate: false - xy: 1568, 302 + xy: 992, 70 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galleass rotate: false - xy: 1688, 302 + xy: 1112, 69 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galley rotate: false - xy: 1728, 302 + xy: 1788, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Gatling Gun rotate: false - xy: 1768, 294 + xy: 1828, 395 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Giant Death Robot rotate: false - xy: 1408, 243 + xy: 1908, 357 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Admiral rotate: false - xy: 1848, 389 + xy: 746, 22 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Artist rotate: false - xy: 1888, 432 + xy: 786, 62 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Engineer rotate: false - xy: 1848, 353 + xy: 826, 30 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Galleass rotate: false - xy: 1888, 396 + xy: 866, 24 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great General rotate: false - xy: 1808, 282 + xy: 1152, 89 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Merchant rotate: false - xy: 1848, 317 + xy: 1192, 92 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Musician rotate: false - xy: 1888, 360 + xy: 1152, 53 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Prophet rotate: false - xy: 1888, 324 + xy: 1192, 56 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Scientist rotate: false - xy: 1848, 281 + xy: 1152, 17 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great War Infantry rotate: false - xy: 1888, 288 + xy: 1192, 20 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Writer rotate: false - xy: 1928, 428 + xy: 1386, 432 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hakkapeliitta rotate: false - xy: 1928, 392 + xy: 1426, 426 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Helicopter Gunship rotate: false - xy: 1928, 356 + xy: 1356, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hoplite rotate: false - xy: 1888, 216 + xy: 1476, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horse Archer rotate: false - xy: 1928, 200 + xy: 1516, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horseman rotate: false - xy: 1528, 226 + xy: 1556, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hussar rotate: false - xy: 1648, 225 + xy: 1676, 395 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hwach'a rotate: false - xy: 1688, 227 + xy: 1476, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Immortal rotate: false - xy: 1768, 219 + xy: 1556, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Impi rotate: false - xy: 1488, 217 + xy: 1596, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Infantry rotate: false - xy: 1848, 209 + xy: 1716, 392 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ironclad rotate: false - xy: 1928, 164 + xy: 1676, 323 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Jaguar rotate: false - xy: 1608, 186 + xy: 1756, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Janissary rotate: false - xy: 1648, 189 + xy: 1796, 359 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Keshik rotate: false - xy: 1728, 191 + xy: 1756, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Khan rotate: false - xy: 1768, 180 + xy: 1796, 280 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Knight rotate: false - xy: 1808, 174 + xy: 1836, 352 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Kris Swordsman rotate: false - xy: 1488, 181 + xy: 1836, 278 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Lancer rotate: false - xy: 1928, 128 + xy: 1876, 285 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/LandUnit rotate: false - xy: 1728, 155 + xy: 1876, 249 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landship rotate: false - xy: 1808, 138 + xy: 1916, 275 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landsknecht rotate: false - xy: 1848, 135 + xy: 1916, 239 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Legion rotate: false - xy: 1888, 108 + xy: 1956, 313 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longbowman rotate: false - xy: 1928, 92 + xy: 1956, 277 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longswordsman rotate: false - xy: 1568, 158 + xy: 1956, 241 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Machine Gun rotate: false - xy: 1528, 154 + xy: 1996, 313 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mandekalu Cavalry rotate: false - xy: 1608, 150 + xy: 1996, 277 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Maori Warrior rotate: false - xy: 1688, 151 + xy: 1956, 205 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Marine rotate: false - xy: 1688, 115 + xy: 1232, 91 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mechanized Infantry rotate: false - xy: 1808, 102 + xy: 1232, 18 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mehal Sefari rotate: false - xy: 1848, 99 + xy: 1272, 78 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Merchant Of Venice rotate: false - xy: 1888, 72 + xy: 1272, 42 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Minuteman rotate: false - xy: 1928, 56 + xy: 1312, 42 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Missile Cruiser rotate: false - xy: 1768, 63 + xy: 1352, 78 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Missionary rotate: false - xy: 1808, 66 + xy: 1352, 42 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mobile SAM rotate: false - xy: 1888, 36 + xy: 1312, 6 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Modern Armor rotate: false - xy: 1928, 20 + xy: 1352, 6 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mohawk Warrior rotate: false - xy: 1568, 122 + xy: 1404, 320 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketeer rotate: false - xy: 1688, 79 + xy: 1386, 202 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketman rotate: false - xy: 1728, 47 + xy: 1390, 166 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Naresuan's Elephant rotate: false - xy: 1768, 27 + xy: 1390, 130 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Nau rotate: false - xy: 1808, 30 + xy: 1426, 202 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Norwegian Ski Infantry rotate: false - xy: 1848, 26 + xy: 1430, 166 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Nuclear Submarine rotate: false - xy: 630, 78 + xy: 1430, 130 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Panzer rotate: false - xy: 1968, 324 + xy: 1444, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Paratrooper rotate: false - xy: 2008, 356 + xy: 1444, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pathfinder rotate: false - xy: 2008, 320 + xy: 1484, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Persian Immortal rotate: false - xy: 2008, 284 + xy: 1484, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pictish Warrior rotate: false - xy: 1968, 212 + xy: 1484, 252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pikeman rotate: false - xy: 2008, 248 + xy: 1564, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pracinha rotate: false - xy: 1256, 274 + xy: 1510, 180 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Privateer rotate: false - xy: 1256, 238 + xy: 1510, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Quinquereme rotate: false - xy: 630, 6 + xy: 1512, 108 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rifleman rotate: false - xy: 1296, 255 + xy: 1512, 72 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rocket Artillery rotate: false - xy: 1336, 108 + xy: 1724, 252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Samurai rotate: false - xy: 1376, 171 + xy: 1724, 180 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Scout rotate: false - xy: 1376, 135 + xy: 1764, 244 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sea Beggar rotate: false - xy: 1376, 99 + xy: 1764, 208 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Settler rotate: false - xy: 1416, 179 + xy: 1764, 171 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ship of the Line rotate: false - xy: 1456, 144 + xy: 1804, 165 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Siege Tower rotate: false - xy: 1456, 108 + xy: 1844, 213 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sipahi rotate: false - xy: 1496, 116 + xy: 1884, 165 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Slinger rotate: false - xy: 1496, 80 + xy: 1884, 129 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Spearman rotate: false - xy: 1536, 86 + xy: 1964, 158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Submarine rotate: false - xy: 590, 4 + xy: 1396, 356 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Swordsman rotate: false - xy: 1616, 62 + xy: 2004, 86 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tank rotate: false - xy: 1616, 26 + xy: 1550, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tercio rotate: false - xy: 1656, 43 + xy: 1552, 108 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trebuchet rotate: false - xy: 710, 106 + xy: 1592, 108 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trireme rotate: false - xy: 670, 70 + xy: 1592, 72 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Turtle Ship rotate: false - xy: 750, 30 + xy: 1712, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Chariot rotate: false - xy: 950, 106 + xy: 1710, 144 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Elephant rotate: false - xy: 790, 30 + xy: 1752, 105 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Warrior rotate: false - xy: 870, 66 + xy: 1752, 69 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/WaterUnit rotate: false - xy: 990, 108 + xy: 1752, 35 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Winged Hussar rotate: false - xy: 870, 30 + xy: 1872, 93 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Work Boats rotate: false - xy: 1070, 106 + xy: 1872, 57 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Worker rotate: false - xy: 910, 30 + xy: 1912, 61 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 UnitPromotionIcons/Accuracy rotate: false - xy: 328, 166 + xy: 436, 274 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Air Repair rotate: false - xy: 544, 382 + xy: 652, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Air Targeting rotate: false - xy: 652, 490 + xy: 112, 12 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting rotate: false - xy: 652, 490 + xy: 112, 12 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -4346,280 +4353,280 @@ UnitPromotionIcons/Ambush index: -1 UnitPromotionIcons/Amphibious rotate: false - xy: 768, 490 + xy: 436, 158 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Armor Plating rotate: false - xy: 884, 490 + xy: 826, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Barrage rotate: false - xy: 1116, 490 + xy: 1058, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Besiege rotate: false - xy: 1174, 490 + xy: 1116, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Siege rotate: false - xy: 1174, 490 + xy: 1116, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Blitz rotate: false - xy: 328, 108 + xy: 1174, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Boarding Party rotate: false - xy: 386, 166 + xy: 494, 274 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Bombardment rotate: false - xy: 386, 108 + xy: 494, 216 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Charge rotate: false - xy: 494, 274 + xy: 494, 158 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal Raider rotate: false - xy: 1290, 512 + xy: 494, 100 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Cover rotate: false - xy: 296, 50 + xy: 238, 58 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Discipline rotate: false - xy: 296, 50 + xy: 238, 58 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Drill rotate: false - xy: 610, 324 + xy: 470, 42 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Evasion rotate: false - xy: 444, 216 + xy: 660, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Extended Range rotate: false - xy: 444, 158 + xy: 718, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Operational Range rotate: false - xy: 444, 158 + xy: 718, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Flight Deck rotate: false - xy: 776, 432 + xy: 892, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Formation rotate: false - xy: 892, 432 + xy: 1008, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Great Generals rotate: false - xy: 1182, 432 + xy: 718, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Quick Study rotate: false - xy: 1182, 432 + xy: 718, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Haka War Dance rotate: false - xy: 502, 208 + xy: 776, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Heal Instantly rotate: false - xy: 502, 150 + xy: 892, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect Fire rotate: false - xy: 618, 208 + xy: 1008, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Interception rotate: false - xy: 668, 374 + xy: 1124, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics rotate: false - xy: 784, 374 + xy: 1240, 338 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/March rotate: false - xy: 842, 374 + xy: 552, 324 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Medic rotate: false - xy: 842, 316 + xy: 552, 266 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility rotate: false - xy: 1074, 374 + xy: 668, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Morale rotate: false - xy: 1132, 374 + xy: 668, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Rejuvenation rotate: false - xy: 966, 200 + xy: 958, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting rotate: false - xy: 1140, 200 + xy: 1074, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sentry rotate: false - xy: 1140, 200 + xy: 1074, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Shock rotate: false - xy: 734, 142 + xy: 1132, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Slinger Withdraw rotate: false - xy: 792, 142 + xy: 610, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sortie rotate: false - xy: 908, 142 + xy: 726, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Supply rotate: false - xy: 1082, 142 + xy: 900, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Survivalism rotate: false - xy: 1140, 142 + xy: 958, 142 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Volley rotate: false - xy: 1580, 482 + xy: 1248, 222 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack rotate: false - xy: 1696, 482 + xy: 1306, 280 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Woodsman rotate: false - xy: 1754, 482 + xy: 1306, 222 size: 50, 50 orig: 50, 50 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index 6387360870..c21aa71180 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/Civ V - Vanilla/Units.json b/android/assets/jsons/Civ V - Vanilla/Units.json index 068f706674..5fc9a8383d 100644 --- a/android/assets/jsons/Civ V - Vanilla/Units.json +++ b/android/assets/jsons/Civ V - Vanilla/Units.json @@ -1500,8 +1500,10 @@ "name": "Great Prophet", "unitType": "Civilian", "uniques": ["Can construct [Holy site] if it hasn't spread religion yet", "Can spread religion [4] times", - "May found a religion", "Great Person - [Faith]", "Unbuildable", "Religious Unit", "Hidden when religion is disabled"], - "movement": 2 + "May found a religion", "May enter foreign tiles without open borders", "[-1] Visibility Range", + "Great Person - [Faith]", "Unbuildable", "Religious Unit", "Hidden when religion is disabled"], + "movement": 2, + "religiousStrength": 1000 }, { "name": "Great General", @@ -1525,9 +1527,11 @@ { "name": "Missionary", "unitType": "Civilian", - "uniques": ["Can spread religion [2] times", "Can be purchased with [Faith] [in all cities in which the majority religion is a major religion]", - "Unbuildable", "Religious Unit", "Hidden when religion is disabled"], - "movement": 4 + "uniques": ["Can spread religion [2] times", "May enter foreign tiles without open borders, but loses [250] religious strength each turn it ends there", + "Can be purchased with [Faith] [in all cities in which the majority religion is a major religion]", + "[-1] Visibility Range", "Unbuildable", "Religious Unit", "Hidden when religion is disabled"], + "movement": 4, + "religiousStrength": 1000 } /* Spaceship Parts */ diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 4e5aaa20e4..95b6bd4a43 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -533,6 +533,7 @@ Our influence with City-States has started dropping faster! = You gained [Stats] as your religion was spread to [cityName] = You gained [Stats] as your religion was spread to an unknown city = Your city [cityName] was converted to [religionName]! = +Your [unitName] lost its faith after spending too long inside enemy territory! = # World Screen UI diff --git a/core/src/com/unciv/Constants.kt b/core/src/com/unciv/Constants.kt index ad041a32e5..c2d1adf31a 100644 --- a/core/src/com/unciv/Constants.kt +++ b/core/src/com/unciv/Constants.kt @@ -63,6 +63,9 @@ object Constants { const val unitActionParadrop = "Paradrop" const val futureTech = "Future Tech" + // Easter egg name. Hopefully is to hopefully avoid conflicts when later players can name their own religions. + // This religion name should never be displayed. + const val noReligionName = "The religion of TheLegend27" const val cancelImprovementOrder = "Cancel improvement order" const val tutorialPopupNamePrefix = "Tutorial: " diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 95f06a3686..8a49f15b3b 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -91,7 +91,7 @@ class GameInfo { fun getCurrentPlayerCivilization() = currentPlayerCiv fun getBarbarianCivilization() = getCivilization(Constants.barbarians) fun getDifficulty() = difficultyObject - fun getCities() = civilizations.flatMap { it.cities } + fun getCities() = civilizations.asSequence().flatMap { it.cities } fun getAliveCityStates() = civilizations.filter { it.isAlive() && it.isCityState() } fun getAliveMajorCivs() = civilizations.filter { it.isAlive() && it.isMajorCiv() } //endregion diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 43d04e6d3d..03af87296d 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -485,7 +485,8 @@ class CityInfo { } } else population.nextTurn(foodForNextTurn()) - // if (civInfo.gameInfo.hasReligionEnabled()) religion.getAffectedBySurroundingCities() + // This should go after the population change, as that might impact the amount of followers in this city + if (civInfo.gameInfo.hasReligionEnabled()) religion.endTurn() if (this in civInfo.cities) { // city was not destroyed health = min(health + 20, getMaxHealth()) @@ -652,7 +653,7 @@ class CityInfo { } fun isHolyCity(): Boolean { - return civInfo.gameInfo.religions.values.any { it.holyCityId == id } + return religion.religionThisIsTheHolyCityOf != null } fun canBeDestroyed(): Boolean { diff --git a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt index 6c5956bd48..3286bc1fd4 100644 --- a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt @@ -215,6 +215,8 @@ class CityInfoConquestFunctions(val city: CityInfo){ cityConstructions.addBuilding(civEquivalentBuilding.name) } } + + religion.removeUnknownPantheons() tryUpdateRoadStatus() } diff --git a/core/src/com/unciv/logic/city/CityReligion.kt b/core/src/com/unciv/logic/city/CityReligion.kt index 2781a5d0e5..242bfd74f0 100644 --- a/core/src/com/unciv/logic/city/CityReligion.kt +++ b/core/src/com/unciv/logic/city/CityReligion.kt @@ -1,11 +1,10 @@ package com.unciv.logic.city -import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.Constants import com.unciv.logic.civilization.NotificationIcon import com.unciv.models.Counter +import com.unciv.models.metadata.GameSpeed import com.unciv.models.ruleset.Unique -import com.unciv.models.stats.Stats -import kotlin.math.roundToInt class CityInfoReligionManager { @Transient @@ -16,16 +15,41 @@ class CityInfoReligionManager { val religionsAtSomePointAdopted: HashSet = hashSetOf() private val pressures: Counter = Counter() + // `getNumberOfFollowers()` was called a surprisingly large amount of time, so caching it feels useful + @Transient + private val followers: Counter = Counter() + + private val pressureFromAdjacentCities: Int by lazy { + when (cityInfo.civInfo.gameInfo.gameParameters.gameSpeed) { + GameSpeed.Quick -> 9 + GameSpeed.Standard -> 6 + GameSpeed.Epic -> 4 + GameSpeed.Marathon -> 2 + } + } + + var religionThisIsTheHolyCityOf: String? = null + + init { + clearAllPressures() + } fun clone(): CityInfoReligionManager { val toReturn = CityInfoReligionManager() toReturn.religionsAtSomePointAdopted.addAll(religionsAtSomePointAdopted) toReturn.pressures.putAll(pressures) + toReturn.followers.putAll(followers) + toReturn.religionThisIsTheHolyCityOf = religionThisIsTheHolyCityOf return toReturn } fun setTransients(cityInfo: CityInfo) { this.cityInfo = cityInfo + updateNumberOfFollowers() + } + + fun endTurn() { + getAffectedBySurroundingCities() } fun getUniques(): Sequence { @@ -40,14 +64,31 @@ class CityInfoReligionManager { fun clearAllPressures() { pressures.clear() + // We add pressure for following no religion + // Basically used as a failsafe so that there is always some religion, + // and we don't suddenly divide by 0 somewhere + // Should be removed when updating the followers so it never becomes the majority religion, + // `null` is used for that instead. + pressures.add(Constants.noReligionName, 100) } - fun addPressure(religionName: String, amount: Int) { - val oldMajorityReligion = getMajorityReligion() + fun addPressure(religionName: String, amount: Int, shouldUpdateFollowers: Boolean = true) { pressures.add(religionName, amount) - val newMajorityReligion = getMajorityReligion() - if (oldMajorityReligion != newMajorityReligion && newMajorityReligion != null) { - triggerReligionAdoption(newMajorityReligion) + + if (shouldUpdateFollowers) { + updateNumberOfFollowers() + } + } + + fun updatePressureOnPopulationChange(populationChangeAmount: Int) { + val majorityReligion = + if (getMajorityReligion() != null) getMajorityReligion()!! + else Constants.noReligionName + + if (populationChangeAmount > 0) { + addPressure(majorityReligion, 100 * populationChangeAmount) + } else { + updateNumberOfFollowers() } } @@ -80,50 +121,94 @@ class CityInfoReligionManager { religionsAtSomePointAdopted.add(newMajorityReligion) } + private fun updateNumberOfFollowers() { + val oldMajorityReligion = getMajorityReligion() + + followers.clear() + + val remainders = HashMap() + val pressurePerFollower = pressures.values.sum() / cityInfo.population.population + + // First give each religion an approximate share based on pressure + for ((religion, pressure) in pressures) { + val followersOfThisReligion = (pressure.toFloat() / pressurePerFollower).toInt() + followers.add(religion, followersOfThisReligion) + remainders[religion] = pressure.toFloat() - followersOfThisReligion * pressurePerFollower + } + + var unallocatedPopulation = cityInfo.population.population - followers.values.sum() + + // Divide up the remaining population + while (unallocatedPopulation > 0) { + val largestRemainder = remainders.maxByOrNull { it.value } + if (largestRemainder == null) { + followers.add(Constants.noReligionName, unallocatedPopulation) + break + } + followers.add(largestRemainder.key, 1) + remainders[largestRemainder.key] = 0f + unallocatedPopulation -= 1 + } + + followers.remove(Constants.noReligionName) + + val newMajorityReligion = getMajorityReligion() + if (oldMajorityReligion != newMajorityReligion && newMajorityReligion != null) { + triggerReligionAdoption(newMajorityReligion) + } + } + fun getNumberOfFollowers(): Counter { - val totalInfluence = pressures.values.sum() - val population = cityInfo.population.population - if (totalInfluence > 100 * population) { - val toReturn = Counter() - for ((key, value) in pressures) - if (value > 100) - toReturn.add(key, value / 100) - return toReturn + + // println(followers) // ToDo: remove this when a UI for viewing followers is added + + return followers + } + + /** Removes all pantheons except for the one founded by the current owner of the city + * Should be called whenever a city changes hands, e.g. conquering and trading + */ + fun removeUnknownPantheons() { + for (pressure in pressures) { + val correspondingReligion = cityInfo.civInfo.gameInfo.religions[pressure.key]!! + if (correspondingReligion.isPantheon() + && correspondingReligion.foundingCivName != cityInfo.civInfo.civName + ) { + pressures.remove(pressure.key) + } } - - val toReturn = Counter() - - for ((key, value) in pressures) { - val percentage = value.toFloat() / totalInfluence - val relativePopulation = (percentage * population).roundToInt() - toReturn.add(key, relativePopulation) - } - return toReturn + updateNumberOfFollowers() } fun getMajorityReligion(): String? { val followersPerReligion = getNumberOfFollowers() if (followersPerReligion.isEmpty()) return null val religionWithMaxFollowers = followersPerReligion.maxByOrNull { it.value }!! - return if (religionWithMaxFollowers.value >= cityInfo.population.population) religionWithMaxFollowers.key + return if (religionWithMaxFollowers.value >= cityInfo.population.population / 2) religionWithMaxFollowers.key else null } - fun getAffectedBySurroundingCities() { + private fun getAffectedBySurroundingCities() { + // We don't update the amount of followers yet, as only the end result should matter + // If multiple religions would become the majority religion due to pressure, + // this will make it so we only receive a notification for the last one. + // Also, doing it like this increases performance :D + if (cityInfo.isHolyCity()) { + addPressure(religionThisIsTheHolyCityOf!!,5 * pressureFromAdjacentCities, false) + } + val allCitiesWithin10Tiles = - cityInfo.civInfo.gameInfo.civilizations.asSequence().flatMap { it.cities } + cityInfo.civInfo.gameInfo.getCities() .filter { - it != cityInfo && it.getCenterTile() - .aerialDistanceTo(cityInfo.getCenterTile()) <= 10 + it != cityInfo + && it.getCenterTile().aerialDistanceTo(cityInfo.getCenterTile()) <= 10 } for (city in allCitiesWithin10Tiles) { - val majorityReligionOfCity = city.religion.getMajorityReligion() - if (majorityReligionOfCity == null) continue - else addPressure( - majorityReligionOfCity, - if (city.isHolyCity()) 30 - else 6 - ) + val majorityReligionOfCity = city.religion.getMajorityReligion() ?: continue + if (!cityInfo.civInfo.gameInfo.religions[majorityReligionOfCity]!!.isMajorReligion()) continue + addPressure(majorityReligionOfCity, pressureFromAdjacentCities, false) } + + updateNumberOfFollowers() } } \ No newline at end of file diff --git a/core/src/com/unciv/logic/city/PopulationManager.kt b/core/src/com/unciv/logic/city/PopulationManager.kt index 7e5861e2b1..ddaa7a76f7 100644 --- a/core/src/com/unciv/logic/city/PopulationManager.kt +++ b/core/src/com/unciv/logic/city/PopulationManager.kt @@ -56,7 +56,7 @@ class PopulationManager { if (food < 0) cityInfo.civInfo.addNotification("[${cityInfo.name}] is starving!", cityInfo.location, NotificationIcon.Growth, NotificationIcon.Death) if (foodStored < 0) { // starvation! - if (population > 1) population-- + if (population > 1) addPopulation(-1) foodStored = 0 } if (foodStored >= getFoodToNextPopulation()) { // growth! @@ -68,7 +68,7 @@ class PopulationManager { // Try to avoid runaway food gain in mods, just in case if (percentOfFoodCarriedOver > 95) percentOfFoodCarriedOver = 95 foodStored += (getFoodToNextPopulation() * percentOfFoodCarriedOver / 100f).toInt() - population++ + addPopulation(1) autoAssignPopulation() cityInfo.civInfo.addNotification("[${cityInfo.name}] has grown!", cityInfo.location, NotificationIcon.Growth) } @@ -77,14 +77,18 @@ class PopulationManager { private fun getStatsOfSpecialist(name: String) = cityInfo.cityStats.getStatsOfSpecialist(name) internal fun addPopulation(count: Int) { - population += count - if (population < 0) population = 0 + val changedAmount = + if (population + count < 0) -population + else count + population += changedAmount val freePopulation = getFreePopulation() if (freePopulation < 0) { unassignExtraPopulation() } else { autoAssignPopulation() } + + cityInfo.religion.updatePressureOnPopulationChange(changedAmount) } internal fun setPopulation(count: Int) { diff --git a/core/src/com/unciv/logic/civilization/CapitalConnectionsFinder.kt b/core/src/com/unciv/logic/civilization/CapitalConnectionsFinder.kt index 506474d81c..8d7b994f46 100644 --- a/core/src/com/unciv/logic/civilization/CapitalConnectionsFinder.kt +++ b/core/src/com/unciv/logic/civilization/CapitalConnectionsFinder.kt @@ -32,7 +32,7 @@ class CapitalConnectionsFinder(private val civInfo: CivilizationInfo) { // this is so we know that if we've seen which cities can be connected by port A, and one // of those is city B, then we don't need to check the cities that B can connect to by port, // since we'll get the same cities we got from A, since they're connected to the same sea. - while (citiesToCheck.isNotEmpty() && citiesReachedToMediums.size < allCivCities.size) { + while (citiesToCheck.isNotEmpty() && citiesReachedToMediums.size < allCivCities.count()) { newCitiesToCheck = mutableListOf() for (cityToConnectFrom in citiesToCheck) { if (cityToConnectFrom.containsHarbor()) { diff --git a/core/src/com/unciv/logic/civilization/ReligionManager.kt b/core/src/com/unciv/logic/civilization/ReligionManager.kt index 7420ebd0bc..7b5506b305 100644 --- a/core/src/com/unciv/logic/civilization/ReligionManager.kt +++ b/core/src/com/unciv/logic/civilization/ReligionManager.kt @@ -87,9 +87,8 @@ class ReligionManager { religion = Religion(belief.name, civInfo.gameInfo, civInfo.civName) religion!!.followerBeliefs.add(belief.name) civInfo.gameInfo.religions[belief.name] = religion!! - // ToDo: This should later be changed when religions can have multiple beliefs - civInfo.getCapital().religion.clearAllPressures() - civInfo.getCapital().religion.addPressure(belief.name, 100) // Capital is religious, other cities are not + for (city in civInfo.cities) + city.religion.addPressure(belief.name, 200 * city.population.population) religionState = ReligionState.Pantheon } @@ -114,10 +113,9 @@ class ReligionManager { if (Random(civInfo.gameInfo.turns).nextFloat() < prophetSpawnChange) { val birthCity = - if (religionState == ReligionState.Pantheon) civInfo.getCapital() - else civInfo.cities.firstOrNull { it.id == religion!!.holyCityId } - val prophet = civInfo.addUnit("Great Prophet", birthCity) - if (prophet == null) return + if (religionState <= ReligionState.Pantheon) civInfo.getCapital() + else civInfo.cities.firstOrNull { it.religion.religionThisIsTheHolyCityOf == religion!!.name } + val prophet = civInfo.addUnit("Great Prophet", birthCity) ?: return prophet.religion = religion!!.name prophet.abilityUsedCount["Religion Spread"] = 0 storedFaith -= faithForNextGreatProphet() @@ -170,15 +168,14 @@ class ReligionManager { } newReligion.followerBeliefs.addAll(followerBeliefs) newReligion.founderBeliefs.addAll(founderBelief) - newReligion.holyCityId = foundingCityId religion = newReligion civInfo.gameInfo.religions[name] = newReligion religionState = ReligionState.Religion - val holyCity = civInfo.cities.firstOrNull { it.id == newReligion.holyCityId }!! - // ToDo: check this when implementing followers - holyCity.religion.clearAllPressures() - holyCity.religion.addPressure(name, 100) + + val holyCity = civInfo.cities.first { it.id == foundingCityId } + holyCity.religion.religionThisIsTheHolyCityOf = newReligion.name + holyCity.religion.addPressure(name, holyCity.population.population * 500) foundingCityId = null } diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 8601c59e35..af2e459375 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -71,6 +71,9 @@ class MapUnit { @Transient var cannotEnterOceanTilesUntilAstronomy = false + @Transient + var canEnterForeignTerrain: Boolean = false + @Transient var paradropRange = 0 @@ -95,7 +98,7 @@ class MapUnit { fun displayName(): String { val name = if (instanceName == null) name else "$instanceName ({${name}})" - return if (religion != null && maxReligionSpreads() > 0) "[$name] ([$religion])" + return if (religion != null) "[$name] ([$religion])" else name } @@ -113,6 +116,7 @@ class MapUnit { var abilityUsedCount: HashMap = hashMapOf() var religion: String? = null + var religiousStrengthLost = 0 //region pure functions fun clone(): MapUnit { @@ -130,6 +134,7 @@ class MapUnit { toReturn.isTransported = isTransported toReturn.abilityUsedCount.putAll(abilityUsedCount) toReturn.religion = religion + toReturn.religiousStrengthLost = religiousStrengthLost return toReturn } @@ -177,7 +182,7 @@ class MapUnit { val uniques = ArrayList() val baseUnit = baseUnit() uniques.addAll(baseUnit.uniqueObjects) - if (type != null) uniques.addAll(type!!.uniqueObjects) + uniques.addAll(type.uniqueObjects) for (promotion in promotions.promotions) { uniques.addAll(currentTile.tileMap.gameInfo.ruleSet.unitPromotions[promotion]!!.uniqueObjects) @@ -193,12 +198,14 @@ class MapUnit { ignoresTerrainCost = hasUnique("Ignores terrain cost") roughTerrainPenalty = hasUnique("Rough terrain penalty") doubleMovementInCoast = hasUnique("Double movement in coast") - doubleMovementInForestAndJungle = - hasUnique("Double movement rate through Forest and Jungle") + doubleMovementInForestAndJungle = hasUnique("Double movement rate through Forest and Jungle") doubleMovementInSnowTundraAndHills = hasUnique("Double movement in Snow, Tundra and Hills") canEnterIceTiles = hasUnique("Can enter ice tiles") cannotEnterOceanTiles = hasUnique("Cannot enter ocean tiles") cannotEnterOceanTilesUntilAstronomy = hasUnique("Cannot enter ocean tiles until Astronomy") + canEnterForeignTerrain = + hasUnique("May enter foreign tiles without open borders, but loses [] religious strength each turn it ends there") + || hasUnique("May enter foreign tiles without open borders") } fun hasUnique(unique: String): Boolean { @@ -239,7 +246,9 @@ class MapUnit { for (unique in getTile().getAllTerrains().flatMap { it.uniqueObjects }) if (unique.placeholderText == "[] Sight for [] units" && matchesFilter(unique.params[1])) visibilityRange += unique.params[0].toInt() - + + if (visibilityRange < 1) visibilityRange = 1 + return visibilityRange } @@ -619,6 +628,23 @@ class MapUnit { if (action == Constants.unitActionParadrop) action = null + + if (hasUnique("Religious Unit") + && getTile().getOwner() != null + && !getTile().getOwner()!!.isCityState() + && !civInfo.canPassThroughTiles(getTile().getOwner()!!) + ) { + val lostReligiousStrength = + getMatchingUniques("May enter foreign tiles without open borders, but loses [] religious strength each turn it ends there") + .map { it.params[0].toInt() } + .minOrNull() + if (lostReligiousStrength != null) + religiousStrengthLost += lostReligiousStrength + if (religiousStrengthLost >= baseUnit.religiousStrength) { + civInfo.addNotification("Your [${name}] lost its faith after spending too long inside enemy territory!", getTile().position, name) + destroy() + } + } getCitadelDamage() getTerrainDamage() @@ -653,7 +679,7 @@ class MapUnit { action = null val tileOwner = getTile().getOwner() - if (tileOwner != null && !civInfo.canPassThroughTiles(tileOwner) && !tileOwner.isCityState()) // if an enemy city expanded onto this tile while I was in it + if (tileOwner != null && !canEnterForeignTerrain && !civInfo.canPassThroughTiles(tileOwner) && !tileOwner.isCityState()) // if an enemy city expanded onto this tile while I was in it movement.teleportToClosestMoveableTile() } @@ -914,6 +940,14 @@ class MapUnit { return getMatchingUniques("Can spread religion [] times").sumBy { it.params[0].toInt() } } + fun canSpreadReligion(): Boolean { + return hasUnique("Can spread religion [] times") + } + + fun getPressureAddedFromSpread(): Int { + return baseUnit.religiousStrength + } + fun getReligionString(): String { val maxSpreads = maxReligionSpreads() if (abilityUsedCount["Religion Spread"] == null) return "" // That is, either the key doesn't exist, or it does exist and the value is null. diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index 4a2dda3447..3d9c48ad83 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -498,8 +498,8 @@ class UnitMovementAlgorithms(val unit:MapUnit) { return false } if (tile.naturalWonder != null) return false - - if (!tile.canCivPassThrough(unit.civInfo)) return false + + if (!unit.canEnterForeignTerrain && !tile.canCivPassThrough(unit.civInfo)) return false val firstUnit = tile.getFirstUnit() if (firstUnit != null && firstUnit.civInfo != unit.civInfo && unit.civInfo.isAtWarWith(firstUnit.civInfo)) diff --git a/core/src/com/unciv/models/Religion.kt b/core/src/com/unciv/models/Religion.kt index 484402452c..110ed136e7 100644 --- a/core/src/com/unciv/models/Religion.kt +++ b/core/src/com/unciv/models/Religion.kt @@ -12,7 +12,6 @@ class Religion() : INamed { override lateinit var name: String var iconName: String = "Pantheon" lateinit var foundingCivName: String - var holyCityId: String? = null var founderBeliefs: HashSet = hashSetOf() var followerBeliefs: HashSet = hashSetOf() @@ -29,7 +28,6 @@ class Religion() : INamed { fun clone(): Religion { val toReturn = Religion(name, gameInfo, foundingCivName) toReturn.iconName = iconName - toReturn.holyCityId = holyCityId toReturn.founderBeliefs.addAll(founderBeliefs) toReturn.followerBeliefs.addAll(followerBeliefs) return toReturn diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index f156a01c7b..d3f4cd51f7 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -32,6 +32,7 @@ class BaseUnit : INamed, INonPerpetualConstruction, ICivilopediaText { var movement: Int = 0 var strength: Int = 0 var rangedStrength: Int = 0 + var religiousStrength: Int = 0 var range: Int = 2 var interceptRange = 0 lateinit var unitType: String @@ -327,6 +328,8 @@ class BaseUnit : INamed, INonPerpetualConstruction, ICivilopediaText { if (unit.hasUnique("Religious Unit")) { unit.religion = cityConstructions.cityInfo.religion.getMajorityReligion() + if (unit.canSpreadReligion()) + unit.abilityUsedCount["Religion Spread"] = 0 } if (this.isCivilian()) return true // tiny optimization makes save files a few bytes smaller diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 6bb753913b..5172cc9610 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -466,15 +466,12 @@ object UnitActions { val maxReligionSpreads = unit.maxReligionSpreads() if (!unit.abilityUsedCount.containsKey("Religion Spread")) return // This should be impossible anyways, but just in case if (maxReligionSpreads <= unit.abilityUsedCount["Religion Spread"]!!) return - val city = tile.getCity() - if (city == null) return + val city = tile.getCity() ?: return actionList += UnitAction(UnitActionType.SpreadReligion, title = "Spread [${unit.religion!!}]", action = { unit.abilityUsedCount["Religion Spread"] = unit.abilityUsedCount["Religion Spread"]!! + 1 - // ToDo: implement followers - city.religion.clearAllPressures() - city.religion.addPressure(unit.religion!!, 100) + city.religion.addPressure(unit.religion!!, unit.getPressureAddedFromSpread()) unit.currentMovement = 0f if (unit.abilityUsedCount["Religion Spread"] == maxReligionSpreads) { addGoldPerGreatPersonUsage(unit.civInfo) @@ -487,7 +484,7 @@ object UnitActions { fun getImprovementConstructionActions(unit: MapUnit, tile: TileInfo): ArrayList { val finalActions = ArrayList() var uniquesToCheck = unit.getMatchingUniques("Can construct []") - if (unit.abilityUsedCount.containsKey("Religion Spread") && unit.abilityUsedCount["Religion Spread"]!! == 0 && unit.maxReligionSpreads() > 0) + if (unit.abilityUsedCount.containsKey("Religion Spread") && unit.abilityUsedCount["Religion Spread"]!! == 0 && unit.canSpreadReligion()) uniquesToCheck += unit.getMatchingUniques("Can construct [] if it hasn't spread religion yet") for (unique in uniquesToCheck) { val improvementName = unique.params[0] diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt index 1a4681d1aa..5fdc585a6f 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt @@ -163,10 +163,15 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){ unitDescriptionTable.add(unit.promotions.XP.toString() + "/" + unit.promotions.xpForNextPromotion()) } - if (unit.maxReligionSpreads() > 0) { + if (unit.canSpreadReligion()) { unitDescriptionTable.add(ImageGetter.getStatIcon("Faith")).size(20f) unitDescriptionTable.add(unit.getReligionString()) } + + if (unit.baseUnit.religiousStrength > 0) { + unitDescriptionTable.add(ImageGetter.getStatIcon("ReligiousStrength")).size(20f) + unitDescriptionTable.add((unit.baseUnit.religiousStrength - unit.religiousStrengthLost).toString()) + } if (unit.promotions.promotions.size != promotionsTable.children.size) // The unit has been promoted! Reload promotions! selectedUnitHasChanged = true diff --git a/docs/Credits.md b/docs/Credits.md index 172dcaaba7..faa4f321f0 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -613,6 +613,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Lock](https://thenounproject.com/search/?q=lock&i=3217613) by Vadim Solomakhin for locked tiles * [Hourglass](https://thenounproject.com/search/?q=hourglass&i=142268) by I Create Stuff for the 'Turn' icon * [Dove](https://thenounproject.com/search/?q=dove&i=1344084) by Sandra for Faith +* [Shield](https://thenounproject.com/search/?q=shield&i=813568) by Gregor Cresnar for Religious Strength ## Main menu