diff --git a/android/Images.NationIcons/NationIcons/Random.png b/android/Images.NationIcons/NationIcons/Random.png new file mode 100644 index 0000000000..dea58af34e Binary files /dev/null and b/android/Images.NationIcons/NationIcons/Random.png differ diff --git a/android/Images.NationIcons/NationIcons/Spectator.png b/android/Images.NationIcons/NationIcons/Spectator.png new file mode 100644 index 0000000000..b984a427b2 Binary files /dev/null and b/android/Images.NationIcons/NationIcons/Spectator.png differ diff --git a/android/Images/ImprovementIcons/Cancel improvement order.png b/android/Images/ImprovementIcons/Cancel improvement order.png new file mode 100644 index 0000000000..0fe42953fb Binary files /dev/null and b/android/Images/ImprovementIcons/Cancel improvement order.png differ diff --git a/android/Images/OtherIcons/Unique.png b/android/Images/OtherIcons/Unique.png deleted file mode 100644 index 8a5df70b64..0000000000 Binary files a/android/Images/OtherIcons/Unique.png and /dev/null differ diff --git a/android/Images/UniqueIcons/Fallback.png b/android/Images/UniqueIcons/Fallback.png new file mode 100644 index 0000000000..82b80c35a7 Binary files /dev/null and b/android/Images/UniqueIcons/Fallback.png differ diff --git a/android/assets/NationIcons.atlas b/android/assets/NationIcons.atlas index 3a1a954b07..4176729399 100644 --- a/android/assets/NationIcons.atlas +++ b/android/assets/NationIcons.atlas @@ -1,257 +1,271 @@ NationIcons.png -size: 2048, 256 +size: 2048, 512 format: RGBA8888 filter: MipMapLinearLinear, MipMapLinearLinear repeat: none NationIcons/America rotate: false - xy: 4, 112 + xy: 4, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Arabia rotate: false - xy: 4, 4 + xy: 4, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Austria rotate: false - xy: 112, 112 + xy: 112, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Aztecs rotate: false - xy: 112, 4 + xy: 4, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Babylon rotate: false - xy: 220, 112 + xy: 112, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Barbarians rotate: false - xy: 220, 4 + xy: 220, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Byzantium rotate: false - xy: 328, 112 + xy: 4, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Carthage rotate: false - xy: 328, 4 + xy: 112, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Celts rotate: false - xy: 436, 112 + xy: 220, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/China rotate: false - xy: 436, 4 + xy: 328, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/CityState rotate: false - xy: 544, 112 + xy: 112, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Denmark rotate: false - xy: 544, 4 + xy: 220, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Egypt rotate: false - xy: 652, 112 + xy: 328, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/England rotate: false - xy: 652, 4 + xy: 436, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Ethiopia rotate: false - xy: 760, 112 + xy: 220, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/France rotate: false - xy: 760, 4 + xy: 328, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Germany rotate: false - xy: 868, 112 + xy: 436, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Greece rotate: false - xy: 868, 4 + xy: 544, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Inca rotate: false - xy: 976, 112 + xy: 328, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/India rotate: false - xy: 976, 4 + xy: 436, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Iroquois rotate: false - xy: 1084, 112 + xy: 544, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Japan rotate: false - xy: 1084, 4 + xy: 652, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Korea rotate: false - xy: 1192, 112 + xy: 436, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Mongolia rotate: false - xy: 1192, 4 + xy: 544, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Persia rotate: false - xy: 1300, 112 + xy: 652, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Polynesia rotate: false - xy: 1300, 4 + xy: 760, 328 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NationIcons/Random + rotate: false + xy: 544, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Rome rotate: false - xy: 1408, 112 + xy: 652, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Russia rotate: false - xy: 1408, 4 + xy: 760, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Siam rotate: false - xy: 1516, 112 + xy: 868, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Songhai rotate: false - xy: 1516, 4 + xy: 652, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Spain rotate: false - xy: 1624, 112 + xy: 760, 112 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NationIcons/Spectator + rotate: false + xy: 868, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/Sweden rotate: false - xy: 1624, 4 + xy: 976, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Huns rotate: false - xy: 1732, 112 + xy: 760, 4 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Maya rotate: false - xy: 1732, 4 + xy: 868, 112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Netherlands rotate: false - xy: 1840, 112 + xy: 976, 220 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 NationIcons/The Ottomans rotate: false - xy: 1840, 4 + xy: 1084, 328 size: 100, 100 orig: 100, 100 offset: 0, 0 diff --git a/android/assets/NationIcons.png b/android/assets/NationIcons.png index c047ee5b80..f63777bfec 100644 Binary files a/android/assets/NationIcons.png and b/android/assets/NationIcons.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index c4b07217db..a162f5663d 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -6,1568 +6,1575 @@ filter: MipMapLinearLinear, MipMapLinearLinear repeat: none CityStateIcons/Cultured rotate: false - xy: 514, 1748 + xy: 298, 1643 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 CityStateIcons/Maritime rotate: false - xy: 514, 776 + xy: 622, 995 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 CityStateIcons/Mercantile rotate: false - xy: 730, 992 + xy: 514, 779 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 CityStateIcons/Militaristic rotate: false - xy: 622, 776 + xy: 622, 887 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 CityStateIcons/Religious rotate: false - xy: 343, 344 + xy: 767, 461 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 EmojiIcons/Culture rotate: false - xy: 991, 562 + xy: 946, 1024 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Faith rotate: false - xy: 991, 504 + xy: 946, 966 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Food rotate: false - xy: 941, 369 + xy: 946, 908 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Gold rotate: false - xy: 941, 311 + xy: 946, 850 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Great Artist rotate: false - xy: 941, 253 + xy: 946, 792 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Great Engineer rotate: false - xy: 974, 442 + xy: 946, 734 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Great General rotate: false - xy: 999, 384 + xy: 946, 676 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Great Merchant rotate: false - xy: 999, 326 + xy: 868, 27 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Great Scientist rotate: false - xy: 999, 268 + xy: 926, 27 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Happiness rotate: false - xy: 760, 178 + xy: 1054, 1771 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Production rotate: false - xy: 818, 10 + xy: 1112, 1655 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Science rotate: false - xy: 1054, 1695 + xy: 1054, 1539 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 EmojiIcons/Turn rotate: false - xy: 1112, 1637 + xy: 1112, 1539 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 ImprovementIcons/Academy rotate: false - xy: 4, 229 + xy: 971, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Ancient ruins rotate: false - xy: 1439, 1934 + xy: 4, 153 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Barbarian encampment rotate: false - xy: 1871, 1934 + xy: 1511, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ImprovementIcons/Camp rotate: false - xy: 190, 1686 + xy: 1619, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -ImprovementIcons/Citadel +ImprovementIcons/Cancel improvement order rotate: false - xy: 190, 1362 + xy: 1727, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -ImprovementIcons/City center - rotate: false - xy: 190, 1038 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/City ruins - rotate: false - xy: 190, 930 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Customs house - rotate: false - xy: 298, 1424 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Farm - rotate: false - xy: 406, 1316 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Fishing Boats - rotate: false - xy: 622, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Fort - rotate: false - xy: 298, 1100 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Holy site - rotate: false - xy: 622, 1316 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Landmark - rotate: false - xy: 298, 776 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Lumber mill - rotate: false - xy: 730, 1208 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Manufactory - rotate: false - xy: 514, 884 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Mine - rotate: false - xy: 730, 884 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Moai - rotate: false - xy: 730, 776 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Offshore Platform - rotate: false - xy: 838, 1256 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Oil well - rotate: false - xy: 838, 1040 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Pasture - rotate: false - xy: 298, 668 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Plantation - rotate: false - xy: 127, 475 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Polder - rotate: false - xy: 127, 367 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Quarry - rotate: false - xy: 235, 452 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Railroad - rotate: false - xy: 235, 344 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Fallout - rotate: false - xy: 559, 344 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Forest - rotate: false - xy: 127, 259 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Jungle - rotate: false - xy: 127, 259 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Marsh - rotate: false - xy: 112, 44 - size: 100, 99 - orig: 100, 99 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Railroad - rotate: false - xy: 235, 236 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Remove Road - rotate: false - xy: 343, 236 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Repair - rotate: false - xy: 559, 236 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Road - rotate: false - xy: 436, 128 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Terrace farm - rotate: false - xy: 946, 836 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -ImprovementIcons/Trading post - rotate: false - xy: 946, 620 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/EnhanceReligion - rotate: false - xy: 514, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/FoundPantheon - rotate: false - xy: 514, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/FoundReligion - rotate: false - xy: 514, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/ReformReligion - rotate: false - xy: 514, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -StatIcons/Faith - rotate: false - xy: 514, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/Loading - rotate: false - xy: 514, 992 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/Working - rotate: false - xy: 514, 992 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Loading - rotate: false - xy: 514, 992 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/PickConstruction - rotate: false - xy: 730, 668 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -StatIcons/Production - rotate: false - xy: 730, 668 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/PickPolicy - rotate: false - xy: 1979, 1943 - size: 33, 33 - orig: 33, 33 - offset: 0, 0 - index: -1 -NotificationIcons/PickTech - rotate: false - xy: 838, 716 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -StatIcons/Science - rotate: false - xy: 838, 716 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/AirSweep - rotate: false - xy: 1331, 1934 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -UnitActionIcons/AirSweep - rotate: false - xy: 1331, 1934 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Aircraft - rotate: false - xy: 1979, 1984 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/ArrowRight - rotate: false - xy: 883, 369 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -NotificationIcons/MoveAutomatedUnits - rotate: false - xy: 883, 369 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -NotificationIcons/NextUnit - rotate: false - xy: 883, 369 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -StatIcons/Movement - rotate: false - xy: 883, 369 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/BackArrow - rotate: false - xy: 883, 311 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/Banner - rotate: false - xy: 1763, 1934 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Camera - rotate: false - xy: 1054, 1546 - size: 25, 25 - orig: 25, 25 - offset: 0, 0 - index: -1 -OtherIcons/Capital - rotate: false - xy: 1108, 1933 - size: 107, 101 - orig: 107, 101 - offset: 0, 0 - index: -1 -OtherIcons/Checkmark - rotate: false - xy: 190, 1470 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/NextTurn - rotate: false - xy: 190, 1470 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Circle - rotate: false - xy: 4, 1608 - size: 178, 178 - orig: 178, 178 - offset: 0, 0 - index: -1 -UnitFlagIcons/UnitFlag - rotate: false - xy: 4, 1608 - size: 178, 178 - orig: 178, 178 - offset: 0, 0 - index: -1 -OtherIcons/Cities - rotate: false - xy: 190, 1254 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/CityState - rotate: false - xy: 883, 253 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/Close - rotate: false - xy: 190, 822 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/CrosshairB - rotate: false - xy: 298, 1532 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Diplomacy - rotate: false - xy: 514, 1640 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/DiplomacyW - rotate: false - xy: 622, 1748 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/DisbandUnit - rotate: false - xy: 298, 1316 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -UnitActionIcons/DisbandUnit - rotate: false - xy: 298, 1316 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/ExclamationMark - rotate: false - xy: 730, 1748 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Fire - rotate: false - xy: 4, 460 - size: 115, 115 - orig: 115, 115 - offset: 0, 0 - index: -1 -OtherIcons/Hexagon - rotate: false - xy: 4, 1794 - size: 277, 240 - orig: 277, 240 - offset: 0, 0 - index: -1 -OtherIcons/Improvements - rotate: false - xy: 760, 62 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/Link - rotate: false - xy: 818, 126 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/Load - rotate: false - xy: 406, 884 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Lock - rotate: false - xy: 622, 1100 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/LockSmall - rotate: false - xy: 818, 68 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/MapEditor - rotate: false - xy: 622, 992 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/MenuIcon - rotate: false - xy: 622, 884 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Mods - rotate: false - xy: 838, 1688 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Multiplayer - rotate: false - xy: 838, 1580 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Nations - rotate: false - xy: 760, 4 - size: 50, 50 - orig: 50, 50 - offset: 0, 0 - index: -1 -OtherIcons/New - rotate: false - xy: 838, 1472 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Notifications - rotate: false - xy: 838, 1364 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Options - rotate: false - xy: 838, 932 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Pencil - rotate: false - xy: 514, 668 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Pentagon - rotate: false - xy: 622, 668 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Pillage - rotate: false - xy: 838, 608 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -UnitActionIcons/Pillage - rotate: false - xy: 838, 608 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Politics - rotate: false - xy: 277, 560 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -NotificationIcons/WorldCongressVote - rotate: false - xy: 277, 560 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Present - rotate: false - xy: 601, 560 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -UnitActionIcons/Present - rotate: false - xy: 601, 560 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Puppet - rotate: false - xy: 985, 1919 - size: 115, 115 - orig: 115, 115 - offset: 0, 0 - index: -1 -OtherIcons/Quest - rotate: false - xy: 343, 452 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Question - rotate: false - xy: 451, 452 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Quickstart - rotate: false - xy: 559, 452 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Remove Heresy - rotate: false - xy: 112, 151 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Resources - rotate: false - xy: 220, 128 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Resume - rotate: false - xy: 328, 128 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Search - rotate: false - xy: 220, 20 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/SecretOptions - rotate: false - xy: 328, 20 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Settings - rotate: false - xy: 544, 20 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Shield - rotate: false - xy: 667, 344 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Sleep - rotate: false - xy: 652, 20 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -UnitActionIcons/Sleep - rotate: false - xy: 652, 20 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Speaker - rotate: false - xy: 775, 458 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Spy - rotate: false - xy: 955, 1796 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Spy_White - rotate: false - xy: 946, 1688 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Star - rotate: false - xy: 946, 1586 - size: 100, 94 - orig: 100, 94 - offset: 0, 0 - index: -1 OtherIcons/Stop rotate: false - xy: 946, 1160 + xy: 1727, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Stop rotate: false - xy: 946, 1160 + xy: 1727, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/StopMove rotate: false - xy: 946, 1160 + xy: 1727, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 +ImprovementIcons/Citadel + rotate: false + xy: 190, 1689 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/City center + rotate: false + xy: 190, 1365 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/City ruins + rotate: false + xy: 190, 1257 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Customs house + rotate: false + xy: 406, 1751 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Farm + rotate: false + xy: 622, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Fishing Boats + rotate: false + xy: 406, 1319 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Fort + rotate: false + xy: 622, 1535 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Holy site + rotate: false + xy: 406, 1103 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Landmark + rotate: false + xy: 622, 1211 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Lumber mill + rotate: false + xy: 514, 995 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Manufactory + rotate: false + xy: 730, 1211 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Mine + rotate: false + xy: 730, 995 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Moai + rotate: false + xy: 622, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Offshore Platform + rotate: false + xy: 838, 1489 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Oil well + rotate: false + xy: 838, 1273 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Pasture + rotate: false + xy: 838, 949 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Plantation + rotate: false + xy: 838, 733 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Polder + rotate: false + xy: 838, 625 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Quarry + rotate: false + xy: 227, 455 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Railroad + rotate: false + xy: 659, 455 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Fallout + rotate: false + xy: 112, 262 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Forest + rotate: false + xy: 112, 154 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Jungle + rotate: false + xy: 112, 154 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Marsh + rotate: false + xy: 227, 348 + size: 100, 99 + orig: 100, 99 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Railroad + rotate: false + xy: 335, 347 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Remove Road + rotate: false + xy: 443, 347 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Repair + rotate: false + xy: 659, 347 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Road + rotate: false + xy: 328, 239 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Terrace farm + rotate: false + xy: 1943, 1829 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +ImprovementIcons/Trading post + rotate: false + xy: 875, 409 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/EnhanceReligion + rotate: false + xy: 514, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/FoundPantheon + rotate: false + xy: 514, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/FoundReligion + rotate: false + xy: 514, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/ReformReligion + rotate: false + xy: 514, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +StatIcons/Faith + rotate: false + xy: 514, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/Loading + rotate: false + xy: 298, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/Working + rotate: false + xy: 298, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Loading + rotate: false + xy: 298, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/PickConstruction + rotate: false + xy: 514, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +StatIcons/Production + rotate: false + xy: 514, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/PickPolicy + rotate: false + xy: 4, 4 + size: 33, 33 + orig: 33, 33 + offset: 0, 0 + index: -1 +NotificationIcons/PickTech + rotate: false + xy: 622, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +StatIcons/Science + rotate: false + xy: 622, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/AirSweep + rotate: false + xy: 4, 261 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitActionIcons/AirSweep + rotate: false + xy: 4, 261 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Aircraft + rotate: false + xy: 946, 1256 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/ArrowRight + rotate: false + xy: 946, 1198 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +NotificationIcons/MoveAutomatedUnits + rotate: false + xy: 946, 1198 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +NotificationIcons/NextUnit + rotate: false + xy: 946, 1198 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +StatIcons/Movement + rotate: false + xy: 946, 1198 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/BackArrow + rotate: false + xy: 946, 1140 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/Banner + rotate: false + xy: 1403, 1937 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Camera + rotate: false + xy: 1004, 1281 + size: 25, 25 + orig: 25, 25 + offset: 0, 0 + index: -1 +OtherIcons/Capital + rotate: false + xy: 4, 477 + size: 107, 101 + orig: 107, 101 + offset: 0, 0 + index: -1 +OtherIcons/Checkmark + rotate: false + xy: 1943, 1937 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/NextTurn + rotate: false + xy: 1943, 1937 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Circle + rotate: false + xy: 4, 1611 + size: 178, 178 + orig: 178, 178 + offset: 0, 0 + index: -1 +UnitFlagIcons/UnitFlag + rotate: false + xy: 4, 1611 + size: 178, 178 + orig: 178, 178 + offset: 0, 0 + index: -1 +OtherIcons/Cities + rotate: false + xy: 190, 1581 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/CityState + rotate: false + xy: 946, 1082 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/Close + rotate: false + xy: 190, 1149 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/CrosshairB + rotate: false + xy: 119, 478 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Diplomacy + rotate: false + xy: 406, 1643 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/DiplomacyW + rotate: false + xy: 514, 1751 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/DisbandUnit + rotate: false + xy: 298, 1427 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitActionIcons/DisbandUnit + rotate: false + xy: 298, 1427 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/ExclamationMark + rotate: false + xy: 298, 1319 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Fire + rotate: false + xy: 730, 1751 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Hexagon + rotate: false + xy: 4, 1797 + size: 277, 240 + orig: 277, 240 + offset: 0, 0 + index: -1 +OtherIcons/Improvements + rotate: false + xy: 1112, 1771 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/Link + rotate: false + xy: 1112, 1713 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/Load + rotate: false + xy: 730, 1319 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Lock + rotate: false + xy: 406, 887 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/LockSmall + rotate: false + xy: 1170, 1771 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/MapEditor + rotate: false + xy: 406, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/MenuIcon + rotate: false + xy: 730, 1103 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Mods + rotate: false + xy: 730, 887 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Multiplayer + rotate: false + xy: 730, 779 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Nations + rotate: false + xy: 1054, 1597 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +OtherIcons/New + rotate: false + xy: 838, 1705 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Notifications + rotate: false + xy: 838, 1597 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Options + rotate: false + xy: 838, 1165 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Pencil + rotate: false + xy: 298, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Pentagon + rotate: false + xy: 406, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Pillage + rotate: false + xy: 730, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitActionIcons/Pillage + rotate: false + xy: 730, 671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Politics + rotate: false + xy: 277, 563 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +NotificationIcons/WorldCongressVote + rotate: false + xy: 277, 563 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Present + rotate: false + xy: 601, 563 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitActionIcons/Present + rotate: false + xy: 601, 563 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Puppet + rotate: false + xy: 946, 1387 + size: 94, 94 + orig: 94, 94 + offset: 0, 0 + index: -1 +OtherIcons/Quest + rotate: false + xy: 335, 455 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Question + rotate: false + xy: 443, 455 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Quickstart + rotate: false + xy: 551, 455 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Remove Heresy + rotate: false + xy: 112, 46 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Resources + rotate: false + xy: 220, 240 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Resume + rotate: false + xy: 220, 132 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Search + rotate: false + xy: 544, 239 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/SecretOptions + rotate: false + xy: 652, 239 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Settings + rotate: false + xy: 436, 131 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Shield + rotate: false + xy: 652, 131 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Sleep + rotate: false + xy: 436, 23 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +UnitActionIcons/Sleep + rotate: false + xy: 436, 23 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Speaker + rotate: false + xy: 544, 23 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Spy + rotate: false + xy: 1079, 1829 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Spy_White + rotate: false + xy: 1187, 1829 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +OtherIcons/Star + rotate: false + xy: 1295, 1835 + size: 100, 94 + orig: 100, 94 + offset: 0, 0 + index: -1 OtherIcons/Swap rotate: false - xy: 946, 944 + xy: 1835, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Swap rotate: false - xy: 946, 944 + xy: 1835, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Terrains rotate: false - xy: 1054, 1579 + xy: 1228, 1713 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 OtherIcons/Timer rotate: false - xy: 946, 728 + xy: 875, 517 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Triangle rotate: false - xy: 289, 1856 + xy: 289, 1859 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 OtherIcons/Turn right rotate: false - xy: 1171, 1825 + xy: 767, 245 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Tyrannosaurus rotate: false - xy: 1279, 1826 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -OtherIcons/Unique - rotate: false - xy: 1387, 1826 + xy: 760, 137 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/WLTKD rotate: false - xy: 883, 427 + xy: 946, 1314 size: 83, 65 orig: 83, 65 offset: 0, 0 index: -1 OtherIcons/Wait rotate: false - xy: 1603, 1826 + xy: 875, 193 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Wait rotate: false - xy: 1603, 1826 + xy: 875, 193 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/Wonders rotate: false - xy: 883, 500 + xy: 946, 1489 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 OtherIcons/whiteDot rotate: false - xy: 289, 1847 + xy: 289, 1850 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 ResourceIcons/Aluminum rotate: false - xy: 4, 13 + xy: 1187, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Bananas rotate: false - xy: 1655, 1934 + xy: 4, 45 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Cattle rotate: false - xy: 190, 1578 + xy: 1835, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Citrus rotate: false - xy: 190, 1146 + xy: 190, 1473 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Coal rotate: false - xy: 190, 714 + xy: 190, 1041 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Copper rotate: false - xy: 298, 1748 + xy: 847, 1813 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Cotton rotate: false - xy: 298, 1640 + xy: 190, 717 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Crab rotate: false - xy: 406, 1748 + xy: 169, 609 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Deer rotate: false - xy: 406, 1532 + xy: 298, 1535 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Dyes rotate: false - xy: 406, 1424 + xy: 406, 1535 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Fish rotate: false - xy: 514, 1424 + xy: 298, 1211 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Furs rotate: false - xy: 622, 1424 + xy: 406, 1211 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gems rotate: false - xy: 730, 1532 + xy: 514, 1319 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Gold Ore rotate: false - xy: 406, 1100 + xy: 730, 1535 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Horses rotate: false - xy: 730, 1424 + xy: 514, 1211 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Incense rotate: false - xy: 406, 992 + xy: 730, 1427 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Iron rotate: false - xy: 514, 1100 + xy: 298, 887 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Ivory rotate: false - xy: 622, 1208 + xy: 406, 995 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Jewelry rotate: false - xy: 730, 1316 + xy: 514, 1103 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Marble rotate: false - xy: 730, 1100 + xy: 514, 887 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Oil rotate: false - xy: 838, 1148 + xy: 838, 1381 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Pearls rotate: false - xy: 406, 668 + xy: 838, 841 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Porcelain rotate: false - xy: 493, 560 + xy: 493, 563 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Salt rotate: false - xy: 544, 128 + xy: 436, 239 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sheep rotate: false - xy: 667, 452 + xy: 544, 131 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silk rotate: false - xy: 667, 236 + xy: 220, 24 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Silver rotate: false - xy: 652, 128 + xy: 328, 23 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Spices rotate: false - xy: 775, 242 + xy: 971, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Stone rotate: false - xy: 946, 1268 + xy: 1619, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Sugar rotate: false - xy: 946, 1052 + xy: 1727, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Truffles rotate: false - xy: 1063, 1811 + xy: 875, 301 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Uranium rotate: false - xy: 1495, 1826 + xy: 760, 29 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Whales rotate: false - xy: 1711, 1826 + xy: 868, 85 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wheat rotate: false - xy: 1819, 1826 + xy: 946, 1705 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 ResourceIcons/Wine rotate: false - xy: 1927, 1826 + xy: 946, 1597 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Acquire rotate: false - xy: 1223, 1934 + xy: 4, 369 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/CityConnection rotate: false - xy: 847, 1904 - size: 130, 130 - orig: 130, 130 + xy: 847, 1921 + size: 116, 116 + orig: 116, 116 offset: 0, 0 index: -1 StatIcons/Culture rotate: false - xy: 406, 1640 + xy: 298, 1751 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Food rotate: false - xy: 730, 1640 + xy: 514, 1427 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Gold rotate: false - xy: 298, 992 + xy: 622, 1427 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Happiness rotate: false - xy: 514, 1208 + xy: 298, 995 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/InterceptRange rotate: false - xy: 818, 184 + xy: 1054, 1655 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/Malcontent rotate: false - xy: 406, 776 + xy: 622, 1103 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Population rotate: false - xy: 385, 560 + xy: 385, 563 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Range rotate: false - xy: 1063, 1753 + xy: 1170, 1713 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/RangedStrength rotate: false - xy: 1121, 1753 + xy: 1228, 1771 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 StatIcons/ReligiousStrength rotate: false - xy: 451, 344 + xy: 119, 370 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Resistance rotate: false - xy: 4, 337 - size: 115, 115 - orig: 115, 115 + xy: 767, 353 + size: 100, 100 + orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Specialist rotate: false - xy: 775, 350 + xy: 652, 23 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 StatIcons/Strength rotate: false - xy: 1112, 1695 + xy: 1170, 1655 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +UniqueIcons/Fallback + rotate: false + xy: 514, 1535 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 UnitActionIcons/AddInCapital rotate: false - xy: 4, 121 + xy: 1079, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Automate rotate: false - xy: 1547, 1934 + xy: 1295, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/HurryConstruction rotate: false - xy: 1547, 1934 + xy: 1295, 1937 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/ConductTradeMission rotate: false - xy: 169, 606 + xy: 190, 933 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/ConstructImprovement rotate: false - xy: 847, 1796 + xy: 190, 825 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Repair rotate: false - xy: 847, 1796 + xy: 190, 825 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/EnhanceReligion rotate: false - xy: 622, 1640 + xy: 622, 1751 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FoundReligion rotate: false - xy: 622, 1640 + xy: 622, 1751 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Explore rotate: false - xy: 298, 1208 + xy: 406, 1427 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Fortify rotate: false - xy: 406, 1208 + xy: 730, 1643 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FortifyUntilHealed rotate: false - xy: 406, 1208 + xy: 730, 1643 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/FoundCity rotate: false - xy: 514, 1316 + xy: 298, 1103 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/HideMore rotate: false - xy: 760, 120 + xy: 1054, 1713 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitActionIcons/HurryResearch rotate: false - xy: 298, 884 + xy: 622, 1319 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Paradrop rotate: false - xy: 838, 824 + xy: 838, 1057 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/Promote rotate: false - xy: 709, 566 + xy: 709, 569 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/Upgrade rotate: false - xy: 709, 566 + xy: 709, 569 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/RemoveHeresy rotate: false - xy: 451, 236 + xy: 551, 347 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/SetUp rotate: false - xy: 436, 20 + xy: 328, 131 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitActionIcons/ShowMore rotate: false - xy: 1054, 1637 + xy: 1112, 1597 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 UnitActionIcons/Star rotate: false - xy: 946, 1484 + xy: 1403, 1835 size: 100, 94 orig: 100, 94 offset: 0, 0 index: -1 UnitActionIcons/StartGoldenAge rotate: false - xy: 946, 1376 + xy: 1511, 1829 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagCivilian rotate: false - xy: 4, 1383 + xy: 4, 1386 size: 178, 217 orig: 178, 217 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagEmbark rotate: false - xy: 4, 1165 + xy: 4, 1168 size: 178, 210 orig: 178, 210 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagFortify rotate: false - xy: 475, 1856 + xy: 475, 1859 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelection rotate: false - xy: 4, 979 + xy: 4, 982 size: 178, 178 orig: 178, 178 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionCivilian rotate: false - xy: 4, 583 + xy: 4, 586 size: 157, 170 orig: 157, 170 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionEmbark rotate: false - xy: 4, 761 + xy: 4, 764 size: 178, 210 orig: 178, 210 offset: 0, 0 index: -1 UnitFlagIcons/UnitFlagSelectionFortify rotate: false - xy: 661, 1856 + xy: 661, 1859 size: 178, 178 orig: 178, 178 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index f82955c770..971527e4a8 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/core/src/com/unciv/logic/civilization/Notification.kt b/core/src/com/unciv/logic/civilization/Notification.kt index d6d5775267..e60652d5c5 100644 --- a/core/src/com/unciv/logic/civilization/Notification.kt +++ b/core/src/com/unciv/logic/civilization/Notification.kt @@ -61,8 +61,8 @@ open class Notification() : IsPartOfGameInfoSerialization { if (icons.isEmpty()) return for (icon in icons.reversed()) { val image: Actor = when { - ruleset.technologies.containsKey(icon) -> ImageGetter.getTechIconGroup(icon, iconSize) - ruleset.nations.containsKey(icon) -> ImageGetter.getNationIndicator( + ruleset.technologies.containsKey(icon) -> ImageGetter.getTechIconPortrait(icon, iconSize) + ruleset.nations.containsKey(icon) -> ImageGetter.getNationPortrait( ruleset.nations[icon]!!, iconSize ) diff --git a/core/src/com/unciv/models/UnitAction.kt b/core/src/com/unciv/models/UnitAction.kt index fd6ab01c5f..279d3a2614 100644 --- a/core/src/com/unciv/models/UnitAction.kt +++ b/core/src/com/unciv/models/UnitAction.kt @@ -23,22 +23,20 @@ data class UnitAction( val action: (() -> Unit)? = null ) { fun getIcon(): Actor { - if (type.imageGetter != null) return type.imageGetter.invoke() - .surroundWithCircle(20f) - .surroundWithThinCircle() + if (type.imageGetter != null) + return type.imageGetter.invoke() return when (type) { UnitActionType.Create -> { - ImageGetter.getImprovementIcon(title.getPlaceholderParameters()[0]) + ImageGetter.getImprovementPortrait(title.getPlaceholderParameters()[0]) } UnitActionType.SpreadReligion -> { val religionName = title.getPlaceholderParameters()[0] - ImageGetter.getReligionImage( + ImageGetter.getReligionPortrait( if (ImageGetter.religionIconExists(religionName)) religionName - else "Pantheon" - ).apply { color = Color.BLACK } - .surroundWithCircle(20f).surroundWithThinCircle() + else "Pantheon", 20f + ) } - else -> ImageGetter.getImage("UnitActionIcons/Star").apply { color = Color.BLACK } + else -> ImageGetter.getUnitActionPortrait("Star") } } } @@ -62,77 +60,77 @@ enum class UnitActionType( val uncivSound: UncivSound = UncivSound.Click ) { SwapUnits("Swap units", - { ImageGetter.getImage("UnitActionIcons/Swap") }, 'y', false), + { ImageGetter.getUnitActionPortrait("Swap") }, 'y', false), Automate("Automate", - { ImageGetter.getImage("UnitActionIcons/Automate") }, 'm'), + { ImageGetter.getUnitActionPortrait("Automate") }, 'm'), StopAutomation("Stop automation", - { ImageGetter.getImage("UnitActionIcons/Stop") }, 'm', false), + { ImageGetter.getUnitActionPortrait("Stop") }, 'm', false), StopMovement("Stop movement", - { ImageGetter.getImage("UnitActionIcons/StopMove") }, '.', false), + { ImageGetter.getUnitActionPortrait("StopMove") }, '.', false), Sleep("Sleep", - { ImageGetter.getImage("UnitActionIcons/Sleep") }, 'f'), + { ImageGetter.getUnitActionPortrait("Sleep") }, 'f'), SleepUntilHealed("Sleep until healed", - { ImageGetter.getImage("UnitActionIcons/Sleep") }, 'h'), + { ImageGetter.getUnitActionPortrait("Sleep") }, 'h'), Fortify("Fortify", - { ImageGetter.getImage("UnitActionIcons/Fortify") }, 'f', UncivSound.Fortify), + { ImageGetter.getUnitActionPortrait("Fortify") }, 'f', UncivSound.Fortify), FortifyUntilHealed("Fortify until healed", - { ImageGetter.getImage("UnitActionIcons/FortifyUntilHealed") }, 'h', UncivSound.Fortify), + { ImageGetter.getUnitActionPortrait("FortifyUntilHealed") }, 'h', UncivSound.Fortify), Explore("Explore", - { ImageGetter.getImage("UnitActionIcons/Explore") }, 'x'), + { ImageGetter.getUnitActionPortrait("Explore") }, 'x'), StopExploration("Stop exploration", - { ImageGetter.getImage("UnitActionIcons/Stop") }, 'x', false), + { ImageGetter.getUnitActionPortrait("Stop") }, 'x', false), Promote("Promote", - { ImageGetter.getImage("UnitActionIcons/Promote") }, 'o', false, UncivSound.Promote), + { ImageGetter.getUnitActionPortrait("Promote") }, 'o', false, UncivSound.Promote), Upgrade("Upgrade", - { ImageGetter.getImage("UnitActionIcons/Upgrade") }, 'u', UncivSound.Upgrade), + { ImageGetter.getUnitActionPortrait("Upgrade") }, 'u', UncivSound.Upgrade), Pillage("Pillage", - { ImageGetter.getImage("UnitActionIcons/Pillage") }, 'p', false), + { ImageGetter.getUnitActionPortrait("Pillage") }, 'p', false), Paradrop("Paradrop", - { ImageGetter.getImage("UnitActionIcons/Paradrop") }, 'p', false), + { ImageGetter.getUnitActionPortrait("Paradrop") }, 'p', false), AirSweep("Air Sweep", - { ImageGetter.getImage("UnitActionIcons/AirSweep") }, 'a', false), + { ImageGetter.getUnitActionPortrait("AirSweep") }, 'a', false), SetUp("Set up", - { ImageGetter.getImage("UnitActionIcons/SetUp") }, 't', false, UncivSound.Setup), + { ImageGetter.getUnitActionPortrait("SetUp") }, 't', false, UncivSound.Setup), FoundCity("Found city", - { ImageGetter.getImage("UnitActionIcons/FoundCity") }, 'c', UncivSound.Silent), + { ImageGetter.getUnitActionPortrait("FoundCity") }, 'c', UncivSound.Silent), ConstructImprovement("Construct improvement", - { ImageGetter.getImage("UnitActionIcons/ConstructImprovement") }, 'i'), + { ImageGetter.getUnitActionPortrait("ConstructImprovement") }, 'i'), Repair(Constants.repair, - { ImageGetter.getImage("UnitActionIcons/Repair") }, 'r', UncivSound.Construction), + { ImageGetter.getUnitActionPortrait("Repair") }, 'r', UncivSound.Construction), Create("Create", null, 'i', UncivSound.Chimes), HurryResearch("Hurry Research", - { ImageGetter.getImage("UnitActionIcons/HurryResearch") }, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("HurryResearch") }, 'g', UncivSound.Chimes), StartGoldenAge("Start Golden Age", - { ImageGetter.getImage("UnitActionIcons/StartGoldenAge") }, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("StartGoldenAge") }, 'g', UncivSound.Chimes), HurryWonder("Hurry Wonder", - { ImageGetter.getImage("UnitActionIcons/HurryConstruction") }, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("HurryConstruction") }, 'g', UncivSound.Chimes), HurryBuilding("Hurry Construction", - { ImageGetter.getImage("UnitActionIcons/HurryConstruction") }, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("HurryConstruction") }, 'g', UncivSound.Chimes), ConductTradeMission("Conduct Trade Mission", - { ImageGetter.getImage("UnitActionIcons/ConductTradeMission") }, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("ConductTradeMission") }, 'g', UncivSound.Chimes), FoundReligion("Found a Religion", - { ImageGetter.getImage("UnitActionIcons/FoundReligion") }, 'g', UncivSound.Choir), + { ImageGetter.getUnitActionPortrait("FoundReligion") }, 'g', UncivSound.Choir), TriggerUnique("Trigger unique", - { ImageGetter.getImage("UnitActionIcons/Star") }, 'g', false, UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("Star") }, 'g', false, UncivSound.Chimes), SpreadReligion("Spread Religion", null, 'g', UncivSound.Choir), RemoveHeresy("Remove Heresy", - { ImageGetter.getImage("UnitActionIcons/RemoveHeresy") }, 'h', UncivSound.Fire), + { ImageGetter.getUnitActionPortrait("RemoveHeresy") }, 'h', UncivSound.Fire), EnhanceReligion("Enhance a Religion", - { ImageGetter.getImage("UnitActionIcons/EnhanceReligion") }, 'g', UncivSound.Choir), + { ImageGetter.getUnitActionPortrait("EnhanceReligion") }, 'g', UncivSound.Choir), DisbandUnit("Disband unit", - { ImageGetter.getImage("UnitActionIcons/DisbandUnit") }, KeyCharAndCode.DEL, false), + { ImageGetter.getUnitActionPortrait("DisbandUnit") }, KeyCharAndCode.DEL, false), GiftUnit("Gift unit", - { ImageGetter.getImage("UnitActionIcons/Present") }, UncivSound.Silent), + { ImageGetter.getUnitActionPortrait("Present") }, UncivSound.Silent), Wait("Wait", - { ImageGetter.getImage("UnitActionIcons/Wait") }, 'z', UncivSound.Silent), + { ImageGetter.getUnitActionPortrait("Wait") }, 'z', UncivSound.Silent), ShowAdditionalActions("Show more", - { ImageGetter.getImage("UnitActionIcons/ShowMore") }, KeyCharAndCode(Input.Keys.PAGE_DOWN), false), + { ImageGetter.getUnitActionPortrait("ShowMore") }, KeyCharAndCode(Input.Keys.PAGE_DOWN), false), HideAdditionalActions("Back", - { ImageGetter.getImage("UnitActionIcons/HideMore") }, KeyCharAndCode(Input.Keys.PAGE_UP), false), + { ImageGetter.getUnitActionPortrait("HideMore") }, KeyCharAndCode(Input.Keys.PAGE_UP), false), AddInCapital( "Add in capital", - { ImageGetter.getImage("UnitActionIcons/AddInCapital")}, 'g', UncivSound.Chimes), + { ImageGetter.getUnitActionPortrait("AddInCapital")}, 'g', UncivSound.Chimes), ; // Allow shorter initializations diff --git a/core/src/com/unciv/ui/cityscreen/CityConstructionsTable.kt b/core/src/com/unciv/ui/cityscreen/CityConstructionsTable.kt index 8b3d683ceb..4e9eb63e34 100644 --- a/core/src/com/unciv/ui/cityscreen/CityConstructionsTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityConstructionsTable.kt @@ -302,7 +302,7 @@ class CityConstructionsTable(private val cityScreen: CityScreen) { table.defaults().pad(2f).minWidth(40f) if (isFirstConstructionOfItsKind) table.add(getProgressBar(constructionName)).minWidth(5f) else table.add().minWidth(5f) - table.add(ImageGetter.getPortraitImage(constructionName, 40f)).padRight(10f) + table.add(ImageGetter.getConstructionPortrait(constructionName, 40f)).padRight(10f) table.add(text.toLabel()).expandX().fillX().left() if (constructionQueueIndex > 0) table.add(getRaisePriorityButton(constructionQueueIndex, constructionName, city)).right() @@ -361,7 +361,7 @@ class CityConstructionsTable(private val cityScreen: CityScreen) { } pickConstructionButton.add(getProgressBar(construction.name)).padRight(5f) - pickConstructionButton.add(ImageGetter.getPortraitImage(construction.name, 40f)).padRight(10f) + pickConstructionButton.add(ImageGetter.getConstructionPortrait(construction.name, 40f)).padRight(10f) pickConstructionButton.add(constructionButtonDTO.buttonText.toLabel()).expandX().fillX() if (!cannotAddConstructionToQueue(construction, cityScreen.city, cityScreen.city.cityConstructions)) { diff --git a/core/src/com/unciv/ui/cityscreen/CityReligionInfoTable.kt b/core/src/com/unciv/ui/cityscreen/CityReligionInfoTable.kt index a62087732d..221258730a 100644 --- a/core/src/com/unciv/ui/cityscreen/CityReligionInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityReligionInfoTable.kt @@ -8,8 +8,8 @@ import com.unciv.logic.city.CityReligionManager import com.unciv.models.Religion import com.unciv.ui.civilopedia.CivilopediaCategories import com.unciv.ui.civilopedia.CivilopediaScreen -import com.unciv.ui.images.IconCircleGroup import com.unciv.ui.images.ImageGetter +import com.unciv.ui.images.Portrait import com.unciv.ui.overviewscreen.EmpireOverviewCategories import com.unciv.ui.overviewscreen.EmpireOverviewScreen import com.unciv.ui.utils.BaseScreen @@ -79,8 +79,8 @@ class CityReligionInfoTable( return if (religion == null) "Religion" to "None" else religion.getIconName() to religion.getReligionDisplayName() } - private fun linkedReligionIcon(iconName: String, religion: String?): IconCircleGroup { - val icon = ImageGetter.getCircledReligionIcon(iconName, 30f) + private fun linkedReligionIcon(iconName: String, religion: String?): Portrait { + val icon = ImageGetter.getReligionPortrait(iconName, 30f) if (religion == null) return icon icon.onClick { val newScreen = if (religion == iconName) { @@ -98,7 +98,7 @@ class CityReligionInfoTable( return ExpanderTab( title = "Majority Religion: [$label]", fontSize = Constants.defaultFontSize, - icon = ImageGetter.getCircledReligionIcon(icon, 30f), + icon = ImageGetter.getReligionPortrait(icon, 30f), defaultPad = 0f, persistenceID = "CityStatsTable.Religion", startsOutOpened = false, diff --git a/core/src/com/unciv/ui/cityscreen/CityStatsTable.kt b/core/src/com/unciv/ui/cityscreen/CityStatsTable.kt index 6ae9185152..21820d46d1 100644 --- a/core/src/com/unciv/ui/cityscreen/CityStatsTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityStatsTable.kt @@ -183,7 +183,7 @@ class CityStatsTable(val cityScreen: CityScreen): Table() { ImageGetter.getStatIcon("Food") to "We Love The King Day for another [${cityInfo.getFlag(CityFlags.WeLoveTheKing)}] turns".toLabel(Color.LIME) cityInfo.demandedResource.isNotEmpty() -> - ImageGetter.getResourceImage(cityInfo.demandedResource, 20f) to + ImageGetter.getResourcePortrait(cityInfo.demandedResource, 20f) to "Demanding [${cityInfo.demandedResource}]".toLabel(Color.CORAL) else -> null to null } @@ -270,7 +270,7 @@ class CityStatsTable(val cityScreen: CityScreen): Table() { val info = Table() val statsAndSpecialists = Table() - val icon = ImageGetter.getPortraitImage(building.name, 50f) + val icon = ImageGetter.getConstructionPortrait(building.name, 50f) val isFree = building.name in cityScreen.city.civInfo.civConstructions.getFreeBuildings(cityScreen.city.id) val displayName = if (isFree) "{${building.name}} ({Free})" else building.name @@ -374,7 +374,7 @@ class CityStatsTable(val cityScreen: CityScreen): Table() { info.add(progressBar).colspan(2).left().expandX().row() greatPeopleTable.add(info).growX().top().padBottom(10f) - greatPeopleTable.add(ImageGetter.getPortraitImage(greatPersonName, 50f)).row() + greatPeopleTable.add(ImageGetter.getConstructionPortrait(greatPersonName, 50f)).row() } lowerTable.addCategory("Great People", greatPeopleTable) diff --git a/core/src/com/unciv/ui/cityscreen/ConstructionInfoTable.kt b/core/src/com/unciv/ui/cityscreen/ConstructionInfoTable.kt index f24c8e7e2f..c6a3c78c59 100644 --- a/core/src/com/unciv/ui/cityscreen/ConstructionInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/ConstructionInfoTable.kt @@ -61,7 +61,7 @@ class ConstructionInfoTable(val cityScreen: CityScreen): Table() { selectedConstructionTable.run { pad(10f) - add(ImageGetter.getPortraitImage(construction.name, 50f).apply { + add(ImageGetter.getConstructionPortrait(construction.name, 50f).apply { val link = (construction as? IRulesetObject)?.makeLink() ?: return@apply if (link.isEmpty()) return@apply touchable = Touchable.enabled diff --git a/core/src/com/unciv/ui/civilopedia/CivilopediaCategories.kt b/core/src/com/unciv/ui/civilopedia/CivilopediaCategories.kt index 248232916b..51e1fde06d 100644 --- a/core/src/com/unciv/ui/civilopedia/CivilopediaCategories.kt +++ b/core/src/com/unciv/ui/civilopedia/CivilopediaCategories.kt @@ -52,15 +52,15 @@ object CivilopediaImageGetters { } val construction = { name: String, size: Float -> - ImageGetter.getPortraitImage(name, size) + ImageGetter.getConstructionPortrait(name, size) } val improvement = { name: String, size: Float -> - ImageGetter.getImprovementIcon(name, size) + ImageGetter.getImprovementPortrait(name, size) } val nation = { name: String, size: Float -> val nation = ImageGetter.ruleset.nations[name] if (nation == null) null - else ImageGetter.getNationIndicator(nation, size) + else ImageGetter.getNationPortrait(nation, size) } val policy = { name: String, size: Float -> // policy branch start and complete have no icons but are linked -> nonexistence must be passed down @@ -75,13 +75,13 @@ object CivilopediaImageGetters { else null } val resource = { name: String, size: Float -> - ImageGetter.getResourceImage(name, size) + ImageGetter.getResourcePortrait(name, size) } val technology = { name: String, size: Float -> - ImageGetter.getTechIconGroup(name, size) + ImageGetter.getTechIconPortrait(name, size) } val promotion = { name: String, size: Float -> - ImageGetter.getPromotionIcon(name, size) + ImageGetter.getPromotionPortrait(name, size) } val terrain = { name: String, size: Float -> val terrain = ImageGetter.ruleset.terrains[name] @@ -89,20 +89,7 @@ object CivilopediaImageGetters { else terrainImage(terrain, ImageGetter.ruleset, size) } val belief = { name: String, size: Float -> - // Kludge until we decide how exactly to show Religions - fun getInvertedCircledReligionIcon(iconName: String, size: Float) = - ImageGetter.getCircledReligionIcon(iconName, size).apply { - circle.color = Color.WHITE - actor.color = Color.BLACK - } - if (ImageGetter.religionIconExists(name)) { - getInvertedCircledReligionIcon(name, size) - } else { - val typeName = ImageGetter.ruleset.beliefs[name]?.type?.name - if (typeName != null && ImageGetter.religionIconExists(typeName)) - getInvertedCircledReligionIcon(typeName, size) - else null - } + ImageGetter.getReligionPortrait(name, size) } } diff --git a/core/src/com/unciv/ui/images/ImageGetter.kt b/core/src/com/unciv/ui/images/ImageGetter.kt index 91aae66928..689779228a 100644 --- a/core/src/com/unciv/ui/images/ImageGetter.kt +++ b/core/src/com/unciv/ui/images/ImageGetter.kt @@ -201,126 +201,71 @@ object ImageGetter { .apply { setSize(20f, 20f) } } + fun wonderImageExists(wonderName: String) = imageExists("WonderImages/$wonderName") + fun getWonderImage(wonderName: String) = getImage("WonderImages/$wonderName") + + fun getNationIcon(nation: String) = getImage("NationIcons/$nation") + fun getNationPortrait(nation: Nation, size: Float): Portrait { + return PortraitNation(nation.name, size) + } + + fun getRandomNationPortrait(size: Float): Portrait { + return PortraitNation("Random", size) + } + fun getUnitIcon(unitName: String, color: Color = Color.BLACK): Image { return getImage("UnitIcons/$unitName").apply { this.color = color } } - - - fun getNationIndicator(nation: Nation, size: Float): IconCircleGroup { - val civIconName = if (nation.isCityState()) "CityState" else nation.name - return if (nationIconExists(civIconName)) { - val cityStateIcon = getNationIcon(civIconName) - cityStateIcon.color = nation.getInnerColor() - cityStateIcon.surroundWithCircle(size * 0.9f).apply { circle.color = nation.getOuterColor() } - .surroundWithCircle(size, false).apply { circle.color = nation.getInnerColor() } - } else getCircle().apply { color = nation.getOuterColor() } - .surroundWithCircle(size).apply { circle.color = nation.getInnerColor() } - } - - fun getRandomNationIndicator(size: Float): IconCircleGroup { - return "?" - .toLabel(Color.WHITE, (size * 5f/8f).toInt()) - .apply { this.setAlignment(Align.center) } - .surroundWithCircle(size * 0.9f).apply { circle.color = Color.BLACK } - .surroundWithCircle(size, false).apply { circle.color = Color.WHITE } - } - - private fun nationIconExists(nation: String) = imageExists("NationIcons/$nation") - fun getNationIcon(nation: String) = getImage("NationIcons/$nation") - - fun wonderImageExists(wonderName: String) = imageExists("WonderImages/$wonderName") - fun getWonderImage(wonderName: String) = getImage("WonderImages/$wonderName") - - private fun getColorFromStats(stats: Stats): Color? { - if (stats.asSequence().none { it.value > 0 }) return Color.WHITE - val highestStat = stats.asSequence().maxByOrNull { it.value }!! - return highestStat.key.color - } - - - fun getImprovementIcon(improvementName: String, size: Float = 20f, withCircle: Boolean = true): Group { - if (improvementName == Constants.cancelImprovementOrder) - return getImage("OtherIcons/Stop").surroundWithCircle(size) - - val icon = getImage("ImprovementIcons/$improvementName") - - if (!withCircle) return icon.toGroup(size) - - val group = icon.surroundWithCircle(size) - val improvement = ruleset.tileImprovements[improvementName] - if (improvement != null) - group.circle.color = getColorFromStats(improvement) - return group.surroundWithThinCircle() - } - - fun getPortraitImage(construction: String, size: Float): Group { + fun getConstructionPortrait(construction: String, size: Float): Group { if (ruleset.buildings.containsKey(construction)) { - val buildingPortraitLocation = "BuildingPortraits/$construction" - return if (imageExists(buildingPortraitLocation)) { - getImage(buildingPortraitLocation).toGroup(size) - } else { - val image = if (imageExists("BuildingIcons/$construction")) getImage("BuildingIcons/$construction") - else getImage("BuildingIcons/Fallback") - image.surroundWithCircle(size).surroundWithThinCircle() - } + return PortraitBuilding(construction, size) } if (ruleset.units.containsKey(construction)) { - val unitPortraitLocation = "UnitPortraits/$construction" - return if (imageExists(unitPortraitLocation)) { - getImage(unitPortraitLocation).toGroup(size) - } else - getUnitIcon(construction).surroundWithCircle(size).surroundWithThinCircle() + return PortraitUnit(construction, size) } if (PerpetualConstruction.perpetualConstructionsMap.containsKey(construction)) return getImage("OtherIcons/Convert$construction").toGroup(size) return getStatIcon(construction).surroundWithCircle(size).surroundWithThinCircle() } - fun getPromotionIcon(promotionName: String, size: Float = 30f): Actor { - val nameWithoutBrackets = promotionName.replace("[", "").replace("]", "") + fun getUniquePortrait(uniqueName: String, size: Float): Group { + return PortraitUnique(uniqueName, size) + } - var level = when { - nameWithoutBrackets.endsWith(" I") -> 1 - nameWithoutBrackets.endsWith(" II") -> 2 - nameWithoutBrackets.endsWith(" III") -> 3 - else -> 0 + fun getPromotionPortrait(promotionName: String, size: Float = 30f): Group { + return PortraitPromotion(promotionName, size) + } + + fun getResourcePortrait(resourceName: String, size: Float, amount: Int = 0): Group { + return PortraitResource(resourceName, size, amount) + } + + fun getTechIconPortrait(techName: String, circleSize: Float): Group { + return PortraitTech(techName, circleSize) + } + + fun getImprovementPortrait(improvementName: String, size: Float = 20f, dim: Boolean = false): Portrait { + return PortraitImprovement(improvementName, size, dim) + } + + fun getUnitActionPortrait(actionName: String, size: Float = 20f): Portrait { + return PortraitUnitAction(actionName, size) + } + + fun getReligionIcon(iconName: String): Image { return getImage("ReligionIcons/$iconName") } + fun getReligionPortrait(iconName: String, size: Float): Portrait { + if (religionIconExists(iconName)) { + return PortraitReligion(iconName, size) + } else { + val typeName = ruleset.beliefs[iconName]?.type?.name + if (typeName != null && religionIconExists(typeName)) + return PortraitReligion(typeName, size) } - - val basePromotionName = nameWithoutBrackets.dropLast(if (level == 0) 0 else level + 1) - - val imageAttempter = ImageAttempter(Unit) - .tryImage { "UnitPromotionIcons/$nameWithoutBrackets" } - .tryImage { "UnitPromotionIcons/$basePromotionName" } - .tryImage { "UnitIcons/${basePromotionName.removeSuffix(" ability")}" } - - if (imageAttempter.getPathOrNull() != null && imageAttempter.getPath()!!.endsWith(nameWithoutBrackets)) - level = 0 - - val promotionColor = colorFromRGB(255, 226, 0) - val circle = imageAttempter.getImage() - .apply { color = promotionColor } - .surroundWithCircle(size) - .apply { circle.color = colorFromRGB(0, 12, 49) } - - if (level != 0) { - val padding = if (level == 3) 0.5f else 2f - val starTable = Table().apply { defaults().pad(padding) } - for (i in 1..level) starTable.add(getImage("OtherIcons/Star")).size(size / 4f) - starTable.centerX(circle) - starTable.y = size / 6f - circle.addActor(starTable) - } - return circle.surroundWithThinCircle(promotionColor) + return PortraitReligion(iconName, size) } fun religionIconExists(iconName: String) = imageExists("ReligionIcons/$iconName") - fun getReligionImage(iconName: String): Image { - return getImage("ReligionIcons/$iconName") - } - fun getCircledReligionIcon(iconName: String, size: Float): IconCircleGroup { - return getReligionImage(iconName).surroundWithCircle(size, color = Color.BLACK ) - } @Deprecated("Use skin defined base color instead", ReplaceWith("BaseScreen.skinStrings.skinConfig.baseColor", "com.unciv.ui.utils.BaseScreen")) fun getBlue() = Color(0x004085bf) @@ -354,84 +299,6 @@ object ImageGetter { return image } - fun getResourceImage(resourceName: String, size: Float, amount: Int = 0): IconCircleGroup { - val iconGroup = getImage("ResourceIcons/$resourceName").surroundWithCircle(size) - val resource = ruleset.tileResources[resourceName] - ?: return iconGroup // This is the result of a bad modding setup, just give em an empty circle. Their problem. - - val color = resource.resourceType.getColor() - iconGroup.circle.color = color - - // Show amount indicator for strategic resources (bottom-right) - if (amount > 0) { - val label = amount.toString().toLabel( - fontSize = 8, - fontColor = Color.WHITE, - alignment = Align.center) - val group = label.surroundWithCircle(size/2, true, Color.BLACK) - - label.y -= 0.5f - group.x = iconGroup.width - group.width * 2 / 3 - group.y = -group.height / 3 - - iconGroup.addActor(group) - } - - return iconGroup.surroundWithThinCircle() - } - - fun getTechIconGroup(techName: String, circleSize: Float, isResearched: Boolean = false): Group { - - val portrait: Image - val eraColor = ruleset.eras[ruleset.technologies[techName]?.era()]?.getColor()?.darken(0.6f) ?: Color.BLACK - - // Inner part - if (imageExists("TechPortraits/$techName")) - portrait = getImage("TechPortraits/$techName") - else { - portrait = if (imageExists("TechIcons/$techName")) - getImage("TechIcons/$techName") - else - getImage("TechIcons/Fallback") - portrait.color = eraColor - } - - // Border / background - if (imageExists("TechPortraits/Background")) { - val background = getImage("TechPortraits/Background") - val ratioW = portrait.width / background.width - val ratioH = portrait.height / background.height - - if (isResearched) - background.color = Color.GOLD.cpy().brighten(0.5f) - - background.setSize(circleSize, circleSize) - portrait.setSize(circleSize*ratioW, circleSize*ratioH) - - val group = Group() - group.setSize(circleSize, circleSize) - group.addActor(background) - group.addActor(portrait) - - background.center(group) - portrait.center(group) - - return group - } else { - return portrait.surroundWithCircle(circleSize).surroundWithThinCircle(eraColor) - } - } - - fun getProgressBarHorizontal( - width: Float, height: Float, - percentComplete: Float, - progressColor: Color, - backgroundColor: Color): Group { - return ProgressBar(width, height, false) - .setBackground(backgroundColor) - .setProgress(progressColor, percentComplete) - } - fun getProgressBarVertical( width: Float, height: Float, diff --git a/core/src/com/unciv/ui/images/Portrait.kt b/core/src/com/unciv/ui/images/Portrait.kt new file mode 100644 index 0000000000..18ab715ea1 --- /dev/null +++ b/core/src/com/unciv/ui/images/Portrait.kt @@ -0,0 +1,303 @@ +package com.unciv.ui.images + +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.scenes.scene2d.Group +import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.scenes.scene2d.ui.Table +import com.badlogic.gdx.utils.Align +import com.unciv.models.ruleset.Nation +import com.unciv.models.ruleset.Ruleset +import com.unciv.models.stats.Stats +import com.unciv.ui.utils.extensions.center +import com.unciv.ui.utils.extensions.centerX +import com.unciv.ui.utils.extensions.colorFromRGB +import com.unciv.ui.utils.extensions.darken +import com.unciv.ui.utils.extensions.surroundWithCircle +import com.unciv.ui.utils.extensions.toGroup +import com.unciv.ui.utils.extensions.toLabel +import com.unciv.utils.Log + +open class Portrait(val type: Type, val imageName: String, val size: Float, val borderSize: Float = 2f) : Group() { + + enum class Type(val directory: String) { + Unit("Unit"), + Building("Building"), + Tech("Tech"), + Resource("Resource"), + Improvement("Improvement"), + Promotion("UnitPromotion"), + Unique("Unique"), + Nation("Nation"), + Religion("Religion"), + UnitAction("UnitAction") + } + + val image: Image + val background: Group + val ruleset: Ruleset = ImageGetter.ruleset + + var isPortrait = false + + val pathPortrait = "${type.directory}Portraits/$imageName" + val pathPortraitFallback = "${type.directory}Portraits/Fallback" + val pathIcon = "${type.directory}Icons/$imageName" + val pathIconFallback = "${type.directory}Icons/Fallback" + + open fun getDefaultInnerBackgroundTint(): Color { return Color.WHITE.cpy() } + open fun getDefaultOuterBackgroundTint(): Color { return Color.BLACK.cpy() } + open fun getDefaultImageTint(): Color { return Color.WHITE.cpy() } + open fun getDefaultImage(): Image { + return when { + ImageGetter.imageExists(pathIcon) -> ImageGetter.getImage(pathIcon) + ImageGetter.imageExists(pathIconFallback) -> ImageGetter.getImage(pathIconFallback) + else -> ImageGetter.getCircle() + } + } + + init { + + isTransform = false + + image = getMainImage() + background = getMainBackground() + + this.setSize(size + borderSize, size + borderSize) + + background.center(this) + image.center(this) + + this.addActor(background) + this.addActor(image) + + } + + /** Inner image */ + private fun getMainImage() : Image { + return when { + ImageGetter.imageExists(pathPortrait) -> { + isPortrait = true + ImageGetter.getImage(pathPortrait) + } + ImageGetter.imageExists(pathPortraitFallback) -> { + isPortrait = true + ImageGetter.getImage(pathPortraitFallback) + } + else -> getDefaultImage().apply { color = getDefaultImageTint() } + } + } + + /** Border / background */ + private fun getMainBackground() : Group { + + if (isPortrait && ImageGetter.imageExists("${type.directory}Portraits/Background")) { + val backgroundImage = ImageGetter.getImage("${type.directory}Portraits/Background") + val ratioW = image.width / backgroundImage.width + val ratioH = image.height / backgroundImage.height + image.setSize((size + borderSize)*ratioW, (size + borderSize)*ratioH) + return backgroundImage.toGroup(size + borderSize) + + } else { + image.setSize(size*0.75f, size*0.75f) + + val bg = Group().apply { isTransform = false } + + val circleInner = ImageGetter.getCircle() + val circleOuter = ImageGetter.getCircle() + + circleInner.setSize(size, size) + circleOuter.setSize(size + borderSize, size + borderSize) + bg.setSize(size + borderSize, size + borderSize) + + circleInner.align = Align.center + circleOuter.align = Align.center + + circleInner.color = getDefaultInnerBackgroundTint() + circleOuter.color = getDefaultOuterBackgroundTint() + + circleOuter.center(bg) + circleInner.center(bg) + + circleOuter.setOrigin(Align.center) + circleInner.setOrigin(Align.center) + + bg.addActor(circleOuter) + bg.addActor(circleInner) + + return bg + } + } + +} + +class PortraitResource(name: String, size: Float, amount: Int = 0) : Portrait(Type.Resource, name, size) { + + init { + if (amount > 0) { + val label = amount.toString().toLabel( + fontSize = 8, + fontColor = Color.WHITE, + alignment = Align.center) + val amountGroup = label.surroundWithCircle(size/2, true, Color.BLACK) + + label.y -= 0.5f + amountGroup.x = width - amountGroup.width * 2 / 3 + amountGroup.y = -amountGroup.height / 3 + + addActor(amountGroup) + } + } + + override fun getDefaultInnerBackgroundTint(): Color { + return ruleset.tileResources[imageName]?.resourceType?.getColor() ?: Color.WHITE + } +} + +class PortraitTech(name: String, size: Float) : Portrait(Type.Tech, name, size) { + override fun getDefaultOuterBackgroundTint(): Color { + return getDefaultImageTint() + } + override fun getDefaultImageTint(): Color { + return ruleset.eras[ruleset.technologies[imageName]?.era()]?.getColor()?.darken(0.6f) ?: Color.BLACK + } +} + +class PortraitUnit(name: String, size: Float) : Portrait(Type.Unit, name, size) { + override fun getDefaultImageTint(): Color { + return Color.BLACK + } +} + +class PortraitBuilding(name: String, size: Float) : Portrait(Type.Building, name, size) { + override fun getDefaultImageTint(): Color { + return Color.BLACK + } +} + +class PortraitUnique(name: String, size: Float) : Portrait(Type.Unique, name, size) { + override fun getDefaultImageTint(): Color { + return Color.BLACK + } +} + +class PortraitReligion(name: String, size: Float) : Portrait(Type.Religion, name, size) { + override fun getDefaultImageTint(): Color { + return Color.BLACK + } +} + +class PortraitUnitAction(name: String, size: Float) : Portrait(Type.UnitAction, name, size) { + override fun getDefaultImageTint(): Color { + return Color.BLACK + } +} + +class PortraitImprovement(name: String, size: Float, dim: Boolean = false) : Portrait(Type.Improvement, name, size) { + + init { + if (dim) { + image.color.a = 0.7f + background.color.a = 0.7f + } + } + + private fun getColorFromStats(stats: Stats): Color { + if (stats.asSequence().none { it.value > 0 }) + return Color.WHITE + return stats.asSequence().maxByOrNull { it.value }!!.key.color + } + + override fun getDefaultInnerBackgroundTint(): Color { + val improvement = ImageGetter.ruleset.tileImprovements[imageName] + if (improvement != null) + return getColorFromStats(improvement) + return Color.WHITE + } +} + +class PortraitNation(name: String, size: Float) : Portrait(Type.Nation, name, size, size*0.1f) { + + override fun getDefaultImage(): Image { + + val nation = ruleset.nations[imageName] + val isCityState = nation != null && nation.isCityState() + val pathCityState = "NationIcons/CityState" + + return when { + ImageGetter.imageExists(pathIcon) -> ImageGetter.getImage(pathIcon) + isCityState && ImageGetter.imageExists(pathCityState)-> ImageGetter.getImage(pathCityState) + ImageGetter.imageExists(pathIconFallback) -> ImageGetter.getImage(pathIconFallback) + else -> ImageGetter.getCircle() + } + } + + override fun getDefaultInnerBackgroundTint(): Color { + return ruleset.nations[imageName]?.getOuterColor() ?: Color.BLACK + } + + override fun getDefaultOuterBackgroundTint(): Color { + return getDefaultImageTint() + } + + override fun getDefaultImageTint(): Color { + return ruleset.nations[imageName]?.getInnerColor() ?: Color.WHITE + } + +} + +class PortraitPromotion(name: String, size: Float) : Portrait(Type.Promotion, name, size) { + + var level = 0 + + init { + if (level > 0) { + val padding = if (level == 3) 0.5f else 2f + val starTable = Table().apply { defaults().pad(padding) } + for (i in 1..level) + starTable.add(ImageGetter.getImage("OtherIcons/Star")).size(size / 4f) + starTable.centerX(this) + starTable.y = size / 6f + addActor(starTable) + } + } + + override fun getDefaultImage(): Image { + + val nameWithoutBrackets = imageName.replace("[", "").replace("]", "") + + level = when { + nameWithoutBrackets.endsWith(" I") -> 1 + nameWithoutBrackets.endsWith(" II") -> 2 + nameWithoutBrackets.endsWith(" III") -> 3 + else -> 0 + } + + val basePromotionName = nameWithoutBrackets.dropLast(if (level == 0) 0 else level + 1) + + val pathWithoutBrackets = "UnitPromotionIcons/$nameWithoutBrackets" + val pathBase = "UnitPromotionIcons/$basePromotionName" + val pathUnit = "UnitIcons/${basePromotionName.removeSuffix(" ability")}" + + return when { + ImageGetter.imageExists(pathWithoutBrackets) -> { + level = 0 + ImageGetter.getImage(pathWithoutBrackets) + } + ImageGetter.imageExists(pathBase) -> ImageGetter.getImage(pathBase) + ImageGetter.imageExists(pathUnit) -> ImageGetter.getImage(pathUnit) + else -> ImageGetter.getImage(pathIconFallback) + } + } + + override fun getDefaultImageTint(): Color { + return colorFromRGB(255, 226, 0) + } + + override fun getDefaultOuterBackgroundTint(): Color { + return getDefaultImageTint() + } + + override fun getDefaultInnerBackgroundTint(): Color { + return colorFromRGB(0, 12, 49) + } + +} diff --git a/core/src/com/unciv/ui/newgamescreen/NationTable.kt b/core/src/com/unciv/ui/newgamescreen/NationTable.kt index a6ac8033fe..3e94a0f78b 100644 --- a/core/src/com/unciv/ui/newgamescreen/NationTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/NationTable.kt @@ -33,8 +33,8 @@ class NationTable(val nation: Nation, width: Float, minHeight: Float, ruleset: R "NewGameScreen/NationTable/Title", tintColor = outerColor ) val nationIndicator: Actor = - if (nation.name == Constants.random) ImageGetter.getRandomNationIndicator(50f) - else ImageGetter.getNationIndicator(nation, 50f) + if (nation.name == Constants.random) ImageGetter.getRandomNationPortrait(50f) + else ImageGetter.getNationPortrait(nation, 50f) titleTable.add(nationIndicator).pad(10f).padLeft(0f) // left 0 for centering _with_ label val titleText = if (ruleset == null || nation.name == Constants.random || nation.name == Constants.spectator) diff --git a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt index 3d1450a302..1e5a09a986 100644 --- a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt @@ -219,8 +219,8 @@ class PlayerPickerTable( val nationTable = Table() val nationImage = if (player.chosenCiv == Constants.random) - ImageGetter.getRandomNationIndicator(40f) - else ImageGetter.getNationIndicator(previousScreen.ruleset.nations[player.chosenCiv]!!, 40f) + ImageGetter.getRandomNationPortrait(40f) + else ImageGetter.getNationPortrait(previousScreen.ruleset.nations[player.chosenCiv]!!, 40f) nationTable.add(nationImage).pad(5f) nationTable.add(player.chosenCiv.toLabel()).pad(5f) nationTable.touchable = Touchable.enabled diff --git a/core/src/com/unciv/ui/overviewscreen/CityOverviewTable.kt b/core/src/com/unciv/ui/overviewscreen/CityOverviewTable.kt index 6570c93700..8703ded171 100644 --- a/core/src/com/unciv/ui/overviewscreen/CityOverviewTable.kt +++ b/core/src/com/unciv/ui/overviewscreen/CityOverviewTable.kt @@ -194,7 +194,7 @@ class CityOverviewTab( val construction = city.cityConstructions.currentConstructionFromQueue if (construction.isNotEmpty()) { - cityInfoTableDetails.add(ImageGetter.getPortraitImage(construction, iconSize*0.8f)).padRight(paddingHorz) + cityInfoTableDetails.add(ImageGetter.getConstructionPortrait(construction, iconSize*0.8f)).padRight(paddingHorz) } else { cityInfoTableDetails.add() } @@ -216,7 +216,7 @@ class CityOverviewTab( cityInfoTableDetails.add(image) } city.demandedResource.isNotEmpty() -> { - val image = ImageGetter.getResourceImage(city.demandedResource, iconSize*0.7f) + val image = ImageGetter.getResourcePortrait(city.demandedResource, iconSize*0.7f) image.addTooltip("Demanding [${city.demandedResource}]", 18f, tipAlign = Align.topLeft) cityInfoTableDetails.add(image).padLeft(iconSize*0.3f) } diff --git a/core/src/com/unciv/ui/overviewscreen/EspionageOverviewScreen.kt b/core/src/com/unciv/ui/overviewscreen/EspionageOverviewScreen.kt index 10babc3839..822c93fc7f 100644 --- a/core/src/com/unciv/ui/overviewscreen/EspionageOverviewScreen.kt +++ b/core/src/com/unciv/ui/overviewscreen/EspionageOverviewScreen.kt @@ -139,7 +139,7 @@ class EspionageOverviewScreen(val civInfo: CivilizationInfo) : PickerScreen(true } private fun addCityToSelectionTable(city: CityInfo) { - citySelectionTable.add(ImageGetter.getNationIndicator(city.civInfo.nation, 30f)).pad(5f) + citySelectionTable.add(ImageGetter.getNationPortrait(city.civInfo.nation, 30f)).pad(5f) citySelectionTable.add(city.name.toLabel()).pad(5f) if (city.espionage.hasSpyOf(civInfo)) { citySelectionTable.add( diff --git a/core/src/com/unciv/ui/overviewscreen/GlobalPoliticsOverviewTable.kt b/core/src/com/unciv/ui/overviewscreen/GlobalPoliticsOverviewTable.kt index 3e6c684a66..53c8ecccc4 100644 --- a/core/src/com/unciv/ui/overviewscreen/GlobalPoliticsOverviewTable.kt +++ b/core/src/com/unciv/ui/overviewscreen/GlobalPoliticsOverviewTable.kt @@ -16,7 +16,6 @@ import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.RelationshipLevel import com.unciv.models.ruleset.Policy.PolicyBranchType -import com.unciv.models.translations.tr import com.unciv.ui.images.ImageGetter import com.unciv.ui.trade.DiplomacyScreen import com.unciv.ui.utils.AutoScrollPane @@ -99,7 +98,7 @@ class GlobalPoliticsOverviewTable ( civilizations.removeAll(civilizations.filter { it.isBarbarian() || it.isCityState() || it.isSpectator() }) for (civ in civilizations) { // civ image - add(ImageGetter.getNationIndicator(civ.nation, 100f)).pad(20f) + add(ImageGetter.getNationPortrait(civ.nation, 100f)).pad(20f) addSeparatorVertical(Color.GRAY) @@ -314,7 +313,7 @@ class GlobalPoliticsOverviewTable ( private fun getCivMiniTable(civInfo: CivilizationInfo): Table { val table = Table() - table.add(ImageGetter.getNationIndicator(civInfo.nation, 25f)).pad(5f) + table.add(ImageGetter.getNationPortrait(civInfo.nation, 25f)).pad(5f) table.add(civInfo.civName.toLabel()).left().padRight(10f) table.touchable = Touchable.enabled table.onClick { @@ -409,7 +408,7 @@ class GlobalPoliticsOverviewTable ( val civCount = undefeatedCivs.count() for ((i, civ) in undefeatedCivs.withIndex()) { - val civGroup = ImageGetter.getNationIndicator(civ.nation, 30f) + val civGroup = ImageGetter.getNationPortrait(civ.nation, 30f) val vector = HexMath.getVectorForAngle(2 * Math.PI.toFloat() * i / civCount) civGroup.center(this) diff --git a/core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt b/core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt index 7c8dd32719..add9e92cfa 100644 --- a/core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt +++ b/core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt @@ -90,11 +90,11 @@ class ReligionOverviewTab( for (religion in existingReligions) { val image = if (religion.isPantheon()) { if (viewingPlayer.knows(religion.foundingCivName) || viewingPlayer.civName == religion.foundingCivName) - ImageGetter.getNationIndicator(religion.getFounder().nation, 60f) + ImageGetter.getNationPortrait(religion.getFounder().nation, 60f) else - ImageGetter.getRandomNationIndicator(60f) + ImageGetter.getRandomNationPortrait(60f) } else { - ImageGetter.getCircledReligionIcon(religion.getIconName(), 60f) + ImageGetter.getReligionPortrait(religion.getIconName(), 60f) } val button = Button(image, BaseScreen.skin) diff --git a/core/src/com/unciv/ui/overviewscreen/ResourcesOverviewTable.kt b/core/src/com/unciv/ui/overviewscreen/ResourcesOverviewTable.kt index 7282ffc4d4..5d02df516e 100644 --- a/core/src/com/unciv/ui/overviewscreen/ResourcesOverviewTable.kt +++ b/core/src/com/unciv/ui/overviewscreen/ResourcesOverviewTable.kt @@ -77,7 +77,7 @@ class ResourcesOverviewTab( private fun ResourceSupplyList.getTotalLabel(resource: TileResource): Label = filter { it.resource == resource }.sumOf { it.amount }.toLabel() private fun getResourceImage(name: String) = - ImageGetter.getResourceImage(name, iconSize).apply { + ImageGetter.getResourcePortrait(name, iconSize).apply { onClick { if (viewingPlayer.gameInfo.notifyExploredResources(viewingPlayer, name, 0, true)) overviewScreen.game.popScreen() diff --git a/core/src/com/unciv/ui/overviewscreen/UnitOverviewTable.kt b/core/src/com/unciv/ui/overviewscreen/UnitOverviewTable.kt index 7a098c3a01..e21bfa023e 100644 --- a/core/src/com/unciv/ui/overviewscreen/UnitOverviewTable.kt +++ b/core/src/com/unciv/ui/overviewscreen/UnitOverviewTable.kt @@ -203,7 +203,7 @@ class UnitOverviewTab( val promotionsTable = Table() // getPromotions goes by json order on demand, so this is same sorting as on picker for (promotion in unit.promotions.getPromotions(true)) - promotionsTable.add(ImageGetter.getPromotionIcon(promotion.name)) + promotionsTable.add(ImageGetter.getPromotionPortrait(promotion.name)) if (unit.promotions.canBePromoted()) promotionsTable.add( ImageGetter.getImage("OtherIcons/Star").apply { diff --git a/core/src/com/unciv/ui/pickerscreens/DiplomaticVotePickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/DiplomaticVotePickerScreen.kt index f8f24aa11d..d1c1e62bc7 100644 --- a/core/src/com/unciv/ui/pickerscreens/DiplomaticVotePickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/DiplomaticVotePickerScreen.kt @@ -19,7 +19,7 @@ class DiplomaticVotePickerScreen(private val votingCiv: CivilizationInfo) : Pick val choosableCivs = votingCiv.gameInfo.civilizations.filter { it.isMajorCiv() && it != votingCiv && !it.isDefeated() } for (civ in choosableCivs) { - val button = PickerPane.getPickerOptionButton(ImageGetter.getNationIndicator(civ.nation, PickerPane.pickerOptionIconSize), civ.civName) + val button = PickerPane.getPickerOptionButton(ImageGetter.getNationPortrait(civ.nation, PickerPane.pickerOptionIconSize), civ.civName) button.pack() button.onClick { chosenCiv = civ.civName diff --git a/core/src/com/unciv/ui/pickerscreens/DiplomaticVoteResultScreen.kt b/core/src/com/unciv/ui/pickerscreens/DiplomaticVoteResultScreen.kt index aa885f5833..da904f63d6 100644 --- a/core/src/com/unciv/ui/pickerscreens/DiplomaticVoteResultScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/DiplomaticVoteResultScreen.kt @@ -35,7 +35,7 @@ class DiplomaticVoteResultScreen(val votesCast: HashMap, val vie val civ = gameInfo.civilizations.firstOrNull { it.civName == civName } if (civ == null || civ.isDefeated()) return - topTable.add(ImageGetter.getNationIndicator(civ.nation, 30f)).pad(10f) + topTable.add(ImageGetter.getNationPortrait(civ.nation, 30f)).pad(10f) topTable.add(civName.toLabel()).pad(20f) if (civName !in votesCast.keys) { topTable.add("Abstained".toLabel()).row() @@ -49,7 +49,7 @@ class DiplomaticVoteResultScreen(val votesCast: HashMap, val vie } topTable.add("Voted for".toLabel()).pad(20f) - topTable.add(ImageGetter.getNationIndicator(votedCiv.nation, 30f)).pad(10f) + topTable.add(ImageGetter.getNationPortrait(votedCiv.nation, 30f)).pad(10f) topTable.add(votedCiv.civName.toLabel()).row() } } diff --git a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt index 7429ed9603..54f7f7a6c2 100644 --- a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt @@ -97,7 +97,7 @@ class ImprovementPickerScreen( else suggestRemoval = true } - val image = ImageGetter.getImprovementIcon(improvement.name, 30f) + val image = ImageGetter.getImprovementPortrait(improvement.name, 30f) // allow multiple key mappings to technologically supersede each other var shortcutKey = improvement.shortcutKey @@ -205,11 +205,11 @@ class ImprovementPickerScreen( // icon for adding the resource by improvement if (provideResource) - statIcons.add(ImageGetter.getResourceImage(tileInfo.resource.toString(), 30f)).pad(3f) + statIcons.add(ImageGetter.getResourcePortrait(tileInfo.resource.toString(), 30f)).pad(3f) // icon for removing the resource by replacing improvement if (removeImprovement && tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.improvement != null && tileInfo.tileResource.isImprovedBy(tileInfo.improvement!!)) { - val resourceIcon = ImageGetter.getResourceImage(tileInfo.resource!!, 30f) + val resourceIcon = ImageGetter.getResourcePortrait(tileInfo.resource!!, 30f) statIcons.add(ImageGetter.getCrossedImage(resourceIcon, 30f)) } return statIcons diff --git a/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt index 06dda976ea..7597584ca1 100644 --- a/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt @@ -101,7 +101,7 @@ class PromotionButton( pad(5f) align(Align.left) - add(ImageGetter.getPromotionIcon(node.promotion.name)).padRight(10f) + add(ImageGetter.getPromotionPortrait(node.promotion.name)).padRight(10f) add(label).left().maxWidth(130f) updateColor() diff --git a/core/src/com/unciv/ui/pickerscreens/ReligiousBeliefsPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/ReligiousBeliefsPickerScreen.kt index 96e7efae8f..409f818b46 100644 --- a/core/src/com/unciv/ui/pickerscreens/ReligiousBeliefsPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/ReligiousBeliefsPickerScreen.kt @@ -117,7 +117,7 @@ class ReligiousBeliefsPickerScreen ( AskTextPopup( this, label = "Choose a name for your religion", - icon = ImageGetter.getCircledReligionIcon(religionName!!, 80f), + icon = ImageGetter.getReligionPortrait(religionName!!, 80f), defaultText = religionName!!, validate = { religionName -> religionName != Constants.noReligionName @@ -150,7 +150,7 @@ class ReligiousBeliefsPickerScreen ( for (religionName in ruleset.religions) { if (religionName == this.religionName) scrollTo = iconsTable.packIfNeeded().prefWidth - val button = Button(ImageGetter.getCircledReligionIcon(religionName, 60f), skin) + val button = Button(ImageGetter.getReligionPortrait(religionName, 60f), skin) buttonSetup(button, religionName) if (religionName == this.religionName) button.disable(Color(greenDisableColor)) else if (gameInfo.religions.keys.any { it == religionName }) button.disable(redDisableColor) diff --git a/core/src/com/unciv/ui/pickerscreens/TechButton.kt b/core/src/com/unciv/ui/pickerscreens/TechButton.kt index dffd8d1adf..5ac4a4888f 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechButton.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechButton.kt @@ -6,7 +6,6 @@ import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align -import com.unciv.Constants import com.unciv.logic.civilization.TechManager import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.tile.TileImprovement @@ -19,13 +18,9 @@ import com.unciv.ui.utils.extensions.addBorder import com.unciv.ui.utils.extensions.brighten import com.unciv.ui.utils.extensions.center import com.unciv.ui.utils.extensions.centerY -import com.unciv.ui.utils.extensions.colorFromRGB import com.unciv.ui.utils.extensions.darken import com.unciv.ui.utils.extensions.setFontSize -import com.unciv.ui.utils.extensions.setSize import com.unciv.ui.utils.extensions.surroundWithCircle -import com.unciv.ui.utils.extensions.surroundWithThinCircle -import com.unciv.ui.utils.extensions.toGroup import com.unciv.ui.utils.extensions.toLabel class TechButton(techName:String, private val techManager: TechManager, isWorldScreen: Boolean = true) : Table(BaseScreen.skin) { @@ -52,8 +47,7 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS pad(0f).padBottom(5f).padTop(5f).padLeft(5f).padRight(0f) - val isResearched = (techManager.isResearched(techName) && techName != Constants.futureTech) - add(ImageGetter.getTechIconGroup(techName, 46f, isResearched)) + add(ImageGetter.getTechIconPortrait(techName, 46f)) .padRight(5f).padLeft(2f).left() if (isWorldScreen) { @@ -112,18 +106,18 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS val icons = ArrayList() for (unit in tech.getEnabledUnits(ruleset, techManager.civInfo)) { - icons.add(ImageGetter.getPortraitImage(unit.name, techIconSize)) + icons.add(ImageGetter.getConstructionPortrait(unit.name, techIconSize)) } for (building in tech.getEnabledBuildings(ruleset, techManager.civInfo)) { - icons.add(ImageGetter.getPortraitImage(building.name, techIconSize)) + icons.add(ImageGetter.getConstructionPortrait(building.name, techIconSize)) } for (obj in tech.getObsoletedObjects(ruleset, techManager.civInfo)) { val obsoletedIcon = when (obj) { - is Building -> ImageGetter.getPortraitImage(obj.name, techIconSize) - is TileResource -> ImageGetter.getResourceImage(obj.name, techIconSize) - is TileImprovement -> ImageGetter.getImprovementIcon(obj.name, techIconSize) + is Building -> ImageGetter.getConstructionPortrait(obj.name, techIconSize) + is TileResource -> ImageGetter.getResourcePortrait(obj.name, techIconSize) + is TileImprovement -> ImageGetter.getImprovementPortrait(obj.name, techIconSize) else -> continue }.also { val closeImage = ImageGetter.getRedCross(techIconSize / 2, 1f) @@ -134,36 +128,31 @@ class TechButton(techName:String, private val techManager: TechManager, isWorldS } for (resource in ruleset.tileResources.values.filter { it.revealedBy == techName }) { - icons.add(ImageGetter.getResourceImage(resource.name, techIconSize)) + icons.add(ImageGetter.getResourcePortrait(resource.name, techIconSize)) } for (improvement in ruleset.tileImprovements.values.asSequence() .filter { it.techRequired == techName } .filter { it.uniqueTo == null || it.uniqueTo == civName } ) { - icons.add(ImageGetter.getImprovementIcon(improvement.name, techIconSize, true)) + icons.add(ImageGetter.getImprovementPortrait(improvement.name, techIconSize)) } for (improvement in ruleset.tileImprovements.values.asSequence() .filter { it.uniqueObjects.any { u -> u.allParams.contains(techName) } } .filter { it.uniqueTo == null || it.uniqueTo == civName } ) { - icons.add( - ImageGetter.getImage("OtherIcons/Unique") - .surroundWithCircle(techIconSize) - .surroundWithThinCircle()) + icons.add(ImageGetter.getUniquePortrait(improvement.name, techIconSize)) } for (unique in tech.uniques) { icons.add( when (unique) { UniqueType.EnablesCivWideStatProduction.text.replace("civWideStat", "Gold" ) - -> ImageGetter.getImage("OtherIcons/ConvertGold").toGroup(techIconSize) + -> ImageGetter.getConstructionPortrait("Gold", techIconSize) UniqueType.EnablesCivWideStatProduction.text.replace("civWideStat", "Science" ) - -> ImageGetter.getImage("OtherIcons/ConvertScience").toGroup(techIconSize) - else -> ImageGetter.getImage("OtherIcons/Unique") - .surroundWithCircle(techIconSize) - .surroundWithThinCircle() + -> ImageGetter.getConstructionPortrait("Science", techIconSize) + else -> ImageGetter.getUniquePortrait(unique, techIconSize) } ) } diff --git a/core/src/com/unciv/ui/popup/AskTextPopup.kt b/core/src/com/unciv/ui/popup/AskTextPopup.kt index 8b5b32fccb..01ccef9701 100644 --- a/core/src/com/unciv/ui/popup/AskTextPopup.kt +++ b/core/src/com/unciv/ui/popup/AskTextPopup.kt @@ -1,6 +1,7 @@ package com.unciv.ui.popup import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextField import com.unciv.ui.images.IconCircleGroup @@ -24,7 +25,7 @@ import com.unciv.ui.utils.extensions.toLabel class AskTextPopup( screen: BaseScreen, label: String = "Please enter some text", - icon: IconCircleGroup = ImageGetter.getImage("OtherIcons/Pencil").apply { this.color = Color.BLACK }.surroundWithCircle(80f), + icon: Group = ImageGetter.getImage("OtherIcons/Pencil").apply { this.color = Color.BLACK }.surroundWithCircle(80f), defaultText: String = "", errorText: String = "Invalid input! Please enter a different string.", maxLength: Int = 32, diff --git a/core/src/com/unciv/ui/tilegroups/CityButton.kt b/core/src/com/unciv/ui/tilegroups/CityButton.kt index 76606aa3d3..fc74ec1ba6 100644 --- a/core/src/com/unciv/ui/tilegroups/CityButton.kt +++ b/core/src/com/unciv/ui/tilegroups/CityButton.kt @@ -7,10 +7,8 @@ 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.actions.Actions -import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align -import com.unciv.Constants import com.unciv.logic.battle.CityCombatant import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.CityInfo @@ -26,14 +24,10 @@ import com.unciv.ui.trade.DiplomacyScreen import com.unciv.ui.utils.BaseScreen import com.unciv.ui.utils.BorderedTable import com.unciv.ui.utils.Fonts -import com.unciv.ui.utils.extensions.brighten import com.unciv.ui.utils.extensions.center import com.unciv.ui.utils.extensions.centerX import com.unciv.ui.utils.extensions.colorFromRGB import com.unciv.ui.utils.extensions.onClick -import com.unciv.ui.utils.extensions.setSize -import com.unciv.ui.utils.extensions.surroundWithCircle -import com.unciv.ui.utils.extensions.surroundWithThinCircle import com.unciv.ui.utils.extensions.toGroup import com.unciv.ui.utils.extensions.toLabel import kotlin.math.max @@ -321,7 +315,7 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab if (!forPopup) { val cityReligion = city.religion.getMajorityReligion() if (cityReligion != null) { - val religionImage = ImageGetter.getReligionImage(cityReligion.getIconName()).apply { + val religionImage = ImageGetter.getReligionIcon(cityReligion.getIconName()).apply { color = secondaryColor }.toGroup(20f) labelTable.add(religionImage).size(20f).padLeft(5f) } @@ -451,7 +445,7 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab table.add(productionBar).padTop(1f).padBottom(1f) } - val constructionImage = ImageGetter.getPortraitImage(cityCurrentConstruction.name, 24f) + val constructionImage = ImageGetter.getConstructionPortrait(cityCurrentConstruction.name, 24f) table.add(constructionImage).minHeight(32f).minWidth(26f) .expand().center().right().pad(0f).padRight(4f).padLeft(3f) table.pack() diff --git a/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt b/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt index bd4dcd3ec7..a5b1394529 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt @@ -127,14 +127,12 @@ class TileGroupIcons(val tileGroup: TileGroup) { val shownImprovement = tileGroup.tileInfo.getShownImprovement(viewingCiv) if (shownImprovement == null || !showResourcesAndImprovements) return - val newImprovementImage = ImageGetter.getImprovementIcon(shownImprovement) + val newImprovementImage = ImageGetter.getImprovementPortrait(shownImprovement, dim = false) tileGroup.miscLayerGroup.addActor(newImprovementImage) newImprovementImage.run { - setSize(20f, 20f) center(tileGroup) this.x -= 22 // left - this.y -= 10 // bottom - color = Color.WHITE.cpy().apply { a = 0.7f } + this.y -= 12 // bottom } improvementIcon = newImprovementImage } @@ -170,7 +168,7 @@ class TileGroupIcons(val tileGroup: TileGroup) { tileGroup.resourceImage?.remove() if (tileGroup.resource == null) tileGroup.resourceImage = null else { - val newResourceIcon = ImageGetter.getResourceImage(tileGroup.tileInfo.resource!!, 20f, tileGroup.tileInfo.resourceAmount) + val newResourceIcon = ImageGetter.getResourcePortrait(tileGroup.tileInfo.resource!!, 20f, tileGroup.tileInfo.resourceAmount) newResourceIcon.center(tileGroup) newResourceIcon.x = newResourceIcon.x - 22 // left newResourceIcon.y = newResourceIcon.y + 10 // top @@ -215,7 +213,7 @@ class TileGroupIcons(val tileGroup: TileGroup) { var offsetY = (displayCount - 1) * 2f for (nation in nations.take(3).asReversed()) { val newNationIcon = - ImageGetter.getNationIndicator(nation.second, 20f) + ImageGetter.getNationPortrait(nation.second, 20f) tileGroup.miscLayerGroup.addActor(newNationIcon) newNationIcon.run { setSize(20f, 20f) diff --git a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt index b4070ce4fd..0551af0c46 100644 --- a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt @@ -118,7 +118,7 @@ class DiplomacyScreen( selectCivY = leftSideTable.prefHeight } - val civIndicator = ImageGetter.getNationIndicator(civ.nation, nationIconSize) + val civIndicator = ImageGetter.getNationPortrait(civ.nation, nationIconSize) val relationLevel = civ.getDiplomacyManager(viewingCiv).relationshipLevel() val relationshipIcon = if (civ.isCityState() && relationLevel == RelationshipLevel.Ally) @@ -202,7 +202,7 @@ class DiplomacyScreen( continue val name = supplyList.resource.name val wrapper = Table() - val image = ImageGetter.getResourceImage(name, 30f) + val image = ImageGetter.getResourcePortrait(name, 30f) wrapper.add(image).padRight(5f) wrapper.add(supplyList.amount.toLabel()) resourcesTable.add(wrapper).padRight(20f) diff --git a/core/src/com/unciv/ui/trade/LeaderIntroTable.kt b/core/src/com/unciv/ui/trade/LeaderIntroTable.kt index c3a84eeb75..a7b5e46be8 100644 --- a/core/src/com/unciv/ui/trade/LeaderIntroTable.kt +++ b/core/src/com/unciv/ui/trade/LeaderIntroTable.kt @@ -30,7 +30,7 @@ class LeaderIntroTable ( val nation = civInfo.nation val leaderPortraitFile = "LeaderIcons/" + nation.leaderName val leaderLabel = civInfo.getLeaderDisplayName().toLabel(fontSize = Constants.headingFontSize) - val nationIndicator = ImageGetter.getNationIndicator(nation, 24f) + val nationIndicator = ImageGetter.getNationPortrait(nation, 24f) if (nation.leaderName.isNotEmpty() && ImageGetter.imageExists(leaderPortraitFile)) { val nameTable = Table() nameTable.add(leaderLabel) diff --git a/core/src/com/unciv/ui/trade/OffersListScroll.kt b/core/src/com/unciv/ui/trade/OffersListScroll.kt index c0af8f3648..00aad92b38 100644 --- a/core/src/com/unciv/ui/trade/OffersListScroll.kt +++ b/core/src/com/unciv/ui/trade/OffersListScroll.kt @@ -90,9 +90,9 @@ class OffersListScroll( val tradeLabel = offer.getOfferText(untradableOffers.sumBy(offer.name)) val tradeIcon = when (offer.type) { Luxury_Resource, Strategic_Resource -> - ImageGetter.getResourceImage(offer.name, 30f) + ImageGetter.getResourcePortrait(offer.name, 30f) WarDeclaration -> - ImageGetter.getNationIndicator(UncivGame.Current.gameInfo!!.ruleSet.nations[offer.name]!!, 30f) + ImageGetter.getNationPortrait(UncivGame.Current.gameInfo!!.ruleSet.nations[offer.name]!!, 30f) else -> null } val tradeButton = IconTextButton(tradeLabel, tradeIcon).apply { diff --git a/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt b/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt index f599a52def..761cee4436 100644 --- a/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt +++ b/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt @@ -274,11 +274,11 @@ class VictoryScreen(val worldScreen: WorldScreen) : PickerScreen() { || currentPlayer.isDefeated() || currentPlayer.victoryManager.hasWon() ) { - civGroup.add(ImageGetter.getNationIndicator(civ.nation, 30f)) + civGroup.add(ImageGetter.getNationPortrait(civ.nation, 30f)) backgroundColor = civ.nation.getOuterColor() labelColor = civ.nation.getInnerColor() } else { - civGroup.add(ImageGetter.getRandomNationIndicator(30f)) + civGroup.add(ImageGetter.getRandomNationPortrait(30f)) backgroundColor = Color.DARK_GRAY labelText = Constants.unknownNationName } diff --git a/core/src/com/unciv/ui/worldscreen/AlertPopup.kt b/core/src/com/unciv/ui/worldscreen/AlertPopup.kt index 8d7ce76014..176fd18948 100644 --- a/core/src/com/unciv/ui/worldscreen/AlertPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/AlertPopup.kt @@ -209,7 +209,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu .row() } } else { // Fallback - add(ImageGetter.getPortraitImage(wonder.name, 100f)).pad(20f).row() + add(ImageGetter.getConstructionPortrait(wonder.name, 100f)).pad(20f).row() } val centerTable = Table() @@ -227,7 +227,7 @@ class AlertPopup(val worldScreen: WorldScreen, val popupAlert: PopupAlert): Popu addSeparator() val centerTable = Table() centerTable.add(tech.quote.toLabel().apply { wrap = true }).width(worldScreen.stage.width / 3) - centerTable.add(ImageGetter.getTechIconGroup(tech.name, 100f)).pad(20f) + centerTable.add(ImageGetter.getTechIconPortrait(tech.name, 100f)).pad(20f) val descriptionScroll = ScrollPane(tech.getDescription(gameBasics).toLabel().apply { wrap = true }) centerTable.add(descriptionScroll).width(worldScreen.stage.width / 3).maxHeight(worldScreen.stage.height / 2) add(centerTable).row() diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt index de6cd63200..9f9d7202f0 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt @@ -151,7 +151,7 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { val strategicResources = worldScreen.gameInfo.ruleSet.tileResources.values .filter { it.resourceType == ResourceType.Strategic } for (resource in strategicResources) { - val resourceImage = ImageGetter.getResourceImage(resource.name, 20f) + val resourceImage = ImageGetter.getResourcePortrait(resource.name, 20f) val resourceLabel = "0".toLabel() resourceActors += ResourceActors(resource, resourceLabel, resourceImage) } @@ -241,7 +241,7 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { selectedCivLabel.setText(newCiv.tr()) val nation = worldScreen.gameInfo.ruleSet.nations[worldScreen.selectedCiv.civName]!! - val selectedCivIcon = ImageGetter.getNationIndicator(nation, 35f) + val selectedCivIcon = ImageGetter.getNationPortrait(nation, 35f) selectedCivIconHolder.actor = selectedCivIcon invalidate() pack() diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index 5ac768b01d..719ca2629d 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -118,7 +118,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() { private fun getIcon(combatant:ICombatant) = if (combatant is MapUnitCombatant) UnitGroup(combatant.unit,25f) - else ImageGetter.getNationIndicator(combatant.getCivInfo().nation, 25f) + else ImageGetter.getNationPortrait(combatant.getCivInfo().nation, 25f) private val quarterScreen = worldScreen.stage.width / 4 diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt index b855d02fb3..1baf7745b4 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt @@ -251,7 +251,7 @@ class UnitTable(val worldScreen: WorldScreen) : Table() { unitIconHolder.add(UnitGroup(selectedUnit!!, 30f)).pad(5f) for (promotion in selectedUnit!!.promotions.getPromotions(true)) - promotionsTable.add(ImageGetter.getPromotionIcon(promotion.name)) + promotionsTable.add(ImageGetter.getPromotionPortrait(promotion.name)) // Since Clear also clears the listeners, we need to re-add them every time promotionsTable.onClick { diff --git a/docs/Credits.md b/docs/Credits.md index 4dce9c056b..f4e1e599c3 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -601,6 +601,8 @@ Unless otherwise specified, all the following are from [the Noun Project](https: - [pennant](https://thenounproject.com/term/pennant/194797/) by Sara Jeffries - [Maya civilization](https://thenounproject.com/term/maya-civilization/1715786/) by Olena Panasovska for The Maya - Aztec icon by Kāne, on Unciv Discord server +- [Questionmark](https://thenounproject.com/icon/questionmark-4248169/) by YURR.studio for Random nation indicator +- [View](https://thenounproject.com/icon/view-4211245/) by Adrien Coquet for Spectator ### Promotions diff --git a/docs/Modders/Images-and-Audio.md b/docs/Modders/Images-and-Audio.md index 858b1b1806..ca9cca1df8 100644 --- a/docs/Modders/Images-and-Audio.md +++ b/docs/Modders/Images-and-Audio.md @@ -41,11 +41,11 @@ These work best if they are square, between 100x100 and 256x256 pixels, and incl For example, [here](https://github.com/yairm210/Unciv-leader-portrait-mod-example) is mod showing how to add leader portraits, which can complement the base game. -### Adding Unit, Building and Tech Portraits +### Adding Portraits -The base game uses flat icons, colored to fit the civilization's flag colors, to denote units both on the map and in other UI elements. A mod can supply "Portraits" - static images that will remain uncolored - by adding their images to `/Images/UnitPortraits/`, `/Images/BuildingPortraits/` and '/Images/TechPortraits/', which will be used in all UI elements except for the world map. The file name must correspond exactly with the unit/building/tech name as defined in Units.json, Buildings.json or Techs.json or they will be ignored. +The base game uses flat icons, surrounded with colored circles as backgrounds (e.g. for units to fit the civilization's flag colors), to denote entities such as: units, buildings, techs, resources, improvements, religions, promotions, uniques, unit actions and nations in the UI. A mod can supply "Portraits" - static images that will remain uncolored - by adding images to `/Images/Portraits/` (e.g. `/Images/BuildingPortraits/`, /Images/ResourcesPortraits/, etc), which will be used in all UI elements (except for unit icons in the world map). The file name must correspond exactly with the unit/building/tech/resource/etc name defined in corresponding JSONs (e.g. Units.json, Buildings.json, TileResources.json, etc) or have the same name as the file they suppose to replace, or they will be ignored. -If mod supplies '/Images/TechPortraits/Background.png' image, it will be used as a background for tech portraits instead of default circle. +If mod supplies '/Images/Portraits/Background.png' images, they will be used as a background for corresponding portraits instead of default circle. Portraits and backgrounds work best if they are full RGB square, between 100x100 and 256x256 pixels, and include some transparent border within that area.