diff --git a/android/Images.ConstructionIcons/pp_firework.png b/android/Images.ConstructionIcons/pp_firework.png new file mode 100644 index 0000000000..a71129d144 Binary files /dev/null and b/android/Images.ConstructionIcons/pp_firework.png differ diff --git a/android/assets/ConstructionIcons.atlas b/android/assets/ConstructionIcons.atlas index 14bb84e4d7..ecd6ca4090 100644 --- a/android/assets/ConstructionIcons.atlas +++ b/android/assets/ConstructionIcons.atlas @@ -6,2318 +6,2325 @@ filter: MipMapLinearLinear, Linear repeat: none BuildingIcons/Alhambra rotate: false - xy: 1064, 1942 + xy: 1176, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Amphitheater rotate: false - xy: 1172, 1942 + xy: 1284, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Angkor Wat rotate: false - xy: 1280, 1942 + xy: 1392, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Apollo Program rotate: false - xy: 1604, 1942 + xy: 1716, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Aqueduct rotate: false - xy: 1712, 1942 + xy: 1824, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Armory rotate: false - xy: 1928, 1942 + xy: 848, 1800 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Arsenal rotate: false - xy: 848, 1834 + xy: 112, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bank rotate: false - xy: 1604, 1834 + xy: 320, 1596 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Barracks rotate: false - xy: 1712, 1834 + xy: 428, 1596 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bazaar rotate: false - xy: 112, 34 + xy: 752, 1618 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Big Ben rotate: false - xy: 376, 1734 + xy: 320, 1488 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bomb Shelter rotate: false - xy: 484, 1756 + xy: 428, 1488 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Brandenburg Gate rotate: false - xy: 212, 1626 + xy: 752, 1510 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Broadcast Tower rotate: false - xy: 320, 1626 + xy: 190, 1380 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Burial Tomb rotate: false - xy: 536, 1648 + xy: 298, 1380 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/CN Tower rotate: false - xy: 644, 1648 + xy: 190, 1164 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Castle rotate: false - xy: 644, 1540 + xy: 190, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Cathedral rotate: false - xy: 190, 1302 + xy: 190, 840 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Ceilidh Hall rotate: false - xy: 190, 1194 + xy: 406, 1056 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Chichen Itza rotate: false - xy: 406, 1410 + xy: 298, 840 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Circus rotate: false - xy: 298, 1194 + xy: 190, 624 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Circus Maximus rotate: false - xy: 406, 1302 + xy: 298, 732 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Coffee House rotate: false - xy: 190, 978 + xy: 406, 840 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colosseum rotate: false - xy: 298, 1086 + xy: 190, 516 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colossus rotate: false - xy: 406, 1194 + xy: 298, 624 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Constabulary rotate: false - xy: 298, 870 + xy: 190, 300 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Courthouse rotate: false - xy: 190, 438 + xy: 860, 1476 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Cristo Redentor rotate: false - xy: 298, 546 + xy: 536, 1402 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Eiffel Tower rotate: false - xy: 298, 330 + xy: 622, 1294 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Factory rotate: false - xy: 860, 1618 + xy: 514, 970 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Fallback rotate: false - xy: 968, 1726 + xy: 622, 1078 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Floating Gardens rotate: false - xy: 1076, 1726 + xy: 514, 862 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forbidden Palace rotate: false - xy: 1076, 1618 + xy: 622, 970 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forge rotate: false - xy: 1184, 1618 + xy: 514, 754 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Garden rotate: false - xy: 1508, 1618 + xy: 514, 538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Granary rotate: false - xy: 1724, 1726 + xy: 514, 430 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Grand Temple rotate: false - xy: 1724, 1618 + xy: 622, 538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Great Firewall rotate: false - xy: 1940, 1726 + xy: 622, 430 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Great Mosque of Djenne rotate: false - xy: 968, 1510 + xy: 730, 436 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Great Wall rotate: false - xy: 1292, 1510 + xy: 838, 1260 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hagia Sophia rotate: false - xy: 1724, 1510 + xy: 838, 828 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hanging Gardens rotate: false - xy: 1940, 1516 + xy: 838, 612 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hanse rotate: false - xy: 536, 1432 + xy: 838, 504 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Harbor rotate: false - xy: 644, 1432 + xy: 838, 396 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hermitage rotate: false - xy: 514, 1324 + xy: 730, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Heroic Epic rotate: false - xy: 514, 1216 + xy: 838, 180 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Himeji Castle rotate: false - xy: 622, 1324 + xy: 169, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hospital rotate: false - xy: 514, 1000 + xy: 385, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hubble Space Telescope rotate: false - xy: 622, 1108 + xy: 436, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hydro Plant rotate: false - xy: 514, 784 + xy: 652, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Ironworks rotate: false - xy: 622, 784 + xy: 946, 1044 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Kremlin rotate: false - xy: 730, 676 + xy: 946, 288 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Krepost rotate: false - xy: 514, 352 + xy: 946, 180 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Leaning Tower of Pisa rotate: false - xy: 730, 460 + xy: 1064, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Library rotate: false - xy: 860, 1402 + xy: 1280, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Lighthouse rotate: false - xy: 968, 1402 + xy: 1388, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Longhouse rotate: false - xy: 1184, 1402 + xy: 1604, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Machu Picchu rotate: false - xy: 1508, 1402 + xy: 1928, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Manhattan Project rotate: false - xy: 1724, 1402 + xy: 968, 1584 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Market rotate: false - xy: 838, 1186 + xy: 1184, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mausoleum of Halicarnassus rotate: false - xy: 946, 1294 + xy: 1076, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Medical Lab rotate: false - xy: 946, 1186 + xy: 1184, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Military Academy rotate: false - xy: 838, 970 + xy: 1400, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Military Base rotate: false - xy: 946, 1078 + xy: 1292, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mint rotate: false - xy: 1054, 1186 + xy: 1184, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monastery rotate: false - xy: 838, 754 + xy: 1508, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monument rotate: false - xy: 946, 862 + xy: 1400, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mosque rotate: false - xy: 1054, 970 + xy: 1292, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mud Pyramid Mosque rotate: false - xy: 1162, 1078 + xy: 1724, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mughal Fort rotate: false - xy: 1270, 1186 + xy: 1616, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Museum rotate: false - xy: 1378, 1294 + xy: 1508, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National College rotate: false - xy: 1162, 970 + xy: 1616, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National Epic rotate: false - xy: 1270, 1078 + xy: 1508, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National Intelligence Agency rotate: false - xy: 1378, 1186 + xy: 1832, 1589 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National Treasury rotate: false - xy: 1486, 1294 + xy: 1724, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Neuschwanstein rotate: false - xy: 838, 538 + xy: 1616, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Notre Dame rotate: false - xy: 1054, 754 + xy: 1724, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Nuclear Plant rotate: false - xy: 1270, 970 + xy: 1940, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Observatory rotate: false - xy: 1486, 1186 + xy: 1940, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Opera House rotate: false - xy: 1594, 1294 + xy: 1940, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Oxford University rotate: false - xy: 838, 430 + xy: 1054, 1260 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pagoda rotate: false - xy: 946, 539 + xy: 1054, 1152 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Palace rotate: false - xy: 1054, 646 + xy: 1054, 1044 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Paper Maker rotate: false - xy: 1270, 862 + xy: 1054, 828 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pentagon rotate: false - xy: 1594, 1186 + xy: 1054, 504 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Petra rotate: false - xy: 946, 431 + xy: 1054, 288 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Police Station rotate: false - xy: 1378, 862 + xy: 1270, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Porcelain Tower rotate: false - xy: 1486, 970 + xy: 1162, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Public School rotate: false - xy: 1162, 538 + xy: 1162, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pyramid rotate: false - xy: 1270, 646 + xy: 1270, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Recycling Center rotate: false - xy: 1486, 862 + xy: 1486, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Research Lab rotate: false - xy: 1702, 1078 + xy: 1270, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Satrap's Court rotate: false - xy: 1486, 646 + xy: 1702, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Seaport rotate: false - xy: 1810, 976 + xy: 1378, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Shrine rotate: false - xy: 1810, 868 + xy: 1162, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sistine Chapel rotate: false - xy: 1702, 646 + xy: 1378, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Solar Plant rotate: false - xy: 1810, 544 + xy: 1162, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Spaceship Factory rotate: false - xy: 1054, 430 + xy: 1270, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stable rotate: false - xy: 1270, 430 + xy: 1486, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stadium rotate: false - xy: 1378, 430 + xy: 1594, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Liberty rotate: false - xy: 1702, 430 + xy: 1162, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Zeus rotate: false - xy: 1810, 436 + xy: 1270, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stele rotate: false - xy: 946, 323 + xy: 1486, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stock Exchange rotate: false - xy: 1054, 322 + xy: 1594, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stone Works rotate: false - xy: 1162, 322 + xy: 1702, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stonehenge rotate: false - xy: 1270, 322 + xy: 1162, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sydney Opera House rotate: false - xy: 1810, 328 + xy: 1702, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Taj Mahal rotate: false - xy: 1918, 1294 + xy: 1270, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple rotate: false - xy: 1918, 1078 + xy: 1486, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple of Artemis rotate: false - xy: 1918, 970 + xy: 1594, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Terracotta Army rotate: false - xy: 1918, 754 + xy: 1378, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Library rotate: false - xy: 1918, 646 + xy: 1486, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Lighthouse rotate: false - xy: 1918, 538 + xy: 1594, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Louvre rotate: false - xy: 1918, 430 + xy: 1702, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Oracle rotate: false - xy: 1918, 322 + xy: 1486, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Pyramids rotate: false - xy: 514, 244 + xy: 1594, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Theatre rotate: false - xy: 622, 244 + xy: 1702, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/United Nations rotate: false - xy: 1162, 214 + xy: 1192, 76 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/University rotate: false - xy: 1270, 214 + xy: 1300, 76 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Utopia Project rotate: false - xy: 1378, 214 + xy: 1408, 76 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls rotate: false - xy: 1918, 214 + xy: 1810, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls of Babylon rotate: false - xy: 169, 212 + xy: 1810, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Wat rotate: false - xy: 1594, 106 + xy: 1810, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Water Mill rotate: false - xy: 268, 1842 + xy: 268, 1812 size: 200, 200 orig: 200, 200 offset: 0, 0 index: -1 BuildingIcons/Windmill rotate: false - xy: 1702, 106 + xy: 1810, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Workshop rotate: false - xy: 1810, 4 + xy: 1810, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 MayaCalendar/0 rotate: false - xy: 544, 186 + xy: 2019, 1090 size: 25, 50 orig: 25, 50 offset: 0, 0 index: -1 MayaCalendar/1 rotate: false - xy: 493, 272 + xy: 817, 162 size: 13, 50 orig: 13, 50 offset: 0, 0 index: -1 MayaCalendar/10 rotate: false - xy: 354, 56 + xy: 1918, 858 size: 21, 50 orig: 21, 50 offset: 0, 0 index: -1 MayaCalendar/11 rotate: false - xy: 268, 56 + xy: 1090, 14 size: 35, 50 orig: 35, 50 offset: 0, 0 index: -1 MayaCalendar/12 rotate: false - xy: 311, 56 + xy: 1918, 974 size: 35, 50 orig: 35, 50 offset: 0, 0 index: -1 MayaCalendar/13 rotate: false - xy: 491, 106 + xy: 1976, 1090 size: 35, 50 orig: 35, 50 offset: 0, 0 index: -1 MayaCalendar/14 rotate: false - xy: 501, 186 + xy: 1966, 1032 size: 35, 50 orig: 35, 50 offset: 0, 0 index: -1 MayaCalendar/15 rotate: false - xy: 808, 1806 + xy: 808, 1776 size: 30, 50 orig: 30, 50 offset: 0, 0 index: -1 MayaCalendar/16 rotate: false - xy: 227, 154 + xy: 1976, 1206 size: 40, 50 orig: 40, 50 offset: 0, 0 index: -1 MayaCalendar/17 rotate: false - xy: 443, 106 + xy: 1042, 14 size: 40, 50 orig: 40, 50 offset: 0, 0 index: -1 MayaCalendar/18 rotate: false - xy: 220, 96 + xy: 1918, 1032 size: 40, 50 orig: 40, 50 offset: 0, 0 index: -1 MayaCalendar/19 rotate: false - xy: 220, 38 + xy: 1976, 1148 size: 40, 50 orig: 40, 50 offset: 0, 0 index: -1 MayaCalendar/2 rotate: false - xy: 190, 1520 + xy: 190, 1490 size: 13, 50 orig: 13, 50 offset: 0, 0 index: -1 MayaCalendar/3 rotate: false - xy: 514, 1460 + xy: 514, 1430 size: 13, 50 orig: 13, 50 offset: 0, 0 index: -1 MayaCalendar/4 rotate: false - xy: 709, 186 + xy: 169, 232 size: 13, 50 orig: 13, 50 offset: 0, 0 index: -1 MayaCalendar/5 rotate: false - xy: 730, 186 + xy: 190, 242 size: 10, 50 orig: 10, 50 offset: 0, 0 index: -1 MayaCalendar/6 rotate: false - xy: 577, 186 + xy: 1133, 14 size: 25, 50 orig: 25, 50 offset: 0, 0 index: -1 MayaCalendar/7 rotate: false - xy: 610, 186 + xy: 1918, 916 size: 25, 50 orig: 25, 50 offset: 0, 0 index: -1 MayaCalendar/8 rotate: false - xy: 643, 186 + xy: 1961, 974 size: 25, 50 orig: 25, 50 offset: 0, 0 index: -1 MayaCalendar/9 rotate: false - xy: 676, 186 + xy: 2009, 1032 size: 25, 50 orig: 25, 50 offset: 0, 0 index: -1 MayaCalendar/Baktun rotate: false - xy: 1918, 48 + xy: 868, 14 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 MayaCalendar/Katun rotate: false - xy: 169, 154 + xy: 926, 14 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 MayaCalendar/Maya rotate: false - xy: 1976, 48 + xy: 1918, 1148 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 MayaCalendar/Tun rotate: false - xy: 385, 106 + xy: 1918, 1090 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/ConvertCulture rotate: false - xy: 190, 654 + xy: 406, 516 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/ConvertFaith rotate: false - xy: 298, 762 + xy: 298, 300 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/ConvertGold rotate: false - xy: 406, 870 + xy: 406, 408 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/ConvertNothing rotate: false - xy: 190, 546 + xy: 406, 300 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/ConvertScience rotate: false - xy: 298, 654 + xy: 860, 1692 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/WLTK 1 rotate: false - xy: 1486, 220 + xy: 1516, 76 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/WLTK 2 rotate: false - xy: 1594, 214 + xy: 1624, 75 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/WLTK LR rotate: false - xy: 1702, 214 + xy: 1732, 75 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/AddInCapital rotate: false - xy: 848, 1942 + xy: 4, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/AirSweep rotate: false - xy: 956, 1942 + xy: 1068, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Automate rotate: false - xy: 1280, 1834 + xy: 592, 1726 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/HurryConstruction rotate: false - xy: 1280, 1834 + xy: 592, 1726 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/ConductTradeMission rotate: false - xy: 406, 1086 + xy: 298, 516 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/ConstructImprovement rotate: false - xy: 406, 978 + xy: 298, 408 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Repair rotate: false - xy: 406, 978 + xy: 298, 408 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/DisbandUnit rotate: false - xy: 298, 438 + xy: 514, 1294 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/EnhanceReligion rotate: false - xy: 406, 438 + xy: 514, 1078 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FoundReligion rotate: false - xy: 406, 438 + xy: 514, 1078 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Escort rotate: false - xy: 406, 330 + xy: 622, 1186 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Explore rotate: false - xy: 860, 1726 + xy: 730, 1294 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Fortify rotate: false - xy: 1292, 1726 + xy: 622, 862 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FortifyUntilHealed rotate: false - xy: 1292, 1726 + xy: 622, 862 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FoundCity rotate: false - xy: 1292, 1618 + xy: 730, 970 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/HideMore rotate: false - xy: 385, 164 + xy: 1918, 1206 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitActionIcons/HurryPolicy rotate: false - xy: 730, 1216 + xy: 493, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/HurryResearch rotate: false - xy: 514, 892 + xy: 544, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/MoveTo rotate: false - xy: 443, 164 + xy: 984, 14 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitActionIcons/ShowMore rotate: false - xy: 443, 164 + xy: 984, 14 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitActionIcons/Paradrop rotate: false - xy: 1378, 970 + xy: 1054, 720 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Pillage rotate: false - xy: 1270, 754 + xy: 1162, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Present rotate: false - xy: 1594, 1078 + xy: 1270, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Promote rotate: false - xy: 1810, 1300 + xy: 514, 220 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/Upgrade rotate: false - xy: 1810, 1300 + xy: 514, 220 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/RemoveHeresy rotate: false - xy: 1594, 970 + xy: 1162, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/RoadConnection rotate: false - xy: 1270, 538 + xy: 1486, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/SetUp rotate: false - xy: 1486, 538 + xy: 1486, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Sleep rotate: false - xy: 1702, 538 + xy: 1594, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Star rotate: false - xy: 1486, 436 + xy: 622, 220 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/StartGoldenAge rotate: false - xy: 1594, 430 + xy: 1702, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Stop rotate: false - xy: 1378, 322 + xy: 1270, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/StopEscort rotate: false - xy: 1378, 322 + xy: 1270, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/StopMove rotate: false - xy: 1378, 322 + xy: 1270, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Swap rotate: false - xy: 1594, 322 + xy: 1486, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Transform rotate: false - xy: 4, 1578 + xy: 4, 1548 size: 200, 200 orig: 200, 200 offset: 0, 0 index: -1 UnitActionIcons/Wait rotate: false - xy: 1810, 220 + xy: 1810, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlag rotate: false - xy: 4, 1786 + xy: 4, 1756 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagCivilian rotate: false - xy: 4, 1167 + xy: 4, 1137 size: 178, 217 orig: 178, 217 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagCivilianInner rotate: false - xy: 4, 942 + xy: 4, 912 size: 178, 217 orig: 178, 217 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagEmbark rotate: false - xy: 4, 724 + xy: 4, 694 size: 178, 210 orig: 178, 210 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagFortify rotate: false - xy: 476, 1864 + xy: 476, 1834 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelection rotate: false - xy: 4, 538 + xy: 4, 508 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionCivilian rotate: false - xy: 4, 142 + xy: 4, 112 size: 157, 170 orig: 157, 170 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionEmbark rotate: false - xy: 4, 320 + xy: 4, 290 size: 178, 210 orig: 178, 210 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionFortify rotate: false - xy: 662, 1864 + xy: 662, 1834 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitIcons/African Forest Elephant rotate: false - xy: 4, 34 + xy: 960, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Anti-Aircraft Gun rotate: false - xy: 1388, 1942 + xy: 1500, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Anti-Tank Gun rotate: false - xy: 1496, 1942 + xy: 1608, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Archer rotate: false - xy: 1820, 1942 + xy: 1932, 1912 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Artillery rotate: false - xy: 956, 1834 + xy: 268, 1704 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Atlatlist rotate: false - xy: 1064, 1834 + xy: 376, 1704 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Atomic Bomb rotate: false - xy: 1172, 1834 + xy: 484, 1726 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/B17 rotate: false - xy: 1388, 1834 + xy: 700, 1726 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ballista rotate: false - xy: 1496, 1834 + xy: 212, 1596 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Battering Ram rotate: false - xy: 1820, 1834 + xy: 536, 1618 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Battleship rotate: false - xy: 1928, 1834 + xy: 644, 1618 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Berserker rotate: false - xy: 268, 1734 + xy: 212, 1488 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Bomber rotate: false - xy: 592, 1756 + xy: 536, 1510 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Bowman rotate: false - xy: 700, 1756 + xy: 644, 1510 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Brute rotate: false - xy: 428, 1626 + xy: 190, 1272 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Camel Archer rotate: false - xy: 752, 1648 + xy: 298, 1272 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cannon rotate: false - xy: 212, 1518 + xy: 406, 1380 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Caravel rotate: false - xy: 320, 1518 + xy: 190, 1056 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Carolean rotate: false - xy: 428, 1518 + xy: 298, 1164 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Carrier rotate: false - xy: 536, 1540 + xy: 406, 1272 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cataphract rotate: false - xy: 752, 1540 + xy: 298, 1056 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Catapult rotate: false - xy: 190, 1410 + xy: 406, 1164 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cavalry rotate: false - xy: 298, 1410 + xy: 298, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Chariot Archer rotate: false - xy: 298, 1302 + xy: 190, 732 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Chu-Ko-Nu rotate: false - xy: 190, 1086 + xy: 406, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Circle rotate: false - xy: 4, 1392 + xy: 4, 1362 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitIcons/Companion Cavalry rotate: false - xy: 190, 870 + xy: 406, 732 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Composite Bowman rotate: false - xy: 298, 978 + xy: 190, 408 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Conquistador rotate: false - xy: 190, 762 + xy: 406, 624 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cossack rotate: false - xy: 406, 762 + xy: 860, 1584 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Crossbowman rotate: false - xy: 406, 654 + xy: 644, 1402 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Destroyer rotate: false - xy: 190, 330 + xy: 752, 1402 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Dromon rotate: false - xy: 406, 546 + xy: 514, 1186 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Fighter rotate: false - xy: 968, 1618 + xy: 730, 1186 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Foreign Legion rotate: false - xy: 1184, 1726 + xy: 730, 1078 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Frigate rotate: false - xy: 1400, 1726 + xy: 514, 646 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Galleass rotate: false - xy: 1400, 1618 + xy: 622, 754 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Galley rotate: false - xy: 1508, 1726 + xy: 730, 862 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Gatling Gun rotate: false - xy: 1616, 1726 + xy: 622, 646 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Giant Death Robot rotate: false - xy: 1616, 1618 + xy: 730, 754 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Artist rotate: false - xy: 1832, 1726 + xy: 730, 646 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Engineer rotate: false - xy: 1832, 1618 + xy: 514, 322 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great General rotate: false - xy: 1940, 1624 + xy: 730, 544 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitIcons/Great Merchant rotate: false - xy: 860, 1510 + xy: 622, 322 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Prophet rotate: false - xy: 1076, 1510 + xy: 730, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Scientist rotate: false - xy: 1184, 1510 + xy: 860, 1368 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great War Bomber rotate: false - xy: 1400, 1510 + xy: 838, 1152 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great War Infantry rotate: false - xy: 1508, 1510 + xy: 838, 1044 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Guided Missile rotate: false - xy: 1616, 1510 + xy: 838, 936 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hakkapeliitta rotate: false - xy: 1832, 1510 + xy: 838, 720 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Helicopter Gunship rotate: false - xy: 752, 1432 + xy: 838, 288 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hoplite rotate: false - xy: 514, 1108 + xy: 220, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Horse Archer rotate: false - xy: 622, 1216 + xy: 277, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Horseman rotate: false - xy: 730, 1324 + xy: 328, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hussar rotate: false - xy: 622, 1000 + xy: 601, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hwach'a rotate: false - xy: 730, 1108 + xy: 709, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Infantry rotate: false - xy: 622, 892 + xy: 760, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Inquisitor rotate: false - xy: 730, 1000 + xy: 946, 1260 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ironclad rotate: false - xy: 514, 676 + xy: 946, 1152 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Jaguar rotate: false - xy: 730, 892 + xy: 946, 936 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Janissary rotate: false - xy: 514, 568 + xy: 946, 828 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Jet Fighter rotate: false - xy: 622, 676 + xy: 946, 720 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Keshik rotate: false - xy: 730, 784 + xy: 946, 612 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Khan rotate: false - xy: 514, 460 + xy: 946, 504 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Knight rotate: false - xy: 622, 568 + xy: 946, 396 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Lancer rotate: false - xy: 622, 460 + xy: 868, 72 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Landship rotate: false - xy: 730, 568 + xy: 976, 72 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Landsknecht rotate: false - xy: 622, 352 + xy: 956, 1800 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Legion rotate: false - xy: 730, 352 + xy: 1172, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longbowman rotate: false - xy: 1076, 1402 + xy: 1496, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longswordsman rotate: false - xy: 1292, 1402 + xy: 1712, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Machine Gun rotate: false - xy: 1400, 1402 + xy: 1820, 1804 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mandekalu Cavalry rotate: false - xy: 1616, 1402 + xy: 968, 1692 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Maori Warrior rotate: false - xy: 1832, 1402 + xy: 968, 1476 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Marauder rotate: false - xy: 1940, 1408 + xy: 968, 1368 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Marine rotate: false - xy: 838, 1294 + xy: 1076, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mechanized Infantry rotate: false - xy: 838, 1078 + xy: 1292, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mehal Sefari rotate: false - xy: 1054, 1294 + xy: 1076, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Minuteman rotate: false - xy: 1162, 1294 + xy: 1076, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Missile Cruiser rotate: false - xy: 838, 862 + xy: 1508, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Missionary rotate: false - xy: 946, 970 + xy: 1400, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mobile SAM rotate: false - xy: 1054, 1078 + xy: 1292, 1480 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Modern Armor rotate: false - xy: 1162, 1186 + xy: 1184, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mohawk Warrior rotate: false - xy: 1270, 1294 + xy: 1616, 1696 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Musketeer rotate: false - xy: 838, 646 + xy: 1400, 1372 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Musketman rotate: false - xy: 946, 755 + xy: 1832, 1697 size: 100, 99 orig: 100, 99 offset: 0, 0 index: -1 UnitIcons/Naresuan's Elephant rotate: false - xy: 1054, 862 + xy: 1724, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Norwegian Ski Infantry rotate: false - xy: 946, 647 + xy: 1832, 1481 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Nuclear Missile rotate: false - xy: 1162, 862 + xy: 1832, 1373 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Nuclear Submarine rotate: false - xy: 1378, 1078 + xy: 1940, 1588 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Panzer rotate: false - xy: 1162, 754 + xy: 1054, 936 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Paratrooper rotate: false - xy: 1486, 1078 + xy: 1054, 612 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Persian Immortal rotate: false - xy: 1702, 1294 + xy: 1054, 396 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Pictish Warrior rotate: false - xy: 1054, 538 + xy: 1054, 180 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Pikeman rotate: false - xy: 1162, 646 + xy: 1162, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Privateer rotate: false - xy: 1702, 1186 + xy: 1378, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Quinquereme rotate: false - xy: 1378, 754 + xy: 1378, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rifleman rotate: false - xy: 1810, 1192 + xy: 1378, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rocket Artillery rotate: false - xy: 1378, 646 + xy: 1594, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/SS Booster rotate: false - xy: 1486, 754 + xy: 1162, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/SS Cockpit rotate: false - xy: 1594, 862 + xy: 1270, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/SS Engine rotate: false - xy: 1702, 970 + xy: 1378, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/SS Stasis Chamber rotate: false - xy: 1810, 1084 + xy: 1486, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Samurai rotate: false - xy: 1378, 538 + xy: 1594, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Scout rotate: false - xy: 1594, 754 + xy: 1162, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Sea Beggar rotate: false - xy: 1702, 862 + xy: 1270, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Settler rotate: false - xy: 1594, 646 + xy: 1594, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ship of the Line rotate: false - xy: 1702, 754 + xy: 1702, 1156 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Sipahi rotate: false - xy: 1594, 538 + xy: 1270, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Skirmisher rotate: false - xy: 1810, 760 + xy: 1486, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Slinger rotate: false - xy: 1810, 652 + xy: 1702, 1048 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Spearman rotate: false - xy: 1162, 430 + xy: 1378, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Stealth Bomber rotate: false - xy: 838, 322 + xy: 1378, 508 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Submarine rotate: false - xy: 1486, 328 + xy: 1378, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Swordsman rotate: false - xy: 1702, 322 + xy: 1594, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tank rotate: false - xy: 1918, 1186 + xy: 1378, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tercio rotate: false - xy: 1918, 862 + xy: 1702, 616 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trebuchet rotate: false - xy: 730, 244 + xy: 1594, 184 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Triplane rotate: false - xy: 838, 214 + xy: 1702, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trireme rotate: false - xy: 946, 214 + xy: 1702, 183 size: 100, 101 orig: 100, 101 offset: 0, 0 index: -1 UnitIcons/Turtle Ship rotate: false - xy: 1054, 214 + xy: 1084, 72 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/War Chariot rotate: false - xy: 277, 222 + xy: 1810, 940 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/War Elephant rotate: false - xy: 385, 222 + xy: 1810, 832 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Warrior rotate: false - xy: 1486, 112 + xy: 1810, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Work Boats rotate: false - xy: 1810, 112 + xy: 1810, 400 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Worker rotate: false - xy: 1918, 106 + xy: 1810, 292 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Zero rotate: false - xy: 277, 114 + xy: 1918, 1264 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 +pp_firework + rotate: false + xy: 848, 1908 + size: 104, 104 + orig: 104, 104 + offset: 0, 0 + index: -1 diff --git a/android/assets/ConstructionIcons.png b/android/assets/ConstructionIcons.png index bf1b5384ad..4e0a95d4f4 100644 Binary files a/android/assets/ConstructionIcons.png and b/android/assets/ConstructionIcons.png differ diff --git a/android/assets/NotificationIcons.png b/android/assets/NotificationIcons.png deleted file mode 100644 index a0cdc40b4f..0000000000 Binary files a/android/assets/NotificationIcons.png and /dev/null differ diff --git a/android/assets/effects/fireworks.p b/android/assets/effects/fireworks.p new file mode 100644 index 0000000000..dcc9e266a7 --- /dev/null +++ b/android/assets/effects/fireworks.p @@ -0,0 +1,2205 @@ +tracer +- Delay - +active: false +- Duration - +lowMin: 600.0 +lowMax: 600.0 +- Count - +min: 0 +max: 20 +- Emission - +lowMin: 120.0 +lowMax: 120.0 +highMin: 120.0 +highMax: 120.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 75.0 +lowMax: 75.0 +highMin: 75.0 +highMax: 75.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.74550897 +timeline2: 1.0 +independent: true +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 12.0 +lowMax: 12.0 +highMin: 36.0 +highMax: 36.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 5.0 +highMax: 5.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 9 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 0.6 +colors4: 0.2 +colors5: 1.0 +colors6: 0.49803922 +colors7: 0.047058824 +colors8: 0.047058824 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.59396434 +timeline2: 0.99176955 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +trail +- Delay - +active: false +- Duration - +lowMin: 600.0 +lowMax: 600.0 +- Count - +min: 0 +max: 160 +- Emission - +lowMin: 240.0 +lowMax: 240.0 +highMin: 320.0 +highMax: 320.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 80.0 +lowMax: 80.0 +highMin: 140.0 +highMax: 140.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.8958333 +timeline2: 1.0 +independent: true +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 2.0 +lowMax: 2.0 +highMin: 8.0 +highMax: 8.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 12.0 +highMax: 12.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 0.4509804 +colors2: 0.3254902 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-red +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 250.0 +lowMax: 250.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 600.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 50.0 +highMax: 200.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: -230.0 +highMax: -230.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 0.0 +colors2: 0.0 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.70547944 +timeline2: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-blue +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 200.0 +lowMax: 200.0 +- Count - +min: 0 +max: 300 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 650.0 +highMax: 800.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 10.0 +lowMax: 10.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 140.0 +highMax: 220.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 10.0 +lowMax: 10.0 +highMin: -240.0 +highMax: -240.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 6 +colors0: 0.0 +colors1: 0.047058824 +colors2: 1.0 +colors3: 0.49019608 +colors4: 0.5137255 +colors5: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 0.98245615 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.45890412 +timeline2: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-green +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 250.0 +lowMax: 250.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 600.0 +highMax: 700.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 116.0 +highMax: 200.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: -230.0 +highMax: -230.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 12 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 0.0 +colors4: 1.0 +colors5: 0.12156863 +colors6: 0.0 +colors7: 1.0 +colors8: 0.11764706 +colors9: 0.24705882 +colors10: 0.5019608 +colors11: 0.2784314 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.03978052 +timeline2: 0.22359397 +timeline3: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.6180556 +timeline2: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-yellow +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 250.0 +lowMax: 250.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 600.0 +highMax: 700.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 116.0 +highMax: 200.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: -230.0 +highMax: -230.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 9 +colors0: 0.9647059 +colors1: 1.0 +colors2: 0.49803922 +colors3: 0.9411765 +colors4: 0.9764706 +colors5: 0.0 +colors6: 0.9019608 +colors7: 0.7607843 +colors8: 0.08627451 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.08504801 +timeline2: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.88135594 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.30555555 +timeline2: 0.7500004 +timeline3: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-purple +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 250.0 +lowMax: 250.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 600.0 +highMax: 700.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 116.0 +highMax: 200.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: -230.0 +highMax: -230.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 12 +colors0: 1.0 +colors1: 0.19607843 +colors2: 0.7372549 +colors3: 1.0 +colors4: 0.0 +colors5: 0.99215686 +colors6: 0.99607843 +colors7: 0.0 +colors8: 0.9882353 +colors9: 0.5686275 +colors10: 0.06666667 +colors11: 0.9254902 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.3319615 +timeline2: 0.6419753 +timeline3: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.3008982 +timeline2: 0.6002994 +timeline3: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +shower-cyan +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 250.0 +lowMax: 250.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 250.0 +highMax: 250.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 600.0 +highMax: 750.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 56.0 +highMax: 56.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 150.0 +highMax: 180.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 45.0 +lowMax: 45.0 +highMin: -275.0 +highMax: -275.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 9 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 0.0 +colors4: 1.0 +colors5: 1.0 +colors6: 0.0 +colors7: 0.3529412 +colors8: 0.84705883 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.41838133 +timeline2: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.0 +timeline2: 0.5 +timeline3: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +rainbow +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 900.0 +lowMax: 900.0 +- Count - +min: 80 +max: 500 +- Emission - +lowMin: 50.0 +lowMax: 50.0 +highMin: 500.0 +highMax: 500.0 +relative: false +scalingCount: 4 +scaling0: 0.32960895 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.090277776 +timeline2: 0.8008982 +timeline3: 1.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 330.0 +highMax: 900.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 12.0 +lowMax: 12.0 +highMin: 36.0 +highMax: 36.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 50.0 +lowMax: 50.0 +highMin: 135.0 +highMax: 175.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 80.0 +lowMax: 160.0 +highMin: -260.0 +highMax: -60.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 39 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 1.0 +colors4: 0.0 +colors5: 0.0 +colors6: 1.0 +colors7: 1.0 +colors8: 0.0 +colors9: 0.0 +colors10: 1.0 +colors11: 0.0 +colors12: 0.0 +colors13: 1.0 +colors14: 1.0 +colors15: 0.0 +colors16: 0.0 +colors17: 1.0 +colors18: 1.0 +colors19: 0.0 +colors20: 1.0 +colors21: 1.0 +colors22: 0.0 +colors23: 0.0 +colors24: 1.0 +colors25: 1.0 +colors26: 0.0 +colors27: 0.0 +colors28: 1.0 +colors29: 0.0 +colors30: 0.0 +colors31: 1.0 +colors32: 1.0 +colors33: 0.04 +colors34: 0.04 +colors35: 0.937 +colors36: 0.651 +colors37: 0.0 +colors38: 1.0 +timelineCount: 13 +timeline0: 0.0 +timeline1: 0.0833 +timeline2: 0.1667 +timeline3: 0.25 +timeline4: 0.3333 +timeline5: 0.4167 +timeline6: 0.5 +timeline7: 0.5833 +timeline8: 0.6667 +timeline9: 0.75 +timeline10: 0.8333 +timeline11: 0.9167 +timeline12: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.0 +timeline2: 0.5 +timeline3: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +center +- Delay - +active: true +lowMin: 600.0 +lowMax: 600.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 0.0 +lowMax: 0.0 +highMin: 77.0 +highMax: 77.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 500.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 40.0 +highMax: 60.0 +relative: false +scalingCount: 2 +scaling0: 1.0 +scaling1: 0.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: -20.0 +highMax: -20.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Tint - +colorsCount: 6 +colors0: 0.85882354 +colors1: 0.91764706 +colors2: 1.0 +colors3: 0.0 +colors4: 0.83137256 +colors5: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 2 +scaling0: 1.0 +scaling1: 0.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +dazzler-cyan +- Delay - +active: true +lowMin: 1850.0 +lowMax: 1850.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 7.0 +lowMax: 7.0 +highMin: 9.0 +highMax: 9.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 5.0 +lowMax: 5.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 70.0 +highMax: 70.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 0.58431375 +colors1: 0.9882353 +colors2: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +dazzler-teal +- Delay - +active: true +lowMin: 1870.0 +lowMax: 1870.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 7.0 +lowMax: 7.0 +highMin: 9.0 +highMax: 9.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 5.0 +lowMax: 5.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 70.0 +highMax: 70.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 0.39607844 +colors1: 1.0 +colors2: 0.79607844 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +dazzler-green +- Delay - +active: true +lowMin: 1890.0 +lowMax: 1890.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 7.0 +lowMax: 7.0 +highMin: 9.0 +highMax: 9.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 5.0 +lowMax: 5.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 70.0 +highMax: 70.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 0.49019608 +colors1: 1.0 +colors2: 0.40392157 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +dazzler-yellow +- Delay - +active: true +lowMin: 1910.0 +lowMax: 1910.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 7.0 +lowMax: 7.0 +highMin: 9.0 +highMax: 9.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 5.0 +lowMax: 5.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 70.0 +highMax: 70.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 0.9529412 +colors1: 1.0 +colors2: 0.5921569 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + + +dazzler-orange +- Delay - +active: true +lowMin: 1930.0 +lowMax: 1930.0 +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 7.0 +lowMax: 7.0 +highMin: 9.0 +highMax: 9.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 5.0 +lowMax: 5.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: point +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 70.0 +highMax: 70.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 25.0 +highMax: 25.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 360.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 0.85490197 +colors2: 0.6627451 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: true +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +pp_firework.png + diff --git a/core/src/com/unciv/ui/components/ParticleEffectAnimation.kt b/core/src/com/unciv/ui/components/ParticleEffectAnimation.kt new file mode 100644 index 0000000000..f06ec702c4 --- /dev/null +++ b/core/src/com/unciv/ui/components/ParticleEffectAnimation.kt @@ -0,0 +1,200 @@ +package com.unciv.ui.components + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.GL20 +import com.badlogic.gdx.graphics.g2d.ParticleEffect +import com.badlogic.gdx.graphics.g2d.ParticleEmitter +import com.badlogic.gdx.graphics.g2d.ParticleEmitter.RangedNumericValue +import com.badlogic.gdx.math.Interpolation +import com.badlogic.gdx.math.Rectangle +import com.badlogic.gdx.math.Vector2 +import com.badlogic.gdx.scenes.scene2d.Stage +import com.badlogic.gdx.utils.Array +import com.badlogic.gdx.utils.Disposable +import com.unciv.UncivGame +import com.unciv.ui.images.ImageGetter + +/** Hosts one template ParticleEffect and any number of clones, and each can travel linearly over part of its lifetime. + * @property load Must be called from a subclass at least once - see detailed Kdoc + * @property configure Optionally modifies all clones - see detailed Kdoc + * @property getTargetBounds Where to draw on the stage - see detailed Kdoc + * @property getScale Optionally scales all effects - see detailed Kdoc + * @property render Needs to be called from the hosting Screen in its render override + * @property dispose Required - this is just the Gdx Disposable interface, no automatic call + */ +abstract class ParticleEffectAnimation : Disposable { + @Suppress("MemberVisibilityCanBePrivate", "ConstPropertyName") + companion object { + const val defaultAtlasName = "ConstructionIcons" + + fun isEnabled(game: UncivGame, atlasName: String = defaultAtlasName) = + game.settings.continuousRendering && ImageGetter.getSpecificAtlas(atlasName) != null + + private val halfPoint = Vector2(0.5f, 0.5f) + } + + private val templateEffect = ParticleEffect() + /** Unit: ms */ + private var maxDuration: Float = 0f + // val pool: ParticleEffectPool - can't, since we're filtering emitters by removing them, we need a fresh clone for every repetition. A pool won't give fresh clones... + private var nextIndex = 0 + + /** + * Represents one currently running effect + * - Points are relative to the bounds provided by [getTargetBounds], and would normally stay in the (0..1) range. They default to (0.5,0.5). + * - Time units are seconds (while Gdx [ParticleEffect] uses milliseconds), matching [render] delta. + * @property index A sequential counter, just in case a [configure] or [onComplete] needs some handle to differentiate parallel or repeated effects. Starts at 0. + * @property effect One clone of the template effect [ParticleEffectAnimation] loads (use e.g. [removeEmitters] to modify) + * @property startPoint If the effect should travel over time, this is the start point. + * @property endPoint If the effect should travel over time, this is the end point. + * @property delay This is the initial delay before travel starts. Defaults to 0, when >0 all emitters in the effect get this added to their own delay value. + * @property travelTime This is the travel duration - after this is up, the effect stays at [endPoint]. Defaults to the maximum (duration+delay) of all emitters. + * @property interpolation Applied to travel time percentage + * @property accumulatedTime For [render] to accumulate time in, as effect has none, and individual emitters do not accumulate in a readable way over the entire effect duration. + */ + protected data class ParticleEffectData( + val index: Int, + val effect: ParticleEffect, + var startPoint: Vector2 = halfPoint, + var endPoint: Vector2 = halfPoint, + var delay: Float = 0f, + var travelTime: Float, + var interpolation: Interpolation = Interpolation.linear + ) { + private var accumulatedTime = 0f + private var percent = 0f + fun update(delta: Float) { + accumulatedTime += delta + val rawPercent = (accumulatedTime - delay) / travelTime + percent = interpolation.apply(rawPercent.coerceIn(0f, 1f)) + } + fun currentX() = startPoint.x + percent * (endPoint.x - startPoint.x) + fun currentY() = startPoint.y + percent * (endPoint.y - startPoint.y) + } + + private val activeEffectData = arrayListOf() + //private val effectsBatch: Batch = SpriteBatch() + private val targetBounds = Rectangle() + private var lastScale = 1f + + /** Fetch where to draw in stage coordinates + * - Implementation should ***set*** the fields of the provided rectangle instance. + * - Note the bounds do not limit the effects themselves, but determine effect travel over time. + * - Actual size of the effects are determined by the effect definition and [getScale]. + * - For stationary effects, width=0 and height=0 are perfectly acceptable. + */ + abstract fun getTargetBounds(bounds: Rectangle) + + /** Return how the effects should be scaled relative to their definition (which already uses world coordinates). + * - Changing this while the effects are rendering is relatively expensive + */ + protected open fun getScale() = 1f + + /** Allows the subclass to change an effect about to be started. + * - You *can* modify the effect directly, e.g. to [remove emitters][removeEmitters] + * - You can alter startPoint and endPoint by assigning new Vector2 instances - do not mutate the default + * - You can alter delay and travelTime + * @see ParticleEffectData + */ + protected open fun ParticleEffectData.configure() {} + + /** Called whenever an effect says it's complete. + * @param effectData The info on the just-completed effect - most clients won't need this + * @return whether and how many effects should ***restart*** once completed (actually creates new clones of the template effect and also calls [configure]) + */ + protected open fun onComplete(effectData: ParticleEffectData) = 0 + + /** @return number of currently running effect clones */ + protected fun activeCount() = activeEffectData.size + + /** Loads the effect definition, creates a pool from it and starts [count] instances potentially modified by [configure]. */ + protected fun load(effectsFile: String, atlasName: String, count: Int) { + activeEffectData.clear() + val atlas = ImageGetter.getSpecificAtlas(atlasName)!! + templateEffect.load(Gdx.files.internal(effectsFile), atlas) + templateEffect.setEmittersCleanUpBlendFunction(false) // Treat it as Unknown whether the effect file changes blend state -> do it ourselves + maxDuration = templateEffect.emitters.maxOf { it.getDuration().lowMax + (if (it.delay.isActive) it.delay.lowMax else 0f) } + + repeat(count, ::newEffect) + } + + @Suppress("UNUSED_PARAMETER") // Signature to match `repeat` argument + private fun newEffect(dummy: Int) { + val effect = ParticleEffect(templateEffect) + val data = ParticleEffectData(nextIndex, effect, travelTime = maxDuration / 1000) + nextIndex++ + data.configure() + if (data.delay > 0f) { + for (emitter in effect.emitters) + emitter.delay.add(data.delay * 1000) + } + if (lastScale != 1f) + effect.scaleEffect(lastScale) + effect.start() + activeEffectData += data + } + + private fun RangedNumericValue.add(delta: Float) { + if (isActive) { + lowMin += delta + lowMax += delta + } else { + isActive = true + lowMin = delta + lowMax = delta + } + } + + override fun dispose() { + val effects = activeEffectData.toList() + activeEffectData.clear() + for (effect in effects) effect.effect.dispose() + templateEffect.dispose() + } + + fun render(stage: Stage?, delta: Float) { + if (maxDuration == 0f) return + val effectsBatch = stage?.batch ?: return + effectsBatch.projectionMatrix = stage.viewport.camera.combined + + getTargetBounds(targetBounds) + val newScale = getScale() + if (newScale != lastScale) { + val scaleChange = newScale / lastScale + lastScale = newScale + for ((_, effect) in activeEffectData) { + effect.scaleEffect(scaleChange) + } + } + + var repeatCount = 0 + + effectsBatch.begin() + val iterator = activeEffectData.iterator() + while (iterator.hasNext()) { + val effectData = iterator.next() + val effect = effectData.effect + effectData.update(delta) + val x = targetBounds.x + targetBounds.width * effectData.currentX() + val y = targetBounds.y + targetBounds.height * effectData.currentY() + effect.setPosition(x, y) + effect.draw(effectsBatch, delta) + if (effect.isComplete) { + repeatCount += onComplete(effectData) + effect.dispose() + iterator.remove() + } + } + effectsBatch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + effectsBatch.end() + + repeat(repeatCount, ::newEffect) + } + + protected fun ParticleEffect.removeEmitters(predicate: (String)->Boolean) { + val matches = Array() + for (emitter in emitters) + if (predicate(emitter.name)) matches.add(emitter) + emitters.removeAll(matches, true) // This is a Gdx method, not kotlin MutableCollection.removeAll + } +} diff --git a/core/src/com/unciv/ui/components/ParticleEffectFireworks.kt b/core/src/com/unciv/ui/components/ParticleEffectFireworks.kt new file mode 100644 index 0000000000..2fd61e5039 --- /dev/null +++ b/core/src/com/unciv/ui/components/ParticleEffectFireworks.kt @@ -0,0 +1,73 @@ +package com.unciv.ui.components + +import com.badlogic.gdx.math.Interpolation +import com.badlogic.gdx.math.Vector2 +import kotlin.random.Random + +abstract class ParticleEffectFireworks : ParticleEffectAnimation() { + @Suppress("ConstPropertyName") + companion object { + const val effectsFile = "effects/fireworks.p" + + private val initialEndPoints = arrayOf( + Vector2(0.5f, 1.5f), + Vector2(0.2f, 1f), + Vector2(0.8f, 1f), + ) + private val startPoint = Vector2(0.5f, 0f) + + // These define the range of random endPoints and thus how far out of the offered Actor bounds the rockets can fly + private const val amplitudeX = 1f + private const val offsetX = 0f + private const val amplitudeY = 1f + private const val offsetY = 0.5f + // Duration of tracer effect taken from the definition file + private const val travelTime = 0.6f + // Delay between initial effects + private const val initialDelay = travelTime + // Max delay for next effect + private const val amplitudeDelay = 0.25f + // These two determine how often onComplete will ask for an extra restart or omit one + private const val minEffects = 3 + private const val maxEffects = 5 + } + + fun load() { + load(effectsFile, defaultAtlasName, initialEndPoints.size) + } + + override fun ParticleEffectData.configure() { + startPoint = Companion.startPoint + endPoint = if (index in initialEndPoints.indices) initialEndPoints[index] + else Vector2(offsetX + amplitudeX * Random.nextFloat(), offsetY + amplitudeY * Random.nextFloat()) + delay = if (index in initialEndPoints.indices) index * initialDelay + else Random.nextFloat() * amplitudeDelay + travelTime = Companion.travelTime + interpolation = Interpolation.fastSlow + + // The file definition has a whole bunch of "explosions" - a "rainbow" and six "shower-color" ones. + // Show either "rainbow" alone or a random selection of "shower" emitters. + // It also has some "dazzler" emitters that shouldn't be included in most runs. + val type = Random.nextInt(-1, 5) + if (type < 0) { + // Leave only rainbow emitter + effect.removeEmitters { it.startsWith("shower") } + } else { + // remove rainbow emitter and [type] "shower-color" emitters + val names = effect.emitters.asSequence() + .map { it.name }.filter { it.startsWith("shower") } + .shuffled().take(type) + .toSet() + "rainbow" + effect.removeEmitters { it in names } + } + if (Random.nextInt(4) > 0) + effect.removeEmitters { it.startsWith("dazzler") } + } + + override fun onComplete(effectData: ParticleEffectData): Int { + if (Random.nextInt(4) > 0) return 1 + if (activeCount() <= minEffects) return Random.nextInt(1, 3) + if (activeCount() >= maxEffects) return Random.nextInt(0, 2) + return Random.nextInt(0, 3) + } +} diff --git a/core/src/com/unciv/ui/components/ParticleEffectMapFireworks.kt b/core/src/com/unciv/ui/components/ParticleEffectMapFireworks.kt new file mode 100644 index 0000000000..5664f8faa3 --- /dev/null +++ b/core/src/com/unciv/ui/components/ParticleEffectMapFireworks.kt @@ -0,0 +1,50 @@ +package com.unciv.ui.components + +import com.badlogic.gdx.math.Rectangle +import com.unciv.UncivGame +import com.unciv.ui.components.tilegroups.CityTileGroup +import com.unciv.ui.components.widgets.ZoomableScrollPane +import com.unciv.ui.screens.cityscreen.CityMapHolder + +// todo sound +// todo moddability (refactor media search first) + +/** + * Display fireworks using the Gdx ParticleEffect system, over a map view, centered on a specific tile. + * - Use the [create] factory for instantiation - it handles checking the continuousRendering setting and asset existence. + * - Repeats endlessly + * - Handles the zooming and panning of the map + * - Intentionally exceeds the bounds of the passed (TileGroup) actor bounds, but not by much + * @param mapHolder the CityMapHolder (or WorldMapHolder) this should draw over + * @property setActorBounds Informs this where, relative to the TileGroupMap that is zoomed and panned through the ZoomableScrollPane, to draw - can be constant over lifetime + */ +class ParticleEffectMapFireworks( + private val mapHolder: ZoomableScrollPane +) : ParticleEffectFireworks() { + companion object { + fun create(game: UncivGame, mapScrollPane: CityMapHolder): ParticleEffectMapFireworks? { + if (!isEnabled(game, defaultAtlasName)) return null + return ParticleEffectMapFireworks(mapScrollPane).apply { load() } + } + } + + private val actorBounds = Rectangle() + private val tempViewport = Rectangle() + + // The factors below are just fine-tuning the looks, and avoid lengthy particle effect file edits + fun setActorBounds(tileGroup: CityTileGroup) { + tileGroup.run { actorBounds.set(x + (width - hexagonImageWidth) / 2, y + height / 4, hexagonImageWidth, height * 1.667f) } + } + + override fun getScale() = mapHolder.scaleX * 0.667f + + override fun getTargetBounds(bounds: Rectangle) { + // Empiric math - any attempts to ask Gdx via localToStageCoordinates were way off + val scale = mapHolder.scaleX // just assume scaleX==scaleY + mapHolder.getViewport(tempViewport) + bounds.x = (actorBounds.x - tempViewport.x) * scale + bounds.y = (actorBounds.y - tempViewport.y) * scale + bounds.width = actorBounds.width * scale + bounds.height = actorBounds.height * scale + } +} diff --git a/core/src/com/unciv/ui/components/tilegroups/CityTileGroup.kt b/core/src/com/unciv/ui/components/tilegroups/CityTileGroup.kt index b4ded4b9bf..6c992f780e 100644 --- a/core/src/com/unciv/ui/components/tilegroups/CityTileGroup.kt +++ b/core/src/com/unciv/ui/components/tilegroups/CityTileGroup.kt @@ -24,7 +24,7 @@ enum class CityTileState { BLOCKADED } -class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings) : TileGroup(tile,tileSetStrings) { +class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings, private val nightMode: Boolean) : TileGroup(tile,tileSetStrings) { var tileState = CityTileState.NONE @@ -40,11 +40,20 @@ class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings) layerMisc.removeWorkedIcon() var icon: Actor? = null + val setDimmed = if (nightMode) fun(factor: Float) { + layerTerrain.dim(0.25f * factor) + } else fun(factor: Float) { + layerTerrain.dim(0.5f * factor) + } + val setUndimmed = if (nightMode) fun() { + layerTerrain.dim(0.5f) + } else fun() {} + when { // Does not belong to us tile.getOwner() != city.civ -> { - layerTerrain.dim(0.3f) + setDimmed(0.6f) layerMisc.setYieldVisible(UncivGame.Current.settings.showTileYields) layerMisc.dimYields(true) @@ -70,31 +79,34 @@ class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings) // Out of city range tile !in city.tilesInRange -> { - layerTerrain.dim(0.5f) + setDimmed(1f) layerMisc.dimYields(true) } // Worked by another city tile.isWorked() && tile.getWorkingCity() != city -> { - layerTerrain.dim(0.5f) + setDimmed(1f) layerMisc.dimYields(true) } // City Center tile.isCityCenter() -> { icon = ImageGetter.getImage("TileIcons/CityCenter") + // Night mode does not apply to the city tile itself layerMisc.dimYields(false) } // Does not provide yields tile.stats.getTileStats(city, city.civ).isEmpty() -> { - // Do nothing + // Do nothing except night-mode dimming + setUndimmed() } // Blockaded tile.isBlockaded() -> { icon = ImageGetter.getImage("TileIcons/Blockaded") tileState = CityTileState.BLOCKADED + setUndimmed() layerMisc.dimYields(true) } @@ -102,6 +114,7 @@ class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings) tile.isLocked() -> { icon = ImageGetter.getImage("TileIcons/Locked") tileState = CityTileState.WORKABLE + setUndimmed() layerMisc.dimYields(false) } @@ -109,18 +122,21 @@ class CityTileGroup(val city: City, tile: Tile, tileSetStrings: TileSetStrings) tile.isWorked() -> { icon = ImageGetter.getImage("TileIcons/Worked") tileState = CityTileState.WORKABLE + setUndimmed() layerMisc.dimYields(false) } // Provides yield without worker assigned (isWorked already tested above) tile.providesYield() -> { // defaults are OK + setUndimmed() } // Not-worked else -> { icon = ImageGetter.getImage("TileIcons/NotWorked") tileState = CityTileState.WORKABLE + setUndimmed() layerMisc.dimYields(true) } } diff --git a/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt b/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt index cf78e3eea2..3853f88496 100644 --- a/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt +++ b/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt @@ -396,18 +396,20 @@ open class ZoomableScrollPane( return true } - /** @return the currently scrolled-to viewport of the whole scrollable area */ - private fun getViewport(): Rectangle { + /** Overwrite [rect] with the currently scrolled-to viewport of the whole scrollable area */ + fun getViewport(rect: Rectangle) { val viewportFromLeft = scrollX /** In the default coordinate system, the y origin is at the bottom, but scrollY is from the top, so we need to invert. */ val viewportFromBottom = maxY - scrollY - return Rectangle( - viewportFromLeft - horizontalPadding, - viewportFromBottom - verticalPadding, - width, - height) + rect.x = viewportFromLeft - horizontalPadding + rect.y = viewportFromBottom - verticalPadding + rect.width = width + rect.height = height } + /** @return the currently scrolled-to viewport of the whole scrollable area */ + private fun getViewport() = Rectangle().also { getViewport(it) } + private fun onViewportChanged() { onViewportChangedListener?.invoke(maxX, maxY, getViewport()) } diff --git a/core/src/com/unciv/ui/images/ImageGetter.kt b/core/src/com/unciv/ui/images/ImageGetter.kt index dfe8378566..89e22fcd82 100644 --- a/core/src/com/unciv/ui/images/ImageGetter.kt +++ b/core/src/com/unciv/ui/images/ImageGetter.kt @@ -56,6 +56,8 @@ object ImageGetter { private val textureRegionDrawables = HashMap() private val ninePatchDrawables = HashMap() + fun getSpecificAtlas(name: String): TextureAtlas? = atlases[name] + fun resetAtlases() { atlases.values.forEach { it.dispose() } atlases.clear() diff --git a/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt b/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt index e6862d015a..944e02d16e 100644 --- a/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt +++ b/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt @@ -21,6 +21,7 @@ import com.unciv.models.stats.Stat import com.unciv.models.translations.tr import com.unciv.ui.audio.CityAmbiencePlayer import com.unciv.ui.audio.SoundPlayer +import com.unciv.ui.components.ParticleEffectMapFireworks import com.unciv.ui.components.extensions.colorFromRGB import com.unciv.ui.components.extensions.disable import com.unciv.ui.components.extensions.packIfNeeded @@ -137,16 +138,20 @@ class CityScreen( private var cityAmbiencePlayer: CityAmbiencePlayer? = ambiencePlayer ?: CityAmbiencePlayer(city) + /** Particle effects for WLTK day decoration */ + private val isWLTKday = city.isWeLoveTheKingDayActive() + private val fireworks: ParticleEffectMapFireworks? + init { - if (city.isWeLoveTheKingDayActive() && UncivGame.Current.settings.citySoundsVolume > 0) { + if (isWLTKday && UncivGame.Current.settings.citySoundsVolume > 0) { SoundPlayer.play(UncivSound("WLTK")) } + fireworks = if (isWLTKday) ParticleEffectMapFireworks.create(game, mapScrollPane) else null UncivGame.Current.settings.addCompletedTutorialTask("Enter city screen") addTiles() - //stage.setDebugTableUnderMouse(true) stage.addActor(cityStatsTable) // If we are spying then we shoulden't be able to see their construction screen. constructionsTable.addActorsToStage() @@ -251,6 +256,7 @@ class CityScreen( else -> Color.GREEN to 0.5f } } + for (tileGroup in tileGroups) { tileGroup.update() tileGroup.layerMisc.removeHexOutline() @@ -268,6 +274,9 @@ class CityScreen( getPickImprovementColor(tileGroup.tile).run { tileGroup.layerMisc.addHexOutline(first.cpy().apply { this.a = second }) } } + + if (fireworks == null || tileGroup.tile.position != city.location) continue + fireworks.setActorBounds(tileGroup) } } @@ -277,7 +286,7 @@ class CityScreen( fun addWltkIcon(name: String, apply: Image.()->Unit = {}) = razeCityButtonHolder.add(ImageGetter.getImage(name).apply(apply)).size(wltkIconSize) - if (city.isWeLoveTheKingDayActive()) { + if (isWLTKday && fireworks == null) { addWltkIcon("OtherIcons/WLTK LR") { color = Color.GOLD } addWltkIcon("OtherIcons/WLTK 1") { color = Color.FIREBRICK }.padRight(10f) } @@ -309,7 +318,7 @@ class CityScreen( razeCityButtonHolder.add(stopRazingCityButton) //.colspan(cityPickerTable.columns) } - if (city.isWeLoveTheKingDayActive()) { + if (isWLTKday && fireworks == null) { addWltkIcon("OtherIcons/WLTK 2") { color = Color.FIREBRICK }.padLeft(10f) addWltkIcon("OtherIcons/WLTK LR") { color = Color.GOLD @@ -329,7 +338,7 @@ class CityScreen( val tileSetStrings = TileSetStrings() val cityTileGroups = city.getCenterTile().getTilesInDistance(5) .filter { selectedCiv.hasExplored(it) } - .map { CityTileGroup(city, it, tileSetStrings) } + .map { CityTileGroup(city, it, tileSetStrings, fireworks != null) } for (tileGroup in cityTileGroups) { tileGroup.onClick { tileGroupOnClick(tileGroup, city) } @@ -531,6 +540,12 @@ class CityScreen( override fun dispose() { cityAmbiencePlayer?.dispose() + fireworks?.dispose() super.dispose() } + + override fun render(delta: Float) { + super.render(delta) + fireworks?.render(stage, delta) + } } diff --git a/docs/Credits.md b/docs/Credits.md index 56133730ec..21b4cb13ba 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -826,3 +826,22 @@ The following audio is from https://pixabay.com/ [Pixabay License](https://pixab - [Cinematic Boom](https://pixabay.com/sound-effects/cinematic-boom-6872/) by Rizzard for final boom - [Cymbal Swell 2](https://pixabay.com/sound-effects/cymbal-swell-2-74766/) by rubberduckie for cymbal swells - [hit of orchestral cymbals and bass drum](https://pixabay.com/sound-effects/hit-of-orchestral-cymbals-and-bass-drum-14471/) by Selector for intro crash + +## Visual effects + +The fireworks on the City screen of a WLTK-celebrating city are loosely based on the Fireworks.p file included in [Particle Park](https://github.com/raeleus/Particle-Park). +All differences and edits done by the Unciv team. +License quoted: +``` +Particle Park Fireworks License + +------------------------------------------------------------------------------------------ + +Copyright © 2019 Raymond Buckley + +Particle Park Fireworks can be used under the Creative Commons Attribution 4.0 International license. + +See a human readable version here: https://creativecommons.org/licenses/by/4.0/ + +------------------------------------------------------------------------------------------ +``` diff --git a/tests/src/com/unciv/dev/FasterUIDevelopment.kt b/tests/src/com/unciv/dev/FasterUIDevelopment.kt index f6e429de46..cf9a885178 100644 --- a/tests/src/com/unciv/dev/FasterUIDevelopment.kt +++ b/tests/src/com/unciv/dev/FasterUIDevelopment.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.Game import com.badlogic.gdx.Gdx import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration +import com.badlogic.gdx.files.FileHandle import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.math.Vector2 @@ -13,7 +14,9 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener import com.badlogic.gdx.scenes.scene2d.utils.Layout import com.unciv.UncivGame import com.unciv.dev.FasterUIDevelopment.DevElement +import com.unciv.json.json import com.unciv.logic.files.UncivFiles +import com.unciv.models.metadata.GameSettings import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.fonts.FontFamilyData @@ -31,11 +34,13 @@ import java.awt.image.BufferedImage /** Creates a basic GDX application that mimics [UncivGame] as closely as possible, * starts up fast and shows one UI element, to be returned by [DevElement.createDevElement]. * - * * The parent will not size your Widget as the Gdx [Layout] contract promises, + * - The parent will not size your Widget as the Gdx [Layout] contract promises, * you'll need to do it yourself. E.g, if you're a [WidgetGroup], call [pack()][WidgetGroup.pack]. * If you forget, you'll see an orange dot in the window center. - * * Resizing the window is not supported. You might lose interactivity. - * * The middle mouse button toggles Scene2D debug mode, like the full game offers in the Debug Options. + * - Resizing the window is not supported. You might lose interactivity. + * - However, settings including window size are saved separately from main Unciv, so you **can** test with different sizes. + * - Language is default English and there's no UI to change it - edit the settings file by hand, set once in the debugger, or hardcode in createDevElement if needed. + * - The middle mouse button toggles Scene2D debug mode, like the full game offers in the Debug Options. */ object FasterUIDevelopment { @@ -60,7 +65,7 @@ object FasterUIDevelopment { val config = Lwjgl3ApplicationConfiguration() - val settings = UncivFiles.getSettingsForPlatformLaunchers() + val settings = Settings.load() if (!settings.isFreshlyCreated) { val (width, height) = settings.windowState.coerceIn() config.setWindowedMode(width, height) @@ -77,7 +82,7 @@ object FasterUIDevelopment { Fonts.fontImplementation = FontDesktop() UncivGame.Current = game UncivGame.Current.files = UncivFiles(Gdx.files) - game.settings = UncivGame.Current.files.getGeneralSettings() + game.settings = Settings.load() ImageGetter.resetAtlases() ImageGetter.reloadImages() BaseScreen.setSkin() @@ -88,6 +93,27 @@ object FasterUIDevelopment { override fun render() { game.render() } + + override fun pause() { + Settings.save(UncivGame.Current.settings) + super.pause() + } + } + + /** Persist window size over invocations, but separately from main Unciv */ + private object Settings { + const val SETTINGS_FILE_NAME = "FasterUIDevSettings.json" + val file: FileHandle = FileHandle(".").child(SETTINGS_FILE_NAME) + fun load(): GameSettings { + if (!file.exists()) return GameSettings().apply { isFreshlyCreated = true } + return json().fromJson(GameSettings::class.java, file) + } + fun save(settings: GameSettings) { + settings.isFreshlyCreated = false + // settings.refreshWindowSize() - No, we don't have the platform-dependent helpers initialized + settings.windowState = GameSettings.WindowState.current() + file.writeString(json().toJson(settings), false, Charsets.UTF_8.name()) + } } class UIDevScreen : BaseScreen() {