diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index bd6a7ee023..1f8450cd13 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -12,6 +12,7 @@ import javax.lang.model.util.ElementFilter; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import java.lang.reflect.Field; import java.util.List; import java.util.Set; @@ -60,14 +61,12 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ .returns(void.class) .addParameter(DataOutput.class, "stream") .addParameter(type, "object") - .addAnnotation(Override.class) .addException(IOException.class) .addModifiers(Modifier.PUBLIC); MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read") .returns(type) .addParameter(DataInput.class, "stream") - .addAnnotation(Override.class) .addException(IOException.class) .addModifiers(Modifier.PUBLIC); @@ -96,6 +95,17 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ serializer.addMethod(readMethod.build()); method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); + + String sname = type.toString().substring(type.toString().lastIndexOf('.') + 1); + + name(writeMethod, "write" + sname); + name(readMethod, "read" + sname); + + writeMethod.addModifiers(Modifier.STATIC); + readMethod.addModifiers(Modifier.STATIC); + + classBuilder.addMethod(writeMethod.build()); + classBuilder.addMethod(readMethod.build()); } classBuilder.addMethod(method.build()); @@ -109,4 +119,14 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ throw new RuntimeException(e); } } + + static void name(MethodSpec.Builder builder, String name){ + try{ + Field field = builder.getClass().getDeclaredField("name"); + field.setAccessible(true); + field.set(builder, name); + }catch(Exception e){ + throw new RuntimeException(e); + } + } } diff --git a/core/assets-raw/sprites/blocks/environment/rocks-medium1.png b/core/assets-raw/sprites/blocks/environment/rocks-medium1.png new file mode 100644 index 0000000000..66025d7a45 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/rocks-medium1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/rocks-medium2.png b/core/assets-raw/sprites/blocks/environment/rocks-medium2.png new file mode 100644 index 0000000000..8db32cb047 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/rocks-medium2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/rocks-small1.png b/core/assets-raw/sprites/blocks/environment/rocks-small1.png new file mode 100644 index 0000000000..7afb6018a5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/rocks-small1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/rocks-small2.png b/core/assets-raw/sprites/blocks/environment/rocks-small2.png new file mode 100644 index 0000000000..dfff2c648b Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/rocks-small2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/rocks-small3.png b/core/assets-raw/sprites/blocks/environment/rocks-small3.png new file mode 100644 index 0000000000..cdbc897501 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/rocks-small3.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 0ad7e33c6b..95564f474b 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -27,294 +27,294 @@ overdrive-projector-top index: -1 bridge-conveyor rotate: false - xy: 985, 1362 + xy: 1043, 1396 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1019, 1362 + xy: 1053, 1362 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1043, 1396 + xy: 1049, 1561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1375, 1729 + xy: 1409, 1729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1409, 1763 + xy: 1443, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1409, 1729 + xy: 1477, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1443, 1767 + xy: 1443, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1477, 1767 + xy: 1511, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1443, 1733 + xy: 1477, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1511, 1767 + xy: 1545, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1477, 1733 + xy: 1511, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1545, 1767 + xy: 1579, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1511, 1733 + xy: 1545, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1579, 1767 + xy: 1613, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1545, 1733 + xy: 1579, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1613, 1767 + xy: 1647, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1579, 1733 + xy: 1613, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1647, 1767 + xy: 1681, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1613, 1733 + xy: 1647, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1681, 1767 + xy: 1715, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1647, 1733 + xy: 1681, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1715, 1767 + xy: 1749, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1109, 1493 + xy: 1087, 1391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1075, 1459 + xy: 1087, 1357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1109, 1459 + xy: 1121, 1391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1077, 1425 + xy: 1121, 1357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1111, 1425 + xy: 687, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1087, 1391 + xy: 687, 339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1087, 1357 + xy: 721, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1121, 1391 + xy: 721, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1121, 1357 + xy: 755, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 687, 373 + xy: 789, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 687, 339 + xy: 823, 383 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 721, 381 + xy: 755, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 721, 347 + xy: 789, 348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 755, 381 + xy: 823, 349 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 789, 382 + xy: 705, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 823, 383 + xy: 705, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 755, 347 + xy: 705, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 789, 348 + xy: 705, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 823, 349 + xy: 705, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 263, 186 + xy: 263, 118 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -328,21 +328,21 @@ mass-driver-turret index: -1 phase-conveyor-arrow rotate: false - xy: 1793, 1665 + xy: 1861, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1827, 1665 + xy: 1895, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1861, 1665 + xy: 1929, 1681 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -587,56 +587,56 @@ blackstoneedge index: -1 coal1 rotate: false - xy: 1053, 1362 + xy: 1048, 1527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1049, 1561 + xy: 1141, 1559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1048, 1527 + xy: 1239, 1751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1681, 1733 + xy: 1715, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 1749, 1767 + xy: 1783, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1715, 1733 + xy: 1749, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 1851, 1733 + xy: 1885, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 1919, 1767 + xy: 1919, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -650,70 +650,70 @@ dirtedge index: -1 generic-cliff-edge rotate: false - xy: 1283, 1691 + xy: 1351, 1691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-cliff-edge rotate: false - xy: 1283, 1691 + xy: 1351, 1691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 generic-cliff-edge-1 rotate: false - xy: 1317, 1691 + xy: 1385, 1695 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-cliff-edge-1 rotate: false - xy: 1317, 1691 + xy: 1385, 1695 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 generic-cliff-edge-2 rotate: false - xy: 1351, 1691 + xy: 1419, 1695 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-cliff-edge-2 rotate: false - xy: 1351, 1691 + xy: 1419, 1695 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 generic-cliff-side rotate: false - xy: 1385, 1695 + xy: 1453, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-cliff-side rotate: false - xy: 1385, 1695 + xy: 1453, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 1419, 1695 + xy: 1487, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1453, 1699 + xy: 1521, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -727,14 +727,14 @@ grassedge index: -1 ice2 rotate: false - xy: 1657, 1699 + xy: 1725, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1691, 1699 + xy: 1759, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -748,14 +748,14 @@ iceedge index: -1 icerock2 rotate: false - xy: 1725, 1699 + xy: 1793, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lava rotate: false - xy: 263, 152 + xy: 263, 84 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -769,56 +769,56 @@ lavaedge index: -1 lead1 rotate: false - xy: 263, 84 + xy: 331, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 297, 323 + xy: 297, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 331, 323 + xy: 365, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor2 rotate: false - xy: 365, 289 + xy: 297, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 433, 323 + xy: 331, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 297, 187 + xy: 365, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 331, 221 + xy: 399, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 365, 255 + xy: 467, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -832,21 +832,42 @@ metalflooredge index: -1 rock2 rotate: false - xy: 655, 407 + xy: 619, 339 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks-medium2 + rotate: false + xy: 653, 373 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks-small2 + rotate: false + xy: 653, 339 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks-small3 + rotate: false + xy: 637, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 619, 339 + xy: 637, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 653, 373 + xy: 637, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -860,14 +881,14 @@ sandedge index: -1 snow2 rotate: false - xy: 671, 237 + xy: 671, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 671, 203 + xy: 671, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -888,42 +909,42 @@ spaceedge index: -1 stone-cliff-edge rotate: false - xy: 1691, 1631 + xy: 1861, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 1725, 1631 + xy: 1895, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 1759, 1631 + xy: 1929, 1613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 1793, 1631 + xy: 1963, 1613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 1623, 1631 + xy: 1793, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 1657, 1631 + xy: 1827, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -944,70 +965,70 @@ taredge index: -1 thorium1 rotate: false - xy: 1963, 1613 + xy: 1082, 1527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1997, 1613 + xy: 1109, 1493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 789, 416 + xy: 1075, 1459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 823, 417 + xy: 1109, 1459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 1075, 1493 + xy: 1077, 1425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 1082, 1527 + xy: 1111, 1425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 705, 271 + xy: 705, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 705, 237 + xy: 705, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 705, 203 + xy: 705, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 705, 169 + xy: 739, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1035,42 +1056,42 @@ block-elevation index: -1 block-middle rotate: false - xy: 1980, 1881 + xy: 2014, 1923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1980, 1881 + xy: 2014, 1923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-slope rotate: false - xy: 2014, 1957 + xy: 2014, 1889 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 border rotate: false - xy: 2014, 1923 + xy: 917, 1363 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 767, 753 + xy: 2014, 1855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross-1 rotate: false - xy: 1783, 1767 + xy: 1817, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1098,7 +1119,7 @@ cross-4 index: -1 place-arrow rotate: false - xy: 1895, 1665 + xy: 1963, 1681 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1154,154 +1175,154 @@ rubble-3-1 index: -1 bridge-conduit-arrow rotate: false - xy: 2014, 1889 + xy: 951, 1362 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 2014, 1889 + xy: 951, 1362 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 917, 1363 + xy: 985, 1362 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 951, 1362 + xy: 1019, 1362 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1375, 1763 + xy: 877, 1229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 785, 1231 + xy: 771, 923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 877, 1229 + xy: 767, 889 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 771, 923 + xy: 767, 855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 767, 889 + xy: 767, 821 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 767, 855 + xy: 767, 787 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 767, 821 + xy: 767, 753 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 767, 787 + xy: 767, 719 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 767, 719 + xy: 2001, 1821 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 2014, 1855 + xy: 2001, 1787 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 2001, 1821 + xy: 1273, 1725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 2001, 1787 + xy: 1307, 1725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1273, 1725 + xy: 1341, 1725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1307, 1725 + xy: 1375, 1729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1341, 1725 + xy: 1409, 1763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 297, 255 + xy: 399, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 331, 289 + xy: 297, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 399, 323 + xy: 331, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1329,70 +1350,70 @@ liquid-tank-top index: -1 phase-conduit-arrow rotate: false - xy: 1691, 1665 + xy: 1759, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1725, 1665 + xy: 1793, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1759, 1665 + xy: 1827, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1929, 1647 + xy: 1997, 1647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1963, 1647 + xy: 801, 889 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1997, 1647 + xy: 801, 855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 801, 889 + xy: 801, 821 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 801, 855 + xy: 801, 787 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 801, 821 + xy: 801, 753 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 801, 787 + xy: 801, 719 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1441,7 +1462,7 @@ block-icon-battery-large index: -1 combustion-generator-top rotate: false - xy: 1141, 1559 + xy: 1273, 1759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1504,7 +1525,7 @@ fusion-reactor-top index: -1 power-node rotate: false - xy: 1929, 1681 + xy: 1997, 1681 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1518,21 +1539,21 @@ power-node-large index: -1 powerinfinite rotate: false - xy: 1963, 1681 + xy: 1929, 1647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 powervoid rotate: false - xy: 1997, 1681 + xy: 1963, 1647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 619, 373 + xy: 637, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1714,14 +1735,14 @@ cultivator-top index: -1 lavasmelter rotate: false - xy: 263, 118 + xy: 297, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 oilrefinery rotate: false - xy: 365, 221 + xy: 433, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1756,35 +1777,35 @@ plastanium-compressor-top index: -1 pulverizer rotate: false - xy: 801, 753 + xy: 621, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 801, 719 + xy: 655, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 637, 33 + xy: 671, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 smelter rotate: false - xy: 671, 271 + xy: 671, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solidifer rotate: false - xy: 671, 33 + xy: 1589, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1805,7 +1826,7 @@ core-top index: -1 sortedunloader rotate: false - xy: 1453, 1631 + xy: 1623, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1889,7 +1910,7 @@ cyclone index: -1 duo rotate: false - xy: 1987, 1715 + xy: 1283, 1691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1903,7 +1924,7 @@ fuse index: -1 hail rotate: false - xy: 1623, 1699 + xy: 1691, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1987,21 +2008,21 @@ salvo-panel-right index: -1 scatter rotate: false - xy: 637, 203 + xy: 637, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scorch rotate: false - xy: 637, 169 + xy: 671, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scorch-shoot rotate: false - xy: 637, 135 + xy: 671, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2134,7 +2155,7 @@ reconstructor-open index: -1 repair-point-turret rotate: false - xy: 621, 407 + xy: 619, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2197,7 +2218,7 @@ wraith-factory-top-open index: -1 deflector-wall rotate: false - xy: 1817, 1733 + xy: 1851, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2211,7 +2232,7 @@ deflector-wall-large index: -1 dense-alloy-wall rotate: false - xy: 1885, 1767 + xy: 1919, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2232,7 +2253,7 @@ door-large-open index: -1 door-open rotate: false - xy: 1987, 1749 + xy: 1249, 1691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2267,35 +2288,35 @@ bullet-back index: -1 casing rotate: false - xy: 1077, 1407 + xy: 2039, 1727 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 command-attack rotate: false - xy: 1239, 1751 + xy: 1307, 1759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-idle rotate: false - xy: 1273, 1759 + xy: 1341, 1759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-patrol rotate: false - xy: 1307, 1759 + xy: 1375, 1763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-retreat rotate: false - xy: 1341, 1759 + xy: 785, 1231 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2372,35 +2393,35 @@ scale_marker index: -1 scorch1 rotate: false - xy: 769, 245 + xy: 770, 211 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 799, 246 + xy: 769, 91 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 829, 247 + xy: 1175, 1559 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 739, 143 + xy: 1205, 1559 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 769, 143 + xy: 1235, 1559 size: 28, 100 orig: 28, 100 offset: 0, 0 @@ -2421,21 +2442,21 @@ shell-back index: -1 shot rotate: false - xy: 671, 305 + xy: 671, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 827, 639 + xy: 799, 143 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 705, 305 + xy: 705, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3364,6 +3385,34 @@ rock1 orig: 32, 32 offset: 0, 0 index: -1 +block-icon-rocks-medium + rotate: false + xy: 1141, 1593 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks-medium1 + rotate: false + xy: 1141, 1593 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icon-rocks-small + rotate: false + xy: 1181, 1693 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks-small1 + rotate: false + xy: 1181, 1693 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 block-icon-rotary-pump rotate: false xy: 1386, 1917 @@ -3380,14 +3429,14 @@ rotary-pump index: -1 block-icon-router rotate: false - xy: 1141, 1593 + xy: 1215, 1693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1141, 1593 + xy: 1215, 1693 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3415,63 +3464,63 @@ block-icon-salvo index: -1 block-icon-sand rotate: false - xy: 1181, 1693 + xy: 843, 1289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 1181, 1693 + xy: 843, 1289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-scorch rotate: false - xy: 1215, 1693 + xy: 843, 1255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-separator rotate: false - xy: 843, 1289 + xy: 877, 1297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator rotate: false - xy: 843, 1289 + xy: 877, 1297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-shock-mine rotate: false - xy: 843, 1255 + xy: 877, 1263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 843, 1255 + xy: 877, 1263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-shrub rotate: false - xy: 877, 1297 + xy: 771, 957 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrub rotate: false - xy: 877, 1297 + xy: 771, 957 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3492,28 +3541,28 @@ silicon-smelter index: -1 block-icon-snow rotate: false - xy: 877, 1263 + xy: 759, 654 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow1 rotate: false - xy: 877, 1263 + xy: 759, 654 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-solar-panel rotate: false - xy: 771, 957 + xy: 759, 620 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 771, 957 + xy: 759, 620 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3534,42 +3583,42 @@ solar-panel-large index: -1 block-icon-sorter rotate: false - xy: 759, 654 + xy: 759, 586 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 759, 654 + xy: 759, 586 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-space rotate: false - xy: 759, 620 + xy: 759, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 space rotate: false - xy: 759, 620 + xy: 759, 552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-spawn rotate: false - xy: 759, 586 + xy: 759, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn rotate: false - xy: 759, 586 + xy: 759, 518 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3590,28 +3639,28 @@ block-icon-spirit-factory index: -1 block-icon-stone rotate: false - xy: 759, 552 + xy: 759, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone1 rotate: false - xy: 759, 552 + xy: 759, 484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-surge-wall rotate: false - xy: 759, 518 + xy: 759, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 759, 518 + xy: 759, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3639,14 +3688,14 @@ block-icon-swarmer index: -1 block-icon-tar rotate: false - xy: 759, 484 + xy: 721, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar rotate: false - xy: 759, 484 + xy: 721, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3709,14 +3758,14 @@ thorium-reactor index: -1 block-icon-thorium-wall rotate: false - xy: 759, 450 + xy: 1980, 1949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 759, 450 + xy: 1980, 1949 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3744,14 +3793,14 @@ block-icon-titan-factory index: -1 block-icon-titanium-conveyor rotate: false - xy: 721, 415 + xy: 1980, 1915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 721, 415 + xy: 1980, 1915 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3786,14 +3835,14 @@ turbine-generator index: -1 block-icon-unloader rotate: false - xy: 1980, 1949 + xy: 1980, 1881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 1980, 1949 + xy: 1980, 1881 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3814,14 +3863,14 @@ vault index: -1 block-icon-water rotate: false - xy: 1980, 1915 + xy: 2014, 1957 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 1980, 1915 + xy: 2014, 1957 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3849,84 +3898,84 @@ block-icon-wraith-factory index: -1 deepwater-cliff-edge rotate: false - xy: 1749, 1733 + xy: 1783, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-cliff-edge-1 rotate: false - xy: 1817, 1767 + xy: 1851, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-cliff-edge-2 rotate: false - xy: 1783, 1733 + xy: 1817, 1733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-cliff-side rotate: false - xy: 1851, 1767 + xy: 1885, 1767 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-cliff-edge rotate: false - xy: 1885, 1733 + xy: 1953, 1749 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-cliff-edge-1 rotate: false - xy: 1919, 1733 + xy: 1953, 1715 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-cliff-edge-2 rotate: false - xy: 1953, 1749 + xy: 1987, 1749 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-cliff-side rotate: false - xy: 1953, 1715 + xy: 1987, 1715 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-cliff-edge rotate: false - xy: 1487, 1699 + xy: 1555, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-cliff-edge-1 rotate: false - xy: 1521, 1699 + xy: 1589, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-cliff-edge-2 rotate: false - xy: 1555, 1699 + xy: 1623, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-cliff-side rotate: false - xy: 1589, 1699 + xy: 1657, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3982,770 +4031,770 @@ trident-ship index: -1 metalfloor-cliff-edge rotate: false - xy: 399, 289 + xy: 297, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor-cliff-edge-1 rotate: false - xy: 467, 323 + xy: 331, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor-cliff-edge-2 rotate: false - xy: 297, 153 + xy: 365, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metalfloor-cliff-side rotate: false - xy: 331, 187 + xy: 399, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-blackstone1 rotate: false - xy: 399, 255 + xy: 501, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-blackstone2 rotate: false - xy: 433, 289 + xy: 297, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-blackstone3 rotate: false - xy: 501, 323 + xy: 331, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-grass1 rotate: false - xy: 297, 119 + xy: 365, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 331, 153 + xy: 399, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 365, 187 + xy: 433, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 399, 221 + xy: 467, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 433, 255 + xy: 297, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 467, 289 + xy: 331, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 297, 85 + xy: 365, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 331, 119 + xy: 399, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 365, 153 + xy: 433, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 399, 187 + xy: 467, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 433, 221 + xy: 501, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 467, 255 + xy: 331, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 501, 289 + xy: 365, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 331, 85 + xy: 399, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 365, 119 + xy: 433, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-blackstone1 rotate: false - xy: 399, 153 + xy: 467, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-blackstone2 rotate: false - xy: 433, 187 + xy: 501, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-blackstone3 rotate: false - xy: 467, 221 + xy: 365, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-grass1 rotate: false - xy: 501, 255 + xy: 399, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-grass2 rotate: false - xy: 365, 85 + xy: 433, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-grass3 rotate: false - xy: 399, 119 + xy: 467, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-ice1 rotate: false - xy: 433, 153 + xy: 501, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-ice2 rotate: false - xy: 467, 187 + xy: 399, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-ice3 rotate: false - xy: 501, 221 + xy: 433, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 399, 85 + xy: 467, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 433, 119 + xy: 501, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 467, 153 + xy: 433, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-snow1 rotate: false - xy: 501, 187 + xy: 467, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-snow2 rotate: false - xy: 433, 85 + xy: 501, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-snow3 rotate: false - xy: 467, 119 + xy: 467, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 501, 153 + xy: 501, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 467, 85 + xy: 501, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 501, 119 + xy: 535, 301 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-blackstone1 rotate: false - xy: 501, 85 + xy: 535, 267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-blackstone2 rotate: false - xy: 535, 301 + xy: 569, 301 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-blackstone3 rotate: false - xy: 535, 267 + xy: 535, 233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 569, 301 + xy: 569, 267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 535, 233 + xy: 535, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 569, 267 + xy: 569, 233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 535, 199 + xy: 535, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 569, 233 + xy: 569, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 535, 165 + xy: 535, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 569, 199 + xy: 569, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 535, 131 + xy: 535, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 569, 165 + xy: 569, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 535, 97 + xy: 569, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 569, 131 + xy: 603, 301 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 569, 97 + xy: 603, 267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 603, 301 + xy: 603, 233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 603, 267 + xy: 603, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 603, 233 + xy: 603, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-blackstone1 rotate: false - xy: 603, 199 + xy: 603, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-blackstone2 rotate: false - xy: 603, 165 + xy: 603, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-blackstone3 rotate: false - xy: 603, 131 + xy: 263, 50 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 603, 97 + xy: 297, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 263, 50 + xy: 331, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 297, 51 + xy: 365, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 331, 51 + xy: 399, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 365, 51 + xy: 433, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 399, 51 + xy: 467, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 433, 51 + xy: 501, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 467, 51 + xy: 535, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 501, 51 + xy: 569, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 535, 63 + xy: 603, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 569, 63 + xy: 535, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 603, 63 + xy: 569, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 535, 29 + xy: 603, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 569, 29 + xy: 242, 16 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 603, 29 + xy: 276, 16 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-blackstone1 rotate: false - xy: 242, 16 + xy: 310, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-blackstone2 rotate: false - xy: 276, 16 + xy: 344, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-blackstone3 rotate: false - xy: 310, 17 + xy: 378, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 344, 17 + xy: 412, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 378, 17 + xy: 446, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 412, 17 + xy: 480, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 446, 17 + xy: 755, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 480, 17 + xy: 1385, 1661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 755, 415 + xy: 1419, 1661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 1385, 1661 + xy: 1453, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 1419, 1661 + xy: 1487, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 1453, 1665 + xy: 1521, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 1487, 1665 + xy: 1555, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 1521, 1665 + xy: 1589, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 1555, 1665 + xy: 1623, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 1589, 1665 + xy: 1657, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 1623, 1665 + xy: 1691, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 1657, 1665 + xy: 1725, 1665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 653, 339 + xy: 637, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 637, 305 + xy: 637, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 637, 271 + xy: 637, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 637, 237 + xy: 637, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 671, 169 + xy: 1453, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 671, 135 + xy: 1487, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 671, 101 + xy: 1521, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 671, 67 + xy: 1555, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 space-cliff-edge rotate: false - xy: 1487, 1631 + xy: 1657, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 space-cliff-edge-1 rotate: false - xy: 1521, 1631 + xy: 1691, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 space-cliff-edge-2 rotate: false - xy: 1555, 1631 + xy: 1725, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 space-cliff-side rotate: false - xy: 1589, 1631 + xy: 1759, 1631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-cliff-edge rotate: false - xy: 1827, 1631 + xy: 1997, 1613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-cliff-edge-1 rotate: false - xy: 1861, 1631 + xy: 789, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-cliff-edge-2 rotate: false - xy: 1895, 1631 + xy: 823, 417 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-cliff-side rotate: false - xy: 1929, 1613 + xy: 1075, 1493 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4787,147 +4836,147 @@ wraith index: -1 item-bioglass rotate: false - xy: 1759, 1699 + xy: 1827, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 1793, 1699 + xy: 1861, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1827, 1699 + xy: 1895, 1699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1861, 1699 + xy: 1041, 1488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1895, 1699 + xy: 793, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-dense-alloy rotate: false - xy: 1041, 1488 + xy: 793, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 793, 655 + xy: 793, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 793, 621 + xy: 793, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 793, 587 + xy: 793, 519 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 793, 553 + xy: 793, 485 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 793, 519 + xy: 793, 451 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 793, 485 + xy: 263, 322 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 793, 451 + xy: 263, 288 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-stone rotate: false - xy: 263, 322 + xy: 263, 254 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 263, 288 + xy: 263, 220 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 263, 254 + xy: 263, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 263, 220 + xy: 263, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 297, 289 + xy: 297, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 365, 323 + xy: 331, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 297, 221 + xy: 365, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 331, 255 + xy: 433, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5190,21 +5239,21 @@ check-off index: -1 check-on rotate: false - xy: 739, 313 + xy: 739, 159 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 739, 279 + xy: 739, 125 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 739, 245 + xy: 739, 91 size: 28, 32 orig: 28, 32 offset: 0, 0 @@ -5232,56 +5281,56 @@ discord-banner index: -1 empty-sector rotate: false - xy: 1249, 1691 + xy: 1317, 1691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 819, 1247 + xy: 229, 54 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 801, 701 + xy: 514, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 1083, 1577 + xy: 819, 1247 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 1041, 1470 + xy: 801, 701 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid rotate: false - xy: 762, 89 + xy: 773, 329 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-power rotate: false - xy: 705, 31 + xy: 2031, 1655 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 771, 1147 + xy: 2031, 1637 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5337,7 +5386,7 @@ icon-admin index: -1 icon-admin-small rotate: false - xy: 1249, 1725 + xy: 660, 1994 size: 6, 6 orig: 6, 6 offset: 0, 0 @@ -5351,14 +5400,14 @@ icon-areaDelete index: -1 icon-arrow rotate: false - xy: 204, 1759 + xy: 770, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 204, 1759 + xy: 770, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5393,7 +5442,7 @@ icon-arrow-up index: -1 icon-back rotate: false - xy: 636, 1852 + xy: 788, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5407,14 +5456,14 @@ icon-ban index: -1 icon-break rotate: false - xy: 753, 1147 + xy: 204, 1759 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 1239, 1733 + xy: 636, 1852 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5428,14 +5477,14 @@ icon-chat index: -1 icon-check rotate: false - xy: 229, 54 + xy: 753, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-copy rotate: false - xy: 514, 33 + xy: 1239, 1733 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5456,112 +5505,112 @@ icon-dev-builds index: -1 icon-discord rotate: false - xy: 1099, 1561 + xy: 773, 313 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 310, 1 + xy: 1099, 1561 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 326, 1 + xy: 310, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 342, 1 + xy: 326, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-egg rotate: false - xy: 358, 1 + xy: 342, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 859, 1237 + xy: 1083, 1577 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 762, 125 + xy: 1041, 1470 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 374, 1 + xy: 358, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-file rotate: false - xy: 21, 3 + xy: 2021, 1727 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 222, 1759 + xy: 21, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 390, 1 + xy: 374, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 762, 107 + xy: 222, 1759 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy rotate: false - xy: 406, 1 + xy: 390, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-floppy-16 rotate: false - xy: 780, 125 + xy: 39, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder rotate: false - xy: 422, 1 + xy: 406, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-folder-parent rotate: false - xy: 438, 1 + xy: 422, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -5575,21 +5624,21 @@ icon-generated index: -1 icon-github rotate: false - xy: 454, 1 + xy: 438, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-google-play rotate: false - xy: 470, 1 + xy: 454, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-grid rotate: false - xy: 39, 3 + xy: 240, 1759 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5610,133 +5659,133 @@ icon-holdDelete index: -1 icon-home rotate: false - xy: 486, 1 + xy: 470, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-host rotate: false - xy: 183, 5 + xy: 486, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-info rotate: false - xy: 723, 37 + xy: 2035, 1843 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-itch.io rotate: false - xy: 1059, 1456 + xy: 183, 5 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-item rotate: false - xy: 2035, 1843 + xy: 724, 21 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-items-none rotate: false - xy: 1077, 1397 + xy: 1077, 1415 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-line rotate: false - xy: 240, 1759 + xy: 57, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-link rotate: false - xy: 532, 13 + xy: 1059, 1456 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-liquid-small rotate: false - xy: 676, 5 + xy: 708, 5 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-load rotate: false - xy: 548, 13 + xy: 789, 313 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-load-image rotate: false - xy: 780, 107 + xy: 791, 330 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-map rotate: false - xy: 57, 3 + xy: 771, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-loading rotate: false - xy: 762, 71 + xy: 514, 15 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-locked rotate: false - xy: 780, 89 + xy: 819, 1229 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-logic rotate: false - xy: 692, 21 + xy: 606, 1832 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-map rotate: false - xy: 564, 13 + xy: 805, 314 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-menu rotate: false - xy: 606, 1832 + xy: 2035, 1831 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-menu-large rotate: false - xy: 780, 71 + xy: 819, 701 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-missing rotate: false - xy: 2035, 1831 + xy: 618, 1832 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5750,245 +5799,245 @@ icon-mission-background index: -1 icon-mission-battle rotate: false - xy: 618, 1832 + xy: 2035, 1819 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-defense rotate: false - xy: 2035, 1819 + xy: 2035, 1807 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-done rotate: false - xy: 2035, 1807 + xy: 2035, 1795 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-none rotate: false - xy: 2035, 1795 + xy: 514, 3 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-nullitem rotate: false - xy: 1257, 1725 + xy: 2021, 1717 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-paste rotate: false - xy: 798, 123 + xy: 2031, 1709 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pause rotate: false - xy: 2037, 1783 + xy: 526, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-pencil rotate: false - xy: 798, 105 + xy: 2031, 1691 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pencil-small rotate: false - xy: 580, 13 + xy: 845, 333 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-pick rotate: false - xy: 798, 87 + xy: 2031, 1673 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play rotate: false - xy: 2037, 1771 + xy: 538, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-play-2 rotate: false - xy: 596, 13 + xy: 532, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-players rotate: false - xy: 2037, 1759 + xy: 550, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-power-small rotate: false - xy: 2037, 1747 + xy: 562, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-quit rotate: false - xy: 612, 13 + xy: 548, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-redo rotate: false - xy: 514, 15 + xy: 2031, 1619 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-refresh rotate: false - xy: 2021, 1771 + xy: 564, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rename rotate: false - xy: 2021, 1755 + xy: 580, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-resize rotate: false - xy: 819, 701 + xy: 2031, 1601 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate rotate: false - xy: 2021, 1739 + xy: 596, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-arrow rotate: false - xy: 2021, 1723 + xy: 612, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-left rotate: false - xy: 816, 125 + xy: 628, 13 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-right rotate: false - xy: 816, 109 + xy: 644, 17 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save rotate: false - xy: 816, 93 + xy: 644, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save-image rotate: false - xy: 819, 1229 + xy: 809, 330 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-map rotate: false - xy: 798, 69 + xy: 827, 331 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-settings rotate: false - xy: 2037, 1735 + xy: 574, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-terrain rotate: false - xy: 736, 46 + xy: 837, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tools rotate: false - xy: 816, 77 + xy: 660, 17 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-touch rotate: false - xy: 2037, 1723 + xy: 586, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-touchDelete rotate: false - xy: 514, 3 + xy: 598, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-trash rotate: false - xy: 628, 13 + xy: 660, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-trash-16 rotate: false - xy: 837, 1237 + xy: 855, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trello rotate: false - xy: 644, 17 + xy: 676, 17 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-tutorial rotate: false - xy: 644, 1 + xy: 676, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -6009,14 +6058,14 @@ icon-unlocked index: -1 icon-unlocks rotate: false - xy: 660, 17 + xy: 692, 17 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-wiki rotate: false - xy: 660, 1 + xy: 692, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -6030,7 +6079,7 @@ icon-zoom index: -1 icon-zoom-small rotate: false - xy: 676, 17 + xy: 708, 17 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -6044,7 +6093,7 @@ info-banner index: -1 inventory rotate: false - xy: 799, 141 + xy: 768, 49 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -6075,7 +6124,7 @@ pane-2 index: -1 scroll rotate: false - xy: 736, 64 + xy: 768, 12 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -6099,7 +6148,7 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 736, 101 + xy: 2021, 1745 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -6107,14 +6156,14 @@ scroll-knob-vertical-black index: -1 sector-edge rotate: false - xy: 637, 101 + xy: 671, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sector-select rotate: false - xy: 637, 67 + xy: 671, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -6128,28 +6177,28 @@ selection index: -1 slider rotate: false - xy: 736, 159 + xy: 532, 41 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 705, 129 + xy: 739, 273 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 705, 89 + xy: 739, 233 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 705, 49 + xy: 739, 193 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -6186,7 +6235,7 @@ white index: -1 window-empty rotate: false - xy: 799, 183 + xy: 739, 28 size: 27, 61 split: 8, 8, 44, 11 orig: 27, 61 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 978154a2bd..a01b69b020 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 595fb76f61..5164fd56ae 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -39,12 +39,8 @@ public class Vars{ public static final String contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors"; /**URL for sending crash reports to*/ public static final String crashReportURL = "http://mindustry.us.to/report"; - /**time between waves in ticks (on normal mode)*/ - public static final float wavespace = 60 * 60 * 1.5f; /**maximum distance between mine and core that supports automatic transferring*/ public static final float mineTransferRange = 220f; - /**maximum distance from core that the player can be before it is no longer used for building*/ - public static final float coreBuildRange = 999999f; /**team of the player by default*/ public static final Team defaultTeam = Team.blue; /**team of the enemy in waves/sectors*/ diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index e7bd728b91..dc44315bb1 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -82,7 +82,7 @@ public class Pathfinder{ } public float getValueforTeam(Team team, int x, int y){ - return paths == null || team.ordinal() >= paths.length ? 0 : Structs.inBounds(x, y, paths[team.ordinal()].weights) ? paths[team.ordinal()].weights[x][y] : 0; + return paths == null || paths[team.ordinal()].weights == null || team.ordinal() >= paths.length ? 0 : Structs.inBounds(x, y, paths[team.ordinal()].weights) ? paths[team.ordinal()].weights[x][y] : 0; } private boolean passable(Tile tile, Team team){ diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 605263946a..1ba3a37028 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -31,7 +31,7 @@ public class Blocks implements ContentList{ //environment air, blockpart, spawn, space, metalfloor, deepwater, water, tar, stone, blackstone, dirt, sand, ice, snow, - grass, shrub, rock, icerock, blackrock, + grass, shrub, rock, icerock, blackrock, rocksSmall, rocksMedium, //crafting siliconSmelter, plastaniumCompressor, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, @@ -209,6 +209,18 @@ public class Blocks implements ContentList{ blackrock = new Rock("blackrock"){{ variants = 1; }}; + + rocksSmall = new Rock("rocks-small"){{ + variants = 2; + breakable = alwaysReplace = false; + solid = true; + }}; + + rocksMedium = new Rock("rocks-medium"){{ + variants = 2; + breakable = alwaysReplace = false; + solid = true; + }}; //endregion //region crafting diff --git a/core/src/io/anuke/mindustry/content/Recipes.java b/core/src/io/anuke/mindustry/content/Recipes.java index 512aeb034d..422cee0cb4 100644 --- a/core/src/io/anuke/mindustry/content/Recipes.java +++ b/core/src/io/anuke/mindustry/content/Recipes.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.content; import io.anuke.mindustry.game.ContentList; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe.RecipeVisibility; @@ -13,11 +12,11 @@ public class Recipes implements ContentList{ @Override public void load(){ //DEBUG - new Recipe(distribution, Blocks.itemSource).setMode(GameMode.sandbox).setHidden(true).setAlwaysUnlocked(true); - new Recipe(distribution, Blocks.itemVoid).setMode(GameMode.sandbox).setHidden(true).setAlwaysUnlocked(true); - new Recipe(liquid, Blocks.liquidSource).setMode(GameMode.sandbox).setHidden(true).setAlwaysUnlocked(true); - new Recipe(power, Blocks.powerVoid).setMode(GameMode.sandbox).setHidden(true).setAlwaysUnlocked(true); - new Recipe(power, Blocks.powerSource).setMode(GameMode.sandbox).setHidden(true).setAlwaysUnlocked(true); + new Recipe(distribution, Blocks.itemSource).setVisible(RecipeVisibility.sandboxOnly).setHidden(true).setAlwaysUnlocked(true); + new Recipe(distribution, Blocks.itemVoid).setVisible(RecipeVisibility.sandboxOnly).setHidden(true).setAlwaysUnlocked(true); + new Recipe(liquid, Blocks.liquidSource).setVisible(RecipeVisibility.sandboxOnly).setHidden(true).setAlwaysUnlocked(true); + new Recipe(power, Blocks.powerVoid).setVisible(RecipeVisibility.sandboxOnly).setHidden(true).setAlwaysUnlocked(true); + new Recipe(power, Blocks.powerSource).setVisible(RecipeVisibility.sandboxOnly).setHidden(true).setAlwaysUnlocked(true); //DEFENSE diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index f5273d500c..47d866d128 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -113,18 +113,7 @@ public class Control implements ApplicationListener{ saves.resetSave(); }); - Events.on(WaveEvent.class, event -> { - - int last = Core.settings.getInt("hiscore" + world.getMap().name, 0); - - if(state.wave > last && !state.mode.infiniteResources && !state.mode.disableWaveTimer){ - Core.settings.put("hiscore" + world.getMap().name, state.wave); - Core.settings.save(); - hiscore = true; - } - - Platform.instance.updateRPC(); - }); + //todo high scores for custom maps, as well as other statistics Events.on(GameOverEvent.class, event -> { Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y); @@ -134,7 +123,7 @@ public class Control implements ApplicationListener{ //autohost for pvp sectors Events.on(WorldLoadEvent.class, event -> { - if(state.mode.isPvp && !Net.active()){ + if(state.rules.pvp && !Net.active()){ try{ Net.host(port); players[0].isAdmin = true; diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java index 4d795a46fc..1b2c2f9d14 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/io/anuke/mindustry/core/GameState.java @@ -1,11 +1,10 @@ package io.anuke.mindustry.core; -import io.anuke.mindustry.game.Difficulty; +import io.anuke.arc.Events; import io.anuke.mindustry.game.EventType.StateChangeEvent; -import io.anuke.mindustry.game.GameMode; +import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.Teams; import io.anuke.mindustry.net.Net; -import io.anuke.arc.Events; import static io.anuke.mindustry.Vars.unitGroups; import static io.anuke.mindustry.Vars.waveTeam; @@ -13,14 +12,12 @@ import static io.anuke.mindustry.Vars.waveTeam; public class GameState{ /**Current wave number, can be anything in non-wave modes.*/ public int wave = 1; - /**Wave countdown in ticks.*/ + /**Wave time in ticks.*/ public float wavetime; /**Whether the game is in game over state.*/ public boolean gameOver = false; - /**The current game mode.*/ - public GameMode mode = GameMode.waves; - /**The current difficulty for wave modes.*/ - public Difficulty difficulty = Difficulty.normal; + /**The current game rules.*/ + public Rules rules = new Rules(); /**Team data. Gets reset every new game.*/ public Teams teams = new Teams(); /**Number of enemies in the game; only used clientside in servers.*/ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 7a18a07f83..f2ac2e130a 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -11,6 +11,7 @@ import io.anuke.arc.util.Time; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Teams; import io.anuke.mindustry.game.UnlockableContent; @@ -56,16 +57,17 @@ public class Logic implements ApplicationListener{ public void play(){ state.set(State.playing); - state.wavetime = wavespace * state.difficulty.timeScaling * 2; + state.wavetime = 0; Events.fire(new PlayEvent()); } public void reset(){ state.wave = 1; - state.wavetime = wavespace * state.difficulty.timeScaling; + state.wavetime = 0; state.gameOver = false; state.teams = new Teams(); + state.rules = new Rules(); Time.clear(); Entities.clear(); @@ -77,16 +79,16 @@ public class Logic implements ApplicationListener{ public void runWave(){ world.spawner.spawnEnemies(); state.wave++; - state.wavetime = wavespace * state.difficulty.timeScaling; + state.wavetime = 0; Events.fire(new WaveEvent()); } private void checkGameOver(){ - if(!state.mode.isPvp && state.teams.get(defaultTeam).cores.size == 0 && !state.gameOver){ + if(!state.rules.pvp && state.teams.get(defaultTeam).cores.size == 0 && !state.gameOver){ state.gameOver = true; Events.fire(new GameOverEvent(waveTeam)); - }else if(state.mode.isPvp){ + }else if(state.rules.pvp){ Team alive = null; for(Team team : Team.all){ @@ -119,16 +121,17 @@ public class Logic implements ApplicationListener{ if(!state.isPaused()){ Time.update(); - if(!state.mode.disableWaveTimer && !state.mode.disableWaves && !state.gameOver){ - state.wavetime -= Time.delta(); + if(state.rules.waves && state.rules.waveTimer && !state.gameOver){ + state.wavetime += Time.delta(); } - if(!Net.client() && state.wavetime <= 0 && !state.mode.disableWaves){ + if(!Net.client() && state.wavetime >= state.rules.waveSpacing && state.rules.waves){ runWave(); } - if(!Entities.defaultGroup().isEmpty()) - throw new RuntimeException("Do not add anything to the default group!"); + if(!Entities.defaultGroup().isEmpty()){ + throw new IllegalArgumentException("Do not add anything to the default group!"); + } if(!headless){ Entities.update(effectGroup); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index c71e350518..dd6d520598 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -193,7 +193,8 @@ public class NetServer implements ApplicationListener{ return; } - if(state.mode.isPvp){ + //playing in pvp mode automatically assigns players to teams + if(state.rules.pvp){ //find team with minimum amount of players and auto-assign player to that. Team min = Structs.findMin(Team.all, team -> { if(state.teams.isActive(team)){ @@ -382,7 +383,7 @@ public class NetServer implements ApplicationListener{ } public boolean isWaitingForPlayers(){ - if(state.mode.isPvp){ + if(state.rules.pvp){ int used = 0; for(Team t : Team.all){ if(playerGroup.count(p -> p.getTeam() == t) > 0){ diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index aebe7621b3..3b88fbf759 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -235,7 +235,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.mode.isPvp){ + }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()){ diff --git a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java index b5dbf4e20d..e06104cdd2 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java @@ -12,7 +12,7 @@ public class UnitDrops{ public static void dropItems(BaseUnit unit){ //items only dropped in waves for enemy team - if(unit.getTeam() != Vars.waveTeam || Vars.state.mode.disableWaves){ + if(unit.getTeam() != Vars.waveTeam || !Vars.state.rules.unitDrops){ return; } diff --git a/core/src/io/anuke/mindustry/game/Difficulty.java b/core/src/io/anuke/mindustry/game/Difficulty.java index c533e1b1a6..ae19a30f49 100644 --- a/core/src/io/anuke/mindustry/game/Difficulty.java +++ b/core/src/io/anuke/mindustry/game/Difficulty.java @@ -2,23 +2,21 @@ package io.anuke.mindustry.game; import io.anuke.arc.Core; +/**Presets for time between waves. + * TODO specify correct time*/ public enum Difficulty{ - training(3f, 3f), - easy(1.4f, 1.5f), - normal(1f, 1f), - hard(0.5f, 0.75f), - insane(0.25f, 0.5f); + easy(1.4f), + normal(1f), + hard(0.5f), + insane(0.25f); /**Multiplier of the time between waves.*/ - public final float timeScaling; - /**Multiplier of spawner grace period.*/ - public final float spawnerScaling; + public final float waveTime; private String value; - Difficulty(float timeScaling, float spawnerScaling){ - this.timeScaling = timeScaling; - this.spawnerScaling = spawnerScaling; + Difficulty(float waveTime){ + this.waveTime = waveTime; } @Override diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java deleted file mode 100644 index 43a6b5c851..0000000000 --- a/core/src/io/anuke/mindustry/game/GameMode.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.anuke.mindustry.game; - -import io.anuke.arc.Core; - -public enum GameMode{ - waves, - sandbox{{ - infiniteResources = true; - disableWaveTimer = true; - }}, - freebuild{{ - disableWaveTimer = true; - }}, - attack{{ - disableWaves = true; - enemyCheat = true; - }}, - victory{{ - disableWaves = true; - hidden = true; - enemyCheat = false; - showMission = false; - }}, - pvp{{ - disableWaves = true; - isPvp = true; - enemyCoreBuildRadius = 600f; - respawnTime = 60 * 10; - }}; - - public boolean infiniteResources, disableWaveTimer, disableWaves, showMission = true, hidden, enemyCheat, isPvp; - public float enemyCoreBuildRadius = 400f; - public float respawnTime = 60 * 4; - - public String description(){ - return Core.bundle.get("mode." + name() + ".description"); - } - - @Override - public String toString(){ - return Core.bundle.get("mode." + name() + ".name"); - } - -} diff --git a/core/src/io/anuke/mindustry/game/RulePreset.java b/core/src/io/anuke/mindustry/game/RulePreset.java new file mode 100644 index 0000000000..ae76a97430 --- /dev/null +++ b/core/src/io/anuke/mindustry/game/RulePreset.java @@ -0,0 +1,46 @@ +package io.anuke.mindustry.game; + +import io.anuke.arc.Core; +import io.anuke.arc.function.Supplier; + +/**Defines preset rule sets..*/ +public enum RulePreset{ + survival(() -> new Rules(){{ + waveTimer = true; + waves = true; + unitDrops = true; + }}), + sandbox(() -> new Rules(){{ + infiniteResources = true; + waves = true; + waveTimer = false; + }}), + attack(() -> new Rules(){{ + enemyCheat = true; + unitDrops = true; + }}), + pvp(() -> new Rules(){{ + pvp = true; + enemyCoreBuildRadius = 600f; + respawnTime = 60 * 10; + }}); + + private final Supplier rules; + + RulePreset(Supplier rules){ + this.rules = rules; + } + + public Rules get(){ + return rules.get(); + } + + public String description(){ + return Core.bundle.get("mode." + name() + ".description"); + } + + @Override + public String toString(){ + return Core.bundle.get("mode." + name() + ".name"); + } +} diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/io/anuke/mindustry/game/Rules.java new file mode 100644 index 0000000000..2983a5e805 --- /dev/null +++ b/core/src/io/anuke/mindustry/game/Rules.java @@ -0,0 +1,27 @@ +package io.anuke.mindustry.game; + +import io.anuke.annotations.Annotations.Serialize; + +/**Defines current rules on how the game should function. + * Does not store game state, just configuration.*/ +@Serialize +public class Rules{ + /**Whether the player has infinite resources.*/ + public boolean infiniteResources; + /**Whether the waves come automatically on a timer. If not, waves come when the play button is pressed.*/ + public boolean waveTimer = true; + /**Whether waves are spawnable at all.*/ + public boolean waves; + /**Whether the enemy AI has infinite resources in most of their buildings and turrets.*/ + public boolean enemyCheat; + /**Whether the game objective is PvP. Note that this enables automatic hosting.*/ + public boolean pvp; + /**Whether enemy units drop random items on death.*/ + public boolean unitDrops; + /**No-build zone around enemy core radius.*/ + public float enemyCoreBuildRadius = 400f; + /**Player respawn time in ticks.*/ + public float respawnTime = 60 * 4; + /**Time between waves in ticks.*/ + public float waveSpacing = 60 * 60; +} diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 05a61e7cba..92e2dce743 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -215,10 +215,6 @@ public class Saves{ return meta.difficulty; } - public GameMode getMode(){ - return meta.mode; - } - public boolean isAutosave(){ return Core.settings.getBool("save-" + index + "-autosave", true); } diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java index 65ff687e76..7fac1100ad 100644 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ b/core/src/io/anuke/mindustry/game/Teams.java @@ -35,7 +35,7 @@ public class Teams{ /**Returns whether a team is active, e.g. whether it has any cores remaining.*/ public boolean isActive(Team team){ //the enemy wave team is always active - return (!Vars.state.mode.disableWaves && team == Vars.waveTeam) || get(team).cores.size > 0; + return (Vars.state.rules.waves && team == Vars.waveTeam) || get(team).cores.size > 0; } /**Returns a set of all teams that are enemies of this team.*/ diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 7a102c2bcc..61d9400df1 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -76,11 +76,11 @@ public class OverlayRenderer{ for(Team enemy : state.teams.enemiesOf(player.getTeam())){ for(Tile core : state.teams.get(enemy).cores){ float dst = Mathf.dst(player.x, player.y, core.drawx(), core.drawy()); - if(dst < state.mode.enemyCoreBuildRadius * 1.5f){ + if(dst < state.rules.enemyCoreBuildRadius * 1.5f){ Draw.color(Color.DARK_GRAY); - Lines.poly(core.drawx(), core.drawy() - 2, 200, state.mode.enemyCoreBuildRadius); + Lines.poly(core.drawx(), core.drawy() - 2, 200, state.rules.enemyCoreBuildRadius); Draw.color(Palette.accent, enemy.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); - Lines.poly(core.drawx(), core.drawy(), 200, state.mode.enemyCoreBuildRadius); + Lines.poly(core.drawx(), core.drawy(), 200, state.rules.enemyCoreBuildRadius); } } } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index d349b52ec7..c5b54dcb7d 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -330,10 +330,8 @@ public abstract class InputHandler implements InputProcessor{ public boolean validPlace(int x, int y, Block type, int rotation){ for(Tile tile : state.teams.get(player.getTeam()).cores){ - if(tile.dst(x * tilesize, y * tilesize) < coreBuildRange){ - return Build.validPlace(player.getTeam(), x, y, type, rotation) && - Mathf.dst(player.x, player.y, x * tilesize, y * tilesize) < Player.placeDistance; - } + return Build.validPlace(player.getTeam(), x, y, type, rotation) && + Mathf.dst(player.x, player.y, x * tilesize, y * tilesize) < Player.placeDistance; } return false; diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index 63898fb591..c733752cc1 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.io; import io.anuke.mindustry.game.Difficulty; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.maps.Map; import static io.anuke.mindustry.Vars.world; @@ -11,7 +10,6 @@ public class SaveMeta{ public int build; public long timestamp; public long timePlayed; - public GameMode mode; public Map map; public int wave; public Difficulty difficulty; @@ -21,7 +19,6 @@ public class SaveMeta{ this.build = build; this.timestamp = timestamp; this.timePlayed = timePlayed; - this.mode = GameMode.values()[mode]; this.map = world.maps.getByName(map); this.wave = wave; this.difficulty = difficulty; diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 67b4bff21e..afc9b633c9 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -1,9 +1,8 @@ package io.anuke.mindustry.io.versions; import io.anuke.arc.util.Time; -import io.anuke.mindustry.game.Difficulty; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.Version; +import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.io.SaveFileVersion; import io.anuke.mindustry.maps.Map; @@ -26,18 +25,15 @@ public class Save16 extends SaveFileVersion{ stream.readInt(); //build //general state - byte mode = stream.readByte(); + state.rules = Serialization.readRules(stream); String mapname = stream.readUTF(); Map map = world.maps.getByName(mapname); if(map == null) map = new Map("unknown", 1, 1); world.setMap(map); int wave = stream.readInt(); - byte difficulty = stream.readByte(); float wavetime = stream.readFloat(); - state.difficulty = Difficulty.values()[difficulty]; - state.mode = GameMode.values()[mode]; state.wave = wave; state.wavetime = wavetime; @@ -59,11 +55,10 @@ public class Save16 extends SaveFileVersion{ stream.writeInt(Version.build); //build //--GENERAL STATE-- - stream.writeByte(state.mode.ordinal()); //gamemode - stream.writeUTF(world.getMap().name); //map ID + Serialization.writeRules(stream, state.rules); + stream.writeUTF(world.getMap().name); //map name stream.writeInt(state.wave); //wave - stream.writeByte(state.difficulty.ordinal()); //difficulty ordinal stream.writeFloat(state.wavetime); //wave countdown writeContentHeader(stream); diff --git a/core/src/io/anuke/mindustry/maps/MapMeta.java b/core/src/io/anuke/mindustry/maps/MapMeta.java index 6b6f5f3e18..74228aa5b4 100644 --- a/core/src/io/anuke/mindustry/maps/MapMeta.java +++ b/core/src/io/anuke/mindustry/maps/MapMeta.java @@ -4,6 +4,7 @@ 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; diff --git a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java index 56b693ae7e..7348825262 100644 --- a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java @@ -21,6 +21,7 @@ public class BasicGenerator extends RandomGenerator{ @Override public void generate(Tile[][] tiles){ + //todo use set seed int seed = Mathf.random(99999999); sim.setSeed(seed); sim2.setSeed(seed + 1); @@ -42,5 +43,17 @@ public class BasicGenerator extends RandomGenerator{ } } } + + //rock outcrops + double rocks = sim.octaveNoise2D(3, 0.7, 1f / 70f, x, y); + double edgeDist = Math.min(x, Math.min(y, Math.min(Math.abs(x - (width - 1)), Math.abs(y - (height - 1))))); + double transition = 8; + if(edgeDist < transition){ + rocks += (transition - edgeDist) / transition / 1.5; + } + + if(rocks > 0.64){ + block = Blocks.rocksSmall; + } } } diff --git a/core/src/io/anuke/mindustry/net/Host.java b/core/src/io/anuke/mindustry/net/Host.java index 261c60fc7e..77a281d8ec 100644 --- a/core/src/io/anuke/mindustry/net/Host.java +++ b/core/src/io/anuke/mindustry/net/Host.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.net; -import io.anuke.mindustry.game.GameMode; - public class Host{ public final String name; public final String address; @@ -10,9 +8,8 @@ public class Host{ public final int players; public final int version; public final String versionType; - public final GameMode mode; - public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, GameMode mode){ + public Host(String name, String address, String mapname, int wave, int players, int version, String versionType){ this.name = name; this.address = address; this.players = players; @@ -20,6 +17,5 @@ public class Host{ this.wave = wave; this.version = version; this.versionType = versionType; - this.mode = mode; } } diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index de8c19f769..1cd00ca006 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -8,11 +8,11 @@ import io.anuke.arc.util.Pack; import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.entities.Player; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Teams; import io.anuke.mindustry.game.Teams.TeamData; import io.anuke.mindustry.game.Version; +import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.MapMeta; import io.anuke.mindustry.world.Tile; @@ -30,7 +30,7 @@ public class NetworkIO{ try(DataOutputStream stream = new DataOutputStream(os)){ //--GENERAL STATE-- - stream.writeByte(state.mode.ordinal()); //gamemode + Serialization.writeRules(stream, state.rules); stream.writeUTF(world.getMap().name); //map name //write tags @@ -121,7 +121,7 @@ public class NetworkIO{ Time.clear(); //general state - byte mode = stream.readByte(); + state.rules = Serialization.readRules(stream); String map = stream.readUTF(); ObjectMap tags = new ObjectMap<>(); @@ -138,7 +138,6 @@ public class NetworkIO{ state.wave = wave; state.wavetime = wavetime; - state.mode = GameMode.values()[mode]; Entities.clear(); int id = stream.readInt(); @@ -256,7 +255,6 @@ public class NetworkIO{ buffer.putInt(Version.build); buffer.put((byte)Version.type.getBytes(StandardCharsets.UTF_8).length); buffer.put(Version.type.getBytes(StandardCharsets.UTF_8)); - buffer.put((byte)state.mode.ordinal()); return buffer; } @@ -279,8 +277,7 @@ public class NetworkIO{ byte[] tb = new byte[tlength]; buffer.get(tb); String vertype = new String(tb, StandardCharsets.UTF_8); - GameMode mode = GameMode.values()[buffer.get()]; - return new Host(host, hostAddress, map, wave, players, version, vertype, mode); + return new Host(host, hostAddress, map, wave, players, version, vertype); } } diff --git a/core/src/io/anuke/mindustry/type/Recipe.java b/core/src/io/anuke/mindustry/type/Recipe.java index c3c1356725..3cea86d00b 100644 --- a/core/src/io/anuke/mindustry/type/Recipe.java +++ b/core/src/io/anuke/mindustry/type/Recipe.java @@ -9,7 +9,6 @@ import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Log; import io.anuke.arc.util.Strings; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.ui.ContentDisplay; import io.anuke.mindustry.world.Block; @@ -31,13 +30,9 @@ public class Recipe extends UnlockableContent{ public final float cost; public RecipeVisibility visibility = RecipeVisibility.all; - //the only gamemode in which the recipe shows up - public GameMode mode; public boolean hidden; public boolean alwaysUnlocked; - private UnlockableContent[] dependencies; - public Recipe(Category category, Block result, ItemStack... requirements){ this.result = result; this.requirements = requirements; @@ -59,7 +54,7 @@ public class Recipe extends UnlockableContent{ public static Array getByCategory(Category category){ returnArray.clear(); for(Recipe recipe : content.recipes()){ - if(recipe.category == category && recipe.visibility.shown() && (recipe.mode == state.mode || recipe.mode == null)){ + if(recipe.category == category && recipe.visibility.shown()){ returnArray.add(recipe); } } @@ -75,11 +70,6 @@ public class Recipe extends UnlockableContent{ return this; } - public Recipe setMode(GameMode mode){ - this.mode = mode; - return this; - } - public Recipe setHidden(boolean hidden){ this.hidden = hidden; return this; @@ -153,7 +143,13 @@ public class Recipe extends UnlockableContent{ public enum RecipeVisibility{ mobileOnly(true, false), desktopOnly(false, true), - all(true, true); + all(true, true), + sandboxOnly(true, true){ + @Override + public boolean usable(){ + return state.rules.infiniteResources; + } + }; public final boolean mobile, desktop; @@ -162,8 +158,12 @@ public class Recipe extends UnlockableContent{ this.desktop = desktop; } + public boolean usable(){ + return true; + } + public boolean shown(){ - return (Vars.mobile && mobile) || (!Vars.mobile && desktop); + return usable() && ((Vars.mobile && mobile) || (!Vars.mobile && desktop)); } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java index 41b2c54335..6e1c8add8c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java @@ -12,13 +12,14 @@ import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Align; import io.anuke.arc.util.Scaling; import io.anuke.mindustry.game.Difficulty; -import io.anuke.mindustry.game.GameMode; +import io.anuke.mindustry.game.RulePreset; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.ui.BorderImage; import static io.anuke.mindustry.Vars.*; public class CustomGameDialog extends FloatingDialog{ + Difficulty difficulty = Difficulty.normal; public CustomGameDialog(){ super("$customgame"); @@ -46,11 +47,11 @@ public class CustomGameDialog extends FloatingDialog{ Table modes = new Table(); modes.marginBottom(5); - for(GameMode mode : GameMode.values()){ - if(mode.hidden) continue; + for(RulePreset mode : RulePreset.values()){ - modes.addButton("$mode." + mode.name() + ".name", "toggle", () -> state.mode = mode) - .update(b -> b.setChecked(state.mode == mode)).group(group).size(140f, 54f); + //todo fix presets + modes.addButton(mode.toString(), "toggle", () -> state.rules = mode.get())/* + .update(b -> b.setChecked(state.rules == mode))*/.group(group).size(140f, 54f); if(i++ % 2 == 1) modes.row(); } selmode.add(modes); @@ -66,20 +67,21 @@ public class CustomGameDialog extends FloatingDialog{ Table sdif = new Table(); sdif.add("$setting.difficulty.name").padRight(15f); - sdif.defaults().height(s + 4); sdif.addImageButton("icon-arrow-left", 10 * 3, () -> { - state.difficulty = (ds[Mathf.mod(state.difficulty.ordinal() - 1, ds.length)]); + difficulty = (ds[Mathf.mod(difficulty.ordinal() - 1, ds.length)]); + state.wavetime = difficulty.waveTime; }).width(s); sdif.addButton("", () -> {}) .update(t -> { - t.setText(state.difficulty.toString()); + t.setText(difficulty.toString()); t.touchable(Touchable.disabled); }).width(180f); sdif.addImageButton("icon-arrow-right", 10 * 3, () -> { - state.difficulty = (ds[Mathf.mod(state.difficulty.ordinal() + 1, ds.length)]); + difficulty = (ds[Mathf.mod(difficulty.ordinal() + 1, ds.length)]); + state.wavetime = difficulty.waveTime; }).width(s); cont.add(sdif); @@ -141,8 +143,7 @@ public class CustomGameDialog extends FloatingDialog{ ScrollPane pane = new ScrollPane(table); pane.setFadeScrollBars(false); table.row(); - for(GameMode mode : GameMode.values()){ - if(mode.hidden) continue; + for(RulePreset mode : RulePreset.values()){ table.labelWrap("[accent]" + mode.toString() + ":[] [lightgray]" + mode.description()).width(400f); table.row(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 5383cd9bc7..8f79f4703a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -112,9 +112,7 @@ public class LoadDialog extends FloatingDialog{ button.defaults().padBottom(3); button.row(); - button.add(Core.bundle.format("save.map", color + (slot.getMap() == null ? "Unknown" : slot.getMap().meta.name()))); - button.row(); - button.add(Core.bundle.get("level.mode") + " " + color + slot.getMode()); + button.add(Core.bundle.format("save.map", color + (slot.getMap() == null ? Core.bundle.get("unknown") : slot.getMap().meta.name()))); button.row(); button.add(Core.bundle.format("save.wave", color + slot.getWave())); button.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/RestartDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/RestartDialog.java index 61767411b8..094f6c9d08 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/RestartDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/RestartDialog.java @@ -26,7 +26,7 @@ public class RestartDialog extends FloatingDialog{ buttons.margin(10); - if(state.mode.isPvp){ + if(state.rules.pvp){ cont.add(Core.bundle.format("gameover.pvp",winner.localized())).pad(6); buttons.addButton("$menu", () -> { hide(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index b7750a2f74..5b8e23ebcf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -369,18 +369,18 @@ public class HudFragment extends Fragment{ table.touchable(Touchable.enabled); table.labelWrap(() -> - (state.enemies() > 0 && state.mode.disableWaveTimer ? + (state.enemies() > 0 && !state.rules.waveTimer ? wavef.get(state.wave) + "\n" + (state.enemies() == 1 ? enemyf.get(state.enemies()) : enemiesf.get(state.enemies())) : wavef.get(state.wave) + "\n" + - (!state.mode.disableWaveTimer ? + (state.rules.waveTimer ? Core.bundle.format("wave.waiting", (int)(state.wavetime/60)) : Core.bundle.get("waiting"))) ).growX().pad(8f); table.setDisabled(true); - table.visible(() -> !(state.mode.disableWaves || !state.mode.showMission)); + table.visible(() -> state.rules.waves); } private void addPlayButton(Table table){ @@ -391,11 +391,11 @@ public class HudFragment extends Fragment{ state.wavetime = 0f; } }).growY().fillX().right().width(40f).update(l -> { - boolean vis = state.mode.disableWaveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()); + boolean vis = !state.rules.waveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()); boolean paused = state.is(State.paused) || !vis; l.getStyle().imageUp = Core.scene.skin.getDrawable(vis ? "icon-play" : "clear"); l.touchable(!paused ? Touchable.enabled : Touchable.disabled); - }).visible(() -> state.mode.disableWaveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()) && unitGroups[Team.red.ordinal()].size() == 0); + }).visible(() -> !state.rules.waveTimer && ((Net.server() || players[0].isAdmin) || !Net.active()) && unitGroups[Team.red.ordinal()].size() == 0); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 2746a85c4a..77f7f464a8 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -134,7 +134,7 @@ public class PlacementFragment extends Fragment{ button.update(() -> { //color unplacable things gray boolean ulock = data.isUnlocked(recipe); TileEntity core = players[0].getClosestCore(); - Color color = core != null && (core.items.has(recipe.requirements) || state.mode.infiniteResources) ? Color.WHITE : ulock ? Color.GRAY : Color.WHITE; + Color color = core != null && (core.items.has(recipe.requirements) || state.rules.infiniteResources) ? Color.WHITE : ulock ? Color.GRAY : Color.WHITE; button.forEach(elem -> elem.setColor(color)); button.setChecked(input.recipe == recipe); @@ -196,7 +196,7 @@ public class PlacementFragment extends Fragment{ line.add(stack.item.localizedName()).color(Color.LIGHT_GRAY).padLeft(2).left(); line.labelWrap(() -> { TileEntity core = players[0].getClosestCore(); - if(core == null || state.mode.infiniteResources) return "*/*"; + if(core == null || state.rules.infiniteResources) return "*/*"; int amount = core.items.get(stack.item); String color = (amount < stack.amount / 2f ? "[red]" : amount < stack.amount ? "[accent]" : "[white]"); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 89b43f5ffc..bea91a8001 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -1,13 +1,6 @@ package io.anuke.mindustry.ui.fragments; import io.anuke.arc.Core; -import io.anuke.arc.util.Interval; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.NetConnection; -import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.scene.Group; @@ -15,7 +8,13 @@ import io.anuke.arc.scene.event.Touchable; import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Unit; -import io.anuke.arc.util.Timer; +import io.anuke.arc.util.Interval; +import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.gen.Call; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.NetConnection; +import io.anuke.mindustry.net.Packets.AdminAction; import static io.anuke.mindustry.Vars.*; @@ -137,7 +136,7 @@ public class PlayerListFragment extends Fragment{ content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); content.row(); - content.addImage("blank").height(3f).color(state.mode.isPvp ? player.getTeam().color : Palette.accent).growX(); + content.addImage("blank").height(3f).color(state.rules.pvp ? player.getTeam().color : Palette.accent).growX(); content.row(); }); diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index ed1e3f7443..c65cd729db 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -109,7 +109,7 @@ public class Build{ public static boolean validPlace(Team team, int x, int y, Block type, int rotation){ Recipe recipe = Recipe.getByResult(type); - if(recipe == null || (recipe.mode != null && recipe.mode != state.mode)){ + if(recipe == null || (!recipe.visibility.usable())){ return false; } @@ -121,7 +121,7 @@ public class Build{ //check for enemy cores for(Team enemy : state.teams.enemiesOf(team)){ for(Tile core : state.teams.get(enemy).cores){ - if(Mathf.dst(x*tilesize + type.offset(), y*tilesize + type.offset(), core.drawx(), core.drawy()) < state.mode.enemyCoreBuildRadius + type.size*tilesize/2f){ + if(Mathf.dst(x*tilesize + type.offset(), y*tilesize + type.offset(), core.drawx(), core.drawy()) < state.rules.enemyCoreBuildRadius + type.size*tilesize/2f){ return false; } } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 2caf080c81..e9a80f3a74 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -205,7 +205,7 @@ public class Tile implements Position, TargetTrait{ } public boolean isEnemyCheat(){ - return getTeam() == waveTeam && !state.mode.isPvp; + return getTeam() == waveTeam && !state.rules.pvp; } public boolean isLinked(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 441508c55c..5e2ac59189 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -195,7 +195,7 @@ public class BuildBlock extends Block{ builderID = builder.getID(); } - if(progress >= 1f || state.mode.infiniteResources){ + if(progress >= 1f || state.rules.infiniteResources){ Call.onConstructFinish(tile, recipe.result, builderID, tile.getRotation(), builder.getTeam()); } } @@ -226,7 +226,7 @@ public class BuildBlock extends Block{ progress = Mathf.clamp(progress - amount); - if(progress <= 0 || state.mode.infiniteResources){ + if(progress <= 0 || state.rules.infiniteResources){ Call.onDeconstructFinish(tile, this.recipe == null ? previous : this.recipe.result); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 9887e35cdb..d91b70b777 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -185,7 +185,7 @@ public class CoreBlock extends StorageBlock{ } entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.1f); entity.time += entity.delta(); - entity.progress += 1f / state.mode.respawnTime * entity.delta(); + entity.progress += 1f / state.rules.respawnTime * entity.delta(); if(entity.progress >= 1f){ Call.onUnitRespawn(tile, entity.currentUnit); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 969c606c1c..8d1bc3713f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -154,8 +154,8 @@ public class UnitFactory extends Block{ entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f); } //check if grace period had passed - }else if(entity.warmup > produceTime*gracePeriodMultiplier * Vars.state.difficulty.spawnerScaling){ - float speedMultiplier = Math.min(0.1f + (entity.warmup - produceTime * gracePeriodMultiplier * Vars.state.difficulty.spawnerScaling) / speedupTime, maxSpeedup); + }else if(entity.warmup > produceTime*gracePeriodMultiplier){ + float speedMultiplier = Math.min(0.1f + (entity.warmup - produceTime * gracePeriodMultiplier) / speedupTime, maxSpeedup); //otherwise, it's an enemy, cheat by not requiring resources entity.buildTime += entity.delta() * speedMultiplier; entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); diff --git a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java index 353fd9a106..c2e23ee01b 100644 --- a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java +++ b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java @@ -77,7 +77,6 @@ public class CrashHandler{ ex(() -> value.addChild("build", new JsonValue(Version.build))); ex(() -> value.addChild("net", new JsonValue(fn))); ex(() -> value.addChild("server", new JsonValue(fs))); - ex(() -> value.addChild("gamemode", new JsonValue(Vars.state.mode.name()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); ex(() -> value.addChild("trace", new JsonValue(parseException(e)))); diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index 9dcbe0c00c..24c8be9015 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -11,7 +11,6 @@ import io.anuke.arc.util.Strings; import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.Platform; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.dialogs.FileChooser; @@ -51,22 +50,18 @@ public class DesktopPlatform extends Platform{ DiscordRichPresence presence = new DiscordRichPresence(); if(!state.is(State.menu)){ - presence.state = Strings.capitalize(state.mode.name()); + presence.state = state.rules.waves ? "Survival" : "Attack"; if(world.getMap() == null){ presence.details = "Unknown Map"; - }else if(state.mode.disableWaves){ + }else if(!state.rules.waves){ presence.details = Strings.capitalize(world.getMap().name); }else{ presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave; presence.largeImageText = "Wave " + state.wave; } - if(state.mode != GameMode.attack){ - presence.state = Strings.capitalize(state.mode.name()); - }else{ - presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" : - (unitGroups[players[0].getTeam().ordinal()].size() + " Units Active"); - } + presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" : + (unitGroups[players[0].getTeam().ordinal()].size() + " Units Active"); if(Net.active()){ presence.partyMax = 16; diff --git a/server/src/io/anuke/mindustry/server/CrashHandler.java b/server/src/io/anuke/mindustry/server/CrashHandler.java index ce1311ca24..9537a1d6bb 100644 --- a/server/src/io/anuke/mindustry/server/CrashHandler.java +++ b/server/src/io/anuke/mindustry/server/CrashHandler.java @@ -48,9 +48,7 @@ public class CrashHandler{ ex(() -> value.addChild("versionNumber", new JsonValue(Version.number))); ex(() -> value.addChild("versionModifier", new JsonValue(Version.modifier))); ex(() -> value.addChild("build", new JsonValue(Version.build))); - ex(() -> value.addChild("mode", new JsonValue(Vars.state.mode.name()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); - ex(() -> value.addChild("difficulty", new JsonValue(Vars.state.difficulty.name()))); ex(() -> value.addChild("players", new JsonValue(Vars.playerGroup.size()))); ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); ex(() -> value.addChild("trace", new JsonValue(parseException(e)))); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index db72873867..a0acd29484 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -16,8 +16,6 @@ import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.GameOverEvent; -import io.anuke.mindustry.game.EventType.SectorCompleteEvent; -import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; @@ -139,7 +137,7 @@ public class ServerControl implements ApplicationListener{ while(map == previous) map = maps.random(); } - Call.onInfoMessage((state.mode.isPvp + 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() + "[]" : "") + "."+ @@ -188,7 +186,7 @@ public class ServerControl implements ApplicationListener{ info("Stopped server."); }); - handler.register("host", "[mapname] [mode]", "Open the server with a specific map.", arg -> { + handler.register("host", "[mapname]", "Open the server with a specific map.", arg -> { if(state.is(State.playing)){ err("Already hosting. Type 'stop' to stop hosting first."); return; @@ -212,18 +210,7 @@ public class ServerControl implements ApplicationListener{ info("Loading map..."); - - if(arg.length > 1){ - GameMode mode; - try{ - mode = GameMode.valueOf(arg[1]); - }catch(IllegalArgumentException e){ - err("No gamemode '{0}' found.", arg[1]); - return; - } - - state.mode = mode; - } + err("TODO select gamemode"); logic.reset(); world.loadMap(result); @@ -231,7 +218,7 @@ public class ServerControl implements ApplicationListener{ }else{ //TODO - info("TODO play generated map"); + err("TODO play generated map"); } info("Map loaded."); @@ -266,9 +253,9 @@ public class ServerControl implements ApplicationListener{ info("Status: &rserver closed"); }else{ info("Status:"); - info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1} &lb/&ly {2} &lb/&ly {3}", Strings.capitalize(world.getMap().name), state.wave, Strings.capitalize(state.difficulty.name()), Strings.capitalize(state.mode.name())); + info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1} &lb/&ly {2} &lb/&ly {3}", Strings.capitalize(world.getMap().name), state.wave); - if(state.mode.disableWaveTimer){ + if(!state.rules.waves){ info("&ly {0} enemies.", unitGroups[Team.red.ordinal()].size()); }else{ info("&ly {0} seconds until next wave.", (int) (state.wavetime / 60)); @@ -301,7 +288,7 @@ public class ServerControl implements ApplicationListener{ handler.register("difficulty", "", "Set game difficulty.", arg -> { try{ - state.difficulty = Difficulty.valueOf(arg[0]); + state.rules.waveSpacing = Difficulty.valueOf(arg[0]).waveTime; info("Difficulty set to '{0}'.", arg[0]); }catch(IllegalArgumentException e){ err("No difficulty with name '{0}' found.", arg[0]); diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 7b3a069bb1..8dc44fecc8 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -198,7 +198,7 @@ public class ApplicationTests{ @Test void inventoryDeposit(){ - depositTest(Blocks.smelter, Items.copper); + depositTest(Blocks.surgeSmelter, Items.copper); depositTest(Blocks.vault, Items.copper); depositTest(Blocks.thoriumReactor, Items.thorium); }