diff --git a/android/Images/PolicyIcons/Communism.png b/android/Images/PolicyIcons/Communism.png new file mode 100644 index 0000000000..11dfa8e294 Binary files /dev/null and b/android/Images/PolicyIcons/Communism.png differ diff --git a/android/Images/PolicyIcons/Merchant Navy.png b/android/Images/PolicyIcons/Merchant Navy.png index bf7d21db2e..67a04ed1d9 100644 Binary files a/android/Images/PolicyIcons/Merchant Navy.png and b/android/Images/PolicyIcons/Merchant Navy.png differ diff --git a/android/Images/PolicyIcons/Nationalism.png b/android/Images/PolicyIcons/Nationalism.png new file mode 100644 index 0000000000..f54f915fd9 Binary files /dev/null and b/android/Images/PolicyIcons/Nationalism.png differ diff --git a/android/Images/PolicyIcons/Naval Tradition.png b/android/Images/PolicyIcons/Naval Tradition.png index 965246ff08..646f8cb3da 100644 Binary files a/android/Images/PolicyIcons/Naval Tradition.png and b/android/Images/PolicyIcons/Naval Tradition.png differ diff --git a/android/Images/PolicyIcons/Planned Economy.png b/android/Images/PolicyIcons/Planned Economy.png new file mode 100644 index 0000000000..985cd26755 Binary files /dev/null and b/android/Images/PolicyIcons/Planned Economy.png differ diff --git a/android/Images/PolicyIcons/Socialism.png b/android/Images/PolicyIcons/Socialism.png new file mode 100644 index 0000000000..10862910c0 Binary files /dev/null and b/android/Images/PolicyIcons/Socialism.png differ diff --git a/android/Images/PolicyIcons/United Front.png b/android/Images/PolicyIcons/United Front.png new file mode 100644 index 0000000000..bbef3d043f Binary files /dev/null and b/android/Images/PolicyIcons/United Front.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index d08447ab33..e8cf74c652 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -6,21 +6,21 @@ filter: MipMapLinearLinear, MipMapLinearLinear repeat: none EmojiIcons/Gold rotate: false - xy: 328, 222 + xy: 328, 164 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Production rotate: false - xy: 560, 330 + xy: 502, 214 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Turn rotate: false - xy: 618, 316 + xy: 618, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -461,7 +461,7 @@ OtherIcons/DisbandUnit index: -1 OtherIcons/Down rotate: false - xy: 1566, 474 + xy: 1674, 698 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -622,14 +622,14 @@ OtherIcons/Triangle index: -1 OtherIcons/Up rotate: false - xy: 734, 432 + xy: 792, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/whiteDot rotate: false - xy: 190, 715 + xy: 1112, 387 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -662,247 +662,282 @@ PolicyIcons/Collective Rule orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Constitution +PolicyIcons/Communism rotate: false xy: 1940, 1013 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +PolicyIcons/Constitution + rotate: false + xy: 1566, 590 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 PolicyIcons/Democracy rotate: false - xy: 1566, 532 + xy: 1566, 474 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Fascism rotate: false - xy: 328, 570 + xy: 328, 512 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Religion rotate: false - xy: 328, 396 + xy: 328, 338 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Speech rotate: false - xy: 328, 338 + xy: 328, 280 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Thought rotate: false - xy: 328, 280 + xy: 328, 222 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Humanism rotate: false - xy: 386, 562 + xy: 386, 504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Landed Elite rotate: false - xy: 444, 504 + xy: 502, 562 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Legalism rotate: false - xy: 502, 562 + xy: 386, 388 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mandate Of Heaven rotate: false - xy: 444, 446 + xy: 502, 504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mercantilism rotate: false - xy: 386, 330 + xy: 444, 388 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Merchant Navy rotate: false - xy: 444, 388 + xy: 502, 446 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Meritocracy rotate: false - xy: 502, 446 + xy: 560, 504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Militarism rotate: false - xy: 560, 504 + xy: 386, 272 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Caste rotate: false - xy: 386, 272 + xy: 444, 330 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Tradition rotate: false - xy: 444, 330 + xy: 502, 388 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Monarchy rotate: false - xy: 560, 446 + xy: 386, 214 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Naval Tradition - rotate: false - xy: 502, 330 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -PolicyIcons/Oligarchy +PolicyIcons/Nationalism rotate: false xy: 560, 388 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Organized Religion +PolicyIcons/Naval Tradition rotate: false xy: 386, 156 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Police State +PolicyIcons/Oligarchy rotate: false xy: 444, 214 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Populism +PolicyIcons/Organized Religion rotate: false xy: 502, 272 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Professional Army +PolicyIcons/Planned Economy + rotate: false + xy: 560, 330 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Police State rotate: false xy: 386, 98 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Protectionism +PolicyIcons/Populism rotate: false xy: 444, 156 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Reformation +PolicyIcons/Professional Army + rotate: false + xy: 560, 272 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Protectionism rotate: false xy: 444, 98 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Representation - rotate: false - xy: 560, 214 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -PolicyIcons/Republic +PolicyIcons/Reformation rotate: false xy: 502, 98 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Scientific Revolution +PolicyIcons/Representation rotate: false - xy: 560, 156 + xy: 560, 98 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Secularism +PolicyIcons/Republic rotate: false xy: 386, 40 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +PolicyIcons/Scientific Revolution + rotate: false + xy: 444, 40 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Secularism + rotate: false + xy: 560, 40 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Socialism + rotate: false + xy: 676, 490 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 PolicyIcons/Sovereignty - rotate: false - xy: 618, 490 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -PolicyIcons/Theocracy - rotate: false - xy: 618, 374 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -PolicyIcons/Total War rotate: false xy: 676, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 -PolicyIcons/Trade Unions - rotate: false - xy: 734, 490 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -PolicyIcons/Universal Suffrage +PolicyIcons/Theocracy rotate: false xy: 676, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +PolicyIcons/Total War + rotate: false + xy: 734, 432 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Trade Unions + rotate: false + xy: 792, 490 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/United Front + rotate: false + xy: 676, 316 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +PolicyIcons/Universal Suffrage + rotate: false + xy: 734, 374 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 PolicyIcons/Warrior Code rotate: false - xy: 618, 258 + xy: 618, 200 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1154,7 +1189,7 @@ StatIcons/Happiness index: -1 StatIcons/InterceptRange rotate: false - xy: 444, 562 + xy: 386, 446 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1168,7 +1203,7 @@ StatIcons/Malcontent index: -1 StatIcons/Movement rotate: false - xy: 444, 272 + xy: 502, 330 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1189,14 +1224,14 @@ StatIcons/Production index: -1 StatIcons/Range rotate: false - xy: 502, 214 + xy: 502, 156 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/RangedStrength rotate: false - xy: 560, 272 + xy: 560, 214 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1224,7 +1259,7 @@ StatIcons/Specialist index: -1 StatIcons/Strength rotate: false - xy: 618, 432 + xy: 734, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1889,42 +1924,42 @@ ImprovementIcons/Railroad index: -1 TileSets/Default/Tiles/River-Bottom rotate: false - xy: 1552, 220 + xy: 1352, 170 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-Bottom rotate: false - xy: 1552, 220 + xy: 1352, 170 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/Default/Tiles/River-BottomLeft rotate: false - xy: 1592, 222 + xy: 1392, 386 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomLeft rotate: false - xy: 1592, 222 + xy: 1392, 386 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/Default/Tiles/River-BottomRight rotate: false - xy: 1632, 230 + xy: 1392, 350 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomRight rotate: false - xy: 1632, 230 + xy: 1392, 350 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -1987,14 +2022,14 @@ TileSets/FantasyHex/Tiles/Ancient ruins-Jungle index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Sand rotate: false - xy: 792, 454 + xy: 792, 396 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Snow rotate: false - xy: 850, 512 + xy: 850, 454 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2008,35 +2043,35 @@ TileSets/FantasyHex/Tiles/Ancient ruins2 index: -1 TileSets/FantasyHex/Tiles/Atoll rotate: false - xy: 1656, 662 + xy: 1998, 1973 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bananas rotate: false - xy: 792, 418 + xy: 1872, 878 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment rotate: false - xy: 890, 512 + xy: 792, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment-Snow rotate: false - xy: 618, 185 + xy: 618, 127 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barringer Crater rotate: false - xy: 192, 4 + xy: 948, 512 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2050,7 +2085,7 @@ TileSets/FantasyHex/Tiles/Cattle index: -1 TileSets/FantasyHex/Tiles/Cattle+Pasture rotate: false - xy: 1050, 508 + xy: 1108, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2064,861 +2099,861 @@ TileSets/FantasyHex/Tiles/Cerro de Potosi index: -1 TileSets/FantasyHex/Tiles/Citadel rotate: false - xy: 1090, 505 + xy: 1148, 505 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citadel-Snow rotate: false - xy: 1130, 510 + xy: 1188, 510 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center rotate: false - xy: 1170, 505 + xy: 1228, 505 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Ancient era rotate: false - xy: 1210, 508 + xy: 1696, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Classical era rotate: false - xy: 1250, 508 + xy: 1804, 766 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Future era rotate: false - xy: 618, 34 + xy: 1948, 931 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Industrial era rotate: false - xy: 1948, 932 + xy: 1912, 873 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Information era rotate: false - xy: 1696, 654 + xy: 1624, 618 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Medieval era rotate: false - xy: 1804, 766 + xy: 1624, 578 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Modern era rotate: false - xy: 1912, 872 + xy: 1624, 536 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Renaissance era rotate: false - xy: 1980, 973 + xy: 1624, 496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City ruins rotate: false - xy: 1988, 937 + xy: 592, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coal rotate: false - xy: 734, 302 + xy: 676, 186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coast rotate: false - xy: 850, 476 + xy: 734, 244 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cotton rotate: false - xy: 1090, 469 + xy: 1028, 476 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Customs house rotate: false - xy: 1210, 465 + xy: 1148, 462 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer rotate: false - xy: 1250, 472 + xy: 1188, 474 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer+Camp rotate: false - xy: 1624, 626 + xy: 1228, 469 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert rotate: false - xy: 1624, 590 + xy: 1624, 460 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Farm rotate: false - xy: 1624, 554 + xy: 832, 382 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Flood plains+Farm rotate: false - xy: 1624, 518 + xy: 832, 346 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes rotate: false - xy: 1732, 698 + xy: 832, 274 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes+Plantation rotate: false - xy: 1736, 662 + xy: 658, 150 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/El Dorado rotate: false - xy: 1840, 841 + xy: 658, 113 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fallout rotate: false - xy: 658, 201 + xy: 658, 70 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fish rotate: false - xy: 658, 165 + xy: 716, 208 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fishing Boats rotate: false - xy: 658, 129 + xy: 716, 172 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Flood plains rotate: false - xy: 658, 93 + xy: 890, 440 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Forest rotate: false - xy: 658, 17 + xy: 970, 436 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fort rotate: false - xy: 716, 261 + xy: 1010, 435 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fountain of Youth rotate: false - xy: 832, 436 + xy: 1050, 436 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs rotate: false - xy: 872, 439 + xy: 930, 404 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs+Camp rotate: false - xy: 872, 403 + xy: 970, 400 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gems rotate: false - xy: 872, 367 + xy: 698, 136 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gold Ore rotate: false - xy: 912, 367 + xy: 698, 100 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grand Mesa rotate: false - xy: 792, 342 + xy: 698, 60 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland rotate: false - xy: 832, 328 + xy: 658, 34 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Farm rotate: false - xy: 872, 331 + xy: 698, 24 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Camp rotate: false - xy: 912, 328 + xy: 1090, 435 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Deer+Camp rotate: false - xy: 774, 303 + xy: 1090, 396 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Furs+Camp rotate: false - xy: 1952, 893 + xy: 872, 365 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Lumber mill rotate: false - xy: 1992, 898 + xy: 912, 365 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Farm rotate: false - xy: 1952, 857 + xy: 872, 329 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Camp rotate: false - xy: 1992, 862 + xy: 872, 293 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Lumber mill rotate: false - xy: 716, 225 + xy: 912, 329 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Trading post rotate: false - xy: 698, 189 + xy: 912, 293 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Jungle+Trading post rotate: false - xy: 698, 149 + xy: 1980, 973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/GrasslandForest rotate: false - xy: 698, 110 + xy: 1988, 934 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Great Barrier Reef rotate: false - xy: 756, 266 + xy: 872, 257 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Hill rotate: false - xy: 1032, 360 + xy: 1170, 398 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillForest+Lumber mill rotate: false - xy: 1032, 324 + xy: 1210, 397 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMarbleQuarry rotate: false - xy: 1072, 433 + xy: 1952, 895 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMine rotate: false - xy: 1072, 397 + xy: 1992, 898 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillStoneQuarry rotate: false - xy: 1072, 361 + xy: 1952, 859 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses rotate: false - xy: 738, 117 + xy: 738, 136 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses+Pasture rotate: false - xy: 738, 77 + xy: 738, 96 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ice rotate: false - xy: 1112, 433 + xy: 1032, 363 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense rotate: false - xy: 1112, 325 + xy: 1032, 255 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense+Plantation rotate: false - xy: 1152, 435 + xy: 1072, 360 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Iron rotate: false - xy: 1152, 363 + xy: 1072, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory rotate: false - xy: 1192, 429 + xy: 1112, 351 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory+Camp rotate: false - xy: 1192, 393 + xy: 1112, 315 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Jungle rotate: false - xy: 1232, 425 + xy: 778, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Krakatoa rotate: false - xy: 1272, 424 + xy: 1152, 349 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Lakes rotate: false - xy: 1312, 426 + xy: 1152, 277 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Landmark rotate: false - xy: 1352, 418 + xy: 1192, 353 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Manufactory rotate: false - xy: 1432, 415 + xy: 1272, 350 size: 32, 39 orig: 32, 39 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marble rotate: false - xy: 1432, 379 + xy: 1272, 278 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marsh rotate: false - xy: 1472, 389 + xy: 1232, 216 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mine rotate: false - xy: 1472, 353 + xy: 1272, 170 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Moai rotate: false - xy: 1512, 437 + xy: 796, 172 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mount Fuji rotate: false - xy: 1552, 400 + xy: 818, 26 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mountain rotate: false - xy: 1512, 321 + xy: 1998, 1665 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oasis rotate: false - xy: 1592, 330 + xy: 1998, 1449 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ocean rotate: false - xy: 1632, 446 + xy: 1998, 1413 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Offshore Platform rotate: false - xy: 1632, 410 + xy: 1998, 1377 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil rotate: false - xy: 1632, 374 + xy: 1998, 1341 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil well rotate: false - xy: 1632, 338 + xy: 1998, 1305 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Old Faithful rotate: false - xy: 1392, 278 + xy: 1998, 1265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pasture rotate: false - xy: 1512, 281 + xy: 1998, 1153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pearls rotate: false - xy: 1592, 294 + xy: 1998, 1081 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains rotate: false - xy: 992, 296 + xy: 1330, 426 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Farm rotate: false - xy: 1032, 288 + xy: 1370, 426 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Camp rotate: false - xy: 1072, 285 + xy: 1410, 422 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Lumber mill rotate: false - xy: 1112, 285 + xy: 1450, 422 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Jungle+Trading post rotate: false - xy: 1152, 287 + xy: 1312, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsForest rotate: false - xy: 1192, 281 + xy: 1312, 346 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsJungle rotate: false - xy: 1232, 274 + xy: 1352, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation rotate: false - xy: 1272, 280 + xy: 1312, 310 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Bananas rotate: false - xy: 1312, 282 + xy: 1352, 350 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Cotton rotate: false - xy: 1352, 274 + xy: 1312, 274 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry rotate: false - xy: 1632, 266 + xy: 1352, 278 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Marble rotate: false - xy: 1392, 242 + xy: 1312, 202 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Stone rotate: false - xy: 1432, 235 + xy: 1352, 242 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Rock of Gibraltar rotate: false - xy: 778, 190 + xy: 1432, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep rotate: false - xy: 818, 195 + xy: 1432, 274 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep+Pasture rotate: false - xy: 818, 155 + xy: 1392, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk rotate: false - xy: 818, 46 + xy: 1392, 165 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk+Plantation rotate: false - xy: 818, 10 + xy: 1432, 165 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silver rotate: false - xy: 1312, 246 + xy: 1472, 386 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow rotate: false - xy: 1392, 206 + xy: 1472, 276 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow+Farm rotate: false - xy: 1432, 199 + xy: 1472, 240 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices rotate: false - xy: 1512, 209 + xy: 1472, 168 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices+Plantation rotate: false - xy: 1312, 210 + xy: 1512, 402 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Stone rotate: false - xy: 1352, 200 + xy: 1512, 366 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar rotate: false - xy: 1844, 771 + xy: 1512, 330 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar+Plantation rotate: false - xy: 1392, 170 + xy: 1512, 294 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Terrace farm rotate: false - xy: 1552, 184 + xy: 1552, 402 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Trading post rotate: false - xy: 1632, 194 + xy: 1552, 330 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra rotate: false - xy: 1632, 158 + xy: 1552, 222 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Farm rotate: false - xy: 1472, 137 + xy: 1552, 186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp rotate: false - xy: 1512, 133 + xy: 1736, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp+Furs rotate: false - xy: 1552, 108 + xy: 1512, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Deer+Camp rotate: false - xy: 1592, 110 + xy: 1552, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Lumber mill rotate: false - xy: 1632, 118 + xy: 1472, 128 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/TundraForest rotate: false - xy: 1998, 1669 + xy: 1512, 106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Uranium rotate: false - xy: 1998, 1597 + xy: 1352, 134 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales rotate: false - xy: 1998, 1419 + xy: 1664, 586 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales+Fishing Boats rotate: false - xy: 1998, 1383 + xy: 1664, 550 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wheat rotate: false - xy: 1998, 1347 + xy: 1664, 514 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine rotate: false - xy: 1998, 1311 + xy: 1664, 478 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine+Plantation rotate: false - xy: 1998, 1275 + xy: 1844, 771 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/TopBorder rotate: false - xy: 1592, 186 + xy: 1552, 366 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2932,133 +2967,133 @@ TileSets/FantasyHex/Units/African Forest Elephant index: -1 TileSets/FantasyHex/Units/Anti-Aircraft Gun rotate: false - xy: 618, 222 + xy: 908, 512 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Anti-Tank Gun rotate: false - xy: 676, 280 + xy: 618, 164 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Archer rotate: false - xy: 734, 338 + xy: 676, 222 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Artillery rotate: false - xy: 152, 4 + xy: 734, 280 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Atlatlist rotate: false - xy: 1998, 1973 + xy: 152, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Axe Thrower rotate: false - xy: 1764, 770 + xy: 1656, 662 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ballista rotate: false - xy: 1872, 878 + xy: 1764, 770 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battering Ram rotate: false - xy: 1998, 1937 + xy: 192, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battleship rotate: false - xy: 792, 382 + xy: 1998, 1937 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bazooka rotate: false - xy: 930, 512 + xy: 792, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berber Cavalry rotate: false - xy: 618, 149 + xy: 618, 91 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berserker rotate: false - xy: 232, 4 + xy: 988, 512 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bowman rotate: false - xy: 1998, 1901 + xy: 232, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Brute rotate: false - xy: 970, 512 + xy: 1998, 1901 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Camel Archer rotate: false - xy: 618, 112 + xy: 618, 54 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cannon rotate: false - xy: 272, 4 + xy: 1028, 512 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Caravel rotate: false - xy: 1998, 1865 + xy: 272, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carolean rotate: false - xy: 1010, 512 + xy: 1998, 1865 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carrier rotate: false - xy: 618, 76 + xy: 1068, 512 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3100,707 +3135,707 @@ TileSets/FantasyHex/Units/Chu-Ko-Nu index: -1 TileSets/FantasyHex/Units/CivilianLandUnit rotate: false - xy: 676, 244 + xy: 850, 418 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Comanche Rider rotate: false - xy: 890, 475 + xy: 1732, 733 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Companion Cavalry rotate: false - xy: 930, 475 + xy: 1840, 841 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Composite Bowman rotate: false - xy: 970, 476 + xy: 908, 476 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Conquistador rotate: false - xy: 1010, 476 + xy: 948, 476 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cossack rotate: false - xy: 1050, 472 + xy: 988, 476 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Crossbowman rotate: false - xy: 1130, 474 + xy: 1068, 476 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cruiser rotate: false - xy: 1170, 471 + xy: 1108, 474 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Destroyer rotate: false - xy: 1624, 482 + xy: 832, 310 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Dromon rotate: false - xy: 1732, 734 + xy: 792, 288 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Foreign Legion rotate: false - xy: 658, 57 + xy: 930, 440 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Frigate rotate: false - xy: 832, 400 + xy: 890, 404 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galleass rotate: false - xy: 912, 439 + xy: 1010, 399 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galley rotate: false - xy: 912, 403 + xy: 1050, 400 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Gatling Gun rotate: false - xy: 832, 364 + xy: 774, 252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Admiral rotate: false - xy: 698, 71 + xy: 1130, 423 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Artist rotate: false - xy: 698, 35 + xy: 1130, 387 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Engineer rotate: false - xy: 756, 230 + xy: 912, 257 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Galleass rotate: false - xy: 952, 439 + xy: 952, 364 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great General rotate: false - xy: 952, 400 + xy: 952, 325 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Merchant rotate: false - xy: 952, 364 + xy: 952, 289 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Musician rotate: false - xy: 952, 328 + xy: 952, 253 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Prophet rotate: false - xy: 992, 440 + xy: 992, 363 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Scientist rotate: false - xy: 992, 404 + xy: 992, 327 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great War Infantry rotate: false - xy: 992, 368 + xy: 992, 291 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Writer rotate: false - xy: 992, 332 + xy: 992, 255 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hakkapeliitta rotate: false - xy: 1032, 436 + xy: 1188, 438 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Helicopter Gunship rotate: false - xy: 1032, 400 + xy: 1228, 433 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hoplite rotate: false - xy: 1072, 325 + xy: 1992, 862 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horse Archer rotate: false - xy: 738, 189 + xy: 756, 208 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horseman rotate: false - xy: 738, 153 + xy: 756, 172 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hussar rotate: false - xy: 738, 40 + xy: 738, 59 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hwach'a rotate: false - xy: 738, 4 + xy: 738, 23 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Immortal rotate: false - xy: 1112, 397 + xy: 1032, 327 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Impi rotate: false - xy: 1112, 361 + xy: 1032, 291 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Infantry rotate: false - xy: 1152, 399 + xy: 1072, 324 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ironclad rotate: false - xy: 1152, 327 + xy: 1072, 252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Jaguar rotate: false - xy: 1192, 357 + xy: 1112, 279 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Janissary rotate: false - xy: 1192, 321 + xy: 1112, 243 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Keshik rotate: false - xy: 1232, 389 + xy: 778, 96 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Khan rotate: false - xy: 1232, 350 + xy: 778, 57 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Knight rotate: false - xy: 1232, 314 + xy: 778, 21 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Kris Swordsman rotate: false - xy: 1272, 388 + xy: 1152, 313 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Lancer rotate: false - xy: 1272, 352 + xy: 1152, 241 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/LandUnit rotate: false - xy: 1312, 390 + xy: 1250, 397 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landship rotate: false - xy: 1272, 316 + xy: 1192, 317 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landsknecht rotate: false - xy: 1312, 354 + xy: 1232, 361 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Legion rotate: false - xy: 1352, 382 + xy: 1192, 281 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longbowman rotate: false - xy: 1392, 426 + xy: 1232, 325 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longswordsman rotate: false - xy: 1312, 318 + xy: 1192, 245 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Machine Gun rotate: false - xy: 1352, 346 + xy: 1232, 289 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mandekalu Cavalry rotate: false - xy: 1392, 390 + xy: 1232, 253 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Maori Warrior rotate: false - xy: 1392, 354 + xy: 1272, 314 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Marine rotate: false - xy: 1472, 426 + xy: 1272, 242 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mechanized Infantry rotate: false - xy: 1352, 310 + xy: 1192, 209 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mehal Sefari rotate: false - xy: 1392, 318 + xy: 1272, 206 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Merchant Of Venice rotate: false - xy: 1432, 343 + xy: 1232, 180 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Minuteman rotate: false - xy: 1432, 307 + xy: 1508, 438 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Missile Cruiser rotate: false - xy: 1472, 317 + xy: 1548, 438 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mobile SAM rotate: false - xy: 1512, 401 + xy: 818, 136 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Modern Armor rotate: false - xy: 1552, 438 + xy: 818, 100 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mohawk Warrior rotate: false - xy: 1512, 365 + xy: 818, 64 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketeer rotate: false - xy: 1552, 364 + xy: 1998, 1629 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketman rotate: false - xy: 1552, 328 + xy: 1998, 1593 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Naresuan's Elephant rotate: false - xy: 1592, 438 + xy: 1998, 1557 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Nau rotate: false - xy: 1592, 402 + xy: 1998, 1521 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Norwegian Ski Infantry rotate: false - xy: 1592, 366 + xy: 1998, 1485 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Panzer rotate: false - xy: 1432, 271 + xy: 1998, 1229 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Paratrooper rotate: false - xy: 1472, 281 + xy: 1998, 1193 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pathfinder rotate: false - xy: 1552, 292 + xy: 1998, 1117 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Persian Immortal rotate: false - xy: 1632, 302 + xy: 1998, 1045 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pictish Warrior rotate: false - xy: 796, 267 + xy: 796, 216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pikeman rotate: false - xy: 796, 231 + xy: 1290, 426 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pracinha rotate: false - xy: 1552, 256 + xy: 1352, 314 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Privateer rotate: false - xy: 1592, 258 + xy: 1312, 238 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Quinquereme rotate: false - xy: 1472, 245 + xy: 1352, 206 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rifleman rotate: false - xy: 1512, 245 + xy: 1312, 166 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rocket Artillery rotate: false - xy: 778, 154 + xy: 1392, 314 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Samurai rotate: false - xy: 778, 118 + xy: 1432, 346 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Scout rotate: false - xy: 778, 82 + xy: 1392, 278 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sea Beggar rotate: false - xy: 778, 46 + xy: 1432, 310 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Settler rotate: false - xy: 778, 9 + xy: 1392, 241 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ship of the Line rotate: false - xy: 818, 118 + xy: 1432, 237 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Siege Tower rotate: false - xy: 818, 82 + xy: 1432, 201 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sipahi rotate: false - xy: 1352, 236 + xy: 1472, 348 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Slinger rotate: false - xy: 1272, 244 + xy: 1472, 312 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Spearman rotate: false - xy: 1472, 209 + xy: 1472, 204 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Submarine rotate: false - xy: 1840, 807 + xy: 1732, 699 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Swordsman rotate: false - xy: 1432, 163 + xy: 1512, 258 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tank rotate: false - xy: 1472, 173 + xy: 1512, 222 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tercio rotate: false - xy: 1512, 173 + xy: 1512, 186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trebuchet rotate: false - xy: 1552, 148 + xy: 1552, 294 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trireme rotate: false - xy: 1592, 150 + xy: 1552, 258 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Turtle Ship rotate: false - xy: 1998, 1633 + xy: 1552, 110 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Chariot rotate: false - xy: 1998, 1561 + xy: 1392, 129 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Elephant rotate: false - xy: 1998, 1525 + xy: 1432, 129 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Warrior rotate: false - xy: 1998, 1489 + xy: 1664, 622 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/WaterUnit rotate: false - xy: 1998, 1455 + xy: 1840, 807 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Winged Hussar rotate: false - xy: 1998, 1239 + xy: 1704, 622 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Work Boats rotate: false - xy: 1998, 1203 + xy: 1704, 586 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Worker rotate: false - xy: 1998, 1167 + xy: 1704, 550 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3898,210 +3933,210 @@ UnitPromotionIcons/Coastal Raider index: -1 UnitPromotionIcons/Cover rotate: false - xy: 1566, 590 + xy: 1566, 532 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Discipline rotate: false - xy: 1566, 590 + xy: 1566, 532 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Drill rotate: false - xy: 1674, 698 + xy: 1782, 806 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Evasion rotate: false - xy: 1782, 806 + xy: 1890, 914 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Extended Range rotate: false - xy: 1890, 914 + xy: 328, 570 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Operational Range rotate: false - xy: 1890, 914 + xy: 328, 570 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Flight Deck rotate: false - xy: 328, 512 + xy: 328, 454 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Formation rotate: false - xy: 328, 454 + xy: 328, 396 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Great Generals rotate: false - xy: 328, 164 + xy: 328, 106 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Quick Study rotate: false - xy: 328, 164 + xy: 328, 106 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Haka War Dance rotate: false - xy: 328, 106 + xy: 328, 48 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Heal Instantly rotate: false - xy: 328, 48 + xy: 386, 562 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect Fire rotate: false - xy: 386, 504 + xy: 444, 562 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Interception rotate: false - xy: 386, 446 + xy: 444, 504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics rotate: false - xy: 386, 388 + xy: 444, 446 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/March rotate: false - xy: 502, 504 + xy: 560, 562 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Medic rotate: false - xy: 560, 562 + xy: 386, 330 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility rotate: false - xy: 502, 388 + xy: 560, 446 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Morale rotate: false - xy: 386, 214 + xy: 444, 272 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Rejuvenation rotate: false - xy: 502, 156 + xy: 560, 156 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting rotate: false - xy: 560, 98 + xy: 502, 40 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sentry rotate: false - xy: 560, 98 + xy: 502, 40 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Shock rotate: false - xy: 444, 40 + xy: 618, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Slinger Withdraw rotate: false - xy: 502, 40 + xy: 618, 432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sortie rotate: false - xy: 560, 40 + xy: 618, 374 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting rotate: false - xy: 676, 490 + xy: 618, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting I (air) rotate: false - xy: 676, 490 + xy: 618, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Volley rotate: false - xy: 792, 490 + xy: 850, 490 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack rotate: false - xy: 676, 316 + xy: 676, 258 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Woodsman rotate: false - xy: 734, 374 + xy: 734, 316 size: 50, 50 orig: 50, 50 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index 9874c77be1..20b9184070 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/Civ V - Vanilla/Buildings.json b/android/assets/jsons/Civ V - Vanilla/Buildings.json index 5538601037..1fc6acdd09 100644 --- a/android/assets/jsons/Civ V - Vanilla/Buildings.json +++ b/android/assets/jsons/Civ V - Vanilla/Buildings.json @@ -687,7 +687,7 @@ "isWonder": true, "greatPersonPoints": {"production": 2}, "providesFreeBuilding": "Castle", - "uniques": ["+[15]% combat bonus for units fighting in [Friendly Land]"], + "uniques": ["+[15]% Strength for units fighting in [Friendly Land]"], "requiredTech": "Gunpowder", "quote": "'Bushido is realized in the presence of death. This means choosing death whenever there is a choice between life and death. There is no other reasoning.' - Yamamoto Tsunetomo" }, diff --git a/android/assets/jsons/Civ V - Vanilla/Policies.json b/android/assets/jsons/Civ V - Vanilla/Policies.json index 257e1dc06b..22e8ef22f9 100644 --- a/android/assets/jsons/Civ V - Vanilla/Policies.json +++ b/android/assets/jsons/Civ V - Vanilla/Policies.json @@ -129,7 +129,7 @@ }, { "name": "Honor Complete", - "uniques": ["Earn [10]% of killed [Military] unit's [Cost] as [Gold]"], + "uniques": ["Earn [10]% of killed [Military] unit's [Cost] as [Gold]"] } ] },{ @@ -311,46 +311,10 @@ } ] }, - /*{ - "name": "Order", - "era": "Industrial era", - "policies": [ - { - "name": "Nationalism", - "row": 1, - "column": 1 - }, - { - "name": "United Front", - "row": 1, - "column": 3 - }, - { - "name": "Planned Economy", - "row": 2, - "column": 5 - }, - { - "name": "Socialism", - "requires": ["Planned Economy"], - "row": 2, - "column": 3 - }, - { - "name": "Communism", - "requires": ["Socialism"], - "row": 3, - "column": 3 - }, - { - "name": "Order Complete", Gold and Culture per city" - } - ] - },*/ { "name": "Freedom", "era": "Renaissance era", - "uniques": ["+[25]% great person generation in all cities"], + "uniques": ["+[25]% great person generation in all cities", "Incompatible with [Autocracy]", "Incompatible with [Order]"], "policies": [ { "name": "Constitution", @@ -393,7 +357,8 @@ { "name": "Autocracy", "era": "Industrial era", - "uniques": ["-[33]% unit upkeep costs", "Upon capturing a city, receive [10] times its [Culture] production as [Culture] immediately"], + "uniques": ["-[33]% unit upkeep costs", "Upon capturing a city, receive [10] times its [Culture] production as [Culture] immediately", + "Incompatible with [Order]", "Incompatible with [Freedom]"], "policies": [ { "name": "Populism", @@ -434,5 +399,48 @@ "uniques": ["+[25]% attack strength to all [Military] units for [50] turns"] } ] - } + }, + { + "name": "Order", + "era": "Industrial era", + "uniques": ["[+1 Happiness] [in all cities]", "Incompatible with [Autocracy]", "Incompatible with [Freedom]"], + "policies": [ + { + "name": "United Front", + "uniques": ["Militaristic City-States grant units [2] times as fast when you are at war with a common nation"], + "row": 1, + "column": 1 + }, + { + "name": "Planned Economy", + "uniques": ["+[25]% [Science] from every [Factory]", "+[100]% Production when constructing a [Factory]"], + "row": 1, + "column": 3 + }, + { + "name": "Nationalism", + "uniques": ["+[15]% Strength for units fighting in [Friendly Land]"], + "row": 1, + "column": 5 + }, + { + "name": "Socialism", + "requires": ["Planned Economy"], + "uniques": ["-[15]% maintenance cost for buildings [in all cities]"], + "row": 2, + "column": 3 + }, + { + "name": "Communism", + "requires": ["Socialism"], + "uniques": ["[+1 Production] [in all cities]", "[+1 Production] from every [Mine]", "[+1 Production] from every [Quarry]"], + "row": 3, + "column": 3 + }, + { + "name": "Order Complete", + "uniques": ["[+2 Food, +2 Production, +2 Science, +2 Gold, +2 Culture] [in all cities]"] + } + ] +} ] diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index fc06d53f60..3bbc655465 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -84,13 +84,13 @@ object BattleDamage { modifiers["vs [City-States]"] = 30 // Deprecated since 3.14.17 - if (civInfo.hasUnique("+15% combat strength for melee units which have another military unit in an adjacent tile") - && combatant.isMelee() - && combatant.getTile().neighbors.flatMap { it.getUnits() } - .any { it.civInfo == civInfo && !it.type.isCivilian() && !it.type.isAirUnit() } - ) - modifiers["Discipline"] = 15 - + if (civInfo.hasUnique("+15% combat strength for melee units which have another military unit in an adjacent tile") + && combatant.isMelee() + && combatant.getTile().neighbors.flatMap { it.getUnits() } + .any { it.civInfo == civInfo && !it.type.isCivilian() && !it.type.isAirUnit() } + ) + modifiers["Discipline"] = 15 + // } if (enemy.getCivInfo().isBarbarian()) { @@ -226,12 +226,19 @@ object BattleDamage { for (unique in unit.unit.getMatchingUniques("+[]% Strength in []") + unit.getCivInfo() - .getMatchingUniques("+[]% combat bonus for units fighting in []")) { + .getMatchingUniques("+[]% Strength for units fighting in []")) { val filter = unique.params[1] if (tile.matchesUniqueFilter(filter, unit.getCivInfo())) modifiers.add(filter, unique.params[0].toInt()) } - + + // Deprecated since 3.15 + for (unique in unit.getCivInfo().getMatchingUniques("+[]% combat bonus for units fighting in []")) { + val filter = unique.params[1] + if (tile.matchesUniqueFilter(filter, unit.getCivInfo())) + modifiers.add(filter, unique.params[0].toInt()) + } + // for (unique in unit.getCivInfo() .getMatchingUniques("+[]% Strength if within [] tiles of a []")) { diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index c43a830874..675e198004 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -182,7 +182,7 @@ class CityStats { var unhappinessFromCitizens = cityInfo.population.population.toFloat() var unhappinessFromSpecialists = cityInfo.population.getNumberOfSpecialists().toFloat() - + for (unique in civInfo.getMatchingUniques("Specialists only produce []% of normal unhappiness")) { unhappinessFromSpecialists *= (1f - unique.params[0].toFloat() / 100f) } @@ -190,8 +190,8 @@ class CityStats { if (civInfo.hasUnique("Specialists produce half normal unhappiness")) unhappinessFromSpecialists *= 0.5f // - - unhappinessFromCitizens -= cityInfo.population.getNumberOfSpecialists().toFloat() - unhappinessFromSpecialists + + unhappinessFromCitizens -= cityInfo.population.getNumberOfSpecialists().toFloat() - unhappinessFromSpecialists if (cityInfo.isPuppet) unhappinessFromCitizens *= 1.5f @@ -200,14 +200,14 @@ class CityStats { for (unique in civInfo.getMatchingUniques("Unhappiness from population decreased by []%")) unhappinessFromCitizens *= (1 - unique.params[0].toFloat() / 100) - + for (unique in civInfo.getMatchingUniques("Unhappiness from population decreased by []% []")) if (cityInfo.matchesFilter(unique.params[1])) unhappinessFromCitizens *= (1 - unique.params[0].toFloat() / 100) newHappinessList["Population"] = -unhappinessFromCitizens * unhappinessModifier - var happinessFromPolicies = getStatsFromUniques(civInfo.policies.policyUniques.getAllUniques()).happiness + val happinessFromPolicies = getStatsFromUniques(civInfo.policies.policyUniques.getAllUniques()).happiness newHappinessList["Policies"] = happinessFromPolicies @@ -306,11 +306,16 @@ class CityStats { for (unique in uniques.filter { it.placeholderText == "+[]% [] []"}) if (cityInfo.matchesFilter(unique.params[2])) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) - + for (unique in uniques.filter { it.placeholderText == "+[]% Production when constructing []" }) { if (constructionMatchesFilter(currentConstruction, unique.params[1])) stats.production += unique.params[0].toInt() } + // Used for specific buildings (ex.: +100% Production when constructing a Factory) + for (unique in uniques.filter { it.placeholderText == "+[]% Production when constructing a []" }) { + if (constructionMatchesFilter(currentConstruction, unique.params[1])) + stats.production += unique.params[0].toInt() + } // "+[amount]% Production when constructing [constructionFilter] [cityFilter]" for (unique in uniques.filter { it.placeholderText == "+[]% Production when constructing [] []" }) { @@ -320,29 +325,27 @@ class CityStats { // "+[amount]% Production when constructing [unitFilter] units [cityFilter]" for (unique in uniques.filter { it.placeholderText == "+[]% Production when constructing [] units []" }) { - if (currentConstruction is BaseUnit && currentConstruction.matchesFilter(unique.params[1]) - && cityInfo.matchesFilter(unique.params[2])) + if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2])) stats.production += unique.params[0].toInt() } if (cityInfo.civInfo.getHappiness() >= 0) { for (unique in uniques.filter { it.placeholderText == "+[]% [] while the empire is happy"}) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) - + // Deprecated since 3.15.0 for (unique in uniques.filter { it.placeholderText == "+15% science while the empire is happy"}) stats.science += 15f // - } + } return stats } - fun constructionMatchesFilter(construction: IConstruction, filter: String): Boolean { - return construction.name == filter - || filter == "Buildings" && construction is Building && !(construction.isWonder || construction.isNationalWonder) - || filter == "Wonders" && construction is Building && (construction.isWonder || construction.isNationalWonder) - || construction is Building && construction.uniques.contains(filter) + private fun constructionMatchesFilter(construction: IConstruction, filter: String): Boolean { + if (construction is Building) return construction.matchesFilter(filter) + if (construction is BaseUnit) return construction.matchesFilter(filter) + return false } fun isConnectedToCapital(roadType: RoadStatus): Boolean { @@ -354,7 +357,7 @@ class CityStats { } //endregion - fun updateBaseStatList() { + private fun updateBaseStatList() { val newBaseStatList = LinkedHashMap() // we don't edit the existing baseStatList directly, in order to avoid concurrency exceptions val civInfo = cityInfo.civInfo @@ -375,7 +378,7 @@ class CityStats { } - fun updateStatPercentBonusList(currentConstruction: IConstruction, citySpecificUniques: Sequence) { + private fun updateStatPercentBonusList(currentConstruction: IConstruction, citySpecificUniques: Sequence) { val newStatPercentBonusList = LinkedHashMap() newStatPercentBonusList["Golden Age"] = getStatPercentBonusesFromGoldenAge(cityInfo.civInfo.goldenAges.isGoldenAge()) newStatPercentBonusList["Policies"] = getStatPercentBonusesFromUniques(currentConstruction, cityInfo.civInfo.policies.policyUniques.getAllUniques()) @@ -397,9 +400,10 @@ class CityStats { } fun update(currentConstruction: IConstruction = cityInfo.cityConstructions.getCurrentConstruction()) { + // We calculate this here for concurrency reasons + // If something needs this, we pass this through as a parameter + val citySpecificUniques = getCitySpecificUniques() - val citySpecificUniques: Sequence = cityInfo.cityConstructions.builtBuildingUniqueMap.getAllUniques() - .filter { it.params.isNotEmpty() && it.params.last() == "in this city" } // We need to compute Tile yields before happiness updateBaseStatList() updateCityHappiness() @@ -482,20 +486,32 @@ class CityStats { newFinalStatList["Maintenance"] = Stats().apply { gold -= buildingsMaintenance.toInt() } - if (totalFood > 0 && currentConstruction is BaseUnit - && currentConstruction.uniques.contains("Excess Food converted to Production when under construction")) { - newFinalStatList["Excess food to production"] = - Stats().apply { production = totalFood; food = -totalFood } + if (totalFood > 0 && constructionMatchesFilter(currentConstruction, "Excess Food converted to Production when under construction")) { + newFinalStatList["Excess food to production"] = Stats().apply { production = totalFood; food = -totalFood } } if (cityInfo.isInResistance()) newFinalStatList.clear() // NOPE if (newFinalStatList.values.map { it.production }.sum() < 1) // Minimum production for things to progress - newFinalStatList["Production"] = Stats().apply { production = 1F } + newFinalStatList["Production"] = Stats().apply { production = 1f } finalStatList = newFinalStatList } + private fun getCitySpecificUniques(): Sequence { + return cityInfo.cityConstructions.builtBuildingUniqueMap.getAllUniques() + .filter { it.params.isNotEmpty() && it.params.last() == "in this city" } + } + + private fun getUniquesForThisCity( + unique: String, + // We might have to cached to avoid concurrency problems, so if we don't, just get it directly + citySpecificUniques: Sequence = getCitySpecificUniques() + ): Sequence { + return citySpecificUniques.filter { it.placeholderText == unique } + + cityInfo.civInfo.getMatchingUniques(unique).filter { cityInfo.matchesFilter(it.params[1]) } + } + private fun getBuildingMaintenanceCosts(citySpecificUniques: Sequence): Float { // Same here - will have a different UI display. var buildingsMaintenance = cityInfo.cityConstructions.getMaintenanceCosts().toFloat() // this is AFTER the bonus calculation! @@ -503,26 +519,32 @@ class CityStats { buildingsMaintenance *= cityInfo.civInfo.gameInfo.getDifficulty().aiBuildingMaintenanceModifier } - // e.g. "-[50]% Maintenance costs [in this city]" - val maintenanceUniqueTemplate = "-[]% building maintenance costs []" - val maintenanceUniques = citySpecificUniques.filter { it.placeholderText == maintenanceUniqueTemplate } + - cityInfo.civInfo.getMatchingUniques(maintenanceUniqueTemplate).filter { cityInfo.matchesFilter(it.params[1]) } - for (unique in maintenanceUniques) buildingsMaintenance *= (1f - unique.params[0].toFloat() / 100) + // e.g. "-[50]% maintenance costs for buildings [in this city]" + for (unique in getUniquesForThisCity("-[]% maintenance cost for buildings []", citySpecificUniques)) { + buildingsMaintenance *= (1f - unique.params[0].toFloat() / 100) + } + + // Deprecated since 3.15 + for (unique in getUniquesForThisCity("-[]% building maintenance costs []", citySpecificUniques)) { + buildingsMaintenance *= (1f - unique.params[0].toFloat() / 100) + } + // + return buildingsMaintenance } private fun updateFoodEaten() { foodEaten = cityInfo.population.population.toFloat() * 2 var foodEatenBySpecialists = 2f * cityInfo.population.getNumberOfSpecialists() - - for (unique in cityInfo.civInfo.getMatchingUniques("-[]% food consumption by specialists")) + + for (unique in cityInfo.civInfo.getMatchingUniques("-[]% food consumption by specialists")) foodEatenBySpecialists *= 1f - unique.params[0].toFloat() / 100f - + // Deprecated since 3.15 if (cityInfo.civInfo.hasUnique("-50% food consumption by specialists")) foodEatenBySpecialists *= 0.5f // - + foodEaten -= 2f * cityInfo.population.getNumberOfSpecialists() - foodEatenBySpecialists } } diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 6a31cdaf99..2528c03926 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -380,6 +380,19 @@ class DiplomacyManager() { // No need to decrement negative countdown flags: they do not expire if (flagsCountdown[flag]!! > 0) flagsCountdown[flag] = flagsCountdown[flag]!! - 1 + + // If we have uniques that make city states grant military units faster when at war with a common enemy, add higher numbers to this flag + if (flag == DiplomacyFlags.ProvideMilitaryUnit.name && civInfo.isMajorCiv() && otherCiv().isCityState() && + civInfo.gameInfo.civilizations.filter { civInfo.isAtWarWith(it) && otherCiv().isAtWarWith(it) }.any()) { + for (unique in civInfo.getMatchingUniques("Militaristic City-States grant units [] times as fast when you are at war with a common nation")) { + flagsCountdown[DiplomacyFlags.ProvideMilitaryUnit.name] = + flagsCountdown[DiplomacyFlags.ProvideMilitaryUnit.name]!! - unique.params[0].toInt() + 1 + if (flagsCountdown[DiplomacyFlags.ProvideMilitaryUnit.name]!! <= 0) { + flagsCountdown[DiplomacyFlags.ProvideMilitaryUnit.name] = 0 + break + } + } + } // At the end of every turn if (flag == DiplomacyFlags.ResearchAgreement.name) diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 7ef6e8f871..af22c99a06 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -276,7 +276,7 @@ open class TileInfo { } fun getImprovementStats(improvement: TileImprovement, observingCiv: CivilizationInfo, city: CityInfo?): Stats { - val stats = improvement.clone() + val stats = improvement.clone() // clones the stats of the improvement, not the improvement itself if (hasViewableResource(observingCiv) && getTileResource().improvement == improvement.name) stats.add(getTileResource().improvementStats!!.clone()) // resource-specific improvement @@ -316,16 +316,16 @@ open class TileInfo { } stats.add(unique.stats.times(numberOfBonuses.toFloat())) } - + for (unique in observingCiv.getMatchingUniques("+[]% yield from every []")) if (improvement.matchesFilter(unique.params[1])) stats.timesInPlace(1f + unique.params[0].toFloat() / 100f) - + // Deprecated since 3.15 - if (containsGreatImprovement() && observingCiv.hasUnique("Tile yield from Great Improvements +100%")) + if (containsGreatImprovement() && observingCiv.hasUnique("Tile yield from Great Improvements +100%")) stats.timesInPlace(2f) // - + return stats } @@ -393,10 +393,10 @@ open class TileInfo { } /** - * Implementation of _`tileFilter`_ + * Implementation of _`tileFilter`_ * @see tileFilter */ - fun matchesUniqueFilter(filter: String, civInfo: CivilizationInfo? = null): Boolean { + fun matchesUniqueFilter(filter: String, civInfo: CivilizationInfo? = null): Boolean { return when (filter) { "All" -> true baseTerrain -> true diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 8c7ee3a33d..3a16e8f382 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -446,6 +446,19 @@ class Building : NamedStats(), IConstruction { return true } + + fun matchesFilter(filter: String): Boolean { + return when (filter) { + "All" -> true + name -> true + "Building", "Buildings" -> !(isWonder || isNationalWonder) + "Wonder", "Wonders" -> isWonder || isNationalWonder + else -> { + if (uniques.contains(filter)) return true + return false + } + } + } fun isStatRelated(stat: Stat): Boolean { if (get(stat) > 0) return true diff --git a/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt index 2cd390e5ab..78b27ac2ed 100644 --- a/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt @@ -46,13 +46,20 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, civInfo: CivilizationInfo if (!UncivGame.Current.worldScreen.canChangeState) rightSideButton.disable() - topTable.row().pad(30f) + topTable.row().pad(10f) - for (branch in viewingCiv.gameInfo.ruleSet.policyBranches.values) { - if (branch.name == "Commerce") topTable.addSeparator() + val branches = viewingCiv.gameInfo.ruleSet.policyBranches + val rowChangeIndex = (branches.size + 1) / 2 + var wrapper = Table() + for ( (index, branch) in branches.values.withIndex()) { + if (index == rowChangeIndex) { + topTable.add(wrapper) + topTable.addSeparator() + wrapper = Table() + } val branchGroup = Table() branchGroup.row().pad(20f) - branchGroup.add(getPolicyButton(branch, false)).row() + branchGroup.add(getPolicyButton(branch, false)).minWidth(160f).row() var currentRow = 1 var currentColumn = 1 @@ -60,7 +67,7 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, civInfo: CivilizationInfo for (policy in branch.policies) { if (policy.name.endsWith("Complete")) continue if (policy.row > currentRow) { - branchTable.row() + branchTable.row().pad(2.5f) currentRow++ currentColumn = 1 } @@ -73,10 +80,11 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, civInfo: CivilizationInfo branchTable.pack() branchGroup.add(branchTable).height(150f).row() - branchGroup.add(getPolicyButton(branch.policies.last(), false)) // finisher + branchGroup.add(getPolicyButton(branch.policies.last(), false)).pad(15f,0f) // finisher - topTable.add(branchGroup) + wrapper.add(branchGroup).pad(0f, 10f) } + topTable.add(wrapper) topTable.pack() } diff --git a/docs/Credits.md b/docs/Credits.md index fbcee4c19c..4c8fbdc2f2 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -325,7 +325,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Trade](https://thenounproject.com/term/trade/686718/) By Gregor Cresnar for Trade Unions * [Pie Chart](https://thenounproject.com/term/pie-chart/1284359/) By Adrien Coquet for Protectionism * [Coins](https://thenounproject.com/term/coins/1915881/) By icon 54 for Mercantilism -* [Sextant](https://thenounproject.com/term/sextant/313438 ) By lastspark for Sextant +* [Sextant](https://thenounproject.com/term/sextant/313438) By lastspark for Naval Tradition * [Merchant Navy Icon](https://www.pngkit.com/view/u2w7i1i1o0t4a9y3_png-file-merchant-navy-icon/) for Merchant Navy ### Rationalism @@ -352,7 +352,12 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Newspaper](https://thenounproject.com/term/newspaper/1207487/) By Trishul for Populism * [Riot Police](https://thenounproject.com/term/riot-police/43117/) By Dan Hetteix for Police State - +### Order +* Adapted from [Plan](https://thenounproject.com/term/plan/2973572) by Cattaleeya Thongsriphong for Planned Economy +* [Flag](https://thenounproject.com/term/flag/2712405) by Muhammad Tajudin for Nationalism +* [Communism](https://thenounproject.com/term/communism/142765) By Valerio Poltrini for Socialism +* [Hammer and Sickle](https://thenounproject.com/term/hammer-and-sickle/1367670) by Dmitry Baranovskiy for Communism +* [United](https://thenounproject.com/term/united/3433531) by Izwar Muis for United Front ## Technologies