diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 323352d9eb..49a55ff716 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -178,12 +178,14 @@ public class AndroidLauncher extends AndroidApplication{ ui.showError("$save.import.invalid"); } }else if(map){ //open map + FileHandle file = Core.files.local("temp-map." + mapExtension); + file.write(inStream, false); Core.app.post(() -> { System.out.println("Opening map."); if(!ui.editor.isShown()){ ui.editor.show(); } - ui.editor.beginEditMap(inStream); + ui.editor.beginEditMap(file); }); } }); diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 81b71ebf88..a9207e030c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -197,8 +197,8 @@ editor.description = Description: editor.name = Name: editor.teams = Teams editor.elevation = Elevation -editor.errorimageload = Error loading file:\n[accent]{0} -editor.errorimagesave = Error saving file:\n[accent]{0} +editor.errorload = Error loading file:\n[accent]{0} +editor.errorsave = Error saving file:\n[accent]{0} editor.generate = Generate editor.resize = Resize editor.loadmap = Load Map @@ -560,7 +560,6 @@ block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster block.stained-rocks.name = Stained Rocks -block.stained-stone.name = Stained Stone block.stained-rocks-red.name = Stained Rocks Red block.stained-stone-red.name = Stained Stone Red block.stained-rocks-yellow.name = Stained Rocks Yellow diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 67415b39d3..5d2c7c093d 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 4776a7378b..fd8aebe2f1 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -48,308 +48,308 @@ overdrive-projector-top index: -1 shock-mine rotate: false - xy: 1654, 646 + xy: 1721, 973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 987, 897 + xy: 1021, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 979, 863 + xy: 975, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1021, 897 + xy: 1009, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1353, 863 + xy: 1247, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1395, 897 + xy: 1293, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1387, 863 + xy: 1247, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1429, 897 + xy: 1281, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1421, 863 + xy: 1327, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1463, 897 + xy: 1281, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1455, 863 + xy: 1315, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1497, 897 + xy: 1361, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1489, 863 + xy: 1315, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1531, 897 + xy: 1349, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1523, 863 + xy: 1349, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1565, 897 + xy: 1395, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1557, 863 + xy: 1383, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1599, 897 + xy: 1383, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1591, 863 + xy: 873, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1633, 897 + xy: 907, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1625, 863 + xy: 941, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1667, 884 + xy: 975, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1659, 850 + xy: 1009, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1701, 871 + xy: 1043, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1790, 623 + xy: 1705, 799 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1819, 895 + xy: 1739, 803 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1837, 861 + xy: 449, 530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1829, 827 + xy: 449, 496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1829, 793 + xy: 449, 462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1825, 759 + xy: 445, 428 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1825, 725 + xy: 445, 394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1825, 691 + xy: 445, 360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1824, 657 + xy: 445, 326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1824, 623 + xy: 445, 292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1817, 1063 + xy: 445, 258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1851, 1071 + xy: 445, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1885, 1071 + xy: 445, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1823, 963 + xy: 445, 156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1823, 929 + xy: 445, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1853, 895 + xy: 445, 88 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1871, 861 + xy: 1447, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1863, 827 + xy: 1447, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1863, 793 + xy: 1446, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1859, 759 + xy: 1446, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -363,7 +363,7 @@ distributor index: -1 junction rotate: false - xy: 1145, 795 + xy: 936, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -377,49 +377,49 @@ mass-driver-base index: -1 overflow-gate rotate: false - xy: 906, 693 + xy: 2003, 1151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1110, 693 + xy: 1412, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1144, 693 + xy: 1412, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1178, 693 + xy: 1785, 1126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1212, 693 + xy: 1819, 1126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1212, 659 + xy: 1653, 1037 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1761, 793 + xy: 1671, 935 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -580,35 +580,35 @@ water-extractor-top index: -1 block-border rotate: false - xy: 843, 863 + xy: 907, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 885, 897 + xy: 953, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 885, 897 + xy: 953, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 877, 863 + xy: 907, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1225, 897 + xy: 1145, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -678,49 +678,49 @@ rubble-4-1 index: -1 spawn rotate: false - xy: 1723, 759 + xy: 1671, 901 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 919, 897 + xy: 941, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 911, 863 + xy: 987, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 911, 863 + xy: 987, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 953, 897 + xy: 941, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 945, 863 + xy: 975, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1047, 863 + xy: 1043, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -734,119 +734,119 @@ conduit-bottom-0 index: -1 conduit-bottom-1 rotate: false - xy: 1081, 863 + xy: 1043, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1123, 897 + xy: 1077, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1115, 863 + xy: 1123, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1157, 897 + xy: 1077, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1149, 863 + xy: 1111, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1191, 897 + xy: 1157, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1217, 863 + xy: 1191, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1259, 897 + xy: 1145, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1251, 863 + xy: 1179, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1293, 897 + xy: 1225, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1285, 863 + xy: 1179, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1327, 897 + xy: 1213, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1319, 863 + xy: 1259, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 1247, 761 + xy: 1174, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1281, 761 + xy: 1242, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1315, 761 + xy: 1310, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1349, 795 + xy: 1344, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -874,84 +874,84 @@ liquid-tank-top index: -1 mechanical-pump rotate: false - xy: 1451, 761 + xy: 970, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 974, 693 + xy: 1417, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1008, 693 + xy: 1417, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1042, 693 + xy: 1413, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1076, 693 + xy: 1413, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1689, 769 + xy: 1989, 1117 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1655, 714 + xy: 1955, 1083 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1689, 735 + xy: 1989, 1083 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1689, 701 + xy: 1467, 913 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1654, 680 + xy: 1501, 955 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1688, 667 + xy: 1501, 921 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 838, 659 + xy: 1551, 1005 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1021,7 +1021,7 @@ trident-ship-pad index: -1 battery rotate: false - xy: 1763, 997 + xy: 851, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1035,14 +1035,14 @@ battery-large index: -1 combustion-generator rotate: false - xy: 1013, 863 + xy: 1055, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 1055, 897 + xy: 1009, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1119,7 +1119,7 @@ impact-reactor-top index: -1 power-node rotate: false - xy: 1450, 693 + xy: 1719, 1109 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1133,28 +1133,28 @@ power-node-large index: -1 power-source rotate: false - xy: 1518, 693 + xy: 1887, 1139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1552, 693 + xy: 1921, 1130 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 1586, 693 + xy: 1887, 1105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 powervoid rotate: false - xy: 1620, 693 + xy: 1921, 1096 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1168,14 +1168,14 @@ rtg-generator index: -1 rtg-generator-top rotate: false - xy: 1280, 659 + xy: 1721, 1041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1727, 827 + xy: 1535, 861 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1308,21 +1308,21 @@ graphite-press index: -1 incinerator rotate: false - xy: 1591, 829 + xy: 1345, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1009, 761 + xy: 1277, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1111, 795 + xy: 868, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1350,21 +1350,21 @@ silicon-smelter-top index: -1 lavasmelter rotate: false - xy: 1213, 761 + xy: 1106, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1383, 795 + xy: 800, 674 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1485, 761 + xy: 1038, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1413,14 +1413,14 @@ plastanium-compressor-top index: -1 pulverizer rotate: false - xy: 872, 659 + xy: 1617, 1063 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 940, 659 + xy: 1685, 1071 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1455,7 +1455,7 @@ silicon-smelter index: -1 smelter rotate: false - xy: 1769, 861 + xy: 1603, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1546,14 +1546,14 @@ launch-pad index: -1 sortedunloader rotate: false - xy: 1727, 793 + xy: 1637, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 1885, 1037 + xy: 479, 292 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1574,7 +1574,7 @@ arc-heat index: -1 block-1 rotate: false - xy: 851, 897 + xy: 873, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1791,7 +1791,7 @@ phantom-factory-top-open index: -1 repair-point-base rotate: false - xy: 1042, 659 + xy: 1535, 929 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1854,7 +1854,7 @@ wraith-factory-top-open index: -1 copper-wall rotate: false - xy: 1693, 837 + xy: 1077, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1868,7 +1868,7 @@ copper-wall-large index: -1 door rotate: false - xy: 1013, 829 + xy: 800, 708 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1889,14 +1889,14 @@ door-large-open index: -1 door-open rotate: false - xy: 1081, 829 + xy: 835, 733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1246, 693 + xy: 1467, 947 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1966,42 +1966,42 @@ scrap-wall-large4 index: -1 scrap-wall1 rotate: false - xy: 1348, 659 + xy: 1653, 1003 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1382, 659 + xy: 1687, 1003 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1416, 659 + xy: 1721, 1007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1450, 659 + xy: 1585, 979 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1450, 659 + xy: 1585, 979 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1722, 657 + xy: 1705, 901 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2015,7 +2015,7 @@ surge-wall-large index: -1 thorium-wall rotate: false - xy: 1791, 759 + xy: 1739, 905 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2036,7 +2036,7 @@ thruster index: -1 titanium-wall rotate: false - xy: 1859, 725 + xy: 1739, 769 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2078,7 +2078,7 @@ error index: -1 laser rotate: false - xy: 2035, 860 + xy: 2041, 1399 size: 4, 48 orig: 4, 48 offset: 0, 0 @@ -2092,7 +2092,7 @@ laser-end index: -1 minelaser rotate: false - xy: 2041, 1399 + xy: 535, 474 size: 4, 48 orig: 4, 48 offset: 0, 0 @@ -2106,14 +2106,14 @@ minelaser-end index: -1 missile rotate: false - xy: 1951, 1114 + xy: 1931, 1164 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1989, 1118 + xy: 835, 859 size: 36, 36 orig: 36, 36 offset: 0, 0 @@ -2127,70 +2127,70 @@ scale_marker index: -1 scorch1 rotate: false - xy: 445, 362 + xy: 1451, 803 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 445, 260 + xy: 1481, 785 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 445, 158 + xy: 453, 598 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1927, 691 + xy: 483, 598 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 453, 598 + xy: 513, 628 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 1717, 943 + xy: 1709, 1143 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 1713, 905 + xy: 1747, 1151 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1688, 633 + xy: 1603, 927 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 2035, 810 + xy: 2041, 1349 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1858, 657 + xy: 479, 394 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2239,7 +2239,7 @@ alpha-dart-mech-pad-icon-medium index: -1 alpha-dart-mech-pad-icon-small rotate: false - xy: 583, 1633 + xy: 2023, 1125 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2267,7 +2267,7 @@ arc-icon-large index: -1 arc-icon-small rotate: false - xy: 1956, 1819 + xy: 2023, 1099 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2281,7 +2281,7 @@ battery-icon-large index: -1 battery-icon-small rotate: false - xy: 295, 56 + xy: 2023, 1073 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2295,14 +2295,14 @@ battery-large-icon-large index: -1 battery-large-icon-medium rotate: false - xy: 1755, 963 + xy: 885, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-small rotate: false - xy: 891, 1363 + xy: 1861, 1163 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2323,14 +2323,14 @@ blast-drill-icon-large index: -1 blast-drill-icon-medium rotate: false - xy: 1755, 929 + xy: 873, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill-icon-small rotate: false - xy: 1926, 665 + xy: 583, 1633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2344,14 +2344,14 @@ blast-mixer-icon-large index: -1 blast-mixer-icon-medium rotate: false - xy: 1751, 895 + xy: 919, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-mixer-icon-small rotate: false - xy: 1919, 1039 + xy: 1956, 1819 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2365,7 +2365,7 @@ bridge-conduit-icon-large index: -1 bridge-conduit-icon-small rotate: false - xy: 453, 572 + xy: 295, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2379,7 +2379,7 @@ bridge-conveyor-icon-large index: -1 bridge-conveyor-icon-small rotate: false - xy: 1956, 1793 + xy: 891, 1363 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2393,7 +2393,7 @@ char-icon-large index: -1 char-icon-small rotate: false - xy: 1922, 1013 + xy: 453, 572 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2407,7 +2407,7 @@ cliffs-icon-large index: -1 cliffs-icon-small rotate: false - xy: 1886, 977 + xy: 513, 602 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2421,14 +2421,14 @@ combustion-generator-icon-large index: -1 combustion-generator-icon-small rotate: false - xy: 1886, 951 + xy: 572, 704 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 conduit-icon-full rotate: false - xy: 1183, 863 + xy: 1111, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2442,7 +2442,7 @@ conduit-icon-large index: -1 conduit-icon-small rotate: false - xy: 1950, 1088 + xy: 1956, 1793 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2456,14 +2456,14 @@ container-icon-large index: -1 container-icon-medium rotate: false - xy: 1361, 897 + xy: 1213, 829 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-small rotate: false - xy: 1949, 1062 + xy: 891, 1337 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2477,7 +2477,7 @@ conveyor-icon-large index: -1 conveyor-icon-small rotate: false - xy: 1976, 1088 + xy: 479, 572 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2491,7 +2491,7 @@ copper-wall-icon-large index: -1 copper-wall-icon-small rotate: false - xy: 1975, 1062 + xy: 572, 678 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2505,14 +2505,14 @@ copper-wall-large-icon-large index: -1 copper-wall-large-icon-medium rotate: false - xy: 1817, 1097 + xy: 1111, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-small rotate: false - xy: 2002, 1092 + xy: 572, 652 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2526,14 +2526,14 @@ core-foundation-icon-large index: -1 core-foundation-icon-medium rotate: false - xy: 1851, 1105 + xy: 1145, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-foundation-icon-small rotate: false - xy: 1805, 1034 + xy: 598, 674 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2547,14 +2547,14 @@ core-nucleus-icon-large index: -1 core-nucleus-icon-medium rotate: false - xy: 1885, 1105 + xy: 1179, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-nucleus-icon-small rotate: false - xy: 77, 8 + xy: 624, 674 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2568,14 +2568,14 @@ core-shard-icon-large index: -1 core-shard-icon-medium rotate: false - xy: 1797, 997 + xy: 1213, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 core-shard-icon-small rotate: false - xy: 103, 11 + xy: 572, 626 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2589,7 +2589,7 @@ craters-icon-large index: -1 craters-icon-small rotate: false - xy: 1922, 987 + xy: 598, 648 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2610,14 +2610,14 @@ crawler-factory-icon-large index: -1 crawler-factory-icon-medium rotate: false - xy: 1789, 963 + xy: 1247, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 crawler-factory-icon-small rotate: false - xy: 1912, 961 + xy: 624, 648 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2638,14 +2638,14 @@ cryofluidmixer-icon-large index: -1 cryofluidmixer-icon-medium rotate: false - xy: 1789, 929 + xy: 1281, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-small rotate: false - xy: 1938, 961 + xy: 650, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2666,14 +2666,14 @@ cultivator-icon-large index: -1 cultivator-icon-medium rotate: false - xy: 1785, 895 + xy: 1315, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cultivator-icon-small rotate: false - xy: 1912, 935 + xy: 676, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2701,14 +2701,14 @@ cyclone-icon-large index: -1 cyclone-icon-medium rotate: false - xy: 843, 829 + xy: 1349, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cyclone-icon-small rotate: false - xy: 1938, 935 + xy: 702, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2729,14 +2729,14 @@ dagger-factory-icon-large index: -1 dagger-factory-icon-medium rotate: false - xy: 877, 829 + xy: 1383, 795 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dagger-factory-icon-small rotate: false - xy: 1926, 639 + xy: 728, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2750,7 +2750,7 @@ deepwater-icon-large index: -1 deepwater-icon-small rotate: false - xy: 1922, 613 + xy: 754, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2764,14 +2764,14 @@ delta-mech-pad-icon-large index: -1 delta-mech-pad-icon-medium rotate: false - xy: 911, 829 + xy: 1429, 905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-small rotate: false - xy: 453, 546 + xy: 598, 622 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2785,14 +2785,14 @@ differential-generator-icon-large index: -1 differential-generator-icon-medium rotate: false - xy: 945, 829 + xy: 801, 776 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-small rotate: false - xy: 449, 520 + xy: 624, 622 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2806,14 +2806,14 @@ distributor-icon-large index: -1 distributor-icon-medium rotate: false - xy: 979, 829 + xy: 801, 742 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor-icon-small rotate: false - xy: 449, 494 + xy: 650, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2827,7 +2827,7 @@ door-icon-large index: -1 door-icon-small rotate: false - xy: 449, 468 + xy: 676, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2841,14 +2841,14 @@ door-large-icon-large index: -1 door-large-icon-medium rotate: false - xy: 1047, 829 + xy: 835, 767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-small rotate: false - xy: 1952, 665 + xy: 702, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2862,21 +2862,21 @@ dunerocks-icon-large index: -1 dunerocks-icon-small rotate: false - xy: 1952, 639 + xy: 728, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo rotate: false - xy: 1115, 829 + xy: 869, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-full rotate: false - xy: 1149, 829 + xy: 903, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2890,7 +2890,7 @@ duo-icon-large index: -1 duo-icon-small rotate: false - xy: 1948, 613 + xy: 754, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2904,14 +2904,14 @@ force-projector-icon-large index: -1 force-projector-icon-medium rotate: false - xy: 1217, 829 + xy: 971, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-small rotate: false - xy: 479, 572 + xy: 1481, 721 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2932,14 +2932,14 @@ fortress-factory-icon-large index: -1 fortress-factory-icon-medium rotate: false - xy: 1251, 829 + xy: 1005, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fortress-factory-icon-small rotate: false - xy: 479, 546 + xy: 1480, 695 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2967,14 +2967,14 @@ fuse-icon-large index: -1 fuse-icon-medium rotate: false - xy: 1285, 829 + xy: 1039, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse-icon-small rotate: false - xy: 475, 520 + xy: 1480, 669 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -2995,14 +2995,14 @@ ghoul-factory-icon-large index: -1 ghoul-factory-icon-medium rotate: false - xy: 1319, 829 + xy: 1073, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ghoul-factory-icon-small rotate: false - xy: 475, 494 + xy: 650, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3016,14 +3016,14 @@ glaive-ship-pad-icon-large index: -1 glaive-ship-pad-icon-medium rotate: false - xy: 1353, 829 + xy: 1107, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 glaive-ship-pad-icon-small rotate: false - xy: 475, 468 + xy: 676, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3037,14 +3037,14 @@ graphite-press-icon-large index: -1 graphite-press-icon-medium rotate: false - xy: 1387, 829 + xy: 1141, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 graphite-press-icon-small rotate: false - xy: 475, 442 + xy: 702, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3058,21 +3058,21 @@ grass-icon-large index: -1 grass-icon-small rotate: false - xy: 475, 416 + xy: 728, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail rotate: false - xy: 1421, 829 + xy: 1175, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail-icon-full rotate: false - xy: 1455, 829 + xy: 1209, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3086,7 +3086,7 @@ hail-icon-large index: -1 hail-icon-small rotate: false - xy: 475, 390 + xy: 754, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3100,7 +3100,7 @@ holostone-icon-large index: -1 holostone-icon-small rotate: false - xy: 475, 364 + xy: 1784, 1100 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3114,7 +3114,7 @@ hotrock-icon-large index: -1 hotrock-icon-small rotate: false - xy: 475, 338 + xy: 1810, 1100 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3128,7 +3128,7 @@ ice-icon-large index: -1 ice-icon-small rotate: false - xy: 475, 312 + xy: 1836, 1100 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3142,7 +3142,7 @@ ice-snow-icon-large index: -1 ice-snow-icon-small rotate: false - xy: 475, 286 + xy: 483, 546 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3156,7 +3156,7 @@ icerocks-icon-large index: -1 icerocks-icon-small rotate: false - xy: 475, 260 + xy: 483, 520 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3170,7 +3170,7 @@ ignarock-icon-large index: -1 ignarock-icon-small rotate: false - xy: 475, 156 + xy: 509, 546 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3191,14 +3191,14 @@ impact-reactor-icon-large index: -1 impact-reactor-icon-medium rotate: false - xy: 1557, 829 + xy: 1311, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-small rotate: false - xy: 474, 130 + xy: 509, 520 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3212,21 +3212,21 @@ incinerator-icon-large index: -1 incinerator-icon-small rotate: false - xy: 474, 104 + xy: 509, 494 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 501, 478 + xy: 509, 468 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1585, 641 + xy: 1821, 1010 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -3240,14 +3240,14 @@ item-blast-compound-xlarge index: -1 item-coal-medium rotate: false - xy: 501, 452 + xy: 806, 648 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1603, 641 + xy: 1807, 992 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -3261,14 +3261,14 @@ item-coal-xlarge index: -1 item-copper-medium rotate: false - xy: 501, 426 + xy: 780, 606 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 1621, 641 + xy: 1839, 1064 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -3282,14 +3282,14 @@ item-copper-xlarge index: -1 item-graphite-medium rotate: false - xy: 501, 400 + xy: 806, 622 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 427, 755 + xy: 1839, 1046 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -3303,168 +3303,168 @@ item-graphite-xlarge index: -1 item-lead-medium rotate: false - xy: 501, 374 + xy: 832, 639 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 1886, 933 + xy: 1839, 1028 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1675, 989 + xy: 1425, 939 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 501, 348 + xy: 832, 613 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 1887, 915 + xy: 1839, 1010 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1725, 1039 + xy: 1475, 989 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 501, 322 + xy: 806, 596 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1887, 897 + xy: 1825, 992 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 1775, 1089 + xy: 1525, 1039 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 501, 296 + xy: 832, 587 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 1831, 1045 + xy: 1843, 992 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 1825, 1139 + xy: 1575, 1089 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 501, 270 + xy: 513, 442 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 2030, 1903 + xy: 129, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 767, 897 + xy: 1625, 1139 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 501, 244 + xy: 513, 416 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 2030, 1885 + xy: 147, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 1675, 947 + xy: 1725, 1189 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 501, 218 + xy: 513, 390 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 2030, 1867 + xy: 165, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 1867, 1139 + xy: 767, 897 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 501, 192 + xy: 513, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 2030, 1849 + xy: 183, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 809, 897 + xy: 1667, 1139 size: 40, 40 orig: 40, 40 offset: 0, 0 @@ -3478,91 +3478,91 @@ item-source-icon-large index: -1 item-source-icon-small rotate: false - xy: 501, 166 + xy: 513, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 474, 78 + xy: 513, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 2027, 1167 + xy: 201, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 1909, 1139 + xy: 1767, 1189 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 501, 140 + xy: 513, 286 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 2027, 1149 + xy: 1529, 843 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 759, 855 + xy: 809, 897 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 500, 114 + xy: 513, 260 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 2027, 1131 + xy: 1529, 825 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 801, 855 + xy: 1809, 1189 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 500, 88 + xy: 513, 234 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 129, 7 + xy: 1529, 807 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 759, 813 + xy: 1851, 1189 size: 40, 40 orig: 40, 40 offset: 0, 0 @@ -3576,7 +3576,7 @@ item-void-icon-large index: -1 item-void-icon-small rotate: false - xy: 500, 62 + xy: 513, 208 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3590,14 +3590,14 @@ javelin-ship-pad-icon-large index: -1 javelin-ship-pad-icon-medium rotate: false - xy: 1111, 761 + xy: 902, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-small rotate: false - xy: 479, 36 + xy: 513, 182 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3611,7 +3611,7 @@ junction-icon-large index: -1 junction-icon-small rotate: false - xy: 479, 10 + xy: 513, 156 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3625,14 +3625,14 @@ kiln-icon-large index: -1 kiln-icon-medium rotate: false - xy: 1145, 761 + xy: 970, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-small rotate: false - xy: 505, 36 + xy: 513, 130 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3660,14 +3660,14 @@ lancer-icon-large index: -1 lancer-icon-medium rotate: false - xy: 1179, 795 + xy: 1004, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lancer-icon-small rotate: false - xy: 505, 10 + xy: 513, 104 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3688,14 +3688,14 @@ laser-drill-icon-large index: -1 laser-drill-icon-medium rotate: false - xy: 1179, 761 + xy: 1038, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 laser-drill-icon-small rotate: false - xy: 2002, 1066 + xy: 858, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3709,14 +3709,14 @@ launch-pad-icon-large index: -1 launch-pad-icon-medium rotate: false - xy: 1213, 795 + xy: 1072, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 launch-pad-icon-small rotate: false - xy: 1974, 613 + xy: 858, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3730,14 +3730,14 @@ liquid-junction-icon-large index: -1 liquid-junction-icon-small rotate: false - xy: 427, 720 + xy: 884, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-router-icon-full rotate: false - xy: 1315, 795 + xy: 1276, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3751,7 +3751,7 @@ liquid-router-icon-large index: -1 liquid-router-icon-small rotate: false - xy: 453, 720 + xy: 884, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3765,7 +3765,7 @@ liquid-source-icon-large index: -1 liquid-source-icon-small rotate: false - xy: 2001, 1040 + xy: 910, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3786,14 +3786,14 @@ liquid-tank-icon-large index: -1 liquid-tank-icon-medium rotate: false - xy: 1383, 761 + xy: 834, 665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-small rotate: false - xy: 1948, 1036 + xy: 910, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3807,7 +3807,7 @@ magmarock-icon-large index: -1 magmarock-icon-small rotate: false - xy: 1948, 1010 + xy: 936, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3835,14 +3835,14 @@ mass-driver-icon-large index: -1 mass-driver-icon-medium rotate: false - xy: 1417, 761 + xy: 902, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-icon-small rotate: false - xy: 1974, 1036 + xy: 936, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3919,14 +3919,14 @@ mechanical-drill-icon-large index: -1 mechanical-drill-icon-medium rotate: false - xy: 1451, 795 + xy: 936, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-drill-icon-small rotate: false - xy: 1974, 1010 + xy: 962, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3940,7 +3940,7 @@ mechanical-pump-icon-large index: -1 mechanical-pump-icon-small rotate: false - xy: 2000, 1014 + xy: 962, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3968,14 +3968,14 @@ meltdown-icon-large index: -1 meltdown-icon-medium rotate: false - xy: 1485, 795 + xy: 1004, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-small rotate: false - xy: 2000, 988 + xy: 988, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -3989,7 +3989,7 @@ melter-icon-large index: -1 melter-icon-small rotate: false - xy: 1964, 984 + xy: 988, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4003,14 +4003,14 @@ mend-projector-icon-large index: -1 mend-projector-icon-medium rotate: false - xy: 1519, 795 + xy: 1072, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-small rotate: false - xy: 1964, 958 + xy: 1014, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4024,7 +4024,7 @@ metal-floor-2-icon-large index: -1 metal-floor-2-icon-small rotate: false - xy: 1964, 932 + xy: 1014, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4038,7 +4038,7 @@ metal-floor-3-icon-large index: -1 metal-floor-3-icon-small rotate: false - xy: 1990, 962 + xy: 1040, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4052,7 +4052,7 @@ metal-floor-5-icon-large index: -1 metal-floor-5-icon-small rotate: false - xy: 1990, 936 + xy: 1040, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4066,7 +4066,7 @@ metal-floor-damaged-icon-large index: -1 metal-floor-damaged-icon-small rotate: false - xy: 2016, 962 + xy: 1066, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4080,28 +4080,56 @@ metal-floor-icon-large index: -1 metal-floor-icon-small rotate: false - xy: 2016, 936 + xy: 1066, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -multi-press-icon-large +moss-icon-large rotate: false xy: 775, 1189 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +stained-stone-yellow-icon-large + rotate: false + xy: 775, 1189 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +moss-icon-small + rotate: false + xy: 1092, 633 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +stained-stone-yellow-icon-small + rotate: false + xy: 1092, 633 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +multi-press-icon-large + rotate: false + xy: 725, 1089 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 multi-press-icon-medium rotate: false - xy: 1519, 761 + xy: 1106, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-small rotate: false - xy: 1990, 910 + xy: 1092, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4115,945 +4143,245 @@ oil-extractor-icon-full index: -1 oil-extractor-icon-large rotate: false - xy: 725, 1089 + xy: 825, 1189 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 oil-extractor-icon-medium rotate: false - xy: 1553, 795 + xy: 1140, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 oil-extractor-icon-small rotate: false - xy: 2016, 910 + xy: 1118, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad-icon-large rotate: false - xy: 825, 1189 + xy: 775, 1139 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech-pad-icon-medium rotate: false - xy: 1553, 761 + xy: 1174, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 omega-mech-pad-icon-small rotate: false - xy: 526, 114 + xy: 1118, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-coal-holostone-icon-full +ore-coal-icon-full rotate: false - xy: 1587, 795 + xy: 1208, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-holostone-icon-medium +ore-coal-icon-medium rotate: false - xy: 1587, 795 + xy: 1208, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-holostone-icon-large - rotate: false - xy: 775, 1139 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-coal-holostone-icon-small - rotate: false - xy: 526, 88 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-coal-sand-icon-full - rotate: false - xy: 1587, 761 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-sand-icon-medium - rotate: false - xy: 1587, 761 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-sand-icon-large +ore-coal-icon-large rotate: false xy: 725, 1039 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-coal-sand-icon-small +ore-coal-icon-small rotate: false - xy: 526, 62 + xy: 1144, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-coal-stained-stone-icon-full +ore-copper-icon-full rotate: false - xy: 1621, 795 + xy: 1242, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stained-stone-icon-medium +ore-copper-icon-medium rotate: false - xy: 1621, 795 + xy: 1242, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stained-stone-icon-large +ore-copper-icon-large rotate: false xy: 775, 1089 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-coal-stained-stone-icon-small +ore-copper-icon-small rotate: false - xy: 531, 36 + xy: 1144, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-coal-stained-stone-red-icon-full +ore-lead-icon-full rotate: false - xy: 1621, 761 + xy: 1276, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stained-stone-red-icon-medium +ore-lead-icon-medium rotate: false - xy: 1621, 761 + xy: 1276, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stained-stone-red-icon-large +ore-lead-icon-large rotate: false xy: 825, 1139 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-coal-stained-stone-red-icon-small +ore-lead-icon-small rotate: false - xy: 531, 10 + xy: 1170, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-coal-stone-icon-full +ore-scrap-icon-full rotate: false - xy: 1655, 782 + xy: 1310, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stone-icon-medium +ore-scrap-icon-medium rotate: false - xy: 1655, 782 + xy: 1310, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal-stone-icon-large +ore-scrap-icon-large rotate: false xy: 725, 989 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-coal-stone-icon-small +ore-scrap-icon-small rotate: false - xy: 483, 674 + xy: 1170, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-copper-holostone-icon-full +ore-thorium-icon-full rotate: false - xy: 839, 727 + xy: 1344, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper-holostone-icon-medium +ore-thorium-icon-medium rotate: false - xy: 839, 727 + xy: 1344, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper-holostone-icon-large +ore-thorium-icon-large rotate: false xy: 775, 1039 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-copper-holostone-icon-small +ore-thorium-icon-small rotate: false - xy: 483, 648 + xy: 1196, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-copper-sand-icon-full +ore-titanium-icon-full rotate: false - xy: 873, 727 + xy: 1378, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper-sand-icon-medium +ore-titanium-icon-medium rotate: false - xy: 873, 727 + xy: 1378, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper-sand-icon-large +ore-titanium-icon-large rotate: false xy: 825, 1089 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-copper-sand-icon-small +ore-titanium-icon-small rotate: false - xy: 483, 622 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-icon-full - rotate: false - xy: 907, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-icon-medium - rotate: false - xy: 907, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-icon-large - rotate: false - xy: 725, 939 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-icon-small - rotate: false - xy: 1931, 909 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red-icon-full - rotate: false - xy: 941, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red-icon-medium - rotate: false - xy: 941, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red-icon-large - rotate: false - xy: 775, 989 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red-icon-small - rotate: false - xy: 1905, 909 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-copper-stone-icon-full - rotate: false - xy: 975, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stone-icon-medium - rotate: false - xy: 975, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stone-icon-large - rotate: false - xy: 825, 1039 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-copper-stone-icon-small - rotate: false - xy: 1957, 906 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-lead-holostone-icon-full - rotate: false - xy: 1009, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-holostone-icon-medium - rotate: false - xy: 1009, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-holostone-icon-large - rotate: false - xy: 775, 939 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-lead-holostone-icon-small - rotate: false - xy: 1905, 883 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-lead-sand-icon-full - rotate: false - xy: 1043, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-sand-icon-medium - rotate: false - xy: 1043, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-sand-icon-large - rotate: false - xy: 825, 989 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-lead-sand-icon-small - rotate: false - xy: 1931, 883 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-icon-full - rotate: false - xy: 1077, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-icon-medium - rotate: false - xy: 1077, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-icon-large - rotate: false - xy: 825, 939 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-icon-small - rotate: false - xy: 1957, 880 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red-icon-full - rotate: false - xy: 1111, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red-icon-medium - rotate: false - xy: 1111, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red-icon-large - rotate: false - xy: 875, 1181 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red-icon-small - rotate: false - xy: 1983, 884 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-lead-stone-icon-full - rotate: false - xy: 1145, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stone-icon-medium - rotate: false - xy: 1145, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stone-icon-large - rotate: false - xy: 925, 1181 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-lead-stone-icon-small - rotate: false - xy: 2009, 884 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-holostone-icon-full - rotate: false - xy: 1179, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-holostone-icon-medium - rotate: false - xy: 1179, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-holostone-icon-large - rotate: false - xy: 875, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-holostone-icon-small - rotate: false - xy: 1931, 857 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-sand-icon-full - rotate: false - xy: 1213, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-sand-icon-medium - rotate: false - xy: 1213, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-sand-icon-large - rotate: false - xy: 975, 1181 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-sand-icon-small - rotate: false - xy: 1931, 831 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-snow-icon-full - rotate: false - xy: 1247, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-snow-icon-medium - rotate: false - xy: 1247, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-snow-icon-large - rotate: false - xy: 875, 1081 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-snow-icon-small - rotate: false - xy: 1957, 854 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-icon-full - rotate: false - xy: 1281, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-icon-medium - rotate: false - xy: 1281, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-icon-large - rotate: false - xy: 925, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-icon-small - rotate: false - xy: 1983, 858 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red-icon-full - rotate: false - xy: 1315, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red-icon-medium - rotate: false - xy: 1315, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red-icon-large - rotate: false - xy: 1025, 1181 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red-icon-small - rotate: false - xy: 1931, 805 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-stone-icon-full - rotate: false - xy: 1349, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stone-icon-medium - rotate: false - xy: 1349, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stone-icon-large - rotate: false - xy: 875, 1031 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-stone-icon-small - rotate: false - xy: 1957, 828 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-holostone-icon-full - rotate: false - xy: 1383, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-holostone-icon-medium - rotate: false - xy: 1383, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-holostone-icon-large - rotate: false - xy: 925, 1081 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-holostone-icon-small - rotate: false - xy: 2009, 858 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-sand-icon-full - rotate: false - xy: 1417, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-sand-icon-medium - rotate: false - xy: 1417, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-sand-icon-large - rotate: false - xy: 975, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-sand-icon-small - rotate: false - xy: 1983, 832 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-icon-full - rotate: false - xy: 1451, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-icon-medium - rotate: false - xy: 1451, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-icon-large - rotate: false - xy: 875, 981 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-icon-small - rotate: false - xy: 2009, 832 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red-icon-full - rotate: false - xy: 1485, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red-icon-medium - rotate: false - xy: 1485, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red-icon-large - rotate: false - xy: 925, 1031 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red-icon-small - rotate: false - xy: 1957, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-stone-icon-full - rotate: false - xy: 1519, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stone-icon-medium - rotate: false - xy: 1519, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stone-icon-large - rotate: false - xy: 975, 1081 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-stone-icon-small - rotate: false - xy: 1983, 806 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-holostone-icon-full - rotate: false - xy: 1553, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-holostone-icon-medium - rotate: false - xy: 1553, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-holostone-icon-large - rotate: false - xy: 1025, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-holostone-icon-small - rotate: false - xy: 2009, 806 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-sand-icon-full - rotate: false - xy: 1587, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-sand-icon-medium - rotate: false - xy: 1587, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-sand-icon-large - rotate: false - xy: 925, 981 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-sand-icon-small - rotate: false - xy: 1957, 776 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-icon-full - rotate: false - xy: 1621, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-icon-medium - rotate: false - xy: 1621, 727 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-icon-large - rotate: false - xy: 975, 1031 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-icon-small - rotate: false - xy: 1983, 780 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-red-icon-full - rotate: false - xy: 1655, 748 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-red-icon-medium - rotate: false - xy: 1655, 748 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-red-icon-large - rotate: false - xy: 1025, 1081 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-stained-stone-red-icon-small - rotate: false - xy: 1957, 750 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-stone-icon-full - rotate: false - xy: 838, 693 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stone-icon-medium - rotate: false - xy: 838, 693 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-stone-icon-large - rotate: false - xy: 975, 981 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-stone-icon-small - rotate: false - xy: 2009, 780 + xy: 1196, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 overdrive-projector-icon-large rotate: false - xy: 1025, 1031 + xy: 725, 939 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overdrive-projector-icon-medium rotate: false - xy: 872, 693 + xy: 1969, 1151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-icon-small rotate: false - xy: 1983, 754 + xy: 1222, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 overflow-gate-icon-large rotate: false - xy: 1025, 981 + xy: 775, 989 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overflow-gate-icon-small rotate: false - xy: 1957, 724 + xy: 1222, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5067,84 +4395,84 @@ phantom-factory-icon-full index: -1 phantom-factory-icon-large rotate: false - xy: 875, 931 + xy: 825, 1039 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phantom-factory-icon-medium rotate: false - xy: 940, 693 + xy: 1417, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-small rotate: false - xy: 2009, 754 + xy: 1248, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-icon-large rotate: false - xy: 925, 931 + xy: 775, 939 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conduit-icon-small rotate: false - xy: 1983, 728 + xy: 1248, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-icon-large rotate: false - xy: 975, 931 + xy: 825, 989 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conveyor-icon-small rotate: false - xy: 1957, 698 + xy: 1274, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-icon-large rotate: false - xy: 1025, 931 + xy: 825, 939 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-icon-small rotate: false - xy: 2009, 728 + xy: 1274, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-large-icon-large rotate: false - xy: 1075, 1181 + xy: 875, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-large-icon-medium rotate: false - xy: 1280, 693 + xy: 1517, 997 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-small rotate: false - xy: 1983, 702 + xy: 1300, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5158,56 +4486,56 @@ phase-weaver-icon-full index: -1 phase-weaver-icon-large rotate: false - xy: 1125, 1181 + xy: 925, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-weaver-icon-medium rotate: false - xy: 1314, 693 + xy: 1567, 1047 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-weaver-icon-small rotate: false - xy: 2009, 702 + xy: 1300, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pine-icon-medium rotate: false - xy: 1348, 693 + xy: 1617, 1097 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine-icon-small rotate: false - xy: 1983, 676 + xy: 1326, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plastanium-compressor-icon-large rotate: false - xy: 1075, 1131 + xy: 875, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-medium rotate: false - xy: 1382, 693 + xy: 1651, 1105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-compressor-icon-small rotate: false - xy: 2009, 676 + xy: 1326, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5221,175 +4549,175 @@ pneumatic-drill-icon-full index: -1 pneumatic-drill-icon-large rotate: false - xy: 1175, 1181 + xy: 975, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pneumatic-drill-icon-medium rotate: false - xy: 1416, 693 + xy: 1685, 1105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-small rotate: false - xy: 1978, 650 + xy: 1352, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-icon-large rotate: false - xy: 1075, 1081 + xy: 875, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-icon-small rotate: false - xy: 2004, 650 + xy: 1352, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-large-icon-large rotate: false - xy: 1125, 1131 + xy: 925, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-large-icon-medium rotate: false - xy: 1484, 693 + xy: 1853, 1126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-small rotate: false - xy: 2000, 624 + xy: 1378, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-source-icon-large rotate: false - xy: 1225, 1181 + xy: 1025, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-source-icon-small rotate: false - xy: 2000, 598 + xy: 1378, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-void-icon-large rotate: false - xy: 1075, 1031 + xy: 875, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-void-icon-small rotate: false - xy: 527, 704 + xy: 1404, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulse-conduit-icon-full rotate: false - xy: 1693, 803 + xy: 1955, 1117 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-large rotate: false - xy: 1125, 1081 + xy: 925, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulse-conduit-icon-small rotate: false - xy: 553, 704 + xy: 1404, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulverizer-icon-full rotate: false - xy: 906, 659 + xy: 1651, 1071 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-large rotate: false - xy: 1175, 1131 + xy: 975, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulverizer-icon-small rotate: false - xy: 509, 678 + xy: 1430, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pyratite-mixer-icon-large rotate: false - xy: 1275, 1181 + xy: 875, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pyratite-mixer-icon-medium rotate: false - xy: 974, 659 + xy: 1719, 1075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-small rotate: false - xy: 509, 652 + xy: 1430, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 repair-point rotate: false - xy: 1008, 659 + xy: 1535, 963 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 repair-point-icon-full rotate: false - xy: 1076, 659 + xy: 1501, 887 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 repair-point-icon-large rotate: false - xy: 1125, 1031 + xy: 975, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 repair-point-icon-small rotate: false - xy: 535, 678 + xy: 1456, 633 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5403,21 +4731,21 @@ revenant-factory-icon-full index: -1 revenant-factory-icon-large rotate: false - xy: 1175, 1081 + xy: 1025, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-factory-icon-medium rotate: false - xy: 1110, 659 + xy: 1535, 895 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-small rotate: false - xy: 509, 626 + xy: 1456, 607 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5438,105 +4766,105 @@ ripple-icon-full index: -1 ripple-icon-large rotate: false - xy: 1325, 1181 + xy: 975, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ripple-icon-medium rotate: false - xy: 1144, 659 + xy: 1585, 1013 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple-icon-small rotate: false - xy: 535, 652 + xy: 858, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rocks-icon-large rotate: false - xy: 1075, 931 + xy: 1025, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-small rotate: false - xy: 535, 626 + xy: 884, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rotary-pump-icon-large rotate: false - xy: 1125, 981 + xy: 975, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rotary-pump-icon-medium rotate: false - xy: 1178, 659 + xy: 1619, 1029 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-small rotate: false - xy: 561, 678 + xy: 910, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 router-icon-large rotate: false - xy: 1175, 1031 + xy: 1025, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 router-icon-small rotate: false - xy: 561, 652 + xy: 936, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rtg-generator-icon-large rotate: false - xy: 1225, 1081 + xy: 1025, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rtg-generator-icon-medium rotate: false - xy: 1246, 659 + xy: 1687, 1037 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-small rotate: false - xy: 561, 626 + xy: 962, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salt-icon-large rotate: false - xy: 1275, 1131 + xy: 875, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salt-icon-small rotate: false - xy: 587, 674 + xy: 988, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5557,287 +4885,287 @@ salvo-icon-full index: -1 salvo-icon-large rotate: false - xy: 1375, 1181 + xy: 925, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salvo-icon-medium rotate: false - xy: 1314, 659 + xy: 1619, 995 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-small rotate: false - xy: 613, 674 + xy: 1014, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sand-icon-large rotate: false - xy: 1125, 931 + xy: 975, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-icon-small rotate: false - xy: 587, 648 + xy: 1040, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sand-water-icon-large rotate: false - xy: 1175, 981 + xy: 1025, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-water-icon-small rotate: false - xy: 613, 648 + xy: 1066, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sandrocks-icon-large rotate: false - xy: 1225, 1031 + xy: 1075, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sandrocks-icon-small rotate: false - xy: 587, 622 + xy: 1092, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-large rotate: false - xy: 1275, 1081 + xy: 1125, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-medium rotate: false - xy: 1484, 659 + xy: 1569, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-small rotate: false - xy: 613, 622 + xy: 1118, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-huge-icon-large rotate: false - xy: 1325, 1131 + xy: 1075, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-huge-icon-medium rotate: false - xy: 1518, 659 + xy: 1569, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-huge-icon-small rotate: false - xy: 639, 666 + xy: 1144, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-icon-large rotate: false - xy: 1425, 1181 + xy: 1175, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-icon-small rotate: false - xy: 665, 666 + xy: 1170, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-large-icon-large rotate: false - xy: 1175, 931 + xy: 1075, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-large-icon-medium rotate: false - xy: 1552, 659 + xy: 1619, 961 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-small rotate: false - xy: 639, 640 + xy: 1196, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 separator-icon-large rotate: false - xy: 1225, 981 + xy: 1125, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 separator-icon-medium rotate: false - xy: 1620, 659 + xy: 1687, 969 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-icon-small rotate: false - xy: 639, 614 + xy: 1248, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shock-mine-icon-large rotate: false - xy: 1275, 1031 + xy: 1225, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shock-mine-icon-small rotate: false - xy: 717, 666 + xy: 1274, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 silicon-smelter-icon-large rotate: false - xy: 1375, 1131 + xy: 1125, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 silicon-smelter-icon-medium rotate: false - xy: 1735, 861 + xy: 1569, 877 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-small rotate: false - xy: 743, 666 + xy: 1300, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snow-icon-large rotate: false - xy: 1475, 1181 + xy: 1175, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-icon-small rotate: false - xy: 769, 666 + xy: 1326, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snowrocks-icon-large rotate: false - xy: 1225, 931 + xy: 1275, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-small rotate: false - xy: 691, 624 + xy: 1352, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-icon-large rotate: false - xy: 1275, 981 + xy: 1075, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-icon-small rotate: false - xy: 717, 640 + xy: 1378, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large-icon-large rotate: false - xy: 1325, 1031 + xy: 1125, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-large-icon-medium rotate: false - xy: 1761, 827 + xy: 1637, 927 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-small rotate: false - xy: 743, 640 + xy: 1404, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sorter-icon-large rotate: false - xy: 1375, 1081 + xy: 1175, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sorter-icon-small rotate: false - xy: 769, 640 + xy: 1430, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spawn-icon-large rotate: false - xy: 1425, 1131 + xy: 1225, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spawn-icon-small rotate: false - xy: 795, 655 + xy: 1456, 581 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5858,21 +5186,21 @@ spectre-icon-full index: -1 spectre-icon-large rotate: false - xy: 1525, 1181 + xy: 1325, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spectre-icon-medium rotate: false - xy: 1723, 725 + xy: 1603, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-small rotate: false - xy: 665, 603 + xy: 1482, 601 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5886,42 +5214,42 @@ spirit-factory-icon-full index: -1 spirit-factory-icon-large rotate: false - xy: 1325, 981 + xy: 1125, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spirit-factory-icon-medium rotate: false - xy: 1757, 759 + xy: 1637, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-icon-small rotate: false - xy: 691, 598 + xy: 1482, 575 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-cluster-icon-large rotate: false - xy: 1375, 1031 + xy: 1175, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster-icon-medium rotate: false - xy: 1757, 725 + xy: 1671, 867 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-cluster-icon-small rotate: false - xy: 717, 614 + xy: 513, 78 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -5935,189 +5263,161 @@ spore-press-icon-full index: -1 spore-press-icon-large rotate: false - xy: 1425, 1081 + xy: 1225, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-medium rotate: false - xy: 1723, 691 + xy: 1569, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-press-icon-small rotate: false - xy: 743, 614 + xy: 510, 52 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-boulder-icon-large rotate: false - xy: 1475, 1131 + xy: 1275, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-boulder-icon-small rotate: false - xy: 769, 614 + xy: 1248, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-icon-large rotate: false - xy: 1575, 1181 + xy: 1375, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-icon-small rotate: false - xy: 795, 629 + xy: 1274, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-red-icon-large rotate: false - xy: 1325, 931 + xy: 1125, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-red-icon-small rotate: false - xy: 717, 588 + xy: 1300, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-rocks-yellow-icon-large rotate: false - xy: 1375, 981 + xy: 1175, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-rocks-yellow-icon-small rotate: false - xy: 743, 588 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -stained-stone-icon-large - rotate: false - xy: 1425, 1031 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -stained-stone-icon-small - rotate: false - xy: 769, 588 + xy: 1326, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stained-stone-red-icon-large rotate: false - xy: 1475, 1081 + xy: 1225, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stained-stone-red-icon-small rotate: false - xy: 795, 603 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -stained-stone-yellow-icon-large - rotate: false - xy: 1525, 1131 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -stained-stone-yellow-icon-small - rotate: false - xy: 795, 577 + xy: 1352, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stone-icon-large rotate: false - xy: 1625, 1181 + xy: 1275, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stone-icon-small rotate: false - xy: 821, 633 + xy: 1378, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-tower-icon-large rotate: false - xy: 1375, 931 + xy: 1325, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-tower-icon-medium rotate: false - xy: 1757, 691 + xy: 1705, 935 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-small rotate: false - xy: 821, 607 + xy: 1404, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-icon-large rotate: false - xy: 1425, 981 + xy: 1425, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-icon-small rotate: false - xy: 847, 633 + xy: 1430, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-large-icon-large rotate: false - xy: 1475, 1031 + xy: 1175, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-large-icon-medium rotate: false - xy: 1756, 657 + xy: 1705, 867 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-small rotate: false - xy: 847, 607 + xy: 1456, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6138,175 +5438,175 @@ swarmer-icon-full index: -1 swarmer-icon-large rotate: false - xy: 1575, 1131 + xy: 1275, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-icon-medium rotate: false - xy: 1722, 623 + xy: 1603, 825 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer-icon-small rotate: false - xy: 821, 581 + xy: 1482, 549 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tar-icon-large rotate: false - xy: 1675, 1181 + xy: 1325, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tar-icon-small rotate: false - xy: 873, 633 + xy: 77, 8 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tau-mech-pad-icon-large rotate: false - xy: 1525, 1031 + xy: 1225, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-pad-icon-medium rotate: false - xy: 1756, 623 + xy: 1637, 825 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tau-mech-pad-icon-small rotate: false - xy: 873, 607 + xy: 103, 11 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-generator-icon-large rotate: false - xy: 1575, 1081 + xy: 1275, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-generator-icon-medium rotate: false - xy: 1803, 861 + xy: 1671, 833 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-generator-icon-small rotate: false - xy: 847, 581 + xy: 1781, 983 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-pump-icon-large rotate: false - xy: 1625, 1131 + xy: 1325, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-pump-icon-medium rotate: false - xy: 1795, 827 + xy: 1705, 833 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-icon-small rotate: false - xy: 899, 633 + xy: 1773, 957 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-icon-large rotate: false - xy: 1725, 1181 + xy: 1375, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-reactor-icon-medium rotate: false - xy: 1795, 793 + xy: 1739, 939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-reactor-icon-small rotate: false - xy: 899, 607 + xy: 1773, 931 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-icon-large rotate: false - xy: 1475, 931 + xy: 1425, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-icon-small rotate: false - xy: 873, 581 + xy: 1773, 905 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-large-icon-large rotate: false - xy: 1525, 981 + xy: 1525, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-large-icon-medium rotate: false - xy: 1791, 725 + xy: 1739, 871 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-small rotate: false - xy: 925, 633 + xy: 1773, 879 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thruster-icon-large rotate: false - xy: 1575, 1031 + xy: 1275, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thruster-icon-medium rotate: false - xy: 1791, 691 + xy: 1739, 837 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thruster-icon-small rotate: false - xy: 925, 607 + xy: 1773, 853 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6320,112 +5620,112 @@ titan-factory-icon-full index: -1 titan-factory-icon-large rotate: false - xy: 1625, 1081 + xy: 1325, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan-factory-icon-medium rotate: false - xy: 1790, 657 + xy: 1671, 799 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titan-factory-icon-small rotate: false - xy: 899, 581 + xy: 1773, 827 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-conveyor-icon-large rotate: false - xy: 1675, 1131 + xy: 1375, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-conveyor-icon-small rotate: false - xy: 951, 633 + xy: 1773, 801 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-icon-large rotate: false - xy: 1775, 1181 + xy: 1425, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-icon-small rotate: false - xy: 951, 607 + xy: 1773, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-large-icon-large rotate: false - xy: 1525, 931 + xy: 1475, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-large-icon-medium rotate: false - xy: 1859, 691 + xy: 479, 428 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-small rotate: false - xy: 925, 581 + xy: 1799, 957 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 trident-ship-pad-icon-large rotate: false - xy: 1575, 981 + xy: 1575, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship-pad-icon-medium rotate: false - xy: 1858, 623 + xy: 479, 360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 trident-ship-pad-icon-small rotate: false - xy: 977, 633 + xy: 1799, 931 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-icon-large rotate: false - xy: 1625, 1031 + xy: 1325, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 turbine-generator-icon-medium rotate: false - xy: 1851, 1037 + xy: 479, 326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 turbine-generator-icon-small rotate: false - xy: 977, 607 + xy: 1799, 905 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6439,14 +5739,14 @@ unit-icon-chaos-array index: -1 unit-icon-crawler rotate: false - xy: 1675, 1081 + xy: 1375, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 1725, 1131 + xy: 1425, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -6481,35 +5781,35 @@ unit-icon-titan index: -1 unloader-icon-large rotate: false - xy: 1825, 1181 + xy: 1475, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unloader-icon-small rotate: false - xy: 951, 581 + xy: 1799, 879 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault-icon-large rotate: false - xy: 1575, 931 + xy: 1525, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vault-icon-medium rotate: false - xy: 1897, 827 + xy: 479, 258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-small rotate: false - xy: 1003, 633 + xy: 1799, 853 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6523,35 +5823,35 @@ water-extractor-icon-full index: -1 water-extractor-icon-large rotate: false - xy: 1625, 981 + xy: 1625, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-extractor-icon-medium rotate: false - xy: 1897, 793 + xy: 479, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-extractor-icon-small rotate: false - xy: 1003, 607 + xy: 1799, 827 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 water-icon-large rotate: false - xy: 1675, 1031 + xy: 1375, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-icon-small rotate: false - xy: 977, 581 + xy: 1799, 801 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6572,63 +5872,63 @@ wave-icon-full index: -1 wave-icon-large rotate: false - xy: 1725, 1081 + xy: 1425, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wave-icon-medium rotate: false - xy: 1893, 759 + xy: 479, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-icon-small rotate: false - xy: 1029, 633 + xy: 1799, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-dead-icon-large rotate: false - xy: 1775, 1131 + xy: 1475, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-dead-icon-medium rotate: false - xy: 1893, 725 + xy: 479, 156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-dead-icon-small rotate: false - xy: 1029, 607 + xy: 1773, 749 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-icon-large rotate: false - xy: 1875, 1181 + xy: 1525, 1081 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-icon-medium rotate: false - xy: 1893, 691 + xy: 479, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-icon-small rotate: false - xy: 1003, 581 + xy: 1799, 749 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -6642,168 +5942,168 @@ wraith-factory-icon-full index: -1 wraith-factory-icon-large rotate: false - xy: 1625, 931 + xy: 1675, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wraith-factory-icon-medium rotate: false - xy: 1892, 657 + xy: 479, 88 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wraith-factory-icon-small rotate: false - xy: 1055, 633 + xy: 539, 602 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 1625, 829 + xy: 1379, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1659, 816 + xy: 869, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 839, 795 + xy: 903, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 839, 761 + xy: 937, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 873, 795 + xy: 971, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 873, 761 + xy: 1005, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 907, 795 + xy: 1039, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 907, 761 + xy: 1073, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 941, 795 + xy: 1107, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 941, 761 + xy: 1141, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 975, 795 + xy: 1175, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 975, 761 + xy: 1209, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1009, 795 + xy: 1243, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1043, 795 + xy: 1311, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1043, 761 + xy: 1345, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1077, 795 + xy: 1379, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1077, 761 + xy: 834, 699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1247, 795 + xy: 1140, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1281, 795 + xy: 1208, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1349, 761 + xy: 1378, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1417, 795 + xy: 868, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -6887,14 +6187,14 @@ tau-mech index: -1 tau-mech-base rotate: false - xy: 1425, 931 + xy: 1375, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 1475, 981 + xy: 1475, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -6936,7 +6236,7 @@ trident-ship index: -1 blank rotate: false - xy: 87, 34 + xy: 510, 85 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -6950,7 +6250,7 @@ circle index: -1 clear rotate: false - xy: 1957, 932 + xy: 87, 34 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -6964,7 +6264,7 @@ shape-3 index: -1 bar rotate: false - xy: 445, 82 + xy: 543, 692 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -6972,7 +6272,7 @@ bar index: -1 bar-top rotate: false - xy: 445, 120 + xy: 1481, 747 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -6980,7 +6280,7 @@ bar-top index: -1 button rotate: false - xy: 801, 768 + xy: 759, 810 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7012,7 +6312,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 801, 826 + xy: 1893, 1202 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7028,7 +6328,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 261, 1372 + xy: 1931, 1202 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7036,7 +6336,7 @@ button-edge-4 index: -1 button-over rotate: false - xy: 1675, 918 + xy: 261, 1372 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7044,7 +6344,7 @@ button-over index: -1 button-right rotate: false - xy: 801, 797 + xy: 797, 868 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7052,7 +6352,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1951, 1152 + xy: 759, 868 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7060,7 +6360,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1989, 1156 + xy: 759, 839 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7068,7 +6368,7 @@ button-right-over index: -1 button-select rotate: false - xy: 891, 1337 + xy: 1755, 983 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -7076,42 +6376,42 @@ button-select index: -1 check-off rotate: false - xy: 1892, 623 + xy: 1753, 1077 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1862, 1003 + xy: 479, 14 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1919, 1065 + xy: 1755, 1043 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1892, 1003 + xy: 1755, 1009 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 1701, 906 + xy: 599, 1420 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 content-background rotate: false - xy: 800, 681 + xy: 1893, 1173 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7119,7 +6419,7 @@ content-background index: -1 content-background-locked rotate: false - xy: 801, 739 + xy: 797, 839 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7127,7 +6427,7 @@ content-background-locked index: -1 content-background-over rotate: false - xy: 800, 710 + xy: 797, 810 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -7149,84 +6449,84 @@ discord-banner index: -1 empty-sector rotate: false - xy: 1183, 829 + xy: 937, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 1091, 1237 + xy: 299, 1218 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 479, 728 + xy: 445, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 1905, 865 + xy: 1511, 869 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 579, 712 + xy: 1091, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid rotate: false - xy: 1135, 641 + xy: 427, 719 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-power rotate: false - xy: 1297, 641 + xy: 531, 584 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 1315, 641 + xy: 549, 584 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-turret rotate: false - xy: 1477, 641 + xy: 1803, 1046 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-units rotate: false - xy: 1513, 641 + xy: 1821, 1046 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-upgrade rotate: false - xy: 1549, 641 + xy: 1821, 1028 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 controller-cursor rotate: false - xy: 445, 64 + xy: 759, 792 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -7261,56 +6561,56 @@ icon-admin-small index: -1 icon-areaDelete rotate: false - xy: 1931, 793 + xy: 609, 900 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 321, 64 + xy: 780, 674 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 321, 64 + xy: 780, 674 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 599, 1420 + xy: 2037, 1173 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 609, 900 + xy: 2037, 1161 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 1943, 793 + xy: 531, 572 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 587, 700 + xy: 1087, 1679 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-back rotate: false - xy: 649, 1356 + xy: 777, 792 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -7324,49 +6624,49 @@ icon-ban index: -1 icon-break rotate: false - xy: 295, 721 + xy: 321, 64 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 564, 1771 + xy: 649, 1356 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel-2 rotate: false - xy: 475, 234 + xy: 483, 494 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 1087, 1679 + xy: 329, 2 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-check rotate: false - xy: 299, 1218 + xy: 295, 721 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-check-2 rotate: false - xy: 475, 208 + xy: 483, 468 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 icon-copy rotate: false - xy: 759, 795 + xy: 564, 1771 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -7394,119 +6694,119 @@ icon-database-small index: -1 icon-dev-builds rotate: false - xy: 1948, 994 + xy: 1603, 963 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 1019, 1463 + xy: 463, 72 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 1035, 1463 + xy: 1019, 1463 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 625, 1218 + xy: 1035, 1463 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 625, 1202 + xy: 625, 1218 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-egg rotate: false - xy: 303, 1418 + xy: 625, 1202 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 483, 604 + xy: 1862, 1108 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 1055, 615 + xy: 667, 1356 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 303, 1402 + xy: 1601, 1073 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-file rotate: false - xy: 1029, 589 + xy: 1511, 851 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 1081, 641 + xy: 1511, 833 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 479, 62 + xy: 1601, 1057 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 667, 1356 + xy: 1511, 815 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy rotate: false - xy: 303, 1386 + xy: 1569, 989 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-floppy-16 rotate: false - xy: 777, 795 + xy: 1511, 797 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder rotate: false - xy: 821, 665 + xy: 303, 1418 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-folder-parent rotate: false - xy: 147, 9 + xy: 303, 1402 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -7520,147 +6820,147 @@ icon-generated index: -1 icon-github rotate: false - xy: 163, 9 + xy: 303, 1386 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-google-play rotate: false - xy: 179, 9 + xy: 1547, 845 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-grid rotate: false - xy: 1099, 641 + xy: 427, 755 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-hold rotate: false - xy: 329, 2 + xy: 1955, 1152 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-holdDelete rotate: false - xy: 1639, 647 + xy: 989, 1663 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-home rotate: false - xy: 195, 9 + xy: 1547, 829 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-host rotate: false - xy: 211, 9 + xy: 1547, 813 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-info rotate: false - xy: 299, 1202 + xy: 1511, 781 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-itch.io rotate: false - xy: 453, 704 + xy: 1510, 765 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-item rotate: false - xy: 2027, 1119 + xy: 543, 572 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-items-none rotate: false - xy: 1735, 895 + xy: 1755, 973 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-line rotate: false - xy: 1117, 641 + xy: 427, 737 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-link rotate: false - xy: 299, 1370 + xy: 1510, 749 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-liquid-small rotate: false - xy: 989, 1663 + xy: 535, 560 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-load rotate: false - xy: 469, 704 + xy: 299, 1202 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-load-image rotate: false - xy: 1153, 641 + xy: 1783, 1082 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-map rotate: false - xy: 1171, 641 + xy: 1801, 1082 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-loading rotate: false - xy: 1189, 641 + xy: 1819, 1082 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-locked rotate: false - xy: 1207, 641 + xy: 1837, 1082 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-logic rotate: false - xy: 1265, 629 + xy: 341, 2 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-map rotate: false - xy: 501, 606 + xy: 1529, 791 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -7674,7 +6974,7 @@ icon-menu index: -1 icon-menu-large rotate: false - xy: 1225, 641 + xy: 2030, 1903 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -7695,21 +6995,21 @@ icon-mission-background index: -1 icon-mission-battle rotate: false - xy: 341, 2 + xy: 555, 572 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-defense rotate: false - xy: 1277, 629 + xy: 535, 548 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-done rotate: false - xy: 568, 1925 + xy: 547, 560 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -7723,280 +7023,280 @@ icon-none index: -1 icon-paste rotate: false - xy: 1243, 641 + xy: 2030, 1885 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pause rotate: false - xy: 1289, 629 + xy: 568, 1925 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-pencil rotate: false - xy: 1261, 641 + xy: 2030, 1867 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pencil-small rotate: false - xy: 517, 610 + xy: 299, 1370 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-pick rotate: false - xy: 1279, 641 + xy: 2030, 1849 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play rotate: false - xy: 365, 2 + xy: 535, 536 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-play-2 rotate: false - xy: 533, 610 + xy: 1563, 827 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-play-custom rotate: false - xy: 549, 610 + xy: 1579, 827 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-players rotate: false - xy: 1301, 629 + xy: 547, 548 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-power-requirement rotate: false - xy: 1489, 829 + xy: 1243, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-power-small rotate: false - xy: 377, 2 + xy: 365, 2 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-quit rotate: false - xy: 565, 610 + xy: 1563, 811 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-redo rotate: false - xy: 1333, 641 + xy: 445, 728 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-refresh rotate: false - xy: 1073, 617 + xy: 1579, 811 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rename rotate: false - xy: 1055, 599 + xy: 565, 610 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-resize rotate: false - xy: 1351, 641 + xy: 463, 728 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate rotate: false - xy: 1029, 573 + xy: 581, 610 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-arrow rotate: false - xy: 1089, 625 + xy: 597, 606 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-left rotate: false - xy: 1105, 625 + xy: 613, 606 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-right rotate: false - xy: 1121, 625 + xy: 629, 606 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save rotate: false - xy: 1137, 625 + xy: 1481, 897 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save-image rotate: false - xy: 1369, 641 + xy: 481, 728 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-map rotate: false - xy: 1387, 641 + xy: 1785, 1064 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-settings rotate: false - xy: 1313, 629 + xy: 535, 524 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-spray rotate: false - xy: 1405, 641 + xy: 1785, 1046 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-terrain rotate: false - xy: 1423, 641 + xy: 1803, 1064 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tools rotate: false - xy: 1153, 625 + xy: 1862, 1092 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-touch rotate: false - xy: 389, 2 + xy: 547, 536 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-touchDelete rotate: false - xy: 1325, 629 + xy: 377, 2 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-trash rotate: false - xy: 1169, 625 + xy: 1527, 775 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-trash-16 rotate: false - xy: 1441, 641 + xy: 1785, 1028 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tree rotate: false - xy: 1459, 641 + xy: 1821, 1064 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tree-locked rotate: false - xy: 1523, 829 + xy: 1277, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-trello rotate: false - xy: 1185, 625 + xy: 1526, 759 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-tutorial rotate: false - xy: 1201, 625 + xy: 1526, 743 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-undo rotate: false - xy: 1495, 641 + xy: 1785, 1010 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocked rotate: false - xy: 1531, 641 + xy: 1803, 1028 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocks rotate: false - xy: 1217, 625 + xy: 1547, 797 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-wiki rotate: false - xy: 1233, 625 + xy: 1563, 795 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-zone rotate: false - xy: 475, 182 + xy: 505, 572 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8010,14 +7310,14 @@ icon-zone-locked index: -1 icon-zoom rotate: false - xy: 1567, 641 + xy: 1803, 1010 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-zoom-small rotate: false - xy: 1249, 625 + xy: 1579, 795 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -8031,7 +7331,7 @@ info-banner index: -1 inventory rotate: false - xy: 501, 504 + xy: 780, 632 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -8046,7 +7346,7 @@ logotext index: -1 pane rotate: false - xy: 1717, 981 + xy: 835, 801 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8054,7 +7354,7 @@ pane index: -1 pane-2 rotate: false - xy: 1725, 1010 + xy: 835, 830 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8062,7 +7362,7 @@ pane-2 index: -1 scroll rotate: false - xy: 665, 629 + xy: 1222, 570 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -8086,7 +7386,7 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 691, 650 + xy: 1482, 627 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -8094,56 +7394,56 @@ scroll-knob-vertical-black index: -1 sector-select rotate: false - xy: 1586, 659 + xy: 1653, 969 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 selection rotate: false - xy: 759, 792 + xy: 2046, 2020 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 497, 736 + xy: 2046, 2010 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1831, 997 + xy: 1753, 1111 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1919, 1099 + xy: 479, 48 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1919, 1099 + xy: 479, 48 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 1805, 1031 + xy: 1861, 1160 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 1767, 1031 + xy: 1823, 1160 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8151,7 +7451,7 @@ underline index: -1 underline-2 rotate: false - xy: 1775, 1060 + xy: 1785, 1160 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8166,7 +7466,7 @@ white index: -1 window-empty rotate: false - xy: 1857, 934 + xy: 543, 629 size: 27, 61 split: 8, 8, 44, 11 orig: 27, 61 @@ -8349,7 +7649,7 @@ revenant index: -1 spirit rotate: false - xy: 1275, 931 + xy: 1075, 931 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -8370,7 +7670,7 @@ titan-leg index: -1 wraith rotate: false - xy: 1925, 1181 + xy: 1575, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -8461,3834 +7761,2798 @@ lich-missiles-equip index: -1 reaper-gun-equip rotate: false - xy: 1075, 981 + xy: 925, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1225, 1131 + xy: 925, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1325, 1081 + xy: 1075, 1031 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1525, 1081 + xy: 1225, 981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sprites2.png -size: 2048,1024 +size: 2048,512 format: RGBA8888 filter: Nearest,Nearest repeat: none alloy-smelter-icon-editor rotate: false - xy: 1, 17 + xy: 905, 263 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alpha-dart-mech-pad-icon-editor rotate: false - xy: 681, 823 + xy: 1395, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 1341, 821 + xy: 2015, 457 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 311, 145 + xy: 2015, 423 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 323, 499 + xy: 1035, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 245 + xy: 645, 361 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 453, 725 + xy: 1461, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 463, 427 + xy: 2015, 389 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 1375, 821 + xy: 1811, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 497, 427 + xy: 1845, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 1409, 821 + xy: 1879, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 1409, 821 + xy: 1879, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 453, 854 + xy: 645, 228 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliffs-icon-editor rotate: false - xy: 531, 427 + xy: 1913, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 1443, 821 + xy: 1947, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 565, 427 + xy: 945, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 453, 659 + xy: 1527, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1477, 821 + xy: 979, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 1511, 821 + xy: 1109, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 519, 725 + xy: 1593, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 727 + xy: 163, 39 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 857 + xy: 1, 7 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 745, 921 + xy: 1133, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 1545, 821 + xy: 1143, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 1545, 821 + xy: 1143, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 crawler-factory-icon-editor rotate: false - xy: 519, 659 + xy: 1659, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 585, 725 + xy: 1725, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 585, 659 + xy: 1791, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 99, 17 + xy: 1231, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-factory-icon-editor rotate: false - xy: 453, 593 + xy: 1857, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 1579, 821 + xy: 1177, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 1579, 821 + xy: 1177, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-editor rotate: false - xy: 519, 593 + xy: 1923, 327 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 323, 401 + xy: 1329, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 585, 593 + xy: 1043, 197 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 1613, 821 + xy: 1211, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 747, 855 + xy: 1043, 131 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks-icon-editor rotate: false - xy: 1647, 821 + xy: 1245, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 1681, 821 + xy: 1279, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 1715, 821 + xy: 1313, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 1749, 821 + xy: 163, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-clear rotate: false - xy: 323, 389 + xy: 905, 251 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 1783, 821 + xy: 197, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 1817, 821 + xy: 231, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters4 rotate: false - xy: 1851, 821 + xy: 265, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters5 rotate: false - xy: 1885, 821 + xy: 299, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1885, 821 + xy: 299, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1885, 821 + xy: 299, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters6 rotate: false - xy: 1919, 821 + xy: 333, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1919, 821 + xy: 333, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 1953, 821 + xy: 367, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 1953, 821 + xy: 367, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 619, 559 + xy: 401, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 619, 525 + xy: 435, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone1 rotate: false - xy: 619, 491 + xy: 469, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-editor rotate: false - xy: 619, 491 + xy: 469, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone2 rotate: false - xy: 747, 755 + xy: 503, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone3 rotate: false - xy: 781, 755 + xy: 1373, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 815, 755 + xy: 1407, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 815, 755 + xy: 1407, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 849, 755 + xy: 1441, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 883, 755 + xy: 1475, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 1019, 755 + xy: 1611, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 1019, 755 + xy: 1611, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 1053, 755 + xy: 1645, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 1087, 755 + xy: 1769, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 917, 755 + xy: 1509, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 917, 755 + xy: 1509, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 951, 755 + xy: 1543, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 985, 755 + xy: 1577, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock1 rotate: false - xy: 1121, 755 + xy: 1679, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-editor rotate: false - xy: 1121, 755 + xy: 1679, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock2 rotate: false - xy: 1155, 755 + xy: 1753, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock3 rotate: false - xy: 1189, 755 + xy: 1713, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 1223, 755 + xy: 1787, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 1223, 755 + xy: 1787, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 1257, 755 + xy: 1803, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 1291, 755 + xy: 1837, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 1341, 787 + xy: 1871, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged5 rotate: false - xy: 1341, 787 + xy: 1871, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 1341, 787 + xy: 1871, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 1375, 787 + xy: 1905, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 1375, 787 + xy: 1905, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 1409, 787 + xy: 1939, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 1409, 787 + xy: 1939, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 1443, 787 + xy: 1713, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 1443, 787 + xy: 1713, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 1477, 787 + xy: 1821, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 1477, 787 + xy: 1821, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 1511, 787 + xy: 1855, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 1545, 787 + xy: 1889, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged4 rotate: false - xy: 1579, 787 + xy: 1923, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged6 rotate: false - xy: 1613, 787 + xy: 1957, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -editor-ore-coal-holostone1 +editor-moss1 rotate: false - xy: 1647, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-holostone2 - rotate: false - xy: 1681, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-holostone3 - rotate: false - xy: 1715, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-sand1 - rotate: false - xy: 1749, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-sand2 - rotate: false - xy: 1783, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-sand3 - rotate: false - xy: 1817, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone-red1 - rotate: false - xy: 1953, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone-red2 - rotate: false - xy: 619, 457 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone-red3 - rotate: false - xy: 359, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone1 - rotate: false - xy: 1851, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone2 - rotate: false - xy: 1885, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stained-stone3 - rotate: false - xy: 1919, 787 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stone1 - rotate: false - xy: 393, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stone2 - rotate: false - xy: 427, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal-stone3 - rotate: false - xy: 2001, 887 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-holostone1 - rotate: false - xy: 2001, 853 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-holostone2 - rotate: false - xy: 1987, 819 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-holostone3 - rotate: false - xy: 1987, 785 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-sand1 - rotate: false - xy: 311, 111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-sand2 - rotate: false - xy: 345, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-sand3 - rotate: false - xy: 379, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone-red1 - rotate: false - xy: 413, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone-red2 - rotate: false - xy: 295, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone-red3 - rotate: false - xy: 295, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone1 - rotate: false - xy: 413, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone2 - rotate: false - xy: 345, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stained-stone3 - rotate: false - xy: 379, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stone1 - rotate: false - xy: 295, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stone2 - rotate: false - xy: 329, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper-stone3 - rotate: false - xy: 329, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-holostone1 - rotate: false - xy: 363, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-holostone2 - rotate: false - xy: 363, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-holostone3 - rotate: false - xy: 397, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-sand1 - rotate: false - xy: 397, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-sand2 - rotate: false - xy: 329, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-sand3 - rotate: false - xy: 363, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone-red1 - rotate: false - xy: 1393, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone-red2 - rotate: false - xy: 1427, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone-red3 - rotate: false - xy: 1461, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone1 - rotate: false - xy: 397, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone2 - rotate: false - xy: 1325, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stained-stone3 - rotate: false - xy: 1359, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stone1 - rotate: false - xy: 1495, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stone2 - rotate: false - xy: 1529, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead-stone3 - rotate: false - xy: 1563, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-holostone1 - rotate: false - xy: 1597, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-holostone2 - rotate: false - xy: 1631, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-holostone3 - rotate: false - xy: 1665, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-sand1 - rotate: false - xy: 1699, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-sand2 - rotate: false - xy: 1733, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-sand3 - rotate: false - xy: 1767, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-snow1 - rotate: false - xy: 1801, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-snow2 - rotate: false - xy: 1835, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-snow3 - rotate: false - xy: 1869, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone-red1 - rotate: false - xy: 431, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone-red2 - rotate: false - xy: 431, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone-red3 - rotate: false - xy: 1971, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone1 - rotate: false - xy: 1903, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone2 - rotate: false - xy: 1937, 753 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stained-stone3 - rotate: false - xy: 431, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stone1 - rotate: false - xy: 2005, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stone2 - rotate: false - xy: 447, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap-stone3 - rotate: false - xy: 447, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-holostone1 - rotate: false - xy: 465, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-holostone2 - rotate: false - xy: 465, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-holostone3 - rotate: false - xy: 465, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-sand1 - rotate: false - xy: 599, 423 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-sand2 - rotate: false - xy: 633, 423 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-sand3 - rotate: false - xy: 463, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone-red1 - rotate: false - xy: 599, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone-red2 - rotate: false - xy: 633, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone-red3 - rotate: false - xy: 457, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone1 - rotate: false - xy: 497, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone2 - rotate: false - xy: 531, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stained-stone3 - rotate: false - xy: 565, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stone1 - rotate: false - xy: 457, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stone2 - rotate: false - xy: 491, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium-stone3 - rotate: false - xy: 457, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-holostone1 - rotate: false - xy: 525, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-holostone2 - rotate: false - xy: 491, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-holostone3 - rotate: false - xy: 457, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-sand1 - rotate: false - xy: 559, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-sand2 - rotate: false - xy: 525, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-sand3 - rotate: false - xy: 491, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone-red1 - rotate: false - xy: 491, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone-red2 - rotate: false - xy: 559, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone-red3 - rotate: false - xy: 525, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone1 - rotate: false - xy: 457, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone2 - rotate: false - xy: 559, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stained-stone3 - rotate: false - xy: 525, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stone1 - rotate: false - xy: 491, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stone2 - rotate: false - xy: 559, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium-stone3 - rotate: false - xy: 525, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 559, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 559, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water - rotate: false - xy: 593, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-editor - rotate: false - xy: 593, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 593, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 593, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 593, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 627, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 627, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-icon-editor - rotate: false - xy: 627, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 593, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 627, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stained-stone-red1 - rotate: false - xy: 593, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stained-stone-red-icon-editor - rotate: false - xy: 593, 219 + xy: 1973, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stained-stone-yellow1 rotate: false - xy: 627, 219 + xy: 1973, 193 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +moss-icon-editor + rotate: false + xy: 1973, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow-icon-editor rotate: false - xy: 627, 219 + xy: 1973, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -editor-stained-stone1 +editor-moss2 rotate: false - xy: 627, 253 + xy: 1981, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stained-stone-icon-editor +editor-moss3 rotate: false - xy: 627, 253 + xy: 2015, 355 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal1 + rotate: false + xy: 2015, 321 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal2 + rotate: false + xy: 2015, 287 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal3 + rotate: false + xy: 2015, 253 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper1 + rotate: false + xy: 2015, 219 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper2 + rotate: false + xy: 2007, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper3 + rotate: false + xy: 1991, 151 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead1 + rotate: false + xy: 1855, 125 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead2 + rotate: false + xy: 1889, 125 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead3 + rotate: false + xy: 1923, 125 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap1 + rotate: false + xy: 1957, 125 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap2 + rotate: false + xy: 1991, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap3 + rotate: false + xy: 1347, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium1 + rotate: false + xy: 1381, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium2 + rotate: false + xy: 1415, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium3 + rotate: false + xy: 1449, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium1 + rotate: false + xy: 1483, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium2 + rotate: false + xy: 1517, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium3 + rotate: false + xy: 1551, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-salt + rotate: false + xy: 1585, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-icon-editor + rotate: false + xy: 1585, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water + rotate: false + xy: 1787, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water-icon-editor + rotate: false + xy: 1787, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand1 + rotate: false + xy: 1619, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-icon-editor + rotate: false + xy: 1619, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand2 + rotate: false + xy: 1653, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand3 + rotate: false + xy: 1753, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow1 + rotate: false + xy: 1821, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-icon-editor + rotate: false + xy: 1821, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow2 + rotate: false + xy: 1747, 83 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow3 + rotate: false + xy: 1781, 83 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stained-stone-red1 + rotate: false + xy: 1815, 83 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stained-stone-red-icon-editor + rotate: false + xy: 1815, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 461, 189 + xy: 1855, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 495, 189 + xy: 1889, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 495, 189 + xy: 1889, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 529, 189 + xy: 1923, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 529, 189 + xy: 1923, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 843, 921 + xy: 1427, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-icon-editor rotate: false - xy: 941, 921 + xy: 1525, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 1039, 921 + xy: 1623, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-icon-editor rotate: false - xy: 1137, 921 + xy: 1721, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad-icon-editor rotate: false - xy: 1235, 921 + xy: 1819, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 813, 855 + xy: 1043, 65 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 481, 155 + xy: 1957, 91 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-editor rotate: false - xy: 481, 121 + xy: 1991, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 485, 889 + xy: 645, 231 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 515, 155 + xy: 1747, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 515, 121 + xy: 1781, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 499, 87 + xy: 1815, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-editor rotate: false - xy: 879, 855 + xy: 1109, 229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 499, 53 + xy: 1849, 57 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 945, 855 + xy: 1109, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1011, 855 + xy: 1175, 229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 1333, 921 + xy: 1917, 393 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 1431, 921 + xy: 553, 71 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 499, 19 + xy: 1883, 57 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 533, 87 + xy: 1917, 57 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 533, 53 + xy: 1951, 57 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1529, 921 + xy: 651, 133 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1627, 921 + xy: 749, 133 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1077, 855 + xy: 1109, 97 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 533, 19 + xy: 1985, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 1, 115 + xy: 775, 361 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 549, 155 + xy: 1849, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1143, 855 + xy: 1175, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 1725, 921 + xy: 651, 35 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 1823, 921 + xy: 749, 35 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad-icon-editor rotate: false - xy: 1921, 921 + xy: 847, 133 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1209, 855 + xy: 1241, 229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 549, 121 + xy: 1883, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-editor rotate: false - xy: 1275, 855 + xy: 1175, 97 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 567, 87 + xy: 1917, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 567, 53 + xy: 1951, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 567, 19 + xy: 1985, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 1341, 855 + xy: 1241, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 1407, 855 + xy: 1307, 229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 261, 129 + xy: 1703, 145 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 1473, 855 + xy: 1241, 97 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 1539, 855 + xy: 1307, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 661, 355 + xy: 1013, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 1605, 855 + xy: 1307, 97 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 661, 321 + xy: 1047, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 661, 287 + xy: 1081, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 661, 253 + xy: 1115, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 661, 219 + xy: 1149, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1671, 855 + xy: 553, 5 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 651, 723 + xy: 1183, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-editor rotate: false - xy: 131, 245 + xy: 293, 39 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 197, 17 + xy: 847, 35 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rocks-icon-editor rotate: false - xy: 651, 689 + xy: 1217, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 1737, 855 + xy: 1395, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 685, 723 + xy: 1251, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1803, 855 + xy: 1461, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 1869, 855 + xy: 1527, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 651, 655 + xy: 1285, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 323, 597 + xy: 775, 231 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 261, 277 + xy: 1003, 263 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 685, 689 + xy: 1319, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 1935, 855 + xy: 1593, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 421, 527 + xy: 1659, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 651, 621 + xy: 1353, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 421, 461 + xy: 1725, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snowrocks-icon-editor rotate: false - xy: 685, 655 + xy: 1387, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 685, 621 + xy: 1421, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 261, 179 + xy: 945, 165 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 719, 721 + xy: 1455, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 753, 721 + xy: 1489, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 615, 889 + xy: 905, 361 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-icon-editor rotate: false - xy: 487, 527 + xy: 1791, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 421, 419 + xy: 1769, 219 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 487, 461 + xy: 1857, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-boulder-icon-editor rotate: false - xy: 719, 687 + xy: 1523, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-icon-editor rotate: false - xy: 787, 721 + xy: 1557, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-red-icon-editor rotate: false - xy: 719, 653 + xy: 1591, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-yellow-icon-editor rotate: false - xy: 753, 687 + xy: 1625, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 553, 527 + xy: 1923, 261 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 821, 721 + xy: 1659, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 553, 461 + xy: 1373, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 681, 757 + xy: 1373, 129 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad-icon-editor rotate: false - xy: 747, 789 + xy: 1439, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 813, 789 + xy: 1439, 129 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 359, 303 + xy: 945, 67 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 359, 205 + xy: 1101, 295 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 753, 653 + xy: 619, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 879, 789 + xy: 1505, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 131, 115 + xy: 423, 39 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titan-factory-icon-editor rotate: false - xy: 485, 791 + xy: 1199, 295 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 787, 687 + xy: 653, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 855, 721 + xy: 687, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 945, 789 + xy: 1505, 129 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad-icon-editor rotate: false - xy: 1011, 789 + xy: 1571, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-icon-editor rotate: false - xy: 1077, 789 + xy: 1571, 129 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 787, 653 + xy: 721, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 583, 791 + xy: 1297, 295 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 1143, 789 + xy: 1637, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 1209, 789 + xy: 1637, 129 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 697 + xy: 1, 169 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 375 + xy: 323, 169 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 wraith-factory-icon-editor rotate: false - xy: 1275, 789 + xy: 1703, 195 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sprites3.png -size: 2048,1024 +size: 2048,512 format: RGBA8888 filter: Nearest,Nearest repeat: none char1 rotate: false - xy: 613, 457 + xy: 1937, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 679, 523 + xy: 2003, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 745, 589 + xy: 581, 107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliffs1 rotate: false - xy: 373, 393 + xy: 1805, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal1 rotate: false - xy: 1019, 687 + xy: 249, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1309, 785 + xy: 283, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1591, 883 + xy: 1805, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1881, 981 + xy: 317, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 175, 43 + xy: 1805, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 779, 589 + xy: 351, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 407, 393 + xy: 1805, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 1053, 687 + xy: 385, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 1343, 785 + xy: 419, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 1625, 883 + xy: 453, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 1915, 981 + xy: 487, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone1 rotate: false - xy: 1915, 981 + xy: 487, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 209, 43 + xy: 521, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 209, 43 + xy: 521, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 813, 589 + xy: 1937, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 323, 917 + xy: 1, 93 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 dunerocks-large rotate: false - xy: 1, 11 + xy: 1, 27 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks1 rotate: false - xy: 441, 393 + xy: 1971, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dunerocks2 rotate: false - xy: 1087, 687 + xy: 1971, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil-blocky rotate: false - xy: 1, 273 + xy: 645, 415 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 edge-stencil-smooth rotate: false - xy: 323, 819 + xy: 291, 93 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 613, 917 + xy: 645, 317 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 1377, 785 + xy: 555, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 1659, 883 + xy: 1871, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1949, 981 + xy: 283, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-edge rotate: false - xy: 1, 175 + xy: 935, 415 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 holostone1 rotate: false - xy: 243, 43 + xy: 317, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone2 rotate: false - xy: 847, 589 + xy: 351, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone3 rotate: false - xy: 475, 393 + xy: 385, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 1121, 687 + xy: 419, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1411, 785 + xy: 453, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 1693, 883 + xy: 487, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 323, 721 + xy: 645, 219 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 613, 819 + xy: 935, 317 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 1445, 785 + xy: 1839, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1727, 883 + xy: 1839, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 543, 393 + xy: 1839, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1983, 981 + xy: 521, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 509, 393 + xy: 555, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1155, 687 + xy: 1855, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-large rotate: false - xy: 613, 557 + xy: 1805, 447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 icerocks1 rotate: false - xy: 577, 393 + xy: 1839, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks2 rotate: false - xy: 291, 337 + xy: 1889, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-edge rotate: false - xy: 903, 917 + xy: 1225, 415 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 ignarock1 rotate: false - xy: 291, 303 + xy: 1873, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock2 rotate: false - xy: 291, 269 + xy: 1873, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock3 rotate: false - xy: 291, 235 + xy: 1873, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 291, 201 + xy: 1873, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 291, 167 + xy: 1905, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 291, 133 + xy: 1907, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 291, 99 + xy: 1907, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 903, 621 + xy: 1923, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 1193, 719 + xy: 1907, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1483, 817 + xy: 1907, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged5 rotate: false - xy: 1483, 817 + xy: 1907, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 1773, 915 + xy: 1941, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 647, 457 + xy: 1941, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 713, 523 + xy: 1941, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 937, 621 + xy: 1941, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 1227, 719 + xy: 589, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1517, 817 + xy: 589, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged4 rotate: false - xy: 1807, 915 + xy: 589, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged6 rotate: false - xy: 613, 423 + xy: 1913, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 1, 77 + xy: 935, 219 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 -ore-coal-holostone1 +moss-edge rotate: false - xy: 647, 423 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-holostone2 - rotate: false - xy: 325, 343 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-holostone3 - rotate: false - xy: 325, 309 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-sand1 - rotate: false - xy: 325, 275 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-sand2 - rotate: false - xy: 325, 241 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-sand3 - rotate: false - xy: 325, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone-red1 - rotate: false - xy: 1189, 685 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone-red2 - rotate: false - xy: 1223, 685 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone-red3 - rotate: false - xy: 1479, 783 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone1 - rotate: false - xy: 325, 173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone2 - rotate: false - xy: 325, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stained-stone3 - rotate: false - xy: 325, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stone1 - rotate: false - xy: 1513, 783 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stone2 - rotate: false - xy: 611, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-stone3 - rotate: false - xy: 645, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-holostone1 - rotate: false - xy: 133, 1 - size: 32, 32 - orig: 32, 32 + xy: 1225, 317 + size: 288, 96 + orig: 288, 96 offset: 0, 0 index: -1 -ore-copper-holostone2 +stained-stone-yellow-edge rotate: false - xy: 291, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-holostone3 - rotate: false - xy: 325, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-sand1 - rotate: false - xy: 1761, 881 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-sand2 - rotate: false - xy: 1795, 881 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-sand3 - rotate: false - xy: 971, 637 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red1 - rotate: false - xy: 1087, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red2 - rotate: false - xy: 1121, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone-red3 - rotate: false - xy: 1155, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone1 - rotate: false - xy: 1261, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone2 - rotate: false - xy: 1019, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stained-stone3 - rotate: false - xy: 1053, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stone1 - rotate: false - xy: 1189, 651 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stone2 - rotate: false - xy: 1223, 651 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-stone3 - rotate: false - xy: 1309, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-holostone1 - rotate: false - xy: 1343, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-holostone2 - rotate: false - xy: 1377, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-holostone3 - rotate: false - xy: 1411, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-sand1 - rotate: false - xy: 1445, 751 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-sand2 - rotate: false - xy: 1479, 749 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-sand3 - rotate: false - xy: 1513, 749 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red1 - rotate: false - xy: 475, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red2 - rotate: false - xy: 509, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone-red3 - rotate: false - xy: 543, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone1 - rotate: false - xy: 373, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone2 - rotate: false - xy: 407, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stained-stone3 - rotate: false - xy: 441, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stone1 - rotate: false - xy: 577, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stone2 - rotate: false - xy: 611, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-stone3 - rotate: false - xy: 645, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-holostone1 - rotate: false - xy: 359, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-holostone2 - rotate: false - xy: 359, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-holostone3 - rotate: false - xy: 393, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-sand1 - rotate: false - xy: 359, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-sand2 - rotate: false - xy: 393, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-sand3 - rotate: false - xy: 427, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-snow1 - rotate: false - xy: 359, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-snow2 - rotate: false - xy: 393, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-snow3 - rotate: false - xy: 427, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red1 - rotate: false - xy: 427, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red2 - rotate: false - xy: 461, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone-red3 - rotate: false - xy: 495, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone1 - rotate: false - xy: 461, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone2 - rotate: false - xy: 359, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stained-stone3 - rotate: false - xy: 393, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stone1 - rotate: false - xy: 359, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stone2 - rotate: false - xy: 393, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-stone3 - rotate: false - xy: 427, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-holostone1 - rotate: false - xy: 461, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-holostone2 - rotate: false - xy: 495, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-holostone3 - rotate: false - xy: 529, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-sand1 - rotate: false - xy: 359, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-sand2 - rotate: false - xy: 393, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-sand3 - rotate: false - xy: 427, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red1 - rotate: false - xy: 563, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-stained-stone-red2 - rotate: false - xy: 359, 87 - size: 32, 32 - orig: 32, 32 + xy: 1225, 317 + size: 288, 96 + orig: 288, 96 offset: 0, 0 index: -1 -ore-thorium-stained-stone-red3 +moss1 rotate: false - xy: 393, 121 + xy: 1947, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stained-stone1 +stained-stone-yellow1 rotate: false - xy: 461, 223 + xy: 1947, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stained-stone2 +moss2 rotate: false - xy: 495, 257 + xy: 1939, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stained-stone3 +moss3 rotate: false - xy: 529, 291 + xy: 1981, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stone1 +ore-coal1 rotate: false - xy: 427, 155 + xy: 1973, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stone2 +ore-coal2 rotate: false - xy: 461, 189 + xy: 1957, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-thorium-stone3 +ore-coal3 rotate: false - xy: 495, 223 + xy: 2015, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-holostone1 +ore-copper1 rotate: false - xy: 529, 257 + xy: 2015, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-holostone2 +ore-copper2 rotate: false - xy: 563, 291 + xy: 2015, 377 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-holostone3 +ore-copper3 rotate: false - xy: 393, 87 + xy: 2015, 343 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-sand1 +ore-lead1 rotate: false - xy: 427, 121 + xy: 2007, 309 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-sand2 +ore-lead2 rotate: false - xy: 461, 155 + xy: 1991, 275 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-sand3 +ore-lead3 rotate: false - xy: 495, 189 + xy: 1975, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone-red1 +ore-scrap1 rotate: false - xy: 461, 121 + xy: 1975, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone-red2 +ore-scrap2 rotate: false - xy: 495, 155 + xy: 1975, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone-red3 +ore-scrap3 rotate: false - xy: 529, 189 + xy: 1975, 139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone1 +ore-thorium1 rotate: false - xy: 529, 223 + xy: 2009, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone2 +ore-thorium2 rotate: false - xy: 563, 257 + xy: 2009, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stained-stone3 +ore-thorium3 rotate: false - xy: 427, 87 + xy: 2009, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stone1 +ore-titanium1 rotate: false - xy: 563, 223 + xy: 2009, 139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stone2 +ore-titanium2 rotate: false - xy: 461, 87 + xy: 1805, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-titanium-stone3 +ore-titanium3 rotate: false - xy: 495, 121 + xy: 1839, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 323, 377 + xy: 581, 141 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rock1 rotate: false - xy: 969, 671 + xy: 199, 43 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rock2 rotate: false - xy: 1259, 769 + xy: 1805, 265 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-large rotate: false - xy: 903, 655 + xy: 67, 27 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rocks1 rotate: false - xy: 529, 155 + xy: 1873, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rocks2 rotate: false - xy: 563, 189 + xy: 1907, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt rotate: false - xy: 495, 87 + xy: 1941, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 323, 623 + xy: 1515, 415 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 613, 721 + xy: 1225, 219 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 sand-water rotate: false - xy: 563, 121 + xy: 1907, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 903, 819 + xy: 1515, 317 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 sand1 rotate: false - xy: 529, 121 + xy: 1975, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 563, 155 + xy: 2009, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 529, 87 + xy: 1873, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-large rotate: false - xy: 1193, 753 + xy: 1805, 381 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sandrocks1 rotate: false - xy: 563, 87 + xy: 1941, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks2 rotate: false - xy: 597, 321 + xy: 1975, 71 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 597, 287 + xy: 2009, 71 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 631, 321 + xy: 1975, 37 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 597, 253 + xy: 2009, 37 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 1193, 917 + xy: 1515, 219 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 snow1 rotate: false - xy: 631, 287 + xy: 623, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 597, 219 + xy: 623, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 631, 253 + xy: 657, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks-large rotate: false - xy: 1483, 851 + xy: 1871, 447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snowrocks1 rotate: false - xy: 597, 185 + xy: 691, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks2 rotate: false - xy: 631, 219 + xy: 657, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 1549, 875 + xy: 199, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 1839, 973 + xy: 241, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 133, 35 + xy: 1871, 339 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 stained-boulder1 rotate: false - xy: 597, 151 + xy: 725, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-boulder2 rotate: false - xy: 631, 185 + xy: 691, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-large rotate: false - xy: 1773, 949 + xy: 133, 27 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-red-large rotate: false - xy: 67, 11 + xy: 1805, 315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-red1 rotate: false - xy: 631, 117 + xy: 793, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-red2 rotate: false - xy: 597, 83 + xy: 759, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-yellow-large rotate: false - xy: 613, 491 + xy: 1871, 381 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stained-rocks-yellow1 rotate: false - xy: 631, 83 + xy: 827, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks-yellow2 rotate: false - xy: 971, 603 + xy: 793, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks1 rotate: false - xy: 597, 117 + xy: 759, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-rocks2 rotate: false - xy: 631, 151 + xy: 725, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stained-stone-edge - rotate: false - xy: 323, 525 - size: 288, 96 - orig: 288, 96 - offset: 0, 0 - index: -1 stained-stone-red-edge rotate: false - xy: 613, 623 + xy: 645, 121 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 stained-stone-red1 rotate: false - xy: 1107, 619 + xy: 861, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-red3 rotate: false - xy: 1107, 619 + xy: 861, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-red2 rotate: false - xy: 1141, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stained-stone-yellow-edge - rotate: false - xy: 903, 721 - size: 288, 96 - orig: 288, 96 - offset: 0, 0 - index: -1 -stained-stone-yellow1 - rotate: false - xy: 1175, 617 + xy: 827, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow2 rotate: false - xy: 1209, 617 + xy: 895, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stained-stone-yellow3 rotate: false - xy: 1261, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stained-stone1 - rotate: false - xy: 1005, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stained-stone2 - rotate: false - xy: 1039, 619 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stained-stone3 - rotate: false - xy: 1073, 619 + xy: 861, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stainedrocks-large rotate: false - xy: 679, 557 + xy: 1937, 447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stainedrocks1 rotate: false - xy: 1257, 667 + xy: 929, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stainedrocks2 rotate: false - xy: 1295, 717 + xy: 895, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 1193, 819 + xy: 935, 121 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 stone3 rotate: false - xy: 1329, 717 + xy: 963, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar rotate: false - xy: 1363, 717 + xy: 929, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 1483, 917 + xy: 1225, 121 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 1397, 717 + xy: 997, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1431, 717 + xy: 963, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 1465, 715 + xy: 1031, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 1499, 715 + xy: 997, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 359, 53 + xy: 1065, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 393, 53 + xy: 1031, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 427, 53 + xy: 1099, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 323, 427 + xy: 1515, 121 size: 288, 96 orig: 288, 96 offset: 0, 0 index: -1 white-tree rotate: false - xy: 1, 693 + xy: 1, 191 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1, 371 + xy: 323, 191 size: 320, 320 orig: 320, 320 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index c744ce7a1c..d5e483bf5d 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png index cf0a8e1fde..9f94d97008 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index 6c749afad5..2b1c5b0372 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 707f1d586c..43324c873a 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -30,6 +30,8 @@ import java.util.Locale; @SuppressWarnings("unchecked") public class Vars{ + /**IO buffer size.*/ + public static final int bufferSize = 8192; /**global charset*/ public static final Charset charset = Charset.forName("UTF-8"); /**main application name, capitalized*/ diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 604b63e294..761140642e 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -203,7 +203,7 @@ public class BlockIndexer{ for(int x = Math.max(0, tile.x - oreQuadrantSize / 2); x < tile.x + oreQuadrantSize / 2 && x < world.width(); x++){ for(int y = Math.max(0, tile.y - oreQuadrantSize / 2); y < tile.y + oreQuadrantSize / 2 && y < world.height(); y++){ Tile res = world.tile(x, y); - if(res.block() == Blocks.air && res.floor().itemDrop == item){ + if(res.block() == Blocks.air && res.drop() == item){ return res; } } @@ -241,9 +241,9 @@ public class BlockIndexer{ for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){ for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){ Tile result = world.tile(x, y); - if( result == null || result.floor().itemDrop == null || !scanOres.contains(result.floor().itemDrop)) continue; + if( result == null || result.drop() == null || !scanOres.contains(result.drop())) continue; - itemSet.add(result.floor().itemDrop); + itemSet.add(result.drop()); } } @@ -320,8 +320,8 @@ public class BlockIndexer{ Tile tile = world.tile(x, y); //add position of quadrant to list when an ore is found - if(tile.floor().itemDrop != null && scanOres.contains(tile.floor().itemDrop) && tile.block() == Blocks.air){ - ores.get(tile.floor().itemDrop).add(world.tile( + if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){ + ores.get(tile.drop()).add(world.tile( //make sure to clamp quadrant middle position, since it might go off bounds Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1))); diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 7cfe2d42a4..bbeb84cb88 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -7,7 +7,6 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.type.Category; -import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -28,7 +27,8 @@ import io.anuke.mindustry.world.blocks.units.UnitFactory; import io.anuke.mindustry.world.consumers.ConsumeItemFilter; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.state; +import static io.anuke.mindustry.Vars.world; public class Blocks implements ContentList{ public static Block @@ -39,6 +39,9 @@ public class Blocks implements ContentList{ iceSnow, sandWater, duneRocks, sandRocks, stainedRocks, moss, stainedRocksRed, stainedStoneRed, stainedRocksYellow, stainedStoneYellow, stainedBoulder, grass, salt, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, + //ores + oreCopper, oreLead, oreScrap, oreCoal, oreTitanium, oreThorium, + //crafting siliconSmelter, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, melter, separator, sporePress, pulverizer, incinerator, @@ -145,7 +148,7 @@ public class Blocks implements ContentList{ }}; stone = new Floor("stone"){{ - hasOres = true; + }}; craters = new Floor("craters"){{ @@ -170,12 +173,10 @@ public class Blocks implements ContentList{ sand = new Floor("sand"){{ itemDrop = Items.sand; - hasOres = true; playerUnmineable = true; }}; holostone = new Floor("holostone"){{ - hasOres = true; edgeStyle = "blocky"; }}; @@ -226,7 +227,6 @@ public class Blocks implements ContentList{ }}; pine = new StaticWall("pine"){{ - //fillsTile = false; variants = 0; }}; @@ -253,7 +253,6 @@ public class Blocks implements ContentList{ }}; stainedStoneRed = new Floor("stained-stone-red"){{ - hasOres = true; variants = 1; }}; @@ -308,6 +307,16 @@ public class Blocks implements ContentList{ blendGroup = ignarock; }}; + //endregion + //region ore + + oreCopper = new OreBlock(Items.copper); + oreLead = new OreBlock(Items.lead); + oreScrap = new OreBlock(Items.scrap); + oreCoal = new OreBlock(Items.coal); + oreTitanium = new OreBlock(Items.titanium); + oreThorium = new OreBlock(Items.thorium); + //endregion //region crafting @@ -1418,23 +1427,6 @@ public class Blocks implements ContentList{ consumes.powerBuffered(120f); }}; - //endregion - //region ores - - //create ores for every floor and item combination necessary - for(Item item : content.items()){ - if(!item.genOre) continue; - - for(Block block : content.blocks()){ - if(block instanceof Floor && ((Floor) block).hasOres){ - new OreBlock(item, (Floor) block); - } - } - } - - //special variants - new OreBlock(Items.scrap, (Floor)snow); - //endregion } } diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index 54945c53c5..ad5f0ba779 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -15,7 +15,6 @@ public class Items implements ContentList{ type = ItemType.material; hardness = 1; cost = 0.6f; - genOre = true; alwaysUnlocked = true; }}; @@ -23,7 +22,6 @@ public class Items implements ContentList{ type = ItemType.material; hardness = 1; cost = 0.9f; - genOre = true; }}; metaglass = new Item("metaglass", Color.valueOf("ebeef5")){{ @@ -40,14 +38,12 @@ public class Items implements ContentList{ explosiveness = 0.4f; flammability = 1f; hardness = 2; - genOre = true; }}; titanium = new Item("titanium", Color.valueOf("8da1e3")){{ type = ItemType.material; hardness = 3; cost = 1.1f; - genOre = true; }}; thorium = new Item("thorium", Color.valueOf("f9a3c7")){{ @@ -56,11 +52,10 @@ public class Items implements ContentList{ hardness = 4; radioactivity = 1f; cost = 1.4f; - genOre = true; }}; scrap = new Item("scrap", Color.valueOf("777777")){{ - genOre = true; + }}; silicon = new Item("silicon", Color.valueOf("53565c")){{ diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 4878b2daf0..822cb3d357 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -23,8 +23,6 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.MapException; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.maps.Maps; import io.anuke.mindustry.maps.generators.Generator; import io.anuke.mindustry.type.ContentType; @@ -235,12 +233,15 @@ public class World implements ApplicationListener{ beginMapLoad(); this.currentMap = map; - int width = map.meta.width, height = map.meta.height; - - createTiles(width, height); - try{ - loadTileData(tiles, MapIO.readTileData(map, true)); + createTiles(map.width, map.height); + for(int x = 0; x < map.width; x++){ + for(int y = 0; y < map.height; y++){ + tiles[x][y] = new Tile(x, y); + } + } + MapIO.readTiles(map, tiles); + prepareTiles(tiles); }catch(Exception e){ Log.err(e); if(!headless){ @@ -260,7 +261,7 @@ public class World implements ApplicationListener{ if(state.teams.get(players[0].getTeam()).cores.size == 0){ ui.showError("$map.nospawn"); invalidMap = true; - }else if(state.rules.pvp){ //pvp maps need two cores to be valid + }else if(state.rules.pvp){ //pvp maps need two cores to be valid invalidMap = true; for(Team team : Team.all){ if(state.teams.get(team).cores.size != 0 && team != players[0].getTeam()){ @@ -416,18 +417,7 @@ public class World implements ApplicationListener{ } /**Loads raw map tile data into a Tile[][] array, setting up multiblocks, cliffs and ores. */ - void loadTileData(Tile[][] tiles, MapTileData data){ - data.position(0, 0); - TileDataMarker marker = data.newDataMarker(); - - for(int y = 0; y < data.height(); y++){ - for(int x = 0; x < data.width(); x++){ - data.read(marker); - - tiles[x][y] = new Tile(x, y, marker.floor, marker.wall == Blocks.part.id ? 0 : marker.wall, marker.rotation, marker.team); - } - } - + void loadTileData(Tile[][] tiles){ prepareTiles(tiles); } diff --git a/core/src/io/anuke/mindustry/editor/DrawOperation.java b/core/src/io/anuke/mindustry/editor/DrawOperation.java index b6b7d13f76..6bc964e465 100755 --- a/core/src/io/anuke/mindustry/editor/DrawOperation.java +++ b/core/src/io/anuke/mindustry/editor/DrawOperation.java @@ -1,72 +1,70 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.util.Pack; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; +import io.anuke.annotations.Annotations.Struct; +import io.anuke.arc.collection.LongArray; +import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.gen.TileOp; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.Floor; + +import static io.anuke.mindustry.Vars.content; public class DrawOperation{ - /** - * Data to apply operation to. - */ - private MapTileData data; - /** - * List of per-tile operations that occurred. - */ - private Array operations = new Array<>(); - /** - * Checks for duplicate operations, useful for brushes. - */ - private IntSet checks = new IntSet(); - - public DrawOperation(MapTileData data){ - this.data = data; - } + private LongArray array = new LongArray(); public boolean isEmpty(){ - return operations.size == 0; + return array.isEmpty(); } - public boolean checkDuplicate(short x, short y){ - int i = Pack.shortInt(x, y); - if(checks.contains(i)) return true; - - checks.add(i); - return false; - } - - public void addOperation(TileOperation op){ - operations.add(op); + public void addOperation(long op){ + array.add(op); } public void undo(MapEditor editor){ - for(int i = operations.size - 1; i >= 0; i--){ - TileOperation op = operations.get(i); - data.position(op.x, op.y); - data.write(op.from); - editor.renderer().updatePoint(op.x, op.y); + for(int i = array.size - 1; i >= 0; i--){ + long l = array.get(i); + set(editor, editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l), TileOp.from(l)); } } public void redo(MapEditor editor){ - for(TileOperation op : operations){ - data.position(op.x, op.y); - data.write(op.to); - editor.renderer().updatePoint(op.x, op.y); + for(int i = 0; i < array.size; i++){ + long l = array.get(i); + set(editor, editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l), TileOp.to(l)); } } - public static class TileOperation{ - public short x, y; - public TileDataMarker from; - public TileDataMarker to; + void set(MapEditor editor, Tile tile, byte type, byte to){ + editor.load(() -> { + if(type == OpType.floor.ordinal()){ + tile.setFloor((Floor)content.block(to)); + }else if(type == OpType.block.ordinal()){ + tile.setBlock(content.block(to)); + }else if(type == OpType.rotation.ordinal()){ + tile.setRotation(to); + }else if(type == OpType.team.ordinal()){ + tile.setTeam(Team.all[to]); + }else if(type == OpType.ore.ordinal()){ + tile.setOreByte(to); + } + }); + editor.renderer().updatePoint(tile.x, tile.y); + } - public TileOperation(short x, short y, TileDataMarker from, TileDataMarker to){ - this.x = x; - this.y = y; - this.from = from; - this.to = to; - } + @Struct + class TileOpStruct{ + short x; + short y; + byte type; + byte from; + byte to; + } + + public enum OpType{ + floor, + block, + rotation, + team, + ore } } diff --git a/core/src/io/anuke/mindustry/editor/EditorTile.java b/core/src/io/anuke/mindustry/editor/EditorTile.java new file mode 100644 index 0000000000..eb4d9af6ba --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/EditorTile.java @@ -0,0 +1,105 @@ +package io.anuke.mindustry.editor; + +import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.editor.DrawOperation.OpType; +import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.gen.TileOp; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.OreBlock; +import io.anuke.mindustry.world.modules.ConsumeModule; +import io.anuke.mindustry.world.modules.ItemModule; +import io.anuke.mindustry.world.modules.LiquidModule; +import io.anuke.mindustry.world.modules.PowerModule; + +import static io.anuke.mindustry.Vars.ui; + +public class EditorTile extends Tile{ + + public EditorTile(int x, int y, byte floor, byte wall){ + super(x, y, floor, wall); + } + + @Override + public Team getTeam(){ + return Team.all[getTeamID()]; + } + + @Override + public void setFloor(Floor type){ + if(type instanceof OreBlock){ + //don't place on liquids + if(!floor().isLiquid) setOreByte(type.id); + return; + } + + Block previous = floor(); + Block ore = oreBlock(); + if(previous == type && ore == Blocks.air) return; + super.setFloor(type); + //ore may get nullified so make sure to save editrs + if(oreBlock() != ore){ + op(TileOp.get(x, y, (byte)OpType.ore.ordinal(), ore.id, oreBlock().id)); + } + if(previous != type){ + op(TileOp.get(x, y, (byte)OpType.floor.ordinal(), previous.id, type.id)); + } + } + + @Override + public void setBlock(Block type){ + Block previous = block(); + if(previous == type) return; + super.setBlock(type); + op(TileOp.get(x, y, (byte)OpType.block.ordinal(), previous.id, type.id)); + } + + @Override + public void setTeam(Team team){ + byte previous = getTeamID(); + if(previous == team.ordinal()) return; + super.setTeam(team); + op(TileOp.get(x, y, (byte)OpType.team.ordinal(), previous, (byte)team.ordinal())); + } + + @Override + public void setRotation(byte rotation){ + byte previous = getRotation(); + if(previous == rotation) return; + super.setRotation(rotation); + op(TileOp.get(x, y, (byte)OpType.rotation.ordinal(), previous, rotation)); + } + + @Override + public void setOreByte(byte ore){ + byte previous = getOreByte(); + if(previous == ore) return; + super.setOreByte(ore); + op(TileOp.get(x, y, (byte)OpType.ore.ordinal(), previous, ore)); + } + + @Override + protected void preChanged(){ + super.setTeam(Team.none); + } + + @Override + protected void changed(){ + entity = null; + + Block block = block(); + + if(block.hasEntity()){ + entity = block.newEntity(); + entity.cons = new ConsumeModule(entity); + if(block.hasItems) entity.items = new ItemModule(); + if(block.hasLiquids) entity.liquids = new LiquidModule(); + if(block.hasPower) entity.power = new PowerModule(); + } + } + + private static void op(long op){ + ui.editor.editor.addTileOp(op); + } +} diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java index ea40b3eb6d..6effe3bbd8 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -7,34 +7,31 @@ import io.anuke.arc.input.KeyCode; import io.anuke.arc.util.Pack; import io.anuke.arc.util.Structs; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.DataPosition; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.mindustry.world.blocks.Floor; -import static io.anuke.mindustry.Vars.*; - public enum EditorTool{ pick{ public void touched(MapEditor editor, int x, int y){ - if(!Structs.inBounds(x, y, editor.getMap().width(), editor.getMap().height())) return; + if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; - byte bf = editor.getMap().read(x, y, DataPosition.floor); - byte bw = editor.getMap().read(x, y, DataPosition.wall); - byte link = editor.getMap().read(x, y, DataPosition.link); + Tile tile = editor.tile(x, y); - if(link != 0){ + Block floor = tile.floor(), block = tile.block(); + byte link = tile.getLinkByte(); + + if(block instanceof BlockPart && link != 0){ x -= (Pack.leftByte(link) - 8); y -= (Pack.rightByte(link) - 8); - bf = editor.getMap().read(x, y, DataPosition.floor); - bw = editor.getMap().read(x, y, DataPosition.wall); + + tile = editor.tile(x, y); + block = tile.block(); } - Block block = content.block(bw == 0 ? bf : bw); - editor.setDrawBlock(block); - ui.editor.updateSelectedBlock(); + editor.drawBlock = block == Blocks.air ? floor : block; } }, pencil{ @@ -67,7 +64,7 @@ public enum EditorTool{ @Override public void touched(MapEditor editor, int x, int y){ - editor.draw(x, y, isPaint(), editor.getDrawBlock(), 0.012); + editor.draw(x, y, isPaint(), editor.drawBlock, 0.012); } }, line{ @@ -81,56 +78,57 @@ public enum EditorTool{ } IntArray stack = new IntArray(); - int width; - byte be, dest; - boolean floor; - MapTileData data; + Block dest; + boolean isfloor; + MapEditor data; public void touched(MapEditor editor, int x, int y){ - if(!Structs.inBounds(x, y, editor.getMap().width(), editor.getMap().height())) return; + if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; + Tile tile = editor.tile(x, y); - if(editor.getDrawBlock().isMultiblock()){ + if(editor.drawBlock.isMultiblock()){ //don't fill multiblocks, thanks pencil.touched(editor, x, y); return; } - data = editor.getMap(); + data = editor; + isfloor = editor.drawBlock instanceof Floor; - floor = editor.getDrawBlock() instanceof Floor; + Block floor = tile.floor(); + Block block = tile.block(); + boolean synth = editor.drawBlock.synthetic(); - byte bf = data.read(x, y, DataPosition.floor); - byte bw = data.read(x, y, DataPosition.wall); - boolean synth = editor.getDrawBlock().synthetic(); - byte brt = Pack.byteByte((byte) editor.getDrawRotation(), (byte) editor.getDrawTeam().ordinal()); + dest = isfloor ? floor : block; + Block draw = editor.drawBlock; - dest = floor ? bf : bw; - byte draw = editor.getDrawBlock().id; - - if(dest == draw || content.block(bw) instanceof BlockPart || content.block(bw).isMultiblock()){ + if(dest == draw || block == Blocks.part || block.isMultiblock()){ return; } - width = editor.getMap().width(); - int height = editor.getMap().height(); + int width = editor.width(); + int height = editor.height(); IntPositionConsumer writer = (px, py) -> { - TileDataMarker prev = editor.getPrev(px, py, false); + Tile write = editor.tile(px, py); - if(floor){ - data.write(px, py, DataPosition.floor, draw); + if(isfloor){ + write.setFloor((Floor)draw); }else{ - data.write(px, py, DataPosition.wall, draw); + write.setBlock(draw); } if(synth){ - data.write(px, py, DataPosition.rotationTeam, brt); + write.setTeam(editor.drawTeam); } - editor.onWrite(px, py, prev); + if(draw.rotate){ + write.setRotation((byte)editor.rotation); + } }; if(isAlt()){ + //fill all of the same type regardless of borders for(int cx = 0; cx < width; cx++){ for(int cy = 0; cy < height; cy++){ if(eq(cx, cy)){ @@ -139,28 +137,28 @@ public enum EditorTool{ } } }else if(isAlt2()){ + //fill all teams. for(int cx = 0; cx < width; cx++){ for(int cy = 0; cy < height; cy++){ - byte w = data.read(cx, cy, DataPosition.wall); - if(content.block(w).synthetic()){ - TileDataMarker prev = editor.getPrev(cx, cy, false); - data.write(cx, cy, DataPosition.rotationTeam, (byte)editor.getDrawTeam().ordinal()); - editor.onWrite(cx, cy, prev); + Tile write = editor.tile(cx, cy); + if(write.block().synthetic()){ + write.setTeam(editor.drawTeam); } } } }else{ + //normal fill int x1; boolean spanAbove, spanBelow; stack.clear(); - stack.add(asi(x, y)); + stack.add(Pos.get(x, y)); while(stack.size > 0){ int popped = stack.pop(); - x = popped % width; - y = popped / width; + x = Pos.x(popped); + y = Pos.y(popped); x1 = x; while(x1 >= 0 && eq(x1, y)) x1--; @@ -170,14 +168,14 @@ public enum EditorTool{ writer.accept(x1, y); if(!spanAbove && y > 0 && eq(x1, y - 1)){ - stack.add(asi(x1, y - 1)); + stack.add(Pos.get(x1, y - 1)); spanAbove = true; - }else if(spanAbove && y > 0 && eq(x1, y - 1)){ + }else if(spanAbove && eq(x1, y - 1)){ spanAbove = false; } if(!spanBelow && y < height - 1 && eq(x1, y + 1)){ - stack.add(asi(x1, y + 1)); + stack.add(Pos.get(x1, y + 1)); spanBelow = true; }else if(spanBelow && y < height - 1 && eq(x1, y + 1)){ spanBelow = false; @@ -189,15 +187,9 @@ public enum EditorTool{ } boolean eq(int px, int py){ - byte nbf = data.read(px, py, DataPosition.floor); - byte nbw = data.read(px, py, DataPosition.wall); - byte nbe = data.read(px, py, DataPosition.elevation); + Tile tile = data.tile(px, py); - return (floor ? nbf : nbw) == dest && nbe == be; - } - - int asi(int x, int y){ - return x + y * width; + return (isfloor ? tile.floor() : tile.block()) == dest; } }, zoom; diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java index af3a0de255..4789dc5baa 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditor.java +++ b/core/src/io/anuke/mindustry/editor/MapEditor.java @@ -1,88 +1,150 @@ package io.anuke.mindustry.editor; import io.anuke.arc.collection.ObjectMap; +import io.anuke.arc.files.FileHandle; import io.anuke.arc.math.Mathf; +import io.anuke.arc.util.Log; import io.anuke.arc.util.Pack; import io.anuke.arc.util.Structs; -import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.editor.DrawOperation.TileOperation; import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.DataPosition; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; +import io.anuke.mindustry.gen.TileOp; +import io.anuke.mindustry.io.MapIO; +import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; -import static io.anuke.mindustry.Vars.content; +import java.io.IOException; public class MapEditor{ public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; - private MapTileData map; private ObjectMap tags = new ObjectMap<>(); private MapRenderer renderer = new MapRenderer(this); + private Tile[][] tiles; - private int brushSize = 1; - private int rotation; - private Block drawBlock = Blocks.stone; - private Team drawTeam = Team.blue; + private OperationStack stack = new OperationStack(); + private DrawOperation currentOp; + private boolean loading; - public MapTileData getMap(){ - return map; - } + public int brushSize = 1; + public int rotation; + public Block drawBlock = Blocks.stone; + public Team drawTeam = Team.blue; public ObjectMap getTags(){ return tags; } - public void beginEdit(MapTileData map, ObjectMap tags, boolean clear){ - this.map = map; - this.brushSize = 1; - this.tags = tags; + public void beginEdit(int width, int height){ + reset(); - if(clear){ - for(int x = 0; x < map.width(); x++){ - for(int y = 0; y < map.height(); y++){ - map.write(x, y, DataPosition.floor, Blocks.stone.id); + loading = true; + tiles = createTiles(width, height); + renderer.resize(width(), height()); + loading = false; + } + + public void beginEdit(Map map) throws IOException{ + reset(); + + loading = true; + tiles = createTiles(map.width, map.height); + tags.putAll(map.tags); + MapIO.readTiles(map, tiles); + checkTiles(); + renderer.resize(width(), height()); + loading = false; + } + + public void beginEdit(Tile[][] tiles){ + reset(); + + this.tiles = tiles; + checkTiles(); + renderer.resize(width(), height()); + } + + //adds missing blockparts + void checkTiles(){ + //clear block parts first + for(int x = 0; x < width(); x ++){ + for(int y = 0; y < height(); y++){ + if(tiles[x][y].block() == Blocks.part){ + tiles[x][y].setBlock(Blocks.air); + tiles[x][y].setLinkByte((byte)0); } } } + //set up missing blockparts + for(int x = 0; x < width(); x ++){ + for(int y = 0; y < height(); y ++){ + Block drawBlock = tiles[x][y].block(); + if(drawBlock.isMultiblock()){ + int offsetx = -(drawBlock.size - 1) / 2; + int offsety = -(drawBlock.size - 1) / 2; + for(int dx = 0; dx < drawBlock.size; dx++){ + for(int dy = 0; dy < drawBlock.size; dy++){ + int worldx = dx + offsetx + x; + int worldy = dy + offsety + y; + + if(Structs.inBounds(worldx, worldy, width(), height()) && !(dx + offsetx == 0 && dy + offsety == 0)){ + Tile tile = tiles[worldx][worldy]; + tile.setBlock(Blocks.part); + tile.setLinkByte(Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8))); + } + } + } + } + } + } + } + + public void load(Runnable r){ + loading = true; + r.run(); + loading = false; + } + + /**Creates a 2-D array of EditorTiles with stone as the floor block.*/ + public Tile[][] createTiles(int width, int height){ + tiles = new Tile[width][height]; + + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + tiles[x][y] = new EditorTile(x, y, Blocks.stone.id, (byte)0); + } + } + return tiles; + } + + public Map createMap(FileHandle file){ + return new Map(file, width(), height(), new ObjectMap<>(tags), true); + } + + private void reset(){ + clearOp(); + brushSize = 1; drawBlock = Blocks.stone; - renderer.resize(map.width(), map.height()); + tags = new ObjectMap<>(); } - public int getDrawRotation(){ - return rotation; + public Tile[][] tiles(){ + return tiles; } - public void setDrawRotation(int rotation){ - this.rotation = rotation; + public Tile tile(int x, int y){ + return tiles[x][y]; } - public Team getDrawTeam(){ - return drawTeam; + public int width(){ + return tiles.length; } - public void setDrawTeam(Team team){ - this.drawTeam = team; - } - - public Block getDrawBlock(){ - return drawBlock; - } - - public void setDrawBlock(Block block){ - this.drawBlock = block; - } - - public int getBrushSize(){ - return brushSize; - } - - public void setBrushSize(int size){ - this.brushSize = size; + public int height(){ + return tiles[0].length; } public void draw(int x, int y, boolean paint){ @@ -94,15 +156,12 @@ public class MapEditor{ } public void draw(int x, int y, boolean paint, Block drawBlock, double chance){ - byte writeID = drawBlock.id; - byte partID = Blocks.part.id; - byte rotationTeam = Pack.byteByte(drawBlock.rotate ? (byte)rotation : 0, drawBlock.synthetic() ? (byte)drawTeam.ordinal() : 0); - boolean isfloor = drawBlock instanceof Floor && drawBlock != Blocks.air; if(drawBlock.isMultiblock()){ - x = Mathf.clamp(x, (drawBlock.size-1)/2, map.width() - drawBlock.size/2 - 1); - y = Mathf.clamp(y, (drawBlock.size-1)/2, map.height() - drawBlock.size/2 - 1); + + x = Mathf.clamp(x, (drawBlock.size-1)/2, width() - drawBlock.size/2 - 1); + y = Mathf.clamp(y, (drawBlock.size-1)/2, height() - drawBlock.size/2 - 1); int offsetx = -(drawBlock.size - 1) / 2; int offsety = -(drawBlock.size - 1) / 2; @@ -113,68 +172,61 @@ public class MapEditor{ int worldx = dx + offsetx + x; int worldy = dy + offsety + y; - if(Structs.inBounds(worldx, worldy, map.width(), map.height())){ - TileDataMarker prev = getPrev(worldx, worldy, false); + if(Structs.inBounds(worldx, worldy, width(), height())){ + Tile tile = tiles[worldx][worldy]; if(i == 1){ - map.write(worldx, worldy, DataPosition.wall, partID); - map.write(worldx, worldy, DataPosition.rotationTeam, rotationTeam); - map.write(worldx, worldy, DataPosition.link, Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8))); + tile.setBlock(Blocks.part); + tile.setLinked((byte)(dx + offsetx), (byte)(dy + offsety)); }else{ - byte link = map.read(worldx, worldy, DataPosition.link); - byte block = map.read(worldx, worldy, DataPosition.wall); + byte link = tile.getLinkByte(); + Block block = tile.block(); if(link != 0){ removeLinked(worldx - (Pack.leftByte(link) - 8), worldy - (Pack.rightByte(link) - 8)); - }else if(content.block(block).isMultiblock()){ + }else if(block.isMultiblock()){ removeLinked(worldx, worldy); } } - - onWrite(worldx, worldy, prev); } } } } - TileDataMarker prev = getPrev(x, y, false); - - map.write(x, y, DataPosition.wall, writeID); - map.write(x, y, DataPosition.link, (byte) 0); - map.write(x, y, DataPosition.rotationTeam, rotationTeam); - - onWrite(x, y, prev); + Tile tile = tiles[x][y]; + tile.setBlock(drawBlock); + tile.setTeam(drawTeam); }else{ for(int rx = -brushSize; rx <= brushSize; rx++){ for(int ry = -brushSize; ry <= brushSize; ry++){ if(Mathf.dst(rx, ry) <= brushSize - 0.5f && (chance >= 0.999 || Mathf.chance(chance))){ int wx = x + rx, wy = y + ry; - if(wx < 0 || wy < 0 || wx >= map.width() || wy >= map.height() || (paint && !isfloor && content.block(map.read(wx, wy, DataPosition.wall)) == Blocks.air)){ + if(wx < 0 || wy < 0 || wx >= width() || wy >= height() || (paint && !isfloor && tiles[wx][wy].block() == Blocks.air)){ continue; } - TileDataMarker prev = getPrev(wx, wy, true); + Tile tile = tiles[wx][wy]; if(!isfloor){ - byte link = map.read(wx, wy, DataPosition.link); + byte link = tile.getLinkByte(); + Log.info("Remove linkd: " + tiles[x][y]); - if(content.block(map.read(wx, wy, DataPosition.wall)).isMultiblock()){ + if(tile.block().isMultiblock()){ removeLinked(wx, wy); - }else if(link != 0){ + }else if(link != 0 && tiles[x][y].block() == Blocks.part){ removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8)); } } if(isfloor){ - map.write(wx, wy, DataPosition.floor, writeID); + tile.setFloor((Floor)drawBlock); }else{ - map.write(wx, wy, DataPosition.wall, writeID); - map.write(wx, wy, DataPosition.link, (byte) 0); - map.write(wx, wy, DataPosition.rotationTeam, rotationTeam); + tile.setBlock(drawBlock); + if(drawBlock.synthetic()){ + tile.setTeam(drawTeam); + } } - - onWrite(x + rx, y + ry, prev); } } } @@ -182,77 +234,86 @@ public class MapEditor{ } private void removeLinked(int x, int y){ - Block block = content.block(map.read(x, y, DataPosition.wall)); + Block block = tiles[x][y].block(); int offsetx = -(block.size - 1) / 2; int offsety = -(block.size - 1) / 2; for(int dx = 0; dx < block.size; dx++){ for(int dy = 0; dy < block.size; dy++){ int worldx = x + dx + offsetx, worldy = y + dy + offsety; - if(Structs.inBounds(worldx, worldy, map.width(), map.height())){ - TileDataMarker prev = getPrev(worldx, worldy, false); - - map.write(worldx, worldy, DataPosition.link, (byte) 0); - map.write(worldx, worldy, DataPosition.rotationTeam, (byte) 0); - map.write(worldx, worldy, DataPosition.wall, (byte) 0); - - onWrite(worldx, worldy, prev); + if(Structs.inBounds(worldx, worldy, width(), height())){ + tiles[worldx][worldy].setTeam(Team.none); + tiles[worldx][worldy].setBlock(Blocks.air); } } } } - boolean checkDupes(int x, int y){ - return Vars.ui.editor.getView().checkForDuplicates((short) x, (short) y); - } - - void onWrite(int x, int y, TileDataMarker previous){ - if(previous == null){ - renderer.updatePoint(x, y); - return; - } - - TileDataMarker current = map.new TileDataMarker(); - map.position(x, y); - map.read(current); - - Vars.ui.editor.getView().addTileOp(new TileOperation((short) x, (short) y, previous, current)); - renderer.updatePoint(x, y); - } - - TileDataMarker getPrev(int x, int y, boolean checkDupes){ - if(checkDupes && checkDupes(x, y)){ - return null; - }else{ - TileDataMarker marker = map.newDataMarker(); - map.position(x, y); - map.read(marker); - return marker; - } - } - public MapRenderer renderer(){ return renderer; } public void resize(int width, int height){ - MapTileData previous = map; - int offsetX = -(width - previous.width())/2, offsetY = -(height - previous.height())/2; + clearOp(); - map = new MapTileData(width, height); - for(int x = 0; x < map.width(); x++){ - for(int y = 0; y < map.height(); y++){ + Tile[][] previous = tiles; + int offsetX = -(width - width())/2, offsetY = -(height - height())/2; + loading = true; + + tiles = new Tile[width][height]; + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ int px = offsetX + x, py = offsetY + y; - if(Structs.inBounds(px, py, previous.width(), previous.height())){ - map.write(x, y, DataPosition.floor, previous.read(px, py, DataPosition.floor)); - map.write(x, y, DataPosition.wall, previous.read(px, py, DataPosition.wall)); - map.write(x, y, DataPosition.link, previous.read(px, py, DataPosition.link)); - map.write(x, y, DataPosition.rotationTeam, previous.read(px, py, DataPosition.rotationTeam)); + if(Structs.inBounds(px, py, previous.length, previous[0].length)){ + tiles[x][y] = previous[px][py]; + tiles[x][y].x = (short)x; + tiles[x][y].y = (short)y; }else{ - map.write(x, y, DataPosition.floor, Blocks.stone.id); + tiles[x][y] = new EditorTile(x, y, Blocks.stone.id, (byte)0); } } } + renderer.resize(width, height); + loading = false; + } + + public void clearOp(){ + stack.clear(); + } + + public void undo(){ + if(stack.canUndo()){ + stack.undo(this); + } + } + + public void redo(){ + if(stack.canRedo()){ + stack.redo(this); + } + } + + public boolean canUndo(){ + return stack.canUndo(); + } + + public boolean canRedo(){ + return stack.canRedo(); + } + + public void flushOp(){ + if(currentOp == null || currentOp.isEmpty()) return; + stack.add(currentOp); + currentOp = null; + } + + public void addTileOp(long data){ + if(loading) return; + + if(currentOp == null) currentOp = new DrawOperation(); + currentOp.addOperation(data); + + renderer.updatePoint(TileOp.x(data), TileOp.y(data)); } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index ab494b556a..3124248a32 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.editor; import io.anuke.arc.Core; import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.files.FileHandle; import io.anuke.arc.function.Consumer; import io.anuke.arc.graphics.Color; @@ -23,21 +22,17 @@ import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.MapMeta; -import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block.Icon; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.mindustry.world.blocks.storage.CoreBlock; -import java.io.DataInputStream; -import java.io.InputStream; - import static io.anuke.mindustry.Vars.*; public class MapEditorDialog extends Dialog implements Disposable{ - private MapEditor editor; + public final MapEditor editor; private MapView view; private MapInfoDialog infoDialog; private MapLoadDialog loadDialog; @@ -48,8 +43,6 @@ public class MapEditorDialog extends Dialog implements Disposable{ private boolean shownWithMap = false; private Array blocksOut = new Array<>(); - private ButtonGroup blockgroup; - public MapEditorDialog(){ super("", "dialog"); @@ -89,17 +82,12 @@ public class MapEditorDialog extends Dialog implements Disposable{ createDialog("$editor.import", "$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable) loadDialog::show, "$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable) () -> - Platform.instance.showFileChooser("$loadimage", "Map Files", file -> ui.loadAnd(() -> { + Platform.instance.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> { try{ - DataInputStream stream = new DataInputStream(file.read()); - - MapMeta meta = MapIO.readMapMeta(stream); - MapTileData data = MapIO.readTileData(stream, meta, false); - - editor.beginEdit(data, meta.tags, false); - view.clearStack(); + //TODO what if it's an image? users should be warned for their stupidity + editor.beginEdit(MapIO.readMap(file, true)); }catch(Exception e){ - ui.showError(Core.bundle.format("editor.errorimageload", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); Log.err(e); } }), true, mapExtension), @@ -108,39 +96,32 @@ public class MapEditorDialog extends Dialog implements Disposable{ Platform.instance.showFileChooser("$loadimage", "Image Files", file -> ui.loadAnd(() -> { try{ - MapTileData data = MapIO.readLegacyPixmap(new Pixmap(file)); - - editor.beginEdit(data, editor.getTags(), false); - view.clearStack(); + Pixmap pixmap = new Pixmap(file); + Tile[][] tiles = editor.createTiles(pixmap.getWidth(), pixmap.getHeight()); + editor.load(() -> MapIO.readLegacyPixmap(pixmap, tiles)); + editor.beginEdit(tiles); }catch (Exception e){ - ui.showError(Core.bundle.format("editor.errorimageload", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); Log.err(e); } - }), true, "png") - )); + }), true, "png"))); - t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> createDialog("$editor.export", - "$editor.exportfile", "$editor.exportfile.description", "icon-file", (Runnable) () -> - Platform.instance.showFileChooser("$saveimage", "Map Files", file -> { + t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> + Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> { file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension); FileHandle result = file; ui.loadAnd(() -> { - try{ if(!editor.getTags().containsKey("name")){ editor.getTags().put("name", result.nameWithoutExtension()); } - MapIO.writeMap(result.write(false), editor.getTags(), editor.getMap()); + MapIO.writeMap(result, editor.createMap(result), editor.tiles()); }catch(Exception e){ - ui.showError(Core.bundle.format("editor.errorimagesave", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, false))); Log.err(e); } }); - }, false, mapExtension))); - - t.row(); - - t.row(); + }, false, mapExtension)); }); menu.cont.row(); @@ -151,24 +132,19 @@ public class MapEditorDialog extends Dialog implements Disposable{ }).padTop(-5).size(swidth * 2f + 10, 60f); resizeDialog = new MapResizeDialog(editor, (x, y) -> { - if(!(editor.getMap().width() == x && editor.getMap().height() == y)){ + if(!(editor.width() == x && editor.height() == y)){ ui.loadAnd(() -> { editor.resize(x, y); - view.clearStack(); }); } }); loadDialog = new MapLoadDialog(map -> ui.loadAnd(() -> { - try(DataInputStream stream = new DataInputStream(map.stream.get())){ - MapMeta meta = MapIO.readMapMeta(stream); - MapTileData data = MapIO.readTileData(stream, meta, false); - - editor.beginEdit(data, meta.tags, false); - view.clearStack(); + try{ + editor.beginEdit(map); }catch(Exception e){ - ui.showError(Core.bundle.format("editor.errorimageload", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); Log.err(e); } })); @@ -200,10 +176,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ shown(() -> { saved = true; Platform.instance.beginForceLandscape(); - view.clearStack(); + editor.clearOp(); Core.scene.setScrollFocus(view); if(!shownWithMap){ - editor.beginEdit(new MapTileData(200, 200), new ObjectMap<>(), true); + editor.beginEdit(200, 200); } shownWithMap = false; @@ -211,6 +187,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ }); hidden(() -> { + editor.clearOp(); Platform.instance.updateRPC(); Platform.instance.endForceLandscape(); }); @@ -225,13 +202,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ String name = editor.getTags().get("name", ""); if(name.isEmpty()){ - ui.showError("$editor.save.noname"); + infoDialog.show(); + Core.app.post(() -> ui.showError("$editor.save.noname")); }else{ - Map map = world.maps.getByName(name); + Map map = world.maps.all().find(m -> m.name().equals(name)); if(map != null && !map.custom){ ui.showError("$editor.save.overwrite"); }else{ - world.maps.saveMap(name, editor.getMap(), editor.getTags()); + world.maps.saveMap(editor.getTags(), editor.tiles()); ui.showInfoFade("$editor.saved"); } } @@ -293,18 +271,16 @@ public class MapEditorDialog extends Dialog implements Disposable{ editor.renderer().dispose(); } - public void beginEditMap(InputStream is){ + public void beginEditMap(FileHandle file){ ui.loadAnd(() -> { try{ + Map map = MapIO.readMap(file, true); shownWithMap = true; - DataInputStream stream = new DataInputStream(is); - MapMeta meta = MapIO.readMapMeta(stream); - editor.beginEdit(MapIO.readTileData(stream, meta, false), meta.tags, false); - is.close(); + editor.beginEdit(map); show(); }catch(Exception e){ Log.err(e); - ui.showError(Core.bundle.format("editor.errorimageload", Strings.parseException(e, false))); + ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); } }); } @@ -317,16 +293,6 @@ public class MapEditorDialog extends Dialog implements Disposable{ saved = false; } - public void updateSelectedBlock(){ - Block block = editor.getDrawBlock(); - for(int j = 0; j < Vars.content.blocks().size; j++){ - if(block.id == j && j < blockgroup.getButtons().size){ - blockgroup.getButtons().get(j).setChecked(true); - break; - } - } - } - public boolean hasPane(){ return Core.scene.getScrollFocus() == pane || Core.scene.getKeyboardFocus() != this; } @@ -370,15 +336,15 @@ public class MapEditorDialog extends Dialog implements Disposable{ tools.row(); - ImageButton undo = tools.addImageButton("icon-undo", "clear", 16 * 2f, () -> view.undo()).get(); - ImageButton redo = tools.addImageButton("icon-redo", "clear", 16 * 2f, () -> view.redo()).get(); + ImageButton undo = tools.addImageButton("icon-undo", "clear", 16 * 2f, editor::undo).get(); + ImageButton redo = tools.addImageButton("icon-redo", "clear", 16 * 2f, editor::redo).get(); addTool.accept(EditorTool.pick); tools.row(); - undo.setDisabled(() -> !view.getStack().canUndo()); - redo.setDisabled(() -> !view.getStack().canRedo()); + undo.setDisabled(() -> !editor.canUndo()); + redo.setDisabled(() -> !editor.canRedo()); undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.GRAY : Color.WHITE)); redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.GRAY : Color.WHITE)); @@ -393,9 +359,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ addTool.accept(EditorTool.fill); addTool.accept(EditorTool.spray); - ImageButton rotate = tools.addImageButton("icon-arrow-16", "clear", 16 * 2f, () -> editor.setDrawRotation((editor.getDrawRotation() + 1) % 4)).get(); + ImageButton rotate = tools.addImageButton("icon-arrow-16", "clear", 16 * 2f, () -> editor.rotation = (editor.rotation + 1) % 4).get(); rotate.getImage().update(() -> { - rotate.getImage().setRotation(editor.getDrawRotation() * 90); + rotate.getImage().setRotation(editor.rotation * 90); rotate.getImage().setOrigin(Align.center); }); @@ -415,8 +381,8 @@ public class MapEditorDialog extends Dialog implements Disposable{ button.margin(4f); button.getImageCell().grow(); button.getStyle().imageUpColor = team.color; - button.clicked(() -> editor.setDrawTeam(team)); - button.update(() -> button.setChecked(editor.getDrawTeam() == team)); + button.clicked(() -> editor.drawTeam = team); + button.update(() -> button.setChecked(editor.drawTeam == team)); teamgroup.add(button); tools.add(button); @@ -429,7 +395,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ mid.table("underline", t -> { Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false); - slider.moved(f -> editor.setBrushSize(MapEditor.brushSizes[(int) (float) f])); + slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int) (float) f]); t.top(); t.add("$editor.brush"); @@ -456,22 +422,28 @@ public class MapEditorDialog extends Dialog implements Disposable{ } } + if(Core.input.keyTap(KeyCode.ESCAPE)){ + if(!menu.isShown()){ + menu.show(); + } + } + if(Core.input.keyTap(KeyCode.R)){ - editor.setDrawRotation((editor.getDrawRotation() + 1) % 4); + editor.rotation = Mathf.mod(editor.rotation + 1, 4); } if(Core.input.keyTap(KeyCode.E)){ - editor.setDrawRotation(Mathf.mod((editor.getDrawRotation() + 1), 4)); + editor.rotation = Mathf.mod(editor.rotation - 1, 4); } //ctrl keys (undo, redo, save) if(UIUtils.ctrl()){ if(Core.input.keyTap(KeyCode.Z)){ - view.undo(); + editor.undo(); } if(Core.input.keyTap(KeyCode.Y)){ - view.redo(); + editor.redo(); } if(Core.input.keyTap(KeyCode.S)){ @@ -498,7 +470,6 @@ public class MapEditorDialog extends Dialog implements Disposable{ pane.setFadeScrollBars(false); pane.setOverscroll(true, false); ButtonGroup group = new ButtonGroup<>(); - blockgroup = group; int i = 0; @@ -521,9 +492,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ ImageButton button = new ImageButton("white", "clear-toggle"); button.getStyle().imageUp = new TextureRegionDrawable(region); - button.clicked(() -> editor.setDrawBlock(block)); + button.clicked(() -> editor.drawBlock = block); button.resizeImage(8 * 4f); - button.update(() -> button.setChecked(editor.getDrawBlock() == block)); + button.update(() -> button.setChecked(editor.drawBlock == block)); group.add(button); content.add(button).size(50f); @@ -534,7 +505,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ group.getButtons().get(2).setChecked(true); - table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().localizedName).width(200f).center()).growX(); + table.table("underline", extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX(); table.row(); table.add(pane).growY().fillX(); } diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index 3e661997a0..d7fb5ab6c1 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -9,14 +9,12 @@ import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Disposable; -import io.anuke.arc.util.Pack; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.IndexedRenderer; -import io.anuke.mindustry.maps.MapTileData.DataPosition; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; -import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.tilesize; public class MapRenderer implements Disposable{ @@ -102,27 +100,24 @@ public class MapRenderer implements Disposable{ private void render(int wx, int wy){ int x = wx / chunksize, y = wy / chunksize; IndexedRenderer mesh = chunks[x][y]; - byte bf = editor.getMap().read(wx, wy, DataPosition.floor); - byte bw = editor.getMap().read(wx, wy, DataPosition.wall); - byte btr = editor.getMap().read(wx, wy, DataPosition.rotationTeam); - byte rotation = Pack.leftByte(btr); - Team team = Team.all[Pack.rightByte(btr)]; + Tile tile = editor.tiles()[wx][wy]; - Block floor = content.block(bf); - Block wall = content.block(bw); + Team team = tile.getTeam(); + Block floor = tile.floor(); + Block wall = tile.block(); TextureRegion region; int idxWall = (wx % chunksize) + (wy % chunksize) * chunksize; int idxDecal = (wx % chunksize) + (wy % chunksize) * chunksize + chunksize * chunksize; - if(bw != 0 && (wall.synthetic() || wall == Blocks.part)){ + if(wall != Blocks.air && (wall.synthetic() || wall == Blocks.part)){ region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); if(wall.rotate){ mesh.draw(idxWall, region, wx * tilesize + wall.offset(), wy * tilesize + wall.offset(), - region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, rotation * 90 - 90); + region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, tile.getRotation() * 90 - 90); }else{ mesh.draw(idxWall, region, wx * tilesize + wall.offset() + (tilesize - region.getWidth() * Draw.scl)/2f, @@ -140,10 +135,12 @@ public class MapRenderer implements Disposable{ if(wall.update || wall.destructible){ mesh.setColor(team.color); region = Core.atlas.find("block-border-editor"); - }else if(!wall.synthetic() && bw != 0){ + }else if(!wall.synthetic() && wall != Blocks.air){ region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); offsetX = tilesize/2f - region.getWidth()/2f * Draw.scl; offsetY = tilesize/2f - region.getHeight()/2f * Draw.scl; + }else if(wall == Blocks.air && tile.oreBlock() != null){ + region = tile.oreBlock().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.oreBlock().editorVariantRegions().length-1)];; }else{ region = Core.atlas.find("clear-editor"); } diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java index b0a9ec2cfb..fb6c4f6adb 100644 --- a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java @@ -1,22 +1,20 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.BiConsumer; +import io.anuke.arc.function.IntPositionConsumer; import io.anuke.arc.math.Mathf; import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.ui.dialogs.FloatingDialog; public class MapResizeDialog extends FloatingDialog{ private static final int minSize = 50, maxSize = 500, increment = 50; int width, height; - public MapResizeDialog(MapEditor editor, BiConsumer cons){ + public MapResizeDialog(MapEditor editor, IntPositionConsumer cons){ super("$editor.resizemap"); shown(() -> { cont.clear(); - MapTileData data = editor.getMap(); - width = data.width(); - height = data.height(); + width = editor.width(); + height = editor.height(); Table table = new Table(); diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java index 7d00f33d22..bcac2914e9 100644 --- a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java @@ -24,7 +24,7 @@ public class MapSaveDialog extends FloatingDialog{ shown(() -> { cont.clear(); cont.label(() -> { - Map map = world.maps.getByName(field.getText()); + Map map = world.maps.byName(field.getText()); if(map != null){ if(map.custom){ return "$editor.overwrite"; @@ -69,7 +69,7 @@ public class MapSaveDialog extends FloatingDialog{ if(field.getText().isEmpty()){ return true; } - Map map = world.maps.getByName(field.getText()); + Map map = world.maps.byName(field.getText()); return map != null && !map.custom; } } diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index d382439978..bf115b9f8c 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -18,7 +18,6 @@ import io.anuke.arc.scene.event.Touchable; import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.editor.DrawOperation.TileOperation; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.ui.GridImage; @@ -29,8 +28,9 @@ import static io.anuke.mindustry.Vars.ui; public class MapView extends Element implements GestureListener{ private MapEditor editor; private EditorTool tool = EditorTool.pencil; - private OperationStack stack = new OperationStack(); - private DrawOperation op; + //private OperationStack stack = new OperationStack(); + //private DrawOperation op; + //private GridBits used; private Bresenham2 br = new Bresenham2(); private boolean updated = false; private float offsetx, offsety; @@ -87,8 +87,6 @@ public class MapView extends Element implements GestureListener{ mousex = x; mousey = y; - op = new DrawOperation(editor.getMap()); - updated = false; Point2 p = project(x, y); @@ -135,12 +133,7 @@ public class MapView extends Element implements GestureListener{ updated = true; } - if(op != null && updated){ - if(!op.isEmpty()){ - stack.add(op); - } - op = null; - } + editor.flushOp(); if(button == KeyCode.MOUSE_MIDDLE && lastTool != null){ tool = lastTool; @@ -190,14 +183,6 @@ public class MapView extends Element implements GestureListener{ this.tool = tool; } - public void clearStack(){ - stack.clear(); - } - - public OperationStack getStack(){ - return stack; - } - public boolean isGrid(){ return grid; } @@ -206,26 +191,6 @@ public class MapView extends Element implements GestureListener{ this.grid = grid; } - public void undo(){ - if(stack.canUndo()){ - stack.undo(editor); - } - } - - public void redo(){ - if(stack.canRedo()){ - stack.redo(editor); - } - } - - public void addTileOp(TileOperation t){ - op.addOperation(t); - } - - public boolean checkForDuplicates(short x, short y){ - return op.checkDuplicate(x, y); - } - @Override public void act(float delta){ super.act(delta); @@ -259,14 +224,14 @@ public class MapView extends Element implements GestureListener{ } private Point2 project(float x, float y){ - float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height()); + float ratio = 1f / ((float) editor.width() / editor.height()); float size = Math.min(width, height); float sclwidth = size * zoom; float sclheight = size * zoom * ratio; - x = (x - getWidth() / 2 + sclwidth / 2 - offsetx * zoom) / sclwidth * editor.getMap().width(); - y = (y - getHeight() / 2 + sclheight / 2 - offsety * zoom) / sclheight * editor.getMap().height(); + x = (x - getWidth() / 2 + sclwidth / 2 - offsetx * zoom) / sclwidth * editor.width(); + y = (y - getHeight() / 2 + sclheight / 2 - offsety * zoom) / sclheight * editor.height(); - if(editor.getDrawBlock().size % 2 == 0 && tool != EditorTool.eraser){ + if(editor.drawBlock.size % 2 == 0 && tool != EditorTool.eraser){ return Tmp.g1.set((int) (x - 0.5f), (int) (y - 0.5f)); }else{ return Tmp.g1.set((int) x, (int) y); @@ -274,26 +239,26 @@ public class MapView extends Element implements GestureListener{ } private Vector2 unproject(int x, int y){ - float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height()); + float ratio = 1f / ((float) editor.width() / editor.height()); float size = Math.min(width, height); float sclwidth = size * zoom; float sclheight = size * zoom * ratio; - float px = ((float) x / editor.getMap().width()) * sclwidth + offsetx * zoom - sclwidth / 2 + getWidth() / 2; - float py = ((float) (y) / editor.getMap().height()) * sclheight + float px = ((float) x / editor.width()) * sclwidth + offsetx * zoom - sclwidth / 2 + getWidth() / 2; + float py = ((float) (y) / editor.height()) * sclheight + offsety * zoom - sclheight / 2 + getHeight() / 2; return vec.set(px, py); } @Override public void draw(){ - float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height()); + float ratio = 1f / ((float) editor.width() / editor.height()); float size = Math.min(width, height); float sclwidth = size * zoom; float sclheight = size * zoom * ratio; float centerx = x + width / 2 + offsetx * zoom; float centery = y + height / 2 + offsety * zoom; - image.setImageSize(editor.getMap().width(), editor.getMap().height()); + image.setImageSize(editor.width(), editor.height()); if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){ return; @@ -318,18 +283,18 @@ public class MapView extends Element implements GestureListener{ int index = 0; for(int i = 0; i < MapEditor.brushSizes.length; i++){ - if(editor.getBrushSize() == MapEditor.brushSizes[i]){ + if(editor.brushSize == MapEditor.brushSizes[i]){ index = i; break; } } - float scaling = zoom * Math.min(width, height) / editor.getMap().width(); + float scaling = zoom * Math.min(width, height) / editor.width(); Draw.color(Pal.accent); Lines.stroke(Unit.dp.scl(2f)); - if((!editor.getDrawBlock().isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){ + if((!editor.drawBlock.isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){ if(tool == EditorTool.line && drawing){ Vector2 v1 = unproject(startx, starty).add(x, y); float sx = v1.x, sy = v1.y; @@ -348,11 +313,11 @@ public class MapView extends Element implements GestureListener{ if((tool.edit || tool == EditorTool.line) && (!mobile || drawing)){ Point2 p = project(mousex, mousey); Vector2 v = unproject(p.x, p.y).add(x, y); - float offset = (editor.getDrawBlock().size % 2 == 0 ? scaling / 2f : 0f); + float offset = (editor.drawBlock.size % 2 == 0 ? scaling / 2f : 0f); Lines.square( v.x + scaling / 2f + offset, v.y + scaling / 2f + offset, - scaling * editor.getDrawBlock().size / 2f); + scaling * editor.drawBlock.size / 2f); } } diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 047a9d0dd5..39bec65fce 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -252,10 +252,10 @@ public interface BuilderTrait extends Entity, TeamTrait{ TileEntity core = unit.getClosestCore(); if(core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > mineDistance - || tile.floor().itemDrop == null || !unit.acceptsItem(tile.floor().itemDrop) || !canMine(tile.floor().itemDrop)){ + || tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){ setMineTile(null); }else{ - Item item = tile.floor().itemDrop; + Item item = tile.drop(); unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(tile.worldx(), tile.worldy()), 0.4f); if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){ diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index be13fa00e1..fa302ada5f 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -269,7 +269,6 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ //TODO better smoke effect, this one is awful if(health != 0 && health < tile.block().health && !(tile.block() instanceof Wall) && Mathf.chance(0.009f * Time.delta() * (1f - health / tile.block().health))){ - Effects.effect(Fx.smoke, x + Mathf.range(4), y + Mathf.range(4)); } diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index 5c938d2b8c..0a8d68a176 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -137,7 +137,7 @@ public class MinimapRenderer implements Disposable{ private int colorFor(Tile tile){ tile = tile.target(); - return MapIO.colorFor(tile.floor(), tile.block(), tile.getTeam()); + return MapIO.colorFor(tile.floor(), tile.block(), tile.oreBlock(), tile.getTeam()); } @Override diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 71a0001de8..75a773d16f 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -230,9 +230,9 @@ public abstract class InputHandler implements InputProcessor{ boolean canMine(Tile tile){ return !Core.scene.hasMouse() - && tile.floor().itemDrop != null && tile.floor().itemDrop.hardness <= player.mech.drillPower + && tile.drop() != null && tile.drop().hardness <= player.mech.drillPower && !tile.floor().playerUnmineable - && player.acceptsItem(tile.floor().itemDrop) + && player.acceptsItem(tile.drop()) && tile.block() == Blocks.air && player.dst(tile.worldx(), tile.worldy()) <= Player.mineDistance; } diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index 7216e315aa..5327ddbdd0 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -7,35 +7,50 @@ import io.anuke.arc.files.FileHandle; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.graphics.Pixmap.Format; +import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Pack; +import io.anuke.arc.util.Strings; import io.anuke.arc.util.Structs; import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.game.MappableContent; import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.Version; import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.MapMeta; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.DataPosition; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.type.ContentType; +import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.CachedTile; import io.anuke.mindustry.world.LegacyColorMapper; import io.anuke.mindustry.world.LegacyColorMapper.LegacyBlock; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.BlockPart; +import io.anuke.mindustry.world.blocks.Floor; import java.io.*; +import java.util.Arrays; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; +import static io.anuke.mindustry.Vars.bufferSize; import static io.anuke.mindustry.Vars.content; -/** - * Reads and writes map files. - */ -//TODO name mapping +/** Reads and writes map files.*/ public class MapIO{ + public static final int version = 1; + private static final int[] pngHeader = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; - private static final int version = 0; - private static IntIntMap defaultBlockMap = new IntIntMap(); + private static ObjectMap missingBlocks; + + private static void initBlocks(){ + if(missingBlocks != null) return; + + missingBlocks = ObjectMap.of( + "stained-stone", Blocks.moss + ); + } public static boolean isImage(FileHandle file){ - try(InputStream stream = file.read()){ + try(InputStream stream = file.read(32)){ for(int i1 : pngHeader){ if(stream.read() != i1){ return false; @@ -47,44 +62,277 @@ public class MapIO{ } } - private static void loadDefaultBlocks(){ - for(Block block : content.blocks()){ - defaultBlockMap.put(block.id, block.id); - } + public static Pixmap generatePreview(Map map) throws IOException{ + Pixmap floor = new Pixmap(map.width, map.height, Format.RGBA8888); + Pixmap wall = new Pixmap(map.width, map.height, Format.RGBA8888); + int black = Color.rgba8888(Color.BLACK); + CachedTile tile = new CachedTile(){ + @Override + public void setFloor(Floor type){ + floor.drawPixel(x, floor.getHeight() - 1 - y, colorFor(type, Blocks.air, Blocks.air, getTeam())); + } + + @Override + public void setOreByte(byte b){ + if(b != 0) + floor.drawPixel(x, floor.getHeight() - 1 - y, colorFor(floor(), Blocks.air, content.block(b), getTeam())); + } + + @Override + protected void changed(){ + super.changed(); + int c = colorFor(Blocks.air, block(), Blocks.air, getTeam()); + if(c != black) wall.drawPixel(x, floor.getHeight() - 1 - y, c); + } + }; + readTiles(map, (x, y) -> { + tile.x = (short)x; + tile.y = (short)y; + return tile; + }); + floor.drawPixmap(wall, 0, 0); + wall.dispose(); + return floor; } - public static Pixmap generatePixmap(MapTileData data){ - Pixmap pixmap = new Pixmap(data.width(), data.height(), Format.RGBA8888); - data.position(0, 0); - - TileDataMarker marker = data.newDataMarker(); - - for(int y = 0; y < data.height(); y++){ - for(int x = 0; x < data.width(); x++){ - data.read(marker); - Block floor = content.block(marker.floor); - Block wall = content.block(marker.wall); - int color = colorFor(floor, wall, Team.all[marker.team]); - pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, color); + public static Pixmap generatePreview(Tile[][] tiles){ + Pixmap pixmap = new Pixmap(tiles.length, tiles[0].length, Format.RGBA8888); + for(int x = 0; x < pixmap.getWidth(); x++){ + for(int y = 0; y < pixmap.getHeight(); y++){ + Tile tile = tiles[x][y]; + pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.oreBlock(), tile.getTeam())); } } - - data.position(0, 0); - return pixmap; } - /**Reads a pixmap in the old (3.5) map format.*/ - public static MapTileData readLegacyPixmap(Pixmap pixmap){ - MapTileData data = new MapTileData(pixmap.getWidth(), pixmap.getHeight()); + public static int colorFor(Block floor, Block wall, Block ore, Team team){ + if(wall.synthetic()){ + return team.intColor; + } + return Color.rgba8888(wall.solid ? wall.color : ore == Blocks.air ? floor.color : ore.color); + } - for(int x = 0; x < data.width(); x++){ - for(int y = 0; y < data.height(); y++){ + public static void writeMap(FileHandle file, Map map, Tile[][] tiles) throws IOException{ + OutputStream output = file.write(false, bufferSize); + + { + DataOutputStream stream = new DataOutputStream(output); + stream.writeInt(version); + stream.writeInt(Version.build); + stream.writeShort(tiles.length); + stream.writeShort(tiles[0].length); + stream.writeByte((byte)map.tags.size); + + for(Entry entry : map.tags.entries()){ + stream.writeUTF(entry.key); + stream.writeUTF(entry.value); + } + } + + try(DataOutputStream stream = new DataOutputStream(new DeflaterOutputStream(output))){ + int width = map.width, height = map.height; + + SaveIO.getSaveWriter().writeContentHeader(stream); + + //floor first + for(int i = 0; i < tiles.length * tiles[0].length; i++){ + Tile tile = tiles[i % width][i / width]; + stream.writeByte(tile.getFloorID()); + stream.writeByte(tile.getOreByte()); + int consecutives = 0; + + for(int j = i + 1; j < width * height && consecutives < 255; j++){ + Tile nextTile = tiles[j % width][j / width]; + + if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getOreByte() != tile.getOreByte()){ + break; + } + + consecutives++; + } + + stream.writeByte(consecutives); + i += consecutives; + } + + //then blocks + for(int i = 0; i < tiles.length * tiles[0].length; i++){ + Tile tile = tiles[i % width][i / width]; + stream.writeByte(tile.getBlockID()); + + if(tile.block() instanceof BlockPart){ + stream.writeByte(tile.link); + }else if(tile.entity != null){ + stream.writeByte(Pack.byteByte(tile.getTeamID(), tile.getRotation())); //team + rotation + stream.writeShort((short)tile.entity.health); //health + tile.entity.writeConfig(stream); + }else{ + //write consecutive non-entity blocks + int consecutives = 0; + + for(int j = i + 1; j < width * height && consecutives < 255; j++){ + Tile nextTile = tiles[j % width][j / width]; + + if(nextTile.block() != tile.block()){ + break; + } + + consecutives++; + } + + stream.writeByte(consecutives); + i += consecutives; + } + } + } + } + + public static Map readMap(FileHandle file, boolean custom) throws IOException{ + try(DataInputStream stream = new DataInputStream(file.read(1024))){ + ObjectMap tags = new ObjectMap<>(); + + //meta is uncompressed + int version = stream.readInt(); + if(version == 0){ + return readLegacyMap(file, custom); + } + int build = stream.readInt(); + short width = stream.readShort(), height = stream.readShort(); + byte tagAmount = stream.readByte(); + + for(int i = 0; i < tagAmount; i++){ + String name = stream.readUTF(); + String value = stream.readUTF(); + tags.put(name, value); + } + + return new Map(file, width, height, tags, custom, version, build); + } + } + + /**Reads tiles from a map, version-agnostic.*/ + public static void readTiles(Map map, Tile[][] tiles) throws IOException{ + readTiles(map, (x, y) -> tiles[x][y]); + } + + /**Reads tiles from a map, version-agnostic.*/ + public static void readTiles(Map map, TileProvider tiles) throws IOException{ + if(map.version == 0){ + readLegacyMmapTiles(map.file, tiles); + }else if(map.version == version){ + readTiles(map.file, map.width, map.height, tiles); + }else{ + throw new IOException("Unknown map version. What?"); + } + } + + /**Reads tiles from a map in the new build-65 format.*/ + private static void readTiles(FileHandle file, int width, int height, Tile[][] tiles) throws IOException{ + readTiles(file, width, height, (x, y) -> tiles[x][y]); + } + + /**Reads tiles from a map in the new build-65 format.*/ + private static void readTiles(FileHandle file, int width, int height, TileProvider tiles) throws IOException{ + try(BufferedInputStream input = file.read(bufferSize)){ + + //read map + { + DataInputStream stream = new DataInputStream(input); + + stream.readInt(); //version + stream.readInt(); //build + stream.readInt(); //width + height + byte tagAmount = stream.readByte(); + + for(int i = 0; i < tagAmount; i++){ + stream.readUTF(); //key + stream.readUTF(); //val + } + } + + try(DataInputStream stream = new DataInputStream(new InflaterInputStream(input))){ + + MappableContent[][] c = SaveIO.getSaveWriter().readContentHeader(stream); + + try{ + content.setTemporaryMapper(c); + + //read floor and create tiles first + for(int i = 0; i < width * height; i++){ + int x = i % width, y = i / width; + byte floorid = stream.readByte(); + byte oreid = stream.readByte(); + int consecutives = stream.readUnsignedByte(); + + Tile tile = tiles.get(x, y); + tile.setFloor((Floor)content.block(floorid)); + tile.setOreByte(oreid); + + for(int j = i + 1; j < i + 1 + consecutives; j++){ + int newx = j % width, newy = j / width; + Tile newTile = tiles.get(newx, newy); + newTile.setFloor((Floor)content.block(floorid)); + newTile.setOreByte(oreid); + } + + i += consecutives; + } + + //read blocks + for(int i = 0; i < width * height; i++){ + int x = i % width, y = i / width; + Block block = content.block(stream.readByte()); + + Tile tile = tiles.get(x, y); + tile.setBlock(block); + + if(block == Blocks.part){ + tile.link = stream.readByte(); + }else if(tile.entity != null){ + byte tr = stream.readByte(); + short health = stream.readShort(); + + byte team = Pack.leftByte(tr); + byte rotation = Pack.rightByte(tr); + + tile.setTeam(Team.all[team]); + tile.entity.health = health; + tile.setRotation(rotation); + + tile.entity.readConfig(stream); + }else{ //no entity/part, read consecutives + int consecutives = stream.readUnsignedByte(); + + for(int j = i + 1; j < i + 1 + consecutives; j++){ + int newx = j % width, newy = j / width; + tiles.get(newx, newy).setBlock(block); + } + + i += consecutives; + } + } + + }finally{ + content.setTemporaryMapper(null); + } + } + } + } + + //region legacy IO + + /**Reads a pixmap in the 3.5 pixmap format.*/ + public static void readLegacyPixmap(Pixmap pixmap, Tile[][] tiles){ + for(int x = 0; x < pixmap.getWidth(); x++){ + for(int y = 0; y < pixmap.getHeight(); y++){ int color = pixmap.getPixel(x, pixmap.getHeight() - 1 - y); LegacyBlock block = LegacyColorMapper.get(color); + Tile tile = tiles[x][y]; - data.write(x, y, DataPosition.floor, block.floor.id); - data.write(x, y, DataPosition.wall, block.wall.id); + tile.setFloor(block.floor); + tile.setBlock(block.wall); + if(block.ore != null) tile.setOre(block.ore); //place core if(color == Color.rgba8888(Color.GREEN)){ @@ -93,121 +341,133 @@ public class MapIO{ int worldx = dx - 1 + x; int worldy = dy - 1 + y; + //multiblock parts if(Structs.inBounds(worldx, worldy, pixmap.getWidth(), pixmap.getHeight())){ - data.write(worldx, worldy, DataPosition.wall, Blocks.part.id); - data.write(worldx, worldy, DataPosition.rotationTeam, Pack.byteByte((byte)0, (byte)Team.blue.ordinal())); - data.write(worldx, worldy, DataPosition.link, Pack.byteByte((byte) (dx - 1 + 8), (byte) (dy - 1 + 8))); + Tile write = tiles[worldx][worldy]; + write.setBlock(Blocks.part); + write.setTeam(Team.blue); + write.setLinkByte(Pack.byteByte((byte) (dx - 1 + 8), (byte) (dy - 1 + 8))); } } } - data.write(x, y, DataPosition.wall, Blocks.coreShard.id); - data.write(x, y, DataPosition.rotationTeam, Pack.byteByte((byte)0, (byte)Team.blue.ordinal())); + //actual core parts + tile.setBlock(Blocks.coreShard); + tile.setTeam(Team.blue); } } } - - return data; } - public static void writeMap(OutputStream stream, ObjectMap tags, MapTileData data) throws IOException{ - if(defaultBlockMap == null){ - loadDefaultBlocks(); - } - - MapMeta meta = new MapMeta(version, tags, data.width(), data.height(), defaultBlockMap); - - DataOutputStream ds = new DataOutputStream(stream); - - writeMapMeta(ds, meta); - ds.write(data.toArray()); - - ds.close(); + /**Reads a pixmap in the old 4.0 .mmap format.*/ + private static void readLegacyMmapTiles(FileHandle file, Tile[][] tiles) throws IOException{ + readLegacyMmapTiles(file, (x, y) -> tiles[x][y]); } - /** - * Reads tile data, skipping meta. - */ - public static MapTileData readTileData(DataInputStream stream, boolean readOnly) throws IOException{ - MapMeta meta = readMapMeta(stream); - return readTileData(stream, meta, readOnly); - } + /**Reads a mmap in the old 4.0 .mmap format.*/ + private static void readLegacyMmapTiles(FileHandle file, TileProvider tiles) throws IOException{ + try(DataInputStream stream = new DataInputStream(file.read(bufferSize))){ + stream.readInt(); //version + byte tagAmount = stream.readByte(); + for(int i = 0; i < tagAmount; i++){ + stream.readUTF(); //key + stream.readUTF(); //val + } - /** - * Does not skip meta. Call after reading meta. - */ - public static MapTileData readTileData(DataInputStream stream, MapMeta meta, boolean readOnly) throws IOException{ - byte[] bytes = new byte[stream.available()]; - stream.readFully(bytes); - return new MapTileData(bytes, meta.width, meta.height, meta.blockMap, readOnly); - } - - /** - * Reads tile data, skipping meta tags. - */ - public static MapTileData readTileData(Map map, boolean readOnly){ - try(DataInputStream ds = new DataInputStream(map.stream.get())){ - return MapIO.readTileData(ds, readOnly); - }catch(IOException e){ - throw new RuntimeException(e); - } - } - - public static MapMeta readMapMeta(DataInputStream stream) throws IOException{ - ObjectMap tags = new ObjectMap<>(); - IntIntMap map = new IntIntMap(); - - int version = stream.readInt(); - - byte tagAmount = stream.readByte(); - - for(int i = 0; i < tagAmount; i++){ - String name = stream.readUTF(); - String value = stream.readUTF(); - tags.put(name, value); - } - - short blocks = stream.readShort(); - for(int i = 0; i < blocks; i++){ - short id = stream.readShort(); - String name = stream.readUTF(); - Block block = content.getByName(ContentType.block, name); - if(block == null){ - block = Blocks.air; + initBlocks(); + + //block id -> real id map + IntIntMap map = new IntIntMap(); + IntIntMap oreMap = new IntIntMap(); + + short blocks = stream.readShort(); + for(int i = 0; i < blocks; i++){ + short id = stream.readShort(); + String name = stream.readUTF(); + Block block = content.getByName(ContentType.block, name); + if(block == null){ + //substitute for replacement in missingBlocks if possible + if(missingBlocks.containsKey(name)){ + block = missingBlocks.get(name); + }else if(name.startsWith("ore-")){ //an ore floor combination + String[] split = name.split("-"); + String itemName = split[1], floorName = Strings.join("-", Arrays.copyOfRange(split, 2, split.length)); + Item item = content.getByName(ContentType.item, itemName); + Block oreBlock = item == null ? null : content.getByName(ContentType.block, "ore-" + item.name); + Block floor = missingBlocks.get(floorName, content.getByName(ContentType.block, floorName)); + if(oreBlock != null && floor != null){ + oreMap.put(id, oreBlock.id); + block = floor; + }else{ + block = Blocks.air; + } + }else{ + block = Blocks.air; + } + + } + map.put(id, block.id); + } + short width = stream.readShort(), height = stream.readShort(); + + for(int y = 0; y < height; y++){ + for(int x = 0; x < width; x++){ + Tile tile = tiles.get(x, y); + byte floorb = stream.readByte(); + byte blockb = stream.readByte(); + byte link = stream.readByte(); + byte rotTeamb = stream.readByte(); + stream.readByte();//unused stuff + + tile.setFloor((Floor)content.block(map.get(floorb, 0))); + tile.setBlock(content.block(map.get(blockb, 0))); + tile.setRotation(Pack.leftByte(rotTeamb)); + if(tile.block().synthetic()){ + tile.setTeam(Team.all[Mathf.clamp(Pack.rightByte(rotTeamb), 0, Team.all.length)]); + } + + if(tile.block() == Blocks.part){ + tile.setLinkByte(link); + } + + if(oreMap.containsKey(floorb)){ + tile.setOreByte((byte)oreMap.get(floorb, 0)); + } + } } - map.put(id, block.id); } - - int width = stream.readShort(); - int height = stream.readShort(); - - return new MapMeta(version, tags, width, height, map); } - public static void writeMapMeta(DataOutputStream stream, MapMeta meta) throws IOException{ - stream.writeInt(meta.version); - stream.writeByte((byte) meta.tags.size); + private static Map readLegacyMap(FileHandle file, boolean custom) throws IOException{ + try(DataInputStream stream = new DataInputStream(file.read(bufferSize))){ + ObjectMap tags = new ObjectMap<>(); - for(Entry entry : meta.tags.entries()){ - stream.writeUTF(entry.key); - stream.writeUTF(entry.value); + int version = stream.readInt(); + if(version != 0) throw new IOException("Attempted to read non-legacy map in legacy method!"); + byte tagAmount = stream.readByte(); + + for(int i = 0; i < tagAmount; i++){ + String name = stream.readUTF(); + String value = stream.readUTF(); + tags.put(name, value); + } + + short blocks = stream.readShort(); + for(int i = 0; i < blocks; i++){ + stream.readShort(); + stream.readUTF(); + } + short width = stream.readShort(), height = stream.readShort(); + + //note that build 64 is the default build of all maps <65; while this can be inaccurate it's better than nothing + return new Map(file, width, height, tags, custom, 0, 64); } - - stream.writeShort(content.blocks().size); - for(Block block : content.blocks()){ - stream.writeShort(block.id); - stream.writeUTF(block.name); - } - - stream.writeShort(meta.width); - stream.writeShort(meta.height); } - public static int colorFor(Block floor, Block wall, Team team){ - if(wall.synthetic()){ - return team.intColor; - } - return Color.rgba8888(wall.solid ? wall.color : floor.color); + //endregion + + interface TileProvider{ + Tile get(int x, int y); } -} +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index e304816eef..01b30712af 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -14,8 +14,8 @@ import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.type.ContentType; +import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.BlockPart; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -43,18 +43,37 @@ public abstract class SaveFileVersion{ } public void writeMap(DataOutputStream stream) throws IOException{ - //write world size stream.writeShort(world.width()); stream.writeShort(world.height()); + //floor first for(int i = 0; i < world.width() * world.height(); i++){ Tile tile = world.tile(i % world.width(), i / world.width()); - stream.writeByte(tile.getFloorID()); + stream.writeByte(tile.getOreByte()); + int consecutives = 0; + + for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ + Tile nextTile = world.tile(j % world.width(), j / world.width()); + + if(nextTile.getFloorID() != tile.getFloorID() || nextTile.getOreByte() != tile.getOreByte()){ + break; + } + + consecutives++; + } + + stream.writeByte(consecutives); + i += consecutives; + } + + //blocks + for(int i = 0; i < world.width() * world.height(); i++){ + Tile tile = world.tile(i % world.width(), i / world.width()); stream.writeByte(tile.getBlockID()); - if(tile.block() instanceof BlockPart){ + if(tile.block() == Blocks.part){ stream.writeByte(tile.link); }else if(tile.entity != null){ stream.writeByte(Pack.byteByte(tile.getTeamID(), tile.getRotation())); //team + rotation @@ -67,13 +86,14 @@ public abstract class SaveFileVersion{ tile.entity.writeConfig(stream); tile.entity.write(stream); - }else if(tile.block() == Blocks.air){ + }else{ + //write consecutive non-entity blocks int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ Tile nextTile = world.tile(j % world.width(), j / world.width()); - if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air){ + if(nextTile.block() != tile.block()){ break; } @@ -94,14 +114,34 @@ public abstract class SaveFileVersion{ Tile[][] tiles = world.createTiles(width, height); + //read floor and create tiles first for(int i = 0; i < width * height; i++){ int x = i % width, y = i / width; byte floorid = stream.readByte(); - byte wallid = stream.readByte(); + byte oreid = stream.readByte(); + int consecutives = stream.readUnsignedByte(); - Tile tile = new Tile(x, y, floorid, wallid); + tiles[x][y] = new Tile(x, y, floorid, (byte)0); + tiles[x][y].setOreByte(oreid); - if(wallid == Blocks.part.id){ + for(int j = i + 1; j < i + 1 + consecutives; j++){ + int newx = j % width, newy = j / width; + Tile newTile = new Tile(newx, newy, floorid, (byte)0); + newTile.setOreByte(oreid); + tiles[newx][newy] = newTile; + } + + i += consecutives; + } + + //read blocks + for(int i = 0; i < width * height; i++){ + int x = i % width, y = i / width; + Block block = content.block(stream.readByte()); + Tile tile = tiles[x][y]; + tile.setBlock(block); + + if(block == Blocks.part){ tile.link = stream.readByte(); }else if(tile.entity != null){ byte tr = stream.readByte(); @@ -121,19 +161,16 @@ public abstract class SaveFileVersion{ tile.entity.readConfig(stream); tile.entity.read(stream); - }else if(wallid == 0){ + }else{ int consecutives = stream.readUnsignedByte(); for(int j = i + 1; j < i + 1 + consecutives; j++){ int newx = j % width, newy = j / width; - Tile newTile = new Tile(newx, newy, floorid, wallid); - tiles[newx][newy] = newTile; + tiles[newx][newy].setBlock(block); } i += consecutives; } - - tiles[x][y] = tile; } content.setTemporaryMapper(null); diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 10846a4268..f7c5b50320 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -48,7 +48,7 @@ public class SaveIO{ } public static DataInputStream getSlotStream(int slot){ - return new DataInputStream(new InflaterInputStream(fileFor(slot).read())); + return new DataInputStream(new InflaterInputStream(fileFor(slot).read(bufferSize))); } public static boolean isSaveValid(int slot){ @@ -60,7 +60,7 @@ public class SaveIO{ } public static boolean isSaveValid(FileHandle file){ - return isSaveValid(new DataInputStream(new InflaterInputStream(file.read()))); + return isSaveValid(new DataInputStream(new InflaterInputStream(file.read(bufferSize)))); } public static boolean isSaveValid(DataInputStream stream){ @@ -95,7 +95,7 @@ public class SaveIO{ } public static void write(FileHandle file){ - write(new DeflaterOutputStream(file.write(false)){ + write(new DeflaterOutputStream(file.write(false, bufferSize)){ byte[] tmp = {0}; public void write(int var1) throws IOException { @@ -120,12 +120,12 @@ public class SaveIO{ public static void load(FileHandle file) throws SaveException{ try{ //try and load; if any exception at all occurs - load(new InflaterInputStream(file.read())); + load(new InflaterInputStream(file.read(bufferSize))); }catch(SaveException e){ e.printStackTrace(); FileHandle backup = file.sibling(file.name() + "-backup." + file.extension()); if(backup.exists()){ - load(new InflaterInputStream(backup.read())); + load(new InflaterInputStream(backup.read(bufferSize))); }else{ throw new SaveException(e.getCause()); } diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index cfe0be8231..d7a97510dc 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -19,7 +19,7 @@ public class SaveMeta{ this.build = build; this.timestamp = timestamp; this.timePlayed = timePlayed; - this.map = world.maps.getByName(map); + this.map = world.maps.all().find(m -> m.fileName().equals(map)); this.wave = wave; this.rules = rules; } diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 40c2c2f371..c1452a21ca 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.io.versions; -import io.anuke.arc.util.Strings; +import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.util.Time; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Serialization; @@ -34,8 +34,8 @@ public class Save16 extends SaveFileVersion{ state.rules.spawns = content.getByID(ContentType.zone, state.rules.zone).rules.get().spawns; } String mapname = stream.readUTF(); - Map map = world.maps.getByName(mapname); - if(map == null) map = new Map(Strings.capitalize(mapname), 1, 1); + Map map = world.maps.all().find(m -> m.fileName().equals(mapname)); + if(map == null) map = new Map(customMapDirectory.child(mapname), 1, 1, new ObjectMap<>(), true); world.setMap(map); int wave = stream.readInt(); @@ -62,7 +62,7 @@ public class Save16 extends SaveFileVersion{ //--GENERAL STATE-- Serialization.writeRules(stream, state.rules); - stream.writeUTF(world.getMap().name); //map name + stream.writeUTF(world.getMap().fileName()); //map name stream.writeInt(state.wave); //wave stream.writeFloat(state.wavetime); //wave countdown diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 2481d42344..9d9c2858d5 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -1,44 +1,75 @@ package io.anuke.mindustry.maps; -import io.anuke.arc.graphics.Texture; +import io.anuke.arc.Core; import io.anuke.arc.collection.ObjectMap; -import io.anuke.arc.function.Supplier; - -import java.io.InputStream; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.graphics.Texture; +import io.anuke.mindustry.io.MapIO; public class Map{ - /** Internal map name. This is the filename, without any extensions.*/ - public final String name; /** Whether this is a custom map.*/ public final boolean custom; /** Metadata. Author description, display name, etc.*/ - public final MapMeta meta; - /** Supplies a new input stream with the data of this map.*/ - public final Supplier stream; + public final ObjectMap tags; + /** Base file of this map.*/ + public final FileHandle file; + /** Format version.*/ + public final int version; + /** Map width/height, shorts.*/ + public int width, height; /** Preview texture.*/ public Texture texture; + /** Build that this map was created in. -1 = unknown or custom build.*/ + public int build; - public Map(String name, MapMeta meta, boolean custom, Supplier streamSupplier){ - this.name = name; + public Map(FileHandle file, int width, int height, ObjectMap tags, boolean custom, int version, int build){ this.custom = custom; - this.meta = meta; - this.stream = streamSupplier; + this.tags = tags; + this.file = file; + this.width = width; + this.height = height; + this.version = version; + this.build = build; } - public Map(String unknownName, int width, int height){ - this(unknownName, new MapMeta(0, new ObjectMap<>(), width, height, null), true, () -> null); + public Map(FileHandle file, int width, int height, ObjectMap tags, boolean custom, int version){ + this(file, width, height, tags, custom, version, -1); + } + + public Map(FileHandle file, int width, int height, ObjectMap tags, boolean custom){ + this(file, width, height, tags, custom, MapIO.version); + } + + public String fileName(){ + return file.nameWithoutExtension(); } public String getDisplayName(){ - return meta.tags.get("name", name); + return tags.get("name", fileName()); + } + + public String author(){ + return tag("author"); + } + + public String description(){ + return tag("description"); + } + + public String name(){ + return tag("name"); + } + + public String tag(String name){ + return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name): Core.bundle.get("unknown"); } @Override public String toString(){ return "Map{" + - "name='" + name + '\'' + + "file='" + file + '\'' + ", custom=" + custom + - ", meta=" + meta + + ", tags=" + tags + '}'; } } diff --git a/core/src/io/anuke/mindustry/maps/MapMeta.java b/core/src/io/anuke/mindustry/maps/MapMeta.java deleted file mode 100644 index 36f815b63f..0000000000 --- a/core/src/io/anuke/mindustry/maps/MapMeta.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.anuke.mindustry.maps; - -import io.anuke.arc.Core; -import io.anuke.arc.collection.IntIntMap; -import io.anuke.arc.collection.ObjectMap; - -//todo: specify preferred game rules here; can be overriden -public class MapMeta{ - public final int version; - public final ObjectMap tags; - public final int width, height; - public final IntIntMap blockMap; - - public MapMeta(int version, ObjectMap tags, int width, int height, IntIntMap blockMap){ - this.version = version; - this.tags = tags; - this.width = width; - this.height = height; - this.blockMap = blockMap; - } - - public String author(){ - return tag("author"); - } - - public String description(){ - return tag("description"); - } - - public String name(){ - return tag("name"); - } - - public String tag(String name){ - return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name): Core.bundle.get("unknown"); - } - - @Override - public String toString(){ - return "MapMeta{" + - "tags=" + tags + - ", width=" + width + - ", height=" + height + - '}'; - } -} diff --git a/core/src/io/anuke/mindustry/maps/MapTileData.java b/core/src/io/anuke/mindustry/maps/MapTileData.java deleted file mode 100644 index e7c550e919..0000000000 --- a/core/src/io/anuke/mindustry/maps/MapTileData.java +++ /dev/null @@ -1,175 +0,0 @@ -package io.anuke.mindustry.maps; - -import io.anuke.arc.collection.IntIntMap; -import io.anuke.arc.util.Pack; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.world.Block; - -import java.nio.ByteBuffer; - -public class MapTileData{ - /** - * Tile size: 5 bytes.
- * 0: ground tile
- * 1: wall tile
- * 2: rotation + team
- * 3: link (x/y)
- * 4: elevation
- */ - private final static int TILE_SIZE = 5; - - private final ByteBuffer buffer; - private final int width, height; - private final boolean readOnly; - - private IntIntMap map; - - public MapTileData(int width, int height){ - this.width = width; - this.height = height; - this.map = null; - this.readOnly = false; - buffer = ByteBuffer.allocate(width * height * TILE_SIZE); - } - - public MapTileData(byte[] bytes, int width, int height, IntIntMap mapping, boolean readOnly){ - buffer = ByteBuffer.wrap(bytes); - this.width = width; - this.height = height; - this.map = mapping; - this.readOnly = readOnly; - - if(mapping != null && !readOnly){ - buffer.position(0); - TileDataMarker marker = new TileDataMarker(); - for(int i = 0; i < width * height; i++){ - read(marker); - - //strip blockparts from map data, as they can be invalid - if(marker.wall == Blocks.part.id){ - marker.wall = Blocks.air.id; - } - - buffer.position(i * TILE_SIZE); - - //write mapped marker - write(marker); - } - - buffer.position(0); - for(int x = 0; x < width; x ++){ - for(int y = 0; y < height; y ++){ - //add missing blockparts - Block drawBlock = Vars.content.block(read(x, y, DataPosition.wall)); - if(drawBlock.isMultiblock()){ - int offsetx = -(drawBlock.size - 1) / 2; - int offsety = -(drawBlock.size - 1) / 2; - for(int dx = 0; dx < drawBlock.size; dx++){ - for(int dy = 0; dy < drawBlock.size; dy++){ - int worldx = dx + offsetx + x; - int worldy = dy + offsety + y; - - if(Structs.inBounds(worldx, worldy, width, height) && !(dx + offsetx == 0 && dy + offsety == 0)){ - write(worldx, worldy, DataPosition.wall, Blocks.part.id); - write(worldx, worldy, DataPosition.link, Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8))); - } - } - } - } - } - } - buffer.position(0); - this.map = null; - } - } - - public byte[] toArray(){ - return buffer.array(); - } - - public int width(){ - return width; - } - - public int height(){ - return height; - } - - /** - * Write a byte to a specific position. - */ - public void write(int x, int y, DataPosition position, byte data){ - buffer.put((x + width * y) * TILE_SIZE + position.ordinal(), data); - } - - /** - * Gets a byte at a specific position. - */ - public byte read(int x, int y, DataPosition position){ - return buffer.get((x + width * y) * TILE_SIZE + position.ordinal()); - } - - /** - * Reads and returns the next tile data. - */ - public TileDataMarker read(TileDataMarker marker){ - marker.read(buffer); - return marker; - } - - /** - * Writes this tile data marker. - */ - public void write(TileDataMarker marker){ - marker.write(buffer); - } - - /** - * Sets read position to the specified coordinates - */ - public void position(int x, int y){ - buffer.position((x + width * y) * TILE_SIZE); - } - - public TileDataMarker newDataMarker(){ - return new TileDataMarker(); - } - - public enum DataPosition{ - floor, wall, link, rotationTeam, elevation - } - - public class TileDataMarker{ - public byte floor, wall; - public byte link; - public byte rotation; - public byte team; - public byte elevation; - - public void read(ByteBuffer buffer){ - floor = buffer.get(); - wall = buffer.get(); - link = buffer.get(); - byte rt = buffer.get(); - elevation = buffer.get(); - rotation = Pack.leftByte(rt); - team = Pack.rightByte(rt); - - if(map != null){ - floor = (byte) map.get(floor, Blocks.stone.id); - wall = (byte) map.get(wall, 0); - } - } - - public void write(ByteBuffer buffer){ - if(readOnly) throw new IllegalArgumentException("This data is read-only."); - buffer.put(floor); - buffer.put(wall); - buffer.put(link); - buffer.put(Pack.byteByte(rotation, team)); - buffer.put(elevation); - } - } -} diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 2bd7823ad5..bf3473cb8a 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -1,166 +1,155 @@ package io.anuke.mindustry.maps; import io.anuke.arc.Core; +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.files.FileHandle; import io.anuke.arc.graphics.Texture; -import io.anuke.arc.collection.Array; import io.anuke.arc.util.Disposable; -import io.anuke.arc.collection.ObjectMap; -import io.anuke.mindustry.io.MapIO; -import io.anuke.arc.function.Supplier; import io.anuke.arc.util.Log; +import io.anuke.arc.util.Time; +import io.anuke.mindustry.io.MapIO; +import io.anuke.mindustry.world.Tile; -import java.io.DataInputStream; import java.io.IOException; -import java.io.InputStream; import static io.anuke.mindustry.Vars.*; public class Maps implements Disposable{ - /**List of all built-in maps.*/ - private static final String[] defaultMapNames = {}; - /**Tile format version.*/ - private static final int version = 0; + /** List of all built-in maps. */ + private static final String[] defaultMapNames = {"impact0079"}; + /** All maps stored in an ordered array. */ + private Array maps = new Array<>(); - /**Maps map names to the real maps.*/ - private ObjectMap maps = new ObjectMap<>(); - /**All maps stored in an ordered array.*/ - private Array allMaps = new Array<>(); - /**Temporary array used for returning things.*/ - private Array returnArray = new Array<>(); - - /**Returns a list of all maps, including custom ones.*/ + /** Returns a list of all maps, including custom ones. */ public Array all(){ - return allMaps; + return maps; } - /**Returns a list of only custom maps.*/ + /** Returns a list of only custom maps. */ public Array customMaps(){ - returnArray.clear(); - for(Map map : allMaps){ - if(map.custom) returnArray.add(map); - } - return returnArray; + return maps.select(m -> m.custom); } - /**Returns a list of only default maps.*/ + /** Returns a list of only default maps. */ public Array defaultMaps(){ - returnArray.clear(); - for(Map map : allMaps){ - if(!map.custom) returnArray.add(map); - } - return returnArray; + return maps.select(m -> !m.custom); } - /**Returns map by internal name.*/ - public Map getByName(String name){ - return maps.get(name); + public Map byName(String name){ + return maps.find(m -> m.name().equals(name)); } - /**Loads a map from the map folder and returns it. Should only be used for zone maps. - * Does not add this map to the map list.*/ + /** + * Loads a map from the map folder and returns it. Should only be used for zone maps. + * Does not add this map to the map list. + */ public Map loadInternalMap(String name){ FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension); - try(DataInputStream ds = new DataInputStream(file.read())) { - return new Map(name, MapIO.readMapMeta(ds), false, file::read); + try{ + return MapIO.readMap(file, false); }catch(IOException e){ throw new RuntimeException(e); } } - /**Load all maps. Should be called at application start.*/ + /** Load all maps. Should be called at application start. */ public void load(){ + Time.mark(); try{ - for (String name : defaultMapNames) { + for(String name : defaultMapNames){ FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension); - loadMap(file.nameWithoutExtension(), file::read, false); + loadMap(file, false); } - }catch (IOException e){ + }catch(IOException e){ throw new RuntimeException(e); } loadCustomMaps(); + Log.info("Time to load maps: {0}", Time.elapsed()); } - /**Save a map. This updates all values and stored data necessary.*/ - public void saveMap(String name, MapTileData data, ObjectMap tags){ + /** Save a custom map to the directory. This updates all values and stored data necessary. + * The tags are copied to prevent mutation later.*/ + public void saveMap(ObjectMap baseTags, Tile[][] data){ + try{ - //create copy of tags to prevent mutation later - ObjectMap newTags = new ObjectMap<>(); - newTags.putAll(tags); - tags = newTags; - + ObjectMap tags = new ObjectMap<>(baseTags); + String name = tags.get("name"); + if(name == null) throw new IllegalArgumentException("Can't save a map with no name. How did this happen?"); FileHandle file = customMapDirectory.child(name + "." + mapExtension); - MapIO.writeMap(file.write(false), tags, data); - if(maps.containsKey(name)){ - if(maps.get(name).texture != null) { - maps.get(name).texture.dispose(); - maps.get(name).texture = null; + //find map with the same exact display name + Map other = maps.find(m -> m.getDisplayName().equals(name)); + + if(other != null){ + //dispose of map if it's already there + if(other.texture != null){ + other.texture.dispose(); + other.texture = null; } - allMaps.removeValue(maps.get(name), true); + maps.remove(other); } - Map map = new Map(name, new MapMeta(version, tags, data.width(), data.height(), null), true, getStreamFor(name)); + //create map, write it, etc etc etc + Map map = new Map(file, data.length, data[0].length, tags, true); + MapIO.writeMap(file, map, data); + if(!headless){ - map.texture = new Texture(MapIO.generatePixmap(data)); + map.texture = new Texture(MapIO.generatePreview(data)); } - allMaps.add(map); - - maps.put(name, map); - }catch (IOException e){ + maps.add(map); + }catch(IOException e){ throw new RuntimeException(e); } } - /**Removes a map completely.*/ + /** Import a map, then save it. This updates all values and stored data necessary. */ + public void importMap(FileHandle file, Map map) throws IOException{ + file.copyTo(customMapDirectory.child(file.name())); + if(!headless){ + map.texture = new Texture(MapIO.generatePreview(map)); + } + maps.add(map); + } + + /** Removes a map completely. */ public void removeMap(Map map){ if(map.texture != null){ map.texture.dispose(); map.texture = null; } - maps.remove(map.name); - allMaps.removeValue(map, true); - - customMapDirectory.child(map.name + "." + mapExtension).delete(); + maps.remove(map); + map.file.delete(); } - private void loadMap(String name, Supplier supplier, boolean custom) throws IOException{ - try(DataInputStream ds = new DataInputStream(supplier.get())) { - MapMeta meta = MapIO.readMapMeta(ds); - Map map = new Map(name, meta, custom, supplier); + private void loadMap(FileHandle file, boolean custom) throws IOException{ + Map map = MapIO.readMap(file, custom); - if (!headless){ - map.texture = new Texture(MapIO.generatePixmap(MapIO.readTileData(ds, meta, true))); - } - - maps.put(map.name, map); - allMaps.add(map); + if(!headless){ + map.texture = new Texture(MapIO.generatePreview(map)); } + + maps.add(map); } private void loadCustomMaps(){ for(FileHandle file : customMapDirectory.list()){ try{ if(file.extension().equalsIgnoreCase(mapExtension)){ - loadMap(file.nameWithoutExtension(), file::read, true); + loadMap(file, true); } - }catch (Exception e){ + }catch(Exception e){ Log.err("Failed to load custom map file '{0}'!", file); Log.err(e); } } } - /**Returns an input stream supplier for a given map name.*/ - private Supplier getStreamFor(String name){ - return customMapDirectory.child(name + "." + mapExtension)::read; - } - @Override - public void dispose() { + public void dispose(){ } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java index e348bca08b..26a9d62ace 100644 --- a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java @@ -6,8 +6,6 @@ import io.anuke.arc.util.noise.Simplex; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; public class BasicGenerator extends RandomGenerator{ private Array ores; @@ -31,13 +29,14 @@ public class BasicGenerator extends RandomGenerator{ public void generate(int x, int y){ floor = Blocks.stone; - if(ores != null && ((Floor) floor).hasOres){ + if(ores != null){ int offsetX = x - 4, offsetY = y + 23; for(int i = ores.size - 1; i >= 0; i--){ Item entry = ores.get(i); if(Math.abs(0.5f - sim.octaveNoise2D(2, 0.7, 1f / (50 + i * 2), offsetX, offsetY)) > 0.23f && Math.abs(0.5f - sim2.octaveNoise2D(1, 1, 1f / (40 + i * 4), offsetX, offsetY)) > 0.32f){ - floor = OreBlock.get(floor, entry); + + //floor = OreBlock.get(floor, entry); break; } } diff --git a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java index c083662278..c4087ca2e1 100644 --- a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java @@ -9,19 +9,17 @@ import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.MapTileData; -import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Loadout; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.mindustry.world.blocks.StaticWall; import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.StorageBlock; -import static io.anuke.mindustry.Vars.content; +import java.io.IOException; + import static io.anuke.mindustry.Vars.world; public class MapGenerator extends Generator{ @@ -73,112 +71,112 @@ public class MapGenerator extends Generator{ public void init(Loadout loadout){ this.loadout = loadout; map = world.maps.loadInternalMap(mapName); - width = map.meta.width; - height = map.meta.height; + width = map.width; + height = map.height; } @Override public void generate(Tile[][] tiles){ - MapTileData data = MapIO.readTileData(map, true); - - data.position(0, 0); - TileDataMarker marker = data.newDataMarker(); - Array players = new Array<>(); - Array enemies = new Array<>(); - - for(int y = 0; y < data.height(); y++){ - for(int x = 0; x < data.width(); x++){ - data.read(marker); - - if(content.block(marker.wall) instanceof CoreBlock){ - players.add(new Point2(x, y)); - marker.wall = 0; + try{ + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + tiles[x][y] = new Tile(x, y); } - - if(enemySpawns != -1 && content.block(marker.wall) == Blocks.spawn){ - enemies.add(new Point2(x, y)); - marker.wall = 0; - } - - tiles[x][y] = new Tile(x, y, marker.floor, marker.wall == Blocks.part.id ? 0 : marker.wall, marker.rotation, marker.team); } - } - Simplex simplex = new Simplex(Mathf.random(99999)); + MapIO.readTiles(map, tiles); + Array players = new Array<>(); + Array enemies = new Array<>(); - for(int x = 0; x < data.width(); x++){ - for(int y = 0; y < data.height(); y++){ - final double scl = 10; - Tile tile = tiles[x][y]; - int newX = Mathf.clamp((int)(simplex.octaveNoise2D(1, 1, 1.0 / scl, x, y) * distortion + x), 0, data.width()-1); - int newY = Mathf.clamp((int)(simplex.octaveNoise2D(1, 1, 1.0 / scl, x + 9999, y + 9999) * distortion + y), 0, data.height()-1); + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + if(tiles[x][y].block() instanceof CoreBlock){ + players.add(new Point2(x, y)); + tiles[x][y].setBlock(Blocks.air); + } - if((tile.block() instanceof StaticWall + if(tiles[x][y].block() == Blocks.spawn){ + enemies.add(new Point2(x, y)); + tiles[x][y].setBlock(Blocks.air); + } + } + } + + Simplex simplex = new Simplex(Mathf.random(99999)); + + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + final double scl = 10; + Tile tile = tiles[x][y]; + int newX = Mathf.clamp((int)(simplex.octaveNoise2D(1, 1, 1.0 / scl, x, y) * distortion + x), 0, width - 1); + int newY = Mathf.clamp((int)(simplex.octaveNoise2D(1, 1, 1.0 / scl, x + 9999, y + 9999) * distortion + y), 0, height - 1); + + if((tile.block() instanceof StaticWall && tiles[newX][newY].block() instanceof StaticWall) || (tile.block() == Blocks.air && !tiles[newX][newY].block().synthetic()) || (tiles[newX][newY].block() == Blocks.air && tile.block() instanceof StaticWall)){ - tile.setBlock(tiles[newX][newY].block()); - } - - if(distortFloor){ - tile.setFloor(tiles[newX][newY].floor()); - } - - for(Decoration decor : decorations){ - if(tile.block() == Blocks.air && !(decor.wall instanceof Floor) && tile.floor() == decor.floor && Mathf.chance(decor.chance)){ - tile.setBlock(decor.wall); - }else if(tile.floor() == decor.floor && decor.wall instanceof Floor && Mathf.chance(decor.chance)){ - tile.setFloor((Floor)decor.wall); + tile.setBlock(tiles[newX][newY].block()); } - } - if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock)){ - for(ItemStack stack : storageDrops){ - if(Mathf.chance(0.3)){ - tile.entity.items.add(stack.item, Math.min(Mathf.random(stack.amount), tile.block().itemCapacity)); + if(distortFloor){ + tile.setFloor(tiles[newX][newY].floor()); + } + + for(Decoration decor : decorations){ + if(tile.block() == Blocks.air && !(decor.wall instanceof Floor) && tile.floor() == decor.floor && Mathf.chance(decor.chance)){ + tile.setBlock(decor.wall); + }else if(tile.floor() == decor.floor && decor.wall instanceof Floor && Mathf.chance(decor.chance)){ + tile.setFloor((Floor)decor.wall); } } - } - } - } - if(enemySpawns != -1){ - if(enemySpawns > enemies.size){ - throw new IllegalArgumentException("Enemy spawn pool greater than map spawn number."); - } - - enemies.shuffle(); - for(int i = 0; i < enemySpawns; i++){ - Point2 point = enemies.get(i); - tiles[point.x][point.y].setBlock(Blocks.spawn); - - int rad = 10, frad = 12; - - for(int x = -rad; x <= rad; x++){ - for(int y = -rad; y <= rad; y++){ - int wx = x + point.x, wy = y + point.y; - double dst = Mathf.dst(x, y); - if(dst < frad && Structs.inBounds(wx, wy, tiles) && (dst <= rad || Mathf.chance(0.5))){ - Tile tile = tiles[wx][wy]; - if(tile.floor() instanceof OreBlock){ - OreBlock block = (OreBlock)tile.floor(); - tile.setFloor(block.base); + if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock)){ + for(ItemStack stack : storageDrops){ + if(Mathf.chance(0.3)){ + tile.entity.items.add(stack.item, Math.min(Mathf.random(stack.amount), tile.block().itemCapacity)); } } } } } + + if(enemySpawns != -1){ + if(enemySpawns > enemies.size){ + throw new IllegalArgumentException("Enemy spawn pool greater than map spawn number."); + } + + enemies.shuffle(); + for(int i = 0; i < enemySpawns; i++){ + Point2 point = enemies.get(i); + tiles[point.x][point.y].setBlock(Blocks.spawn); + + int rad = 10, frad = 12; + + for(int x = -rad; x <= rad; x++){ + for(int y = -rad; y <= rad; y++){ + int wx = x + point.x, wy = y + point.y; + double dst = Mathf.dst(x, y); + if(dst < frad && Structs.inBounds(wx, wy, tiles) && (dst <= rad || Mathf.chance(0.5))){ + Tile tile = tiles[wx][wy]; + tile.clearOre(); + } + } + } + } + } + + Point2 core = players.random(); + if(core == null){ + throw new IllegalArgumentException("All zone maps must have a core."); + } + + loadout.setup(core.x, core.y); + + world.prepareTiles(tiles); + world.setMap(map); + }catch(IOException e){ + throw new RuntimeException(e); } - - Point2 core = players.random(); - if(core == null){ - throw new IllegalArgumentException("All zone maps must have a core."); - } - - loadout.setup(core.x, core.y); - - world.prepareTiles(tiles); - world.setMap(map); } public static class Decoration{ diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 8e26a4a701..45e46aae3b 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -27,10 +27,10 @@ public class NetworkIO{ try(DataOutputStream stream = new DataOutputStream(os)){ //--GENERAL STATE-- Serialization.writeRules(stream, state.rules); - stream.writeUTF(world.getMap().name); //map name + stream.writeUTF(world.getMap().name()); //map name //write tags - ObjectMap tags = world.getMap().meta.tags; + ObjectMap tags = world.getMap().tags; stream.writeByte(tags.size); for(Entry entry : tags.entries()){ stream.writeUTF(entry.key); @@ -105,7 +105,7 @@ public class NetworkIO{ //map world.spawner.read(stream); SaveIO.getSaveWriter().readMap(stream); - world.setMap(new Map(map, 0, 0)); + world.setMap(new Map(customMapDirectory.child(map), 0, 0, new ObjectMap<>(), true)); state.teams = new Teams(); @@ -141,7 +141,7 @@ public class NetworkIO{ int maxlen = 32; String host = (headless ? "Server" : players[0].name); - String map = world.getMap() == null ? "None" : world.getMap().name; + String map = world.getMap() == null ? "None" : world.getMap().name(); host = host.substring(0, Math.min(host.length(), maxlen)); map = map.substring(0, Math.min(map.length(), maxlen)); diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 986a74a75c..fea86c85bc 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -5,9 +5,12 @@ import io.anuke.arc.collection.Array; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.ui.ContentDisplay; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.OreBlock; + +import static io.anuke.mindustry.Vars.content; public class Item extends UnlockableContent implements Comparable{ public final Color color; @@ -28,8 +31,6 @@ public class Item extends UnlockableContent implements Comparable{ * 1 cost = 1 tick added to build time */ public float cost = 3f; - /**Whether this item has ores generated for it.*/ - public boolean genOre = false; /**If true, item is always unlocked.*/ public boolean alwaysUnlocked = false; @@ -101,6 +102,6 @@ public class Item extends UnlockableContent implements Comparable{ /**Allocates a new array containing all items the generate ores.*/ public static Array getAllOres(){ - return Vars.content.items().select(i -> i.genOre); + return content.blocks().select(b -> b instanceof OreBlock).map(b -> ((Floor)b).itemDrop); } } diff --git a/core/src/io/anuke/mindustry/type/Loadout.java b/core/src/io/anuke/mindustry/type/Loadout.java index 312a5b4d4e..26303254b2 100644 --- a/core/src/io/anuke/mindustry/type/Loadout.java +++ b/core/src/io/anuke/mindustry/type/Loadout.java @@ -3,13 +3,10 @@ package io.anuke.mindustry.type; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.IntMap; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.content.Items; import io.anuke.mindustry.game.Content; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.mindustry.world.blocks.storage.CoreBlock; import static io.anuke.mindustry.Vars.defaultTeam; @@ -27,7 +24,7 @@ public class Loadout extends Content{ put('2', new BlockEntry(Blocks.coreFoundation)); put('3', new BlockEntry(Blocks.coreNucleus)); - put('C', new BlockEntry(Blocks.mechanicalDrill, Items.copper)); + put('C', new BlockEntry(Blocks.mechanicalDrill, Blocks.oreCopper)); }}; private final IntMap blocks = new IntMap<>(); @@ -79,8 +76,7 @@ public class Loadout extends Content{ tile.setRotation((byte)entry.value.rotation); if(entry.value.ore != null){ for(Tile t : tile.getLinkedTiles(outArray)){ - Floor floor = t.floor(); - t.setFloor(OreBlock.get(floor, entry.value.ore) == null ? OreBlock.get(Blocks.stone, entry.value.ore) : OreBlock.get(floor, entry.value.ore)); + t.setOre(entry.value.ore); } } } @@ -93,10 +89,10 @@ public class Loadout extends Content{ static class BlockEntry{ final Block block; - final Item ore; + final Block ore; final int rotation; - BlockEntry(Block block, Item ore){ + BlockEntry(Block block, Block ore){ this.block = block; this.ore = ore; this.rotation = 0; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java index c068eae79d..bfc1d4902d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java @@ -106,7 +106,7 @@ public class CustomGameDialog extends FloatingDialog{ image.row(); image.add("[accent]" + map.getDisplayName()).pad(3f).growX().wrap().get().setAlignment(Align.center, Align.center); image.row(); - image.label((() -> Core.bundle.format("level.highscore", Core.settings.getInt("hiscore" + map.name, 0)))).pad(3f); + image.label((() -> Core.bundle.format("level.highscore", Core.settings.getInt("hiscore" + map.fileName(), 0)))).pad(3f); BorderImage border = new BorderImage(map.texture, 3f); border.setScaling(Scaling.fit); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 1bfccbc6df..5a9c007437 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -113,7 +113,7 @@ public class LoadDialog extends FloatingDialog{ button.defaults().padBottom(3); button.row(); - button.add(Core.bundle.format("save.map", color + (slot.getMap() == null ? Core.bundle.get("unknown") : slot.getMap().meta.name()))); + button.add(Core.bundle.format("save.map", color + (slot.getMap() == null ? Core.bundle.get("unknown") : slot.getMap().getDisplayName()))); button.row(); button.add(Core.bundle.format("save.wave", color + slot.getWave())); button.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index 4b79828534..5b30ca64b3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -15,12 +15,8 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.MapMeta; -import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.ui.BorderImage; -import java.io.DataInputStream; - import static io.anuke.mindustry.Vars.*; public class MapsDialog extends FloatingDialog{ @@ -33,22 +29,25 @@ public class MapsDialog extends FloatingDialog{ buttons.addImageTextButton("$editor.importmap", "icon-add", 14 * 2, () -> { Platform.instance.showFileChooser("$editor.importmap", "Map File", file -> { try{ - DataInputStream stream = new DataInputStream(file.read()); - MapMeta meta = MapIO.readMapMeta(stream); - MapTileData data = MapIO.readTileData(stream, meta, true); - stream.close(); + Map map = MapIO.readMap(file, true); + String name = map.tags.get("name", file.nameWithoutExtension()); - String name = meta.tags.get("name", file.nameWithoutExtension()); + Map conflict = world.maps.all().find(m -> m.fileName().equals(file.nameWithoutExtension()) || m.name().equals(file.name())); - if(world.maps.getByName(name) != null && !world.maps.getByName(name).custom){ + if(conflict != null && !conflict.custom){ ui.showError(Core.bundle.format("editor.import.exists", name)); - }else if(world.maps.getByName(name) != null){ + }else if(conflict != null){ ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { - world.maps.saveMap(name, data, meta.tags); - setup(); + try{ + world.maps.importMap(file, map); + setup(); + }catch(Exception e){ + ui.showError(Core.bundle.format("editor.errorimageload", Strings.parseException(e, false))); + Log.err(e); + } }); }else{ - world.maps.saveMap(name, data, meta.tags); + world.maps.importMap(file, map); setup(); } @@ -89,7 +88,7 @@ public class MapsDialog extends FloatingDialog{ TextButton button = maps.addButton("", "clear", () -> showMapInfo(map)).width(mapsize).pad(8).get(); button.clearChildren(); button.margin(9); - button.add(map.meta.tags.get("name", map.name)).width(mapsize - 18f).center().get().setEllipsis(true); + button.add(map.getDisplayName()).width(mapsize - 18f).center().get().setEllipsis(true); button.row(); button.addImage("white").growX().pad(4).color(Color.GRAY); button.row(); @@ -129,15 +128,15 @@ public class MapsDialog extends FloatingDialog{ t.add("$editor.name").padRight(10).color(Color.GRAY).padTop(0); t.row(); - t.add(map.meta.tags.get("name", map.name)).growX().wrap().padTop(2); + t.add(map.getDisplayName()).growX().wrap().padTop(2); t.row(); t.add("$editor.author").padRight(10).color(Color.GRAY); t.row(); - t.add(map.meta.author()).growX().wrap().padTop(2); + t.add(map.author()).growX().wrap().padTop(2); t.row(); t.add("$editor.description").padRight(10).color(Color.GRAY).top(); t.row(); - t.add(map.meta.description()).growX().wrap().padTop(2); + t.add(map.description()).growX().wrap().padTop(2); t.row(); t.add("$editor.oregen.info").padRight(10).color(Color.GRAY); }).height(mapsize).width(mapsize); @@ -146,7 +145,7 @@ public class MapsDialog extends FloatingDialog{ table.addImageTextButton("$editor.openin", "icon-load-map", 16 * 2, () -> { try{ - Vars.ui.editor.beginEditMap(map.stream.get()); + Vars.ui.editor.beginEditMap(map.file); dialog.hide(); hide(); }catch(Exception e){ @@ -156,7 +155,7 @@ public class MapsDialog extends FloatingDialog{ }).fillX().height(54f).marginLeft(10); table.addImageTextButton("$delete", "icon-trash-16", 16 * 2, () -> { - ui.showConfirm("$confirm", Core.bundle.format("map.delete", map.name), () -> { + ui.showConfirm("$confirm", Core.bundle.format("map.delete", map.name()), () -> { world.maps.removeMap(map); dialog.hide(); setup(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index b4c93d4195..0ff7a440c4 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -13,6 +13,7 @@ import io.anuke.arc.scene.ui.ButtonGroup; import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.ImageButton; import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.game.EventType.UnlockEvent; @@ -26,7 +27,6 @@ import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block.Icon; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.OreBlock; import static io.anuke.mindustry.Vars.*; @@ -340,6 +340,6 @@ public class PlacementFragment extends Fragment{ /** Returns the block currently being hovered over in the world. */ Block tileDisplayBlock(){ - return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.floor() instanceof OreBlock ? hoverTile.floor() : null; + return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.oreBlock() != Blocks.air ? hoverTile.oreBlock() : null; } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/world/CachedTile.java b/core/src/io/anuke/mindustry/world/CachedTile.java new file mode 100644 index 0000000000..6672bb6d2f --- /dev/null +++ b/core/src/io/anuke/mindustry/world/CachedTile.java @@ -0,0 +1,51 @@ +package io.anuke.mindustry.world; + +import io.anuke.arc.collection.IntMap; +import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.world.modules.ConsumeModule; +import io.anuke.mindustry.world.modules.ItemModule; +import io.anuke.mindustry.world.modules.LiquidModule; +import io.anuke.mindustry.world.modules.PowerModule; + +/**A tile which does not trigger change events and whose entity types are cached. + * Prevents garbage when loading previews.*/ +public class CachedTile extends Tile{ + private static IntMap entities = new IntMap<>(); + + public CachedTile(){ + super(0, 0); + } + + @Override + public Team getTeam(){ + return Team.all[getTeamID()]; + } + + @Override + protected void preChanged(){ + super.setTeam(Team.none); + } + + @Override + protected void changed(){ + entity = null; + + Block block = block(); + + if(block.hasEntity()){ + //cache all entity types so only one is ever created per block type. do not add it. + if(!entities.containsKey(block.id)){ + TileEntity n = block.newEntity(); + n.cons = new ConsumeModule(entity); + if(block.hasItems) n.items = new ItemModule(); + if(block.hasLiquids) n.liquids = new LiquidModule(); + if(block.hasPower) n.power = new PowerModule(); + entities.put(block.id, n); + } + + entity = entities.get(block.id); + + } + } +} diff --git a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java b/core/src/io/anuke/mindustry/world/LegacyColorMapper.java index d60122bb85..264d469f28 100644 --- a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java +++ b/core/src/io/anuke/mindustry/world/LegacyColorMapper.java @@ -3,10 +3,8 @@ package io.anuke.mindustry.world; import io.anuke.arc.collection.IntMap; import io.anuke.arc.graphics.Color; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.content.Items; import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; public class LegacyColorMapper implements ContentList{ private static IntMap blockMap = new IntMap<>(); @@ -38,10 +36,14 @@ public class LegacyColorMapper implements ContentList{ map("6e501e", Blocks.stainedStoneRed); map("ed5334", Blocks.stainedStoneRed); map("292929", Blocks.tar); - map("c3a490", OreBlock.get(Blocks.stone, Items.copper)); - map("161616", OreBlock.get(Blocks.stone, Items.coal)); - map("6277bc", OreBlock.get(Blocks.stone, Items.titanium)); - map("83bc58", OreBlock.get(Blocks.stone, Items.thorium)); + map("c3a490", Blocks.stone, Blocks.air, Blocks.oreCopper); + map("161616", Blocks.stone, Blocks.air, Blocks.oreCoal); + map("6277bc", Blocks.stone, Blocks.air, Blocks.oreTitanium); + map("83bc58", Blocks.stone, Blocks.air, Blocks.oreThorium); + } + + private void map(String color, Block block, Block wall, Block ore){ + blockMap.put(Color.rgba8888(Color.valueOf(color)), new LegacyBlock(block, wall, ore)); } private void map(String color, Block block, Block wall){ @@ -55,10 +57,18 @@ public class LegacyColorMapper implements ContentList{ public static class LegacyBlock{ public final Floor floor; public final Block wall; + public final Block ore; public LegacyBlock(Block floor, Block wall){ this.floor = (Floor) floor; this.wall = wall; + this.ore = null; + } + + public LegacyBlock(Block floor, Block wall, Block ore){ + this.floor = (Floor) floor; + this.wall = wall; + this.ore = ore; } } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 5bc7e46926..b42aa9a07c 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -9,9 +9,10 @@ import io.anuke.arc.math.geom.Position; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Pack; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.traits.TargetTrait; +import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.modules.ConsumeModule; @@ -39,10 +40,13 @@ public class Tile implements Position, TargetTrait{ private byte rotation; /** Team ordinal. */ private byte team; + /**Ore that is on top of this (floor) block.*/ + private byte ore = 0; public Tile(int x, int y){ this.x = (short) x; this.y = (short) y; + wall = floor = (Floor)Blocks.air; } public Tile(int x, int y, byte floor, byte wall){ @@ -159,6 +163,7 @@ public class Tile implements Position, TargetTrait{ public void setFloor(Floor type){ this.floor = type; + this.ore = 0; } public byte getRotation(){ @@ -213,6 +218,14 @@ public class Tile implements Position, TargetTrait{ return link != 0; } + public byte getLinkByte(){ + return link; + } + + public void setLinkByte(byte b){ + this.link = b; + } + /** Sets this to a linked tile, which sets the block to a part. dx and dy can only be -8-7. */ public void setLinked(byte dx, byte dy){ setBlock(Blocks.part); @@ -316,6 +329,30 @@ public class Tile implements Position, TargetTrait{ return getTeam() == Team.none || team == getTeam(); } + public byte getOreByte(){ + return ore; + } + + public void setOreByte(byte ore){ + this.ore = ore; + } + + public void setOre(Block floor){ + setOreByte(floor.id); + } + + public void clearOre(){ + this.ore = 0; + } + + public Floor oreBlock(){ + return (Floor)content.block(ore); + } + + public Item drop(){ + return ore == 0 ? floor.itemDrop : ((Floor)content.block(ore)).itemDrop; + } + public void updateOcclusion(){ cost = 1; boolean occluded = false; @@ -343,7 +380,7 @@ public class Tile implements Position, TargetTrait{ } } - private void preChanged(){ + protected void preChanged(){ block().removed(this); if(entity != null){ entity.removeFromProximity(); @@ -351,7 +388,7 @@ public class Tile implements Position, TargetTrait{ team = 0; } - private void changed(){ + protected void changed(){ if(entity != null){ entity.remove(); entity = null; diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index 2bd9db15ac..13923fa17c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -7,6 +7,7 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Point2; +import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.entities.Effects.Effect; @@ -45,8 +46,6 @@ public class Floor extends Block{ public Liquid liquidDrop = null; /** item that drops from this block, used for drills */ public Item itemDrop = null; - /** Whether ores generate on this block. */ - public boolean hasOres = false; /** whether this block can be drowned in */ public boolean isLiquid; /** Heat of this block, 0 at baseline. Used for calculating output of thermal generators.*/ @@ -110,6 +109,10 @@ public class Floor extends Block{ Mathf.random.setSeed(tile.pos()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Floor floor = tile.oreBlock(); + if(floor != Blocks.air){ + floor.draw(tile); + } drawEdges(tile); } diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 5ddcdde94e..d8ba5b6435 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -1,28 +1,18 @@ package io.anuke.mindustry.world.blocks; -import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class OreBlock extends Floor{ - private static final ObjectMap> oreBlockMap = new ObjectMap<>(); - public Floor base; - - public OreBlock(Item ore, Floor base){ - super("ore-" + ore.name + "-" + base.name); - this.localizedName = ore.localizedName() + " " + base.localizedName; + public OreBlock(Item ore){ + super("ore-" + ore.name); + this.localizedName = ore.localizedName(); this.itemDrop = ore; - this.base = base; this.variants = 3; - this.edge = base.name; - this.blendGroup = base.blendGroup; this.color.set(ore.color); - - oreBlockMap.getOr(ore, ObjectMap::new).put(base, this); } @Override @@ -38,22 +28,5 @@ public class OreBlock extends Floor{ @Override public void draw(Tile tile){ Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); - - drawEdges(tile); - } - - @Override - public boolean doEdge(Floor floor, boolean f){ - return floor != base && super.doEdge(floor, f); - } - - @Override - protected boolean edgeOnto(Floor other){ - return other != base; - } - - public static Floor get(Block floor, Item item){ - if(!oreBlockMap.containsKey(item) || !oreBlockMap.get(item).containsKey(floor)) return null; - return oreBlockMap.get(item).get(floor); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 572eb8d48f..7b4713aeb7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -18,6 +18,7 @@ import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -182,7 +183,7 @@ public class Drill extends Block{ } itemArray.sort((item1, item2) -> Integer.compare(oreCount.get(item1, 0), oreCount.get(item2, 0))); - itemArray.sort((item1, item2) -> item1.genOre && !item2.genOre ? 1 : item1.genOre == item2.genOre ? 0 : -1); + itemArray.sort((item1, item2) -> Boolean.compare(item1.type == ItemType.material, item2.type == ItemType.material)); if(itemArray.size == 0){ return; @@ -259,12 +260,12 @@ public class Drill extends Block{ } public Item getDrop(Tile tile){ - return tile.floor().itemDrop; + return tile.drop(); } public boolean isValid(Tile tile){ if(tile == null) return false; - Item drops = tile.floor().itemDrop; + Item drops = tile.drop(); return drops != null && drops.hardness <= tier; } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index 24c8be9015..b262f854ea 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -54,9 +54,9 @@ public class DesktopPlatform extends Platform{ if(world.getMap() == null){ presence.details = "Unknown Map"; }else if(!state.rules.waves){ - presence.details = Strings.capitalize(world.getMap().name); + presence.details = Strings.capitalize(world.getMap().getDisplayName()); }else{ - presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave; + presence.details = Strings.capitalize(world.getMap().getDisplayName()) + " | Wave " + state.wave; presence.largeImageText = "Wave " + state.wave; } diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index cc7d8dd154..a4ce1935dd 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -113,7 +113,7 @@ public class IOSLauncher extends IOSApplication.Delegate { ui.editor.show(); } - ui.editor.beginEditMap(file.read()); + ui.editor.beginEditMap(file); }); } }); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index fd97296a70..0fce04de7a 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -46,7 +46,6 @@ public class ServerControl implements ApplicationListener{ private FileHandle currentLogFile; private boolean inExtraRound; private Task lastTask; - private RulePreset lastPreset; public ServerControl(String[] args){ Core.settings.defaults( @@ -144,11 +143,11 @@ public class ServerControl implements ApplicationListener{ Call.onInfoMessage((state.rules.pvp ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") - + "\nNext selected map:[accent] "+map.name+"[]" - + (map.meta.author() != null ? " by[accent] " + map.meta.author() + "[]" : "") + "."+ + + "\nNext selected map:[accent] "+map.name()+"[]" + + (map.author() != null ? " by[accent] " + map.author() + "[]" : "") + "."+ "\nNew game begins in " + roundExtraTime + " seconds."); - info("Selected next map to be {0}.", map.name); + info("Selected next map to be {0}.", map.name()); Map fmap = map; @@ -199,7 +198,7 @@ public class ServerControl implements ApplicationListener{ if(lastTask != null) lastTask.cancel(); - Map result = world.maps.all().find(map -> map.name.equalsIgnoreCase(arg[0])); + Map result = world.maps.all().find(map -> map.name().equalsIgnoreCase(arg[0])); if(result == null){ err("No map with name &y'{0}'&lr found.", arg[0]); @@ -252,7 +251,7 @@ public class ServerControl implements ApplicationListener{ if(!world.maps.all().isEmpty()){ info("Maps:"); for(Map map : world.maps.all()){ - info(" &ly{0}: &lb&fi{1} / {2}x{3}", map.name, map.custom ? "Custom" : "Default", map.meta.width, map.meta.height); + info(" &ly{0}: &lb&fi{1} / {2}x{3}", map.name(), map.custom ? "Custom" : "Default", map.width, map.height); } }else{ info("No maps found."); @@ -265,7 +264,7 @@ public class ServerControl implements ApplicationListener{ info("Status: &rserver closed"); }else{ info("Status:"); - info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1}", Strings.capitalize(world.getMap().name), state.wave); + info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1}", Strings.capitalize(world.getMap().name()), state.wave); if(state.rules.waves){ info("&ly {0} enemies.", unitGroups[Team.red.ordinal()].size()); diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index f67122d9a7..91958bf7ab 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -194,8 +194,8 @@ public class ApplicationTests{ resetWorld(); SaveIO.loadFromSlot(0); - assertEquals(world.width(), map.meta.width); - assertEquals(world.height(), map.meta.height); + assertEquals(world.width(), map.width); + assertEquals(world.height(), map.height); assertTrue(state.teams.get(defaultTeam).cores.size > 0); } diff --git a/tests/src/test/java/MapTests.java b/tests/src/test/java/MapTests.java new file mode 100644 index 0000000000..689c7f5d22 --- /dev/null +++ b/tests/src/test/java/MapTests.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.BeforeAll; + +public class MapTests{ + + @BeforeAll + static void launchApplication(){ + ApplicationTests.launchApplication(); + } + + //TODO +} diff --git a/tools/build.gradle b/tools/build.gradle index dd9ecd0cbb..11c12fa338 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -88,6 +88,7 @@ def antialias = {File file -> ImageIO.write(out, "png", file) } + task swapColors(){ doLast{ if (project.hasProperty("colors")) { diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index 7e1f0106e5..6635d235cc 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -206,11 +206,10 @@ public class Generators { OreBlock ore = (OreBlock)block; Item item = ore.itemDrop; - Block base = ore.base; for (int i = 0; i < 3; i++) { //get base image to draw on - Image image = ImagePacker.get(base.name + (i+1)); + Image image = new Image(32, 32); Image shadow = ImagePacker.get(item.name + (i+1)); int offset = image.width()/tilesize; @@ -228,8 +227,8 @@ public class Generators { } image.draw(ImagePacker.get(item.name + (i+1))); - image.save("../blocks/environment/ore-" + item.name + "-" + base.name + (i+1)); - image.save("../editor/editor-ore-" + item.name + "-" + base.name + (i+1)); + image.save("../blocks/environment/ore-" + item.name + (i+1)); + image.save("../editor/editor-ore-" + item.name + (i+1)); //save icons image.save(block.name + "-icon-full");