1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-06-13 13:04:03 +00:00

Merge branch 'master' into master

This commit is contained in:
Yoshie2000 2020-08-31 12:15:27 +02:00 committed by GitHub
commit ba576a8a88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 2917 additions and 2762 deletions

View File

@ -18,7 +18,7 @@
}, },
"sprites/belt/built/forward_2.png": "sprites/belt/built/forward_2.png":
{ {
"frame": {"x":1802,"y":1366,"w":116,"h":144}, "frame": {"x":1804,"y":1366,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -26,7 +26,7 @@
}, },
"sprites/belt/built/forward_3.png": "sprites/belt/built/forward_3.png":
{ {
"frame": {"x":1922,"y":1405,"w":116,"h":144}, "frame": {"x":1924,"y":1405,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -34,7 +34,7 @@
}, },
"sprites/belt/built/forward_4.png": "sprites/belt/built/forward_4.png":
{ {
"frame": {"x":1796,"y":1514,"w":116,"h":144}, "frame": {"x":439,"y":1038,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -42,7 +42,7 @@
}, },
"sprites/belt/built/forward_5.png": "sprites/belt/built/forward_5.png":
{ {
"frame": {"x":1796,"y":1662,"w":116,"h":144}, "frame": {"x":1801,"y":1514,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -50,7 +50,7 @@
}, },
"sprites/belt/built/forward_6.png": "sprites/belt/built/forward_6.png":
{ {
"frame": {"x":1916,"y":1693,"w":116,"h":144}, "frame": {"x":1921,"y":1553,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -58,7 +58,7 @@
}, },
"sprites/belt/built/forward_7.png": "sprites/belt/built/forward_7.png":
{ {
"frame": {"x":1795,"y":1810,"w":116,"h":144}, "frame": {"x":1801,"y":1662,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -66,7 +66,7 @@
}, },
"sprites/belt/built/forward_8.png": "sprites/belt/built/forward_8.png":
{ {
"frame": {"x":145,"y":1887,"w":116,"h":144}, "frame": {"x":1921,"y":1701,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -74,7 +74,7 @@
}, },
"sprites/belt/built/forward_9.png": "sprites/belt/built/forward_9.png":
{ {
"frame": {"x":265,"y":1887,"w":116,"h":144}, "frame": {"x":137,"y":1849,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -82,7 +82,7 @@
}, },
"sprites/belt/built/forward_10.png": "sprites/belt/built/forward_10.png":
{ {
"frame": {"x":1537,"y":1139,"w":116,"h":144}, "frame": {"x":1539,"y":1139,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -90,7 +90,7 @@
}, },
"sprites/belt/built/forward_11.png": "sprites/belt/built/forward_11.png":
{ {
"frame": {"x":1804,"y":1218,"w":116,"h":144}, "frame": {"x":1538,"y":1287,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -98,7 +98,7 @@
}, },
"sprites/belt/built/forward_12.png": "sprites/belt/built/forward_12.png":
{ {
"frame": {"x":1924,"y":1257,"w":116,"h":144}, "frame": {"x":1806,"y":1218,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -106,7 +106,7 @@
}, },
"sprites/belt/built/forward_13.png": "sprites/belt/built/forward_13.png":
{ {
"frame": {"x":439,"y":1038,"w":116,"h":144}, "frame": {"x":1926,"y":1257,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -114,7 +114,7 @@
}, },
"sprites/belt/built/left_0.png": "sprites/belt/built/left_0.png":
{ {
"frame": {"x":961,"y":1033,"w":130,"h":130}, "frame": {"x":3,"y":1182,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -122,7 +122,7 @@
}, },
"sprites/belt/built/left_1.png": "sprites/belt/built/left_1.png":
{ {
"frame": {"x":1523,"y":1287,"w":130,"h":130}, "frame": {"x":137,"y":1182,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -130,7 +130,7 @@
}, },
"sprites/belt/built/left_2.png": "sprites/belt/built/left_2.png":
{ {
"frame": {"x":137,"y":1700,"w":130,"h":130}, "frame": {"x":283,"y":1703,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -138,7 +138,7 @@
}, },
"sprites/belt/built/left_3.png": "sprites/belt/built/left_3.png":
{ {
"frame": {"x":271,"y":1700,"w":130,"h":130}, "frame": {"x":389,"y":1849,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -146,7 +146,7 @@
}, },
"sprites/belt/built/left_4.png": "sprites/belt/built/left_4.png":
{ {
"frame": {"x":545,"y":1736,"w":130,"h":130}, "frame": {"x":417,"y":1703,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -154,7 +154,7 @@
}, },
"sprites/belt/built/left_5.png": "sprites/belt/built/left_5.png":
{ {
"frame": {"x":927,"y":1578,"w":130,"h":130}, "frame": {"x":523,"y":1849,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -162,7 +162,7 @@
}, },
"sprites/belt/built/left_6.png": "sprites/belt/built/left_6.png":
{ {
"frame": {"x":786,"y":1649,"w":130,"h":130}, "frame": {"x":551,"y":1703,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -170,7 +170,7 @@
}, },
"sprites/belt/built/left_7.png": "sprites/belt/built/left_7.png":
{ {
"frame": {"x":645,"y":1887,"w":130,"h":130}, "frame": {"x":657,"y":1849,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -178,7 +178,7 @@
}, },
"sprites/belt/built/left_8.png": "sprites/belt/built/left_8.png":
{ {
"frame": {"x":779,"y":1887,"w":130,"h":130}, "frame": {"x":791,"y":1408,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -186,7 +186,7 @@
}, },
"sprites/belt/built/left_9.png": "sprites/belt/built/left_9.png":
{ {
"frame": {"x":913,"y":1887,"w":130,"h":130}, "frame": {"x":685,"y":1703,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -194,7 +194,7 @@
}, },
"sprites/belt/built/left_10.png": "sprites/belt/built/left_10.png":
{ {
"frame": {"x":1519,"y":1421,"w":130,"h":130}, "frame": {"x":425,"y":1186,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -202,7 +202,7 @@
}, },
"sprites/belt/built/left_11.png": "sprites/belt/built/left_11.png":
{ {
"frame": {"x":1519,"y":1555,"w":130,"h":130}, "frame": {"x":425,"y":1320,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -210,7 +210,7 @@
}, },
"sprites/belt/built/left_12.png": "sprites/belt/built/left_12.png":
{ {
"frame": {"x":1915,"y":1841,"w":130,"h":130}, "frame": {"x":424,"y":1454,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -218,7 +218,7 @@
}, },
"sprites/belt/built/left_13.png": "sprites/belt/built/left_13.png":
{ {
"frame": {"x":3,"y":1700,"w":130,"h":130}, "frame": {"x":144,"y":1465,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -226,7 +226,7 @@
}, },
"sprites/belt/built/right_0.png": "sprites/belt/built/right_0.png":
{ {
"frame": {"x":1047,"y":1887,"w":130,"h":130}, "frame": {"x":925,"y":1476,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -234,7 +234,7 @@
}, },
"sprites/belt/built/right_1.png": "sprites/belt/built/right_1.png":
{ {
"frame": {"x":1181,"y":1887,"w":130,"h":130}, "frame": {"x":565,"y":1542,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -242,7 +242,7 @@
}, },
"sprites/belt/built/right_2.png": "sprites/belt/built/right_2.png":
{ {
"frame": {"x":920,"y":1712,"w":130,"h":130}, "frame": {"x":1461,"y":1703,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -250,7 +250,7 @@
}, },
"sprites/belt/built/right_3.png": "sprites/belt/built/right_3.png":
{ {
"frame": {"x":1054,"y":1735,"w":130,"h":130}, "frame": {"x":791,"y":1849,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -258,7 +258,7 @@
}, },
"sprites/belt/built/right_4.png": "sprites/belt/built/right_4.png":
{ {
"frame": {"x":1188,"y":1735,"w":130,"h":130}, "frame": {"x":925,"y":1610,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -266,7 +266,7 @@
}, },
"sprites/belt/built/right_5.png": "sprites/belt/built/right_5.png":
{ {
"frame": {"x":1322,"y":1703,"w":130,"h":130}, "frame": {"x":1059,"y":1740,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -274,7 +274,7 @@
}, },
"sprites/belt/built/right_6.png": "sprites/belt/built/right_6.png":
{ {
"frame": {"x":405,"y":1315,"w":130,"h":130}, "frame": {"x":1193,"y":1805,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -282,7 +282,7 @@
}, },
"sprites/belt/built/right_7.png": "sprites/belt/built/right_7.png":
{ {
"frame": {"x":405,"y":1449,"w":130,"h":130}, "frame": {"x":1327,"y":1827,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -290,7 +290,7 @@
}, },
"sprites/belt/built/right_8.png": "sprites/belt/built/right_8.png":
{ {
"frame": {"x":405,"y":1583,"w":130,"h":130}, "frame": {"x":925,"y":1744,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -298,7 +298,7 @@
}, },
"sprites/belt/built/right_9.png": "sprites/belt/built/right_9.png":
{ {
"frame": {"x":3,"y":1182,"w":130,"h":130}, "frame": {"x":1059,"y":1874,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -306,7 +306,7 @@
}, },
"sprites/belt/built/right_10.png": "sprites/belt/built/right_10.png":
{ {
"frame": {"x":1315,"y":1887,"w":130,"h":130}, "frame": {"x":699,"y":1542,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -314,7 +314,7 @@
}, },
"sprites/belt/built/right_11.png": "sprites/belt/built/right_11.png":
{ {
"frame": {"x":1449,"y":1887,"w":130,"h":130}, "frame": {"x":1059,"y":1606,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -322,7 +322,7 @@
}, },
"sprites/belt/built/right_12.png": "sprites/belt/built/right_12.png":
{ {
"frame": {"x":1583,"y":1887,"w":130,"h":130}, "frame": {"x":1193,"y":1671,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -330,7 +330,7 @@
}, },
"sprites/belt/built/right_13.png": "sprites/belt/built/right_13.png":
{ {
"frame": {"x":1061,"y":1601,"w":130,"h":130}, "frame": {"x":1327,"y":1693,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -338,7 +338,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":137,"y":1182,"w":130,"h":130}, "frame": {"x":925,"y":1878,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -346,7 +346,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":271,"y":1182,"w":130,"h":130}, "frame": {"x":1461,"y":1849,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -354,7 +354,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":385,"y":1887,"w":116,"h":144}, "frame": {"x":3,"y":1318,"w":116,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -386,7 +386,7 @@
}, },
"sprites/blueprints/display.png": "sprites/blueprints/display.png":
{ {
"frame": {"x":1916,"y":1553,"w":128,"h":136}, "frame": {"x":257,"y":1849,"w":128,"h":136},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":8,"y":8,"w":128,"h":136}, "spriteSourceSize": {"x":8,"y":8,"w":128,"h":136},
@ -458,7 +458,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":1513,"y":1689,"w":136,"h":143}, "frame": {"x":123,"y":1318,"w":136,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":143}, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
@ -506,7 +506,7 @@
}, },
"sprites/blueprints/reader.png": "sprites/blueprints/reader.png":
{ {
"frame": {"x":1086,"y":1313,"w":141,"h":144}, "frame": {"x":938,"y":1181,"w":141,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":144}, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
@ -514,7 +514,7 @@
}, },
"sprites/blueprints/rotater-ccw.png": "sprites/blueprints/rotater-ccw.png":
{ {
"frame": {"x":1243,"y":1123,"w":143,"h":144}, "frame": {"x":1245,"y":1123,"w":143,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -522,7 +522,7 @@
}, },
"sprites/blueprints/rotater-fl.png": "sprites/blueprints/rotater-fl.png":
{ {
"frame": {"x":940,"y":1167,"w":142,"h":144}, "frame": {"x":1658,"y":1325,"w":142,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":142,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":142,"h":144},
@ -530,7 +530,7 @@
}, },
"sprites/blueprints/rotater.png": "sprites/blueprints/rotater.png":
{ {
"frame": {"x":1390,"y":1126,"w":143,"h":144}, "frame": {"x":1097,"y":1171,"w":143,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -538,7 +538,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":791,"y":1254,"w":142,"h":138}, "frame": {"x":560,"y":1036,"w":142,"h":138},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":142,"h":138}, "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
@ -546,7 +546,7 @@
}, },
"sprites/blueprints/splitter-compact-merge-inverse.png": "sprites/blueprints/splitter-compact-merge-inverse.png":
{ {
"frame": {"x":1086,"y":1171,"w":142,"h":138}, "frame": {"x":792,"y":1118,"w":142,"h":138},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":142,"h":138}, "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
@ -554,7 +554,7 @@
}, },
"sprites/blueprints/splitter-compact-merge.png": "sprites/blueprints/splitter-compact-merge.png":
{ {
"frame": {"x":1376,"y":1421,"w":139,"h":138}, "frame": {"x":1373,"y":1409,"w":139,"h":138},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":2,"w":139,"h":138}, "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
@ -562,7 +562,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":1227,"y":1558,"w":139,"h":138}, "frame": {"x":1373,"y":1551,"w":139,"h":138},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":2,"w":139,"h":138}, "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
@ -602,7 +602,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":405,"y":1186,"w":138,"h":125}, "frame": {"x":1516,"y":1574,"w":138,"h":125},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":19,"w":138,"h":125}, "spriteSourceSize": {"x":4,"y":19,"w":138,"h":125},
@ -610,7 +610,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":3,"y":1836,"w":138,"h":112}, "frame": {"x":283,"y":1182,"w":138,"h":112},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":32,"w":138,"h":112}, "spriteSourceSize": {"x":4,"y":32,"w":138,"h":112},
@ -618,7 +618,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":1653,"y":1632,"w":139,"h":112}, "frame": {"x":1225,"y":1555,"w":139,"h":112},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":139,"h":112}, "spriteSourceSize": {"x":4,"y":0,"w":139,"h":112},
@ -626,7 +626,7 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":645,"y":1377,"w":138,"h":112}, "frame": {"x":283,"y":1298,"w":138,"h":112},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":138,"h":112}, "spriteSourceSize": {"x":4,"y":0,"w":138,"h":112},
@ -656,6 +656,14 @@
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":133}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
"sourceSize": {"w":144,"h":144} "sourceSize": {"w":144,"h":144}
}, },
"sprites/blueprints/virtual_processor-stacker.png":
{
"frame": {"x":961,"y":1033,"w":132,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":132,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/virtual_processor-unstacker.png": "sprites/blueprints/virtual_processor-unstacker.png":
{ {
"frame": {"x":1101,"y":704,"w":144,"h":144}, "frame": {"x":1101,"y":704,"w":144,"h":144},
@ -690,7 +698,7 @@
}, },
"sprites/blueprints/wire-turn.png": "sprites/blueprints/wire-turn.png":
{ {
"frame": {"x":707,"y":1036,"w":82,"h":82}, "frame": {"x":706,"y":1036,"w":82,"h":82},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":62,"y":62,"w":82,"h":82}, "spriteSourceSize": {"x":62,"y":62,"w":82,"h":82},
@ -714,7 +722,7 @@
}, },
"sprites/blueprints/wire_tunnel.png": "sprites/blueprints/wire_tunnel.png":
{ {
"frame": {"x":1653,"y":1748,"w":138,"h":135}, "frame": {"x":1516,"y":1435,"w":138,"h":135},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":138,"h":135}, "spriteSourceSize": {"x":4,"y":4,"w":138,"h":135},
@ -722,7 +730,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":961,"y":1033,"w":130,"h":130}, "frame": {"x":3,"y":1182,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -730,7 +738,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":1047,"y":1887,"w":130,"h":130}, "frame": {"x":925,"y":1476,"w":130,"h":130},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -810,7 +818,7 @@
}, },
"sprites/buildings/logic_gate-or.png": "sprites/buildings/logic_gate-or.png":
{ {
"frame": {"x":559,"y":1173,"w":143,"h":123}, "frame": {"x":1659,"y":1198,"w":143,"h":123},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":123}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":123},
@ -826,7 +834,7 @@
}, },
"sprites/buildings/logic_gate-xor.png": "sprites/buildings/logic_gate-xor.png":
{ {
"frame": {"x":1657,"y":1198,"w":143,"h":143}, "frame": {"x":1392,"y":1126,"w":143,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":143}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":143},
@ -834,7 +842,7 @@
}, },
"sprites/buildings/logic_gate.png": "sprites/buildings/logic_gate.png":
{ {
"frame": {"x":793,"y":1118,"w":143,"h":132}, "frame": {"x":1391,"y":1273,"w":143,"h":132},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":132}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":132},
@ -842,7 +850,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":505,"y":1887,"w":136,"h":142}, "frame": {"x":3,"y":1703,"w":136,"h":142},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -850,7 +858,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":405,"y":1736,"w":136,"h":142}, "frame": {"x":143,"y":1703,"w":136,"h":142},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -898,7 +906,7 @@
}, },
"sprites/buildings/reader.png": "sprites/buildings/reader.png":
{ {
"frame": {"x":937,"y":1315,"w":141,"h":144}, "frame": {"x":790,"y":1260,"w":141,"h":144},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":144}, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
@ -906,7 +914,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":1378,"y":1274,"w":141,"h":143}, "frame": {"x":1083,"y":1319,"w":141,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -914,7 +922,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":1231,"y":1411,"w":141,"h":143}, "frame": {"x":935,"y":1329,"w":141,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":141,"h":143}, "spriteSourceSize": {"x":1,"y":0,"w":141,"h":143},
@ -922,7 +930,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":1657,"y":1345,"w":141,"h":143}, "frame": {"x":1228,"y":1408,"w":141,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -930,7 +938,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":1082,"y":1461,"w":141,"h":136}, "frame": {"x":1080,"y":1466,"w":141,"h":136},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":141,"h":136}, "spriteSourceSize": {"x":0,"y":3,"w":141,"h":136},
@ -938,7 +946,7 @@
}, },
"sprites/buildings/splitter-compact-merge-inverse.png": "sprites/buildings/splitter-compact-merge-inverse.png":
{ {
"frame": {"x":1232,"y":1271,"w":142,"h":136}, "frame": {"x":559,"y":1178,"w":142,"h":136},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":142,"h":136}, "spriteSourceSize": {"x":0,"y":3,"w":142,"h":136},
@ -946,7 +954,7 @@
}, },
"sprites/buildings/splitter-compact-merge.png": "sprites/buildings/splitter-compact-merge.png":
{ {
"frame": {"x":1653,"y":1492,"w":139,"h":136}, "frame": {"x":1658,"y":1473,"w":139,"h":136},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":3,"w":139,"h":136}, "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
@ -954,7 +962,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":1370,"y":1563,"w":139,"h":136}, "frame": {"x":1658,"y":1613,"w":139,"h":136},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":3,"w":139,"h":136}, "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
@ -994,7 +1002,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":645,"y":1493,"w":137,"h":124}, "frame": {"x":3,"y":1476,"w":137,"h":124},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":20,"w":137,"h":124}, "spriteSourceSize": {"x":5,"y":20,"w":137,"h":124},
@ -1002,7 +1010,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":928,"y":1463,"w":137,"h":111}, "frame": {"x":283,"y":1414,"w":137,"h":111},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":33,"w":137,"h":111}, "spriteSourceSize": {"x":5,"y":33,"w":137,"h":111},
@ -1010,7 +1018,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":786,"y":1534,"w":137,"h":111}, "frame": {"x":283,"y":1529,"w":137,"h":111},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111}, "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
@ -1018,7 +1026,7 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":645,"y":1621,"w":137,"h":111}, "frame": {"x":424,"y":1588,"w":137,"h":111},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111}, "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
@ -1042,12 +1050,20 @@
}, },
"sprites/buildings/virtual_processor-shapecompare.png": "sprites/buildings/virtual_processor-shapecompare.png":
{ {
"frame": {"x":560,"y":1036,"w":143,"h":133}, "frame": {"x":1244,"y":1271,"w":143,"h":133},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":133}, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":133},
"sourceSize": {"w":144,"h":144} "sourceSize": {"w":144,"h":144}
}, },
"sprites/buildings/virtual_processor-stacker.png":
{
"frame": {"x":3,"y":1849,"w":130,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":130,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/virtual_processor-unstacker.png": "sprites/buildings/virtual_processor-unstacker.png":
{ {
"frame": {"x":3,"y":1035,"w":144,"h":143}, "frame": {"x":3,"y":1035,"w":144,"h":143},
@ -1106,7 +1122,7 @@
}, },
"sprites/buildings/wire_tunnel.png": "sprites/buildings/wire_tunnel.png":
{ {
"frame": {"x":787,"y":1396,"w":137,"h":134}, "frame": {"x":559,"y":1318,"w":137,"h":134},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":137,"h":134}, "spriteSourceSize": {"x":5,"y":5,"w":137,"h":134},
@ -1138,7 +1154,7 @@
}, },
"sprites/misc/processor_disabled.png": "sprites/misc/processor_disabled.png":
{ {
"frame": {"x":3,"y":1958,"w":78,"h":81}, "frame": {"x":3,"y":1606,"w":78,"h":81},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":10,"y":10,"w":78,"h":81}, "spriteSourceSize": {"x":10,"y":10,"w":78,"h":81},
@ -1186,7 +1202,7 @@
}, },
"sprites/misc/waypoint.png": "sprites/misc/waypoint.png":
{ {
"frame": {"x":292,"y":1834,"w":38,"h":48}, "frame": {"x":48,"y":1997,"w":38,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":38,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":38,"h":48},
@ -1250,7 +1266,7 @@
}, },
"sprites/wires/display/white.png": "sprites/wires/display/white.png":
{ {
"frame": {"x":145,"y":1836,"w":47,"h":47}, "frame": {"x":90,"y":1997,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
@ -1258,7 +1274,7 @@
}, },
"sprites/wires/display/yellow.png": "sprites/wires/display/yellow.png":
{ {
"frame": {"x":196,"y":1836,"w":47,"h":47}, "frame": {"x":141,"y":1997,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
@ -1290,7 +1306,7 @@
}, },
"sprites/wires/network_conflict.png": "sprites/wires/network_conflict.png":
{ {
"frame": {"x":85,"y":1952,"w":47,"h":44}, "frame": {"x":192,"y":1997,"w":47,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":2,"w":47,"h":44}, "spriteSourceSize": {"x":1,"y":2,"w":47,"h":44},
@ -1298,7 +1314,7 @@
}, },
"sprites/wires/network_empty.png": "sprites/wires/network_empty.png":
{ {
"frame": {"x":247,"y":1834,"w":41,"h":48}, "frame": {"x":3,"y":1997,"w":41,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":41,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":41,"h":48},
@ -1338,7 +1354,7 @@
}, },
"sprites/wires/sets/color_turn.png": "sprites/wires/sets/color_turn.png":
{ {
"frame": {"x":707,"y":1122,"w":81,"h":81}, "frame": {"x":706,"y":1122,"w":81,"h":81},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1370,7 +1386,7 @@
}, },
"sprites/wires/sets/conflict_turn.png": "sprites/wires/sets/conflict_turn.png":
{ {
"frame": {"x":706,"y":1207,"w":81,"h":81}, "frame": {"x":705,"y":1207,"w":81,"h":81},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1426,7 +1442,7 @@
}, },
"sprites/wires/sets/shape_split.png": "sprites/wires/sets/shape_split.png":
{ {
"frame": {"x":1095,"y":1086,"w":144,"h":81}, "frame": {"x":1097,"y":1086,"w":144,"h":81},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1434,7 +1450,7 @@
}, },
"sprites/wires/sets/shape_turn.png": "sprites/wires/sets/shape_turn.png":
{ {
"frame": {"x":706,"y":1292,"w":81,"h":81}, "frame": {"x":705,"y":1292,"w":81,"h":81},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1455,6 +1471,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":2048,"h":2048}, "size": {"w":2048,"h":2048},
"scale": "0.75", "scale": "0.75",
"smartupdate": "$TexturePacker:SmartUpdate:26af492934beffa75e19b73e6d9eba56:d408ec7454e52a9384f80985bf14db9c:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@ -10,7 +10,7 @@
}, },
"sprites/belt/built/forward_1.png": "sprites/belt/built/forward_1.png":
{ {
"frame": {"x":3,"y":939,"w":40,"h":48}, "frame": {"x":51,"y":961,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -18,7 +18,7 @@
}, },
"sprites/belt/built/forward_2.png": "sprites/belt/built/forward_2.png":
{ {
"frame": {"x":179,"y":969,"w":40,"h":48}, "frame": {"x":352,"y":869,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -26,7 +26,7 @@
}, },
"sprites/belt/built/forward_3.png": "sprites/belt/built/forward_3.png":
{ {
"frame": {"x":407,"y":864,"w":40,"h":48}, "frame": {"x":300,"y":891,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -34,7 +34,7 @@
}, },
"sprites/belt/built/forward_4.png": "sprites/belt/built/forward_4.png":
{ {
"frame": {"x":352,"y":869,"w":40,"h":48}, "frame": {"x":249,"y":893,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -42,7 +42,7 @@
}, },
"sprites/belt/built/forward_5.png": "sprites/belt/built/forward_5.png":
{ {
"frame": {"x":300,"y":883,"w":40,"h":48}, "frame": {"x":455,"y":864,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -50,7 +50,7 @@
}, },
"sprites/belt/built/forward_6.png": "sprites/belt/built/forward_6.png":
{ {
"frame": {"x":249,"y":893,"w":40,"h":48}, "frame": {"x":396,"y":912,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -58,7 +58,7 @@
}, },
"sprites/belt/built/forward_7.png": "sprites/belt/built/forward_7.png":
{ {
"frame": {"x":451,"y":864,"w":40,"h":48}, "frame": {"x":344,"y":921,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -66,7 +66,7 @@
}, },
"sprites/belt/built/forward_8.png": "sprites/belt/built/forward_8.png":
{ {
"frame": {"x":223,"y":945,"w":40,"h":48}, "frame": {"x":227,"y":973,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -74,7 +74,7 @@
}, },
"sprites/belt/built/forward_9.png": "sprites/belt/built/forward_9.png":
{ {
"frame": {"x":267,"y":945,"w":40,"h":48}, "frame": {"x":271,"y":973,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -82,7 +82,7 @@
}, },
"sprites/belt/built/forward_10.png": "sprites/belt/built/forward_10.png":
{ {
"frame": {"x":47,"y":961,"w":40,"h":48}, "frame": {"x":95,"y":961,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -90,7 +90,7 @@
}, },
"sprites/belt/built/forward_11.png": "sprites/belt/built/forward_11.png":
{ {
"frame": {"x":91,"y":961,"w":40,"h":48}, "frame": {"x":139,"y":941,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -98,7 +98,7 @@
}, },
"sprites/belt/built/forward_12.png": "sprites/belt/built/forward_12.png":
{ {
"frame": {"x":135,"y":941,"w":40,"h":48}, "frame": {"x":183,"y":917,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -106,7 +106,7 @@
}, },
"sprites/belt/built/forward_13.png": "sprites/belt/built/forward_13.png":
{ {
"frame": {"x":179,"y":917,"w":40,"h":48}, "frame": {"x":183,"y":969,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -130,7 +130,7 @@
}, },
"sprites/belt/built/left_2.png": "sprites/belt/built/left_2.png":
{ {
"frame": {"x":223,"y":611,"w":44,"h":44}, "frame": {"x":323,"y":699,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -138,7 +138,7 @@
}, },
"sprites/belt/built/left_3.png": "sprites/belt/built/left_3.png":
{ {
"frame": {"x":275,"y":659,"w":44,"h":44}, "frame": {"x":275,"y":707,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -146,7 +146,7 @@
}, },
"sprites/belt/built/left_4.png": "sprites/belt/built/left_4.png":
{ {
"frame": {"x":323,"y":691,"w":44,"h":44}, "frame": {"x":323,"y":747,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -154,7 +154,7 @@
}, },
"sprites/belt/built/left_5.png": "sprites/belt/built/left_5.png":
{ {
"frame": {"x":275,"y":707,"w":44,"h":44}, "frame": {"x":208,"y":759,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -162,7 +162,7 @@
}, },
"sprites/belt/built/left_6.png": "sprites/belt/built/left_6.png":
{ {
"frame": {"x":323,"y":739,"w":44,"h":44}, "frame": {"x":156,"y":773,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -170,7 +170,7 @@
}, },
"sprites/belt/built/left_7.png": "sprites/belt/built/left_7.png":
{ {
"frame": {"x":208,"y":759,"w":44,"h":44}, "frame": {"x":105,"y":797,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -178,7 +178,7 @@
}, },
"sprites/belt/built/left_8.png": "sprites/belt/built/left_8.png":
{ {
"frame": {"x":156,"y":773,"w":44,"h":44}, "frame": {"x":54,"y":817,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -186,7 +186,7 @@
}, },
"sprites/belt/built/left_9.png": "sprites/belt/built/left_9.png":
{ {
"frame": {"x":105,"y":797,"w":44,"h":44}, "frame": {"x":3,"y":843,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -194,7 +194,7 @@
}, },
"sprites/belt/built/left_10.png": "sprites/belt/built/left_10.png":
{ {
"frame": {"x":325,"y":547,"w":44,"h":44}, "frame": {"x":465,"y":619,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -202,7 +202,7 @@
}, },
"sprites/belt/built/left_11.png": "sprites/belt/built/left_11.png":
{ {
"frame": {"x":325,"y":595,"w":44,"h":44}, "frame": {"x":324,"y":651,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -210,7 +210,7 @@
}, },
"sprites/belt/built/left_12.png": "sprites/belt/built/left_12.png":
{ {
"frame": {"x":464,"y":619,"w":44,"h":44}, "frame": {"x":223,"y":611,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -218,7 +218,7 @@
}, },
"sprites/belt/built/left_13.png": "sprites/belt/built/left_13.png":
{ {
"frame": {"x":324,"y":643,"w":44,"h":44}, "frame": {"x":275,"y":659,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -226,7 +226,7 @@
}, },
"sprites/belt/built/right_0.png": "sprites/belt/built/right_0.png":
{ {
"frame": {"x":54,"y":817,"w":44,"h":44}, "frame": {"x":311,"y":795,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -234,7 +234,7 @@
}, },
"sprites/belt/built/right_1.png": "sprites/belt/built/right_1.png":
{ {
"frame": {"x":3,"y":843,"w":44,"h":44}, "frame": {"x":256,"y":797,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -242,7 +242,7 @@
}, },
"sprites/belt/built/right_2.png": "sprites/belt/built/right_2.png":
{ {
"frame": {"x":102,"y":845,"w":44,"h":44}, "frame": {"x":3,"y":891,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -250,7 +250,7 @@
}, },
"sprites/belt/built/right_3.png": "sprites/belt/built/right_3.png":
{ {
"frame": {"x":51,"y":865,"w":44,"h":44}, "frame": {"x":359,"y":821,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -258,7 +258,7 @@
}, },
"sprites/belt/built/right_4.png": "sprites/belt/built/right_4.png":
{ {
"frame": {"x":3,"y":891,"w":44,"h":44}, "frame": {"x":304,"y":843,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -266,7 +266,7 @@
}, },
"sprites/belt/built/right_5.png": "sprites/belt/built/right_5.png":
{ {
"frame": {"x":359,"y":821,"w":44,"h":44}, "frame": {"x":252,"y":845,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -274,7 +274,7 @@
}, },
"sprites/belt/built/right_6.png": "sprites/belt/built/right_6.png":
{ {
"frame": {"x":304,"y":835,"w":44,"h":44}, "frame": {"x":201,"y":855,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -282,7 +282,7 @@
}, },
"sprites/belt/built/right_7.png": "sprites/belt/built/right_7.png":
{ {
"frame": {"x":252,"y":845,"w":44,"h":44}, "frame": {"x":150,"y":869,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -290,7 +290,7 @@
}, },
"sprites/belt/built/right_8.png": "sprites/belt/built/right_8.png":
{ {
"frame": {"x":201,"y":855,"w":44,"h":44}, "frame": {"x":99,"y":893,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -298,7 +298,7 @@
}, },
"sprites/belt/built/right_9.png": "sprites/belt/built/right_9.png":
{ {
"frame": {"x":150,"y":869,"w":44,"h":44}, "frame": {"x":51,"y":913,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -306,7 +306,7 @@
}, },
"sprites/belt/built/right_10.png": "sprites/belt/built/right_10.png":
{ {
"frame": {"x":311,"y":787,"w":44,"h":44}, "frame": {"x":204,"y":807,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -314,7 +314,7 @@
}, },
"sprites/belt/built/right_11.png": "sprites/belt/built/right_11.png":
{ {
"frame": {"x":256,"y":797,"w":44,"h":44}, "frame": {"x":153,"y":821,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -322,7 +322,7 @@
}, },
"sprites/belt/built/right_12.png": "sprites/belt/built/right_12.png":
{ {
"frame": {"x":204,"y":807,"w":44,"h":44}, "frame": {"x":102,"y":845,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -330,7 +330,7 @@
}, },
"sprites/belt/built/right_13.png": "sprites/belt/built/right_13.png":
{ {
"frame": {"x":153,"y":821,"w":44,"h":44}, "frame": {"x":51,"y":865,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -338,7 +338,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":99,"y":893,"w":44,"h":44}, "frame": {"x":3,"y":939,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -346,7 +346,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":51,"y":913,"w":44,"h":44}, "frame": {"x":407,"y":864,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -354,7 +354,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":311,"y":935,"w":40,"h":48}, "frame": {"x":315,"y":973,"w":40,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -656,6 +656,14 @@
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
"sourceSize": {"w":48,"h":48} "sourceSize": {"w":48,"h":48}
}, },
"sprites/blueprints/virtual_processor-stacker.png":
{
"frame": {"x":325,"y":547,"w":45,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":45,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/virtual_processor-unstacker.png": "sprites/blueprints/virtual_processor-unstacker.png":
{ {
"frame": {"x":107,"y":400,"w":48,"h":48}, "frame": {"x":107,"y":400,"w":48,"h":48},
@ -706,7 +714,7 @@
}, },
"sprites/blueprints/wire_tunnel-coating.png": "sprites/blueprints/wire_tunnel-coating.png":
{ {
"frame": {"x":425,"y":655,"w":12,"h":46}, "frame": {"x":426,"y":655,"w":12,"h":46},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":18,"y":1,"w":12,"h":46}, "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
@ -730,7 +738,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":54,"y":817,"w":44,"h":44}, "frame": {"x":311,"y":795,"w":44,"h":44},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -818,7 +826,7 @@
}, },
"sprites/buildings/logic_gate-transistor.png": "sprites/buildings/logic_gate-transistor.png":
{ {
"frame": {"x":425,"y":586,"w":35,"h":48}, "frame": {"x":426,"y":586,"w":35,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":35,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48},
@ -914,7 +922,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":273,"y":555,"w":48,"h":48}, "frame": {"x":374,"y":567,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -922,7 +930,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":373,"y":567,"w":48,"h":48}, "frame": {"x":273,"y":555,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -986,7 +994,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":373,"y":619,"w":48,"h":48}, "frame": {"x":374,"y":619,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1048,6 +1056,14 @@
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
"sourceSize": {"w":48,"h":48} "sourceSize": {"w":48,"h":48}
}, },
"sprites/buildings/virtual_processor-stacker.png":
{
"frame": {"x":325,"y":599,"w":45,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":45,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/virtual_processor-unstacker.png": "sprites/buildings/virtual_processor-unstacker.png":
{ {
"frame": {"x":272,"y":607,"w":48,"h":48}, "frame": {"x":272,"y":607,"w":48,"h":48},
@ -1066,7 +1082,7 @@
}, },
"sprites/buildings/wire-cross.png": "sprites/buildings/wire-cross.png":
{ {
"frame": {"x":457,"y":667,"w":48,"h":48}, "frame": {"x":458,"y":667,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1098,7 +1114,7 @@
}, },
"sprites/buildings/wire_tunnel-coating.png": "sprites/buildings/wire_tunnel-coating.png":
{ {
"frame": {"x":441,"y":655,"w":12,"h":46}, "frame": {"x":442,"y":655,"w":12,"h":46},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":18,"y":1,"w":12,"h":46}, "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
@ -1162,7 +1178,7 @@
}, },
"sprites/misc/slot_bad_arrow.png": "sprites/misc/slot_bad_arrow.png":
{ {
"frame": {"x":425,"y":638,"w":13,"h":13}, "frame": {"x":426,"y":638,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -1170,7 +1186,7 @@
}, },
"sprites/misc/slot_good_arrow.png": "sprites/misc/slot_good_arrow.png":
{ {
"frame": {"x":442,"y":638,"w":13,"h":13}, "frame": {"x":443,"y":638,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -1378,7 +1394,7 @@
}, },
"sprites/wires/sets/regular_cross.png": "sprites/wires/sets/regular_cross.png":
{ {
"frame": {"x":457,"y":667,"w":48,"h":48}, "frame": {"x":458,"y":667,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1455,6 +1471,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":512,"h":1024}, "size": {"w":512,"h":1024},
"scale": "0.25", "scale": "0.25",
"smartupdate": "$TexturePacker:SmartUpdate:26af492934beffa75e19b73e6d9eba56:d408ec7454e52a9384f80985bf14db9c:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

After

Width:  |  Height:  |  Size: 280 KiB

View File

@ -10,7 +10,7 @@
}, },
"sprites/belt/built/forward_1.png": "sprites/belt/built/forward_1.png":
{ {
"frame": {"x":891,"y":1749,"w":78,"h":96}, "frame": {"x":94,"y":1746,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -18,7 +18,7 @@
}, },
"sprites/belt/built/forward_2.png": "sprites/belt/built/forward_2.png":
{ {
"frame": {"x":331,"y":1550,"w":78,"h":96}, "frame": {"x":754,"y":1555,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -26,7 +26,7 @@
}, },
"sprites/belt/built/forward_3.png": "sprites/belt/built/forward_3.png":
{ {
"frame": {"x":413,"y":1639,"w":78,"h":96}, "frame": {"x":653,"y":1564,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -34,7 +34,7 @@
}, },
"sprites/belt/built/forward_4.png": "sprites/belt/built/forward_4.png":
{ {
"frame": {"x":495,"y":1695,"w":78,"h":96}, "frame": {"x":556,"y":1601,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -42,7 +42,7 @@
}, },
"sprites/belt/built/forward_5.png": "sprites/belt/built/forward_5.png":
{ {
"frame": {"x":577,"y":1756,"w":78,"h":96}, "frame": {"x":458,"y":1663,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -50,7 +50,7 @@
}, },
"sprites/belt/built/forward_6.png": "sprites/belt/built/forward_6.png":
{ {
"frame": {"x":659,"y":1834,"w":78,"h":96}, "frame": {"x":359,"y":1711,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -58,7 +58,7 @@
}, },
"sprites/belt/built/forward_7.png": "sprites/belt/built/forward_7.png":
{ {
"frame": {"x":3,"y":1934,"w":78,"h":96}, "frame": {"x":268,"y":1771,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -66,7 +66,7 @@
}, },
"sprites/belt/built/forward_8.png": "sprites/belt/built/forward_8.png":
{ {
"frame": {"x":85,"y":1538,"w":78,"h":96}, "frame": {"x":176,"y":1835,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -74,7 +74,7 @@
}, },
"sprites/belt/built/forward_9.png": "sprites/belt/built/forward_9.png":
{ {
"frame": {"x":3,"y":1538,"w":78,"h":96}, "frame": {"x":85,"y":1846,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -82,7 +82,7 @@
}, },
"sprites/belt/built/forward_10.png": "sprites/belt/built/forward_10.png":
{ {
"frame": {"x":3,"y":1438,"w":78,"h":96}, "frame": {"x":3,"y":1789,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -90,7 +90,7 @@
}, },
"sprites/belt/built/forward_11.png": "sprites/belt/built/forward_11.png":
{ {
"frame": {"x":85,"y":1438,"w":78,"h":96}, "frame": {"x":3,"y":1889,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -98,7 +98,7 @@
}, },
"sprites/belt/built/forward_12.png": "sprites/belt/built/forward_12.png":
{ {
"frame": {"x":167,"y":1502,"w":78,"h":96}, "frame": {"x":856,"y":1469,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -106,7 +106,7 @@
}, },
"sprites/belt/built/forward_13.png": "sprites/belt/built/forward_13.png":
{ {
"frame": {"x":249,"y":1530,"w":78,"h":96}, "frame": {"x":938,"y":1469,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -114,7 +114,7 @@
}, },
"sprites/belt/built/left_0.png": "sprites/belt/built/left_0.png":
{ {
"frame": {"x":931,"y":903,"w":87,"h":87}, "frame": {"x":403,"y":911,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -122,7 +122,7 @@
}, },
"sprites/belt/built/left_1.png": "sprites/belt/built/left_1.png":
{ {
"frame": {"x":403,"y":911,"w":87,"h":87}, "frame": {"x":403,"y":1002,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -130,7 +130,7 @@
}, },
"sprites/belt/built/left_2.png": "sprites/belt/built/left_2.png":
{ {
"frame": {"x":663,"y":1383,"w":87,"h":87}, "frame": {"x":3,"y":1516,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -138,7 +138,7 @@
}, },
"sprites/belt/built/left_3.png": "sprites/belt/built/left_3.png":
{ {
"frame": {"x":572,"y":1418,"w":87,"h":87}, "frame": {"x":785,"y":1191,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -146,7 +146,7 @@
}, },
"sprites/belt/built/left_4.png": "sprites/belt/built/left_4.png":
{ {
"frame": {"x":754,"y":1461,"w":87,"h":87}, "frame": {"x":876,"y":1196,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -154,7 +154,7 @@
}, },
"sprites/belt/built/left_5.png": "sprites/belt/built/left_5.png":
{ {
"frame": {"x":663,"y":1474,"w":87,"h":87}, "frame": {"x":785,"y":1282,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -162,7 +162,7 @@
}, },
"sprites/belt/built/left_6.png": "sprites/belt/built/left_6.png":
{ {
"frame": {"x":845,"y":1464,"w":87,"h":87}, "frame": {"x":685,"y":1287,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -170,7 +170,7 @@
}, },
"sprites/belt/built/left_7.png": "sprites/belt/built/left_7.png":
{ {
"frame": {"x":754,"y":1552,"w":87,"h":87}, "frame": {"x":583,"y":1325,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -178,7 +178,7 @@
}, },
"sprites/belt/built/left_8.png": "sprites/belt/built/left_8.png":
{ {
"frame": {"x":845,"y":1555,"w":87,"h":87}, "frame": {"x":482,"y":1381,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -186,7 +186,7 @@
}, },
"sprites/belt/built/left_9.png": "sprites/belt/built/left_9.png":
{ {
"frame": {"x":3,"y":1256,"w":87,"h":87}, "frame": {"x":383,"y":1429,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -194,7 +194,7 @@
}, },
"sprites/belt/built/left_10.png": "sprites/belt/built/left_10.png":
{ {
"frame": {"x":401,"y":1002,"w":87,"h":87}, "frame": {"x":391,"y":1338,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -202,7 +202,7 @@
}, },
"sprites/belt/built/left_11.png": "sprites/belt/built/left_11.png":
{ {
"frame": {"x":481,"y":1275,"w":87,"h":87}, "frame": {"x":292,"y":1398,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -210,7 +210,7 @@
}, },
"sprites/belt/built/left_12.png": "sprites/belt/built/left_12.png":
{ {
"frame": {"x":572,"y":1327,"w":87,"h":87}, "frame": {"x":196,"y":1462,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -218,7 +218,7 @@
}, },
"sprites/belt/built/left_13.png": "sprites/belt/built/left_13.png":
{ {
"frame": {"x":481,"y":1366,"w":87,"h":87}, "frame": {"x":99,"y":1473,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -226,7 +226,7 @@
}, },
"sprites/belt/built/right_0.png": "sprites/belt/built/right_0.png":
{ {
"frame": {"x":94,"y":1256,"w":87,"h":87}, "frame": {"x":287,"y":1489,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -234,7 +234,7 @@
}, },
"sprites/belt/built/right_1.png": "sprites/belt/built/right_1.png":
{ {
"frame": {"x":185,"y":1320,"w":87,"h":87}, "frame": {"x":190,"y":1553,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -242,7 +242,7 @@
}, },
"sprites/belt/built/right_2.png": "sprites/belt/built/right_2.png":
{ {
"frame": {"x":640,"y":1565,"w":87,"h":87}, "frame": {"x":674,"y":1378,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -250,7 +250,7 @@
}, },
"sprites/belt/built/right_3.png": "sprites/belt/built/right_3.png":
{ {
"frame": {"x":731,"y":1643,"w":87,"h":87}, "frame": {"x":573,"y":1416,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -258,7 +258,7 @@
}, },
"sprites/belt/built/right_4.png": "sprites/belt/built/right_4.png":
{ {
"frame": {"x":822,"y":1646,"w":87,"h":87}, "frame": {"x":474,"y":1472,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -266,7 +266,7 @@
}, },
"sprites/belt/built/right_5.png": "sprites/belt/built/right_5.png":
{ {
"frame": {"x":913,"y":1658,"w":87,"h":87}, "frame": {"x":378,"y":1520,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -274,7 +274,7 @@
}, },
"sprites/belt/built/right_6.png": "sprites/belt/built/right_6.png":
{ {
"frame": {"x":3,"y":1347,"w":87,"h":87}, "frame": {"x":281,"y":1580,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -282,7 +282,7 @@
}, },
"sprites/belt/built/right_7.png": "sprites/belt/built/right_7.png":
{ {
"frame": {"x":94,"y":1347,"w":87,"h":87}, "frame": {"x":185,"y":1644,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -290,7 +290,7 @@
}, },
"sprites/belt/built/right_8.png": "sprites/belt/built/right_8.png":
{ {
"frame": {"x":185,"y":1411,"w":87,"h":87}, "frame": {"x":94,"y":1655,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -298,7 +298,7 @@
}, },
"sprites/belt/built/right_9.png": "sprites/belt/built/right_9.png":
{ {
"frame": {"x":276,"y":1439,"w":87,"h":87}, "frame": {"x":3,"y":1698,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -306,7 +306,7 @@
}, },
"sprites/belt/built/right_10.png": "sprites/belt/built/right_10.png":
{ {
"frame": {"x":276,"y":1348,"w":87,"h":87}, "frame": {"x":94,"y":1564,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -314,7 +314,7 @@
}, },
"sprites/belt/built/right_11.png": "sprites/belt/built/right_11.png":
{ {
"frame": {"x":367,"y":1368,"w":87,"h":87}, "frame": {"x":3,"y":1607,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -322,7 +322,7 @@
}, },
"sprites/belt/built/right_12.png": "sprites/belt/built/right_12.png":
{ {
"frame": {"x":458,"y":1457,"w":87,"h":87}, "frame": {"x":876,"y":1287,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -330,7 +330,7 @@
}, },
"sprites/belt/built/right_13.png": "sprites/belt/built/right_13.png":
{ {
"frame": {"x":549,"y":1509,"w":87,"h":87}, "frame": {"x":776,"y":1373,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -338,7 +338,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":367,"y":1459,"w":87,"h":87}, "frame": {"x":867,"y":1378,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -346,7 +346,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":458,"y":1548,"w":87,"h":87}, "frame": {"x":765,"y":1464,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -354,7 +354,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":167,"y":1602,"w":78,"h":96}, "frame": {"x":85,"y":1946,"w":78,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -386,7 +386,7 @@
}, },
"sprites/blueprints/display.png": "sprites/blueprints/display.png":
{ {
"frame": {"x":549,"y":1600,"w":86,"h":91}, "frame": {"x":664,"y":1469,"w":86,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":86,"h":91}, "spriteSourceSize": {"x":5,"y":5,"w":86,"h":91},
@ -402,7 +402,7 @@
}, },
"sprites/blueprints/lever.png": "sprites/blueprints/lever.png":
{ {
"frame": {"x":85,"y":1638,"w":75,"h":86}, "frame": {"x":167,"y":1935,"w":75,"h":86},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":3,"w":75,"h":86}, "spriteSourceSize": {"x":11,"y":3,"w":75,"h":86},
@ -410,7 +410,7 @@
}, },
"sprites/blueprints/logic_gate-not.png": "sprites/blueprints/logic_gate-not.png":
{ {
"frame": {"x":936,"y":1558,"w":83,"h":96}, "frame": {"x":469,"y":1563,"w":83,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":7,"y":0,"w":83,"h":96}, "spriteSourceSize": {"x":7,"y":0,"w":83,"h":96},
@ -418,7 +418,7 @@
}, },
"sprites/blueprints/logic_gate-or.png": "sprites/blueprints/logic_gate-or.png":
{ {
"frame": {"x":203,"y":861,"w":96,"h":82}, "frame": {"x":303,"y":903,"w":96,"h":82},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":82}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":82},
@ -442,7 +442,7 @@
}, },
"sprites/blueprints/logic_gate.png": "sprites/blueprints/logic_gate.png":
{ {
"frame": {"x":910,"y":1094,"w":96,"h":89}, "frame": {"x":910,"y":1103,"w":96,"h":89},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
@ -450,7 +450,7 @@
}, },
"sprites/blueprints/miner-chainable.png": "sprites/blueprints/miner-chainable.png":
{ {
"frame": {"x":585,"y":1227,"w":92,"h":96}, "frame": {"x":100,"y":1373,"w":92,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -458,7 +458,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":681,"y":1283,"w":92,"h":96}, "frame": {"x":3,"y":1416,"w":92,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -506,7 +506,7 @@
}, },
"sprites/blueprints/reader.png": "sprites/blueprints/reader.png":
{ {
"frame": {"x":203,"y":947,"w":95,"h":96}, "frame": {"x":3,"y":926,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -522,7 +522,7 @@
}, },
"sprites/blueprints/rotater-fl.png": "sprites/blueprints/rotater-fl.png":
{ {
"frame": {"x":302,"y":961,"w":95,"h":96}, "frame": {"x":102,"y":983,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
@ -538,7 +538,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":399,"y":1093,"w":95,"h":93}, "frame": {"x":300,"y":1047,"w":95,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
@ -546,7 +546,7 @@
}, },
"sprites/blueprints/splitter-compact-merge-inverse.png": "sprites/blueprints/splitter-compact-merge-inverse.png":
{ {
"frame": {"x":498,"y":1099,"w":95,"h":93}, "frame": {"x":201,"y":1111,"w":95,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
@ -554,7 +554,7 @@
}, },
"sprites/blueprints/splitter-compact-merge.png": "sprites/blueprints/splitter-compact-merge.png":
{ {
"frame": {"x":794,"y":1270,"w":93,"h":93}, "frame": {"x":300,"y":1144,"w":93,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
@ -562,7 +562,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":891,"y":1280,"w":93,"h":93}, "frame": {"x":201,"y":1208,"w":93,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
@ -602,7 +602,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":294,"y":1161,"w":93,"h":84}, "frame": {"x":397,"y":1172,"w":93,"h":84},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":12,"w":93,"h":84}, "spriteSourceSize": {"x":2,"y":12,"w":93,"h":84},
@ -610,7 +610,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":391,"y":1190,"w":93,"h":75}, "frame": {"x":298,"y":1241,"w":93,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":21,"w":93,"h":75}, "spriteSourceSize": {"x":2,"y":21,"w":93,"h":75},
@ -618,7 +618,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":794,"y":1191,"w":94,"h":75}, "frame": {"x":399,"y":1093,"w":94,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":94,"h":75}, "spriteSourceSize": {"x":2,"y":0,"w":94,"h":75},
@ -626,7 +626,7 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":488,"y":1196,"w":93,"h":75}, "frame": {"x":198,"y":1305,"w":93,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":93,"h":75}, "spriteSourceSize": {"x":2,"y":0,"w":93,"h":75},
@ -642,7 +642,7 @@
}, },
"sprites/blueprints/virtual_processor-rotater.png": "sprites/blueprints/virtual_processor-rotater.png":
{ {
"frame": {"x":725,"y":1734,"w":79,"h":96}, "frame": {"x":276,"y":1671,"w":79,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":79,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
@ -650,12 +650,20 @@
}, },
"sprites/blueprints/virtual_processor-shapecompare.png": "sprites/blueprints/virtual_processor-shapecompare.png":
{ {
"frame": {"x":910,"y":1187,"w":96,"h":89}, "frame": {"x":3,"y":774,"w":96,"h":89},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
"sourceSize": {"w":96,"h":96} "sourceSize": {"w":96,"h":96}
}, },
"sprites/blueprints/virtual_processor-stacker.png":
{
"frame": {"x":931,"y":903,"w":88,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":88,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/virtual_processor-unstacker.png": "sprites/blueprints/virtual_processor-unstacker.png":
{ {
"frame": {"x":349,"y":803,"w":96,"h":96}, "frame": {"x":349,"y":803,"w":96,"h":96},
@ -682,7 +690,7 @@
}, },
"sprites/blueprints/wire-split.png": "sprites/blueprints/wire-split.png":
{ {
"frame": {"x":103,"y":866,"w":96,"h":55}, "frame": {"x":3,"y":867,"w":96,"h":55},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":41,"w":96,"h":55}, "spriteSourceSize": {"x":0,"y":41,"w":96,"h":55},
@ -714,7 +722,7 @@
}, },
"sprites/blueprints/wire_tunnel.png": "sprites/blueprints/wire_tunnel.png":
{ {
"frame": {"x":3,"y":1083,"w":93,"h":91}, "frame": {"x":101,"y":1278,"w":93,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":93,"h":91}, "spriteSourceSize": {"x":2,"y":2,"w":93,"h":91},
@ -722,7 +730,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":931,"y":903,"w":87,"h":87}, "frame": {"x":403,"y":911,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -730,7 +738,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":94,"y":1256,"w":87,"h":87}, "frame": {"x":287,"y":1489,"w":87,"h":87},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -770,7 +778,7 @@
}, },
"sprites/buildings/display.png": "sprites/buildings/display.png":
{ {
"frame": {"x":936,"y":1464,"w":84,"h":90}, "frame": {"x":565,"y":1507,"w":84,"h":90},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":84,"h":90}, "spriteSourceSize": {"x":6,"y":6,"w":84,"h":90},
@ -802,7 +810,7 @@
}, },
"sprites/buildings/logic_gate-not.png": "sprites/buildings/logic_gate-not.png":
{ {
"frame": {"x":639,"y":1656,"w":82,"h":96}, "frame": {"x":372,"y":1611,"w":82,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":82,"h":96}, "spriteSourceSize": {"x":8,"y":0,"w":82,"h":96},
@ -810,7 +818,7 @@
}, },
"sprites/buildings/logic_gate-or.png": "sprites/buildings/logic_gate-or.png":
{ {
"frame": {"x":203,"y":774,"w":96,"h":83}, "frame": {"x":203,"y":866,"w":96,"h":83},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":83}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":83},
@ -834,7 +842,7 @@
}, },
"sprites/buildings/logic_gate.png": "sprites/buildings/logic_gate.png":
{ {
"frame": {"x":103,"y":774,"w":96,"h":88}, "frame": {"x":203,"y":774,"w":96,"h":88},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":88}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":88},
@ -842,7 +850,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":291,"y":1249,"w":91,"h":95}, "frame": {"x":690,"y":1188,"w":91,"h":95},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -850,7 +858,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":386,"y":1269,"w":91,"h":95}, "frame": {"x":590,"y":1226,"w":91,"h":95},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -898,7 +906,7 @@
}, },
"sprites/buildings/reader.png": "sprites/buildings/reader.png":
{ {
"frame": {"x":3,"y":983,"w":95,"h":96}, "frame": {"x":3,"y":1026,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -906,7 +914,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":102,"y":983,"w":95,"h":96}, "frame": {"x":201,"y":1011,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -914,7 +922,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":201,"y":1047,"w":95,"h":96}, "frame": {"x":102,"y":1083,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
@ -922,7 +930,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":300,"y":1061,"w":95,"h":96}, "frame": {"x":3,"y":1126,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -930,7 +938,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":696,"y":1188,"w":94,"h":91}, "frame": {"x":3,"y":1226,"w":94,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":94,"h":91}, "spriteSourceSize": {"x":0,"y":2,"w":94,"h":91},
@ -938,7 +946,7 @@
}, },
"sprites/buildings/splitter-compact-merge-inverse.png": "sprites/buildings/splitter-compact-merge-inverse.png":
{ {
"frame": {"x":597,"y":1132,"w":95,"h":91}, "frame": {"x":102,"y":1183,"w":95,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":95,"h":91}, "spriteSourceSize": {"x":0,"y":2,"w":95,"h":91},
@ -946,7 +954,7 @@
}, },
"sprites/buildings/splitter-compact-merge.png": "sprites/buildings/splitter-compact-merge.png":
{ {
"frame": {"x":100,"y":1083,"w":93,"h":91}, "frame": {"x":3,"y":1321,"w":93,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
@ -954,7 +962,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":197,"y":1147,"w":93,"h":91}, "frame": {"x":497,"y":1099,"w":93,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
@ -994,7 +1002,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":873,"y":1377,"w":92,"h":83}, "frame": {"x":494,"y":1194,"w":92,"h":83},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":13,"w":92,"h":83}, "spriteSourceSize": {"x":3,"y":13,"w":92,"h":83},
@ -1002,7 +1010,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":3,"y":1178,"w":92,"h":74}, "frame": {"x":395,"y":1260,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":22,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":22,"w":92,"h":74},
@ -1010,7 +1018,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":99,"y":1178,"w":92,"h":74}, "frame": {"x":295,"y":1320,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -1018,7 +1026,7 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":195,"y":1242,"w":92,"h":74}, "frame": {"x":196,"y":1384,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -1034,7 +1042,7 @@
}, },
"sprites/buildings/virtual_processor-rotater.png": "sprites/buildings/virtual_processor-rotater.png":
{ {
"frame": {"x":808,"y":1737,"w":79,"h":96}, "frame": {"x":185,"y":1735,"w":79,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":79,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
@ -1042,12 +1050,20 @@
}, },
"sprites/buildings/virtual_processor-shapecompare.png": "sprites/buildings/virtual_processor-shapecompare.png":
{ {
"frame": {"x":3,"y":774,"w":96,"h":89}, "frame": {"x":103,"y":774,"w":96,"h":89},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
"sourceSize": {"w":96,"h":96} "sourceSize": {"w":96,"h":96}
}, },
"sprites/buildings/virtual_processor-stacker.png":
{
"frame": {"x":491,"y":1281,"w":88,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":88,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/virtual_processor-unstacker.png": "sprites/buildings/virtual_processor-unstacker.png":
{ {
"frame": {"x":510,"y":999,"w":96,"h":96}, "frame": {"x":510,"y":999,"w":96,"h":96},
@ -1074,7 +1090,7 @@
}, },
"sprites/buildings/wire-split.png": "sprites/buildings/wire-split.png":
{ {
"frame": {"x":3,"y":867,"w":96,"h":54}, "frame": {"x":103,"y":867,"w":96,"h":54},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1106,7 +1122,7 @@
}, },
"sprites/buildings/wire_tunnel.png": "sprites/buildings/wire_tunnel.png":
{ {
"frame": {"x":777,"y":1367,"w":92,"h":90}, "frame": {"x":594,"y":1132,"w":92,"h":90},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":92,"h":90}, "spriteSourceSize": {"x":3,"y":3,"w":92,"h":90},
@ -1330,7 +1346,7 @@
}, },
"sprites/wires/sets/color_split.png": "sprites/wires/sets/color_split.png":
{ {
"frame": {"x":303,"y":903,"w":96,"h":54}, "frame": {"x":103,"y":925,"w":96,"h":54},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1362,7 +1378,7 @@
}, },
"sprites/wires/sets/conflict_split.png": "sprites/wires/sets/conflict_split.png":
{ {
"frame": {"x":3,"y":925,"w":96,"h":54}, "frame": {"x":203,"y":953,"w":96,"h":54},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1394,7 +1410,7 @@
}, },
"sprites/wires/sets/regular_split.png": "sprites/wires/sets/regular_split.png":
{ {
"frame": {"x":3,"y":867,"w":96,"h":54}, "frame": {"x":103,"y":867,"w":96,"h":54},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1410,7 +1426,7 @@
}, },
"sprites/wires/sets/shape_cross.png": "sprites/wires/sets/shape_cross.png":
{ {
"frame": {"x":922,"y":994,"w":96,"h":96}, "frame": {"x":922,"y":1003,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1426,7 +1442,7 @@
}, },
"sprites/wires/sets/shape_split.png": "sprites/wires/sets/shape_split.png":
{ {
"frame": {"x":103,"y":925,"w":96,"h":54}, "frame": {"x":303,"y":989,"w":96,"h":54},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1455,6 +1471,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1024,"h":2048}, "size": {"w":1024,"h":2048},
"scale": "0.5", "scale": "0.5",
"smartupdate": "$TexturePacker:SmartUpdate:26af492934beffa75e19b73e6d9eba56:d408ec7454e52a9384f80985bf14db9c:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 658 KiB

After

Width:  |  Height:  |  Size: 677 KiB

View File

@ -267,6 +267,7 @@
<key type="filename">sprites/blueprints/logic_gate.png</key> <key type="filename">sprites/blueprints/logic_gate.png</key>
<key type="filename">sprites/blueprints/miner-chainable.png</key> <key type="filename">sprites/blueprints/miner-chainable.png</key>
<key type="filename">sprites/blueprints/miner.png</key> <key type="filename">sprites/blueprints/miner.png</key>
<key type="filename">sprites/blueprints/reader.png</key>
<key type="filename">sprites/blueprints/rotater-ccw.png</key> <key type="filename">sprites/blueprints/rotater-ccw.png</key>
<key type="filename">sprites/blueprints/rotater-fl.png</key> <key type="filename">sprites/blueprints/rotater-fl.png</key>
<key type="filename">sprites/blueprints/rotater.png</key> <key type="filename">sprites/blueprints/rotater.png</key>
@ -295,6 +296,7 @@
<key type="filename">sprites/buildings/logic_gate-xor.png</key> <key type="filename">sprites/buildings/logic_gate-xor.png</key>
<key type="filename">sprites/buildings/logic_gate.png</key> <key type="filename">sprites/buildings/logic_gate.png</key>
<key type="filename">sprites/buildings/miner-chainable.png</key> <key type="filename">sprites/buildings/miner-chainable.png</key>
<key type="filename">sprites/buildings/reader.png</key>
<key type="filename">sprites/buildings/rotater-ccw.png</key> <key type="filename">sprites/buildings/rotater-ccw.png</key>
<key type="filename">sprites/buildings/rotater-fl.png</key> <key type="filename">sprites/buildings/rotater-fl.png</key>
<key type="filename">sprites/buildings/splitter-compact-inverse.png</key> <key type="filename">sprites/buildings/splitter-compact-inverse.png</key>
@ -312,6 +314,7 @@
<key type="filename">sprites/buildings/virtual_processor.png</key> <key type="filename">sprites/buildings/virtual_processor.png</key>
<key type="filename">sprites/buildings/wire_tunnel-coating.png</key> <key type="filename">sprites/buildings/wire_tunnel-coating.png</key>
<key type="filename">sprites/buildings/wire_tunnel.png</key> <key type="filename">sprites/buildings/wire_tunnel.png</key>
<key type="filename">sprites/misc/reader_overlay.png</key>
<key type="filename">sprites/wires/lever_on.png</key> <key type="filename">sprites/wires/lever_on.png</key>
<key type="filename">sprites/wires/sets/color_cross.png</key> <key type="filename">sprites/wires/sets/color_cross.png</key>
<key type="filename">sprites/wires/sets/color_forward.png</key> <key type="filename">sprites/wires/sets/color_forward.png</key>
@ -466,6 +469,8 @@
<key type="filename">sprites/buildings/miner.png</key> <key type="filename">sprites/buildings/miner.png</key>
<key type="filename">sprites/buildings/rotater.png</key> <key type="filename">sprites/buildings/rotater.png</key>
<key type="filename">sprites/buildings/trash.png</key> <key type="filename">sprites/buildings/trash.png</key>
<key type="filename">sprites/misc/processor_disabled.png</key>
<key type="filename">sprites/misc/processor_disconnected.png</key>
<key type="filename">sprites/wires/logical_acceptor.png</key> <key type="filename">sprites/wires/logical_acceptor.png</key>
<key type="filename">sprites/wires/logical_ejector.png</key> <key type="filename">sprites/wires/logical_ejector.png</key>
<key type="filename">sprites/wires/overlay_tile.png</key> <key type="filename">sprites/wires/overlay_tile.png</key>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -1,111 +1,114 @@
export default { export default {
// You can set any debug options here! // You can set any debug options here!
/* dev:start */ /* dev:start */
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Quickly enters the game and skips the main menu - good for fast iterating // Quickly enters the game and skips the main menu - good for fast iterating
// fastGameEnter: true, // fastGameEnter: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Skips any delays like transitions between states and such // Skips any delays like transitions between states and such
// noArtificialDelays: true, // noArtificialDelays: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables writing of savegames, useful for testing the same savegame over and over // Disables writing of savegames, useful for testing the same savegame over and over
// disableSavegameWrite: true, // disableSavegameWrite: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Shows bounds of all entities // Shows bounds of all entities
// showEntityBounds: true, // showEntityBounds: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Shows arrows for every ejector / acceptor // Shows arrows for every ejector / acceptor
// showAcceptorEjectors: true, // showAcceptorEjectors: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables the music (Overrides any setting, can cause weird behaviour) // Disables the music (Overrides any setting, can cause weird behaviour)
// disableMusic: true, // disableMusic: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Do not render static map entities (=most buildings) // Do not render static map entities (=most buildings)
// doNotRenderStatics: true, // doNotRenderStatics: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Allow to zoom freely without limits // Allow to zoom freely without limits
// disableZoomLimits: true, // disableZoomLimits: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Shows a border arround every chunk // Shows a border arround every chunk
// showChunkBorders: true, // showChunkBorders: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// All rewards can be unlocked by passing just 1 of any shape // All rewards can be unlocked by passing just 1 of any shape
// rewardsInstant: true, // rewardsInstant: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Unlocks all buildings // Unlocks all buildings
// allBuildingsUnlocked: true, // allBuildingsUnlocked: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables cost of blueprints // Disables cost of blueprints
// blueprintsNoCost: true, // blueprintsNoCost: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables cost of upgrades // Disables cost of upgrades
// upgradesNoCost: true, // upgradesNoCost: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables the dialog when completing a level // Disables the dialog when completing a level
// disableUnlockDialog: true, // disableUnlockDialog: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables the simulation - This effectively pauses the game. // Disables the simulation - This effectively pauses the game.
// disableLogicTicks: true, // disableLogicTicks: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Test the rendering if everything is clipped out properly // Test the rendering if everything is clipped out properly
// testClipping: true, // testClipping: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Allows to render slower, useful for recording at half speed to avoid stuttering // Allows to render slower, useful for recording at half speed to avoid stuttering
// framePausesBetweenTicks: 1, // framePausesBetweenTicks: 250,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Replace all translations with emojis to see which texts are translateable // Replace all translations with emojis to see which texts are translateable
// testTranslations: true, // testTranslations: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Enables an inspector which shows information about the entity below the curosr // Enables an inspector which shows information about the entity below the curosr
// enableEntityInspector: true, // enableEntityInspector: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Enables ads in the local build (normally they are deactivated there) // Enables ads in the local build (normally they are deactivated there)
// testAds: true, // testAds: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables the automatic switch to an overview when zooming out // Disables the automatic switch to an overview when zooming out
// disableMapOverview: true, // disableMapOverview: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables the notification when there are new entries in the changelog since last played // Disables the notification when there are new entries in the changelog since last played
// disableUpgradeNotification: true, // disableUpgradeNotification: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Makes belts almost infinitely fast // Makes belts almost infinitely fast
// instantBelts: true, // instantBelts: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Makes item processors almost infinitely fast // Makes item processors almost infinitely fast
// instantProcessors: true, // instantProcessors: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Makes miners almost infinitely fast // Makes miners almost infinitely fast
// instantMiners: true, // instantMiners: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// When using fastGameEnter, controls whether a new game is started or the last one is resumed // When using fastGameEnter, controls whether a new game is started or the last one is resumed
// resumeGameOnFastEnter: true, // resumeGameOnFastEnter: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Special option used to render the trailer // Special option used to render the trailer
// renderForTrailer: true, // renderForTrailer: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Whether to render changes // Whether to render changes
// renderChanges: true, // renderChanges: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Whether to render belt paths // Whether to render belt paths
// renderBeltPaths: true, // renderBeltPaths: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Whether to check belt paths // Whether to check belt paths
// checkBeltPaths: true, // checkBeltPaths: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Whether to items / s instead of items / m in stats // Whether to items / s instead of items / m in stats
// detailedStatistics: true, // detailedStatistics: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Shows detailed information about which atlas is used // Shows detailed information about which atlas is used
// showAtlasInfo: true, // showAtlasInfo: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Renders the rotation of all wires // Renders the rotation of all wires
// renderWireRotations: true, // renderWireRotations: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Renders information about wire networks // Renders information about wire networks
// renderWireNetworkInfos: true, // renderWireNetworkInfos: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
// Disables ejector animations and processing // Disables ejector animations and processing
// disableEjectorProcessing: true, // disableEjectorProcessing: true,
// ----------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------
/* dev:end */ // Allows manual ticking
}; // manualTickOnly: true,
// -----------------------------------------------------------------------------------
/* dev:end */
};

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
import { Component } from "../component"; import { Component } from "../component";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { typeItemSingleton } from "../item_resolver";
import { types } from "../../savegame/serialization";
export class BeltReaderComponent extends Component { export class BeltReaderComponent extends Component {
static getId() { static getId() {
@ -10,6 +12,12 @@ export class BeltReaderComponent extends Component {
return new BeltReaderComponent(); return new BeltReaderComponent();
} }
static getSchema() {
return {
lastItem: types.nullable(typeItemSingleton),
};
}
constructor() { constructor() {
super(); super();

View File

@ -1,144 +1,150 @@
import { enumDirection, enumInvertedDirections, Vector } from "../../core/vector"; import { enumDirection, enumInvertedDirections, Vector } from "../../core/vector";
import { types } from "../../savegame/serialization"; import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { Component } from "../component"; import { Component } from "../component";
/** @typedef {{ /** @typedef {{
* pos: Vector, * pos: Vector,
* directions: enumDirection[], * directions: enumDirection[],
* filter?: ItemType * filter?: ItemType
* }} ItemAcceptorSlot */ * }} ItemAcceptorSlot */
/** /**
* Contains information about a slot plus its location * Contains information about a slot plus its location
* @typedef {{ * @typedef {{
* slot: ItemAcceptorSlot, * slot: ItemAcceptorSlot,
* index: number, * index: number,
* acceptedDirection: enumDirection * acceptedDirection: enumDirection
* }} ItemAcceptorLocatedSlot */ * }} ItemAcceptorLocatedSlot */
/** @typedef {{ /** @typedef {{
* pos: Vector, * pos: Vector,
* directions: enumDirection[], * directions: enumDirection[],
* filter?: ItemType * filter?: ItemType
* }} ItemAcceptorSlotConfig */ * }} ItemAcceptorSlotConfig */
export class ItemAcceptorComponent extends Component { export class ItemAcceptorComponent extends Component {
static getId() { static getId() {
return "ItemAcceptor"; return "ItemAcceptor";
} }
duplicateWithoutContents() { duplicateWithoutContents() {
const slotsCopy = []; const slotsCopy = [];
for (let i = 0; i < this.slots.length; ++i) { for (let i = 0; i < this.slots.length; ++i) {
const slot = this.slots[i]; const slot = this.slots[i];
slotsCopy.push({ slotsCopy.push({
pos: slot.pos.copy(), pos: slot.pos.copy(),
directions: slot.directions.slice(), directions: slot.directions.slice(),
filter: slot.filter, filter: slot.filter,
}); });
} }
return new ItemAcceptorComponent({ return new ItemAcceptorComponent({
slots: slotsCopy, slots: slotsCopy,
}); });
} }
/** /**
* *
* @param {object} param0 * @param {object} param0
* @param {Array<ItemAcceptorSlotConfig>} param0.slots The slots from which we accept items * @param {Array<ItemAcceptorSlotConfig>} param0.slots The slots from which we accept items
*/ */
constructor({ slots = [] }) { constructor({ slots = [] }) {
super(); super();
/** /**
* Fixes belt animations * Fixes belt animations
* @type {Array<{ item: BaseItem, slotIndex: number, animProgress: number, direction: enumDirection }>} * @type {Array<{
*/ * item: BaseItem,
this.itemConsumptionAnimations = []; * slotIndex: number,
* animProgress: number,
this.setSlots(slots); * direction: enumDirection
} * }>}
*/
/** this.itemConsumptionAnimations = [];
*
* @param {Array<ItemAcceptorSlotConfig>} slots this.setSlots(slots);
*/ }
setSlots(slots) {
/** @type {Array<ItemAcceptorSlot>} */ /**
this.slots = []; *
for (let i = 0; i < slots.length; ++i) { * @param {Array<ItemAcceptorSlotConfig>} slots
const slot = slots[i]; */
this.slots.push({ setSlots(slots) {
pos: slot.pos, /** @type {Array<ItemAcceptorSlot>} */
directions: slot.directions, this.slots = [];
for (let i = 0; i < slots.length; ++i) {
// Which type of item to accept (shape | color | all) @see ItemType const slot = slots[i];
filter: slot.filter, this.slots.push({
}); pos: slot.pos,
} directions: slot.directions,
}
// Which type of item to accept (shape | color | all) @see ItemType
/** filter: slot.filter,
* Returns if this acceptor can accept a new item at slot N });
* @param {number} slotIndex }
* @param {BaseItem=} item }
*/
canAcceptItem(slotIndex, item) { /**
const slot = this.slots[slotIndex]; * Returns if this acceptor can accept a new item at slot N
return !slot.filter || slot.filter === item.getItemType(); * @param {number} slotIndex
} * @param {BaseItem=} item
*/
/** canAcceptItem(slotIndex, item) {
* Called when an item has been accepted so that const slot = this.slots[slotIndex];
* @param {number} slotIndex return !slot.filter || slot.filter === item.getItemType();
* @param {enumDirection} direction }
* @param {BaseItem} item
*/ /**
onItemAccepted(slotIndex, direction, item) { * Called when an item has been accepted so that
this.itemConsumptionAnimations.push({ * @param {number} slotIndex
item, * @param {enumDirection} direction
slotIndex, * @param {BaseItem} item
direction, * @param {number} remainingProgress World space remaining progress, can be set to set the start position of the item
animProgress: 0.0, */
}); onItemAccepted(slotIndex, direction, item, remainingProgress = 0.0) {
} this.itemConsumptionAnimations.push({
item,
/** slotIndex,
* Tries to find a slot which accepts the current item direction,
* @param {Vector} targetLocalTile animProgress: Math.min(1, remainingProgress * 2),
* @param {enumDirection} fromLocalDirection });
* @returns {ItemAcceptorLocatedSlot|null} }
*/
findMatchingSlot(targetLocalTile, fromLocalDirection) { /**
// We need to invert our direction since the acceptor specifies *from* which direction * Tries to find a slot which accepts the current item
// it accepts items, but the ejector specifies *into* which direction it ejects items. * @param {Vector} targetLocalTile
// E.g.: Ejector ejects into "right" direction but acceptor accepts from "left" direction. * @param {enumDirection} fromLocalDirection
const desiredDirection = enumInvertedDirections[fromLocalDirection]; * @returns {ItemAcceptorLocatedSlot|null}
*/
// Go over all slots and try to find a target slot findMatchingSlot(targetLocalTile, fromLocalDirection) {
for (let slotIndex = 0; slotIndex < this.slots.length; ++slotIndex) { // We need to invert our direction since the acceptor specifies *from* which direction
const slot = this.slots[slotIndex]; // it accepts items, but the ejector specifies *into* which direction it ejects items.
// E.g.: Ejector ejects into "right" direction but acceptor accepts from "left" direction.
// Make sure the acceptor slot is on the right position const desiredDirection = enumInvertedDirections[fromLocalDirection];
if (!slot.pos.equals(targetLocalTile)) {
continue; // Go over all slots and try to find a target slot
} for (let slotIndex = 0; slotIndex < this.slots.length; ++slotIndex) {
const slot = this.slots[slotIndex];
// Check if the acceptor slot accepts items from our direction
for (let i = 0; i < slot.directions.length; ++i) { // Make sure the acceptor slot is on the right position
// const localDirection = targetStaticComp.localDirectionToWorld(slot.directions[l]); if (!slot.pos.equals(targetLocalTile)) {
if (desiredDirection === slot.directions[i]) { continue;
return { }
slot,
index: slotIndex, // Check if the acceptor slot accepts items from our direction
acceptedDirection: desiredDirection, for (let i = 0; i < slot.directions.length; ++i) {
}; // const localDirection = targetStaticComp.localDirectionToWorld(slot.directions[l]);
} if (desiredDirection === slot.directions[i]) {
} return {
} slot,
index: slotIndex,
return null; acceptedDirection: desiredDirection,
} };
} }
}
}
return null;
}
}

View File

@ -29,6 +29,17 @@ export const enumItemProcessorRequirements = {
filter: "filter", filter: "filter",
}; };
/** @typedef {{
* item: BaseItem,
* requiredSlot?: number,
* preferredSlot?: number
* }} EjectorItemToEject */
/** @typedef {{
* remainingTime: number,
* items: Array<EjectorItemToEject>,
* }} EjectorCharge */
export class ItemProcessorComponent extends Component { export class ItemProcessorComponent extends Component {
static getId() { static getId() {
return "ItemProcessor"; return "ItemProcessor";
@ -37,20 +48,6 @@ export class ItemProcessorComponent extends Component {
static getSchema() { static getSchema() {
return { return {
nextOutputSlot: types.uint, nextOutputSlot: types.uint,
inputSlots: types.array(
types.structured({
item: typeItemSingleton,
sourceSlot: types.uint,
})
),
itemsToEject: types.array(
types.structured({
item: typeItemSingleton,
requiredSlot: types.nullable(types.uint),
preferredSlot: types.nullable(types.uint),
})
),
secondsUntilEject: types.float,
}; };
} }
@ -101,21 +98,15 @@ export class ItemProcessorComponent extends Component {
* What we are currently processing, empty if we don't produce anything rn * What we are currently processing, empty if we don't produce anything rn
* requiredSlot: Item *must* be ejected on this slot * requiredSlot: Item *must* be ejected on this slot
* preferredSlot: Item *can* be ejected on this slot, but others are fine too if the one is not usable * preferredSlot: Item *can* be ejected on this slot, but others are fine too if the one is not usable
* @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} * @type {Array<EjectorCharge>}
*/ */
this.itemsToEject = []; this.ongoingCharges = [];
/**
* How long it takes until we are done with the current items
* @type {number}
*/
this.secondsUntilEject = 0;
/** /**
* How much processing time we have left from the last tick * How much processing time we have left from the last tick
* @type {number} * @type {number}
*/ */
this.bonusFromLastTick = 0; this.bonusTime = 0;
} }
/** /**

View File

@ -125,6 +125,24 @@ export class GameCore {
// @ts-ignore // @ts-ignore
window.globalRoot = root; window.globalRoot = root;
} }
// @todo Find better place
if (G_IS_DEV && globalConfig.debug.manualTickOnly) {
this.root.gameState.inputReciever.keydown.add(key => {
if (key.keyCode === 84) {
// 'T'
// Extract current real time
this.root.time.updateRealtimeNow();
// Perform logic ticks
this.root.time.performTicks(this.root.dynamicTickrate.deltaMs, this.boundInternalTick);
// Update analytics
root.productionAnalytics.update();
}
});
}
} }
/** /**
@ -244,11 +262,13 @@ export class GameCore {
// Camera is always updated, no matter what // Camera is always updated, no matter what
root.camera.update(deltaMs); root.camera.update(deltaMs);
// Perform logic ticks if (!(G_IS_DEV && globalConfig.debug.manualTickOnly)) {
this.root.time.performTicks(deltaMs, this.boundInternalTick); // Perform logic ticks
this.root.time.performTicks(deltaMs, this.boundInternalTick);
// Update analytics // Update analytics
root.productionAnalytics.update(); root.productionAnalytics.update();
}
// Update automatic save after everything finished // Update automatic save after everything finished
root.automaticSave.update(); root.automaticSave.update();

View File

@ -1,124 +1,125 @@
import { GameRoot } from "./root"; import { GameRoot } from "./root";
import { createLogger } from "../core/logging"; import { createLogger } from "../core/logging";
import { globalConfig } from "../core/config"; import { globalConfig } from "../core/config";
const logger = createLogger("dynamic_tickrate"); const logger = createLogger("dynamic_tickrate");
const fpsAccumulationTime = 1000; const fpsAccumulationTime = 1000;
export class DynamicTickrate { export class DynamicTickrate {
/** /**
* *
* @param {GameRoot} root * @param {GameRoot} root
*/ */
constructor(root) { constructor(root) {
this.root = root; this.root = root;
this.currentTickStart = null; this.currentTickStart = null;
this.capturedTicks = []; this.capturedTicks = [];
this.averageTickDuration = 0; this.averageTickDuration = 0;
this.accumulatedFps = 0; this.accumulatedFps = 0;
this.accumulatedFpsLastUpdate = 0; this.accumulatedFpsLastUpdate = 0;
this.averageFps = 60; this.averageFps = 60;
this.setTickRate(60); this.setTickRate(this.root.app.settings.getDesiredFps());
if (G_IS_DEV && globalConfig.debug.renderForTrailer) { if (G_IS_DEV && globalConfig.debug.renderForTrailer) {
this.setTickRate(300); this.setTickRate(300);
} }
} }
onFrameRendered() { onFrameRendered() {
++this.accumulatedFps; ++this.accumulatedFps;
const now = performance.now(); const now = performance.now();
const timeDuration = now - this.accumulatedFpsLastUpdate; const timeDuration = now - this.accumulatedFpsLastUpdate;
if (timeDuration > fpsAccumulationTime) { if (timeDuration > fpsAccumulationTime) {
const avgFps = (this.accumulatedFps / fpsAccumulationTime) * 1000; const avgFps = (this.accumulatedFps / fpsAccumulationTime) * 1000;
this.averageFps = avgFps; this.averageFps = avgFps;
this.accumulatedFps = 0; this.accumulatedFps = 0;
this.accumulatedFpsLastUpdate = now; this.accumulatedFpsLastUpdate = now;
} }
} }
/** /**
* Sets the tick rate to N updates per second * Sets the tick rate to N updates per second
* @param {number} rate * @param {number} rate
*/ */
setTickRate(rate) { setTickRate(rate) {
logger.log("Applying tick-rate of", rate); logger.log("Applying tick-rate of", rate);
this.currentTickRate = rate; this.currentTickRate = rate;
this.deltaMs = 1000.0 / this.currentTickRate; this.deltaMs = 1000.0 / this.currentTickRate;
this.deltaSeconds = 1.0 / this.currentTickRate; this.deltaSeconds = 1.0 / this.currentTickRate;
} }
/** /**
* Increases the tick rate marginally * Increases the tick rate marginally
*/ */
increaseTickRate() { increaseTickRate() {
if (G_IS_DEV && globalConfig.debug.renderForTrailer) { if (G_IS_DEV && globalConfig.debug.renderForTrailer) {
return; return;
} }
const desiredFps = this.root.app.settings.getDesiredFps(); const desiredFps = this.root.app.settings.getDesiredFps();
this.setTickRate(Math.round(Math.min(desiredFps, this.currentTickRate * 1.2))); this.setTickRate(Math.round(Math.min(desiredFps, this.currentTickRate * 1.2)));
} }
/** /**
* Decreases the tick rate marginally * Decreases the tick rate marginally
*/ */
decreaseTickRate() { decreaseTickRate() {
if (G_IS_DEV && globalConfig.debug.renderForTrailer) { if (G_IS_DEV && globalConfig.debug.renderForTrailer) {
return; return;
} }
const desiredFps = this.root.app.settings.getDesiredFps(); const desiredFps = this.root.app.settings.getDesiredFps();
this.setTickRate(Math.round(Math.max(desiredFps / 2, this.currentTickRate * 0.8))); this.setTickRate(Math.round(Math.max(desiredFps / 2, this.currentTickRate * 0.8)));
} }
/** /**
* Call whenever a tick began * Call whenever a tick began
*/ */
beginTick() { beginTick() {
assert(this.currentTickStart === null, "BeginTick called twice"); assert(this.currentTickStart === null, "BeginTick called twice");
this.currentTickStart = performance.now(); this.currentTickStart = performance.now();
if (this.capturedTicks.length > this.currentTickRate * 2) { if (this.capturedTicks.length > this.currentTickRate * 2) {
// Take only a portion of the ticks // Take only a portion of the ticks
this.capturedTicks.sort(); this.capturedTicks.sort();
this.capturedTicks.splice(0, 10); this.capturedTicks.splice(0, 10);
this.capturedTicks.splice(this.capturedTicks.length - 11, 10); this.capturedTicks.splice(this.capturedTicks.length - 11, 10);
let average = 0; let average = 0;
for (let i = 0; i < this.capturedTicks.length; ++i) { for (let i = 0; i < this.capturedTicks.length; ++i) {
average += this.capturedTicks[i]; average += this.capturedTicks[i];
} }
average /= this.capturedTicks.length; average /= this.capturedTicks.length;
this.averageTickDuration = average; this.averageTickDuration = average;
const desiredFps = this.root.app.settings.getDesiredFps(); const desiredFps = this.root.app.settings.getDesiredFps();
if (this.averageFps > desiredFps * 0.9) { // Disabled for now: Dynamicall adjusting tick rate
// if (average < maxTickDuration) { // if (this.averageFps > desiredFps * 0.9) {
this.increaseTickRate(); // // if (average < maxTickDuration) {
} else if (this.averageFps < desiredFps * 0.7) { // this.increaseTickRate();
this.decreaseTickRate(); // } else if (this.averageFps < desiredFps * 0.7) {
} // this.decreaseTickRate();
// }
this.capturedTicks = [];
} this.capturedTicks = [];
} }
}
/**
* Call whenever a tick ended /**
*/ * Call whenever a tick ended
endTick() { */
assert(this.currentTickStart !== null, "EndTick called without BeginTick"); endTick() {
const duration = performance.now() - this.currentTickStart; assert(this.currentTickStart !== null, "EndTick called without BeginTick");
this.capturedTicks.push(duration); const duration = performance.now() - this.currentTickStart;
this.currentTickStart = null; this.capturedTicks.push(duration);
} this.currentTickStart = null;
} }
}

View File

@ -110,6 +110,10 @@ export class GameSystemManager {
// Order is important! // Order is important!
// IMPORTANT: Item acceptor must be before the belt, because it may not tick after the belt
// has put in the item into the acceptor animation, otherwise its off
add("itemAcceptor", ItemAcceptorSystem);
add("belt", BeltSystem); add("belt", BeltSystem);
add("undergroundBelt", UndergroundBeltSystem); add("undergroundBelt", UndergroundBeltSystem);
@ -134,11 +138,6 @@ export class GameSystemManager {
add("constantSignal", ConstantSignalSystem); add("constantSignal", ConstantSignalSystem);
// IMPORTANT: Must be after belt system since belt system can change the
// orientation of an entity after it is placed -> the item acceptor cache
// then would be invalid
add("itemAcceptor", ItemAcceptorSystem);
// WIRES section // WIRES section
add("lever", LeverSystem); add("lever", LeverSystem);

View File

@ -454,6 +454,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
const ejectorComp = this.fakeEntity.components.ItemEjector; const ejectorComp = this.fakeEntity.components.ItemEjector;
const staticComp = this.fakeEntity.components.StaticMapEntity; const staticComp = this.fakeEntity.components.StaticMapEntity;
const beltComp = this.fakeEntity.components.Belt; const beltComp = this.fakeEntity.components.Belt;
const minerComp = this.fakeEntity.components.Miner;
const goodArrowSprite = Loader.getSprite("sprites/misc/slot_good_arrow.png"); const goodArrowSprite = Loader.getSprite("sprites/misc/slot_good_arrow.png");
const badArrowSprite = Loader.getSprite("sprites/misc/slot_bad_arrow.png"); const badArrowSprite = Loader.getSprite("sprites/misc/slot_bad_arrow.png");
@ -571,6 +572,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
const destEntity = destEntities[i]; const destEntity = destEntities[i];
const destAcceptor = destEntity.components.ItemAcceptor; const destAcceptor = destEntity.components.ItemAcceptor;
const destStaticComp = destEntity.components.StaticMapEntity; const destStaticComp = destEntity.components.StaticMapEntity;
const destMiner = destEntity.components.Miner;
const destLocalTile = destStaticComp.worldToLocalTile(ejectorSlotWsTile); const destLocalTile = destStaticComp.worldToLocalTile(ejectorSlotWsTile);
const destLocalDir = destStaticComp.worldDirectionToLocal(ejectorSlotWsDirection); const destLocalDir = destStaticComp.worldDirectionToLocal(ejectorSlotWsDirection);
@ -580,6 +582,9 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
} else if (destEntity.components.Belt && destLocalDir === enumDirection.top) { } else if (destEntity.components.Belt && destLocalDir === enumDirection.top) {
// Connected to a belt // Connected to a belt
isConnected = true; isConnected = true;
} else if (minerComp && minerComp.chainable && destMiner && destMiner.chainable) {
// Chainable miners connected to eachother
isConnected = true;
} else { } else {
// This one is blocked // This one is blocked
isBlocked = true; isBlocked = true;

View File

@ -1,82 +1,80 @@
import { globalConfig } from "../../core/config"; import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters"; import { DrawParameters } from "../../core/draw_parameters";
import { fastArrayDelete } from "../../core/utils"; import { fastArrayDelete } from "../../core/utils";
import { enumDirectionToVector } from "../../core/vector"; import { enumDirectionToVector } from "../../core/vector";
import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemAcceptorComponent } from "../components/item_acceptor";
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view"; import { MapChunkView } from "../map_chunk_view";
export class ItemAcceptorSystem extends GameSystemWithFilter { export class ItemAcceptorSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
super(root, [ItemAcceptorComponent]); super(root, [ItemAcceptorComponent]);
} }
update() { update() {
const progress = this.root.dynamicTickrate.deltaSeconds * 2; // * 2 because its only a half tile const progress =
this.root.dynamicTickrate.deltaSeconds *
for (let i = 0; i < this.allEntities.length; ++i) { 2 *
const entity = this.allEntities[i]; this.root.hubGoals.getBeltBaseSpeed() *
const aceptorComp = entity.components.ItemAcceptor; globalConfig.itemSpacingOnBelts; // * 2 because its only a half tile
const animations = aceptorComp.itemConsumptionAnimations;
for (let i = 0; i < this.allEntities.length; ++i) {
// Process item consumption animations to avoid items popping from the belts const entity = this.allEntities[i];
for (let animIndex = 0; animIndex < animations.length; ++animIndex) { const aceptorComp = entity.components.ItemAcceptor;
const anim = animations[animIndex]; const animations = aceptorComp.itemConsumptionAnimations;
anim.animProgress +=
progress * this.root.hubGoals.getBeltBaseSpeed() * globalConfig.itemSpacingOnBelts; // Process item consumption animations to avoid items popping from the belts
if (anim.animProgress > 1) { for (let animIndex = 0; animIndex < animations.length; ++animIndex) {
// Original const anim = animations[animIndex];
// animations.splice(animIndex, 1); anim.animProgress += progress;
if (anim.animProgress > 1) {
// Faster variant fastArrayDelete(animations, animIndex);
fastArrayDelete(animations, animIndex); animIndex -= 1;
}
animIndex -= 1; }
} }
} }
}
} /**
* @param {DrawParameters} parameters
/** * @param {MapChunkView} chunk
* @param {DrawParameters} parameters */
* @param {MapChunkView} chunk drawChunk(parameters, chunk) {
*/ const contents = chunk.containedEntitiesByLayer.regular;
drawChunk(parameters, chunk) { for (let i = 0; i < contents.length; ++i) {
const contents = chunk.containedEntitiesByLayer.regular; const entity = contents[i];
for (let i = 0; i < contents.length; ++i) { const acceptorComp = entity.components.ItemAcceptor;
const entity = contents[i]; if (!acceptorComp) {
const acceptorComp = entity.components.ItemAcceptor; continue;
if (!acceptorComp) { }
continue;
} const staticComp = entity.components.StaticMapEntity;
for (let animIndex = 0; animIndex < acceptorComp.itemConsumptionAnimations.length; ++animIndex) {
const staticComp = entity.components.StaticMapEntity; const { item, slotIndex, animProgress, direction } = acceptorComp.itemConsumptionAnimations[
for (let animIndex = 0; animIndex < acceptorComp.itemConsumptionAnimations.length; ++animIndex) { animIndex
const { item, slotIndex, animProgress, direction } = acceptorComp.itemConsumptionAnimations[ ];
animIndex
]; const slotData = acceptorComp.slots[slotIndex];
const realSlotPos = staticComp.localTileToWorld(slotData.pos);
const slotData = acceptorComp.slots[slotIndex];
const realSlotPos = staticComp.localTileToWorld(slotData.pos); if (!chunk.tileSpaceRectangle.containsPoint(realSlotPos.x, realSlotPos.y)) {
// Not within this chunk
if (!chunk.tileSpaceRectangle.containsPoint(realSlotPos.x, realSlotPos.y)) { continue;
// Not within this chunk }
continue;
} const fadeOutDirection = enumDirectionToVector[staticComp.localDirectionToWorld(direction)];
const finalTile = realSlotPos.subScalars(
const fadeOutDirection = enumDirectionToVector[staticComp.localDirectionToWorld(direction)]; fadeOutDirection.x * (animProgress / 2 - 0.5),
const finalTile = realSlotPos.subScalars( fadeOutDirection.y * (animProgress / 2 - 0.5)
fadeOutDirection.x * (animProgress / 2 - 0.5), );
fadeOutDirection.y * (animProgress / 2 - 0.5)
); item.drawItemCenteredClipped(
(finalTile.x + 0.5) * globalConfig.tileSize,
item.drawItemCenteredClipped( (finalTile.y + 0.5) * globalConfig.tileSize,
(finalTile.x + 0.5) * globalConfig.tileSize, parameters,
(finalTile.y + 0.5) * globalConfig.tileSize, globalConfig.defaultItemDiameter
parameters, );
globalConfig.defaultItemDiameter }
); }
} }
} }
}
}

View File

@ -1,4 +1,3 @@
import { globalConfig } from "../../core/config";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { enumColorMixingResults, enumColors } from "../colors"; import { enumColorMixingResults, enumColors } from "../colors";
import { import {
@ -12,6 +11,11 @@ import { BOOL_TRUE_SINGLETON, isTruthyItem } from "../items/boolean_item";
import { ColorItem, COLOR_ITEM_SINGLETONS } from "../items/color_item"; import { ColorItem, COLOR_ITEM_SINGLETONS } from "../items/color_item";
import { ShapeItem } from "../items/shape_item"; import { ShapeItem } from "../items/shape_item";
/**
* We need to allow queuing charges, otherwise the throughput will stall
*/
const MAX_QUEUED_CHARGES = 2;
export class ItemProcessorSystem extends GameSystemWithFilter { export class ItemProcessorSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
super(root, [ItemProcessorComponent]); super(root, [ItemProcessorComponent]);
@ -24,60 +28,64 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
const processorComp = entity.components.ItemProcessor; const processorComp = entity.components.ItemProcessor;
const ejectorComp = entity.components.ItemEjector; const ejectorComp = entity.components.ItemEjector;
// First of all, process the current recipe const currentCharge = processorComp.ongoingCharges[0];
const newSecondsUntilEject =
processorComp.secondsUntilEject - this.root.dynamicTickrate.deltaSeconds;
processorComp.secondsUntilEject = Math.max(0, newSecondsUntilEject); if (currentCharge) {
// Process next charge
if (currentCharge.remainingTime > 0.0) {
currentCharge.remainingTime -= this.root.dynamicTickrate.deltaSeconds;
if (currentCharge.remainingTime < 0.0) {
// Add bonus time, this is the time we spent too much
processorComp.bonusTime += -currentCharge.remainingTime;
}
}
if (newSecondsUntilEject < 0) { // Check if it finished
processorComp.bonusFromLastTick -= newSecondsUntilEject; if (currentCharge.remainingTime <= 0.0) {
} const itemsToEject = currentCharge.items;
if (G_IS_DEV && globalConfig.debug.instantProcessors) { // Go over all items and try to eject them
processorComp.secondsUntilEject = 0; for (let j = 0; j < itemsToEject.length; ++j) {
} const { item, requiredSlot, preferredSlot } = itemsToEject[j];
// Check if we have any finished items we can eject let slot = null;
if ( if (requiredSlot !== null && requiredSlot !== undefined) {
processorComp.secondsUntilEject === 0 && // it was processed in time // We have a slot override, check if that is free
processorComp.itemsToEject.length > 0 // we have some items left to eject if (ejectorComp.canEjectOnSlot(requiredSlot)) {
) { slot = requiredSlot;
for (let itemIndex = 0; itemIndex < processorComp.itemsToEject.length; ++itemIndex) { }
const { item, requiredSlot, preferredSlot } = processorComp.itemsToEject[itemIndex]; } else if (preferredSlot !== null && preferredSlot !== undefined) {
// We have a slot preference, try using it but otherwise use a free slot
let slot = null; if (ejectorComp.canEjectOnSlot(preferredSlot)) {
if (requiredSlot !== null && requiredSlot !== undefined) { slot = preferredSlot;
// We have a slot override, check if that is free } else {
if (ejectorComp.canEjectOnSlot(requiredSlot)) { slot = ejectorComp.getFirstFreeSlot();
slot = requiredSlot; }
}
} else if (preferredSlot !== null && preferredSlot !== undefined) {
// We have a slot preference, try using it but otherwise use a free slot
if (ejectorComp.canEjectOnSlot(preferredSlot)) {
slot = preferredSlot;
} else { } else {
// We can eject on any slot
slot = ejectorComp.getFirstFreeSlot(); slot = ejectorComp.getFirstFreeSlot();
} }
} else {
// We can eject on any slot if (slot !== null) {
slot = ejectorComp.getFirstFreeSlot(); // Alright, we can actually eject
if (!ejectorComp.tryEject(slot, item)) {
assert(false, "Failed to eject");
} else {
itemsToEject.splice(j, 1);
j -= 1;
}
}
} }
if (slot !== null) { // If the charge was entirely emptied to the outputs, start the next charge
// Alright, we can actually eject if (itemsToEject.length === 0) {
if (!ejectorComp.tryEject(slot, item)) { processorComp.ongoingCharges.shift();
assert(false, "Failed to eject");
} else {
processorComp.itemsToEject.splice(itemIndex, 1);
itemIndex -= 1;
}
} }
} }
} }
// Check if we have an empty queue and can start a new charge // Check if we have an empty queue and can start a new charge
if (processorComp.itemsToEject.length === 0) { if (processorComp.ongoingCharges.length < MAX_QUEUED_CHARGES) {
if (this.canProcess(entity)) { if (this.canProcess(entity)) {
this.startNewCharge(entity); this.startNewCharge(entity);
} }
@ -236,12 +244,6 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
itemsBySlot[items[i].sourceSlot] = items[i]; itemsBySlot[items[i].sourceSlot] = items[i];
} }
const baseSpeed = this.root.hubGoals.getProcessorBaseSpeed(processorComp.type);
// Substract one tick because we already process it this frame
processorComp.secondsUntilEject = Math.max(0, 1 / baseSpeed - processorComp.bonusFromLastTick);
processorComp.bonusFromLastTick = 0;
/** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */ /** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */
const outItems = []; const outItems = [];
@ -544,6 +546,35 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
} }
} }
processorComp.itemsToEject = outItems; // Queue Charge
const baseSpeed = this.root.hubGoals.getProcessorBaseSpeed(processorComp.type);
const originalTime = 1 / baseSpeed;
const bonusTimeToApply = Math.min(originalTime, processorComp.bonusTime);
const timeToProcess = originalTime - bonusTimeToApply;
// Substract one tick because we already process it this frame
// if (processorComp.bonusTime > originalTime) {
// if (processorComp.type === enumItemProcessorTypes.reader) {
// console.log(
// "Bonus time",
// round4Digits(processorComp.bonusTime),
// "Original time",
// round4Digits(originalTime),
// "Overcomit by",
// round4Digits(processorComp.bonusTime - originalTime),
// "->",
// round4Digits(timeToProcess),
// "reduced by",
// round4Digits(bonusTimeToApply)
// );
// }
// }
processorComp.bonusTime -= bonusTimeToApply;
processorComp.ongoingCharges.push({
items: outItems,
remainingTime: timeToProcess,
});
} }
} }

View File

@ -88,10 +88,7 @@ export class ItemProcessorOverlaysSystem extends GameSystem {
parameters.context.textAlign = "center"; parameters.context.textAlign = "center";
parameters.context.font = "bold 10px GameFont"; parameters.context.font = "bold 10px GameFont";
parameters.context.fillText( parameters.context.fillText(
"" + "" + Math.round(readerComp.lastThroughput * 10) / 10,
(G_IS_DEV
? round4Digits(readerComp.lastThroughput)
: Math.round(readerComp.lastThroughput * 10) / 10),
(staticComp.origin.x + 0.5) * globalConfig.tileSize, (staticComp.origin.x + 0.5) * globalConfig.tileSize,
(staticComp.origin.y + 0.62) * globalConfig.tileSize (staticComp.origin.y + 0.62) * globalConfig.tileSize
); );

View File

@ -35,18 +35,40 @@ export class LogicGateSystem extends GameSystemWithFilter {
const slotValues = []; const slotValues = [];
// Store if any conflict was found
let anyConflict = false;
// Gather inputs from all connected networks
for (let i = 0; i < slotComp.slots.length; ++i) { for (let i = 0; i < slotComp.slots.length; ++i) {
const slot = slotComp.slots[i]; const slot = slotComp.slots[i];
if (slot.type !== enumPinSlotType.logicalAcceptor) { if (slot.type !== enumPinSlotType.logicalAcceptor) {
continue; continue;
} }
if (slot.linkedNetwork) { if (slot.linkedNetwork) {
if (slot.linkedNetwork.valueConflict) {
anyConflict = true;
break;
}
slotValues.push(slot.linkedNetwork.currentValue); slotValues.push(slot.linkedNetwork.currentValue);
} else { } else {
slotValues.push(null); slotValues.push(null);
} }
} }
// Handle conflicts
if (anyConflict) {
for (let i = 0; i < slotComp.slots.length; ++i) {
const slot = slotComp.slots[i];
if (slot.type !== enumPinSlotType.logicalEjector) {
continue;
}
slot.value = null;
}
continue;
}
// Compute actual result
const result = this.boundOperations[logicComp.type](slotValues); const result = this.boundOperations[logicComp.type](slotValues);
if (Array.isArray(result)) { if (Array.isArray(result)) {

View File

@ -1,82 +1,82 @@
import { globalConfig } from "../../core/config"; import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters"; import { DrawParameters } from "../../core/draw_parameters";
import { GameSystem } from "../game_system"; import { GameSystem } from "../game_system";
import { MapChunkView } from "../map_chunk_view"; import { MapChunkView } from "../map_chunk_view";
export class StaticMapEntitySystem extends GameSystem { export class StaticMapEntitySystem extends GameSystem {
constructor(root) { constructor(root) {
super(root); super(root);
/** @type {Set<number>} */ /** @type {Set<number>} */
this.drawnUids = new Set(); this.drawnUids = new Set();
this.root.signals.gameFrameStarted.add(this.clearUidList, this); this.root.signals.gameFrameStarted.add(this.clearUidList, this);
} }
/** /**
* Clears the uid list when a new frame started * Clears the uid list when a new frame started
*/ */
clearUidList() { clearUidList() {
this.drawnUids.clear(); this.drawnUids.clear();
} }
/** /**
* Draws the static entities * Draws the static entities
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {MapChunkView} chunk * @param {MapChunkView} chunk
*/ */
drawChunk(parameters, chunk) { drawChunk(parameters, chunk) {
if (G_IS_DEV && globalConfig.debug.doNotRenderStatics) { if (G_IS_DEV && globalConfig.debug.doNotRenderStatics) {
return; return;
} }
const contents = chunk.containedEntitiesByLayer.regular; const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) { for (let i = 0; i < contents.length; ++i) {
const entity = contents[i]; const entity = contents[i];
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
const sprite = staticComp.getSprite(); const sprite = staticComp.getSprite();
if (sprite) { if (sprite) {
// Avoid drawing an entity twice which has been drawn for // Avoid drawing an entity twice which has been drawn for
// another chunk already // another chunk already
if (this.drawnUids.has(entity.uid)) { if (this.drawnUids.has(entity.uid)) {
continue; continue;
} }
this.drawnUids.add(entity.uid); this.drawnUids.add(entity.uid);
staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2); staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2);
} }
} }
} }
/** /**
* Draws the static wire entities * Draws the static wire entities
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {MapChunkView} chunk * @param {MapChunkView} chunk
*/ */
drawWiresChunk(parameters, chunk) { drawWiresChunk(parameters, chunk) {
if (G_IS_DEV && globalConfig.debug.doNotRenderStatics) { if (G_IS_DEV && globalConfig.debug.doNotRenderStatics) {
return; return;
} }
const drawnUids = new Set(); const drawnUids = new Set();
const contents = chunk.wireContents; const contents = chunk.wireContents;
for (let y = 0; y < globalConfig.mapChunkSize; ++y) { for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
for (let x = 0; x < globalConfig.mapChunkSize; ++x) { for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
const entity = contents[x][y]; const entity = contents[x][y];
if (entity) { if (entity) {
if (drawnUids.has(entity.uid)) { if (drawnUids.has(entity.uid)) {
continue; continue;
} }
drawnUids.add(entity.uid); drawnUids.add(entity.uid);
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
const sprite = staticComp.getSprite(); const sprite = staticComp.getSprite();
if (sprite) { if (sprite) {
staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2); staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2);
} }
} }
} }
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -44,48 +44,45 @@ steamPage:
Nutze dein gesammeltes Wissen über die Maschinen und lasse deine Fabriken die gewünschten Formen der 18 verschiedenen Level abliefern. Schalte mit jedem Level neue Arbeitsschritte oder Gebäude frei. Das sollte dich schon für Stunden beschäftigt halten! Danach werden im Freispielmodus zufällige Formen generiert, die du ebenfalls abliefern kannst. Ich füge regelmäßig neue Funktionen hinzu und davon sind eine ganze Menge geplant! Nutze dein gesammeltes Wissen über die Maschinen und lasse deine Fabriken die gewünschten Formen der 18 verschiedenen Level abliefern. Schalte mit jedem Level neue Arbeitsschritte oder Gebäude frei. Das sollte dich schon für Stunden beschäftigt halten! Danach werden im Freispielmodus zufällige Formen generiert, die du ebenfalls abliefern kannst. Ich füge regelmäßig neue Funktionen hinzu und davon sind eine ganze Menge geplant!
Wenn du das Spiel erwirbst, erhälst du Zugriff auf die zusätzlichen Features der Standalone-Version. Das bedeutet, du kannst unter anderem die neuesten Updates zuerst spielen! Wenn du das Spiel erwirbst, erhälst du Zugriff auf die zusätzlichen Features der Standalone-Version. Das bedeutet, du kannst unter anderem die neuesten Updates zuerst spielen!
[b]Vorteile der Standalone[/b] [b]Vorteile der Standalone[/b]
[list] [list]
[*] Dark Mode [*] Dark-Mode
[*] unbegrenzte Anzahl an Wegpunkten [*] Unbegrenzte Anzahl an Wegpunkten
[*] unbegrenzte Anzahl an Speicherständen [*] Unbegrenzte Anzahl an Speicherständen
[*] zusätzliche Einstellungen [*] Zusätzliche Einstellungen
[*] Bald: Strom & Kabel! (Ungefähr) geplant für ende Juli 2020. [*] Es kommen: Kabel & Energie! Voraussichtlich gegen Ende Juli 2020
[*] Bald: mehr Level [*] Es kommen: Mehr Levels
[*] Erlaubt es mir shapez.io weiter zu entwickeln ❤️ [*] Unterstütze die Entwicklung von shapez.io ❤️
[/list] [/list]
[b]Zukünftige Updates:[/b] [b]Geplante Funktionen[/b]
Ich update das Spiel sehr oft, und versuche wöchentlich ein Update zu veröffentlichen! Ich bin aktiv mit der Entwicklung beschäftigt und versuche jede Woche ein Update oder den aktuellen Stand der Entwicklung zu veröffentlichen.
[list] [list]
[*] Verschiedene Karten und Herausforderungen (z.B. Karten mit Hindernissen) [*] Verschiedene Karten und Herausforderungen (z.B. Karten mit Hindernissen)
[*] Herausforderungen (liefere die geforderte Form mit einer beschränkten Karte / anzahl an Gebäuden ab) [*] Puzzle (Liefere die geforderte Form mit begrenztem Platz/limitierten Gebäuden)
[*] Eine Kampange, in der die Gebäude einen Preis haben. [*] Eine Kampagne mit Gebäudekosten
[*] einen konfigurierbaren Kartengenerator (bestimme Ressourcen / Größe / Dichte, den Seed und viel mehr) [*] Konfigurierbarer Kartengenerator (Ändere die Grösse/Anzahl/Dichte der Ressourcenflecken, den Seed und viel mehr)
[*] zusätzliche Formen [*] Mehr Formentypen
[*] Performanceverbesserungen (Das Spiel läuft bereits sehr gut!) [*] Performanceverbesserungen (Das Spiel läuft bereits sehr gut!)
[*] Und vieles mehr! [*] Und vieles mehr!
[/list] [/list]
[b]Das Spiel ist open source![/b] [b]Das Spiel ist Open Source![/b]
Jeder kann dazu beitragen. Ich bin aktiv in der Communtiy involviert und versuche alle Vorschläge zu lesen und beziehe so viel Feedback wie möglich mit in die Entwicklung ein. Jeder kann dazu beitragen! Ich bin aktiv in die Community involviert, versuche alle Vorschläge zu lesen und beziehe so viel Feedback wie möglich mit in die Entwicklung ein.
Die komplette Roadmap gibt es auf dem Trello-Board zum Nachlesen! Die komplette Roadmap gibt es auf dem Trello-Board zum Nachlesen.
[b]Links [/b] [b]Links[/b]
[list] [list]
[*] [url=https://discord.com/invite/HN7EVzV]Offizieller Discord[/url] [*] [url=https://discord.com/invite/HN7EVzV]Offizieller Discord[/url]
[*] [url=https://trello.com/b/ISQncpJP/shapezio]Roadmap[/url] [*] [url=https://trello.com/b/ISQncpJP/shapezio]Roadmap[/url]
[*] [url=https://www.reddit.com/r/shapezio]Subreddit[/url] [*] [url=https://www.reddit.com/r/shapezio]Subreddit[/url]
[*] [url=https://github.com/tobspr/shapez.io]Source code (GitHub)[/url]
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Hilf zu übersetzen[/url]
[*] [url=https://github.com/tobspr/shapez.io]Quelltext (GitHub)[/url] [*] [url=https://github.com/tobspr/shapez.io]Quelltext (GitHub)[/url]
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Hilf beim Übersetzen[/url] [*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Hilf beim Übersetzen[/url]
[/list] [/list]
@ -156,7 +153,7 @@ mainMenu:
# This is shown when using firefox and other browsers which are not supported. # This is shown when using firefox and other browsers which are not supported.
browserWarning: >- browserWarning: >-
Sorry, aber das Spiel wird in deinem Browser langsam laufen! Kaufe die Standalone-Version oder downloade Chrome für die beste Erfahrung! Sorry, aber das Spiel wird in deinem Browser langsam laufen! Kaufe die Standalone-Version oder verwende Chrome für die beste Erfahrung!
savegameLevel: Level <x> savegameLevel: Level <x>
savegameLevelUnknown: Unbekanntes Level savegameLevelUnknown: Unbekanntes Level
@ -274,8 +271,7 @@ dialogs:
exportScreenshotWarning: exportScreenshotWarning:
title: Bildschirmfoto exportieren title: Bildschirmfoto exportieren
desc: >- desc: Hier kannst du ein Bildschirmfoto von deiner ganzen Fabrik erstellen. Für extrem große Fabriken kann das jedoch sehr lange dauern und ggf. zum Spielabsturz führen!
Hier kannst du ein Bildschirmfoto von deiner ganzen Fabrik erstellen. Für extrem große Fabriken kann das jedoch sehr lange dauern und ggf. zum Spielabsturz führen!
ingame: ingame:
# This is shown in the top left corner and displays useful keybindings in # This is shown in the top left corner and displays useful keybindings in
@ -373,7 +369,7 @@ ingame:
delivered: delivered:
title: Abgeliefert title: Abgeliefert
description: Zeigt die Menge an Formen, die im zentralen Gebäude abgeliefert werden. description: Zeigt die Menge an Formen, die im zentralen Gebäude abgeliefert werden.
noShapesProduced: Bisher wurden keine Formen produziert. noShapesProduced: Es werden noch keine Formen produziert oder abgeliefert.
# Displays the shapes per minute, e.g. '523 / m' # Displays the shapes per minute, e.g. '523 / m'
shapesPerMinute: <shapes> / m shapesPerMinute: <shapes> / m
@ -502,7 +498,7 @@ buildings:
name: Rotierer (+90°) name: Rotierer (+90°)
description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad. description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad.
fl: fl:
name: Rotierer (+180°) name: Rotierer (180°)
description: Rotiert die Formen um 180 Grad. description: Rotiert die Formen um 180 Grad.
stacker: stacker:
@ -770,11 +766,18 @@ settings:
description: >- description: >-
Aktiviert das automatische Entfernen von überflüssigen Förderbändern bei der Platzierung von Tunneln. Aktiviert das automatische Entfernen von überflüssigen Förderbändern bei der Platzierung von Tunneln.
Außerdem funktioniert das Ziehen von Tunneln und überschüssige werden ebenfalls entfernt. Außerdem funktioniert das Ziehen von Tunneln und überschüssige werden ebenfalls entfernt.
vignette: vignette:
title: Vignette title: Vignette
description: >- description: >-
Aktiviert den Vignetteneffekt, der den Rand des Bildschirms zunehmend verdunkelt und das Lesen der Textfelder vereinfacht. Aktiviert den Vignetteneffekt, der den Rand des Bildschirms zunehmend verdunkelt und das Lesen der Textfelder vereinfacht.
rotationByBuilding:
title: Rotation pro Gebäudetyp
description: >-
Jeder Gebäudetyp merkt sich einzeln, in welche Richtung er zeigt.
Das fühlt sich möglicherweise besser an, wenn du häufig zwischen verschiedenen Gebäudetypen wechselst.
compactBuildingInfo: compactBuildingInfo:
title: Kompakte Gebäudeinformationen title: Kompakte Gebäudeinformationen
description: >- description: >-
@ -785,13 +788,6 @@ settings:
description: >- description: >-
Deaktiviert die Warnung, die beim Löschen und Ausschneiden von mehr als 100 Feldern angezeigt wird. Deaktiviert die Warnung, die beim Löschen und Ausschneiden von mehr als 100 Feldern angezeigt wird.
rotationByBuilding:
title: Rotation pro Gebäudetyp
description: >-
Jeder Gebäudetyp merkt sich einzeln, in welche Richtung er zeigt.
Das fühlt sich möglicherweise besser an, wenn du häufig zwischen verschiedenen
Gebäudetypen wechselst.
keybindings: keybindings:
title: Tastenbelegung title: Tastenbelegung
hint: >- hint: >-
@ -830,6 +826,8 @@ keybindings:
toggleFPSInfo: FPS und Debug-Info an/aus toggleFPSInfo: FPS und Debug-Info an/aus
switchLayers: Ebenen wechseln switchLayers: Ebenen wechseln
exportScreenshot: Ganze Fabrik als Foto exportieren exportScreenshot: Ganze Fabrik als Foto exportieren
# --- Do not translate the values in this section
belt: *belt belt: *belt
splitter: *splitter splitter: *splitter
underground_belt: *underground_belt underground_belt: *underground_belt
@ -840,6 +838,7 @@ keybindings:
mixer: *mixer mixer: *mixer
painter: *painter painter: *painter
trash: *trash trash: *trash
# ---
pipette: Pipette pipette: Pipette
rotateWhilePlacing: Rotieren rotateWhilePlacing: Rotieren
@ -847,6 +846,7 @@ keybindings:
Modifikator: stattdessen gegen den UZS rotieren Modifikator: stattdessen gegen den UZS rotieren
cycleBuildingVariants: Variante wählen cycleBuildingVariants: Variante wählen
confirmMassDelete: Massenlöschung bestätigen confirmMassDelete: Massenlöschung bestätigen
pasteLastBlueprint: Letzte Blaupause einfügen
cycleBuildings: Gebäude rotieren cycleBuildings: Gebäude rotieren
lockBeltDirection: Bandplaner aktivieren lockBeltDirection: Bandplaner aktivieren
switchDirectionLockSide: >- switchDirectionLockSide: >-
@ -860,7 +860,6 @@ keybindings:
placementDisableAutoOrientation: Automatische Orientierung deaktivieren placementDisableAutoOrientation: Automatische Orientierung deaktivieren
placeMultiple: Im Platziermodus bleiben placeMultiple: Im Platziermodus bleiben
placeInverse: Automatische Förderbandorientierung invertieren placeInverse: Automatische Förderbandorientierung invertieren
pasteLastBlueprint: Letzte Blaupause einfügen
advanced_processor: Farbinvertierer advanced_processor: Farbinvertierer
energy_generator: Stromgenerator energy_generator: Stromgenerator
wire: Stromkabel wire: Stromkabel
@ -881,9 +880,8 @@ about:
Der Soundtrack wurde von <a href="https://soundcloud.com/pettersumelius" Der Soundtrack wurde von <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> komponiert! Klasse Typ.<br><br> target="_blank">Peppsen</a> komponiert! Klasse Typ.<br><br>
Abschließend möchte ich meinem Kumpel <a Abschließend möchte ich meinem Kumpel <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> danken!
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> danken! Ohne unsere Ohne unsere etlichen gemeinsamen Stunden in Factorio wäre dieses Projekt nie zustande gekommen.
etlichen gemeinsamen Stunden in Factorio wäre dieses Projekt nie zustande gekommen.
changelog: changelog:
title: Änderungen title: Änderungen