diff --git a/Credits.md b/Credits.md index 0744df9d47..dd8bbe4223 100644 --- a/Credits.md +++ b/Credits.md @@ -33,6 +33,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Catapult](https://thenounproject.com/search/?q=Spear&i=1233840) By Jakub Ukrop * [Unloaded Crossbow](https://thenounproject.com/term/unloaded-crossbow/815992/) By Hamish as Ballista * [Sword](https://thenounproject.com/search/?q=Sword&i=1215443) By Guilherme Furtado for Swordsman +* [Roman Helmet](https://thenounproject.com/search/?q=legion&i=440134) By parkjisun for Legion * [Horse](https://thenounproject.com/search/?q=Horse&i=1373793) By AFY Studio for Horseman * [Horse Head](https://thenounproject.com/search/?q=Cavalry&i=374037) By Juan Pablo Bravo for Companion Cavalry @@ -55,6 +56,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Black powder musket](https://thenounproject.com/term/black-powder-musket/1202078/) By Jarem Fyre for Minuteman * [Rapier](https://thenounproject.com/search/?q=musketeer&i=819822) By Hamish for Musketeer * [Ship](https://thenounproject.com/term/ship/1293899/) By Orin Zuu for Frigate +* [Ship](https://thenounproject.com/search/?q=ship&i=800131) By Mungang Kim for Ship of the Line * [Lance](https://thenounproject.com/search/?q=Lance&i=440122) By parkjisun for Lancer ### Industrial @@ -67,6 +69,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc ### Modern * [Helmet](https://thenounproject.com/term/helmet/25216/) By Daniel Turner for Great War Infantry +* [Cap](https://thenounproject.com/search/?q=kepi&i=950267) By Creative Mania for Foreign Legion * [Tank](https://thenounproject.com/term/tank/1287510/) By corpus delicti for Landship * [Warship](https://thenounproject.com/term/warship/1597474/) By zidney for Destroyer * [Battleship](https://thenounproject.com/search/?q=battleship&i=1986807) By Vitaliy Gorbachev, KZ for Battleship @@ -136,6 +139,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Storehouse](https://thenounproject.com/term/storehouse/966786/) By Pedro Santos for Granary * [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 * [korean palace](https://thenounproject.com/term/korean-palace/1797542/) By 1516 for Palace * [Obelisk](https://thenounproject.com/term/obelisk/749104/) By Eliricon for Monument @@ -153,6 +157,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Anubis](https://thenounproject.com/term/anubis/1080090/) By Carpe Diem for Burial Tomb * [Parthenon](https://thenounproject.com/term/parthenon/493272/) By Christopher T. Howlett for The Oracle * [Stadium](https://thenounproject.com/term/stadium/1500595/) By sandra for Colloseum +* [Terracotta Army](https://thenounproject.com/search/?q=terracotta&i=2306346) By Supalerk Laipawat * [Stadium](https://thenounproject.com/term/stadium/1152530/) By Creaticca Creative Agency for Circus Maximus * [Market](https://thenounproject.com/term/market/1723050/) By sofi * [Bazaar](https://thenounproject.com/term/bazaar/902288/) By Tokka Elkholy @@ -187,6 +192,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Forbidden City](https://thenounproject.com/term/forbidden-city/1797540/) By 1516 * [Theatre](https://thenounproject.com/term/theatre/1780401/) By b farias * [Tower of Pisa](https://thenounproject.com/search/?q=leaning%20tower%20of%20pisa&i=1002578) By Pedro Santos +* [Himeji Castle](https://thenounproject.com/search/?q=himeji&i=1125277) By Chanut is Industries * [Windmill](https://thenounproject.com/term/windmill/1705107/) By corpus delicti * [Taj Mahal](https://thenounproject.com/term/taj-mahal/1907755/) By Felipe Alvarado * [Observatory](https://thenounproject.com/term/observatory/1259/) By Nathan Driskell @@ -211,6 +217,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc * [Statue of Liberty](https://thenounproject.com/search/?q=statue%20of%20liberty&i=1801199) By 1516 * [Christ the redeemer](https://thenounproject.com/term/christ-the-redeemer/56112/) By Stefan Spieler for Cristo Redentor * [St. Petersburg](https://thenounproject.com/search/?q=kremlin&i=1569704) By Carpe Diem for Kremlin +* [Neuschwanstein](https://thenounproject.com/search/?q=Neuschwanstein&i=2107683) By Vectors Market ### Information Era diff --git a/android/Images/BuildingIcons/Himeji Castle.png b/android/Images/BuildingIcons/Himeji Castle.png new file mode 100644 index 0000000000..cd4a119c90 Binary files /dev/null and b/android/Images/BuildingIcons/Himeji Castle.png differ diff --git a/android/Images/BuildingIcons/Machu Picchu.png b/android/Images/BuildingIcons/Machu Picchu.png index f229990d24..318800582c 100644 Binary files a/android/Images/BuildingIcons/Machu Picchu.png and b/android/Images/BuildingIcons/Machu Picchu.png differ diff --git a/android/Images/BuildingIcons/Neuschwanstein.png b/android/Images/BuildingIcons/Neuschwanstein.png new file mode 100644 index 0000000000..674f6fc81e Binary files /dev/null and b/android/Images/BuildingIcons/Neuschwanstein.png differ diff --git a/android/Images/BuildingIcons/Terracotta Army.png b/android/Images/BuildingIcons/Terracotta Army.png new file mode 100644 index 0000000000..e7f97e6031 Binary files /dev/null and b/android/Images/BuildingIcons/Terracotta Army.png differ diff --git a/android/Images/BuildingIcons/Walls of Babylon.png b/android/Images/BuildingIcons/Walls of Babylon.png new file mode 100644 index 0000000000..90ab403cba Binary files /dev/null and b/android/Images/BuildingIcons/Walls of Babylon.png differ diff --git a/android/Images/UnitIcons/Chu-Ko-Nu.png b/android/Images/UnitIcons/Chu-Ko-Nu.png new file mode 100644 index 0000000000..b54b8809f5 Binary files /dev/null and b/android/Images/UnitIcons/Chu-Ko-Nu.png differ diff --git a/android/Images/UnitIcons/Cossack.png b/android/Images/UnitIcons/Cossack.png new file mode 100644 index 0000000000..d955e0ed5a Binary files /dev/null and b/android/Images/UnitIcons/Cossack.png differ diff --git a/android/Images/UnitIcons/Foreign Legion.png b/android/Images/UnitIcons/Foreign Legion.png new file mode 100644 index 0000000000..9803e6ddf1 Binary files /dev/null and b/android/Images/UnitIcons/Foreign Legion.png differ diff --git a/android/Images/UnitIcons/Legion.png b/android/Images/UnitIcons/Legion.png new file mode 100644 index 0000000000..d3e14eba1a Binary files /dev/null and b/android/Images/UnitIcons/Legion.png differ diff --git a/android/Images/UnitIcons/Ship of the Line.png b/android/Images/UnitIcons/Ship of the Line.png new file mode 100644 index 0000000000..9c1cb79c17 Binary files /dev/null and b/android/Images/UnitIcons/Ship of the Line.png differ diff --git a/android/Images/UnitIcons/War Chariot.png b/android/Images/UnitIcons/War Chariot.png new file mode 100644 index 0000000000..5c088fc960 Binary files /dev/null and b/android/Images/UnitIcons/War Chariot.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 2de6556e50..2bb2d9e45f 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -97,70 +97,70 @@ BuildingIcons/Chichen Itza index: -1 BuildingIcons/Circus rotate: false - xy: 306, 742 + xy: 334, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Circus Maximus rotate: false - xy: 334, 1540 + xy: 334, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colloseum rotate: false - xy: 436, 1336 + xy: 538, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Colossus rotate: false - xy: 538, 1438 + xy: 640, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Cristo Redentor rotate: false - xy: 538, 1234 + xy: 742, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Eiffel Tower rotate: false - xy: 1048, 1540 + xy: 844, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Factory rotate: false - xy: 1048, 1438 + xy: 844, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forbidden Palace rotate: false - xy: 1150, 1336 + xy: 1150, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Forge rotate: false - xy: 1150, 1234 + xy: 1252, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Granary rotate: false - xy: 1399, 1662 + xy: 1705, 1640 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -174,413 +174,441 @@ BuildingIcons/Great Wall index: -1 BuildingIcons/Hagia Sophia rotate: false - xy: 1354, 1234 + xy: 1456, 1560 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hanging Gardens rotate: false - xy: 1354, 1132 + xy: 1456, 1458 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Harbor rotate: false - xy: 1456, 1560 + xy: 1558, 1560 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hermitage rotate: false - xy: 1558, 1560 + xy: 1456, 1356 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +BuildingIcons/Himeji Castle + rotate: false + xy: 1456, 1254 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hospital rotate: false - xy: 1456, 1152 + xy: 1660, 1538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hubble Space Telescope rotate: false - xy: 1558, 1254 + xy: 1660, 1436 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Hydro Plant rotate: false - xy: 1558, 1152 + xy: 1762, 1538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Ironworks rotate: false - xy: 1762, 1436 + xy: 1762, 1232 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Kremlin rotate: false - xy: 1762, 1232 + xy: 1864, 1130 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Krepost rotate: false - xy: 1864, 1334 + xy: 286, 639 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Leaning Tower of Pisa rotate: false - xy: 286, 537 + xy: 336, 129 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Library rotate: false - xy: 336, 435 + xy: 1456, 1050 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Lighthouse rotate: false - xy: 336, 333 + xy: 1558, 1050 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Machu Picchu rotate: false - xy: 1660, 1034 + xy: 438, 436 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Market rotate: false - xy: 388, 640 + xy: 438, 130 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Military Academy rotate: false - xy: 510, 1030 + xy: 510, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Mint rotate: false - xy: 714, 1030 + xy: 714, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monastery rotate: false - xy: 816, 1030 + xy: 816, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Monument rotate: false - xy: 612, 826 + xy: 1020, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Museum rotate: false - xy: 918, 1030 + xy: 918, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/National College rotate: false - xy: 1020, 1030 + xy: 1020, 928 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +BuildingIcons/Neuschwanstein + rotate: false + xy: 1020, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Notre Dame rotate: false - xy: 918, 928 + xy: 1122, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Nuclear Plant rotate: false - xy: 918, 826 + xy: 1122, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Observatory rotate: false - xy: 1224, 1030 + xy: 1224, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Opera House rotate: false - xy: 1326, 1030 + xy: 1428, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Oxford University rotate: false - xy: 1224, 928 + xy: 1428, 846 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Palace rotate: false - xy: 1224, 826 + xy: 1530, 846 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Paper Maker rotate: false - xy: 1326, 928 + xy: 1632, 932 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Pentagon rotate: false - xy: 1530, 948 + xy: 1734, 824 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Porcelain Tower rotate: false - xy: 1938, 824 + xy: 1938, 722 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Public School rotate: false - xy: 1632, 729 + xy: 490, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Research Lab rotate: false - xy: 694, 724 + xy: 1000, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Booster rotate: false - xy: 1102, 724 + xy: 1306, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Cockpit rotate: false - xy: 1000, 622 + xy: 1408, 642 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Engine rotate: false - xy: 1204, 724 + xy: 1510, 642 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/SS Stasis Chamber rotate: false - xy: 1102, 622 + xy: 1612, 627 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Seaport rotate: false - xy: 1612, 627 + xy: 1612, 525 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sistine Chapel rotate: false - xy: 1612, 525 + xy: 744, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Solar Plant rotate: false - xy: 1816, 518 + xy: 642, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Spaceship Factory rotate: false - xy: 1918, 518 + xy: 846, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stable rotate: false - xy: 744, 520 + xy: 948, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stadium rotate: false - xy: 540, 316 + xy: 540, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Statue of Liberty rotate: false - xy: 642, 418 + xy: 642, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stock Exchange rotate: false - xy: 642, 316 + xy: 1050, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stone Works rotate: false - xy: 948, 520 + xy: 744, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Stonehenge rotate: false - xy: 540, 112 + xy: 846, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Sydney Opera House rotate: false - xy: 642, 112 + xy: 948, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Taj Mahal rotate: false - xy: 744, 214 + xy: 1050, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Temple rotate: false - xy: 948, 418 + xy: 846, 112 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +BuildingIcons/Terracotta Army + rotate: false + xy: 948, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Library rotate: false - xy: 1152, 520 + xy: 1050, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Great Lighthouse rotate: false - xy: 744, 112 + xy: 1152, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Louvre rotate: false - xy: 846, 214 + xy: 948, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Oracle rotate: false - xy: 948, 316 + xy: 1050, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/The Pyramids rotate: false - xy: 1050, 418 + xy: 1152, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Theatre rotate: false - xy: 846, 112 + xy: 1050, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/University rotate: false - xy: 1050, 214 + xy: 1254, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Walls rotate: false - xy: 1254, 418 + xy: 642, 10 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +BuildingIcons/Walls of Babylon + rotate: false + xy: 744, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Windmill rotate: false - xy: 1152, 112 + xy: 1254, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 BuildingIcons/Workshop rotate: false - xy: 642, 10 + xy: 1356, 234 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -678,126 +706,126 @@ ImprovementIcons/Camp index: -1 ImprovementIcons/City ruins rotate: false - xy: 334, 1438 + xy: 436, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Customs house rotate: false - xy: 538, 1132 + xy: 742, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Farm rotate: false - xy: 1150, 1540 + xy: 946, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Fishing Boats rotate: false - xy: 1150, 1438 + xy: 1048, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Landmark rotate: false - xy: 1864, 1130 + xy: 336, 333 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Lumber mill rotate: false - xy: 336, 27 + xy: 1864, 1028 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Manufactory rotate: false - xy: 1762, 1028 + xy: 438, 334 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Mine rotate: false - xy: 612, 1030 + xy: 816, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Oil well rotate: false - xy: 1122, 928 + xy: 1326, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Plantation rotate: false - xy: 1836, 824 + xy: 1734, 722 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Quarry rotate: false - xy: 1734, 722 + xy: 694, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Railroad rotate: false - xy: 1938, 722 + xy: 796, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/Railroad rotate: false - xy: 1938, 722 + xy: 796, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/FantasyHex/Railroad rotate: false - xy: 1938, 722 + xy: 796, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/Railroad rotate: false - xy: 1938, 722 + xy: 796, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Road rotate: false - xy: 898, 724 + xy: 1204, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Trading post rotate: false - xy: 1050, 316 + xy: 1254, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/BackArrow rotate: false - xy: 1356, 518 + xy: 1560, 488 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -818,21 +846,21 @@ OtherIcons/Circle index: -1 OtherIcons/Crosshair rotate: false - xy: 742, 1438 + xy: 538, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/DisbandUnit rotate: false - xy: 844, 1438 + xy: 640, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Fire rotate: false - xy: 946, 1234 + xy: 1150, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -867,42 +895,42 @@ TileSets/ThorfMaps/Hexagon index: -1 OtherIcons/MenuIcon rotate: false - xy: 438, 28 + xy: 612, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Pentagon rotate: false - xy: 1428, 846 + xy: 1836, 824 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Pillage rotate: false - xy: 1734, 824 + xy: 1632, 729 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Shield rotate: false - xy: 1918, 620 + xy: 1918, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Sleep rotate: false - xy: 1714, 518 + xy: 540, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Stop rotate: false - xy: 642, 214 + xy: 948, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -965,252 +993,252 @@ PolicyIcons/Constitution index: -1 PolicyIcons/Democracy rotate: false - xy: 1356, 466 + xy: 1356, 182 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Discipline rotate: false - xy: 846, 60 + xy: 1458, 284 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Strength rotate: false - xy: 846, 60 + xy: 1458, 284 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Entrepreneurship rotate: false - xy: 1408, 488 + xy: 1560, 436 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Facism rotate: false - xy: 1356, 414 + xy: 1612, 473 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Religion rotate: false - xy: 898, 60 + xy: 1356, 130 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Speech rotate: false - xy: 1460, 488 + xy: 1560, 384 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Free Thought rotate: false - xy: 1408, 436 + xy: 1612, 421 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Humanism rotate: false - xy: 1356, 362 + xy: 1356, 78 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Landed Elite rotate: false - xy: 950, 60 + xy: 1356, 26 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Legalism rotate: false - xy: 1512, 488 + xy: 1408, 182 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mandate Of Heaven rotate: false - xy: 1408, 384 + xy: 1408, 130 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Mercantilism rotate: false - xy: 1460, 436 + xy: 1408, 78 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Meritocracy rotate: false - xy: 1356, 310 + xy: 1408, 26 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Militarism rotate: false - xy: 1002, 60 + xy: 1510, 284 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Caste rotate: false - xy: 1408, 332 + xy: 1460, 186 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Military Tradition rotate: false - xy: 1460, 384 + xy: 1460, 134 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Monarchy rotate: false - xy: 1512, 436 + xy: 1460, 82 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Oligarchy rotate: false - xy: 1054, 60 + xy: 1512, 232 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Organized Religion rotate: false - xy: 1408, 280 + xy: 1512, 180 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Patronage rotate: false - xy: 1460, 332 + xy: 1512, 128 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Police State rotate: false - xy: 1512, 384 + xy: 1512, 76 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Populism rotate: false - xy: 1356, 206 + xy: 1562, 286 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Professional Army rotate: false - xy: 1106, 60 + xy: 1564, 234 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Protectionism rotate: false - xy: 1408, 228 + xy: 1564, 182 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Reformation rotate: false - xy: 1512, 332 + xy: 1564, 78 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Representation rotate: false - xy: 1356, 154 + xy: 1966, 1588 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Republic rotate: false - xy: 1158, 60 + xy: 1966, 1536 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scientific Revolution rotate: false - xy: 1408, 176 + xy: 1966, 1484 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Secularism rotate: false - xy: 1460, 228 + xy: 1966, 1432 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Sovereignty rotate: false - xy: 1512, 280 + xy: 1966, 1380 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Theocracy rotate: false - xy: 1210, 60 + xy: 1966, 1328 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Total War rotate: false - xy: 1460, 176 + xy: 1966, 1276 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Trade Unions rotate: false - xy: 1512, 228 + xy: 1966, 1224 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Universal Suffrage rotate: false - xy: 1262, 60 + xy: 1966, 1172 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Warrior Code rotate: false - xy: 1512, 176 + xy: 1966, 1120 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1238,175 +1266,175 @@ ResourceIcons/Cattle index: -1 ResourceIcons/Coal rotate: false - xy: 334, 1234 + xy: 436, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Cotton rotate: false - xy: 436, 1132 + xy: 640, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Deer rotate: false - xy: 640, 1234 + xy: 844, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Dyes rotate: false - xy: 946, 1540 + xy: 742, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Fish rotate: false - xy: 1048, 1336 + xy: 946, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Furs rotate: false - xy: 1252, 1540 + xy: 1252, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gems rotate: false - xy: 1252, 1132 + xy: 1501, 1662 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gold rotate: false - xy: 1297, 1642 + xy: 1603, 1662 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Horses rotate: false - xy: 1558, 1356 + xy: 1558, 1152 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Incense rotate: false - xy: 1660, 1544 + xy: 1660, 1334 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Iron rotate: false - xy: 1660, 1238 + xy: 1660, 1232 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Ivory rotate: false - xy: 1864, 1538 + xy: 1864, 1334 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Marble rotate: false - xy: 1864, 1028 + xy: 438, 232 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Oil rotate: false - xy: 1020, 826 + xy: 1326, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Pearls rotate: false - xy: 1428, 948 + xy: 1836, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sheep rotate: false - xy: 1816, 620 + xy: 1816, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silk rotate: false - xy: 1408, 540 + xy: 642, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silver rotate: false - xy: 1510, 540 + xy: 540, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Spices rotate: false - xy: 540, 418 + xy: 744, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Stone rotate: false - xy: 744, 418 + xy: 642, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sugar rotate: false - xy: 846, 418 + xy: 744, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Uranium rotate: false - xy: 1152, 316 + xy: 540, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Whales rotate: false - xy: 1152, 214 + xy: 1050, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wheat rotate: false - xy: 1254, 316 + xy: 1152, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wine rotate: false - xy: 1254, 214 + xy: 1356, 438 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1420,14 +1448,14 @@ StatIcons/Acquire index: -1 StatIcons/CityConnection rotate: false - xy: 436, 1540 + xy: 334, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/City_Center_(Civ6) rotate: false - xy: 436, 1438 + xy: 538, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1469,7 +1497,7 @@ StatIcons/Malcontent index: -1 StatIcons/Movement rotate: false - xy: 1356, 258 + xy: 1460, 30 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1490,14 +1518,14 @@ StatIcons/Production index: -1 StatIcons/RangedStrength rotate: false - xy: 1460, 280 + xy: 1564, 130 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Resistance rotate: false - xy: 592, 622 + xy: 898, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1511,7 +1539,7 @@ StatIcons/Science index: -1 StatIcons/Specialist rotate: false - xy: 642, 520 + xy: 642, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -1637,413 +1665,413 @@ TechIcons/Chivalry index: -1 TechIcons/Civil Service rotate: false - xy: 538, 1540 + xy: 334, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Combined Arms rotate: false - xy: 640, 1540 + xy: 334, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Combustion rotate: false - xy: 334, 1132 + xy: 436, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Compass rotate: false - xy: 538, 1336 + xy: 640, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Computers rotate: false - xy: 640, 1438 + xy: 742, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Construction rotate: false - xy: 742, 1540 + xy: 436, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Currency rotate: false - xy: 844, 1540 + xy: 640, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Dynamite rotate: false - xy: 640, 1132 + xy: 844, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Ecology rotate: false - xy: 742, 1234 + xy: 946, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Economics rotate: false - xy: 844, 1336 + xy: 1048, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Education rotate: false - xy: 946, 1438 + xy: 742, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Electricity rotate: false - xy: 742, 1132 + xy: 946, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Electronics rotate: false - xy: 844, 1234 + xy: 1048, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Engineering rotate: false - xy: 946, 1336 + xy: 1150, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Fertilizer rotate: false - xy: 844, 1132 + xy: 1048, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Flight rotate: false - xy: 946, 1132 + xy: 1150, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Future Tech rotate: false - xy: 1252, 1438 + xy: 1252, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Guilds rotate: false - xy: 1354, 1438 + xy: 1354, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Gunpowder rotate: false - xy: 1354, 1336 + xy: 1354, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Horseback Riding rotate: false - xy: 1558, 1458 + xy: 1456, 1152 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Industrialization rotate: false - xy: 1660, 1442 + xy: 1762, 1436 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Iron Working rotate: false - xy: 1660, 1136 + xy: 1762, 1334 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Machinery rotate: false - xy: 1558, 1050 + xy: 388, 538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Masonry rotate: false - xy: 438, 436 + xy: 408, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Mass Media (retired) rotate: false - xy: 438, 334 + xy: 408, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Mathematics rotate: false - xy: 438, 232 + xy: 510, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Metal Casting rotate: false - xy: 408, 1030 + xy: 510, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Metallurgy rotate: false - xy: 408, 928 + xy: 714, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Military Science rotate: false - xy: 408, 826 + xy: 612, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Mining rotate: false - xy: 510, 928 + xy: 612, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Nanotechnology rotate: false - xy: 816, 928 + xy: 918, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Navigation rotate: false - xy: 816, 826 + xy: 1224, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Nuclear Fission rotate: false - xy: 1122, 1030 + xy: 1326, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Optics rotate: false - xy: 1122, 826 + xy: 1530, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Particle Physics rotate: false - xy: 1326, 826 + xy: 1734, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Pharmaceuticals rotate: false - xy: 1530, 846 + xy: 1938, 926 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Philosophy rotate: false - xy: 1632, 932 + xy: 1938, 824 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Physics rotate: false - xy: 1734, 926 + xy: 1428, 744 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Plastics rotate: false - xy: 1938, 926 + xy: 1836, 722 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Pottery rotate: false - xy: 1428, 744 + xy: 490, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Printing Press rotate: false - xy: 1530, 744 + xy: 592, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Radio rotate: false - xy: 1836, 722 + xy: 592, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Railroad rotate: false - xy: 490, 724 + xy: 694, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Refrigeration rotate: false - xy: 592, 724 + xy: 898, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Replaceable Parts rotate: false - xy: 490, 622 + xy: 796, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Rifling rotate: false - xy: 694, 622 + xy: 1000, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Robotics rotate: false - xy: 796, 622 + xy: 1102, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Rocketry rotate: false - xy: 898, 622 + xy: 1204, 622 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Sailing rotate: false - xy: 1306, 724 + xy: 1714, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Satellites rotate: false - xy: 1306, 622 + xy: 1918, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Scientific Theory rotate: false - xy: 1408, 642 + xy: 1408, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steam Power rotate: false - xy: 846, 520 + xy: 744, 316 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Steel rotate: false - xy: 540, 214 + xy: 846, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/The Wheel rotate: false - xy: 1254, 520 + xy: 1254, 418 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Theology rotate: false - xy: 948, 214 + xy: 1152, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Trapping rotate: false - xy: 1152, 418 + xy: 1152, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TechIcons/Writing rotate: false - xy: 744, 10 + xy: 1458, 336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/CityOverlay rotate: false - xy: 334, 1336 + xy: 436, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/CityOverlay rotate: false - xy: 334, 1336 + xy: 436, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2071,154 +2099,154 @@ TileSets/ThorfMaps/CrosshatchHexagon index: -1 TileSets/Default/Flood plainsOverlay rotate: false - xy: 1048, 1234 + xy: 1048, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/Flood plainsOverlay rotate: false - xy: 1048, 1234 + xy: 1048, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/ForestOverlay rotate: false - xy: 1048, 1132 + xy: 1252, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/ForestOverlay rotate: false - xy: 1048, 1132 + xy: 1252, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/HillOverlay rotate: false - xy: 1456, 1458 + xy: 1558, 1458 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/JungleOverlay rotate: false - xy: 1762, 1334 + xy: 1864, 1232 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/JungleOverlay rotate: false - xy: 1762, 1334 + xy: 1864, 1232 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/LakesOverlay rotate: false - xy: 1864, 1232 + xy: 286, 537 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/LakesOverlay rotate: false - xy: 1864, 1232 + xy: 286, 537 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/MarshOverlay rotate: false - xy: 388, 538 + xy: 438, 28 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/MarshOverlay rotate: false - xy: 388, 538 + xy: 438, 28 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/MountainOverlay rotate: false - xy: 714, 928 + xy: 816, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/OasisOverlay rotate: false - xy: 1020, 928 + xy: 1224, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/ThorfMaps/OasisOverlay rotate: false - xy: 1020, 928 + xy: 1224, 928 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 TileSets/Default/road rotate: false - xy: 1170, 2 + xy: 1301, 1753 size: 61, 11 orig: 61, 11 offset: 0, 0 index: -1 TileSets/FantasyHex/road rotate: false - xy: 1170, 2 + xy: 1301, 1753 size: 61, 11 orig: 61, 11 offset: 0, 0 index: -1 TileSets/ThorfMaps/road rotate: false - xy: 1170, 2 + xy: 1301, 1753 size: 61, 11 orig: 61, 11 offset: 0, 0 index: -1 TileSets/FantasyHex/City rotate: false - xy: 490, 585 + xy: 1612, 384 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Grassland+City rotate: false - xy: 490, 585 + xy: 1612, 384 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Hill+City rotate: false - xy: 490, 585 + xy: 1612, 384 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Coast rotate: false - xy: 408, 744 + xy: 1356, 540 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Desert rotate: false - xy: 1564, 473 + xy: 334, 1050 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2232,21 +2260,21 @@ TileSets/FantasyHex/Desert+City index: -1 TileSets/FantasyHex/Desert+Flood plains rotate: false - xy: 70, 8 + xy: 408, 744 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Desert+Oasis rotate: false - xy: 1966, 1538 + xy: 1664, 424 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Grassland rotate: false - xy: 1564, 443 + xy: 1600, 3 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2267,14 +2295,14 @@ TileSets/FantasyHex/Grassland+Jungle index: -1 TileSets/FantasyHex/Grassland+Marsh rotate: false - xy: 334, 1049 + xy: 1566, 2 size: 32, 29 orig: 32, 29 offset: 0, 0 index: -1 TileSets/FantasyHex/Hill rotate: false - xy: 1278, 26 + xy: 1664, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2288,126 +2316,126 @@ TileSets/FantasyHex/Hill+Forest index: -1 TileSets/FantasyHex/Lakes rotate: false - xy: 1966, 1508 + xy: 1698, 488 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Mountain rotate: false - xy: 1966, 1602 + xy: 490, 584 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Ocean rotate: false - xy: 1564, 413 + xy: 1698, 458 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains rotate: false - xy: 1966, 1478 + xy: 1732, 488 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+City rotate: false - xy: 1977, 1959 + xy: 1646, 384 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+Forest rotate: false - xy: 1314, 77 + xy: 490, 549 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+Jungle rotate: false - xy: 1564, 503 + xy: 1614, 302 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra rotate: false - xy: 1966, 1568 + xy: 70, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra+City rotate: false - xy: 1356, 117 + xy: 1664, 488 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra+Forest rotate: false - xy: 490, 551 + xy: 1648, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/ThorfMaps/Coast rotate: false - xy: 846, 14 + xy: 1458, 238 size: 52, 44 orig: 52, 44 offset: 0, 0 index: -1 TileSets/ThorfMaps/Desert rotate: false - xy: 900, 14 + xy: 1977, 1950 size: 52, 44 orig: 52, 44 offset: 0, 0 index: -1 TileSets/ThorfMaps/Grassland rotate: false - xy: 954, 14 + xy: 1560, 338 size: 52, 44 orig: 52, 44 offset: 0, 0 index: -1 TileSets/ThorfMaps/Hill rotate: false - xy: 1170, 15 + xy: 1566, 33 size: 52, 43 orig: 52, 43 offset: 0, 0 index: -1 TileSets/ThorfMaps/Mountain rotate: false - xy: 1008, 14 + xy: 1512, 30 size: 52, 44 orig: 52, 44 offset: 0, 0 index: -1 TileSets/ThorfMaps/Ocean rotate: false - xy: 1224, 15 + xy: 1614, 339 size: 52, 43 orig: 52, 43 offset: 0, 0 index: -1 TileSets/ThorfMaps/Plains rotate: false - xy: 1062, 14 + xy: 1966, 1074 size: 52, 44 orig: 52, 44 offset: 0, 0 index: -1 TileSets/ThorfMaps/Tundra rotate: false - xy: 1116, 14 + xy: 1966, 1028 size: 52, 44 orig: 52, 44 offset: 0, 0 @@ -2496,191 +2524,219 @@ UnitIcons/Chariot Archer orig: 100, 100 offset: 0, 0 index: -1 +UnitIcons/Chu-Ko-Nu + rotate: false + xy: 306, 742 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitIcons/Companion Cavalry rotate: false - xy: 436, 1234 + xy: 538, 1336 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitIcons/Cossack + rotate: false + xy: 538, 1234 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Crossbowman rotate: false - xy: 640, 1336 + xy: 844, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Destroyer rotate: false - xy: 742, 1336 + xy: 946, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -UnitIcons/Frigate +UnitIcons/Foreign Legion rotate: false xy: 1150, 1132 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -UnitIcons/Galleass +UnitIcons/Frigate rotate: false xy: 1252, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 +UnitIcons/Galleass + rotate: false + xy: 1297, 1642 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitIcons/Gatling Gun rotate: false - xy: 1252, 1234 + xy: 1399, 1662 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Artist rotate: false - xy: 1501, 1662 + xy: 1807, 1640 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Engineer rotate: false - xy: 1603, 1662 + xy: 1909, 1640 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great General rotate: false - xy: 1705, 1646 + xy: 1660, 1136 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 OtherIcons/Star rotate: false - xy: 1705, 1646 + xy: 1660, 1136 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitIcons/Great Merchant rotate: false - xy: 1807, 1640 + xy: 1354, 1540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great Scientist rotate: false - xy: 1909, 1640 + xy: 1354, 1438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Great War Infantry rotate: false - xy: 1354, 1540 + xy: 1354, 1336 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Hoplite rotate: false - xy: 1456, 1356 + xy: 1558, 1356 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Horseman rotate: false - xy: 1456, 1254 + xy: 1558, 1254 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Infantry rotate: false - xy: 1660, 1340 + xy: 1864, 1538 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Ironclad rotate: false - xy: 1762, 1538 + xy: 1864, 1436 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Knight rotate: false - xy: 1864, 1436 + xy: 1762, 1130 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Lancer rotate: false - xy: 1762, 1130 + xy: 336, 435 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Landship rotate: false - xy: 286, 639 + xy: 336, 231 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitIcons/Legion + rotate: false + xy: 336, 27 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longbowman rotate: false - xy: 336, 231 + xy: 1660, 1034 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Longswordsman rotate: false - xy: 336, 129 + xy: 1762, 1028 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Machine Gun rotate: false - xy: 1456, 1050 + xy: 388, 640 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Mechanized Infantry rotate: false - xy: 438, 130 + xy: 408, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Minuteman rotate: false - xy: 510, 826 + xy: 918, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Modern Armor rotate: false - xy: 612, 928 + xy: 714, 826 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Musketeer rotate: false - xy: 714, 826 + xy: 1122, 1030 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2694,77 +2750,84 @@ UnitIcons/Musketman index: -1 UnitIcons/Pikeman rotate: false - xy: 1836, 926 + xy: 1530, 744 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rifleman rotate: false - xy: 796, 724 + xy: 1102, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Rocket Artillery rotate: false - xy: 1000, 724 + xy: 1306, 724 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Samurai rotate: false - xy: 1204, 622 + xy: 1816, 620 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Scout rotate: false - xy: 1510, 642 + xy: 1510, 540 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Settler rotate: false - xy: 1714, 620 + xy: 1714, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -UnitIcons/Spearman +UnitIcons/Ship of the Line rotate: false xy: 540, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 +UnitIcons/Spearman + rotate: false + xy: 540, 214 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitIcons/Submarine rotate: false - xy: 744, 316 + xy: 1152, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Swordsman rotate: false - xy: 1050, 520 + xy: 846, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Tank rotate: false - xy: 846, 316 + xy: 1254, 520 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Trebuchet rotate: false - xy: 948, 112 + xy: 1254, 214 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2776,23 +2839,30 @@ UnitIcons/Trireme orig: 100, 101 offset: 0, 0 index: -1 +UnitIcons/War Chariot + rotate: false + xy: 846, 10 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitIcons/Warrior rotate: false - xy: 1050, 112 + xy: 948, 10 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Work Boats rotate: false - xy: 1254, 112 + xy: 1458, 438 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitIcons/Worker rotate: false - xy: 540, 10 + xy: 1356, 336 size: 100, 100 orig: 100, 100 offset: 0, 0 @@ -2806,7 +2876,7 @@ UnitPromotionIcons/Accuracy_III_(Civ5) index: -1 UnitPromotionIcons/Accuracy_II_(Civ5) rotate: false - xy: 1301, 1744 + xy: 1660, 1640 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -2827,7 +2897,7 @@ UnitPromotionIcons/Barrage_III_(Civ5) index: -1 UnitPromotionIcons/Barrage_II_(Civ5) rotate: false - xy: 1323, 1744 + xy: 1682, 1640 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -2848,259 +2918,259 @@ UnitPromotionIcons/Blitz_(Civ5) index: -1 UnitPromotionIcons/Boarding_Party_III_(Civ5) rotate: false - xy: 1345, 1744 + xy: 1364, 1744 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Boarding_Party_II_(Civ5) rotate: false - xy: 1367, 1744 + xy: 386, 1066 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Boarding_Party_I_(Civ5) rotate: false - xy: 386, 1066 + xy: 1428, 1110 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Bombardment_III_(Civ5) rotate: false - xy: 1428, 1110 + xy: 460, 804 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Bombardment_II_(Civ5) rotate: false - xy: 460, 804 + xy: 2015, 1791 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Bombardment_I_(Civ5) rotate: false - xy: 1408, 154 + xy: 104, 16 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Charge_(Civ5) rotate: false - xy: 2015, 1791 + xy: 1698, 436 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_III_(Civ5) rotate: false - xy: 1390, 132 + xy: 1732, 466 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_II_(Civ5) rotate: false - xy: 104, 16 + xy: 1766, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_I_(Civ5) rotate: false - xy: 1564, 391 + xy: 1428, 1088 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_II_(Civ5) rotate: false - xy: 1966, 1456 + xy: 460, 782 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_I_(Civ5) rotate: false - xy: 1428, 1088 + xy: 2015, 1769 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_III_(Civ5) rotate: false - xy: 460, 782 + xy: 1788, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_II_(Civ5) rotate: false - xy: 1430, 154 + xy: 1428, 1066 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_I_(Civ5) rotate: false - xy: 2015, 1769 + xy: 2015, 1747 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_II_(Civ5) rotate: false - xy: 1412, 132 + xy: 1810, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_I_(Civ5) rotate: false - xy: 1564, 369 + xy: 1832, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect_Fire_(Civ5) rotate: false - xy: 1966, 1434 + xy: 1854, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics_(Civ5) rotate: false - xy: 1428, 1066 + xy: 1876, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/March_(Civ5) rotate: false - xy: 1452, 154 + xy: 1898, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility_(Civ5) rotate: false - xy: 2015, 1747 + xy: 1920, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Range_(Civ5) rotate: false - xy: 1434, 132 + xy: 1942, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting_III_(Civ5) rotate: false - xy: 1564, 347 + xy: 1964, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting_II_(Civ5) rotate: false - xy: 1966, 1412 + xy: 1986, 496 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting_I_(Civ5) rotate: false - xy: 1474, 154 + xy: 2020, 700 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Sentry_(Civ5) rotate: false - xy: 1456, 132 + xy: 2020, 678 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Shock_III_(Civ5) rotate: false - xy: 1564, 325 + xy: 2020, 656 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Shock_II_(Civ5) rotate: false - xy: 1966, 1390 + xy: 2020, 634 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Shock_I_(Civ5) rotate: false - xy: 1496, 154 + xy: 2020, 612 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Siege_(Civ5) rotate: false - xy: 1478, 132 + xy: 2020, 590 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_III_(Civ5) rotate: false - xy: 1564, 303 + xy: 2020, 568 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_II_(Civ5) rotate: false - xy: 1966, 1368 + xy: 2020, 546 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_I_(Civ5) rotate: false - xy: 1518, 154 + xy: 2020, 524 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Volley_(Civ5) rotate: false - xy: 1500, 132 + xy: 442, 752 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_III_(Civ5) rotate: false - xy: 1564, 281 + xy: 1356, 4 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_II_(Civ5) rotate: false - xy: 1966, 1346 + xy: 1378, 4 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_I_(Civ5) rotate: false - xy: 1540, 154 + xy: 1400, 4 size: 20, 20 orig: 20, 20 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index 5e57cb3727..abb11b4d83 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/Buildings.json b/android/assets/jsons/Buildings.json index 04fb301d29..3af4e89b21 100644 --- a/android/assets/jsons/Buildings.json +++ b/android/assets/jsons/Buildings.json @@ -82,25 +82,23 @@ hurryCostModifier:25, requiredTech:"Masonry" }, - /* { name:"Walls of Babylon", replaces:"Walls", + cost:65, uniqueTo:"Babylon", cityStrength:6, cityHealth:100, hurryCostModifier:25, requiredTech:"Masonry" - //Babylonian unique building that replaces Walls. }, - */ { name:"The Pyramids", culture:1, greatPersonPoints:{production:1}, isWonder:true, uniques:["Worker construction increased 25%","Provides 2 free workers"], - requiredTech:"Mathematics" + requiredTech:"Masonry" }, { name:"Barracks", @@ -116,7 +114,7 @@ greatPersonPoints:{gold:1}, isWonder:true, uniques:["Can only be built in coastal cities", "+1 gold from worked water tiles in city"], - requiredTech:"Mathematics" + requiredTech:"Iron Working" }, { name:"Krepost", @@ -180,6 +178,12 @@ hurryCostModifier:25, requiredTech:"Construction" }, + { + name:"Terracotta Army", + culture:6, + isWonder:true, + requiredTech:"Construction" + }, { name:"Temple", culture:3, @@ -452,6 +456,15 @@ uniques:["Free Great Person"] requiredTech:"Printing Press" }, + { + name:"Himeji Castle", + culture:1, + isWonder:true, + greatPersonPoints:{production:2} + providesFreeBuilding:"Castle", + uniques:["+15% combat strength for units fighting in friendly territory"] // todo + requiredTech:"Gunpowder" + }, { name:"Museum", culture:5, @@ -615,6 +628,15 @@ uniques:["Defensive buildings in all cities are 25% more effective"], requiredTech:"Railroad" }, + { + name:"Neuschwanstein", + happiness:2, + culture:4, + gold:6, + isWonder:true, + uniques:["+1 happiness, +2 culture and +3 gold from every Castle"], + requiredTech:"Railroad" + }, // Information Era diff --git a/android/assets/jsons/Nations.json b/android/assets/jsons/Nations.json index cbe7a0779a..0f02f9bfd8 100644 --- a/android/assets/jsons/Nations.json +++ b/android/assets/jsons/Nations.json @@ -303,6 +303,8 @@ mainColor:[ 41,83,42], secondaryColor:[146,221,9], + uniqueName:"Trade Caravans", + unique:"+1 Gold from each Trade Route, Oil resources provide double quantity" cities:["Mecca","Medina","Damascus","Baghdad","Najran","Kufah","Basra","Khurasan","Anjar","Fustat", "Aden","Yamama","Muscat","Mansura","Bukhara","Fez","Shiraz","Merw","Balkh","Mosul", "Aydab","Bayt","Suhar","Taif","Hama","Tabuk","Sana'a","Shihr","Tripoli","Tunis"] diff --git a/android/assets/jsons/Nations_Italian.json b/android/assets/jsons/Nations_Italian.json index 010aa52d4a..cf6366f386 100644 --- a/android/assets/jsons/Nations_Italian.json +++ b/android/assets/jsons/Nations_Italian.json @@ -352,8 +352,8 @@ leaderName:"Oda Nobunaga", adjective:["giapponese"], - startIntroPart1: "Tu sia benedetto, nobile Oda Nobunaga, signore del Giappone, la terra del Sol Levante! Possa tu camminare a lungo in mezzo ai suoi meravigliosi boccioli di ciliegio. I giapponesi sono un popolo isolano, fiero e pio con una ricca cultura artistica e letteraria. La tua civiltà esiste per migliaia di anni, anni di sanguinose lotte, espansioni ed isolazioni, di grandi ricchezze e povertà. Oltre alla loro prodezza sul campo di battaglia, il tuo popolo è abile anche nell'industria, e le loro innovazioni tecnologiche e le loro grandi fabbriche sono l'invidia degli altri popoli in tutto il globo." - startIntroPart2: "Leggendario damiyo, prenderai le redini del destino? Porterai alla tua famiglia e al tuo popolo l'onore e la gloria che meritano? Alzerai di nuovo la tua spada e marcerai verso il trionfo? Riuscirai a plasmare una civiltà in grado di superare la prova del tempo?" + startIntroPart1: "Salute a te, nobile Oda Nobunaga, sovrano del Giappone, la terra del Sol Levante, dove sorge il Sole! Possa tu a lungo passeggiare in mezzo ai suoi prati in fiore. I giapponesi sono un popolo isolano, fiero e pio, dalla ricca cultura artistica e letteraria. La tua civiltà è millenaria. Sono stati anni di lotte sanguinose, di espansioni ed isolamenti, di grandi ricchezze e povertà. Oltre alla sua prodezza sul campo di battaglia, il tuo popolo può anche vantare una stupefacente operosità. La sua superiorità tecnologiche e le sue grandiose fabbriche sono l'invidia degli altri popoli di tutte le latitudini." + startIntroPart2: "O leggendario damiyo, prenderai in mano le redini del destino? Porterai alla tua famiglia e al tuo popolo l'onore e la gloria che meritano? Alzerai di nuovo la tua spada e marcerai verso il trionfo? Riuscirai a plasmare una civiltà in grado di superare la prova del tempo?" declaringWar:"Come samurai siamo gente onesta, e noi troviamo onesto volerti esprimere la nostra intenzione di cancellarti dalla faccia della terra con questo messaggio." attacked:"Fatti pure avanti! Il kamikaze (vento divino) ci proteggerà, e tu cadrai, come altri prima di te!" diff --git a/android/assets/jsons/Translations.json b/android/assets/jsons/Translations.json index bf818a0fb6..9bb53d65e0 100644 --- a/android/assets/jsons/Translations.json +++ b/android/assets/jsons/Translations.json @@ -29,14 +29,6 @@ Simplified_Chinese:"下一回合" Portuguese:"Proximo turno" Japanese:"次のターン" - Polish:"Następna tura" - Indonesian:"Giliran berikutnya" - Philippino:"Susunod na pagliko" - Czech:"Další otočení" - Slovak:"Ďalšie otočenie" - Sloven:"Naslednji zavoj" - Croatian:"Sljedeći red" - Danish:"Næste tur" } "Working...":{ // Displayed when next turn is being...turned @@ -194,7 +186,7 @@ Dutch:"Verbetering bouwen" Spanish:"Construir mejora" Simplified_Chinese:"建造建筑" - Portuguese:"Construir melhoria" + Portuguese:"Construir melhoria" Japanese:"構造改善" } @@ -725,7 +717,7 @@ } "Worked tiles":{ - Italian:"celle sfruttate" + Italian:"Celle sfruttate" Russian:"обработанные клетки" French:"cases exploités" Romanian:"celule lucrate" @@ -2517,7 +2509,7 @@ German:"Dschungel abholzen" } "Remove Marsh":{ - Italian:"Rimuovi palude" + Italian:"Bonifica palude" Russian:"Осушить болото" French:"Assécher le marais" Romanian:"Asanează mlaștina" @@ -4052,7 +4044,7 @@ // Policy picker screen "You have entered the [newEra] era!":{ - Italian:"Sei entrato in una nuova era, [newEra]!" + Italian:"Sei entrato in una nuova era, l'[newEra]!" //[newEra] not translated in Italian Russian:"Вы вошли в эпоху [newEra]!" French:"Vous êtes entré dans l'ère [newEra]!" Romanian:"Ai intrat în epoca [newEra]!" @@ -4261,6 +4253,10 @@ Russian:"заменяет" } + "[resourceName] not required":{ + Italian:"Risorsa [resourceName] non richiesta" + } + "National ability":{ // the unique ability that each nation has Italian:"Abilità della civiltà" Romanian:"Abilitate a națiunii" @@ -5030,7 +5026,7 @@ German:"Name" } "Closest city":{ - Italian:"La città più vicina" + Italian:"Città più vicina" Russian:"Ближайший город" French:"Ville la plus proche" Romanian:"Cel mai apropiat oraș" @@ -5172,6 +5168,9 @@ Portuguese:"Muralhas" German:"Mauern" } + "Walls of Babylon":{ + Italian:"Mura di Babilonia" + } "The Pyramids":{ Italian:"Grandi Piramidi" @@ -5236,8 +5235,12 @@ French:"Cout d'acquisition en or et en culture de nouvelle cases réduit de 25% dans cette ville" } - "Colossus":{} - "+1 gold from worked water tiles in city":{} + "Colossus":{ + Italian:"Colosso" + } + "+1 gold from worked water tiles in city":{ + Italian:"+1 Oro per ogni risorsa anfibia sfruttata dalla città." + } "Temple":{ Italian:"Tempio" @@ -5422,6 +5425,11 @@ Portuguese:"Coliseu" German:"Collosseum" } + + "Terracotta Army":{ + Italian:"Esercito di terracotta" + } + "Market":{ Italian:"Mercato" Russian:"Рынок" @@ -5560,8 +5568,12 @@ Portuguese:"40% da comida é mantida depois de um novo cidadão nascer" } - "Great Wall":{} - "Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)":{} + "Great Wall":{ + Italian:"Grande Muraglia" + } + "Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)":{ + Italian:"Le unità nemiche impiegano un punto Movimento extra se all'interno del tuo territorio (diventa obsoleta con la Dinamite)." + } "Workshop":{ Italian:"Bottega" @@ -5687,19 +5699,6 @@ Simplified_Chinese:"购买新地块的成本降低了25%" Portuguese:"Custa de comprar novos terrenos reduzido em 25%" } - /* - //New Wonder projected: Himeji Castle! Free Castle in City which possessed it, and +15% Strenght for units in friendly territory - //Also, +1 Culture and +2 Great Engineer Points. Requires Gunpowder - "Himeji Castle":{ - Italian:"Castello di Himeji" - French:"Château d'Himeji" - } - - "+15% Combat Strenght for units fighting in friendly territory":{ - Italian:"+15% Forza per le unità che combattono in territorio amico" - French:"+15% force pour toutes les unités dans un territoire allié" - } - */ "Porcelain Tower":{ Italian:"Torre di Porcellana" @@ -5834,8 +5833,7 @@ Spanish:"La Torre Inclinada De Pizza" German:"Schiefer Turm von Pisa" French:"Tour de Pise" - } - + } "Free Great Person":{ Italian:"Ottieni un Grande Personaggio gratuito" Romanian:"Persoană mare gratuită" @@ -5844,6 +5842,13 @@ French:"Personnage illustre gratuit" } + "Himeji Castle":{ + Italian:"Castello di Himeji" + } + "+15% combat strength for units fighting in friendly territory":{ + Italian:"+15% Forza per le unità che combattono in territorio amico" + } + "Taj Mahal":{ Italian:"Taj Mahal" //same in Italian Russian:"Тадж-Махал" @@ -6036,6 +6041,13 @@ Italian:"+25% efficacia delle strutture difensive in tutte le città" } + "Neuschwanstein":{ + Italian:"Castello di Neuschwanstein" + } + "+1 happiness, +2 culture and +3 gold from every Castle":{ + Italian:"+1 Felicitù, +2 Cultura e +3 Oro per ogni Castello" + } + "Military Academy":{ Italian:"Accademia militare" Russian:"Военная академия" @@ -6470,6 +6482,7 @@ Portuguese:"Espadachin" // may replace with guerreiro com espada if nescessary German:"Schwertkämpfer" } + "Legion":{ Italian:"Legionario" Romanian:"Legionar" @@ -6477,7 +6490,14 @@ Simplified_Chinese:"古罗马军团" German:"Legionär" French:"Légion" - } // Rome unique + } + "Can construct roads":{ + Italian:"Può costruire Strade" + } + "Construct road":{ + Italian:"Costruisci Strada" + } // for unit action button + "Horseman":{ Italian:"Guerriero a cavallo" //wrong translation by Smashfanful Russian:"Всадник" @@ -6587,6 +6607,14 @@ German:"Kamel-Bogenschütze" French:"Archer méhariste" } + "Samurai":{ + Italian:"Samurai" //Same as in Italian + } + + "Combat very likely to create Great Generals":{ + Italian:"Può generare un Grande Generale combattendo" + } + // Renaissance units "Caravel":{ @@ -6701,6 +6729,7 @@ Portuguese:"Cavalaria" German:"Kavallerie" } + "Cossack":{ Italian:"Cosacco" Romanian:"Cazac" @@ -6709,7 +6738,7 @@ Russian:"Казаки" German:"Kosak" French:"Cosaque" - } // Russia unique + } "Artillery":{ Italian:"Artiglieria" @@ -6732,7 +6761,7 @@ German:"Panzerschiff" } - // Modern units (do these, yes) + // Modern units "Landship":{ Italian:"Nave di terra" Romanian:"Vehicul terestru" @@ -6742,6 +6771,7 @@ German:"Landschiff" French:"Véhicule terrestre" //official translation but ugly } + "Great War Infantry":{ Italian:"Fante della Grande Guerra" Romanian:"Infanteria Marelui Război" @@ -6751,6 +6781,19 @@ German:"Weltkriegs Infanterie" French:"Infanterie de la grande guerre" } + + "Foreign Legion":{ + Italian:"Legione Straniera" + } + "+20% bonus outside friendly territory":{ + Italian:"+20% Forza fuori da territorio amico" + } + "Foreign Land":{ // for battle table combat percentage + Italian:"Terra Straniera" + + } + + "Destroyer":{ Italian:"Cacciatorpediniere" Romanian:"Distrugător" @@ -8202,7 +8245,7 @@ Russian:"Вы одержали победу завоевания!" } "One more turn...!":{ - Italian:"Solo un altro turno..." + Italian:"Aspetta! Solo un altro turno..." German:"Nur noch eine Runde..." French:"Un autre tour... !" Russian:"Еще один ход...!" @@ -8376,10 +8419,17 @@ German:"Angriff" French:"Charge" } + "Bonus vs wounded units 33%":{ Italian:"+33% forza contro unità ferite" French:"+33% force contre les unités montées" Russian:"Бонус против раненых 33%" + } + + "wounded units":{ + Italian:"unità ferite" + French:"unités montées" + } "Mobility":{ Italian:"Mobilità" @@ -8663,4 +8713,7 @@ Italian:"Editor mappe" Russian:"Редактор карт" } + "Language":{ + Italian:"Lingua" + } } diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index 9021865f29..2476f6f32a 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -73,8 +73,8 @@ { name:"Maori Warrior", unitType:"Melee", - uniqueTo:"Aztec", - replaces:"Polynesia", + uniqueTo:"Polynesia", + replaces:"Warrior", movement:2, strength:8, cost: 40, @@ -85,6 +85,19 @@ attackSound:"nonmetalhit" //Polynesian unique unit. All Units near him have -10% strenght }, + { + name:"Brute", + unitType:"Melee", + uniqueTo:"Barbarian", + replaces:"Warrior", + movement:2, + strength:8, + cost: 20, + obsoleteTech:"Metal Casting", + upgradesTo:"Swordsman", + attackSound:"nonmetalhit" + //Barbarian unique unit + }, */ { name:"Archer", @@ -205,7 +218,6 @@ hurryCostModifier:20, attackSound:"arrow" }, - /* { name:"War Chariot", unitType:"Ranged", @@ -221,8 +233,8 @@ uniques:["No defensive terrain bonus","Rough terrain penalty"], hurryCostModifier:20, attackSound:"arrow" - //This is the Egyptian unique unit. It replaces Chariot Archer, moves faster and needs no horses. }, + /* { name:"War Elephant", unitType:"Ranged", @@ -333,7 +345,6 @@ hurryCostModifier:20, attackSound:"metalhit" }, - /* { name:"Legion", unitType:"Melee", @@ -346,10 +357,11 @@ upgradesTo:"Longswordsman", obsoleteTech:"Steel", requiredResource:"Iron", + uniques:["Can construct roads"] hurryCostModifier:20, attackSound:"metalhit" - //Roman unique unit. It is stronger than Swordsman. It should also build roads (maybe railroads, too). It takes more to Steel to make it obsolete. }, + /* { name:"Mohawk Warrior", unitType:"Melee", @@ -431,9 +443,8 @@ hurryCostModifier:20, attackSound:"arrow" }, - /* { - name:"Chu-ko-nu", + name:"Chu-Ko-Nu", unitType:"Ranged", uniqueTo:"China", movement:2, @@ -444,11 +455,10 @@ requiredTech:"Machinery", upgradesTo:"Gatling Gun", obsoleteTech:"Industrialization", + promotions:["Logistics"], hurryCostModifier:20, attackSound:"arrow" - //Chinese unique unit. It is weaker than Crossbowman but can attack twice. }, - */ { name:"Longbowman", unitType:"Ranged", @@ -763,7 +773,6 @@ upgradesTo:"Battleship", hurryCostModifier:20 }, - /* { name:"Ship of the Line", unitType:"WaterRanged", @@ -774,13 +783,12 @@ rangedStrength:35, cost: 185, requiredResource:"Iron", - uniques:["Extra sight 1"] + uniques:["+1 Visibility Range"] requiredTech:"Navigation", obsoleteTech:"Electronics", upgradesTo:"Battleship", hurryCostModifier:20 }, - */ { name:"Lancer", unitType:"Mounted", @@ -873,7 +881,6 @@ hurryCostModifier:20, attackSound:"horse" }, - /* { name:"Cossack", unitType:"Mounted", @@ -885,11 +892,11 @@ requiredTech:"Military Science", requiredResource:"Horses", upgradesTo:"Landship", - uniques:["Can move after attacking","No defensive terrain bonus","Penalty vs City 33%","Damaged Enemy Bonus 33%" ], + uniques:["Can move after attacking","No defensive terrain bonus","Penalty vs City 33%","Bonus vs wounded units 33%" ], hurryCostModifier:20, attackSound:"horse" - //This Russian unique unit should replace Cavalry and also deal +33% damage to damaged units. }, + /* { name:"Comanche Rider", unitType:"Mounted", @@ -996,6 +1003,21 @@ obsoleteTech:"Plastics" attackSound:"shot" }, + { + name:"Foreign Legion", + unitType:"Melee", + replaces:"Great War Infantry", + uniqueTo:"France", + movement:2, + strength:50, + cost: 320, + requiredTech:"Replaceable Parts", + hurryCostModifier:20, + upgradesTo:"Infantry", + obsoleteTech:"Plastics", + uniques:["+20% bonus outside friendly territory"], + attackSound:"shot" + }, { name:"Infantry", unitType:"Melee", diff --git a/android/build.gradle b/android/build.gradle index 084be43192..f11ecce6bd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.app" minSdkVersion 14 targetSdkVersion 28 - versionCode 224 - versionName "2.14.4" + versionCode 227 + versionName "2.14.7" } // Had to add this crap for Travis to build, it wanted to sign the app diff --git a/core/src/com/unciv/GameStarter.kt b/core/src/com/unciv/GameStarter.kt index bd125bda9e..93f870008c 100644 --- a/core/src/com/unciv/GameStarter.kt +++ b/core/src/com/unciv/GameStarter.kt @@ -20,6 +20,7 @@ class GameParameters{ var humanNations=ArrayList().apply { add("Babylon") } var numberOfEnemies=3 var mapType= MapType.Perlin + var noBarbarians=false var mapFileName :String?=null } diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 5b70ae75d2..c7be01e047 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -47,7 +47,7 @@ class GameInfo { currentPlayerIndex = (currentPlayerIndex+1) % civilizations.size if(currentPlayerIndex==0){ turns++ - if (turns % 10 == 0) { // every 10 turns add a barbarian in a random place + if (turns % 10 == 0 && !gameParameters.noBarbarians) { // every 10 turns add a barbarian in a random place placeBarbarianUnit(null) } } diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 724f61dbcb..21970a2de8 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -28,11 +28,11 @@ class NextTurnAutomation{ automateUnits(civInfo) reassignWorkedTiles(civInfo) trainSettler(civInfo) - civInfo.diplomaticIncidents.clear() + civInfo.popupAlerts.clear() } private fun buyBuildingOrUnit(civInfo: CivilizationInfo) { - //allow ai spending money to purchase building & unit. Buying staff has slightly lower priority than buying tech. + //allow AI spending money to purchase building & unit. Buying staff has slightly lower priority than buying tech. for (city in civInfo.cities.sortedByDescending{ it.population.population }) { val construction = city.cityConstructions.getCurrentConstruction() if (construction.canBePurchased() diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 53efe5bbbb..4dde38288f 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -4,8 +4,8 @@ import com.badlogic.gdx.graphics.Color import com.unciv.logic.GameInfo import com.unciv.logic.automation.UnitAutomation import com.unciv.logic.city.CityInfo -import com.unciv.logic.civilization.diplomacy.DiplomaticIncident -import com.unciv.logic.civilization.diplomacy.DiplomaticIncidentType +import com.unciv.logic.civilization.AlertType +import com.unciv.logic.civilization.PopupAlert import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.unit.UnitType import java.util.* @@ -162,6 +162,7 @@ class Battle(val gameInfo:GameInfo) { private fun conquerCity(city: CityInfo, attacker: ICombatant) { val enemyCiv = city.civInfo attacker.getCivInfo().addNotification("We have conquered the city of [${city.name}]!",city.location, Color.RED) + attacker.getCivInfo().popupAlerts.add(PopupAlert(AlertType.CityConquered,city.name)) city.getCenterTile().apply { if(militaryUnit!=null) militaryUnit!!.destroy() @@ -185,6 +186,9 @@ class Battle(val gameInfo:GameInfo) { city.moveToCiv(attacker.getCivInfo()) city.resistanceCounter = city.population.population + city.workedTiles = hashSetOf() //reassign 1st working tile + city.population.specialists.clear() + city.population.autoAssignPopulation() city.cityStats.update() } @@ -194,7 +198,7 @@ class Battle(val gameInfo:GameInfo) { for(civ in gameInfo.civilizations) civ.addNotification("The civilization of [${enemyCiv.civName}] has been destroyed!", null, Color.RED) enemyCiv.getCivUnits().forEach { it.destroy() } - attacker.getCivInfo().diplomaticIncidents.add(DiplomaticIncident(enemyCiv.civName,DiplomaticIncidentType.Defeated)) + attacker.getCivInfo().popupAlerts.add(PopupAlert(AlertType.Defeated,enemyCiv.civName)) } else if(enemyCiv.cities.isNotEmpty()){ enemyCiv.cities.first().cityConstructions.addBuilding("Palace") // relocate palace diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 9705e24f34..96563b652d 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -1,6 +1,7 @@ package com.unciv.logic.battle import com.unciv.logic.map.MapUnit +import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.unit.UnitType import kotlin.math.max @@ -88,6 +89,8 @@ class BattleDamage{ val modifiers = getGeneralModifiers(attacker, defender) if(attacker is MapUnitCombatant) { + modifiers.putAll(getTileSpecificModifiers(attacker,defender.getTile())) + val defenderTile = defender.getTile() val isDefenderInRoughTerrain = defenderTile.baseTerrain=="Hill" || defenderTile.terrainFeature == "Forest" || defenderTile.terrainFeature == "Jungle" for (BDM in getBattleDamageModifiersOfUnit(attacker.unit)) { @@ -113,6 +116,7 @@ class BattleDamage{ else modifiers["Attacker Bonus"] = bonus } } + else if (attacker is CityCombatant) { if (attacker.getCivInfo().policies.isAdopted("Oligarchy") && attacker.city.getCenterTile().militaryUnit != null) modifiers["Oligarchy"] = 0.5f @@ -140,7 +144,9 @@ class BattleDamage{ val modifiers = getGeneralModifiers(defender, attacker) - if (!(defender.unit.hasUnique("No defensive terrain bonus"))) { + modifiers.putAll(getTileSpecificModifiers(defender, defender.getTile())) + + if (!defender.unit.hasUnique("No defensive terrain bonus")) { val tileDefenceBonus = defender.getTile().getDefensiveBonus() if (tileDefenceBonus > 0) modifiers["Terrain"] = tileDefenceBonus } @@ -172,6 +178,17 @@ class BattleDamage{ return modifiers } + private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): HashMap { + val modifiers = HashMap() + val isFriendlyTerritory = tile.getOwner()!=null && !unit.getCivInfo().isAtWarWith(tile.getOwner()!!) + if(isFriendlyTerritory && unit.getCivInfo().getBuildingUniques().contains("+15% combat strength for units fighting in friendly territory")) + modifiers["Himeji Castle"] = 0.15f + if(!isFriendlyTerritory && unit.unit.hasUnique("+20% bonus outside friendly territory")) + modifiers["Foreign Land"] = 0.2f + + return modifiers + } + private fun modifiersToMultiplicationBonus(modifiers: HashMap): Float { // modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss var finalModifier = 1f diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index e01d133196..ac3b176846 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -38,7 +38,7 @@ class CityConstructions { fun getStats(): Stats { val stats = Stats() for (building in getBuiltBuildings()) - stats.add(building.getStats(cityInfo.civInfo.policies.adoptedPolicies)) + stats.add(building.getStats(cityInfo.civInfo)) stats.science += (cityInfo.getBuildingUniques().count { it == "+1 Science Per 2 Population" } * cityInfo.population.population / 2).toFloat() return stats } @@ -199,7 +199,7 @@ class CityConstructions { cityInfo.civInfo.gold -= getConstruction(buildingName).getGoldCost(cityInfo.civInfo.policies.adoptedPolicies) getConstruction(buildingName).postBuildEvent(this) if (currentConstruction == buildingName) { - currentConstruction="" + currentConstruction = "" chooseNextConstruction() } cityInfo.cityStats.update() diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 8b19b629be..18b8f8656f 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -73,6 +73,7 @@ class CityInfo { if (listOf("Forest", "Jungle", "Marsh").contains(tile.terrainFeature)) tile.terrainFeature = null + workedTiles = hashSetOf() //reassign 1st working tile population.autoAssignPopulation() cityStats.update() } @@ -114,7 +115,9 @@ class CityInfo { if(civInfo.policies.isAdopted("Facism")) amountToAdd*=2 if(civInfo.getNation().unique=="Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity" && resource.name in listOf("Horses","Iron","Uranium")) - amountToAdd*=2 + amountToAdd *= 2 + if(resource.name=="Oil" && civInfo.getNation().unique=="+1 Gold from each Trade Route, Oil resources provide double quantity") + amountToAdd *= 2 } if(resource.resourceType == ResourceType.Luxury && getBuildingUniques().contains("Provides 1 extra copy of each improved luxury resource near this City")) diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 5d1e685036..7885b7b100 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -34,7 +34,8 @@ class CityStats { if (!cityInfo.isCapital() && isConnectedToCapital(RoadStatus.Road)) { val civInfo = cityInfo.civInfo var goldFromTradeRoute = civInfo.getCapital().population.population * 0.15 + cityInfo.population.population * 1.1 - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) - if (civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute += 2.0 + if(civInfo.getNation().unique=="+1 Gold from each Trade Route, Oil resources provide double quantity") goldFromTradeRoute += 1 + if (civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute += 2 if (civInfo.getBuildingUniques().contains("Gold from all trade routes +25%")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality stats.gold += goldFromTradeRoute.toFloat() } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 3c144015da..27d522db4b 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -7,8 +7,6 @@ import com.unciv.UnCivGame import com.unciv.logic.GameInfo import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.diplomacy.DiplomacyManager -import com.unciv.logic.civilization.diplomacy.DiplomaticIncident -import com.unciv.logic.civilization.diplomacy.DiplomaticIncidentType import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.map.BFS import com.unciv.logic.map.MapUnit @@ -63,7 +61,7 @@ class CivilizationInfo { var victoryManager=VictoryManager() var diplomacy = HashMap() var notifications = ArrayList() - val diplomaticIncidents = ArrayList() + val popupAlerts = ArrayList() // if we only use lists, and change the list each time the cities are changed, // we won't get concurrent modification exceptions. @@ -296,12 +294,13 @@ class CivilizationInfo { fun meetCivilization(otherCiv: CivilizationInfo) { diplomacy[otherCiv.civName] = DiplomacyManager(this, otherCiv.civName) .apply { diplomaticStatus = DiplomaticStatus.Peace } - otherCiv.diplomaticIncidents.add(DiplomaticIncident(civName, DiplomaticIncidentType.FirstContact)) + + otherCiv.popupAlerts.add(PopupAlert(AlertType.FirstContact,civName)) otherCiv.diplomacy[civName] = DiplomacyManager(otherCiv, civName) .apply { diplomaticStatus = DiplomaticStatus.Peace } - diplomaticIncidents.add(DiplomaticIncident(otherCiv.civName, DiplomaticIncidentType.FirstContact)) + popupAlerts.add(PopupAlert(AlertType.FirstContact,otherCiv.civName)) } override fun toString(): String {return civName} // for debug diff --git a/core/src/com/unciv/logic/civilization/PopupAlert.kt b/core/src/com/unciv/logic/civilization/PopupAlert.kt new file mode 100644 index 0000000000..8ca8f8d797 --- /dev/null +++ b/core/src/com/unciv/logic/civilization/PopupAlert.kt @@ -0,0 +1,10 @@ +package com.unciv.logic.civilization + +enum class AlertType{ + WarDeclaration, + Defeated, + FirstContact, + CityConquered +} + +class PopupAlert (val type:AlertType, val value:String) diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 042d8ad095..51761c6fc7 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -1,7 +1,9 @@ package com.unciv.logic.civilization.diplomacy import com.badlogic.gdx.graphics.Color +import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.logic.civilization.PopupAlert import com.unciv.logic.trade.Trade import com.unciv.logic.trade.TradeType import com.unciv.models.Counter @@ -97,9 +99,11 @@ class DiplomacyManager() { fun declareWar(){ diplomaticStatus = DiplomaticStatus.War - otherCiv().diplomacy[civInfo.civName]!!.diplomaticStatus = DiplomaticStatus.War - otherCiv().addNotification("[${civInfo.civName}] has declared war on us!",null, Color.RED) - otherCiv().diplomaticIncidents.add(DiplomaticIncident(civInfo.civName,DiplomaticIncidentType.WarDeclaration)) + val otherCiv = otherCiv() + + otherCiv.diplomacy[civInfo.civName]!!.diplomaticStatus = DiplomaticStatus.War + otherCiv.addNotification("[${civInfo.civName}] has declared war on us!",null, Color.RED) + otherCiv.popupAlerts.add(PopupAlert(AlertType.WarDeclaration,civInfo.civName)) } //endregion } \ No newline at end of file diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncident.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncident.kt deleted file mode 100644 index 23954f1796..0000000000 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncident.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.unciv.logic.civilization.diplomacy - -import com.unciv.logic.trade.Trade - -class DiplomaticIncident(val civName:String, val type: DiplomaticIncidentType, val trade: Trade?=null) \ No newline at end of file diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncidentType.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncidentType.kt deleted file mode 100644 index e1a0f60fd8..0000000000 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomaticIncidentType.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.unciv.logic.civilization.diplomacy - -enum class DiplomaticIncidentType{ - WarDeclaration, - Defeated, - FirstContact -} \ No newline at end of file diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 9edf3aee7e..126cf00185 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -176,6 +176,7 @@ class MapUnit { fun isIdle(): Boolean { if (currentMovement == 0f) return false if (name == "Worker" && getTile().improvementInProgress != null) return false + if (hasUnique("Can construct roads") && currentTile.improvementInProgress=="Road") return false if (isFortified()) return false if (action=="Sleep") return false return true @@ -301,6 +302,7 @@ class MapUnit { private fun doPostTurnAction() { if (name == "Worker" && getTile().improvementInProgress != null) workOnImprovement() + if(hasUnique("Can construct roads") && currentTile.improvementInProgress=="Road") workOnImprovement() if(currentMovement== getMaxMovement().toFloat() && isFortified()){ val currentTurnsFortified = getFortificationTurns() diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index 246be196d7..9b2c815cb8 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -21,6 +21,7 @@ enum class MapType { File } + class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { var landProb = 0.55f var numSmooth = 4 @@ -28,7 +29,7 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { constructor(type: MapType): this() { mapType = type - if (mapType < MapType.Default) { + if (mapType != MapType.Default && mapType !=MapType.Pangaea) { mapType = MapType.Default } } @@ -77,6 +78,8 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { for(tile in mapToReturn.values) randomizeTile(tile,mapToReturn) + randomizeStrategicResources(mapToReturn,distance) + return mapToReturn } @@ -227,6 +230,8 @@ class PerlinNoiseRandomMapGenerator:SeedRandomMapGenerator(){ for(tile in mapToReturn.values) randomizeTile(tile,mapToReturn) + randomizeStrategicResources(mapToReturn,distance) + return mapToReturn } @@ -333,6 +338,7 @@ open class SeedRandomMapGenerator : RandomMapGenerator() { for (entry in map) randomizeTile(entry.value, mapToReturn) setWaterTiles(mapToReturn) + randomizeStrategicResources(mapToReturn,distance) return mapToReturn } @@ -357,15 +363,6 @@ open class SeedRandomMapGenerator : RandomMapGenerator() { } expandAreas(areas, map) - -// After we've assigned all the tiles, there will be some areas that contain only 1 or 2 tiles. -// So, we kill those areas, and have the world expand on and cover them too -// for (area in areas.toList()) { -// if (area.locations.size < 3) { -// areas -= area -// for (location in area.locations) map[location]!!.baseTerrain = "" -// } -// } expandAreas(areas, map) } @@ -450,7 +447,7 @@ open class RandomMapGenerator { var resource: TileResource? = null when { - Math.random() < 1 / 5f -> resource = getRandomResource(tileResources, ResourceType.Bonus) + Math.random() < 1 / 15f -> resource = getRandomResource(tileResources, ResourceType.Bonus) Math.random() < 1 / 15f -> resource = getRandomResource(tileResources, ResourceType.Strategic) Math.random() < 1 / 15f -> resource = getRandomResource(tileResources, ResourceType.Luxury) } @@ -504,4 +501,40 @@ open class RandomMapGenerator { addRandomResourceToTile(tileInfo) maybeAddAncientRuins(tileInfo) } + + + fun randomizeStrategicResources(mapToReturn: HashMap,distance: Int) { + for(tile in mapToReturn.values) + if(tile.resource!=null && tile.getTileResource().resourceType==ResourceType.Strategic) + tile.resource=null + + for(resource in GameBasics.TileResources.values.filter { it.resourceType==ResourceType.Strategic }){ + val suitableTiles = mapToReturn.values + .filter { it.resource==null && resource.terrainsCanBeFoundOn.contains(it.getLastTerrain().name) } + + val numberOfResources = mapToReturn.count() / 100 + + val locations = chooseSpreadOutLocations(numberOfResources,suitableTiles, distance) + + for(location in locations) location.resource = resource.name + } + } + + fun chooseSpreadOutLocations(numberOfResources: Int, suitableTiles: List, initialDistance:Int): ArrayList { + + for(distanceBetweenResources in initialDistance downTo 1){ + var availableTiles = suitableTiles.toList() + val chosenTiles = ArrayList() + + for(i in 1..numberOfResources){ + if(availableTiles.isEmpty()) break + val chosenTile = availableTiles.random() + availableTiles = availableTiles.filter { it.arialDistanceTo(chosenTile)>distanceBetweenResources } + chosenTiles.add(chosenTile) + } + if(chosenTiles.size == numberOfResources) return chosenTiles + } + throw Exception("ArgleBargle") + } + } \ No newline at end of file diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index 76c663b7b8..9d787673fb 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -43,7 +43,6 @@ class TileMap { mapValues = CelluarAutomataRandomMapGenerator(newGameParameters.mapType).generateMap(newGameParameters.mapRadius).values tileList.addAll(mapValues) -// tileList.addAll(AlexanderRandomMapGenerator().generateMap(distance,0.8f).values) setTransients() } diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index aab30f297f..be11a19fc4 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -2,6 +2,7 @@ package com.unciv.models.gamebasics import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.IConstruction +import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.gamebasics.tech.Technology import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stats @@ -10,7 +11,7 @@ import com.unciv.ui.utils.getRandom class Building : NamedStats(), IConstruction{ override val description: String - get() = getDescription(false, hashSetOf()) + get() = getDescription(false, null) var requiredTech: String? = null @@ -50,7 +51,7 @@ class Building : NamedStats(), IConstruction{ fun getShortDescription(): String { // should fit in one line val infoList= mutableListOf() - val str = getStats(hashSetOf()).toString() + val str = getStats(null).toString() if(str.isNotEmpty()) infoList += str if(percentStatBonus!=null){ for(stat in percentStatBonus!!.toHashMap()) @@ -70,8 +71,8 @@ class Building : NamedStats(), IConstruction{ return infoList.joinToString() } - fun getDescription(forBuildingPickerScreen: Boolean, adoptedPolicies: HashSet): String { - val stats = getStats(adoptedPolicies) + fun getDescription(forBuildingPickerScreen: Boolean, civInfo: CivilizationInfo?): String { + val stats = getStats(civInfo) val stringBuilder = StringBuilder() if(uniqueTo!=null) stringBuilder.appendln("Unique to [$uniqueTo], replaces [$replaces]".tr()) if (!forBuildingPickerScreen) stringBuilder.appendln("{Cost}: $cost".tr()) @@ -118,35 +119,44 @@ class Building : NamedStats(), IConstruction{ } val cultureBuildings = hashSetOf("Monument", "Temple", "Monastery") - fun getStats(adoptedPolicies: HashSet): Stats { + + fun getStats(civInfo: CivilizationInfo?): Stats { val stats = this.clone() - if (adoptedPolicies.contains("Organized Religion") && cultureBuildings.contains(name)) - stats.happiness += 1 + if(civInfo != null) { + val adoptedPolicies = civInfo.policies.adoptedPolicies + if (adoptedPolicies.contains("Organized Religion") && cultureBuildings.contains(name)) + stats.happiness += 1 - if (adoptedPolicies.contains("Free Religion") && cultureBuildings.contains(name)) - stats.culture += 1f + if (adoptedPolicies.contains("Free Religion") && cultureBuildings.contains(name)) + stats.culture += 1f - if (adoptedPolicies.contains("Entrepreneurship") && hashSetOf("Mint", "Market", "Bank", "Stock Market").contains(name)) - stats.science += 1f + if (adoptedPolicies.contains("Entrepreneurship") && hashSetOf("Mint", "Market", "Bank", "Stock Market").contains(name)) + stats.science += 1f - if (adoptedPolicies.contains("Humanism") && hashSetOf("University", "Observatory", "Public School").contains(name)) - stats.happiness += 1f + if (adoptedPolicies.contains("Humanism") && hashSetOf("University", "Observatory", "Public School").contains(name)) + stats.happiness += 1f - if (adoptedPolicies.contains("Theocracy") && name == "Temple") - percentStatBonus = Stats().apply { gold=10f } + if (adoptedPolicies.contains("Theocracy") && name == "Temple") + percentStatBonus = Stats().apply { gold = 10f } - if (adoptedPolicies.contains("Free Thought") && name == "University") - percentStatBonus!!.science = 50f + if (adoptedPolicies.contains("Free Thought") && name == "University") + percentStatBonus!!.science = 50f - if (adoptedPolicies.contains("Rationalism Complete") && !isWonder && stats.science > 0) - stats.gold += 1f + if (adoptedPolicies.contains("Rationalism Complete") && !isWonder && stats.science > 0) + stats.gold += 1f - if (adoptedPolicies.contains("Constitution") && isWonder) - stats.culture += 2f + if (adoptedPolicies.contains("Constitution") && isWonder) + stats.culture += 2f - if(adoptedPolicies.contains("Autocracy Complete") && cityStrength>0) - stats.happiness+=1 + if (adoptedPolicies.contains("Autocracy Complete") && cityStrength > 0) + stats.happiness += 1 + if (name == "Castle" && civInfo.getBuildingUniques().contains("+1 happiness, +2 culture and +3 gold from every Castle")){ + stats.happiness+=1 + stats.culture+=2 + stats.gold+=3 + } + } return stats } diff --git a/core/src/com/unciv/ui/NationTable.kt b/core/src/com/unciv/ui/NationTable.kt index b9229de01b..6f60e774ef 100644 --- a/core/src/com/unciv/ui/NationTable.kt +++ b/core/src/com/unciv/ui/NationTable.kt @@ -60,6 +60,12 @@ class NationTable(val nation: Nation, val newGameParameters: GameParameters, ski textList += " "+unique.tr() if (building.maintenance != originalBuilding.maintenance) textList += " {Maintenance} " + building.maintenance + " vs " + originalBuilding.maintenance + if(building.cost != originalBuilding.cost) + textList += " {Cost} " + building.cost + " vs " + originalBuilding.cost + if(building.cityStrength != originalBuilding.cityStrength) + textList += " {City strength} " + building.cityStrength+ " vs " + originalBuilding.cityStrength + if(building.cityHealth!= originalBuilding.cityHealth) + textList += " {City health} " + building.cityHealth+ " vs " + originalBuilding.cityHealth textList+="" } @@ -76,10 +82,13 @@ class NationTable(val nation: Nation, val newGameParameters: GameParameters, ski textList+= " {Range} " + unit.range+ " vs " + originalUnit.range if (unit.movement!= originalUnit.movement) textList+= " {Movement} " + unit.movement+ " vs " + originalUnit.movement + if(originalUnit.requiredResource!=null && unit.requiredResource==null) + textList+= " "+"[${originalUnit.requiredResource}] not required".tr() for(unique in unit.uniques.filterNot { it in originalUnit.uniques }) textList += " "+Translations.translateBonusOrPenalty(unique) - for(promotions in unit.promotions.filter { it !in originalUnit.promotions}) - textList += " "+promotions.tr() + for(promotion in unit.promotions.filter { it !in originalUnit.promotions}) + textList += " "+promotion.tr()+ " ("+Translations.translateBonusOrPenalty(GameBasics.UnitPromotions[promotion]!!.effect)+")" + textList+="" } diff --git a/core/src/com/unciv/ui/NewGameScreen.kt b/core/src/com/unciv/ui/NewGameScreen.kt index b278a6a54a..7f0ff8cf28 100644 --- a/core/src/com/unciv/ui/NewGameScreen.kt +++ b/core/src/com/unciv/ui/NewGameScreen.kt @@ -2,10 +2,7 @@ package com.unciv.ui import com.badlogic.gdx.Gdx import com.badlogic.gdx.scenes.scene2d.Actor -import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane -import com.badlogic.gdx.scenes.scene2d.ui.SelectBox -import com.badlogic.gdx.scenes.scene2d.ui.Skin -import com.badlogic.gdx.scenes.scene2d.ui.Table +import com.badlogic.gdx.scenes.scene2d.ui.* import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener import com.badlogic.gdx.utils.Array import com.unciv.GameStarter @@ -74,17 +71,50 @@ class NewGameScreen: PickerScreen(){ val newGameOptionsTable = Table() newGameOptionsTable.skin = skin + addMapTypeSizeAndFile(newGameOptionsTable) + + addNumberOfHumansAndEnemies(newGameOptionsTable) + + addDifficultySelectBox(newGameOptionsTable) + + val noBarbariansCheckbox = CheckBox("No barbarians",skin) + noBarbariansCheckbox.isChecked=newGameParameters.noBarbarians + noBarbariansCheckbox.addListener(object : ChangeListener() { + override fun changed(event: ChangeEvent?, actor: Actor?) { + newGameParameters.noBarbarians = noBarbariansCheckbox.isChecked + } + }) + newGameOptionsTable.add(noBarbariansCheckbox).colspan(2).row() + + + rightSideButton.enable() + rightSideButton.setText("Start game!".tr()) + rightSideButton.onClick { + Gdx.input.inputProcessor = null // remove input processing - nothing will be clicked! + rightSideButton.disable() + rightSideButton.setText("Working...".tr()) + + thread { // Creating a new game can take a while and we don't want ANRs + newGame = GameStarter().startNewGame(newGameParameters) + } + } + + newGameOptionsTable.pack() + return newGameOptionsTable + } + + private fun addMapTypeSizeAndFile(newGameOptionsTable: Table) { newGameOptionsTable.add("{Map type}:".tr()) val mapTypes = LinkedHashMap() for (type in MapType.values()) { - if(type==MapType.File && GameSaver().getMaps().isEmpty()) continue + if (type == MapType.File && GameSaver().getMaps().isEmpty()) continue mapTypes[type.toString()] = type } val mapFileLabel = "{Map file}:".toLabel() val mapFileSelectBox = getMapFileSelectBox() - mapFileLabel.isVisible=false - mapFileSelectBox.isVisible=false + mapFileLabel.isVisible = false + mapFileSelectBox.isVisible = false val mapTypeSelectBox = TranslatedSelectBox(mapTypes.keys, newGameParameters.mapType.toString(), skin) @@ -98,13 +128,13 @@ class NewGameScreen: PickerScreen(){ worldSizeSelectBox.isVisible = false worldSizeLabel.isVisible = false mapFileSelectBox.isVisible = true - mapFileLabel.isVisible=true + mapFileLabel.isVisible = true newGameParameters.mapFileName = mapFileSelectBox.selected } else { worldSizeSelectBox.isVisible = true worldSizeLabel.isVisible = true mapFileSelectBox.isVisible = false - mapFileLabel.isVisible=false + mapFileLabel.isVisible = false newGameParameters.mapFileName = null } } @@ -117,8 +147,9 @@ class NewGameScreen: PickerScreen(){ newGameOptionsTable.add(mapFileLabel) newGameOptionsTable.add(mapFileSelectBox).pad(10f).row() + } - + private fun addNumberOfHumansAndEnemies(newGameOptionsTable: Table) { newGameOptionsTable.add("{Number of human players}:".tr()) val humanPlayers = SelectBox(skin) val humanPlayersArray = Array() @@ -131,7 +162,7 @@ class NewGameScreen: PickerScreen(){ newGameOptionsTable.add("{Number of enemies}:".tr()) val enemiesSelectBox = SelectBox(skin) val enemiesArray = Array() - (0..GameBasics.Nations.size-1).forEach { enemiesArray.add(it) } + (0..GameBasics.Nations.size - 1).forEach { enemiesArray.add(it) } enemiesSelectBox.items = enemiesArray enemiesSelectBox.selected = newGameParameters.numberOfEnemies newGameOptionsTable.add(enemiesSelectBox).pad(10f).row() @@ -153,32 +184,17 @@ class NewGameScreen: PickerScreen(){ removeExtraHumanNations(humanPlayers) } }) + } + private fun addDifficultySelectBox(newGameOptionsTable: Table) { newGameOptionsTable.add("{Difficulty}:".tr()) - val difficultySelectBox = TranslatedSelectBox(GameBasics.Difficulties.keys, newGameParameters.difficulty , skin) + val difficultySelectBox = TranslatedSelectBox(GameBasics.Difficulties.keys, newGameParameters.difficulty, skin) difficultySelectBox.addListener(object : ChangeListener() { override fun changed(event: ChangeEvent?, actor: Actor?) { newGameParameters.difficulty = difficultySelectBox.selected.value } }) newGameOptionsTable.add(difficultySelectBox).pad(10f).row() - - - rightSideButton.enable() - rightSideButton.setText("Start game!".tr()) - rightSideButton.onClick { - Gdx.input.inputProcessor = null // remove input processing - nothing will be clicked! - rightSideButton.disable() - rightSideButton.setText("Working...".tr()) - - thread { - // Creating a new game can tke a while and we don't want ANRs - newGame = GameStarter().startNewGame(newGameParameters) - } - } - - newGameOptionsTable.pack() - return newGameOptionsTable } private fun getMapFileSelectBox(): SelectBox { diff --git a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt index bb494e70a1..0e9884046b 100644 --- a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt @@ -60,7 +60,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS wonderDetailsTable.clear() else{ val detailsString = building.getDescription(true, - cityScreen.city.civInfo.policies.adoptedPolicies) + cityScreen.city.civInfo) wonderDetailsTable.add(detailsString.toLabel().apply { setWrap(true)}) .width(cityScreen.stage.width/4 - 2*pad ).row() // when you set wrap, then you need to manually set the size of the label if(!building.isWonder) { diff --git a/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt b/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt index db5d56ca31..d4b650daa4 100644 --- a/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt +++ b/core/src/com/unciv/ui/cityscreen/ConstructionsTable.kt @@ -18,6 +18,7 @@ import com.unciv.ui.worldscreen.optionstable.YesNoPopupTable class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScreen.skin){ var constructionScrollPane:ScrollPane?=null + var lastConstruction = "" private fun getProductionButton(construction: String, buttonText: String, rejectionReason: String=""): Table { val pickProductionButton = Table() @@ -35,6 +36,7 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre if(rejectionReason=="") { pickProductionButton.onClick { + lastConstruction = cityScreen.city.cityConstructions.currentConstruction cityScreen.city.cityConstructions.currentConstruction = construction cityScreen.city.cityStats.update() cityScreen.update() @@ -131,7 +133,8 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre } private fun addCurrentConstructionTable(city: CityInfo) { - val construction = city.cityConstructions.getCurrentConstruction() + val cityConstructions = city.cityConstructions + val construction = cityConstructions.getCurrentConstruction() row() val purchaseConstructionButton: TextButton @@ -140,7 +143,9 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre purchaseConstructionButton = TextButton("Buy for [$buildingGoldCost] gold".tr(), CameraStageBaseScreen.skin) purchaseConstructionButton.onClick("coin") { YesNoPopupTable("Would you like to purchase [${construction.name}] for [$buildingGoldCost] gold?".tr(), { - city.cityConstructions.purchaseBuilding(construction.name) + cityConstructions.purchaseBuilding(construction.name) + if(lastConstruction!="" && cityConstructions.getConstruction(lastConstruction).isBuildable(cityConstructions)) + city.cityConstructions.currentConstruction = lastConstruction update() }, cityScreen) } @@ -170,7 +175,7 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre if (currentConstruction is BaseUnit) description = currentConstruction.getDescription(true) else if (currentConstruction is Building) - description = currentConstruction.getDescription(true, city.civInfo.policies.adoptedPolicies) + description = currentConstruction.getDescription(true, city.civInfo) else description = currentConstruction.description.tr() val descriptionLabel = description.toLabel() diff --git a/core/src/com/unciv/ui/tilegroups/CityButton.kt b/core/src/com/unciv/ui/tilegroups/CityButton.kt index b59108956f..4b18123e64 100644 --- a/core/src/com/unciv/ui/tilegroups/CityButton.kt +++ b/core/src/com/unciv/ui/tilegroups/CityButton.kt @@ -93,8 +93,9 @@ class CityButton(val city: CityInfo, internal val tileGroup: WorldTileGroup, ski group.addActor(image) val secondaryColor = cityConstructions.cityInfo.civInfo.getNation().getSecondaryColor() - if(cityConstructions.getCurrentConstruction() !is SpecialConstruction) { - val turnsToConstruction = cityConstructions.turnsToConstruction(cityConstructions.currentConstruction) + val cityCurrentConstruction = cityConstructions.getCurrentConstruction() + if(cityCurrentConstruction !is SpecialConstruction) { + val turnsToConstruction = cityConstructions.turnsToConstruction(cityCurrentConstruction.name) val label = turnsToConstruction.toString().toLabel() label.setFontColor(secondaryColor) label.setFontSize(10) diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 01b6b690a6..90fc0cde9c 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -3,6 +3,7 @@ package com.unciv.ui.tilegroups 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.Touchable import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.utils.Align import com.unciv.UnCivGame @@ -49,6 +50,8 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { var populationImage: Image? = null //reuse for acquire icon private val roadImages = HashMap() private val borderImages = HashMap>() // map of neighboring tile to border images + + val unitLayerGroup = Group().apply { isTransform=false; setSize(groupSize,groupSize);touchable=Touchable.disabled } protected var civilianUnitImage: UnitGroup? = null protected var militaryUnitImage: UnitGroup? = null @@ -71,6 +74,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { this.addActor(baseLayerGroup) this.addActor(featureLayerGroup) this.addActor(miscLayerGroup) + this.addActor(unitLayerGroup) this.addActor(circleCrosshairFogLayerGroup) updateTileImage(false) @@ -426,7 +430,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { newImage.blackSpinningCircle = ImageGetter.getCircle() .apply { rotation= oldUnitGroup.blackSpinningCircle!!.rotation} } - miscLayerGroup.addActor(newImage) + unitLayerGroup.addActor(newImage) newImage.center(this) newImage.y += yFromCenter diff --git a/core/src/com/unciv/ui/worldscreen/TileGroupMap.kt b/core/src/com/unciv/ui/worldscreen/TileGroupMap.kt index 47f7e0fbd1..45ac5c30bf 100644 --- a/core/src/com/unciv/ui/worldscreen/TileGroupMap.kt +++ b/core/src/com/unciv/ui/worldscreen/TileGroupMap.kt @@ -30,6 +30,7 @@ class TileGroupMap(tileGroups:Collection, padding:Float): Group val baseLayers = ArrayList() val featureLayers = ArrayList() val miscLayers = ArrayList() + val unitLayers = ArrayList() val circleCrosshairFogLayers = ArrayList() for(group in tileGroups.sortedByDescending { it.tileInfo.position.x + it.tileInfo.position.y }){ @@ -37,13 +38,15 @@ class TileGroupMap(tileGroups:Collection, padding:Float): Group baseLayers.add(group.baseLayerGroup.apply { setPosition(group.x,group.y) }) featureLayers.add(group.featureLayerGroup.apply { setPosition(group.x,group.y) }) miscLayers.add(group.miscLayerGroup.apply { setPosition(group.x,group.y) }) + unitLayers.add(group.unitLayerGroup.apply { setPosition(group.x,group.y) }) circleCrosshairFogLayers.add(group.circleCrosshairFogLayerGroup.apply { setPosition(group.x,group.y) }) } for(group in baseLayers) addActor(group) for(group in featureLayers) addActor(group) for(group in miscLayers) addActor(group) for(group in circleCrosshairFogLayers) addActor(group) - for(group in tileGroups) addActor(group) // The above layers are for the visual layers, this is for the cli + for(group in tileGroups) addActor(group) // The above layers are for the visual layers, this is for the clickability + for(group in unitLayers) addActor(group) // Aaand units above everything else. // there are tiles "below the zero", diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index e5fe495e38..5265f98af2 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -8,11 +8,12 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.UnCivGame import com.unciv.logic.GameSaver +import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.CivilizationInfo -import com.unciv.logic.civilization.diplomacy.DiplomaticIncident -import com.unciv.logic.civilization.diplomacy.DiplomaticIncidentType +import com.unciv.logic.civilization.PopupAlert import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.models.gamebasics.GameBasics +import com.unciv.models.gamebasics.Nation import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.models.gamebasics.tr import com.unciv.models.gamebasics.unit.UnitType @@ -171,8 +172,8 @@ class WorldScreen : CameraStageBaseScreen() { else if(currentPlayerCiv.greatPeople.freeGreatPeople>0) game.screen = GreatPersonPickerScreen() if(game.screen==this && !tutorials.isTutorialShowing - && currentPlayerCiv.diplomaticIncidents.any() && !DiplomaticIncidentPopup.isOpen){ - DiplomaticIncidentPopup(this,currentPlayerCiv.diplomaticIncidents.first()) + && currentPlayerCiv.popupAlerts.any() && !AlertPopup.isOpen){ + AlertPopup(this,currentPlayerCiv.popupAlerts.first()) } } @@ -329,43 +330,59 @@ class WorldScreen : CameraStageBaseScreen() { } -class DiplomaticIncidentPopup(val worldScreen: WorldScreen, val diplomaticIncident: DiplomaticIncident):PopupTable(worldScreen){ +class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert):PopupTable(worldScreen){ fun getCloseButton(text:String): TextButton { val button = TextButton(text.tr(), skin) button.onClick { close() } return button } - init { - val otherCiv = worldScreen.gameInfo.getCivilization(diplomaticIncident.civName) - val translatedNation = otherCiv.getTranslatedNation() + fun addLeaderName(translatedNation:Nation){ val otherCivLeaderName = "[${translatedNation.leaderName}] of [${translatedNation.getNameTranslation()}]".tr() add(otherCivLeaderName.toLabel()) addSeparator() + } - when(diplomaticIncident.type){ - DiplomaticIncidentType.WarDeclaration -> { + init { + + when(popupAlert.type){ + AlertType.WarDeclaration -> { + val translatedNation = worldScreen.gameInfo.getCivilization(popupAlert.value).getTranslatedNation() + addLeaderName(translatedNation) addGoodSizedLabel(translatedNation.declaringWar).row() val responseTable = Table() responseTable.add(getCloseButton("You'll pay for this!")) responseTable.add(getCloseButton("Very well.")) add(responseTable) } - DiplomaticIncidentType.Defeated -> { + AlertType.Defeated -> { + val translatedNation = worldScreen.gameInfo.getCivilization(popupAlert.value).getTranslatedNation() + addLeaderName(translatedNation) addGoodSizedLabel(translatedNation.defeated).row() add(getCloseButton("Farewell.")) } - DiplomaticIncidentType.FirstContact -> { + AlertType.FirstContact -> { + val translatedNation = worldScreen.gameInfo.getCivilization(popupAlert.value).getTranslatedNation() + addLeaderName(translatedNation) addGoodSizedLabel(translatedNation.introduction).row() add(getCloseButton("A pleasure to meet you.")) } + AlertType.CityConquered -> { + addGoodSizedLabel("What would you like to do with the city?").row() + add(getCloseButton("Annex")).row() + add(TextButton("Raze",skin).onClick { + worldScreen.currentPlayerCiv.cities.first { it.name==popupAlert.value }.isBeingRazed=true + worldScreen.shouldUpdate=true + close() + }) + } } open() isOpen = true } fun close(){ - worldScreen.currentPlayerCiv.diplomaticIncidents.remove(diplomaticIncident) + worldScreen.currentPlayerCiv.popupAlerts.remove(popupAlert) isOpen = false remove() } diff --git a/core/src/com/unciv/ui/worldscreen/optionstable/PopupTable.kt b/core/src/com/unciv/ui/worldscreen/optionstable/PopupTable.kt index 1065ad3c3e..277662b041 100644 --- a/core/src/com/unciv/ui/worldscreen/optionstable/PopupTable.kt +++ b/core/src/com/unciv/ui/worldscreen/optionstable/PopupTable.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Cell import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton +import com.badlogic.gdx.utils.Align import com.unciv.UnCivGame import com.unciv.models.gamebasics.tr import com.unciv.ui.utils.* @@ -27,6 +28,7 @@ open class PopupTable(val screen: CameraStageBaseScreen): Table(CameraStageBaseS fun addGoodSizedLabel(text: String): Cell