diff --git a/android/Images.Construction/BuildingIcons/Pyramid.png b/android/Images.Construction/BuildingIcons/Pyramid.png new file mode 100644 index 0000000000..bb2fe28909 Binary files /dev/null and b/android/Images.Construction/BuildingIcons/Pyramid.png differ diff --git a/android/Images.Construction/MayaCalendar/0.png b/android/Images.Construction/MayaCalendar/0.png new file mode 100644 index 0000000000..53a17cca04 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/0.png differ diff --git a/android/Images.Construction/MayaCalendar/1.png b/android/Images.Construction/MayaCalendar/1.png new file mode 100644 index 0000000000..80f0067efc Binary files /dev/null and b/android/Images.Construction/MayaCalendar/1.png differ diff --git a/android/Images.Construction/MayaCalendar/10.png b/android/Images.Construction/MayaCalendar/10.png new file mode 100644 index 0000000000..68981c5e30 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/10.png differ diff --git a/android/Images.Construction/MayaCalendar/11.png b/android/Images.Construction/MayaCalendar/11.png new file mode 100644 index 0000000000..1953d4a5d3 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/11.png differ diff --git a/android/Images.Construction/MayaCalendar/12.png b/android/Images.Construction/MayaCalendar/12.png new file mode 100644 index 0000000000..43ae5ed1b0 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/12.png differ diff --git a/android/Images.Construction/MayaCalendar/13.png b/android/Images.Construction/MayaCalendar/13.png new file mode 100644 index 0000000000..c2d7205fb3 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/13.png differ diff --git a/android/Images.Construction/MayaCalendar/14.png b/android/Images.Construction/MayaCalendar/14.png new file mode 100644 index 0000000000..84ada18338 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/14.png differ diff --git a/android/Images.Construction/MayaCalendar/15.png b/android/Images.Construction/MayaCalendar/15.png new file mode 100644 index 0000000000..49ec2bdd87 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/15.png differ diff --git a/android/Images.Construction/MayaCalendar/16.png b/android/Images.Construction/MayaCalendar/16.png new file mode 100644 index 0000000000..52a9501b1c Binary files /dev/null and b/android/Images.Construction/MayaCalendar/16.png differ diff --git a/android/Images.Construction/MayaCalendar/17.png b/android/Images.Construction/MayaCalendar/17.png new file mode 100644 index 0000000000..643c1a56e8 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/17.png differ diff --git a/android/Images.Construction/MayaCalendar/18.png b/android/Images.Construction/MayaCalendar/18.png new file mode 100644 index 0000000000..aea4a3ea3d Binary files /dev/null and b/android/Images.Construction/MayaCalendar/18.png differ diff --git a/android/Images.Construction/MayaCalendar/19.png b/android/Images.Construction/MayaCalendar/19.png new file mode 100644 index 0000000000..51c1ced58e Binary files /dev/null and b/android/Images.Construction/MayaCalendar/19.png differ diff --git a/android/Images.Construction/MayaCalendar/2.png b/android/Images.Construction/MayaCalendar/2.png new file mode 100644 index 0000000000..b072f102bc Binary files /dev/null and b/android/Images.Construction/MayaCalendar/2.png differ diff --git a/android/Images.Construction/MayaCalendar/3.png b/android/Images.Construction/MayaCalendar/3.png new file mode 100644 index 0000000000..f7a204ded0 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/3.png differ diff --git a/android/Images.Construction/MayaCalendar/4.png b/android/Images.Construction/MayaCalendar/4.png new file mode 100644 index 0000000000..eeeb90f438 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/4.png differ diff --git a/android/Images.Construction/MayaCalendar/5.png b/android/Images.Construction/MayaCalendar/5.png new file mode 100644 index 0000000000..cc1435eaae Binary files /dev/null and b/android/Images.Construction/MayaCalendar/5.png differ diff --git a/android/Images.Construction/MayaCalendar/6.png b/android/Images.Construction/MayaCalendar/6.png new file mode 100644 index 0000000000..8d86f35dd4 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/6.png differ diff --git a/android/Images.Construction/MayaCalendar/7.png b/android/Images.Construction/MayaCalendar/7.png new file mode 100644 index 0000000000..6fff8cef21 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/7.png differ diff --git a/android/Images.Construction/MayaCalendar/8.png b/android/Images.Construction/MayaCalendar/8.png new file mode 100644 index 0000000000..b4a9021bf6 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/8.png differ diff --git a/android/Images.Construction/MayaCalendar/9.png b/android/Images.Construction/MayaCalendar/9.png new file mode 100644 index 0000000000..c11fe41be1 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/9.png differ diff --git a/android/Images.Construction/MayaCalendar/Baktun.png b/android/Images.Construction/MayaCalendar/Baktun.png new file mode 100644 index 0000000000..053ff0fbbc Binary files /dev/null and b/android/Images.Construction/MayaCalendar/Baktun.png differ diff --git a/android/Images.Construction/MayaCalendar/Katun.png b/android/Images.Construction/MayaCalendar/Katun.png new file mode 100644 index 0000000000..45bc882c5d Binary files /dev/null and b/android/Images.Construction/MayaCalendar/Katun.png differ diff --git a/android/Images.Construction/MayaCalendar/Maya.png b/android/Images.Construction/MayaCalendar/Maya.png new file mode 100644 index 0000000000..cb680ac6b5 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/Maya.png differ diff --git a/android/Images.Construction/MayaCalendar/Tun.png b/android/Images.Construction/MayaCalendar/Tun.png new file mode 100644 index 0000000000..3493850ec1 Binary files /dev/null and b/android/Images.Construction/MayaCalendar/Tun.png differ diff --git a/android/Images.Construction/UnitIcons/Atlatlist.png b/android/Images.Construction/UnitIcons/Atlatlist.png new file mode 100644 index 0000000000..bc77149e1f Binary files /dev/null and b/android/Images.Construction/UnitIcons/Atlatlist.png differ diff --git a/android/Images/NationIcons/The Maya.png b/android/Images/NationIcons/The Maya.png new file mode 100644 index 0000000000..3f7952aa30 Binary files /dev/null and b/android/Images/NationIcons/The Maya.png differ diff --git a/android/Images/OtherIcons/CityState.png b/android/Images/OtherIcons/CityState.png new file mode 100644 index 0000000000..b5f0f0ceba Binary files /dev/null and b/android/Images/OtherIcons/CityState.png differ diff --git a/android/assets/Construction.atlas b/android/assets/Construction.atlas index 23e120e645..e074b76eee 100644 --- a/android/assets/Construction.atlas +++ b/android/assets/Construction.atlas @@ -6,1687 +6,1869 @@ filter: MipMapLinearLinear, MipMapLinearLinear repeat: none BuildingIcons/Alhambra rotate: false - xy: 4, 1732 + xy: 4, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Amphitheater rotate: false - xy: 112, 1840 + xy: 112, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Angkor Wat rotate: false - xy: 4, 1624 + xy: 4, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Apollo Program rotate: false - xy: 4, 1516 + xy: 4, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Aqueduct rotate: false - xy: 112, 1624 + xy: 112, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Armory rotate: false - xy: 328, 1840 + xy: 328, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Arsenal rotate: false - xy: 4, 1408 + xy: 4, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bank rotate: false - xy: 4, 1300 + xy: 112, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Barracks rotate: false - xy: 112, 1408 + xy: 220, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bazaar rotate: false - xy: 436, 1732 + xy: 544, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Big Ben rotate: false - xy: 4, 1192 + xy: 112, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Bomb Shelter rotate: false - xy: 112, 1300 + xy: 220, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Brandenburg Gate rotate: false - xy: 436, 1624 + xy: 544, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Broadcast Tower rotate: false - xy: 544, 1732 + xy: 652, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Burial Tomb rotate: false - xy: 4, 1084 + xy: 112, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/CN Tower rotate: false - xy: 112, 1192 + xy: 220, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Castle rotate: false - xy: 760, 1840 + xy: 4, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Cathedral rotate: false - xy: 220, 1192 + xy: 328, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Ceilidh Hall rotate: false - xy: 436, 1408 + xy: 544, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Chichen Itza rotate: false - xy: 652, 1624 + xy: 760, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Circus rotate: false - xy: 868, 1840 + xy: 4, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Circus Maximus rotate: false - xy: 4, 868 + xy: 112, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Coffee House rotate: false - xy: 112, 976 + xy: 220, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colosseum rotate: false - xy: 220, 1084 + xy: 328, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colossus rotate: false - xy: 328, 1192 + xy: 436, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Courthouse rotate: false - xy: 868, 1732 + xy: 976, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Cristo Redentor rotate: false - xy: 976, 1840 + xy: 4, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Eiffel Tower rotate: false - xy: 328, 1084 + xy: 436, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Factory rotate: false - xy: 436, 1192 + xy: 544, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Floating Gardens rotate: false - xy: 652, 1408 + xy: 760, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forbidden Palace rotate: false - xy: 760, 1516 + xy: 868, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forge rotate: false - xy: 976, 1732 + xy: 1084, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Garden rotate: false - xy: 112, 760 + xy: 220, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Granary rotate: false - xy: 436, 1084 + xy: 544, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Grand Temple rotate: false - xy: 544, 1192 + xy: 652, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Great Mosque of Djenne rotate: false - xy: 1084, 1732 + xy: 1192, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Great Wall rotate: false - xy: 112, 652 + xy: 220, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hagia Sophia rotate: false - xy: 544, 1084 + xy: 652, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hanging Gardens rotate: false - xy: 760, 1300 + xy: 868, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hanse rotate: false - xy: 868, 1414 + xy: 976, 1580 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Harbor rotate: false - xy: 976, 1516 + xy: 1084, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hermitage rotate: false - xy: 1192, 1732 + xy: 1300, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Heroic Epic rotate: false - xy: 1300, 1840 + xy: 4, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Himeji Castle rotate: false - xy: 4, 436 + xy: 112, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hospital rotate: false - xy: 436, 868 + xy: 544, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hubble Space Telescope rotate: false - xy: 544, 976 + xy: 652, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hydro Plant rotate: false - xy: 868, 1306 + xy: 976, 1472 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Ironworks rotate: false - xy: 1300, 1732 + xy: 1408, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Kremlin rotate: false - xy: 544, 868 + xy: 652, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Krepost rotate: false - xy: 652, 976 + xy: 760, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Leaning Tower of Pisa rotate: false - xy: 1084, 1408 + xy: 1192, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Library rotate: false - xy: 1300, 1624 + xy: 1408, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Lighthouse rotate: false - xy: 1408, 1732 + xy: 1516, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Longhouse rotate: false - xy: 4, 220 + xy: 112, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Machu Picchu rotate: false - xy: 328, 544 + xy: 436, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Manhattan Project rotate: false - xy: 544, 760 + xy: 652, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Market rotate: false - xy: 868, 1090 + xy: 976, 1256 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mausoleum of Halicarnassus rotate: false - xy: 976, 1192 + xy: 1084, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Medical Lab rotate: false - xy: 1192, 1408 + xy: 1300, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Military Academy rotate: false - xy: 1408, 1624 + xy: 1516, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Military Base rotate: false - xy: 1516, 1732 + xy: 1624, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mint rotate: false - xy: 1624, 1840 + xy: 4, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monastery rotate: false - xy: 652, 760 + xy: 760, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monument rotate: false - xy: 760, 868 + xy: 868, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mosque rotate: false - xy: 868, 982 + xy: 976, 1148 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mud Pyramid Mosque rotate: false - xy: 976, 1084 + xy: 1084, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mughal Fort rotate: false - xy: 1084, 1192 + xy: 1192, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Museum rotate: false - xy: 1192, 1300 + xy: 1300, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National College rotate: false - xy: 1624, 1732 + xy: 1732, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National Epic rotate: false - xy: 1732, 1840 + xy: 4, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National Treasury rotate: false - xy: 4, 4 + xy: 112, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Neuschwanstein rotate: false - xy: 112, 112 + xy: 220, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Notre Dame rotate: false - xy: 328, 328 + xy: 436, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Nuclear Plant rotate: false - xy: 544, 544 + xy: 652, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Observatory rotate: false - xy: 760, 760 + xy: 868, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Opera House rotate: false - xy: 868, 874 + xy: 976, 1040 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Oxford University rotate: false - xy: 976, 976 + xy: 1084, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pagoda rotate: false - xy: 1084, 1084 + xy: 1192, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Palace rotate: false - xy: 1192, 1192 + xy: 1300, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Paper Maker rotate: false - xy: 1408, 1409 + xy: 1516, 1575 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pentagon rotate: false - xy: 1624, 1624 + xy: 1732, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Petra rotate: false - xy: 1840, 1840 + xy: 112, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Porcelain Tower rotate: false - xy: 328, 220 + xy: 436, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Public School rotate: false - xy: 544, 436 + xy: 652, 602 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +BuildingIcons/Pyramid + rotate: false + xy: 760, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Research Lab rotate: false - xy: 760, 652 + xy: 976, 932 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Booster rotate: false - xy: 1084, 976 + xy: 1300, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Cockpit rotate: false - xy: 1192, 1084 + xy: 1408, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Engine rotate: false - xy: 1300, 1192 + xy: 1516, 1467 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Stasis Chamber rotate: false - xy: 1408, 1301 + xy: 1624, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Satrap's Court rotate: false - xy: 1624, 1516 + xy: 1840, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Seaport rotate: false - xy: 220, 4 + xy: 436, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Shrine rotate: false - xy: 544, 328 + xy: 760, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sistine Chapel rotate: false - xy: 760, 544 + xy: 976, 824 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Solar Plant rotate: false - xy: 976, 760 + xy: 1192, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Spaceship Factory rotate: false - xy: 1084, 868 + xy: 1300, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stable rotate: false - xy: 1300, 1084 + xy: 1516, 1359 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stadium rotate: false - xy: 1408, 1193 + xy: 1624, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Liberty rotate: false - xy: 1516, 1300 + xy: 1732, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Zeus rotate: false - xy: 1624, 1408 + xy: 1840, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stele rotate: false - xy: 1840, 1624 + xy: 436, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stock Exchange rotate: false - xy: 328, 4 + xy: 544, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stone Works rotate: false - xy: 436, 112 + xy: 652, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stonehenge rotate: false - xy: 544, 220 + xy: 760, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sydney Opera House rotate: false - xy: 868, 550 + xy: 1084, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Taj Mahal rotate: false - xy: 976, 652 + xy: 1192, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple rotate: false - xy: 1192, 868 + xy: 1408, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple of Artemis rotate: false - xy: 1300, 976 + xy: 1516, 1251 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Terracotta Army rotate: false - xy: 1516, 1192 + xy: 1732, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Library rotate: false - xy: 1624, 1300 + xy: 1840, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Lighthouse rotate: false - xy: 1732, 1408 + xy: 436, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Louvre rotate: false - xy: 1840, 1516 + xy: 544, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Oracle rotate: false - xy: 436, 4 + xy: 652, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Pyramids rotate: false - xy: 544, 112 + xy: 760, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Theatre rotate: false - xy: 652, 220 + xy: 868, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/United Nations rotate: false - xy: 1192, 760 + xy: 1408, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/University rotate: false - xy: 1300, 868 + xy: 1516, 1143 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Utopia Project rotate: false - xy: 1408, 977 + xy: 1624, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls rotate: false - xy: 1516, 1084 + xy: 1732, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls of Babylon rotate: false - xy: 1624, 1192 + xy: 1840, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Wat rotate: false - xy: 652, 112 + xy: 868, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Water Mill rotate: false - xy: 760, 220 + xy: 976, 500 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Windmill rotate: false - xy: 868, 334 + xy: 1084, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Workshop rotate: false - xy: 1192, 652 + xy: 1408, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 +MayaCalendar/0 + rotate: false + xy: 1516, 977 + size: 25, 50 + orig: 25, 50 + offset: 0, 0 + index: -1 +MayaCalendar/1 + rotate: false + xy: 1790, 1300 + size: 13, 50 + orig: 13, 50 + offset: 0, 0 + index: -1 +MayaCalendar/10 + rotate: false + xy: 1682, 1192 + size: 21, 50 + orig: 21, 50 + offset: 0, 0 + index: -1 +MayaCalendar/11 + rotate: false + xy: 976, 442 + size: 35, 50 + orig: 35, 50 + offset: 0, 0 + index: -1 +MayaCalendar/12 + rotate: false + xy: 1084, 544 + size: 35, 50 + orig: 35, 50 + offset: 0, 0 + index: -1 +MayaCalendar/13 + rotate: false + xy: 1192, 651 + size: 35, 50 + orig: 35, 50 + offset: 0, 0 + index: -1 +MayaCalendar/14 + rotate: false + xy: 1300, 760 + size: 35, 50 + orig: 35, 50 + offset: 0, 0 + index: -1 +MayaCalendar/15 + rotate: false + xy: 1408, 868 + size: 30, 50 + orig: 30, 50 + offset: 0, 0 + index: -1 +MayaCalendar/16 + rotate: false + xy: 1840, 1408 + size: 40, 50 + orig: 40, 50 + offset: 0, 0 + index: -1 +MayaCalendar/17 + rotate: false + xy: 652, 112 + size: 40, 50 + orig: 40, 50 + offset: 0, 0 + index: -1 +MayaCalendar/18 + rotate: false + xy: 760, 220 + size: 40, 50 + orig: 40, 50 + offset: 0, 0 + index: -1 +MayaCalendar/19 + rotate: false + xy: 868, 328 + size: 40, 50 + orig: 40, 50 + offset: 0, 0 + index: -1 +MayaCalendar/2 + rotate: false + xy: 1888, 1408 + size: 13, 50 + orig: 13, 50 + offset: 0, 0 + index: -1 +MayaCalendar/3 + rotate: false + xy: 700, 112 + size: 13, 50 + orig: 13, 50 + offset: 0, 0 + index: -1 +MayaCalendar/4 + rotate: false + xy: 808, 220 + size: 13, 50 + orig: 13, 50 + offset: 0, 0 + index: -1 +MayaCalendar/5 + rotate: false + xy: 916, 328 + size: 10, 50 + orig: 10, 50 + offset: 0, 0 + index: -1 +MayaCalendar/6 + rotate: false + xy: 62, 4 + size: 25, 50 + orig: 25, 50 + offset: 0, 0 + index: -1 +MayaCalendar/7 + rotate: false + xy: 1948, 1890 + size: 25, 50 + orig: 25, 50 + offset: 0, 0 + index: -1 +MayaCalendar/8 + rotate: false + xy: 2006, 1948 + size: 25, 50 + orig: 25, 50 + offset: 0, 0 + index: -1 +MayaCalendar/9 + rotate: false + xy: 1624, 1134 + size: 25, 50 + orig: 25, 50 + offset: 0, 0 + index: -1 +MayaCalendar/Baktun + rotate: false + xy: 4, 4 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +MayaCalendar/Katun + rotate: false + xy: 1948, 1948 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +MayaCalendar/Maya + rotate: false + xy: 1624, 1192 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +MayaCalendar/Tun + rotate: false + xy: 1732, 1300 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 UnitIcons/African Forest Elephant rotate: false - xy: 4, 1840 + xy: 4, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Anti-Aircraft Gun rotate: false - xy: 112, 1732 + xy: 112, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Anti-Tank Gun rotate: false - xy: 220, 1840 + xy: 220, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Archer rotate: false - xy: 220, 1732 + xy: 220, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Artillery rotate: false - xy: 112, 1516 + xy: 112, 1574 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitIcons/Atlatlist + rotate: false + xy: 220, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Atomic Bomb rotate: false - xy: 220, 1624 + xy: 328, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/B17 rotate: false - xy: 328, 1732 + xy: 436, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ballista rotate: false - xy: 436, 1840 + xy: 4, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Battering Ram rotate: false - xy: 220, 1516 + xy: 328, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Battleship rotate: false - xy: 328, 1624 + xy: 436, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Berserker rotate: false - xy: 544, 1840 + xy: 4, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Bomber rotate: false - xy: 220, 1408 + xy: 328, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Bowman rotate: false - xy: 328, 1516 + xy: 436, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Brute rotate: false - xy: 652, 1840 + xy: 4, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Camel Archer rotate: false - xy: 220, 1300 + xy: 328, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cannon rotate: false - xy: 328, 1408 + xy: 436, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Caravel rotate: false - xy: 436, 1516 + xy: 544, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Carolean rotate: false - xy: 544, 1624 + xy: 652, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Carrier rotate: false - xy: 652, 1732 + xy: 760, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cataphract rotate: false - xy: 4, 976 + xy: 112, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Catapult rotate: false - xy: 112, 1084 + xy: 220, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cavalry rotate: false - xy: 328, 1300 + xy: 436, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Chariot Archer rotate: false - xy: 544, 1516 + xy: 652, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Chu-Ko-Nu rotate: false - xy: 760, 1732 + xy: 868, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Companion Cavalry rotate: false - xy: 436, 1300 + xy: 544, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Composite Bowman rotate: false - xy: 544, 1408 + xy: 652, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Conquistador rotate: false - xy: 652, 1516 + xy: 760, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Cossack rotate: false - xy: 760, 1624 + xy: 868, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Crossbowman rotate: false - xy: 4, 760 + xy: 112, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Destroyer rotate: false - xy: 112, 868 + xy: 220, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Dromon rotate: false - xy: 220, 976 + xy: 328, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Fighter rotate: false - xy: 544, 1300 + xy: 652, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Foreign Legion rotate: false - xy: 868, 1624 + xy: 976, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Frigate rotate: false - xy: 1084, 1840 + xy: 4, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Galleass rotate: false - xy: 4, 652 + xy: 112, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Gatling Gun rotate: false - xy: 220, 868 + xy: 328, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Giant Death Robot rotate: false - xy: 328, 976 + xy: 436, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Artist rotate: false - xy: 652, 1300 + xy: 760, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Engineer rotate: false - xy: 760, 1408 + xy: 868, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great General rotate: false - xy: 868, 1522 + xy: 976, 1688 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitIcons/Great Merchant rotate: false - xy: 976, 1624 + xy: 1084, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Prophet rotate: false - xy: 1192, 1840 + xy: 4, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Scientist rotate: false - xy: 4, 544 + xy: 112, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great War Bomber rotate: false - xy: 220, 760 + xy: 328, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great War Infantry rotate: false - xy: 328, 868 + xy: 436, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Guided Missile rotate: false - xy: 436, 976 + xy: 544, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hakkapeliitta rotate: false - xy: 652, 1192 + xy: 760, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Helicopter Gunship rotate: false - xy: 1084, 1624 + xy: 1192, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hoplite rotate: false - xy: 112, 544 + xy: 220, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Horse Archer rotate: false - xy: 220, 652 + xy: 328, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Horseman rotate: false - xy: 328, 760 + xy: 436, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hussar rotate: false - xy: 652, 1084 + xy: 760, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hwach'a rotate: false - xy: 760, 1192 + xy: 868, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Infantry rotate: false - xy: 976, 1408 + xy: 1084, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Inquisitor rotate: false - xy: 1084, 1516 + xy: 1192, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ironclad rotate: false - xy: 1192, 1624 + xy: 1300, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Jaguar rotate: false - xy: 1408, 1840 + xy: 4, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Janissary rotate: false - xy: 4, 328 + xy: 112, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Jet Fighter rotate: false - xy: 112, 436 + xy: 220, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Keshik rotate: false - xy: 220, 544 + xy: 328, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Khan rotate: false - xy: 328, 652 + xy: 436, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Knight rotate: false - xy: 436, 760 + xy: 544, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Lancer rotate: false - xy: 760, 1084 + xy: 868, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Landship rotate: false - xy: 868, 1198 + xy: 976, 1364 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Landsknecht rotate: false - xy: 976, 1300 + xy: 1084, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Legion rotate: false - xy: 1192, 1516 + xy: 1300, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longbowman rotate: false - xy: 1516, 1840 + xy: 4, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longswordsman rotate: false - xy: 112, 328 + xy: 220, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Machine Gun rotate: false - xy: 220, 436 + xy: 328, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mandekalu Cavalry rotate: false - xy: 436, 652 + xy: 544, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Maori Warrior rotate: false - xy: 652, 868 + xy: 760, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Marine rotate: false - xy: 760, 976 + xy: 868, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mechanized Infantry rotate: false - xy: 1084, 1300 + xy: 1192, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mehal Sefari rotate: false - xy: 1300, 1516 + xy: 1408, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Minuteman rotate: false - xy: 4, 112 + xy: 112, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Missile Cruiser rotate: false - xy: 112, 220 + xy: 220, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Missionary rotate: false - xy: 220, 328 + xy: 328, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mobile SAM rotate: false - xy: 328, 436 + xy: 436, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Modern Armor rotate: false - xy: 436, 544 + xy: 544, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mohawk Warrior rotate: false - xy: 544, 652 + xy: 652, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Musketeer rotate: false - xy: 1300, 1408 + xy: 1408, 1574 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Musketman rotate: false - xy: 1408, 1517 + xy: 1516, 1683 size: 100, 99 orig: 100, 99 offset: 0, 0 index: -1 UnitIcons/Naresuan's Elephant rotate: false - xy: 1516, 1624 + xy: 1624, 1790 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Norwegian Ski Infantry rotate: false - xy: 220, 220 + xy: 328, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Nuclear Missile rotate: false - xy: 436, 436 + xy: 544, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Nuclear Submarine rotate: false - xy: 652, 652 + xy: 760, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Panzer rotate: false - xy: 1300, 1300 + xy: 1408, 1466 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Paratrooper rotate: false - xy: 1516, 1516 + xy: 1624, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Persian Immortal rotate: false - xy: 1732, 1732 + xy: 1840, 1898 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Pictish Warrior rotate: false - xy: 112, 4 + xy: 220, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Pikeman rotate: false - xy: 220, 112 + xy: 328, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Privateer rotate: false - xy: 436, 328 + xy: 544, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Quinquereme rotate: false - xy: 652, 544 + xy: 868, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rifleman rotate: false - xy: 868, 766 + xy: 1084, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rocket Artillery rotate: false - xy: 976, 868 + xy: 1192, 1142 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Samurai rotate: false - xy: 1516, 1408 + xy: 1732, 1682 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Scout rotate: false - xy: 1732, 1624 + xy: 220, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Sea Beggar rotate: false - xy: 1840, 1732 + xy: 328, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Settler rotate: false - xy: 328, 112 + xy: 544, 386 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ship of the Line rotate: false - xy: 436, 220 + xy: 652, 494 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Sipahi rotate: false - xy: 652, 436 + xy: 868, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Slinger rotate: false - xy: 868, 658 + xy: 1084, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Spearman rotate: false - xy: 1192, 976 + xy: 1408, 1250 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Stealth Bomber rotate: false - xy: 1732, 1516 + xy: 328, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Submarine rotate: false - xy: 652, 328 + xy: 868, 602 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Swordsman rotate: false - xy: 760, 436 + xy: 976, 716 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tank rotate: false - xy: 1084, 760 + xy: 1300, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tercio rotate: false - xy: 1408, 1085 + xy: 1624, 1358 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trebuchet rotate: false - xy: 760, 328 + xy: 976, 608 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Triplane rotate: false - xy: 868, 442 + xy: 1084, 710 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trireme rotate: false - xy: 976, 543 + xy: 1192, 817 size: 100, 101 orig: 100, 101 offset: 0, 0 index: -1 UnitIcons/Turtle Ship rotate: false - xy: 1084, 652 + xy: 1300, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/War Chariot rotate: false - xy: 1732, 1300 + xy: 544, 62 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/War Elephant rotate: false - xy: 1840, 1408 + xy: 652, 170 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Warrior rotate: false - xy: 544, 4 + xy: 760, 278 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Work Boats rotate: false - xy: 976, 435 + xy: 1192, 709 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Worker rotate: false - xy: 1084, 544 + xy: 1300, 818 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Zero rotate: false - xy: 1300, 760 + xy: 1516, 1035 size: 100, 100 orig: 100, 100 offset: 0, 0 diff --git a/android/assets/Construction.png b/android/assets/Construction.png index fb8e207e2c..5af50799fe 100644 Binary files a/android/assets/Construction.png and b/android/assets/Construction.png differ diff --git a/android/assets/jsons/Civ V - Vanilla/Buildings.json b/android/assets/jsons/Civ V - Vanilla/Buildings.json index df852bb6a8..0466422a66 100644 --- a/android/assets/jsons/Civ V - Vanilla/Buildings.json +++ b/android/assets/jsons/Civ V - Vanilla/Buildings.json @@ -51,6 +51,17 @@ "requiredTech": "Pottery", "uniques": ["Hidden when religion is disabled"] }, + { + "name": "Pyramid", + "replaces": "Shrine", + "uniqueTo": "The Maya", + "faith": 2, + "science": 2, + "cost": 40, + "maintenance": 1, + "requiredTech": "Pottery", + "uniques": ["Hidden when religion is disabled"] + }, { "name": "Temple of Artemis", "culture": 1, diff --git a/android/assets/jsons/Civ V - Vanilla/Nations.json b/android/assets/jsons/Civ V - Vanilla/Nations.json index da74e7969a..c52fe41988 100644 --- a/android/assets/jsons/Civ V - Vanilla/Nations.json +++ b/android/assets/jsons/Civ V - Vanilla/Nations.json @@ -932,6 +932,48 @@ "Nekemte","Asella","Dila","Adigrat","Debre Markos","Kombolcha","Debre Tabor","Sebeta", "Shire","Ambo","Negele Arsi","Gambela","Ziway","Weldiya"] }, + { + "name": "The Maya", + "leaderName": "Pacal", + "adjective": ["mayan"], + "startBias": ["Jungle"], + "preferredVictoryType": "Scientific", + + "startIntroPart1": "Your people kneel before you, exalted King Pacal the Great, favored son of the gods and shield to the citizens of the Palenque domain. After years of strife at the hands of your neighboring rivals, you struck back at the enemies of your people, sacrificing their leaders in retribution for the insults dealt to your predecessors. The glory of Palenque was restored only by the guidance afforded by your wisdom, as you orchestrated vast reconstruction efforts within the city, creating some of the greatest monuments and architecture your people - and the world - have ever known.", + "startIntroPart2": "Illustrious King, your people once again look to you for leadership and counsel in the coming days. Will you channel the will of the gods and restore your once proud kingdom to its greatest heights? Will you build new monuments to forever enshrine the memories of your people? Can you build a civilization that will stand the test of time?", + + "declaringWar": "A sacrifice unlike all others must be made!", + "attacked": "Muahahahahahaha!", + "defeated": "Today comes a great searing pain. With you comes the path to the black storm.", + "introduction": "Greetings, wayward one. I am known as Pacal.", + "tradeRequest": "Friend, I believe I may have found a way to save us all! Look, look and accept my offering!", + + "neutralHello": "A fine day, it helps you.", +/* Not used by Unciv, and uncertain + "afterPeace": "", + + "neutralLetsHearIt": ["If you must show me."], + "neutralNo": ["No no, too much trouble.","No!","Not good enough."], + "neutralYes": ["Okay.","Fine.","Accepted."], + + "hateHello": "You.", + "hateLetsHearIt": ["Talk.","So?","Speak!"], + "hateNo": ["That's unacceptable!","A thousand times no!","Never!"], + "hateYes": ["Oh… Fine, okay."], +*/ + "outerColor": [198,141,99], // color picker: cf9f75 + "innerColor": [24,63,66], // color picker: 1f4a4d + "favoredReligion": "Christianity", + "uniqueName": "The Long Count", + "uniques": ["Receive a free Great Person at the end of every [Maya Long Count calendar cycle] (every 394 years), after researching [Theology]. Each bonus person can only be chosen once.", + "Once The Long Count activates, the year on the world screen displays as the traditional Mayan Long Count."], + // Parameters: tech, comment, amount, comment. Compare "Free [Great General] appears" as used by policies + "cities": ["Palenque","Tikal","Chichen Itza","Uxmal","Tulum","Copan","Coba","El Mirador","Calakmul", + "Edzna","Lamanai","Izapa","Uaxactun","Comalcalco","Piedras Negras","Cancuen","Yaxha","Quirigua", + "Q'umarkaj","Nakbe","Cerros","Xunantunich","Takalik Abaj","Cival","San Bartolo","Altar de Sacrificios","Seibal", + "Caracol","Naranjo","Dos Pilas","Mayapan","Ixinche","Zaculeu","Kabah"] + }, + // City-States sorted by cityStateType, name { diff --git a/android/assets/jsons/Civ V - Vanilla/Units.json b/android/assets/jsons/Civ V - Vanilla/Units.json index 9c64803187..754f2da5ed 100644 --- a/android/assets/jsons/Civ V - Vanilla/Units.json +++ b/android/assets/jsons/Civ V - Vanilla/Units.json @@ -124,6 +124,20 @@ "promotions": ["Slinger Withdraw"], "attackSound": "arrow" }, + { + "name": "Atlatlist", + "unitType": "Archery", + "movement": 2, + "strength": 5, + "rangedStrength": 7, + "cost": 36, + "requiredTech": "Agriculture", + "obsoleteTech": "Machinery", + "replaces": "Archer", + "uniqueTo": "The Maya", + "upgradesTo": "Composite Bowman", + "attackSound": "arrow" + }, /* { "name": "Archer", diff --git a/android/assets/jsons/Tutorials.json b/android/assets/jsons/Tutorials.json index ab55fa14f9..1ec3412cfb 100644 --- a/android/assets/jsons/Tutorials.json +++ b/android/assets/jsons/Tutorials.json @@ -195,7 +195,7 @@ "The religion a city follows depends on the total pressure each religion has within the city.", "Followers are allocated in the same proportions as these pressures, and these followers can be viewed in the city screen.", "Based on this, you can get a feel for which religions have a lot of pressure built up in the city, and which have almost none.", - "The city follows a religion if a majority of its population follows that religion, and will only then receive the effects of Follower and Pantheon beliefs of that religion.", + "The city follows a religion if a majority of its population follows that religion, and will only then receive the effects of Follower and Pantheon beliefs of that religion." ], "Spreading_Religion": [ "Spreading religion happens naturally, but can be sped up using missionaries or great prophets.", @@ -213,8 +213,7 @@ "This pressure can also be seen in the city screen, and gives you an idea of how religions in your cities will evolve if you don't do anything.", "Holy cities also provide +30 pressure of the religion founded there to themselves, making it very difficult to effectively convert a holy city.", "Lastly, before founding a religion, new cities you settle will start with 200 pressure for your pantheon.", - "This way, all your cities will starting following your pantheon as long as you haven't founded a religion yet.", - + "This way, all your cities will starting following your pantheon as long as you haven't founded a religion yet." ], "Inquisitors": [ "Inquisitors are the last religious unit, and their strength is removing other religions.", @@ -222,5 +221,12 @@ "Great prophets also have this ability, and remove all other religions in the city when spreading their religion.", "Often this results in the city immediately converting to their religion", "Additionally, when an inquisitor is stationed in or directly next to a city center, units of other religions cannot spread their faith there, though natural spread is uneffected." + ], + "Maya_Long_Count_calendar_cycle": [ + "The Mayan unique ability, 'The Long Count', comes with a side effect:", + "Once active, the game's year display will use mayan notation.", + "", + "The Maya measured time in days from what we would call 11th of August, 3114 BCE. A day is called K'in, 20 days are a Winal, 18 Winals are a Tun, 20 Tuns are a K'atun, 20 K'atuns are a B'ak'tun, 20 B'ak'tuns a Piktun, and so on.", + "Unciv only displays ය B'ak'tuns, ඹ K'atuns and ම Tuns (from left to right) since that is enough to approximate gregorian calendar years. The Maya numerals are pretty obvious to understand. Have fun deciphering them!" ] } diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index e821ae4bf7..d894d3d363 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -624,6 +624,9 @@ You gained [Stats] as your religion was spread to [cityName] = You gained [Stats] as your religion was spread to an unknown city = Your city [cityName] was converted to [religionName]! = Your [unitName] lost its faith after spending too long inside enemy territory! = +You have unlocked [ability] = +A new b'ak'tun has just begun! = +A Great Person joins you! = # World Screen UI @@ -715,6 +718,13 @@ Do you want to exit the game? = Start bias: = Avoid [terrain] = +# Maya calendar popup + +The Mayan Long Count = +Your scientists and theologians have devised a systematic approach to measuring long time spans - the Long Count. During the festivities whenever the current b'ak'tun ends, a Great Person will join you. = +While the rest of the world calls the current year [year], in the Maya Calendar that is: = +"[amount] b'ak'tun, [amount2] k'atun, [amount3] tun = + # City screen Exit city = diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 42c7da8e2d..4b0c493a52 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -18,10 +18,8 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache import com.unciv.ui.audio.MusicMood import com.unciv.ui.audio.MusicTrackChooserFlags -import com.unciv.models.ruleset.unit.BaseUnit import java.util.* -import kotlin.math.min -import kotlin.math.pow + class UncivShowableException(missingMods: String) : Exception(missingMods) @@ -150,6 +148,48 @@ class GameInfo { return gameParameters.religionEnabled } + private fun getEquivalentTurn(): Int { + val totalTurns = 500f * gameParameters.gameSpeed.modifier + val startPercent = ruleSet.eras[gameParameters.startingEra]!!.startPercent + return turns + ((totalTurns * startPercent).toInt() / 100) + } + private class YearsToTurn( + // enum class with lists for each value group potentially more efficient? + val toTurn: Int, + val yearInterval: Float + ) { + companion object { + // Best to initialize these once only + val marathon = listOf(YearsToTurn(100, 15f), YearsToTurn(400, 10f), YearsToTurn(570, 5f), YearsToTurn(771, 2f), YearsToTurn(900, 1f), YearsToTurn(1080, 0.5f), YearsToTurn(1344, 0.25f), YearsToTurn(1500, 0.083333f)) + val epic = listOf(YearsToTurn(140, 25f), YearsToTurn(230, 15f), YearsToTurn(270, 10f), YearsToTurn(360, 5f), YearsToTurn(430, 2f), YearsToTurn(530, 1f), YearsToTurn(1500, 0.5f)) + val standard = listOf(YearsToTurn(75, 40f), YearsToTurn(135, 25f), YearsToTurn(160, 20f), YearsToTurn(210, 10f), YearsToTurn(270, 5f), YearsToTurn(320, 2f), YearsToTurn(440, 1f), YearsToTurn(500, 0.5f)) + val quick = listOf(YearsToTurn(50, 60f), YearsToTurn(80, 40f), YearsToTurn(100, 30f), YearsToTurn(130, 20f), YearsToTurn(155, 10f), YearsToTurn(195, 5f), YearsToTurn(260, 2f), YearsToTurn(310, 1f)) + fun getList(gameSpeed: GameSpeed) = when (gameSpeed) { + GameSpeed.Marathon -> marathon + GameSpeed.Epic -> epic + GameSpeed.Standard -> standard + GameSpeed.Quick -> quick + } + } + } + + fun getYear(turnOffset: Int = 0): Int { + val turn = getEquivalentTurn() + turnOffset + val yearToTurnList = YearsToTurn.getList(gameParameters.gameSpeed) + var year: Float = -4000f + var i = 0 + var yearsPerTurn: Float + + // if macros are ever added to kotlin, this is one hell of a place for em' + while (i < turn) { + yearsPerTurn = yearToTurnList.firstOrNull { i < it.toTurn }?.yearInterval ?: 0.5f + year += yearsPerTurn + ++i + } + + return year.toInt() + } + //endregion //region State changing functions diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 75f32b5aa7..a096bdbab1 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -1,6 +1,7 @@ package com.unciv.logic.civilization import com.badlogic.gdx.math.Vector2 +import com.unciv.Constants import com.unciv.UncivGame import com.unciv.logic.GameInfo import com.unciv.logic.UncivShowableException @@ -25,6 +26,7 @@ import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.stats.Stat import com.unciv.models.stats.Stats import com.unciv.models.translations.tr +import com.unciv.ui.utils.MayaCalendar import com.unciv.ui.utils.toPercent import com.unciv.ui.victoryscreen.RankingType import java.util.* @@ -172,6 +174,9 @@ class CivilizationInfo { var totalCultureForContests = 0 var totalFaithForContests = 0 + @Transient + var hasLongCountDisplayUnique = false + constructor() constructor(civName: String) { @@ -623,8 +628,10 @@ class CivilizationInfo { fun getGreatPeople(): HashSet { val greatPeople = gameInfo.ruleSet.units.values.asSequence() - .filter { it.isGreatPerson() }.map { getEquivalentUnit(it.name) } - return if (!gameInfo.isReligionEnabled()) greatPeople.filter { !it.uniques.contains("Hidden when religion is disabled")}.toHashSet() + .filter { it.isGreatPerson() } + .map { getEquivalentUnit(it.name) } + return if (!gameInfo.isReligionEnabled()) + greatPeople.filter { !it.hasUnique(Constants.hiddenWithoutReligionUnique) }.toHashSet() else greatPeople.toHashSet() } @@ -634,6 +641,13 @@ class CivilizationInfo { fun isMinorCivAggressor() = numMinorCivsAttacked >= 2 fun isMinorCivWarmonger() = numMinorCivsAttacked >= 4 + fun isLongCountActive(): Boolean { + val unique = getMatchingUniques(UniqueType.MayanGainGreatPerson).firstOrNull() + ?: return false + return tech.isResearched(unique.params[1]) + } + fun isLongCountDisplay() = hasLongCountDisplayUnique && isLongCountActive() + //endregion //region state-changing functions @@ -701,6 +715,8 @@ class CivilizationInfo { if (lastEraForUnit != null) lastEraResourceUsedForUnit[resource] = lastEraForUnit } + + hasLongCountDisplayUnique = hasUnique(UniqueType.MayanCalendarDisplay) } fun updateSightAndResources() { @@ -729,6 +745,8 @@ class CivilizationInfo { val greatPerson = greatPeople.getNewGreatPerson() if (greatPerson != null && gameInfo.ruleSet.units.containsKey(greatPerson)) addUnit(greatPerson) religionManager.startTurn() + if (isLongCountActive()) + MayaCalendar.startTurnForMaya(this) } updateViewableTiles() // adds explored tiles so that the units will be able to perform automated actions better diff --git a/core/src/com/unciv/logic/civilization/GreatPersonManager.kt b/core/src/com/unciv/logic/civilization/GreatPersonManager.kt index ca9c38121c..f537f18950 100644 --- a/core/src/com/unciv/logic/civilization/GreatPersonManager.kt +++ b/core/src/com/unciv/logic/civilization/GreatPersonManager.kt @@ -1,8 +1,11 @@ package com.unciv.logic.civilization import com.unciv.models.Counter -import com.unciv.models.stats.Stat -import com.unciv.models.stats.Stats +import java.util.HashSet + +// todo: Great Admiral? +// todo: Free GP from policies and wonders should increase threshold according to the wiki +// todo: GP from Maya long count should increase threshold as well - implement together class GreatPersonManager { var pointsForNextGreatPerson = 100 @@ -11,7 +14,10 @@ class GreatPersonManager { var greatPersonPointsCounter = Counter() var greatGeneralPoints = 0 var freeGreatPeople = 0 - + /** Marks subset of [freeGreatPeople] as subject to maya ability restrictions (each only once untill all used) */ + var mayaLimitedFreeGP = 0 + /** Remaining candidates for maya ability - whenever empty refilled from all GP, starts out empty */ + var longCountGPPool = HashSet() fun clone(): GreatPersonManager { val toReturn = GreatPersonManager() @@ -20,12 +26,12 @@ class GreatPersonManager { toReturn.pointsForNextGreatPerson = pointsForNextGreatPerson toReturn.pointsForNextGreatGeneral = pointsForNextGreatGeneral toReturn.greatGeneralPoints = greatGeneralPoints + toReturn.mayaLimitedFreeGP = mayaLimitedFreeGP + toReturn.longCountGPPool = longCountGPPool.toHashSet() return toReturn } fun getNewGreatPerson(): String? { - val greatPerson: String? = null - if (greatGeneralPoints > pointsForNextGreatGeneral) { greatGeneralPoints -= pointsForNextGreatGeneral pointsForNextGreatGeneral += 50 @@ -39,7 +45,7 @@ class GreatPersonManager { return key } } - return greatPerson + return null } fun addGreatPersonPoints(greatPersonPointsForTurn: Counter) { diff --git a/core/src/com/unciv/logic/civilization/Notification.kt b/core/src/com/unciv/logic/civilization/Notification.kt index 9fd1162943..f4e653b6e8 100644 --- a/core/src/com/unciv/logic/civilization/Notification.kt +++ b/core/src/com/unciv/logic/civilization/Notification.kt @@ -3,11 +3,14 @@ package com.unciv.logic.civilization import com.badlogic.gdx.math.Vector2 import com.unciv.models.stats.Stat import com.unciv.ui.cityscreen.CityScreen +import com.unciv.ui.pickerscreens.PolicyPickerScreen import com.unciv.ui.pickerscreens.TechPickerScreen import com.unciv.ui.trade.DiplomacyScreen +import com.unciv.ui.utils.MayaCalendar import com.unciv.ui.worldscreen.WorldScreen object NotificationIcon { + // Remember: The typical white-on-transparency icon will not be visible on Notifications const val Culture = "StatIcons/Culture" const val Construction = "StatIcons/Production" const val Growth = "StatIcons/Population" @@ -21,7 +24,7 @@ object NotificationIcon { const val Citadel = "ImprovementIcons/Citadel" const val Happiness = "StatIcons/Happiness" const val Population = "StatIcons/Population" - const val CityState = "NationIcons/CityState" + const val CityState = "OtherIcons/CityState" const val Production = "StatIcons/Production" const val Food = "StatIcons/Food" const val Faith = "StatIcons/Faith" @@ -82,10 +85,18 @@ data class CityAction(val city: Vector2 = Vector2.Zero): NotificationAction { } } +/** enter diplomacy screen */ data class DiplomacyAction(val otherCivName: String = ""): NotificationAction { override fun execute(worldScreen: WorldScreen) { val screen = DiplomacyScreen(worldScreen.viewingCiv) screen.updateRightSide(worldScreen.gameInfo.getCivilization(otherCivName)) worldScreen.game.setScreen(screen) } -} \ No newline at end of file +} + +/** enter Maya Long Count popup */ +class MayaLongCountAction() : NotificationAction { + override fun execute(worldScreen: WorldScreen) { + MayaCalendar.openPopup(worldScreen, worldScreen.selectedCiv, worldScreen.gameInfo.getYear()) + } +} diff --git a/core/src/com/unciv/logic/civilization/TechManager.kt b/core/src/com/unciv/logic/civilization/TechManager.kt index 175a290796..5b32c5372a 100644 --- a/core/src/com/unciv/logic/civilization/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/TechManager.kt @@ -7,7 +7,9 @@ import com.unciv.logic.map.TileInfo import com.unciv.models.ruleset.unique.UniqueMap import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.tech.Technology +import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit +import com.unciv.ui.utils.MayaCalendar import com.unciv.ui.utils.toPercent import com.unciv.ui.utils.withItem import java.util.* @@ -310,6 +312,10 @@ class TechManager { if (unique.params[1] != techName) continue civInfo.addUnit(unique.params[0]) } + for (unique in civInfo.getMatchingUniques(UniqueType.MayanGainGreatPerson)) { + if (unique.params[1] != techName) continue + civInfo.addNotification("You have unlocked [The Long Count]!", MayaLongCountAction(), MayaCalendar.notificationIcon) + } } fun addTechToTransients(tech: Technology) { diff --git a/core/src/com/unciv/models/Tutorial.kt b/core/src/com/unciv/models/Tutorial.kt index 07bc13dd89..f0523f2ede 100644 --- a/core/src/com/unciv/models/Tutorial.kt +++ b/core/src/com/unciv/models/Tutorial.kt @@ -1,7 +1,7 @@ package com.unciv.models enum class Tutorial(val value: String, val isCivilopedia: Boolean = !value.startsWith("_")) { - + Introduction("Introduction"), NewGame("New_Game"), SlowStart("_Slow_Start"), @@ -42,6 +42,7 @@ enum class Tutorial(val value: String, val isCivilopedia: Boolean = !value.start Beliefs("Beliefs"), SpreadingReligion("Spreading_Religion"), Inquisitors("Inquisitors"), + MayanCalendar("Maya_Long_Count_calendar_cycle"), ; companion object { diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt index 5844697278..b521aa659b 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt @@ -178,6 +178,13 @@ enum class UniqueParameterType(val parameterName:String) { else -> UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant } }, + Technology("tech") { + override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): + UniqueType.UniqueComplianceErrorSeverity? = when (parameterText) { + in ruleset.technologies -> null + else -> UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific + } + }, /** Behaves like [Unknown], but states explicitly the parameter is OK and its contents are ignored */ Comment("comment") { override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt index f312a53348..b77e423d9a 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt @@ -11,6 +11,7 @@ import com.unciv.models.ruleset.VictoryType import com.unciv.models.stats.Stat import com.unciv.models.translations.fillPlaceholders import com.unciv.models.translations.hasPlaceholderParameters +import com.unciv.ui.utils.MayaCalendar import com.unciv.ui.worldscreen.unit.UnitActions import kotlin.random.Random @@ -113,17 +114,29 @@ object UniqueTriggerActivation { } return true } - OneTimeFreeGreatPerson -> { + OneTimeFreeGreatPerson, MayanGainGreatPerson -> { if (civInfo.isSpectator()) return false + val greatPeople = civInfo.getGreatPeople() + if (unique.type == MayanGainGreatPerson) { + if (civInfo.greatPeople.longCountGPPool.isEmpty()) + // replenish maya GP pool when dry + civInfo.greatPeople.longCountGPPool = greatPeople.map { it.name }.toHashSet() + } if (civInfo.isPlayerCivilization()) { civInfo.greatPeople.freeGreatPeople++ - if (notification != null) - civInfo.addNotification(notification) // Anyone an idea for a good icon? + if (unique.type == MayanGainGreatPerson) { + civInfo.greatPeople.mayaLimitedFreeGP++ + civInfo.addNotification(notification!!, MayaLongCountAction(), MayaCalendar.notificationIcon) + } else { + if (notification != null) + civInfo.addNotification(notification) // Anyone an idea for a good icon? + } return true } else { - val greatPeople = civInfo.getGreatPeople() + if (unique.type == MayanGainGreatPerson) + greatPeople.removeAll { it.name !in civInfo.greatPeople.longCountGPPool } if (greatPeople.isEmpty()) return false - var greatPerson = civInfo.getGreatPeople().random() + var greatPerson = greatPeople.random() val preferredVictoryType = civInfo.victoryType() if (preferredVictoryType == VictoryType.Cultural) { @@ -137,6 +150,8 @@ object UniqueTriggerActivation { if (scientificGP != null) greatPerson = scientificGP } + if (unique.type == MayanGainGreatPerson) + civInfo.greatPeople.longCountGPPool.remove(greatPerson.name) return civInfo.addUnit(greatPerson.name, chosenCity) != null } } diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 72210480a5..24e550d053 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -122,6 +122,9 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget) { FreeExtraBeliefs("May choose [amount] additional [beliefType] beliefs when [foundingOrEnhancing] a religion", UniqueTarget.Global), FreeExtraAnyBeliefs("May choose [amount] additional belief(s) of any type when [foundingOrEnhancing] a religion", UniqueTarget.Global), + MayanGainGreatPerson("Receive a free Great Person at the end of every [comment] (every 394 years), after researching [tech]. Each bonus person can only be chosen once.", UniqueTarget.Nation), + MayanCalendarDisplay("Once The Long Count activates, the year on the world screen displays as the traditional Mayan Long Count.", UniqueTarget.Nation), + ///////////////////////////////////////// UNIT UNIQUES ///////////////////////////////////////// FoundCity("Founds a new city", UniqueTarget.Unit), diff --git a/core/src/com/unciv/ui/civilopedia/CivilopediaText.kt b/core/src/com/unciv/ui/civilopedia/CivilopediaText.kt index 68a78b7207..1b319d189d 100644 --- a/core/src/com/unciv/ui/civilopedia/CivilopediaText.kt +++ b/core/src/com/unciv/ui/civilopedia/CivilopediaText.kt @@ -189,6 +189,7 @@ class FormattedLine ( result[it.second] = it.first //println(" ${it.second} is a ${it.first}") } + result["Maya Long Count calendar cycle"] = CivilopediaCategories.Tutorial //println("allObjectNamesCategoryMap took ${System.nanoTime()-startTime}ns to initialize") rulesetCachedInNameMap = ruleSet diff --git a/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt index c28feca120..4166f61e6d 100644 --- a/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt @@ -7,6 +7,7 @@ import com.unciv.models.UncivSound import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.translations.tr import com.unciv.ui.utils.ImageGetter +import com.unciv.ui.utils.isEnabled import com.unciv.ui.utils.onClick import com.unciv.ui.utils.toLabel @@ -14,23 +15,23 @@ class GreatPersonPickerScreen(val civInfo:CivilizationInfo) : PickerScreen() { private var theChosenOne: BaseUnit? = null init { - closeButton.isVisible=false + closeButton.isVisible = false rightSideButton.setText("Choose a free great person".tr()) val greatPersonUnits = civInfo.getGreatPeople() - for (unit in greatPersonUnits) - { + val useMayaLongCount = civInfo.greatPeople.mayaLimitedFreeGP > 0 + + for (unit in greatPersonUnits) { val button = Button(skin) button.add(ImageGetter.getUnitIcon(unit.name)).size(30f).pad(10f) button.add(unit.name.toLabel()).pad(10f) button.pack() - button.onClick { + button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool + if (button.isEnabled) button.onClick { theChosenOne = unit - val unitDescription=HashSet() - unit.uniques.forEach { unitDescription.add(it.tr()) } pick("Get [${unit.name}]".tr()) - descriptionLabel.setText(unitDescription.joinToString()) + descriptionLabel.setText(unit.getShortDescription()) } topTable.add(button).pad(10f).row() } @@ -38,6 +39,10 @@ class GreatPersonPickerScreen(val civInfo:CivilizationInfo) : PickerScreen() { rightSideButton.onClick(UncivSound.Choir) { civInfo.addUnit(theChosenOne!!.name, civInfo.getCapital()) civInfo.greatPeople.freeGreatPeople-- + if (useMayaLongCount) { + civInfo.greatPeople.mayaLimitedFreeGP-- + civInfo.greatPeople.longCountGPPool.remove(theChosenOne!!.name) + } UncivGame.Current.setWorldScreen() } diff --git a/core/src/com/unciv/ui/utils/Fonts.kt b/core/src/com/unciv/ui/utils/Fonts.kt index 4ec6e9800e..2b26efa7d5 100644 --- a/core/src/com/unciv/ui/utils/Fonts.kt +++ b/core/src/com/unciv/ui/utils/Fonts.kt @@ -98,6 +98,10 @@ class NativeBitmapFontData( Fonts.culture -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable("EmojiIcons/Culture").region) Fonts.faith -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable("EmojiIcons/Faith").region) Fonts.happiness -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable("EmojiIcons/Happiness").region) + MayaCalendar.tun -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable(MayaCalendar.tunIcon).region) + MayaCalendar.katun -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable(MayaCalendar.katunIcon).region) + MayaCalendar.baktun -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable(MayaCalendar.baktunIcon).region) + in MayaCalendar.digits -> Fonts.extractPixmapFromTextureRegion(ImageGetter.getDrawable(MayaCalendar.digitIcon(ch)).region) else -> fontImplementation.getCharPixmap(ch) } } @@ -166,7 +170,7 @@ object Fonts { const val culture = '♪' // U+266A 'eighth note' (🎵 U+1F3B5 'musical note') const val happiness = '⌣' // U+2323 'smile' (😀 U+1F600 'grinning face') const val faith = '☮' // U+262E 'peace symbol' (🕊 U+1F54A 'dove of peace') - + fun statToChar(stat: Stat): Char { return when (stat) { Stat.Food -> food diff --git a/core/src/com/unciv/ui/utils/MayaCalendar.kt b/core/src/com/unciv/ui/utils/MayaCalendar.kt new file mode 100644 index 0000000000..038a35e633 --- /dev/null +++ b/core/src/com/unciv/ui/utils/MayaCalendar.kt @@ -0,0 +1,86 @@ +package com.unciv.ui.utils + +import com.badlogic.gdx.graphics.Color +import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.models.ruleset.unique.UniqueTriggerActivation +import com.unciv.models.ruleset.unique.UniqueType +import com.unciv.models.translations.tr +import kotlin.math.abs + +object MayaCalendar { + // Glyphs / icons + private const val iconFolder = "MayaCalendar/" + const val notificationIcon = "MayaCalendar/Maya" + const val tunIcon = "MayaCalendar/Tun" + const val katunIcon = "MayaCalendar/Katun" + const val baktunIcon = "MayaCalendar/Baktun" + const val tun = 'ම' // U+0DB8, no relation to maya, arbitrary choice (it's the sinhala letter 'mayanna') + const val katun = 'ඹ' // U+0DB9 + const val baktun = 'ය' // U+0DBA + // The mayan numerals are actually unicode U+1D2E0 to U+1D2F3, but we can't do those + // so - I'm replacing the code points for small roman numerals U+2170 to U+2183 + const val zero = 'ⅰ' // U+2170 + const val nineteen = 'Ↄ' // U+2183 + val digits = zero..nineteen + fun digitIcon(ch: Char) = iconFolder + (ch.code - zero.code).toString() + + // Calculation + private const val daysOn30000101BCE = 36000 + 5040 + 240 + 11 + + private class MayaYear(year: Int) { + val baktuns: Int + val katuns: Int + val tuns: Int + + init { + val mayaDays = (year + 3000) * 365 + (year + 3000) / 4 + daysOn30000101BCE + val totalTuns = if (mayaDays >= 0) mayaDays / 360 else 13 * 20 * 20 + mayaDays / 360 + val totalKatuns = totalTuns / 20 + baktuns = totalKatuns / 20 + katuns = totalKatuns - baktuns * 20 + tuns = totalTuns - totalKatuns * 20 + } + + override fun toString(): String { + val baktunDigit = Char(zero.code + baktuns) + val katunDigit = Char(zero.code + katuns) + val tunDigit = Char(zero.code + tuns) + return "$baktunDigit$baktun$katunDigit$katun$tunDigit$tun" + } + } + + fun yearToMayaDate(year: Int) = MayaYear(year).toString() + + // Maya ability implementation + private fun isNewCycle(year: Int, otherYear: Int) = MayaYear(year).baktuns != MayaYear(otherYear).baktuns + + fun startTurnForMaya(civInfo: CivilizationInfo) { + val game = civInfo.gameInfo + val year = game.getYear() + if (!isNewCycle(year, game.getYear(-1))) return + for (unique in civInfo.getMatchingUniques(UniqueType.MayanGainGreatPerson)) { + UniqueTriggerActivation.triggerCivwideUnique( + unique, civInfo, + notification = "{A new b'ak'tun has just begun!}\n{A Great Person joins you!}" + ) + } + } + + // User interface to explain changed year display + fun openPopup(previousScreen: CameraStageBaseScreen, civInfo: CivilizationInfo, year: Int) { + Popup(previousScreen).apply { + name = "MayaCalendar" + addGoodSizedLabel("The Mayan Long Count", 24).apply { + actor.color = civInfo.nation.getOuterColor() + }.row() + addSeparator(color = Color.DARK_GRAY) + addGoodSizedLabel("Your scientists and theologians have devised a systematic approach to measuring long time spans - the Long Count. During the festivities whenever the current b'ak'tun ends, a Great Person will join you.").row() + val yearText = ("[" + abs(year) + "] " + (if (year < 0) "BC" else "AD")).tr() + addGoodSizedLabel("While the rest of the world calls the current year [$yearText], in the Maya Calendar that is:").padTop(10f).row() + val mayaYear = MayaYear(year) + addGoodSizedLabel(mayaYear.toString(), 42).row() + addGoodSizedLabel("[${mayaYear.baktuns}] b'ak'tun, [${mayaYear.katuns}] k'atun, [${mayaYear.tuns}] tun").padBottom(10f).row() + addCloseButton() + }.open(true) + } +} diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt index a1b45866aa..41e575127d 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt @@ -4,9 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.ui.* -import com.unciv.logic.GameInfo import com.unciv.logic.civilization.CivilizationInfo -import com.unciv.models.metadata.GameSpeed import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.stats.Stats import com.unciv.models.translations.tr @@ -64,7 +62,14 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { private fun getResourceTable(): Table { val resourceTable = Table() resourceTable.defaults().pad(5f) - turnsLabel.onClick { worldScreen.game.setScreen(VictoryScreen(worldScreen)) } + turnsLabel.onClick { + if (worldScreen.selectedCiv.isLongCountDisplay()) { + val gameInfo = worldScreen.selectedCiv.gameInfo + MayaCalendar.openPopup(worldScreen, worldScreen.selectedCiv, gameInfo.getYear()) + } else { + worldScreen.game.setScreen(VictoryScreen(worldScreen)) + } + } resourceTable.add(turnsLabel).padRight(20f) val revealedStrategicResources = worldScreen.gameInfo.ruleSet.tileResources.values .filter { it.resourceType == ResourceType.Strategic } // && currentPlayerCivInfo.tech.isResearched(it.revealedBy!!) } @@ -215,9 +220,9 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { else resourceLabels[resource.name]!!.setText(civResources.first { it.resource == resource }.amount.toString()) } - val year = getYear(civInfo.gameInfo.gameParameters.gameSpeed, getEquivalentTurn(civInfo.gameInfo)).toInt() - - val yearText = "[" + abs(year) + "] " + if (year < 0) "BC" else "AD" + val year = civInfo.gameInfo.getYear() + val yearText = if (civInfo.isLongCountDisplay()) MayaCalendar.yearToMayaDate(year) + else "[" + abs(year) + "] " + (if (year < 0) "BC" else "AD") turnsLabel.setText(Fonts.turn + "" + civInfo.gameInfo.turns + " | " + yearText.tr()) val nextTurnStats = civInfo.statsForNextTurn @@ -275,40 +280,4 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { return happinessText } - private class YearsToTurn(val toTurn: Int, val yearInterval: Double) // enum class with lists for each value group potentially more efficient? - - - // Best to initialize these once only - private val marathon = listOf(YearsToTurn(100, 15.0), YearsToTurn(400, 10.0), YearsToTurn(570, 5.0), YearsToTurn(771, 2.0), YearsToTurn(900, 1.0), YearsToTurn(1080, 0.5), YearsToTurn(1344, 0.25), YearsToTurn(1500, 0.083333)) - private val epic = listOf(YearsToTurn(140, 25.0), YearsToTurn(230, 15.0), YearsToTurn(270, 10.0), YearsToTurn(360, 5.0), YearsToTurn(430, 2.0), YearsToTurn(530, 1.0), YearsToTurn(1500, 0.5)) - private val standard = listOf(YearsToTurn(75, 40.0), YearsToTurn(135, 25.0), YearsToTurn(160, 20.0), YearsToTurn(210, 10.0), YearsToTurn(270, 5.0), YearsToTurn(320, 2.0), YearsToTurn(440, 1.0), YearsToTurn(500, 0.5)) - private val quick = listOf(YearsToTurn(50, 60.0), YearsToTurn(80, 40.0), YearsToTurn(100, 30.0), YearsToTurn(130, 20.0), YearsToTurn(155, 10.0), YearsToTurn(195, 5.0), YearsToTurn(260, 2.0), YearsToTurn(310, 1.0)) - - private fun getYear(gameSpeed: GameSpeed, turn: Int): Float { - - val yearToTurnList: List = when (gameSpeed) { - GameSpeed.Marathon -> marathon - GameSpeed.Epic -> epic - GameSpeed.Standard -> standard - GameSpeed.Quick -> quick - } - - var year: Float = -4000f - var i = 0 - var yearsPerTurn: Float - // if macros are ever added to kotlin, this is one hell of a place for em' - while (i < turn) { - yearsPerTurn = yearToTurnList.firstOrNull { i < it.toTurn }?.yearInterval?.toFloat() ?: 0.5f - year += yearsPerTurn - ++i - } - - return year - } - - private fun getEquivalentTurn(gameInfo: GameInfo): Int { - val totalTurns = 500f * gameInfo.gameParameters.gameSpeed.modifier - val startPercent = gameInfo.ruleSet.eras[gameInfo.gameParameters.startingEra]!!.startPercent - return gameInfo.turns + ((totalTurns * startPercent).toInt() / 100) - } } diff --git a/docs/Credits.md b/docs/Credits.md index 39caadc173..cf0c9d59c0 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -40,6 +40,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Spiked Club](https://thenounproject.com/search/?q=spiked%20club&i=831793) by Hamish * [Bow And Arrow](https://thenounproject.com/search/?q=Bow%20and%20Arrow&i=338261) By Viktor Ostrovsky for Archer * [Bow](https://thenounproject.com/search/?q=bow&i=101736) By Arthur Shlain for Bowman +* [Javelin](https://thenounproject.com/term/javelin-thrower/2118369/) By WEBTECHOPS LLP for Atlatlist * [Fishing Vessel](https://thenounproject.com/term/fishing-vessel/23815/) By Luis Prado for Work Boats * [Greek Trireme](https://thenounproject.com/search/?q=ancient%20boat&i=1626303) By Zachary McCune for Trireme * [Greek Trireme](https://thenounproject.com/search/?q=ancient%20boat&i=1626303) By Zachary McCune for Quinquereme. The original work has been modified. @@ -213,6 +214,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [Storehouse](https://thenounproject.com/term/storehouse/966786/) By Pedro Santos for Granary * [Shinto Gate](https://thenounproject.com/search/?q=shrine&i=253325) by Alexander Skowalsky for Shrine +* [Pyramid](https://thenounproject.com/term/pyramid/17225/) by Oscar Yáñez for Mayan Pyramid * [Great Wall Of China](https://thenounproject.com/term/great-wall-of-china/146039/) By Arthur Shlain for Walls * [Markadan Tower](https://thenounproject.com/search/?q=fortification&i=2107694) by Vectors Market for Walls of Babylon * [Block](https://thenounproject.com/term/block/1711553/) By Monjin Friends for Stone Works @@ -571,6 +573,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [royal crown](https://thenounproject.com/term/royal-crown/2054222/) by Vectors Market * [Spear](https://thenounproject.com/term/spear/3930020/) by Firza Alamsyah * [pennant](https://thenounproject.com/term/pennant/194797/) by Sara Jeffries +* [Maya civilization](https://thenounproject.com/term/maya-civilization/1715786/) by Olena Panasovska for The Maya ## Promotions @@ -662,6 +665,8 @@ Unless otherwise specified, all the following are from [the Noun Project](https: * [tick](https://thenounproject.com/term/tick/3968142/) by Adrien Coquet on Nation picker * [people](https://thenounproject.com/term/people/458671) by Wilson Joseph as base for Civilopedia category Nations * [Mountains ](https://thenounproject.com/term/mountains/15616/) by Andrew J. Young as base for Civilopedia category Terrains +* [File:Maya.svg](https://en.wikipedia.org/wiki/File:Maya.svg) for Mayan numerals +* [East side of stela C, Quirigua](https://en.wikipedia.org/wiki/File:East_side_of_stela_C,_Quirigua.PNG) for Mayan calendar symbols ## Main menu