diff --git a/android/Images/OtherIcons/Search.png b/android/Images/OtherIcons/Search.png new file mode 100644 index 0000000000..3c08f58ff7 Binary files /dev/null and b/android/Images/OtherIcons/Search.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 4b1ccdbc69..c56735c1d6 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -6,518 +6,504 @@ filter: MipMapLinearLinear, MipMapLinearLinear repeat: none EmojiIcons/Culture rotate: false - xy: 1158, 1288 + xy: 1498, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Faith rotate: false - xy: 760, 492 + xy: 760, 376 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Food rotate: false - xy: 760, 318 + xy: 1788, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Gold rotate: false - xy: 760, 28 + xy: 1918, 1562 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Happiness rotate: false - xy: 1216, 1230 + xy: 818, 1130 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Production rotate: false - xy: 1918, 1546 + xy: 1904, 1330 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Science rotate: false - xy: 876, 1172 + xy: 1100, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Turn rotate: false - xy: 876, 882 + xy: 1100, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 ImprovementIcons/Academy rotate: false - xy: 4, 1226 + xy: 756, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Ancient ruins rotate: false - xy: 4, 1010 + xy: 972, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Barbarian encampment rotate: false - xy: 4, 578 + xy: 1404, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Camp rotate: false - xy: 4, 470 + xy: 1512, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Citadel rotate: false - xy: 4, 254 + xy: 1728, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/City center rotate: false - xy: 1836, 1944 + xy: 1944, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/City ruins rotate: false - xy: 1944, 1944 + xy: 4, 110 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Customs house rotate: false - xy: 112, 146 + xy: 1944, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Farm rotate: false - xy: 1836, 1836 + xy: 112, 110 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Fishing Boats rotate: false - xy: 289, 1700 + xy: 220, 980 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Fort rotate: false - xy: 406, 1484 + xy: 220, 440 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Holy site rotate: false - xy: 220, 1002 + xy: 1434, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Landmark rotate: false - xy: 328, 836 + xy: 289, 1700 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Lumber mill rotate: false - xy: 436, 836 + xy: 396, 1592 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Manufactory rotate: false - xy: 436, 728 + xy: 298, 1376 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Mine rotate: false - xy: 436, 296 + xy: 328, 728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Moai rotate: false - xy: 328, 80 + xy: 328, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Oil well rotate: false - xy: 544, 570 + xy: 436, 944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Pasture rotate: false - xy: 544, 246 + xy: 436, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Plantation rotate: false - xy: 652, 786 + xy: 504, 1592 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Polder rotate: false - xy: 652, 678 + xy: 514, 1484 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Quarry rotate: false - xy: 652, 30 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Railroad - rotate: false - xy: 976, 1728 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/Railroad - rotate: false - xy: 976, 1728 + xy: 544, 836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Road rotate: false - xy: 1624, 1728 + xy: 622, 1398 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Terrace farm rotate: false - xy: 1702, 1620 + xy: 1486, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Trading post rotate: false - xy: 1378, 1404 + xy: 1702, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/America rotate: false - xy: 864, 1944 + xy: 4, 1082 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Arabia rotate: false - xy: 972, 1944 + xy: 4, 974 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Austria rotate: false - xy: 1080, 1944 + xy: 4, 866 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Aztecs rotate: false - xy: 4, 794 + xy: 1188, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Babylon rotate: false - xy: 1188, 1944 + xy: 4, 758 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/China rotate: false - xy: 4, 362 + xy: 1620, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/CityState rotate: false - xy: 112, 1226 + xy: 864, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Denmark rotate: false - xy: 756, 1836 + xy: 112, 1190 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Egypt rotate: false - xy: 1296, 1836 + xy: 112, 650 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/England rotate: false - xy: 1404, 1836 + xy: 112, 542 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/France rotate: false - xy: 406, 1376 + xy: 220, 224 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Germany rotate: false - xy: 514, 1376 + xy: 678, 1722 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Greece rotate: false - xy: 622, 1434 + xy: 1002, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Inca rotate: false - xy: 220, 570 + xy: 1866, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/India rotate: false - xy: 220, 354 + xy: 786, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Iroquois rotate: false - xy: 220, 138 + xy: 1002, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Japan rotate: false - xy: 328, 1160 + xy: 1326, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Korea rotate: false - xy: 328, 944 + xy: 1758, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Mongolia rotate: false - xy: 436, 80 + xy: 328, 404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Persia rotate: false - xy: 652, 1002 + xy: 436, 188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Polynesia rotate: false - xy: 652, 570 + xy: 514, 1376 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Rome rotate: false - xy: 1732, 1728 + xy: 652, 1290 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Russia rotate: false - xy: 1840, 1728 + xy: 652, 1182 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Siam rotate: false - xy: 946, 1512 + xy: 652, 210 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Songhai rotate: false - xy: 1054, 1404 + xy: 838, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Spain rotate: false - xy: 1162, 1512 + xy: 946, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Sweden rotate: false - xy: 1486, 1512 + xy: 1270, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Huns rotate: false - xy: 1702, 1512 + xy: 1486, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Netherlands rotate: false - xy: 1810, 1620 + xy: 1594, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Ottomans rotate: false - xy: 1810, 1512 + xy: 1594, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Aircraft rotate: false - xy: 190, 1335 + xy: 976, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/ArrowLeft rotate: false - xy: 868, 1230 + xy: 1974, 1701 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/ArrowRight rotate: false - xy: 926, 1288 + xy: 760, 1014 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Movement rotate: false - xy: 926, 1288 + xy: 760, 1014 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/BackArrow rotate: false - xy: 984, 1346 + xy: 1092, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/Banner rotate: false - xy: 1296, 1944 + xy: 4, 650 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Border-inner rotate: false - xy: 259, 1389 + xy: 1436, 951 size: 31, 15 orig: 31, 15 offset: 0, 0 index: -1 OtherIcons/Border-outer rotate: false - xy: 1972, 1052 + xy: 1036, 587 size: 31, 15 orig: 31, 15 offset: 0, 0 index: -1 OtherIcons/Camera rotate: false - xy: 916, 4 + xy: 156, 1301 size: 25, 25 orig: 25, 25 offset: 0, 0 @@ -531,63 +517,63 @@ OtherIcons/Circle index: -1 OtherIcons/Cities rotate: false - xy: 1728, 1944 + xy: 4, 218 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Close rotate: false - xy: 112, 1118 + xy: 972, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Crosshair rotate: false - xy: 112, 470 + xy: 1620, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Cultured rotate: false - xy: 112, 254 + xy: 1836, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Diplomacy rotate: false - xy: 864, 1836 + xy: 112, 1082 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/DiplomacyW rotate: false - xy: 972, 1836 + xy: 112, 974 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/DisbandUnit rotate: false - xy: 1080, 1836 + xy: 112, 866 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Down rotate: false - xy: 1158, 1230 + xy: 1556, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/Fire rotate: false - xy: 1944, 1836 + xy: 220, 1196 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -615,175 +601,182 @@ TileSets/FantasyHex/Hexagon index: -1 OtherIcons/Link rotate: false - xy: 818, 1130 + xy: 818, 666 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/Load rotate: false - xy: 436, 944 + xy: 397, 1700 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Lock rotate: false - xy: 328, 728 + xy: 288, 1592 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/MapEditor rotate: false - xy: 328, 512 + xy: 406, 1484 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Maritime rotate: false - xy: 328, 404 + xy: 328, 1268 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/MenuIcon rotate: false - xy: 328, 296 + xy: 328, 1052 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Mercantile rotate: false - xy: 436, 404 + xy: 328, 944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Militaristic rotate: false - xy: 328, 188 + xy: 328, 836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Mods rotate: false - xy: 436, 188 + xy: 328, 512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Multiplayer rotate: false - xy: 544, 1110 + xy: 328, 188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/New rotate: false - xy: 544, 894 + xy: 436, 1268 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Options rotate: false - xy: 544, 462 + xy: 436, 836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Pencil rotate: false - xy: 652, 1218 + xy: 436, 404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Pentagon rotate: false - xy: 652, 1110 + xy: 436, 296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Pillage rotate: false - xy: 652, 894 + xy: 436, 80 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Present rotate: false - xy: 652, 246 + xy: 544, 1160 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Puppet rotate: false - xy: 544, 30 + xy: 544, 944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Quest rotate: false - xy: 760, 1728 + xy: 544, 728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Quickstart rotate: false - xy: 868, 1728 + xy: 544, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Remove Heresy rotate: false - xy: 1300, 1728 + xy: 544, 188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Resume rotate: false - xy: 1516, 1728 + xy: 622, 1506 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Search + rotate: false + xy: 652, 858 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/SecretOptions rotate: false - xy: 838, 1620 + xy: 652, 750 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Settings rotate: false - xy: 730, 1404 + xy: 652, 642 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Shield rotate: false - xy: 946, 1620 + xy: 652, 426 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Sleep rotate: false - xy: 1162, 1620 + xy: 838, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -797,21 +790,21 @@ OtherIcons/Speaker index: -1 OtherIcons/Star rotate: false - xy: 1270, 1518 + xy: 4, 8 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 OtherIcons/Stop rotate: false - xy: 1270, 1410 + xy: 1162, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Swap rotate: false - xy: 1486, 1620 + xy: 1270, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -825,870 +818,982 @@ OtherIcons/Triangle index: -1 OtherIcons/Up rotate: false - xy: 1050, 1056 + xy: 1274, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/whiteDot rotate: false - xy: 220, 1326 + xy: 2043, 1827 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 PolicyIcons/Aesthetics rotate: false - xy: 1948, 1778 + xy: 720, 1664 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Aristocracy rotate: false - xy: 926, 1346 + xy: 760, 1072 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Citizenship rotate: false - xy: 1042, 1288 + xy: 1266, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Civil Society rotate: false - xy: 1100, 1346 + xy: 760, 782 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Collective Rule rotate: false - xy: 1042, 1230 + xy: 760, 724 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Communism rotate: false - xy: 1100, 1288 + xy: 1382, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Constitution rotate: false - xy: 1158, 1346 + xy: 760, 666 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Cultural Diplomacy rotate: false - xy: 1100, 1230 + xy: 760, 608 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Democracy rotate: false - xy: 760, 782 + xy: 760, 550 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Educated Elite rotate: false - xy: 760, 666 + xy: 1614, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Fascism rotate: false - xy: 760, 434 + xy: 1730, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Religion rotate: false - xy: 760, 202 + xy: 1846, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Speech rotate: false - xy: 760, 144 + xy: 760, 202 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Thought rotate: false - xy: 760, 86 + xy: 760, 144 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Humanism rotate: false - xy: 1274, 1294 + xy: 818, 1014 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Landed Elite rotate: false - xy: 444, 22 + xy: 818, 782 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Legalism rotate: false - xy: 1948, 1720 + xy: 818, 724 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mandate Of Heaven rotate: false - xy: 818, 1014 + xy: 818, 550 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mercantilism rotate: false - xy: 818, 840 + xy: 818, 376 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Merchant Navy rotate: false - xy: 818, 782 + xy: 818, 318 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Meritocracy rotate: false - xy: 818, 724 + xy: 818, 260 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Militarism rotate: false - xy: 818, 666 + xy: 818, 202 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Caste rotate: false - xy: 818, 608 + xy: 818, 144 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Tradition rotate: false - xy: 818, 550 + xy: 926, 1238 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Monarchy rotate: false - xy: 818, 434 + xy: 818, 86 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Nationalism rotate: false - xy: 818, 318 + xy: 396, 22 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Naval Tradition rotate: false - xy: 818, 260 + xy: 454, 22 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Oligarchy rotate: false - xy: 818, 202 + xy: 512, 22 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Organized Religion rotate: false - xy: 818, 144 + xy: 570, 22 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Philantropy rotate: false - xy: 818, 86 + xy: 1976, 1585 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Planned Economy rotate: false - xy: 818, 28 + xy: 1976, 1527 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Police State rotate: false - xy: 1918, 1662 + xy: 1976, 1469 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Populism rotate: false - xy: 1918, 1604 + xy: 1976, 1411 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Professional Army rotate: false - xy: 1918, 1488 + xy: 628, 22 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Protectionism rotate: false - xy: 1918, 1430 + xy: 686, 44 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Reformation rotate: false - xy: 1976, 1546 + xy: 1976, 1353 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Representation rotate: false - xy: 1976, 1430 + xy: 1962, 1295 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Republic rotate: false - xy: 1918, 1372 + xy: 984, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scholasticism rotate: false - xy: 1976, 1372 + xy: 1042, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scientific Revolution rotate: false - xy: 876, 1114 + xy: 1158, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Secularism rotate: false - xy: 876, 1056 + xy: 1274, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Socialism rotate: false - xy: 876, 998 + xy: 1448, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Sovereignty rotate: false - xy: 992, 1114 + xy: 1564, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Theocracy rotate: false - xy: 992, 1056 + xy: 1796, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Total War rotate: false - xy: 1050, 1114 + xy: 984, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Trade Unions rotate: false - xy: 1108, 1172 + xy: 1042, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/United Front rotate: false - xy: 934, 940 + xy: 1158, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Universal Suffrage rotate: false - xy: 992, 998 + xy: 1216, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Warrior Code rotate: false - xy: 1166, 1172 + xy: 1390, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 ReligionIcons/Buddhism rotate: false - xy: 1404, 1944 + xy: 4, 542 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Christianity rotate: false - xy: 1620, 1944 + xy: 4, 326 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Confucianism rotate: false - xy: 112, 902 + xy: 1188, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Enhancer rotate: false - xy: 1512, 1836 + xy: 112, 434 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Follower rotate: false - xy: 288, 1592 + xy: 220, 764 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Founder rotate: false - xy: 298, 1376 + xy: 220, 332 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Hinduism rotate: false - xy: 220, 1110 + xy: 1326, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Islam rotate: false - xy: 220, 30 + xy: 1110, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Judaism rotate: false - xy: 328, 1052 + xy: 1542, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Pantheon rotate: false - xy: 544, 354 + xy: 436, 728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Religion rotate: false - xy: 1084, 1728 + xy: 544, 404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Religious rotate: false - xy: 1084, 1728 + xy: 544, 404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Shinto rotate: false - xy: 838, 1404 + xy: 652, 318 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Sikhism rotate: false - xy: 1054, 1620 + xy: 652, 102 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Taoism rotate: false - xy: 1594, 1620 + xy: 1378, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Tengriism rotate: false - xy: 1594, 1512 + xy: 1378, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ReligionIcons/Zoroastrianism rotate: false - xy: 760, 1188 + xy: 868, 1296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Aluminum rotate: false - xy: 4, 1118 + xy: 864, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Bananas rotate: false - xy: 4, 686 + xy: 1296, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Cattle rotate: false - xy: 1512, 1944 + xy: 4, 434 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Citrus rotate: false - xy: 4, 146 + xy: 1836, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Coal rotate: false - xy: 112, 1010 + xy: 1080, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Copper rotate: false - xy: 112, 794 + xy: 1296, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Cotton rotate: false - xy: 112, 686 + xy: 1404, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Crab rotate: false - xy: 112, 578 + xy: 1512, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Deer rotate: false - xy: 112, 38 + xy: 190, 1304 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Dyes rotate: false - xy: 1188, 1836 + xy: 112, 758 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Fish rotate: false - xy: 570, 1758 + xy: 220, 1088 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Furs rotate: false - xy: 504, 1592 + xy: 220, 116 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gems rotate: false - xy: 514, 1484 + xy: 570, 1722 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gold Ore rotate: false - xy: 622, 1542 + xy: 894, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Horses rotate: false - xy: 220, 894 + xy: 1542, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Incense rotate: false - xy: 220, 462 + xy: 220, 8 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Iron rotate: false - xy: 220, 246 + xy: 894, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Ivory rotate: false - xy: 328, 1268 + xy: 1218, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Jewelry rotate: false - xy: 436, 1268 + xy: 1434, 1620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Marble rotate: false - xy: 436, 620 + xy: 406, 1376 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Oil rotate: false - xy: 544, 678 + xy: 436, 1052 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Pearls rotate: false - xy: 544, 138 + xy: 436, 512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Porcelain rotate: false - xy: 652, 354 + xy: 544, 1268 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Salt rotate: false - xy: 730, 1620 + xy: 652, 1074 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sheep rotate: false - xy: 838, 1512 + xy: 652, 534 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silk rotate: false - xy: 946, 1404 + xy: 730, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silver rotate: false - xy: 1054, 1512 + xy: 730, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Spices rotate: false - xy: 1162, 1404 + xy: 1054, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Stone rotate: false - xy: 1378, 1620 + xy: 1054, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sugar rotate: false - xy: 1378, 1512 + xy: 1162, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Truffles rotate: false - xy: 1486, 1404 + xy: 1702, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Uranium rotate: false - xy: 1594, 1404 + xy: 1810, 1512 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Whales rotate: false - xy: 1702, 1404 + xy: 1810, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wheat rotate: false - xy: 1810, 1404 + xy: 760, 1296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wine rotate: false - xy: 760, 1296 + xy: 760, 1188 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Acquire rotate: false - xy: 756, 1944 + xy: 4, 1190 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/CityConnection rotate: false - xy: 4, 38 + xy: 190, 1412 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Culture rotate: false - xy: 112, 362 + xy: 1728, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Faith rotate: false - xy: 1620, 1836 + xy: 112, 326 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Food rotate: false - xy: 396, 1592 + xy: 220, 656 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Gold rotate: false - xy: 612, 1650 + xy: 786, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Happiness rotate: false - xy: 622, 1326 + xy: 1110, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/InterceptRange rotate: false - xy: 328, 22 + xy: 818, 898 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Malcontent rotate: false - xy: 328, 620 + xy: 298, 1484 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Population rotate: false - xy: 652, 462 + xy: 612, 1614 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Production rotate: false - xy: 652, 138 + xy: 544, 1052 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Range rotate: false - xy: 1976, 1662 + xy: 744, 28 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/RangedStrength rotate: false - xy: 1976, 1604 + xy: 802, 28 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/ReligiousStrength rotate: false - xy: 1192, 1728 + xy: 544, 296 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Resistance rotate: false - xy: 1408, 1728 + xy: 544, 80 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Science rotate: false - xy: 730, 1512 + xy: 652, 966 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Specialist rotate: false - xy: 1270, 1620 + xy: 946, 1404 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Strength rotate: false - xy: 1050, 1172 + xy: 1622, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 TileSets/Default/AtollOverlay rotate: false - xy: 4, 902 + xy: 1080, 1944 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/CityOverlay rotate: false - xy: 190, 1412 + xy: 756, 1836 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -TileSets/Default/CrosshatchHexagon +TileSets/Default/FalloutOverlay rotate: false - xy: 289, 1808 - size: 273, 236 - orig: 273, 236 + xy: 112, 218 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/Flood plainsOverlay + rotate: false + xy: 220, 872 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/ForestOverlay + rotate: false + xy: 220, 548 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/HillOverlay + rotate: false + xy: 1218, 1728 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/IceOverlay + rotate: false + xy: 1650, 1728 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/JungleOverlay + rotate: false + xy: 1650, 1620 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/LakesOverlay + rotate: false + xy: 1866, 1620 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/MarshOverlay + rotate: false + xy: 328, 1160 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/MountainOverlay + rotate: false + xy: 328, 296 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/NaturalWonderOverlay + rotate: false + xy: 328, 80 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/OasisOverlay + rotate: false + xy: 436, 1160 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/Railroad + rotate: false + xy: 544, 512 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Railroad + rotate: false + xy: 544, 512 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +TileSets/Default/Road + rotate: false + xy: 1974, 1817 + size: 61, 11 + orig: 61, 11 + offset: 0, 0 + index: -1 +TileSets/Default/Tiles/River-Bottom + rotate: false + xy: 1476, 1154 + size: 32, 28 + orig: 32, 28 + offset: 0, 0 + index: -1 +TileSets/Default/Tiles/River-BottomLeft + rotate: false + xy: 1236, 923 + size: 32, 28 + orig: 32, 28 + offset: 0, 0 + index: -1 +TileSets/Default/Tiles/River-BottomRight + rotate: false + xy: 1276, 941 + size: 32, 28 + orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/CrosshatchHexagon @@ -1698,2197 +1803,2113 @@ TileSets/FantasyHex/CrosshatchHexagon orig: 273, 236 offset: 0, 0 index: -1 -TileSets/Default/FalloutOverlay +TileSets/Default/CrosshatchHexagon rotate: false - xy: 1728, 1836 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/Flood plainsOverlay - rotate: false - xy: 397, 1700 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/ForestOverlay - rotate: false - xy: 298, 1484 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/HillOverlay - rotate: false - xy: 220, 1218 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/IceOverlay - rotate: false - xy: 220, 786 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/JungleOverlay - rotate: false - xy: 436, 1160 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/LakesOverlay - rotate: false - xy: 436, 1052 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/MarshOverlay - rotate: false - xy: 436, 512 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/MountainOverlay - rotate: false - xy: 544, 1218 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/NaturalWonderOverlay - rotate: false - xy: 544, 1002 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/OasisOverlay - rotate: false - xy: 544, 786 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -TileSets/Default/Road - rotate: false - xy: 190, 1393 - size: 61, 11 - orig: 61, 11 - offset: 0, 0 - index: -1 -TileSets/Default/Tiles/River-Bottom - rotate: false - xy: 1932, 1112 - size: 32, 28 - orig: 32, 28 - offset: 0, 0 - index: -1 -TileSets/Default/Tiles/River-BottomLeft - rotate: false - xy: 2012, 1112 - size: 32, 28 - orig: 32, 28 - offset: 0, 0 - index: -1 -TileSets/Default/Tiles/River-BottomRight - rotate: false - xy: 996, 742 - size: 32, 28 - orig: 32, 28 + xy: 289, 1808 + size: 273, 236 + orig: 273, 236 offset: 0, 0 index: -1 TileSets/FantasyHex/Railroad rotate: false - xy: 678, 1826 + xy: 328, 40 size: 60, 32 orig: 60, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Road rotate: false - xy: 544, 1336 + xy: 112, 70 size: 60, 32 orig: 60, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Academy rotate: false - xy: 505, 1706 + xy: 180, 66 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Academy-Snow rotate: false - xy: 1332, 1367 + xy: 505, 1707 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Aluminum rotate: false - xy: 502, 44 + xy: 328, 4 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins rotate: false - xy: 2006, 1800 + xy: 1854, 1310 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Jungle rotate: false - xy: 502, 4 + xy: 686, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Sand rotate: false - xy: 1050, 1020 + xy: 1564, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins-Snow rotate: false - xy: 1108, 1078 + xy: 908, 1202 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ancient ruins2 rotate: false - xy: 992, 962 + xy: 868, 1202 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Atoll rotate: false - xy: 992, 926 + xy: 170, 30 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bananas rotate: false - xy: 2006, 1728 + xy: 876, 1166 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment rotate: false - xy: 992, 890 + xy: 876, 1130 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barbarian encampment-Snow rotate: false - xy: 876, 715 + xy: 876, 1093 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Barringer Crater rotate: false - xy: 1332, 1259 + xy: 876, 1057 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bison rotate: false - xy: 876, 499 + xy: 876, 841 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Bison+Camp rotate: false - xy: 876, 463 + xy: 876, 805 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cattle rotate: false - xy: 876, 24 + xy: 876, 366 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cattle+Pasture rotate: false - xy: 1372, 1364 + xy: 876, 326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cerro de Potosi rotate: false - xy: 1412, 1368 + xy: 876, 254 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citadel rotate: false - xy: 1452, 1361 + xy: 876, 139 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citadel-Snow rotate: false - xy: 1412, 1294 + xy: 876, 101 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citrus rotate: false - xy: 1452, 1325 + xy: 916, 1166 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Citrus+Plantation rotate: false - xy: 1492, 1368 + xy: 916, 1130 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center rotate: false - xy: 1492, 1325 + xy: 916, 1087 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Ancient era rotate: false - xy: 1532, 1364 + xy: 916, 1047 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Atomic era rotate: false - xy: 1572, 1362 + xy: 916, 1005 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Classical era rotate: false - xy: 1532, 1324 + xy: 916, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Future era rotate: false - xy: 1612, 1362 + xy: 916, 923 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Industrial era rotate: false - xy: 1652, 1363 + xy: 916, 882 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Information era rotate: false - xy: 1692, 1360 + xy: 916, 838 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Medieval era rotate: false - xy: 1732, 1364 + xy: 916, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Modern era rotate: false - xy: 1772, 1362 + xy: 916, 756 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City center-Renaissance era rotate: false - xy: 1812, 1364 + xy: 916, 716 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/City ruins rotate: false - xy: 1572, 1326 + xy: 916, 680 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coal rotate: false - xy: 1612, 1326 + xy: 916, 608 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Coast rotate: false - xy: 1652, 1327 + xy: 916, 572 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cocoa rotate: false - xy: 1372, 1256 + xy: 916, 536 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cocoa+Plantation rotate: false - xy: 1412, 1258 + xy: 916, 500 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Copper rotate: false - xy: 1612, 1290 + xy: 916, 318 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Cotton rotate: false - xy: 1692, 1324 + xy: 916, 246 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Crab rotate: false - xy: 1732, 1328 + xy: 916, 210 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Customs house rotate: false - xy: 1812, 1321 + xy: 916, 97 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer rotate: false - xy: 1852, 1332 + xy: 918, 61 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Deer+Camp rotate: false - xy: 1692, 1288 + xy: 918, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert rotate: false - xy: 1732, 1292 + xy: 1564, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Farm rotate: false - xy: 1772, 1290 + xy: 1604, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Desert+Flood plains+Farm rotate: false - xy: 1812, 1285 + xy: 1644, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes rotate: false - xy: 1492, 1252 + xy: 1764, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Dyes+Plantation rotate: false - xy: 1532, 1252 + xy: 1804, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/El Dorado rotate: false - xy: 1572, 1253 + xy: 1844, 1237 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fallout rotate: false - xy: 1612, 1247 + xy: 1844, 1194 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fish rotate: false - xy: 1652, 1255 + xy: 1894, 1258 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fishing Boats rotate: false - xy: 1692, 1252 + xy: 1884, 1222 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Flood plains rotate: false - xy: 1732, 1256 + xy: 1884, 1186 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Forest rotate: false - xy: 1812, 1245 + xy: 1974, 1255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fort rotate: false - xy: 1852, 1255 + xy: 1924, 1217 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Fountain of Youth rotate: false - xy: 1332, 1219 + xy: 1924, 1177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs rotate: false - xy: 1412, 1222 + xy: 1964, 1183 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Furs+Camp rotate: false - xy: 1452, 1216 + xy: 2004, 1219 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gems rotate: false - xy: 1612, 1211 + xy: 956, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Gold Ore rotate: false - xy: 1692, 1216 + xy: 956, 1083 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grand Mesa rotate: false - xy: 1732, 1216 + xy: 956, 1043 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland rotate: false - xy: 1772, 1218 + xy: 956, 1007 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Farm rotate: false - xy: 1812, 1209 + xy: 956, 971 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Camp rotate: false - xy: 1852, 1216 + xy: 956, 932 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Deer+Camp rotate: false - xy: 1050, 981 + xy: 956, 893 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Furs+Camp rotate: false - xy: 1108, 1039 + xy: 956, 854 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Lumber mill rotate: false - xy: 1166, 1097 + xy: 956, 815 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Forest+Truffles+Camp rotate: false - xy: 1224, 1155 + xy: 956, 776 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Farm rotate: false - xy: 934, 810 + xy: 956, 740 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Camp rotate: false - xy: 1032, 945 + xy: 956, 704 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Lumber mill rotate: false - xy: 1032, 909 + xy: 956, 668 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Hill+Forest+Trading post rotate: false - xy: 1032, 873 + xy: 956, 632 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Grassland+Jungle+Trading post rotate: false - xy: 992, 850 + xy: 956, 592 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/GrasslandForest rotate: false - xy: 1032, 834 + xy: 956, 553 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Great Barrier Reef rotate: false - xy: 1148, 1061 + xy: 956, 442 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Hill rotate: false - xy: 916, 482 + xy: 996, 1154 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillForest+Lumber mill rotate: false - xy: 916, 446 + xy: 1036, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMarbleQuarry rotate: false - xy: 916, 410 + xy: 1036, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillMine rotate: false - xy: 916, 374 + xy: 996, 1118 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/HillStoneQuarry rotate: false - xy: 916, 338 + xy: 1076, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Holy site rotate: false - xy: 916, 294 + xy: 996, 1074 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses rotate: false - xy: 916, 150 + xy: 996, 1038 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Horses+Pasture rotate: false - xy: 916, 110 + xy: 1036, 1082 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ice rotate: false - xy: 974, 814 + xy: 1156, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense rotate: false - xy: 1072, 856 + xy: 1076, 1085 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Incense+Plantation rotate: false - xy: 1072, 820 + xy: 1156, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Iron rotate: false - xy: 1188, 1044 + xy: 996, 966 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory rotate: false - xy: 1112, 917 + xy: 1076, 1049 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ivory+Camp rotate: false - xy: 1112, 881 + xy: 1196, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Jungle rotate: false - xy: 1170, 968 + xy: 1236, 1190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Krakatoa rotate: false - xy: 1152, 819 + xy: 1116, 1048 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Lakes rotate: false - xy: 1246, 1119 + xy: 1196, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Landmark rotate: false - xy: 1228, 1000 + xy: 996, 886 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Manufactory rotate: false - xy: 956, 691 + xy: 1236, 1107 size: 32, 39 orig: 32, 39 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marble rotate: false - xy: 956, 619 + xy: 1316, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Marsh rotate: false - xy: 956, 546 + xy: 1036, 898 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mine rotate: false - xy: 956, 402 + xy: 1196, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Moai rotate: false - xy: 956, 257 + xy: 1276, 1085 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mount Fuji rotate: false - xy: 956, 111 + xy: 1076, 903 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mount Kailash rotate: false - xy: 956, 71 + xy: 1116, 936 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mount Sinai rotate: false - xy: 956, 31 + xy: 1156, 974 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Mountain rotate: false - xy: 1250, 956 + xy: 1196, 1006 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oasis rotate: false - xy: 1272, 812 + xy: 1316, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ocean rotate: false - xy: 1772, 1182 + xy: 1036, 826 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Offshore Platform rotate: false - xy: 1812, 1173 + xy: 1076, 867 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil rotate: false - xy: 1852, 1180 + xy: 1116, 900 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Oil well rotate: false - xy: 1268, 1047 + xy: 1156, 938 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Old Faithful rotate: false - xy: 1268, 1007 + xy: 1196, 966 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pasture rotate: false - xy: 1932, 1332 + xy: 996, 738 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Pearls rotate: false - xy: 1932, 1296 + xy: 1436, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains rotate: false - xy: 1932, 1260 + xy: 1036, 790 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Farm rotate: false - xy: 1972, 1300 + xy: 1076, 831 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Camp rotate: false - xy: 2012, 1296 + xy: 1116, 860 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest+Lumber mill rotate: false - xy: 1972, 1260 + xy: 1156, 898 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Jungle+Trading post rotate: false - xy: 2012, 1256 + xy: 1196, 926 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsForest rotate: false - xy: 1892, 1188 + xy: 1476, 1190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/PlainsJungle rotate: false - xy: 1932, 1220 + xy: 1236, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation rotate: false - xy: 1972, 1224 + xy: 996, 702 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Bananas rotate: false - xy: 2012, 1220 + xy: 1276, 977 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plantation+Cotton rotate: false - xy: 1932, 1184 + xy: 1436, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Polder rotate: false - xy: 1972, 1187 + xy: 1316, 1013 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry rotate: false - xy: 1852, 1144 + xy: 1036, 754 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Marble rotate: false - xy: 1932, 1148 + xy: 1076, 795 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Quarry+Stone rotate: false - xy: 1972, 1151 + xy: 1116, 824 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-Bottom rotate: false - xy: 1972, 1115 + xy: 1516, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomLeft rotate: false - xy: 996, 778 + xy: 1516, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomRight rotate: false - xy: 996, 706 + xy: 996, 666 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Rock of Gibraltar rotate: false - xy: 996, 666 + xy: 1316, 973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Salt rotate: false - xy: 996, 594 + xy: 1396, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep rotate: false - xy: 996, 413 + xy: 1156, 826 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sheep+Pasture rotate: false - xy: 996, 373 + xy: 1196, 850 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk rotate: false - xy: 996, 264 + xy: 1236, 887 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silk+Plantation rotate: false - xy: 996, 228 + xy: 996, 630 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Silver rotate: false - xy: 996, 192 + xy: 1276, 905 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow rotate: false - xy: 996, 82 + xy: 1396, 1014 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Snow+Farm rotate: false - xy: 996, 46 + xy: 1436, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices rotate: false - xy: 1152, 783 + xy: 1076, 723 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Spices+Plantation rotate: false - xy: 1192, 784 + xy: 1116, 751 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sri Pada rotate: false - xy: 1232, 772 + xy: 1156, 786 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Stone rotate: false - xy: 1272, 776 + xy: 1196, 814 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar rotate: false - xy: 1192, 748 + xy: 1516, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Sugar+Plantation rotate: false - xy: 1232, 736 + xy: 1236, 851 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Terrace farm rotate: false - xy: 1452, 1180 + xy: 1356, 942 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Trading post rotate: false - xy: 1532, 1180 + xy: 1436, 1014 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Truffles rotate: false - xy: 1652, 1180 + xy: 1116, 715 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Truffles+Camp rotate: false - xy: 1692, 1180 + xy: 1156, 750 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra rotate: false - xy: 1732, 1180 + xy: 1196, 778 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Farm rotate: false - xy: 1772, 1146 + xy: 1476, 1047 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp rotate: false - xy: 1812, 1133 + xy: 1236, 811 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp+Furs rotate: false - xy: 1852, 1104 + xy: 996, 554 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Deer+Camp rotate: false - xy: 1892, 1076 + xy: 1276, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Lumber mill rotate: false - xy: 1932, 1072 + xy: 1316, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Truffles+Camp rotate: false - xy: 1972, 1075 + xy: 1356, 902 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/TundraForest rotate: false - xy: 2012, 1072 + xy: 1396, 938 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Uluru rotate: false - xy: 1452, 1140 + xy: 1436, 974 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Uranium rotate: false - xy: 1492, 1144 + xy: 1036, 610 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales rotate: false - xy: 1652, 1144 + xy: 1476, 1011 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Whales+Fishing Boats rotate: false - xy: 1692, 1144 + xy: 1236, 775 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wheat rotate: false - xy: 1732, 1144 + xy: 996, 518 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine rotate: false - xy: 1772, 1110 + xy: 1276, 793 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Wine+Plantation rotate: false - xy: 1812, 1097 + xy: 1316, 823 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/TopBorder rotate: false - xy: 1492, 1180 + xy: 1396, 978 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/African Forest Elephant rotate: false - xy: 720, 1731 + xy: 720, 1627 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Anti-Aircraft Gun rotate: false - xy: 1166, 1136 + xy: 1604, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Anti-Tank Gun rotate: false - xy: 1224, 1194 + xy: 1644, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Archaeologist rotate: false - xy: 876, 788 + xy: 1684, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Archer rotate: false - xy: 934, 846 + xy: 1724, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Artillery rotate: false - xy: 1332, 1331 + xy: 1764, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Atlatlist rotate: false - xy: 2006, 1764 + xy: 1804, 1252 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Axe Thrower rotate: false - xy: 876, 752 + xy: 1854, 1274 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ballista rotate: false - xy: 1332, 1295 + xy: 1894, 1294 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battering Ram rotate: false - xy: 876, 679 + xy: 876, 1021 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Battleship rotate: false - xy: 876, 643 + xy: 876, 985 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bazooka rotate: false - xy: 876, 607 + xy: 876, 949 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berber Cavalry rotate: false - xy: 876, 571 + xy: 876, 913 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Berserker rotate: false - xy: 876, 535 + xy: 876, 877 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Bowman rotate: false - xy: 876, 427 + xy: 876, 769 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Brute rotate: false - xy: 876, 391 + xy: 876, 733 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Camel Archer rotate: false - xy: 876, 354 + xy: 876, 696 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cannon rotate: false - xy: 876, 318 + xy: 876, 660 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Caravan rotate: false - xy: 876, 276 + xy: 876, 618 size: 32, 34 orig: 32, 34 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Caravel rotate: false - xy: 876, 240 + xy: 876, 582 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cargo Ship rotate: false - xy: 876, 204 + xy: 876, 546 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carolean rotate: false - xy: 876, 168 + xy: 876, 510 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Carrier rotate: false - xy: 876, 132 + xy: 876, 474 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cataphract rotate: false - xy: 876, 96 + xy: 876, 438 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Catapult rotate: false - xy: 876, 60 + xy: 876, 402 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cavalry rotate: false - xy: 1372, 1328 + xy: 876, 290 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Chariot Archer rotate: false - xy: 1372, 1292 + xy: 876, 218 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Chu-Ko-Nu rotate: false - xy: 1412, 1332 + xy: 876, 182 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/CivilianLandUnit rotate: false - xy: 1852, 1368 + xy: 916, 644 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Comanche Rider rotate: false - xy: 1452, 1288 + xy: 916, 463 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Companion Cavalry rotate: false - xy: 1492, 1288 + xy: 916, 426 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Composite Bowman rotate: false - xy: 1532, 1288 + xy: 916, 390 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Conquistador rotate: false - xy: 1572, 1290 + xy: 916, 354 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cossack rotate: false - xy: 1652, 1291 + xy: 916, 282 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Crossbowman rotate: false - xy: 1772, 1326 + xy: 916, 174 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Cruiser rotate: false - xy: 4, 4 + xy: 916, 140 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Destroyer rotate: false - xy: 1852, 1296 + xy: 1684, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Dromon rotate: false - xy: 1452, 1252 + xy: 1724, 1216 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Foreign Legion rotate: false - xy: 1772, 1254 + xy: 1934, 1259 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Frigate rotate: false - xy: 1372, 1220 + xy: 1964, 1219 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galleass rotate: false - xy: 1492, 1216 + xy: 2004, 1183 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Galley rotate: false - xy: 1532, 1216 + xy: 1964, 1147 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Gatling Gun rotate: false - xy: 1572, 1217 + xy: 2004, 1147 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Giant Death Robot rotate: false - xy: 1652, 1216 + xy: 956, 1119 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Admiral rotate: false - xy: 1090, 1000 + xy: 956, 514 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Artist rotate: false - xy: 1090, 964 + xy: 956, 478 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Engineer rotate: false - xy: 1148, 1025 + xy: 956, 406 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Galleass rotate: false - xy: 1206, 1119 + xy: 956, 370 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great General rotate: false - xy: 1206, 1080 + xy: 956, 331 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Merchant rotate: false - xy: 916, 774 + xy: 956, 295 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Musician rotate: false - xy: 916, 738 + xy: 956, 259 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Prophet rotate: false - xy: 916, 702 + xy: 956, 223 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Scientist rotate: false - xy: 916, 666 + xy: 956, 187 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great War Infantry rotate: false - xy: 916, 630 + xy: 956, 151 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Great Writer rotate: false - xy: 916, 594 + xy: 956, 115 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hakkapeliitta rotate: false - xy: 916, 558 + xy: 956, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Helicopter Gunship rotate: false - xy: 916, 522 + xy: 996, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hoplite rotate: false - xy: 916, 258 + xy: 1076, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horse Archer rotate: false - xy: 916, 222 + xy: 1036, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Horseman rotate: false - xy: 916, 186 + xy: 1116, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hussar rotate: false - xy: 916, 73 + xy: 1076, 1121 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Hwach'a rotate: false - xy: 916, 37 + xy: 1116, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Immortal rotate: false - xy: 1072, 928 + xy: 996, 1002 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Impi rotate: false - xy: 1072, 892 + xy: 1036, 1046 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Infantry rotate: false - xy: 1130, 989 + xy: 1116, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Inquisitor rotate: false - xy: 1130, 953 + xy: 1196, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ironclad rotate: false - xy: 1188, 1008 + xy: 1036, 1010 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Jaguar rotate: false - xy: 1112, 845 + xy: 1116, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Janissary rotate: false - xy: 1112, 809 + xy: 1156, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Keshik rotate: false - xy: 1170, 932 + xy: 996, 930 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Khan rotate: false - xy: 1152, 893 + xy: 1036, 971 size: 32, 31 orig: 32, 31 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Knight rotate: false - xy: 1152, 857 + xy: 1076, 1013 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Kris Swordsman rotate: false - xy: 545, 1714 + xy: 1156, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Lancer rotate: false - xy: 1246, 1083 + xy: 1276, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/LandUnit rotate: false - xy: 1228, 1044 + xy: 1236, 1154 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landship rotate: false - xy: 1210, 964 + xy: 1276, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Landsknecht rotate: false - xy: 1210, 928 + xy: 1036, 935 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Legion rotate: false - xy: 1192, 892 + xy: 1076, 977 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longbowman rotate: false - xy: 1192, 856 + xy: 1116, 1012 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Longswordsman rotate: false - xy: 1192, 820 + xy: 1156, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Machine Gun rotate: false - xy: 956, 774 + xy: 1196, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mandekalu Cavalry rotate: false - xy: 956, 738 + xy: 1316, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Maori Warrior rotate: false - xy: 956, 655 + xy: 996, 850 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Marine rotate: false - xy: 956, 583 + xy: 1276, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mechanized Infantry rotate: false - xy: 956, 510 + xy: 1076, 941 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mehal Sefari rotate: false - xy: 956, 474 + xy: 1116, 976 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Merchant Of Venice rotate: false - xy: 956, 438 + xy: 1156, 1014 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Minuteman rotate: false - xy: 956, 366 + xy: 1356, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Missile Cruiser rotate: false - xy: 956, 330 + xy: 1236, 1071 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Missionary rotate: false - xy: 956, 294 + xy: 996, 814 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mobile SAM rotate: false - xy: 956, 221 + xy: 1356, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Modern Armor rotate: false - xy: 956, 185 + xy: 1316, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Mohawk Warrior rotate: false - xy: 956, 149 + xy: 1036, 862 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketeer rotate: false - xy: 1250, 920 + xy: 1396, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketman rotate: false - xy: 1232, 884 + xy: 1236, 1035 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Naresuan's Elephant rotate: false - xy: 1232, 848 + xy: 996, 778 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Nau rotate: false - xy: 1232, 812 + xy: 1276, 1049 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Norwegian Ski Infantry rotate: false - xy: 1272, 884 + xy: 1396, 1158 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Nuclear Submarine rotate: false - xy: 1272, 848 + xy: 1356, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Panzer rotate: false - xy: 1892, 1336 + xy: 1436, 1194 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Paratrooper rotate: false - xy: 1892, 1300 + xy: 1236, 999 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pathfinder rotate: false - xy: 1892, 1264 + xy: 1276, 1013 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Persian Immortal rotate: false - xy: 1972, 1336 + xy: 1396, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pictish Warrior rotate: false - xy: 2012, 1336 + xy: 1316, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pikeman rotate: false - xy: 1892, 1228 + xy: 1356, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Pracinha rotate: false - xy: 2012, 1184 + xy: 1356, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Privateer rotate: false - xy: 1892, 1152 + xy: 1396, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Quinquereme rotate: false - xy: 2012, 1148 + xy: 1156, 862 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rifleman rotate: false - xy: 1892, 1116 + xy: 1196, 890 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rocket Artillery rotate: false - xy: 996, 630 + xy: 1356, 1014 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Samurai rotate: false - xy: 996, 558 + xy: 1436, 1086 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Scout rotate: false - xy: 996, 522 + xy: 1036, 718 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sea Beggar rotate: false - xy: 996, 486 + xy: 1076, 759 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Settler rotate: false - xy: 996, 449 + xy: 1116, 787 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ship Of The Line rotate: false - xy: 996, 336 + xy: 1476, 1117 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Ship of the Line rotate: false - xy: 996, 336 + xy: 1476, 1117 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Siege Tower rotate: false - xy: 996, 300 + xy: 1516, 1122 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Sipahi rotate: false - xy: 996, 154 + xy: 1316, 935 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Slinger rotate: false - xy: 996, 118 + xy: 1356, 978 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Spearman rotate: false - xy: 996, 10 + xy: 1036, 682 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Submarine rotate: false - xy: 44, 4 + xy: 1476, 1083 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Swordsman rotate: false - xy: 1272, 740 + xy: 996, 594 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tank rotate: false - xy: 1412, 1186 + xy: 1276, 869 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tercio rotate: false - xy: 1372, 1184 + xy: 1316, 899 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trebuchet rotate: false - xy: 1572, 1181 + xy: 1036, 646 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trireme rotate: false - xy: 1612, 1175 + xy: 1076, 687 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Turtle Ship rotate: false - xy: 1412, 1150 + xy: 1516, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Chariot rotate: false - xy: 1532, 1144 + xy: 1076, 651 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Elephant rotate: false - xy: 1572, 1145 + xy: 1116, 679 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Warrior rotate: false - xy: 1612, 1139 + xy: 1156, 714 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/WaterUnit rotate: false - xy: 84, 4 + xy: 1196, 744 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Winged Hussar rotate: false - xy: 1852, 1068 + xy: 1356, 866 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Work Boats rotate: false - xy: 1892, 1040 + xy: 1396, 902 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Worker rotate: false - xy: 1932, 1036 + xy: 1516, 1014 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 +TileSets/FantasyHex/bak/Railroad + rotate: false + xy: 4, 1298 + size: 144, 28 + orig: 144, 28 + offset: 0, 0 + index: -1 +TileSets/FantasyHex/bak/road + rotate: false + xy: 570, 1830 + size: 144, 28 + orig: 144, 28 + offset: 0, 0 + index: -1 UnitPromotionIcons/Accuracy rotate: false xy: 505, 1750 @@ -3898,154 +3919,154 @@ UnitPromotionIcons/Accuracy index: -1 UnitPromotionIcons/Air Repair rotate: false - xy: 868, 1346 + xy: 760, 1130 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Air Targeting rotate: false - xy: 760, 1130 + xy: 868, 1238 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting rotate: false - xy: 760, 1130 + xy: 868, 1238 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Ambush rotate: false - xy: 678, 1768 + xy: 1974, 1759 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Anti-Armor rotate: false - xy: 678, 1768 + xy: 1974, 1759 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Amphibious rotate: false - xy: 868, 1288 + xy: 112, 12 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Armor Plating rotate: false - xy: 760, 1072 + xy: 1034, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Barrage rotate: false - xy: 760, 1014 + xy: 1974, 1643 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Besiege rotate: false - xy: 926, 1230 + xy: 760, 956 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Siege rotate: false - xy: 926, 1230 + xy: 760, 956 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Blitz rotate: false - xy: 984, 1288 + xy: 1150, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Boarding Party rotate: false - xy: 1042, 1346 + xy: 760, 898 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Bombardment rotate: false - xy: 760, 956 + xy: 1208, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Charge rotate: false - xy: 984, 1230 + xy: 760, 840 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal Raider rotate: false - xy: 760, 898 + xy: 1324, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Cover rotate: false - xy: 760, 840 + xy: 1440, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Discipline rotate: false - xy: 760, 840 + xy: 1440, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Drill rotate: false - xy: 760, 724 + xy: 760, 492 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Evasion rotate: false - xy: 760, 608 + xy: 760, 434 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Extended Range rotate: false - xy: 760, 550 + xy: 1672, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Operational Range rotate: false - xy: 760, 550 + xy: 1672, 1346 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Flight Deck rotate: false - xy: 760, 376 + xy: 760, 318 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -4059,161 +4080,161 @@ UnitPromotionIcons/Formation index: -1 UnitPromotionIcons/Great Generals rotate: false - xy: 1216, 1346 + xy: 1918, 1504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Quick Study rotate: false - xy: 1216, 1346 + xy: 1918, 1504 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Haka War Dance rotate: false - xy: 1216, 1288 + xy: 1918, 1446 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Heal Instantly rotate: false - xy: 1274, 1352 + xy: 818, 1072 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Ignore terrain cost rotate: false - xy: 220, 678 + xy: 1758, 1728 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect Fire rotate: false - xy: 1274, 1236 + xy: 818, 956 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Interception rotate: false - xy: 386, 22 + xy: 818, 840 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics rotate: false - xy: 818, 1072 + xy: 818, 608 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/March rotate: false - xy: 818, 956 + xy: 818, 492 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Medic rotate: false - xy: 818, 898 + xy: 818, 434 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility rotate: false - xy: 818, 492 + xy: 760, 86 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Morale rotate: false - xy: 818, 376 + xy: 1918, 1388 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Rejuvenation rotate: false - xy: 1976, 1488 + xy: 860, 28 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting rotate: false - xy: 934, 1172 + xy: 1216, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sentry rotate: false - xy: 934, 1172 + xy: 1216, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Shock rotate: false - xy: 934, 1114 + xy: 1332, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Slinger Withdraw rotate: false - xy: 992, 1172 + xy: 1390, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Sortie rotate: false - xy: 934, 1056 + xy: 1506, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Supply rotate: false - xy: 876, 940 + xy: 1680, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Survivalism rotate: false - xy: 934, 998 + xy: 1738, 1288 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Volley rotate: false - xy: 1108, 1114 + xy: 1332, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack rotate: false - xy: 876, 824 + xy: 1448, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitPromotionIcons/Woodsman rotate: false - xy: 934, 882 + xy: 1506, 1230 size: 50, 50 orig: 50, 50 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index d9d35c5753..6f0446f337 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 43ac28a20d..5c22746a89 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -1210,6 +1210,17 @@ No description provided = Author: [author] = Size: [size] kB = The mod you selected is incompatible with the defined ruleset! = +Sort and Filter = +Filter: = +Enter search text = +Sort Current: = +Sort Downloadable: = +Name ↑ = +Name ↓ = +Date ↑ = +Date ↓ = +Stars ↓ = +Status ↓ = # Uniques that are relevant to more than one type of game object diff --git a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt index 4df6176f44..a192bacefd 100644 --- a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt +++ b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt @@ -264,6 +264,13 @@ class TranslatedSelectBox(values : Collection, default:String, skin: Ski class TranslatedString(val value: String) { val translation = value.tr() override fun toString() = translation + // Equality contract needs to be implemented else TranslatedSelectBox.setSelected won't work properly + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + return value == (other as TranslatedString).value + } + override fun hashCode() = value.hashCode() } init { diff --git a/core/src/com/unciv/ui/pickerscreens/ModManagementOptions.kt b/core/src/com/unciv/ui/pickerscreens/ModManagementOptions.kt new file mode 100644 index 0000000000..104e929357 --- /dev/null +++ b/core/src/com/unciv/ui/pickerscreens/ModManagementOptions.kt @@ -0,0 +1,234 @@ +package com.unciv.ui.pickerscreens + +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.scenes.scene2d.Touchable +import com.badlogic.gdx.scenes.scene2d.ui.* +import com.badlogic.gdx.utils.Align +import com.unciv.models.ruleset.Ruleset +import com.unciv.models.translations.tr +import com.unciv.ui.newgamescreen.TranslatedSelectBox +import com.unciv.ui.utils.* +import com.unciv.ui.utils.UncivTooltip.Companion.addTooltip +import com.unciv.ui.worldscreen.mainmenu.Github +import kotlin.math.sign + +/** + * Helper class for Mod Manager - filtering and sorting. + * + * This isn't a UI Widget, but offers one: [expander] can be used to offer filtering and sorting options. + * It holds the variables [sortInstalled] and [sortOnline] for the [modManagementScreen] and knows + * how to sort collections of [ModUIData] by providing comparators. + */ +class ModManagementOptions(private val modManagementScreen: ModManagementScreen) { + companion object { + val sortByName = Comparator { mod1, mod2: ModUIData -> mod1.name.compareTo(mod2.name, true) } + val sortByNameDesc = Comparator { mod1, mod2: ModUIData -> mod2.name.compareTo(mod1.name, true) } + // lastUpdated is compared as string, but that should be OK as it's ISO format + val sortByDate = Comparator { mod1, mod2: ModUIData -> mod1.lastUpdated().compareTo(mod2.lastUpdated()) } + val sortByDateDesc = Comparator { mod1, mod2: ModUIData -> mod2.lastUpdated().compareTo(mod1.lastUpdated()) } + // comparators for stars or status + val sortByStars = Comparator { mod1, mod2: ModUIData -> + 10 * (mod2.stargazers() - mod1.stargazers()) + mod1.name.compareTo(mod2.name, true).sign + } + val sortByStatus = Comparator { mod1, mod2: ModUIData -> + 10 * (mod2.state.sortWeight() - mod1.state.sortWeight()) + mod1.name.compareTo(mod2.name, true).sign + } + + const val installedHeaderText = "Current mods" + const val onlineHeaderText = "Downloadable mods" + } + + enum class SortType( + val label: String, + val symbols: String, + val comparator: Comparator + ) { + Name("Name ↑", "↑", sortByName), + NameDesc("Name ↓", "↓", sortByNameDesc), + Date("Date ↑", "⌚↑", sortByDate), + DateDesc("Date ↓", "⌚↓", sortByDateDesc), + Stars("Stars ↓", "✯↓", sortByStars), + Status("Status ↓", "◉↓", sortByStatus); + + fun next() = values()[(ordinal + 1) % values().size] + + companion object { + fun fromSelectBox(selectBox: TranslatedSelectBox): SortType { + val selected = selectBox.selected.value + return values().firstOrNull { it.label == selected } ?: Name + } + } + } + + private val textField = TextField("", CameraStageBaseScreen.skin) + fun getFilterText(): String = textField.text + val filterAction: ()->Unit + + var sortInstalled = SortType.Name + var sortOnline = SortType.Stars + + private val sortInstalledSelect: TranslatedSelectBox + private val sortOnlineSelect: TranslatedSelectBox + + var expanderChangeEvent: (()->Unit)? = null + val expander: ExpanderTab + + init { + textField.messageText = "Enter search text" + + val searchIcon = ImageGetter.getImage("OtherIcons/Search") + .surroundWithCircle(50f, color = Color.CLEAR) + + sortInstalledSelect = TranslatedSelectBox( + SortType.values().filter { sort -> sort != SortType.Stars }.map { sort -> sort.label }, + sortInstalled.label, + CameraStageBaseScreen.skin + ) + sortInstalledSelect.onChange { + sortInstalled = SortType.fromSelectBox(sortInstalledSelect) + modManagementScreen.refreshInstalledModTable() + } + + sortOnlineSelect = TranslatedSelectBox( + SortType.values().map { sort -> sort.label }, + sortOnline.label, + CameraStageBaseScreen.skin + ) + sortOnlineSelect.onChange { + sortOnline = SortType.fromSelectBox(sortOnlineSelect) + modManagementScreen.refreshOnlineModTable() + } + + expander = ExpanderTab( + "Sort and Filter", + fontSize = 18, + startsOutOpened = false, + defaultPad = 2.5f, + headerPad = 5f, + expanderWidth = 360f, + onChange = { expanderChangeEvent?.invoke() } + ) { + it.background = ImageGetter.getBackground(Color(0x203050ff)) + it.pad(7.5f) + it.add(Table().apply { + add("Filter:".toLabel()).left() + add(textField).pad(0f, 5f, 0f, 5f).growX() + add(searchIcon).right() + }).colspan(2).growX().padBottom(7.5f).row() + it.add("Sort Current:".toLabel()).left() + it.add(sortInstalledSelect).right().padBottom(7.5f).row() + it.add("Sort Downloadable:".toLabel()).left() + it.add(sortOnlineSelect).right().row() + } + + searchIcon.touchable = Touchable.enabled + filterAction = { + if (expander.isOpen) { + modManagementScreen.refreshInstalledModTable() + modManagementScreen.refreshOnlineModTable() + } else { + modManagementScreen.stage.keyboardFocus = textField + } + expander.toggle() + } + searchIcon.onClick(filterAction) + searchIcon.addTooltip(KeyCharAndCode.RETURN, 18f) + } + + fun getInstalledHeader() = installedHeaderText.tr() + " " + sortInstalled.symbols + fun getOnlineHeader() = onlineHeaderText.tr() + " " + sortOnline.symbols + + fun installedHeaderClicked() { + do { + sortInstalled = sortInstalled.next() + } while (sortInstalled == SortType.Stars) + sortInstalledSelect.selected = TranslatedSelectBox.TranslatedString(sortInstalled.label) + modManagementScreen.refreshInstalledModTable() + } + + fun onlineHeaderClicked() { + sortOnline = sortOnline.next() + sortOnlineSelect.selected = TranslatedSelectBox.TranslatedString(sortOnline.label) + modManagementScreen.refreshOnlineModTable() + } +} + +/** Helper class holds combined mod info for ModManagementScreen, used for both installed and online lists */ +class ModUIData( + val name: String, + val description: String, + val ruleset: Ruleset?, + val repo: Github.Repo?, + var y: Float, + var height: Float, + var button: Button +) { + var state = ModStateImages() // visible only on the 'installed' side - todo? + + constructor(ruleset: Ruleset): this ( + ruleset.name, + ruleset.getSummary().let { + "Installed".tr() + (if (it.isEmpty()) "" else ": $it") + }, + ruleset, null, 0f, 0f, ruleset.name.toTextButton() + ) + + constructor(repo: Github.Repo, isUpdated: Boolean): this ( + repo.name, + (repo.description ?: "-{No description provided}-".tr()) + + "\n" + "[${repo.stargazers_count}]✯".tr(), + null, repo, 0f, 0f, + (repo.name + (if (isUpdated) " - {Updated}" else "" )).toTextButton() + ) { + state.isUpdated = isUpdated + } + + fun lastUpdated() = ruleset?.modOptions?.lastUpdated ?: repo?.updated_at ?: "" + fun stargazers() = repo?.stargazers_count ?: 0 + fun author() = ruleset?.modOptions?.author ?: repo?.owner?.login ?: "" + fun matchesFilter(filterText: String): Boolean = when { + filterText.isEmpty() -> true + name.contains(filterText, true) -> true + // description.contains(filterText, true) -> true // too many surprises as description is different in the two columns + author().contains(filterText, true) -> true + else -> false + } +} + +/** Helper class keeps references to decoration images of installed mods to enable dynamic visibility + * (actually we do not use isVisible but refill a container selectively which allows the aggregate height to adapt and the set to center vertically) + * @param visualImage image indicating _enabled as permanent visual mod_ + * @param updatedImage image indicating _online mod has been updated_ + */ +class ModStateImages ( + isVisual: Boolean = false, + isUpdated: Boolean = false, + val visualImage: Image = ImageGetter.getImage("UnitPromotionIcons/Scouting"), + val updatedImage: Image = ImageGetter.getImage("OtherIcons/Mods") +) { + /** The table containing the indicators (one per mod, narrow, arranges up to three indicators vertically) */ + val container: Table = Table().apply { defaults().size(20f).align(Align.topLeft) } + // mad but it's really initializing with the primary constructor parameter and not calling update() + var isVisual: Boolean = isVisual + set(value) { if (field!=value) { field = value; update() } } + var isUpdated: Boolean = isUpdated + set(value) { if (field!=value) { field = value; update() } } + private val spacer = Table().apply { width = 20f; height = 0f } + + fun update() { + container.run { + clear() + if (isVisual) add(visualImage).row() + if (isUpdated) add(updatedImage).row() + if (!isVisual && !isUpdated) add(spacer) + pack() + } + } + + fun sortWeight() = when { + isUpdated && isVisual -> 3 + isUpdated -> 2 + isVisual -> 1 + else -> 0 + } +} diff --git a/core/src/com/unciv/ui/pickerscreens/ModManagementScreen.kt b/core/src/com/unciv/ui/pickerscreens/ModManagementScreen.kt index 2311043d30..157827e625 100644 --- a/core/src/com/unciv/ui/pickerscreens/ModManagementScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/ModManagementScreen.kt @@ -15,25 +15,32 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache import com.unciv.models.translations.tr import com.unciv.ui.utils.* +import com.unciv.ui.pickerscreens.ModManagementOptions.SortType import com.unciv.ui.utils.UncivDateFormat.formatDate import com.unciv.ui.utils.UncivDateFormat.parseDate import com.unciv.ui.worldscreen.mainmenu.Github import java.util.* +import kotlin.collections.HashMap import kotlin.concurrent.thread import kotlin.math.max /** * The Mod Management Screen - called only from [MainMenuScreen] + * @param previousOnlineMods - cached online mod list, if supplied and not empty, it will be displayed as is and no online query will be run. Used for resize. */ // All picker screens auto-wrap the top table in a ScrollPane. // Since we want the different parts to scroll separately, we disable the default ScrollPane, which would scroll everything at once. -class ModManagementScreen: PickerScreen(disableScroll = true) { +class ModManagementScreen( + previousInstalledMods: HashMap? = null, + previousOnlineMods: HashMap? = null +): PickerScreen(disableScroll = true) { private val modTable = Table().apply { defaults().pad(10f) } private val scrollInstalledMods = AutoScrollPane(modTable) private val downloadTable = Table().apply { defaults().pad(10f) } private val scrollOnlineMods = AutoScrollPane(downloadTable) private val modActionTable = Table().apply { defaults().pad(10f) } + private val optionsManager = ModManagementOptions(this) val amountPerPage = 30 @@ -46,24 +53,18 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { private val deprecationCell: Cell private val modDescriptionLabel: WrappableLabel + private var installedHeaderLabel: Label? = null + private var onlineHeaderLabel: Label? = null + private var installedExpanderTab: ExpanderTab? = null + private var onlineExpanderTab: ExpanderTab? = null + // keep running count of mods fetched from online search for comparison to total count as reported by GitHub private var downloadModCount = 0 - // Description data from installed mods and online search - private val modDescriptionsInstalled: HashMap = hashMapOf() - private val modDescriptionsOnline: HashMap = hashMapOf() - private fun showModDescription(modName: String) { - val online = modDescriptionsOnline[modName] ?: "" - val installed = modDescriptionsInstalled[modName] ?: "" - val separator = if (online.isEmpty() || installed.isEmpty()) "" else "\n" - deprecationCell.setActor(if (modName in modsToHideNames) deprecationLabel else null) - modDescriptionLabel.setText(online + separator + installed) - } + // Enable re-sorting and syncing entries in 'installed' and 'repo search' ScrollPanes + private val installedModInfo = previousInstalledMods ?: HashMap(10) // HashMap inferred + private val onlineModInfo = previousOnlineMods ?: HashMap(90) // HashMap inferred - // Enable syncing entries in 'installed' and 'repo search ScrollPanes - private class ScrollToEntry(val y: Float, val height: Float, val button: Button) - private val installedScrollIndex = HashMap(30) - private val onlineScrollIndex = HashMap(30) private var onlineScrollCurrentY = -1f // cleanup - background processing needs to be stopped on exit and memory freed @@ -76,37 +77,6 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { super.dispose() } - /** Helper class keeps references to decoration images of installed mods to enable dynamic visibility - * (actually we do not use isVisible but refill a container selectively which allows the aggregate height to adapt and the set to center vertically) - * @param container the table containing the indicators (one per mod, narrow, arranges up to three indicators vertically) - * @param visualImage image indicating _enabled as permanent visual mod_ - * @param updatedImage image indicating _online mod has been updated_ - */ - private class ModStateImages ( - val container: Table, - isVisual: Boolean = false, - isUpdated: Boolean = false, - val visualImage: Image = ImageGetter.getImage("UnitPromotionIcons/Scouting"), - val updatedImage: Image = ImageGetter.getImage("OtherIcons/Mods") - ) { - // mad but it's really initializing with the primary constructor parameter and not calling update() - var isVisual: Boolean = isVisual - set(value) { if(field!=value) { field = value; update() } } - var isUpdated: Boolean = isUpdated - set(value) { if(field!=value) { field = value; update() } } - private val spacer = Table().apply { width = 20f; height = 0f } - fun update() { - container.run { - clear() - if (isVisual) add(visualImage).row() - if (isUpdated) add(updatedImage).row() - if (!isVisual && !isUpdated) add(spacer) - pack() - } - } - } - private val modStateImages = HashMap(30) - init { //setDefaultCloseAction(screen) // this would initialize the new MainMenuScreen immediately @@ -122,7 +92,7 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { onBackButtonClicked(closeAction) val labelWidth = max(stage.width / 2f - 60f,60f) - deprecationLabel = WrappableLabel("Deprecated until update conforms to current requirements", labelWidth, Color.FIREBRICK) + deprecationLabel = WrappableLabel(deprecationText, labelWidth, Color.FIREBRICK) deprecationLabel.wrap = true modDescriptionLabel = WrappableLabel("", labelWidth) modDescriptionLabel.wrap = true @@ -143,19 +113,28 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { if (isNarrowerThan4to3()) initPortrait() else initLandscape() - reloadOnlineMods() + keyPressDispatcher[KeyCharAndCode.RETURN] = optionsManager.filterAction + + if (onlineModInfo.isEmpty()) + reloadOnlineMods() + else + refreshOnlineModTable() } private fun initPortrait() { topTable.defaults().top().pad(0f) - topTable.add(ExpanderTab("Current mods", expanderWidth = stage.width) { - it.add(scrollInstalledMods).growX() - }).top().growX().row() + topTable.add(optionsManager.expander).top().growX().row() - topTable.add(ExpanderTab("Downloadable mods", expanderWidth = stage.width) { + installedExpanderTab = ExpanderTab(optionsManager.getInstalledHeader(), expanderWidth = stage.width) { + it.add(scrollInstalledMods).growX() + } + topTable.add(installedExpanderTab).top().growX().row() + + onlineExpanderTab = ExpanderTab(optionsManager.getOnlineHeader(), expanderWidth = stage.width) { it.add(scrollOnlineMods).growX() - }).top().padTop(10f).growX().row() + } + topTable.add(onlineExpanderTab).top().padTop(10f).growX().row() topTable.add().expandY().row() // helps with top() being ignored @@ -167,9 +146,17 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { private fun initLandscape() { // Header row topTable.add().expandX() // empty cols left and right for separator - topTable.add("Current mods".toLabel()).pad(5f).minWidth(200f).padLeft(25f) + installedHeaderLabel = optionsManager.getInstalledHeader().toLabel() + installedHeaderLabel!!.onClick { + optionsManager.installedHeaderClicked() + } + topTable.add(installedHeaderLabel).pad(5f).minWidth(200f).padLeft(25f) // 30 = 5 default pad + 20 to compensate for 'permanent visual mod' decoration icon - topTable.add("Downloadable mods".toLabel()).pad(5f) + onlineHeaderLabel = optionsManager.getOnlineHeader().toLabel() + onlineHeaderLabel!!.onClick { + optionsManager.onlineHeaderClicked() + } + topTable.add(onlineHeaderLabel).pad(5f) topTable.add("".toLabel()).minWidth(200f) // placeholder for "Mod actions" topTable.add().expandX() topTable.row() @@ -180,16 +167,23 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { // main row containing the three 'blocks' installed, online and information topTable.add() // skip empty first column topTable.add(scrollInstalledMods) - topTable.add(scrollOnlineMods) - topTable.add(modActionTable) + topTable.add().row() + topTable.add().expandY() // So short lists won't vertically center everything including headers + + stage.addActor(optionsManager.expander) + optionsManager.expanderChangeEvent = { + optionsManager.expander.pack() + optionsManager.expander.setPosition(stage.width - 2f, stage.height - 2f, Align.topRight) + } + optionsManager.expanderChangeEvent?.invoke() } private fun reloadOnlineMods() { onlineScrollCurrentY = -1f downloadTable.clear() - onlineScrollIndex.clear() + onlineModInfo.clear() downloadTable.add(getDownloadFromUrlButton()).padBottom(15f).row() downloadTable.add("...".toLabel()).row() tryDownloadPage(1) @@ -213,11 +207,11 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { } Gdx.app.postRunnable { - // clear and hide last cell if it is the "..." indicator + // clear and remove last cell if it is the "..." indicator val lastCell = downloadTable.cells.lastOrNull() if (lastCell != null && lastCell.actor is Label && (lastCell.actor as Label).text.toString() == "...") { lastCell.setActor(null) - lastCell.pad(0f) + downloadTable.cells.removeValue(lastCell, true) } for (repo in repoSearch.items) { @@ -227,18 +221,16 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { // Mods we have manually decided to remove for instability are removed here // If at some later point these mods are updated, we should definitely remove // this piece of code. This is a band-aid, not a full solution. - if (repo.html_url in modsToHideAsUrl) continue + if (repo.html_url in modsToHideAsUrl) continue - modDescriptionsOnline[repo.name] = - (repo.description ?: "-{No description provided}-".tr()) + - "\n" + "[${repo.stargazers_count}]✯".tr() - - var downloadButtonText = repo.name val existingMod = RulesetCache.values.firstOrNull { it.name == repo.name } + val isUpdated = existingMod?.modOptions?.let { + it.lastUpdated != "" && it.lastUpdated != repo.updated_at + } == true + if (existingMod != null) { - if (existingMod.modOptions.lastUpdated != "" && existingMod.modOptions.lastUpdated != repo.updated_at) { - downloadButtonText += " - {Updated}" - modStateImages[repo.name]?.isUpdated = true + if (isUpdated) { + installedModInfo[repo.name]?.state?.isUpdated = true } if (existingMod.modOptions.author.isEmpty()) { rewriteModOptions(repo, Gdx.files.local("mods").child(repo.name)) @@ -246,13 +238,16 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { existingMod.modOptions.modSize = repo.size } } - val downloadButton = downloadButtonText.toTextButton() - downloadButton.onClick { onlineButtonAction(repo, downloadButton) } - val cell = downloadTable.add(downloadButton) + val mod = ModUIData(repo, isUpdated) + onlineModInfo[repo.name] = mod + mod.button.onClick { onlineButtonAction(repo, mod.button) } + + val cell = downloadTable.add(mod.button) downloadTable.row() if (onlineScrollCurrentY < 0f) onlineScrollCurrentY = cell.padTop - onlineScrollIndex[repo.name] = ScrollToEntry(onlineScrollCurrentY, cell.prefHeight, downloadButton) + mod.y = onlineScrollCurrentY + mod.height = cell.prefHeight onlineScrollCurrentY += cell.padBottom + cell.prefHeight + cell.padTop downloadModCount++ } @@ -273,7 +268,7 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { } duplicates.forEach { it.setActor(null) - it.pad(0f) // the cell itself cannot be removed so stop it occupying height + downloadTable.cells.removeValue(it, true) } downloadModCount -= duplicates.size // Check: It is also not impossible we missed a mod - just inform user @@ -303,12 +298,12 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { } private fun syncOnlineSelected(name: String, button: Button) { - syncSelected(name, button, installedScrollIndex, scrollInstalledMods) + syncSelected(name, button, installedModInfo, scrollInstalledMods) } private fun syncInstalledSelected(name: String, button: Button) { - syncSelected(name, button, onlineScrollIndex, scrollOnlineMods) + syncSelected(name, button, onlineModInfo, scrollOnlineMods) } - private fun syncSelected(name: String, button: Button, index: HashMap, scroll: ScrollPane) { + private fun syncSelected(name: String, button: Button, index: HashMap, scroll: ScrollPane) { // manage selection color for user selection lastSelectedButton?.color = Color.WHITE button.color = Color.BLUE @@ -391,7 +386,7 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { showModDescription(repo.name) removeRightSideClickListeners() rightSideButton.enable() - val label = if (modStateImages[repo.name]?.isUpdated == true) + val label = if (installedModInfo[repo.name]?.state?.isUpdated == true) "Update [${repo.name}]" else "Download [${repo.name}]" rightSideButton.setText(label.tr()) @@ -418,6 +413,9 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { Gdx.app.postRunnable { ToastPopup("[${repo.name}] Downloaded!", this) RulesetCache.loadRulesets() + RulesetCache[repo.name]?.let { + installedModInfo[repo.name] = ModUIData(it) + } refreshInstalledModTable() showModDescription(repo.name) unMarkUpdatedMod(repo.name) @@ -453,9 +451,14 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { * (called under postRunnable posted by background thread) */ private fun unMarkUpdatedMod(name: String) { - modStateImages[name]?.isUpdated = false - val button = (onlineScrollIndex[name]?.button as? TextButton) ?: return - button.setText(name) + installedModInfo[name]?.state?.isUpdated = false + onlineModInfo[name]?.state?.isUpdated = false + val button = (onlineModInfo[name]?.button as? TextButton) + button?.setText(name) + if (optionsManager.sortInstalled == SortType.Status) + refreshInstalledModTable() + if (optionsManager.sortOnline == SortType.Status) + refreshOnlineModTable() } /** Rebuild the right-hand column for clicks on installed mods @@ -469,7 +472,7 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { // offer 'permanent visual mod' toggle val visualMods = game.settings.visualMods val isVisual = visualMods.contains(mod.name) - modStateImages[mod.name]?.isVisual = isVisual + installedModInfo[mod.name]?.state?.isVisual = isVisual val visualCheckBox = "Permanent audiovisual mod".toCheckBox(isVisual) { checked -> @@ -480,79 +483,121 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { game.settings.save() ImageGetter.setNewRuleset(ImageGetter.ruleset) refreshModActions(mod) + if (optionsManager.sortInstalled == SortType.Status) + refreshInstalledModTable() } modActionTable.add(visualCheckBox).row() } /** Rebuild the left-hand column containing all installed mods */ - private fun refreshInstalledModTable() { - modTable.clear() - installedScrollIndex.clear() - - var currentY = -1f - val currentMods = RulesetCache.values.asSequence().filter { it.name != "" }.sortedBy { it.name } - for (mod in currentMods) { - val summary = mod.getSummary() - modDescriptionsInstalled[mod.name] = "Installed".tr() + - (if (summary.isEmpty()) "" else ": $summary") - - var imageMgr = modStateImages[mod.name] - val decorationTable = - if (imageMgr != null) imageMgr.container - else { - val table = Table().apply { defaults().size(20f).align(Align.topLeft) } - imageMgr = ModStateImages(table, isVisual = mod.name in game.settings.visualMods) - modStateImages[mod.name] = imageMgr - table - } - imageMgr.update() // rebuilds decorationTable content - - val button = mod.name.toTextButton() - button.onClick { - syncInstalledSelected(mod.name, button) - refreshModActions(mod) - rightSideButton.setText("Delete [${mod.name}]".tr()) - rightSideButton.isEnabled = true - showModDescription(mod.name) - removeRightSideClickListeners() - rightSideButton.onClick { - rightSideButton.isEnabled = false - YesNoPopup( - question = "Are you SURE you want to delete this mod?", - action = { - deleteMod(mod) - rightSideButton.setText("[${mod.name}] was deleted.".tr()) - }, - screen = this, - restoreDefault = { rightSideButton.isEnabled = true } - ).open() + internal fun refreshInstalledModTable() { + // pre-init if not already done - important: keep the ModUIData instances later on or + // at least the button references otherwise sync will not work + if (installedModInfo.isEmpty()) { + for (mod in RulesetCache.values.asSequence().filter { it.name != "" }) { + ModUIData(mod).run { + state.isVisual = mod.name in game.settings.visualMods + installedModInfo[mod.name] = this } } + } + val newHeaderText = optionsManager.getInstalledHeader() + installedHeaderLabel?.setText(newHeaderText) + installedExpanderTab?.setText(newHeaderText) + + modTable.clear() + var currentY = -1f + val filter = optionsManager.getFilterText() + for (mod in installedModInfo.values.sortedWith(optionsManager.sortInstalled.comparator)) { + if (!mod.matchesFilter(filter)) continue + // Prevent building up listeners. The virgin Button has one: for mouseover styling. + // The captures for our listener shouldn't need updating, so assign only once + if (mod.button.listeners.none { it.javaClass.`package`.name.startsWith("com.unciv") }) + mod.button.onClick { installedButtonAction(mod) } val decoratedButton = Table() - decoratedButton.add(button) - decoratedButton.add(decorationTable).align(Align.center+Align.left) + decoratedButton.add(mod.button) + decoratedButton.add(mod.state.container).align(Align.center+Align.left) val cell = modTable.add(decoratedButton) modTable.row() if (currentY < 0f) currentY = cell.padTop - installedScrollIndex[mod.name] = ScrollToEntry(currentY, cell.prefHeight, button) + mod.y = currentY + mod.height = cell.prefHeight currentY += cell.padBottom + cell.prefHeight + cell.padTop } } + private fun installedButtonAction(mod: ModUIData) { + syncInstalledSelected(mod.name, mod.button) + refreshModActions(mod.ruleset!!) + rightSideButton.setText("Delete [${mod.name}]".tr()) + rightSideButton.isEnabled = true + showModDescription(mod.name) + removeRightSideClickListeners() + rightSideButton.onClick { + rightSideButton.isEnabled = false + YesNoPopup( + question = "Are you SURE you want to delete this mod?", + action = { + deleteMod(mod.name) + rightSideButton.setText("[${mod.name}] was deleted.".tr()) + }, + screen = this, + restoreDefault = { rightSideButton.isEnabled = true } + ).open() + } + } + /** Delete a Mod, refresh ruleset cache and update installed mod table */ - private fun deleteMod(mod: Ruleset) { - val modFileHandle = Gdx.files.local("mods").child(mod.name) + private fun deleteMod(modName: String) { + val modFileHandle = Gdx.files.local("mods").child(modName) if (modFileHandle.isDirectory) modFileHandle.deleteDirectory() else modFileHandle.delete() // This should never happen RulesetCache.loadRulesets() - modStateImages.remove(mod.name) + installedModInfo.remove(modName) refreshInstalledModTable() } + internal fun refreshOnlineModTable() { + if (runningSearchThread != null) return // cowardice: prevent concurrent modification, avoid a manager layer + + val newHeaderText = optionsManager.getOnlineHeader() + onlineHeaderLabel?.setText(newHeaderText) + onlineExpanderTab?.setText(newHeaderText) + + downloadTable.clear() + onlineScrollCurrentY = -1f + + val filter = optionsManager.getFilterText() + // Important: sortedMods holds references to the original values, so the referenced buttons stay valid. + // We update y and height here, we do not replace the ModUIData instances do the referenced buttons stay valid. + val sortedMods = onlineModInfo.values.asSequence().sortedWith(optionsManager.sortOnline.comparator) + for (mod in sortedMods) { + if (!mod.matchesFilter(filter)) continue + val cell = downloadTable.add(mod.button) + downloadTable.row() + if (onlineScrollCurrentY < 0f) onlineScrollCurrentY = cell.padTop + mod.y = onlineScrollCurrentY + mod.height = cell.prefHeight + onlineScrollCurrentY += cell.padBottom + cell.prefHeight + cell.padTop + } + + downloadTable.pack() + (downloadTable.parent as ScrollPane).actor = downloadTable + } + + private fun showModDescription(modName: String) { + val online = onlineModInfo[modName]?.description ?: "" + val installed = installedModInfo[modName]?.description ?: "" + val separator = if (online.isEmpty() || installed.isEmpty()) "" else "\n" + deprecationCell.setActor(if (modName in modsToHideNames) deprecationLabel else null) + modDescriptionLabel.setText(online + separator + installed) + } + override fun resize(width: Int, height: Int) { if (stage.viewport.screenWidth != width || stage.viewport.screenHeight != height) { - game.setScreen(ModManagementScreen()) + game.setScreen(ModManagementScreen(installedModInfo, onlineModInfo)) + dispose() // interrupt background loader - sorry, the resized new screen won't continue } } @@ -567,5 +612,6 @@ class ModManagementScreen: PickerScreen(disableScroll = true) { regex.replace(url) { it.groups[1]!!.value }.replace('-', ' ') } } + const val deprecationText = "Deprecated until update conforms to current requirements" } } diff --git a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt index 89b02f2fd0..f7cb4d8ed6 100644 --- a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt +++ b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt @@ -20,8 +20,8 @@ import kotlin.concurrent.thread open class CameraStageBaseScreen : Screen { - var game: UncivGame = UncivGame.Current - var stage: Stage + val game: UncivGame = UncivGame.Current + val stage: Stage protected val tutorialController by lazy { TutorialController(this) } @@ -34,6 +34,12 @@ open class CameraStageBaseScreen : Screen { /** The ExtendViewport sets the _minimum_(!) world size - the actual world size will be larger, fitted to screen/window aspect ratio. */ stage = Stage(ExtendViewport(height, height), SpriteBatch()) + if (enableSceneDebug) { + stage.setDebugUnderMouse(true) + stage.setDebugTableUnderMouse(true) + stage.setDebugParentUnderMouse(true) + } + keyPressDispatcher.install(stage) { hasOpenPopups() } } @@ -69,7 +75,9 @@ open class CameraStageBaseScreen : Screen { } companion object { - lateinit var skin:Skin + var enableSceneDebug = false + + lateinit var skin: Skin fun setSkin() { Fonts.resetFont() skin = Skin().apply { @@ -93,7 +101,6 @@ open class CameraStageBaseScreen : Screen { skin.get(TextField.TextFieldStyle::class.java).font = Fonts.font.apply { data.setScale(18 / Fonts.ORIGINAL_FONT_SIZE) } skin.get(SelectBox.SelectBoxStyle::class.java).font = Fonts.font.apply { data.setScale(20 / Fonts.ORIGINAL_FONT_SIZE) } skin.get(SelectBox.SelectBoxStyle::class.java).listStyle.font = Fonts.font.apply { data.setScale(20 / Fonts.ORIGINAL_FONT_SIZE) } - skin } } diff --git a/core/src/com/unciv/ui/utils/ExpanderTab.kt b/core/src/com/unciv/ui/utils/ExpanderTab.kt index 21abf75ffb..fd06efe3c4 100644 --- a/core/src/com/unciv/ui/utils/ExpanderTab.kt +++ b/core/src/com/unciv/ui/utils/ExpanderTab.kt @@ -15,7 +15,8 @@ import com.unciv.UncivGame * @param title The header text, automatically translated. * @param fontSize Size applied to header text (only) * @param icon Optional icon - please use [Image][com.badlogic.gdx.scenes.scene2d.ui.Image] or [IconCircleGroup] - * @param defaultPad Padding between content and wrapper. Header padding is currently not modifiable. + * @param defaultPad Padding between content and wrapper. + * @param headerPad Default padding for the header Table. * @param expanderWidth If set initializes header width * @param persistenceID If specified, the ExpanderTab will remember its open/closed state for the duration of one app run * @param onChange If specified, this will be called after the visual change for a change in [isOpen] completes (e.g. to react to changed size) @@ -27,6 +28,7 @@ class ExpanderTab( icon: Actor? = null, startsOutOpened: Boolean = true, defaultPad: Float = 10f, + headerPad: Float = 10f, expanderWidth: Float = 0f, private val persistenceID: String? = null, private val onChange: (() -> Unit)? = null, @@ -37,7 +39,7 @@ class ExpanderTab( const val arrowImage = "OtherIcons/BackArrow" val arrowColor = Color(1f,0.96f,0.75f,1f) const val animationDuration = 0.2f - + val persistedStates = HashMap() } @@ -59,7 +61,7 @@ class ExpanderTab( } init { - header.defaults().pad(10f) + header.defaults().pad(headerPad) headerIcon.setSize(arrowSize, arrowSize) headerIcon.setOrigin(Align.center) headerIcon.rotation = 180f @@ -115,4 +117,9 @@ class ExpanderTab( fun toggle() { isOpen = !isOpen } + + /** Change header label text after initialization */ + fun setText(text: String) { + headerLabel.setText(text) + } } diff --git a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt index 58d7452a69..39b20bd313 100644 --- a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt @@ -318,6 +318,9 @@ class OptionsPopup(val previousScreen: CameraStageBaseScreen) : Popup(previousSc add("Save maps compressed".toCheckBox(MapSaver.saveZipped) { MapSaver.saveZipped = it }).row() + add("Gdx Scene2D debug".toCheckBox(CameraStageBaseScreen.enableSceneDebug) { + CameraStageBaseScreen.enableSceneDebug = it + }).row() } //endregion diff --git a/docs/Credits.md b/docs/Credits.md index 6d324f64d7..8b99c8006c 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -638,6 +638,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [connection](https://thenounproject.com/term/connection/1365233/) by Popular for Mercantile City-States * [crossed sword](https://thenounproject.com/term/crossed-sword/2427559/) by ProSymbols for Militaristic City-States * [ship helm](https://thenounproject.com/term/ship-helm/2170591/) by Vectors Market for Maritime City-States +* [Magnifying Glass](https://thenounproject.com/term/magnifying-glass/1311/) by John Caserta for Mod filter ## Main menu