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

Merge pull request #1 from jimmykarns/master

update removed enum layer with tests and bridge reserves
This commit is contained in:
Jimmy Karns 2020-08-23 10:10:57 -04:00 committed by GitHub
commit e48f8c0449
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
60 changed files with 7489 additions and 6808 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -10,7 +10,7 @@
}, },
"sprites/belt/built/forward_1.png": "sprites/belt/built/forward_1.png":
{ {
"frame": {"x":1925,"y":1008,"w":116,"h":144}, "frame": {"x":1545,"y":991,"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},
@ -18,7 +18,7 @@
}, },
"sprites/belt/built/forward_2.png": "sprites/belt/built/forward_2.png":
{ {
"frame": {"x":1540,"y":1139,"w":116,"h":144}, "frame": {"x":828,"y":1285,"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":1803,"y":1118,"w":116,"h":144}, "frame": {"x":426,"y":1482,"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":1923,"y":1156,"w":116,"h":144}, "frame": {"x":418,"y":1630,"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":1801,"y":1266,"w":116,"h":144}, "frame": {"x":820,"y":1433,"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":1921,"y":1304,"w":116,"h":144}, "frame": {"x":411,"y":1778,"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":432,"y":1334,"w":116,"h":144}, "frame": {"x":814,"y":1581,"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":430,"y":1482,"w":116,"h":144}, "frame": {"x":806,"y":1729,"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":141,"y":1877,"w":116,"h":144}, "frame": {"x":799,"y":1877,"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":438,"y":890,"w":116,"h":144}, "frame": {"x":1545,"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":438,"y":1038,"w":116,"h":144}, "frame": {"x":433,"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},
@ -98,7 +98,7 @@
}, },
"sprites/belt/built/forward_12.png": "sprites/belt/built/forward_12.png":
{ {
"frame": {"x":1542,"y":991,"w":116,"h":144}, "frame": {"x":427,"y":1186,"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":437,"y":1186,"w":116,"h":144}, "frame": {"x":426,"y":1334,"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":145,"y":1475,"w":130,"h":130}, "frame": {"x":151,"y":1035,"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":3,"y":1575,"w":130,"h":130}, "frame": {"x":151,"y":1169,"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":279,"y":1493,"w":130,"h":130}, "frame": {"x":3,"y":1601,"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":137,"y":1609,"w":130,"h":130}, "frame": {"x":686,"y":1431,"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":3,"y":1709,"w":130,"h":130}, "frame": {"x":546,"y":1542,"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":271,"y":1627,"w":130,"h":130}, "frame": {"x":277,"y":1685,"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":137,"y":1743,"w":130,"h":130}, "frame": {"x":137,"y":1718,"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":3,"y":1843,"w":130,"h":130}, "frame": {"x":3,"y":1735,"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":1379,"y":1274,"w":130,"h":130}, "frame": {"x":948,"y":1317,"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":1513,"y":1287,"w":130,"h":130}, "frame": {"x":680,"y":1565,"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":1076,"y":1288,"w":130,"h":130}, "frame": {"x":1527,"y":1427,"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":927,"y":1295,"w":130,"h":130}, "frame": {"x":151,"y":1303,"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":786,"y":1363,"w":130,"h":130}, "frame": {"x":284,"y":1551,"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":552,"y":1416,"w":130,"h":130}, "frame": {"x":143,"y":1584,"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":1647,"y":1294,"w":130,"h":130}, "frame": {"x":538,"y":1676,"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":1781,"y":1414,"w":130,"h":130}, "frame": {"x":271,"y":1819,"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":1344,"y":1408,"w":130,"h":130}, "frame": {"x":672,"y":1699,"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":1195,"y":1520,"w":130,"h":130}, "frame": {"x":531,"y":1810,"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":1054,"y":1556,"w":130,"h":130}, "frame": {"x":1216,"y":1398,"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":1478,"y":1421,"w":130,"h":130}, "frame": {"x":1074,"y":1493,"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":1329,"y":1542,"w":130,"h":130}, "frame": {"x":934,"y":1585,"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":1188,"y":1654,"w":130,"h":130}, "frame": {"x":1350,"y":1449,"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":1612,"y":1428,"w":130,"h":130}, "frame": {"x":1208,"y":1532,"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":1463,"y":1555,"w":130,"h":130}, "frame": {"x":1068,"y":1627,"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":1915,"y":1452,"w":130,"h":130}, "frame": {"x":137,"y":1852,"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":1210,"y":1386,"w":130,"h":130}, "frame": {"x":3,"y":1869,"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":1061,"y":1422,"w":130,"h":130}, "frame": {"x":1082,"y":1359,"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":920,"y":1429,"w":130,"h":130}, "frame": {"x":940,"y":1451,"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":1322,"y":1676,"w":130,"h":130}, "frame": {"x":934,"y":1719,"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":1746,"y":1548,"w":130,"h":130}, "frame": {"x":665,"y":1833,"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":261,"y":1877,"w":116,"h":144}, "frame": {"x":919,"y":1877,"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":1597,"y":1562,"w":128,"h":136}, "frame": {"x":1533,"y":1287,"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},
@ -418,7 +418,7 @@
}, },
"sprites/blueprints/logic_gate-or.png": "sprites/blueprints/logic_gate-or.png":
{ {
"frame": {"x":560,"y":888,"w":144,"h":123}, "frame": {"x":1249,"y":989,"w":144,"h":123},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":123}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":123},
@ -434,7 +434,7 @@
}, },
"sprites/blueprints/logic_gate-xor.png": "sprites/blueprints/logic_gate-xor.png":
{ {
"frame": {"x":1101,"y":852,"w":144,"h":143}, "frame": {"x":290,"y":890,"w":144,"h":143},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":143}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":143},
@ -442,7 +442,7 @@
}, },
"sprites/blueprints/logic_gate.png": "sprites/blueprints/logic_gate.png":
{ {
"frame": {"x":824,"y":885,"w":144,"h":133}, "frame": {"x":1249,"y":852,"w":144,"h":133},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":133}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
@ -450,7 +450,7 @@
}, },
"sprites/blueprints/miner-chainable.png": "sprites/blueprints/miner-chainable.png":
{ {
"frame": {"x":150,"y":1035,"w":136,"h":143}, "frame": {"x":144,"y":1437,"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},
@ -458,7 +458,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":150,"y":1182,"w":136,"h":143}, "frame": {"x":3,"y":1454,"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/rotater-ccw.png": "sprites/blueprints/rotater-ccw.png":
{ {
"frame": {"x":3,"y":1035,"w":143,"h":144}, "frame": {"x":1665,"y":1198,"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},
@ -514,7 +514,7 @@
}, },
"sprites/blueprints/rotater-fl.png": "sprites/blueprints/rotater-fl.png":
{ {
"frame": {"x":1396,"y":979,"w":142,"h":144}, "frame": {"x":948,"y":1169,"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},
@ -522,7 +522,7 @@
}, },
"sprites/blueprints/rotater.png": "sprites/blueprints/rotater.png":
{ {
"frame": {"x":290,"y":1060,"w":143,"h":144}, "frame": {"x":1899,"y":1156,"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},
@ -530,7 +530,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":1249,"y":988,"w":142,"h":138}, "frame": {"x":1242,"y":1116,"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},
@ -538,7 +538,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":1094,"y":1146,"w":139,"h":138}, "frame": {"x":1384,"y":1307,"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},
@ -578,7 +578,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":3,"y":1330,"w":138,"h":125}, "frame": {"x":559,"y":1036,"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},
@ -586,7 +586,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":3,"y":1459,"w":138,"h":112}, "frame": {"x":285,"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},
@ -594,7 +594,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":558,"y":1185,"w":139,"h":112}, "frame": {"x":1661,"y":1493,"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},
@ -602,13 +602,13 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":1237,"y":1270,"w":138,"h":112}, "frame": {"x":553,"y":1165,"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},
"sourceSize": {"w":144,"h":144} "sourceSize": {"w":144,"h":144}
}, },
"sprites/blueprints/wire-cross.png": "sprites/blueprints/virtual_processor-analyzer.png":
{ {
"frame": {"x":3,"y":887,"w":144,"h":144}, "frame": {"x":3,"y":887,"w":144,"h":144},
"rotated": false, "rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
"sourceSize": {"w":144,"h":144} "sourceSize": {"w":144,"h":144}
}, },
"sprites/blueprints/virtual_processor-rotater.png":
{
"frame": {"x":1925,"y":1008,"w":118,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":118,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/virtual_processor-shapecompare.png":
{
"frame": {"x":1397,"y":852,"w":144,"h":133},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/virtual_processor-unstacker.png":
{
"frame": {"x":1101,"y":704,"w":144,"h":144},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/virtual_processor.png":
{
"frame": {"x":285,"y":1037,"w":144,"h":141},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":144,"h":141},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/wire-cross.png":
{
"frame": {"x":1249,"y":704,"w":144,"h":144},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/wire-split.png": "sprites/blueprints/wire-split.png":
{ {
"frame": {"x":801,"y":1022,"w":144,"h":82}, "frame": {"x":1397,"y":989,"w":144,"h":82},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":62,"w":144,"h":82}, "spriteSourceSize": {"x":0,"y":62,"w":144,"h":82},
@ -626,7 +666,7 @@
}, },
"sprites/blueprints/wire-turn.png": "sprites/blueprints/wire-turn.png":
{ {
"frame": {"x":706,"y":1036,"w":82,"h":82}, "frame": {"x":1813,"y":1118,"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},
@ -650,7 +690,7 @@
}, },
"sprites/blueprints/wire_tunnel.png": "sprites/blueprints/wire_tunnel.png":
{ {
"frame": {"x":290,"y":1208,"w":138,"h":135}, "frame": {"x":1855,"y":1591,"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},
@ -658,7 +698,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":145,"y":1475,"w":130,"h":130}, "frame": {"x":151,"y":1035,"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},
@ -666,7 +706,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":1647,"y":1294,"w":130,"h":130}, "frame": {"x":538,"y":1676,"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},
@ -746,7 +786,7 @@
}, },
"sprites/buildings/logic_gate-or.png": "sprites/buildings/logic_gate-or.png":
{ {
"frame": {"x":1396,"y":852,"w":143,"h":123}, "frame": {"x":1095,"y":1085,"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},
@ -762,7 +802,7 @@
}, },
"sprites/buildings/logic_gate-xor.png": "sprites/buildings/logic_gate-xor.png":
{ {
"frame": {"x":3,"y":1183,"w":143,"h":143}, "frame": {"x":1897,"y":1304,"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},
@ -770,7 +810,7 @@
}, },
"sprites/buildings/logic_gate.png": "sprites/buildings/logic_gate.png":
{ {
"frame": {"x":1249,"y":852,"w":143,"h":132}, "frame": {"x":948,"y":1033,"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},
@ -778,7 +818,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":150,"y":1329,"w":136,"h":142}, "frame": {"x":688,"y":1285,"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},
@ -786,7 +826,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":290,"y":1347,"w":136,"h":142}, "frame": {"x":546,"y":1396,"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},
@ -834,7 +874,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":1098,"y":999,"w":141,"h":143}, "frame": {"x":1094,"y":1212,"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},
@ -842,7 +882,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":949,"y":1033,"w":141,"h":143}, "frame": {"x":1388,"y":1160,"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},
@ -850,7 +890,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":1395,"y":1127,"w":141,"h":143}, "frame": {"x":1665,"y":1346,"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},
@ -858,7 +898,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":1243,"y":1130,"w":141,"h":136}, "frame": {"x":1239,"y":1258,"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},
@ -866,7 +906,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":792,"y":1108,"w":139,"h":136}, "frame": {"x":1895,"y":1451,"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},
@ -898,7 +938,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":1101,"y":704,"w":144,"h":144}, "frame": {"x":1397,"y":704,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -906,7 +946,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":1660,"y":1166,"w":137,"h":124}, "frame": {"x":3,"y":1326,"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},
@ -914,7 +954,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":935,"y":1180,"w":137,"h":111}, "frame": {"x":695,"y":1170,"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},
@ -922,7 +962,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":786,"y":1248,"w":137,"h":111}, "frame": {"x":547,"y":1281,"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},
@ -930,15 +970,55 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":557,"y":1301,"w":137,"h":111}, "frame": {"x":285,"y":1436,"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},
"sourceSize": {"w":144,"h":144} "sourceSize": {"w":144,"h":144}
}, },
"sprites/buildings/virtual_processor-analyzer.png":
{
"frame": {"x":1675,"y":732,"w":144,"h":144},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/virtual_processor-rotater.png":
{
"frame": {"x":438,"y":890,"w":117,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":117,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/virtual_processor-shapecompare.png":
{
"frame": {"x":801,"y":1033,"w":143,"h":133},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":133},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/virtual_processor-unstacker.png":
{
"frame": {"x":3,"y":1035,"w":144,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":144,"h":143},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/virtual_processor.png":
{
"frame": {"x":3,"y":1182,"w":144,"h":140},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":144,"h":140},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/wire-cross.png": "sprites/buildings/wire-cross.png":
{ {
"frame": {"x":1249,"y":704,"w":144,"h":144}, "frame": {"x":1672,"y":880,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -946,7 +1026,7 @@
}, },
"sprites/buildings/wire-split.png": "sprites/buildings/wire-split.png":
{ {
"frame": {"x":290,"y":890,"w":144,"h":81}, "frame": {"x":1098,"y":1000,"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},
@ -954,7 +1034,7 @@
}, },
"sprites/buildings/wire-turn.png": "sprites/buildings/wire-turn.png":
{ {
"frame": {"x":706,"y":1122,"w":81,"h":81}, "frame": {"x":1812,"y":1204,"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},
@ -978,7 +1058,7 @@
}, },
"sprites/buildings/wire_tunnel.png": "sprites/buildings/wire_tunnel.png":
{ {
"frame": {"x":1662,"y":1028,"w":137,"h":134}, "frame": {"x":285,"y":1298,"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},
@ -1034,7 +1114,7 @@
}, },
"sprites/misc/waypoint.png": "sprites/misc/waypoint.png":
{ {
"frame": {"x":48,"y":1977,"w":38,"h":48}, "frame": {"x":1997,"y":1643,"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},
@ -1106,7 +1186,7 @@
}, },
"sprites/wires/display/yellow.png": "sprites/wires/display/yellow.png":
{ {
"frame": {"x":90,"y":1977,"w":47,"h":47}, "frame": {"x":1804,"y":1544,"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},
@ -1138,7 +1218,7 @@
}, },
"sprites/wires/network_conflict.png": "sprites/wires/network_conflict.png":
{ {
"frame": {"x":271,"y":1810,"w":47,"h":44}, "frame": {"x":1804,"y":1595,"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},
@ -1146,7 +1226,7 @@
}, },
"sprites/wires/network_empty.png": "sprites/wires/network_empty.png":
{ {
"frame": {"x":3,"y":1977,"w":41,"h":48}, "frame": {"x":1997,"y":1591,"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},
@ -1162,7 +1242,7 @@
}, },
"sprites/wires/sets/color_cross.png": "sprites/wires/sets/color_cross.png":
{ {
"frame": {"x":1397,"y":704,"w":144,"h":144}, "frame": {"x":1101,"y":852,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1178,7 +1258,7 @@
}, },
"sprites/wires/sets/color_split.png": "sprites/wires/sets/color_split.png":
{ {
"frame": {"x":290,"y":975,"w":144,"h":81}, "frame": {"x":1397,"y":1075,"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},
@ -1186,7 +1266,7 @@
}, },
"sprites/wires/sets/color_turn.png": "sprites/wires/sets/color_turn.png":
{ {
"frame": {"x":701,"y":1207,"w":81,"h":81}, "frame": {"x":1812,"y":1289,"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},
@ -1194,7 +1274,7 @@
}, },
"sprites/wires/sets/conflict_cross.png": "sprites/wires/sets/conflict_cross.png":
{ {
"frame": {"x":1675,"y":732,"w":144,"h":144}, "frame": {"x":824,"y":885,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1210,7 +1290,7 @@
}, },
"sprites/wires/sets/conflict_split.png": "sprites/wires/sets/conflict_split.png":
{ {
"frame": {"x":558,"y":1015,"w":144,"h":81}, "frame": {"x":1665,"y":1028,"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},
@ -1218,7 +1298,7 @@
}, },
"sprites/wires/sets/conflict_turn.png": "sprites/wires/sets/conflict_turn.png":
{ {
"frame": {"x":701,"y":1292,"w":81,"h":81}, "frame": {"x":1810,"y":1374,"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},
@ -1226,7 +1306,7 @@
}, },
"sprites/wires/sets/regular_cross.png": "sprites/wires/sets/regular_cross.png":
{ {
"frame": {"x":1249,"y":704,"w":144,"h":144}, "frame": {"x":1672,"y":880,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1242,7 +1322,7 @@
}, },
"sprites/wires/sets/regular_split.png": "sprites/wires/sets/regular_split.png":
{ {
"frame": {"x":290,"y":890,"w":144,"h":81}, "frame": {"x":1098,"y":1000,"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},
@ -1250,7 +1330,7 @@
}, },
"sprites/wires/sets/regular_turn.png": "sprites/wires/sets/regular_turn.png":
{ {
"frame": {"x":706,"y":1122,"w":81,"h":81}, "frame": {"x":1812,"y":1204,"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},
@ -1258,7 +1338,7 @@
}, },
"sprites/wires/sets/shape_cross.png": "sprites/wires/sets/shape_cross.png":
{ {
"frame": {"x":1672,"y":880,"w":144,"h":144}, "frame": {"x":560,"y":888,"w":144,"h":144},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1274,7 +1354,7 @@
}, },
"sprites/wires/sets/shape_split.png": "sprites/wires/sets/shape_split.png":
{ {
"frame": {"x":558,"y":1100,"w":144,"h":81}, "frame": {"x":1665,"y":1113,"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},
@ -1282,7 +1362,7 @@
}, },
"sprites/wires/sets/shape_turn.png": "sprites/wires/sets/shape_turn.png":
{ {
"frame": {"x":698,"y":1377,"w":81,"h":81}, "frame": {"x":1810,"y":1459,"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},
@ -1303,6 +1383,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":2048,"h":2048}, "size": {"w":2048,"h":2048},
"scale": "0.75", "scale": "0.75",
"smartupdate": "$TexturePacker:SmartUpdate:876f0711b44fa7bbab8d2539e9651766:ff01f850e086ef31c114b036c3a32e6d:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:2b3d82298ef871f8c3ae06176af3dcd1:a4ea5a77f537770c7508bf6fd6c71ae8:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@ -2,7 +2,7 @@
"sprites/belt/built/forward_0.png": "sprites/belt/built/forward_0.png":
{ {
"frame": {"x":415,"y":463,"w":40,"h":48}, "frame": {"x":96,"y":970,"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},
@ -10,7 +10,7 @@
}, },
"sprites/belt/built/forward_1.png": "sprites/belt/built/forward_1.png":
{ {
"frame": {"x":195,"y":828,"w":40,"h":48}, "frame": {"x":140,"y":970,"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":3,"y":959,"w":40,"h":48}, "frame": {"x":229,"y":863,"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":448,"y":705,"w":40,"h":48}, "frame": {"x":272,"y":915,"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":394,"y":752,"w":40,"h":48}, "frame": {"x":272,"y":967,"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":342,"y":762,"w":40,"h":48}, "frame": {"x":273,"y":835,"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":289,"y":795,"w":40,"h":48}, "frame": {"x":405,"y":750,"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":239,"y":836,"w":40,"h":48}, "frame": {"x":353,"y":760,"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":191,"y":880,"w":40,"h":48}, "frame": {"x":449,"y":750,"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":143,"y":883,"w":40,"h":48}, "frame": {"x":397,"y":802,"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":147,"y":831,"w":40,"h":48}, "frame": {"x":141,"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},
@ -90,7 +90,7 @@
}, },
"sprites/belt/built/forward_11.png": "sprites/belt/built/forward_11.png":
{ {
"frame": {"x":99,"y":862,"w":40,"h":48}, "frame": {"x":184,"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},
@ -98,7 +98,7 @@
}, },
"sprites/belt/built/forward_12.png": "sprites/belt/built/forward_12.png":
{ {
"frame": {"x":51,"y":870,"w":40,"h":48}, "frame": {"x":185,"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},
@ -106,7 +106,7 @@
}, },
"sprites/belt/built/forward_13.png": "sprites/belt/built/forward_13.png":
{ {
"frame": {"x":3,"y":907,"w":40,"h":48}, "frame": {"x":228,"y":943,"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},
@ -114,7 +114,7 @@
}, },
"sprites/belt/built/left_0.png": "sprites/belt/built/left_0.png":
{ {
"frame": {"x":3,"y":667,"w":44,"h":44}, "frame": {"x":3,"y":725,"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},
@ -122,7 +122,7 @@
}, },
"sprites/belt/built/left_1.png": "sprites/belt/built/left_1.png":
{ {
"frame": {"x":208,"y":636,"w":44,"h":44}, "frame": {"x":3,"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},
@ -130,7 +130,7 @@
}, },
"sprites/belt/built/left_2.png": "sprites/belt/built/left_2.png":
{ {
"frame": {"x":256,"y":640,"w":44,"h":44}, "frame": {"x":154,"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},
@ -138,7 +138,7 @@
}, },
"sprites/belt/built/left_3.png": "sprites/belt/built/left_3.png":
{ {
"frame": {"x":202,"y":684,"w":44,"h":44}, "frame": {"x":102,"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},
@ -146,7 +146,7 @@
}, },
"sprites/belt/built/left_4.png": "sprites/belt/built/left_4.png":
{ {
"frame": {"x":150,"y":687,"w":44,"h":44}, "frame": {"x":51,"y":774,"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":99,"y":718,"w":44,"h":44}, "frame": {"x":3,"y":821,"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":51,"y":726,"w":44,"h":44}, "frame": {"x":413,"y":654,"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":3,"y":763,"w":44,"h":44}, "frame": {"x":361,"y":664,"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":304,"y":651,"w":44,"h":44}, "frame": {"x":309,"y":710,"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":250,"y":688,"w":44,"h":44}, "frame": {"x":257,"y":739,"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":154,"y":639,"w":44,"h":44}, "frame": {"x":365,"y":616,"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":102,"y":670,"w":44,"h":44}, "frame": {"x":313,"y":662,"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":51,"y":678,"w":44,"h":44}, "frame": {"x":261,"y":691,"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":3,"y":715,"w":44,"h":44}, "frame": {"x":209,"y":719,"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":198,"y":732,"w":44,"h":44}, "frame": {"x":461,"y":654,"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":147,"y":735,"w":44,"h":44}, "frame": {"x":202,"y":767,"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":298,"y":699,"w":44,"h":44}, "frame": {"x":409,"y":702,"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":246,"y":736,"w":44,"h":44}, "frame": {"x":357,"y":712,"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":195,"y":780,"w":44,"h":44}, "frame": {"x":305,"y":758,"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":147,"y":783,"w":44,"h":44}, "frame": {"x":250,"y":787,"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":99,"y":814,"w":44,"h":44}, "frame": {"x":198,"y":815,"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":51,"y":822,"w":44,"h":44}, "frame": {"x":147,"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},
@ -290,7 +290,7 @@
}, },
"sprites/belt/built/right_8.png": "sprites/belt/built/right_8.png":
{ {
"frame": {"x":3,"y":859,"w":44,"h":44}, "frame": {"x":99,"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},
@ -298,7 +298,7 @@
}, },
"sprites/belt/built/right_9.png": "sprites/belt/built/right_9.png":
{ {
"frame": {"x":400,"y":704,"w":44,"h":44}, "frame": {"x":51,"y":870,"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":99,"y":766,"w":44,"h":44}, "frame": {"x":150,"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},
@ -314,7 +314,7 @@
}, },
"sprites/belt/built/right_11.png": "sprites/belt/built/right_11.png":
{ {
"frame": {"x":51,"y":774,"w":44,"h":44}, "frame": {"x":99,"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":3,"y":811,"w":44,"h":44}, "frame": {"x":51,"y":822,"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":352,"y":666,"w":44,"h":44}, "frame": {"x":3,"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},
@ -338,7 +338,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":346,"y":714,"w":44,"h":44}, "frame": {"x":3,"y":917,"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":294,"y":747,"w":44,"h":44}, "frame": {"x":457,"y":702,"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":95,"y":914,"w":40,"h":48}, "frame": {"x":441,"y":802,"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},
@ -386,7 +386,7 @@
}, },
"sprites/blueprints/display.png": "sprites/blueprints/display.png":
{ {
"frame": {"x":106,"y":620,"w":44,"h":46}, "frame": {"x":106,"y":723,"w":44,"h":46},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":44,"h":46}, "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
@ -410,7 +410,7 @@
}, },
"sprites/blueprints/logic_gate-not.png": "sprites/blueprints/logic_gate-not.png":
{ {
"frame": {"x":243,"y":784,"w":42,"h":48}, "frame": {"x":50,"y":965,"w":42,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":42,"h":48}, "spriteSourceSize": {"x":3,"y":0,"w":42,"h":48},
@ -418,7 +418,7 @@
}, },
"sprites/blueprints/logic_gate-or.png": "sprites/blueprints/logic_gate-or.png":
{ {
"frame": {"x":55,"y":500,"w":48,"h":42}, "frame": {"x":107,"y":552,"w":48,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":42}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
@ -442,7 +442,7 @@
}, },
"sprites/blueprints/logic_gate.png": "sprites/blueprints/logic_gate.png":
{ {
"frame": {"x":384,"y":566,"w":48,"h":45}, "frame": {"x":315,"y":567,"w":48,"h":45},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -458,7 +458,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":211,"y":584,"w":47,"h":48}, "frame": {"x":263,"y":597,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -538,7 +538,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":364,"y":615,"w":47,"h":47}, "frame": {"x":107,"y":672,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -578,7 +578,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":3,"y":500,"w":48,"h":43}, "frame": {"x":55,"y":552,"w":48,"h":43},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":48,"h":43}, "spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
@ -586,7 +586,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":159,"y":523,"w":48,"h":38}, "frame": {"x":107,"y":598,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":10,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
@ -594,7 +594,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":211,"y":542,"w":48,"h":38}, "frame": {"x":55,"y":599,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -602,13 +602,13 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":263,"y":546,"w":48,"h":38}, "frame": {"x":3,"y":601,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
"sourceSize": {"w":48,"h":48} "sourceSize": {"w":48,"h":48}
}, },
"sprites/blueprints/wire-cross.png": "sprites/blueprints/virtual_processor-analyzer.png":
{ {
"frame": {"x":183,"y":419,"w":48,"h":48}, "frame": {"x":183,"y":419,"w":48,"h":48},
"rotated": false, "rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48} "sourceSize": {"w":48,"h":48}
}, },
"sprites/blueprints/virtual_processor-rotater.png":
{
"frame": {"x":415,"y":463,"w":41,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":41,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/virtual_processor-shapecompare.png":
{
"frame": {"x":367,"y":567,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/virtual_processor-unstacker.png":
{
"frame": {"x":92,"y":448,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/virtual_processor.png":
{
"frame": {"x":369,"y":411,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/wire-cross.png":
{
"frame": {"x":460,"y":449,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/wire-split.png": "sprites/blueprints/wire-split.png":
{ {
"frame": {"x":315,"y":567,"w":48,"h":28}, "frame": {"x":211,"y":593,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -650,7 +690,7 @@
}, },
"sprites/blueprints/wire_tunnel.png": "sprites/blueprints/wire_tunnel.png":
{ {
"frame": {"x":384,"y":515,"w":48,"h":47}, "frame": {"x":211,"y":542,"w":48,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -658,7 +698,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":3,"y":667,"w":44,"h":44}, "frame": {"x":3,"y":725,"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},
@ -666,7 +706,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":198,"y":732,"w":44,"h":44}, "frame": {"x":461,"y":654,"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},
@ -674,7 +714,7 @@
}, },
"sprites/buildings/belt_top.png": "sprites/buildings/belt_top.png":
{ {
"frame": {"x":415,"y":463,"w":40,"h":48}, "frame": {"x":96,"y":970,"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},
@ -706,7 +746,7 @@
}, },
"sprites/buildings/display.png": "sprites/buildings/display.png":
{ {
"frame": {"x":54,"y":628,"w":44,"h":46}, "frame": {"x":54,"y":724,"w":44,"h":46},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":44,"h":46}, "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
@ -738,7 +778,7 @@
}, },
"sprites/buildings/logic_gate-not.png": "sprites/buildings/logic_gate-not.png":
{ {
"frame": {"x":466,"y":653,"w":43,"h":48}, "frame": {"x":3,"y":965,"w":43,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":43,"h":48}, "spriteSourceSize": {"x":3,"y":0,"w":43,"h":48},
@ -746,7 +786,7 @@
}, },
"sprites/buildings/logic_gate-or.png": "sprites/buildings/logic_gate-or.png":
{ {
"frame": {"x":107,"y":500,"w":48,"h":42}, "frame": {"x":159,"y":575,"w":48,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":42}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
@ -762,7 +802,7 @@
}, },
"sprites/buildings/logic_gate-xor.png": "sprites/buildings/logic_gate-xor.png":
{ {
"frame": {"x":92,"y":448,"w":48,"h":48}, "frame": {"x":275,"y":442,"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},
@ -770,7 +810,7 @@
}, },
"sprites/buildings/logic_gate.png": "sprites/buildings/logic_gate.png":
{ {
"frame": {"x":436,"y":604,"w":48,"h":45}, "frame": {"x":419,"y":605,"w":48,"h":45},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -778,7 +818,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":262,"y":588,"w":47,"h":48}, "frame": {"x":211,"y":625,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -786,7 +826,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":313,"y":599,"w":47,"h":48}, "frame": {"x":159,"y":653,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -834,7 +874,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":369,"y":411,"w":48,"h":48}, "frame": {"x":183,"y":471,"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},
@ -842,7 +882,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":460,"y":449,"w":48,"h":48}, "frame": {"x":268,"y":494,"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},
@ -850,7 +890,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":275,"y":442,"w":48,"h":48}, "frame": {"x":363,"y":463,"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},
@ -858,7 +898,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":436,"y":553,"w":48,"h":47}, "frame": {"x":263,"y":546,"w":48,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -866,7 +906,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":415,"y":653,"w":47,"h":47}, "frame": {"x":55,"y":673,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -898,7 +938,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":183,"y":471,"w":48,"h":48}, "frame": {"x":460,"y":501,"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},
@ -906,7 +946,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":3,"y":579,"w":47,"h":42}, "frame": {"x":314,"y":616,"w":47,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":6,"w":47,"h":42}, "spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
@ -914,7 +954,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":3,"y":625,"w":47,"h":38}, "frame": {"x":262,"y":649,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":10,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
@ -922,7 +962,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":106,"y":578,"w":47,"h":38}, "frame": {"x":210,"y":677,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -930,15 +970,55 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":157,"y":597,"w":47,"h":38}, "frame": {"x":158,"y":705,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
"sourceSize": {"w":48,"h":48} "sourceSize": {"w":48,"h":48}
}, },
"sprites/buildings/virtual_processor-analyzer.png":
{
"frame": {"x":332,"y":515,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/virtual_processor-rotater.png":
{
"frame": {"x":96,"y":918,"w":41,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":41,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/virtual_processor-shapecompare.png":
{
"frame": {"x":3,"y":552,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/virtual_processor-unstacker.png":
{
"frame": {"x":384,"y":515,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/virtual_processor.png":
{
"frame": {"x":436,"y":553,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
"sourceSize": {"w":48,"h":48}
},
"sprites/buildings/wire-cross.png": "sprites/buildings/wire-cross.png":
{ {
"frame": {"x":268,"y":494,"w":48,"h":48}, "frame": {"x":3,"y":500,"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},
@ -946,7 +1026,7 @@
}, },
"sprites/buildings/wire-split.png": "sprites/buildings/wire-split.png":
{ {
"frame": {"x":55,"y":546,"w":48,"h":28}, "frame": {"x":159,"y":621,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -978,7 +1058,7 @@
}, },
"sprites/buildings/wire_tunnel.png": "sprites/buildings/wire_tunnel.png":
{ {
"frame": {"x":55,"y":578,"w":47,"h":46}, "frame": {"x":3,"y":675,"w":47,"h":46},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":46}, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":46},
@ -1162,7 +1242,7 @@
}, },
"sprites/wires/sets/color_cross.png": "sprites/wires/sets/color_cross.png":
{ {
"frame": {"x":363,"y":463,"w":48,"h":48}, "frame": {"x":55,"y":500,"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},
@ -1178,7 +1258,7 @@
}, },
"sprites/wires/sets/color_split.png": "sprites/wires/sets/color_split.png":
{ {
"frame": {"x":3,"y":547,"w":48,"h":28}, "frame": {"x":107,"y":640,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1194,7 +1274,7 @@
}, },
"sprites/wires/sets/conflict_cross.png": "sprites/wires/sets/conflict_cross.png":
{ {
"frame": {"x":459,"y":501,"w":48,"h":48}, "frame": {"x":107,"y":500,"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},
@ -1210,7 +1290,7 @@
}, },
"sprites/wires/sets/conflict_split.png": "sprites/wires/sets/conflict_split.png":
{ {
"frame": {"x":107,"y":546,"w":48,"h":28}, "frame": {"x":55,"y":641,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1226,7 +1306,7 @@
}, },
"sprites/wires/sets/regular_cross.png": "sprites/wires/sets/regular_cross.png":
{ {
"frame": {"x":268,"y":494,"w":48,"h":48}, "frame": {"x":3,"y":500,"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},
@ -1242,7 +1322,7 @@
}, },
"sprites/wires/sets/regular_split.png": "sprites/wires/sets/regular_split.png":
{ {
"frame": {"x":55,"y":546,"w":48,"h":28}, "frame": {"x":159,"y":621,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1258,7 +1338,7 @@
}, },
"sprites/wires/sets/shape_cross.png": "sprites/wires/sets/shape_cross.png":
{ {
"frame": {"x":332,"y":515,"w":48,"h":48}, "frame": {"x":159,"y":523,"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},
@ -1274,7 +1354,7 @@
}, },
"sprites/wires/sets/shape_split.png": "sprites/wires/sets/shape_split.png":
{ {
"frame": {"x":159,"y":565,"w":48,"h":28}, "frame": {"x":3,"y":643,"w":48,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1303,6 +1383,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":512,"h":1024}, "size": {"w":512,"h":1024},
"scale": "0.25", "scale": "0.25",
"smartupdate": "$TexturePacker:SmartUpdate:876f0711b44fa7bbab8d2539e9651766:ff01f850e086ef31c114b036c3a32e6d:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:2b3d82298ef871f8c3ae06176af3dcd1:a4ea5a77f537770c7508bf6fd6c71ae8:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 254 KiB

View File

@ -18,7 +18,7 @@
}, },
"sprites/belt/built/forward_2.png": "sprites/belt/built/forward_2.png":
{ {
"frame": {"x":850,"y":1402,"w":78,"h":96}, "frame": {"x":177,"y":1647,"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":932,"y":1402,"w":78,"h":96}, "frame": {"x":259,"y":1647,"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":751,"y":1431,"w":78,"h":96}, "frame": {"x":341,"y":1654,"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":650,"y":1480,"w":78,"h":96}, "frame": {"x":85,"y":1656,"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":551,"y":1494,"w":78,"h":96}, "frame": {"x":3,"y":1665,"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":454,"y":1522,"w":78,"h":96}, "frame": {"x":167,"y":1747,"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":358,"y":1553,"w":78,"h":96}, "frame": {"x":85,"y":1756,"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":267,"y":1554,"w":78,"h":96}, "frame": {"x":3,"y":1765,"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":276,"y":1454,"w":78,"h":96}, "frame": {"x":3,"y":1565,"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":185,"y":1499,"w":78,"h":96}, "frame": {"x":268,"y":1547,"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":94,"y":1514,"w":78,"h":96}, "frame": {"x":350,"y":1554,"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":3,"y":1585,"w":78,"h":96}, "frame": {"x":432,"y":1633,"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":196,"y":1135,"w":87,"h":87}, "frame": {"x":787,"y":1185,"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":99,"y":1150,"w":87,"h":87}, "frame": {"x":685,"y":1261,"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":287,"y":1181,"w":87,"h":87}, "frame": {"x":867,"y":1292,"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":190,"y":1226,"w":87,"h":87}, "frame": {"x":771,"y":1367,"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":94,"y":1241,"w":87,"h":87}, "frame": {"x":862,"y":1383,"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":3,"y":1312,"w":87,"h":87}, "frame": {"x":198,"y":1274,"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":674,"y":1207,"w":87,"h":87}, "frame": {"x":100,"y":1283,"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":577,"y":1217,"w":87,"h":87}, "frame": {"x":3,"y":1292,"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":478,"y":1246,"w":87,"h":87}, "frame": {"x":289,"y":1274,"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":378,"y":1271,"w":87,"h":87}, "frame": {"x":380,"y":1277,"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":3,"y":1221,"w":87,"h":87}, "frame": {"x":589,"y":1293,"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":583,"y":1126,"w":87,"h":87}, "frame": {"x":878,"y":1201,"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":486,"y":1155,"w":87,"h":87}, "frame": {"x":776,"y":1276,"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":387,"y":1180,"w":87,"h":87}, "frame": {"x":680,"y":1352,"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":281,"y":1272,"w":87,"h":87}, "frame": {"x":471,"y":1357,"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":1317,"w":87,"h":87}, "frame": {"x":562,"y":1384,"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":569,"y":1308,"w":87,"h":87}, "frame": {"x":3,"y":1383,"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":469,"y":1337,"w":87,"h":87}, "frame": {"x":282,"y":1365,"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":372,"y":1362,"w":87,"h":87}, "frame": {"x":373,"y":1368,"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":276,"y":1363,"w":87,"h":87}, "frame": {"x":464,"y":1448,"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":185,"y":1408,"w":87,"h":87}, "frame": {"x":555,"y":1475,"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":1423,"w":87,"h":87}, "frame": {"x":646,"y":1534,"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":3,"y":1494,"w":87,"h":87}, "frame": {"x":185,"y":1456,"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":856,"y":1311,"w":87,"h":87}, "frame": {"x":94,"y":1465,"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":94,"y":1332,"w":87,"h":87}, "frame": {"x":653,"y":1443,"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":3,"y":1403,"w":87,"h":87}, "frame": {"x":744,"y":1458,"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":765,"y":1249,"w":87,"h":87}, "frame": {"x":191,"y":1365,"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":668,"y":1298,"w":87,"h":87}, "frame": {"x":94,"y":1374,"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":759,"y":1340,"w":87,"h":87}, "frame": {"x":3,"y":1474,"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":660,"y":1389,"w":87,"h":87}, "frame": {"x":276,"y":1456,"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":176,"y":1599,"w":78,"h":96}, "frame": {"x":249,"y":1747,"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":560,"y":1399,"w":86,"h":91}, "frame": {"x":367,"y":1459,"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},
@ -410,7 +410,7 @@
}, },
"sprites/blueprints/logic_gate-not.png": "sprites/blueprints/logic_gate-not.png":
{ {
"frame": {"x":367,"y":1453,"w":83,"h":96}, "frame": {"x":545,"y":1566,"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":521,"y":991,"w":96,"h":82}, "frame": {"x":3,"y":874,"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":335,"y":902,"w":96,"h":89}, "frame": {"x":521,"y":999,"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},
@ -458,7 +458,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":100,"y":1050,"w":92,"h":96}, "frame": {"x":398,"y":1177,"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},
@ -514,7 +514,7 @@
}, },
"sprites/blueprints/rotater-fl.png": "sprites/blueprints/rotater-fl.png":
{ {
"frame": {"x":921,"y":1016,"w":95,"h":96}, "frame": {"x":203,"y":990,"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},
@ -530,7 +530,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":820,"y":1152,"w":95,"h":93}, "frame": {"x":202,"y":1090,"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},
@ -538,7 +538,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":101,"y":874,"w":93,"h":93}, "frame": {"x":101,"y":1186,"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},
@ -578,7 +578,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":198,"y":969,"w":93,"h":84}, "frame": {"x":498,"y":1092,"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},
@ -586,7 +586,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":100,"y":971,"w":93,"h":75}, "frame": {"x":401,"y":1098,"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},
@ -594,7 +594,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":3,"y":874,"w":94,"h":75}, "frame": {"x":3,"y":1118,"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},
@ -602,13 +602,13 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":3,"y":1048,"w":93,"h":75}, "frame": {"x":301,"y":1101,"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},
"sourceSize": {"w":96,"h":96} "sourceSize": {"w":96,"h":96}
}, },
"sprites/blueprints/wire-cross.png": "sprites/blueprints/virtual_processor-analyzer.png":
{ {
"frame": {"x":521,"y":799,"w":96,"h":96}, "frame": {"x":521,"y":799,"w":96,"h":96},
"rotated": false, "rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
"sourceSize": {"w":96,"h":96} "sourceSize": {"w":96,"h":96}
}, },
"sprites/blueprints/virtual_processor-rotater.png":
{
"frame": {"x":185,"y":1547,"w":79,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/virtual_processor-shapecompare.png":
{
"frame": {"x":621,"y":1023,"w":96,"h":89},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/virtual_processor-unstacker.png":
{
"frame": {"x":729,"y":890,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/virtual_processor.png":
{
"frame": {"x":921,"y":1016,"w":96,"h":94},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":96,"h":94},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/wire-cross.png":
{
"frame": {"x":829,"y":894,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/blueprints/wire-split.png": "sprites/blueprints/wire-split.png":
{ {
"frame": {"x":721,"y":990,"w":96,"h":55}, "frame": {"x":103,"y":874,"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},
@ -650,7 +690,7 @@
}, },
"sprites/blueprints/wire_tunnel.png": "sprites/blueprints/wire_tunnel.png":
{ {
"frame": {"x":3,"y":953,"w":93,"h":91}, "frame": {"x":3,"y":1197,"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},
@ -658,7 +698,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":196,"y":1135,"w":87,"h":87}, "frame": {"x":787,"y":1185,"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},
@ -666,7 +706,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":281,"y":1272,"w":87,"h":87}, "frame": {"x":471,"y":1357,"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},
@ -706,7 +746,7 @@
}, },
"sprites/buildings/display.png": "sprites/buildings/display.png":
{ {
"frame": {"x":463,"y":1428,"w":84,"h":90}, "frame": {"x":457,"y":1539,"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},
@ -746,7 +786,7 @@
}, },
"sprites/buildings/logic_gate-or.png": "sprites/buildings/logic_gate-or.png":
{ {
"frame": {"x":621,"y":923,"w":96,"h":83}, "frame": {"x":921,"y":1114,"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},
@ -762,7 +802,7 @@
}, },
"sprites/buildings/logic_gate-xor.png": "sprites/buildings/logic_gate-xor.png":
{ {
"frame": {"x":339,"y":803,"w":96,"h":95}, "frame": {"x":821,"y":994,"w":96,"h":95},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":95}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":95},
@ -770,7 +810,7 @@
}, },
"sprites/buildings/logic_gate.png": "sprites/buildings/logic_gate.png":
{ {
"frame": {"x":521,"y":899,"w":96,"h":88}, "frame": {"x":821,"y":1093,"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},
@ -778,7 +818,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":391,"y":1081,"w":91,"h":95}, "frame": {"x":590,"y":1194,"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},
@ -786,7 +826,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":292,"y":1082,"w":91,"h":95}, "frame": {"x":494,"y":1258,"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},
@ -834,7 +874,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":821,"y":1052,"w":95,"h":96}, "frame": {"x":103,"y":991,"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},
@ -842,7 +882,7 @@
}, },
"sprites/buildings/rotater-fl.png": "sprites/buildings/rotater-fl.png":
{ {
"frame": {"x":721,"y":1107,"w":95,"h":96}, "frame": {"x":3,"y":1018,"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},
@ -850,7 +890,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":920,"y":1116,"w":95,"h":96}, "frame": {"x":302,"y":1001,"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},
@ -858,7 +898,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":919,"y":1216,"w":94,"h":91}, "frame": {"x":102,"y":1091,"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},
@ -866,7 +906,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":198,"y":874,"w":93,"h":91}, "frame": {"x":401,"y":1003,"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},
@ -898,7 +938,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":729,"y":890,"w":96,"h":96}, "frame": {"x":3,"y":774,"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},
@ -906,7 +946,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":295,"y":995,"w":92,"h":83}, "frame": {"x":198,"y":1187,"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},
@ -914,7 +954,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":196,"y":1057,"w":92,"h":74}, "frame": {"x":595,"y":1116,"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},
@ -922,7 +962,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":391,"y":1003,"w":92,"h":74}, "frame": {"x":494,"y":1180,"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},
@ -930,15 +970,55 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":487,"y":1077,"w":92,"h":74}, "frame": {"x":691,"y":1183,"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},
"sourceSize": {"w":96,"h":96} "sourceSize": {"w":96,"h":96}
}, },
"sprites/buildings/virtual_processor-analyzer.png":
{
"frame": {"x":103,"y":774,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/virtual_processor-rotater.png":
{
"frame": {"x":94,"y":1556,"w":79,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/virtual_processor-shapecompare.png":
{
"frame": {"x":721,"y":1090,"w":96,"h":89},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/virtual_processor-unstacker.png":
{
"frame": {"x":203,"y":774,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/virtual_processor.png":
{
"frame": {"x":335,"y":903,"w":96,"h":94},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":96,"h":94},
"sourceSize": {"w":96,"h":96}
},
"sprites/buildings/wire-cross.png": "sprites/buildings/wire-cross.png":
{ {
"frame": {"x":829,"y":894,"w":96,"h":96}, "frame": {"x":339,"y":803,"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},
@ -946,7 +1026,7 @@
}, },
"sprites/buildings/wire-split.png": "sprites/buildings/wire-split.png":
{ {
"frame": {"x":621,"y":1010,"w":96,"h":54}, "frame": {"x":203,"y":874,"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},
@ -978,7 +1058,7 @@
}, },
"sprites/buildings/wire_tunnel.png": "sprites/buildings/wire_tunnel.png":
{ {
"frame": {"x":3,"y":1127,"w":92,"h":90}, "frame": {"x":301,"y":1180,"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},
@ -1162,7 +1242,7 @@
}, },
"sprites/wires/sets/color_cross.png": "sprites/wires/sets/color_cross.png":
{ {
"frame": {"x":3,"y":774,"w":96,"h":96}, "frame": {"x":521,"y":899,"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},
@ -1178,7 +1258,7 @@
}, },
"sprites/wires/sets/color_split.png": "sprites/wires/sets/color_split.png":
{ {
"frame": {"x":821,"y":994,"w":96,"h":54}, "frame": {"x":203,"y":932,"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},
@ -1194,7 +1274,7 @@
}, },
"sprites/wires/sets/conflict_cross.png": "sprites/wires/sets/conflict_cross.png":
{ {
"frame": {"x":103,"y":774,"w":96,"h":96}, "frame": {"x":621,"y":923,"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},
@ -1210,7 +1290,7 @@
}, },
"sprites/wires/sets/conflict_split.png": "sprites/wires/sets/conflict_split.png":
{ {
"frame": {"x":721,"y":1049,"w":96,"h":54}, "frame": {"x":103,"y":933,"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},
@ -1226,7 +1306,7 @@
}, },
"sprites/wires/sets/regular_cross.png": "sprites/wires/sets/regular_cross.png":
{ {
"frame": {"x":829,"y":894,"w":96,"h":96}, "frame": {"x":339,"y":803,"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},
@ -1242,7 +1322,7 @@
}, },
"sprites/wires/sets/regular_split.png": "sprites/wires/sets/regular_split.png":
{ {
"frame": {"x":621,"y":1010,"w":96,"h":54}, "frame": {"x":203,"y":874,"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},
@ -1258,7 +1338,7 @@
}, },
"sprites/wires/sets/shape_cross.png": "sprites/wires/sets/shape_cross.png":
{ {
"frame": {"x":203,"y":774,"w":96,"h":96}, "frame": {"x":721,"y":990,"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},
@ -1274,7 +1354,7 @@
}, },
"sprites/wires/sets/shape_split.png": "sprites/wires/sets/shape_split.png":
{ {
"frame": {"x":621,"y":1068,"w":96,"h":54}, "frame": {"x":3,"y":960,"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},
@ -1303,6 +1383,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1024,"h":2048}, "size": {"w":1024,"h":2048},
"scale": "0.5", "scale": "0.5",
"smartupdate": "$TexturePacker:SmartUpdate:876f0711b44fa7bbab8d2539e9651766:ff01f850e086ef31c114b036c3a32e6d:908b89f5ca8ff73e331a35a3b14d0604$" "smartupdate": "$TexturePacker:SmartUpdate:2b3d82298ef871f8c3ae06176af3dcd1:a4ea5a77f537770c7508bf6fd6c71ae8:908b89f5ca8ff73e331a35a3b14d0604$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 KiB

After

Width:  |  Height:  |  Size: 601 KiB

View File

@ -277,6 +277,7 @@
<key type="filename">sprites/blueprints/underground_belt_entry.png</key> <key type="filename">sprites/blueprints/underground_belt_entry.png</key>
<key type="filename">sprites/blueprints/underground_belt_exit-tier2.png</key> <key type="filename">sprites/blueprints/underground_belt_exit-tier2.png</key>
<key type="filename">sprites/blueprints/underground_belt_exit.png</key> <key type="filename">sprites/blueprints/underground_belt_exit.png</key>
<key type="filename">sprites/blueprints/wire_tunnel-coating.png</key>
<key type="filename">sprites/blueprints/wire_tunnel.png</key> <key type="filename">sprites/blueprints/wire_tunnel.png</key>
<key type="filename">sprites/buildings/constant_signal.png</key> <key type="filename">sprites/buildings/constant_signal.png</key>
<key type="filename">sprites/buildings/display.png</key> <key type="filename">sprites/buildings/display.png</key>
@ -295,6 +296,7 @@
<key type="filename">sprites/buildings/underground_belt_entry.png</key> <key type="filename">sprites/buildings/underground_belt_entry.png</key>
<key type="filename">sprites/buildings/underground_belt_exit-tier2.png</key> <key type="filename">sprites/buildings/underground_belt_exit-tier2.png</key>
<key type="filename">sprites/buildings/underground_belt_exit.png</key> <key type="filename">sprites/buildings/underground_belt_exit.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/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>
@ -533,6 +535,8 @@
</struct> </struct>
<key type="filename">sprites/wires/boolean_false.png</key> <key type="filename">sprites/wires/boolean_false.png</key>
<key type="filename">sprites/wires/boolean_true.png</key> <key type="filename">sprites/wires/boolean_true.png</key>
<key type="filename">sprites/wires/network_conflict.png</key>
<key type="filename">sprites/wires/network_empty.png</key>
<key type="filename">sprites/wires/wires_preview.png</key> <key type="filename">sprites/wires/wires_preview.png</key>
<struct type="IndividualSpriteSettings"> <struct type="IndividualSpriteSettings">
<key>pivotPoint</key> <key>pivotPoint</key>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,5 +1,5 @@
$buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, trash, underground_belt, wire, $buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, trash, underground_belt, wire,
constant_signal, logic_gate, lever, filter, wire_tunnel, display; constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor;
@each $building in $buildings { @each $building in $buildings {
[data-icon="building_icons/#{$building}.png"] { [data-icon="building_icons/#{$building}.png"] {

View File

@ -13,7 +13,7 @@ import { round1Digit } from "./utils";
const logger = createLogger("buffers"); const logger = createLogger("buffers");
const bufferGcDurationSeconds = 10; const bufferGcDurationSeconds = 5;
export class BufferMaintainer { export class BufferMaintainer {
/** /**
@ -27,6 +27,31 @@ export class BufferMaintainer {
this.iterationIndex = 1; this.iterationIndex = 1;
this.lastIteration = 0; this.lastIteration = 0;
this.root.signals.gameFrameStarted.add(this.update, this);
}
/**
* Returns the buffer stats
*/
getStats() {
let stats = {
rootKeys: 0,
subKeys: 0,
vramBytes: 0,
};
this.cache.forEach((subCache, key) => {
++stats.rootKeys;
subCache.forEach((cacheEntry, subKey) => {
++stats.subKeys;
const canvas = cacheEntry.canvas;
stats.vramBytes += canvas.width * canvas.height * 4;
});
});
return stats;
} }
/** /**

View File

@ -53,6 +53,8 @@ export const globalConfig = {
beltSpeedItemsPerSecond: 2, beltSpeedItemsPerSecond: 2,
minerSpeedItemsPerSecond: 0, // COMPUTED minerSpeedItemsPerSecond: 0, // COMPUTED
defaultItemDiameter: 20,
itemSpacingOnBelts: 0.63, itemSpacingOnBelts: 0.63,
wiresSpeedItemsPerSecond: 6, wiresSpeedItemsPerSecond: 6,

View File

@ -95,5 +95,14 @@ export default {
// 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
// showAtlasInfo: true,
// -----------------------------------------------------------------------------------
// Renders the rotation of all wires
// renderWireRotations: true,
// -----------------------------------------------------------------------------------
// Renders information about wire networks
// renderWireNetworkInfos: true,
// -----------------------------------------------------------------------------------
/* dev:end */ /* dev:end */
}; };

View File

@ -53,27 +53,6 @@ export class Rectangle {
return a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom; return a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom;
} }
/**
* Returns a rectangle arround a rotated point
* @param {Array<Vector>} points
* @param {number} angle
* @returns {Rectangle}
*/
static getAroundPointsRotated(points, angle) {
let minX = 1e10;
let minY = 1e10;
let maxX = -1e10;
let maxY = -1e10;
for (let i = 0; i < points.length; ++i) {
const rotated = points[i].rotated(angle);
minX = Math.min(minX, rotated.x);
minY = Math.min(minY, rotated.y);
maxX = Math.max(maxX, rotated.x);
maxY = Math.max(maxY, rotated.y);
}
return new Rectangle(minX, minY, maxX - minX, maxY - minY);
}
/** /**
* Copies this instance * Copies this instance
* @returns {Rectangle} * @returns {Rectangle}
@ -82,28 +61,6 @@ export class Rectangle {
return new Rectangle(this.x, this.y, this.w, this.h); return new Rectangle(this.x, this.y, this.w, this.h);
} }
/**
* Ensures the rectangle contains the given square
* @param {number} centerX
* @param {number} centerY
* @param {number} halfWidth
* @param {number} halfHeight
*/
extendBySquare(centerX, centerY, halfWidth, halfHeight) {
if (this.isEmpty()) {
// Just assign values since this rectangle is empty
this.x = centerX - halfWidth;
this.y = centerY - halfHeight;
this.w = halfWidth * 2;
this.h = halfHeight * 2;
} else {
this.setLeft(Math.min(this.x, centerX - halfWidth));
this.setRight(Math.max(this.right(), centerX + halfWidth));
this.setTop(Math.min(this.y, centerY - halfHeight));
this.setBottom(Math.max(this.bottom(), centerY + halfHeight));
}
}
/** /**
* Returns if this rectangle is empty * Returns if this rectangle is empty
* @returns {boolean} * @returns {boolean}
@ -259,14 +216,6 @@ export class Rectangle {
return new Rectangle(this.x - amount, this.y - amount, this.w + 2 * amount, this.h + 2 * amount); return new Rectangle(this.x - amount, this.y - amount, this.w + 2 * amount, this.h + 2 * amount);
} }
/**
* Helper for computing a culling area. Returns the top left tile
* @returns {Vector}
*/
getMinStartTile() {
return new Vector(this.x, this.y).snapWorldToTile();
}
/** /**
* Returns if the given rectangle is contained * Returns if the given rectangle is contained
* @param {Rectangle} rect * @param {Rectangle} rect
@ -394,7 +343,7 @@ export class Rectangle {
} }
/** /**
* Returns a new recangle in tile space which includes all tiles which are visible in this rect * Returns a new rectangle in tile space which includes all tiles which are visible in this rect
* @returns {Rectangle} * @returns {Rectangle}
*/ */
toTileCullRectangle() { toTileCullRectangle() {

View File

@ -1,3 +1,4 @@
import { globalConfig } from "../core/config";
import { DrawParameters } from "../core/draw_parameters"; import { DrawParameters } from "../core/draw_parameters";
import { BasicSerializableObject } from "../savegame/serialization"; import { BasicSerializableObject } from "../savegame/serialization";
@ -57,7 +58,22 @@ export class BaseItem extends BasicSerializableObject {
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {number=} diameter * @param {number=} diameter
*/ */
drawCentered(x, y, parameters, diameter) {} drawItemCenteredClipped(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
if (parameters.visibleRect.containsCircle(x, y, diameter / 2)) {
this.drawItemCenteredImpl(x, y, parameters, diameter);
}
}
/**
* INTERNAL
* @param {number} x
* @param {number} y
* @param {DrawParameters} parameters
* @param {number=} diameter
*/
drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
abstract;
}
getBackgroundColorAsResource() { getBackgroundColorAsResource() {
abstract; abstract;

View File

@ -1194,9 +1194,13 @@ export class BeltPath extends BasicSerializableObject {
const worldPos = staticComp.localTileToWorld(localPos).toWorldSpaceCenterOfTile(); const worldPos = staticComp.localTileToWorld(localPos).toWorldSpaceCenterOfTile();
const distanceAndItem = this.items[currentItemIndex]; const distanceAndItem = this.items[currentItemIndex];
if (parameters.visibleRect.containsCircle(worldPos.x, worldPos.y, 10)) {
distanceAndItem[_item].drawCentered(worldPos.x, worldPos.y, parameters); distanceAndItem[_item].drawItemCenteredClipped(
} worldPos.x,
worldPos.y,
parameters,
globalConfig.defaultItemDiameter
);
// Check for the next item // Check for the next item
currentItemPos += distanceAndItem[_nextDistance]; currentItemPos += distanceAndItem[_nextDistance];

View File

@ -92,7 +92,7 @@ export class Blueprint {
parameters.context.globalAlpha = 1; parameters.context.globalAlpha = 1;
} }
staticComp.drawSpriteOnFullEntityBounds(parameters, staticComp.getBlueprintSprite(), 0, newPos); staticComp.drawSpriteOnBoundsClipped(parameters, staticComp.getBlueprintSprite(), 0, newPos);
} }
parameters.context.globalAlpha = 1; parameters.context.globalAlpha = 1;
} }

View File

@ -0,0 +1,151 @@
import { Vector, enumDirection } from "../../core/vector";
import { LogicGateComponent, enumLogicGateType } from "../components/logic_gate";
import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins";
import { Entity } from "../entity";
import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
/** @enum {string} */
export const enumVirtualProcessorVariants = {
analyzer: "analyzer",
rotater: "rotater",
unstacker: "unstacker",
shapecompare: "shapecompare",
};
/** @enum {string} */
export const enumVariantToGate = {
[defaultBuildingVariant]: enumLogicGateType.cutter,
[enumVirtualProcessorVariants.analyzer]: enumLogicGateType.analyzer,
[enumVirtualProcessorVariants.rotater]: enumLogicGateType.rotater,
[enumVirtualProcessorVariants.unstacker]: enumLogicGateType.unstacker,
[enumVirtualProcessorVariants.shapecompare]: enumLogicGateType.shapecompare,
};
export class MetaVirtualProcessorBuilding extends MetaBuilding {
constructor() {
super("virtual_processor");
}
getSilhouetteColor() {
return "#823cab";
}
/**
* @param {GameRoot} root
*/
getIsUnlocked(root) {
// @todo
return true;
}
/** @returns {"wires"} **/
getLayer() {
return "wires";
}
getDimensions() {
return new Vector(1, 1);
}
getAvailableVariants() {
return [
defaultBuildingVariant,
enumVirtualProcessorVariants.rotater,
enumVirtualProcessorVariants.unstacker,
enumVirtualProcessorVariants.analyzer,
enumVirtualProcessorVariants.shapecompare,
];
}
getRenderPins() {
// We already have it included
return false;
}
/**
*
* @param {Entity} entity
* @param {number} rotationVariant
*/
updateVariants(entity, rotationVariant, variant) {
const gateType = enumVariantToGate[variant];
entity.components.LogicGate.type = gateType;
const pinComp = entity.components.WiredPins;
switch (gateType) {
case enumLogicGateType.cutter:
case enumLogicGateType.analyzer:
case enumLogicGateType.unstacker: {
pinComp.setSlots([
{
pos: new Vector(0, 0),
direction: enumDirection.left,
type: enumPinSlotType.logicalEjector,
},
{
pos: new Vector(0, 0),
direction: enumDirection.right,
type: enumPinSlotType.logicalEjector,
},
{
pos: new Vector(0, 0),
direction: enumDirection.bottom,
type: enumPinSlotType.logicalAcceptor,
},
]);
break;
}
case enumLogicGateType.rotater: {
pinComp.setSlots([
{
pos: new Vector(0, 0),
direction: enumDirection.top,
type: enumPinSlotType.logicalEjector,
},
{
pos: new Vector(0, 0),
direction: enumDirection.bottom,
type: enumPinSlotType.logicalAcceptor,
},
]);
break;
}
case enumLogicGateType.shapecompare: {
pinComp.setSlots([
{
pos: new Vector(0, 0),
direction: enumDirection.top,
type: enumPinSlotType.logicalEjector,
},
{
pos: new Vector(0, 0),
direction: enumDirection.left,
type: enumPinSlotType.logicalAcceptor,
},
{
pos: new Vector(0, 0),
direction: enumDirection.right,
type: enumPinSlotType.logicalAcceptor,
},
]);
break;
}
default:
assertAlways("unknown logic gate type: " + gateType);
}
}
/**
* Creates the entity at the given location
* @param {Entity} entity
*/
setupEntityComponents(entity) {
entity.addComponent(
new WiredPinsComponent({
slots: [],
})
);
entity.addComponent(new LogicGateComponent({}));
}
}

View File

@ -7,6 +7,12 @@ export const enumLogicGateType = {
xor: "xor", xor: "xor",
or: "or", or: "or",
transistor: "transistor", transistor: "transistor",
analyzer: "analyzer",
rotater: "rotater",
unstacker: "unstacker",
cutter: "cutter",
shapecompare: "shapecompare",
}; };
export class LogicGateComponent extends Component { export class LogicGateComponent extends Component {

View File

@ -162,8 +162,9 @@ export class StaticMapEntityComponent extends Component {
* @returns {Vector} * @returns {Vector}
*/ */
localTileToWorld(localTile) { localTileToWorld(localTile) {
const result = this.applyRotationToVector(localTile); const result = localTile.rotateFastMultipleOf90(this.rotation);
result.addInplace(this.origin); result.x += this.origin.x;
result.y += this.origin.y;
return result; return result;
} }
@ -235,7 +236,7 @@ export class StaticMapEntityComponent extends Component {
* @param {number=} extrudePixels How many pixels to extrude the sprite * @param {number=} extrudePixels How many pixels to extrude the sprite
* @param {Vector=} overridePosition Whether to drwa the entity at a different location * @param {Vector=} overridePosition Whether to drwa the entity at a different location
*/ */
drawSpriteOnFullEntityBounds(parameters, sprite, extrudePixels = 0, overridePosition = null) { drawSpriteOnBoundsClipped(parameters, sprite, extrudePixels = 0, overridePosition = null) {
if (!this.shouldBeDrawn(parameters) && !overridePosition) { if (!this.shouldBeDrawn(parameters) && !overridePosition) {
return; return;
} }

View File

@ -1,6 +1,8 @@
import { enumDirection, Vector } from "../../core/vector"; import { enumDirection, Vector } from "../../core/vector";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { Component } from "../component"; import { Component } from "../component";
import { types } from "../../savegame/serialization";
import { typeItemSingleton } from "../item_resolver";
/** @enum {string} */ /** @enum {string} */
export const enumPinSlotType = { export const enumPinSlotType = {
@ -27,6 +29,16 @@ export class WiredPinsComponent extends Component {
return "WiredPins"; return "WiredPins";
} }
static getSchema() {
return {
slots: types.array(
types.structured({
value: types.nullable(typeItemSingleton),
})
),
};
}
/** /**
* *
* @param {object} param0 * @param {object} param0

View File

@ -9,7 +9,7 @@ import { DrawParameters } from "../core/draw_parameters";
import { gMetaBuildingRegistry } from "../core/global_registries"; import { gMetaBuildingRegistry } from "../core/global_registries";
import { createLogger } from "../core/logging"; import { createLogger } from "../core/logging";
import { Rectangle } from "../core/rectangle"; import { Rectangle } from "../core/rectangle";
import { randomInt, round2Digits } from "../core/utils"; import { randomInt, round2Digits, round3Digits } from "../core/utils";
import { Vector } from "../core/vector"; import { Vector } from "../core/vector";
import { Savegame } from "../savegame/savegame"; import { Savegame } from "../savegame/savegame";
import { SavegameSerializer } from "../savegame/savegame_serializer"; import { SavegameSerializer } from "../savegame/savegame_serializer";
@ -329,8 +329,7 @@ export class GameCore {
return; return;
} }
// Update buffers as the very first this.root.signals.gameFrameStarted.dispatch();
root.buffers.update();
root.queue.requireRedraw = false; root.queue.requireRedraw = false;
@ -390,33 +389,24 @@ export class GameCore {
// Map overview // Map overview
root.map.drawOverlay(params); root.map.drawOverlay(params);
} else { } else {
// Background (grid, resources, etc)
root.map.drawBackground(params); root.map.drawBackground(params);
// Belt items // Belt items
systems.belt.drawBeltItems(params); systems.belt.drawBeltItems(params);
// Items being ejected / accepted currently (animations) // Miner & Static map entities etc.
systems.itemEjector.draw(params);
systems.itemAcceptor.draw(params);
// Miner & Static map entities
root.map.drawForeground(params); root.map.drawForeground(params);
// HUB Overlay // HUB Overlay
systems.hub.draw(params); systems.hub.draw(params);
// Storage items
systems.storage.draw(params);
// Green wires overlay // Green wires overlay
root.hud.parts.wiresOverlay.draw(params); root.hud.parts.wiresOverlay.draw(params);
if (this.root.currentLayer === "wires") { if (this.root.currentLayer === "wires") {
// Static map entities // Static map entities
root.map.drawWiresForegroundLayer(params); root.map.drawWiresForegroundLayer(params);
// pins
systems.wiredPins.draw(params);
} }
} }
@ -464,7 +454,7 @@ export class GameCore {
if (G_IS_DEV && globalConfig.debug.showAtlasInfo) { if (G_IS_DEV && globalConfig.debug.showAtlasInfo) {
context.font = "13px GameFont"; context.font = "13px GameFont";
context.fillStyle = "yellow"; context.fillStyle = "blue";
context.fillText( context.fillText(
"Atlas: " + "Atlas: " +
desiredAtlasScale + desiredAtlasScale +
@ -472,8 +462,22 @@ export class GameCore {
round2Digits(zoomLevel) + round2Digits(zoomLevel) +
" / Effective Zoom: " + " / Effective Zoom: " +
round2Digits(effectiveZoomLevel), round2Digits(effectiveZoomLevel),
200, 20,
20 600
);
const stats = this.root.buffers.getStats();
context.fillText(
"Buffers: " +
stats.rootKeys +
" root keys, " +
stats.subKeys +
" sub keys / buffers / VRAM: " +
round2Digits(stats.vramBytes / (1024 * 1024)) +
" MB",
20,
620
); );
} }

View File

@ -6,8 +6,7 @@ import { Entity } from "./entity";
import { GameRoot } from "./root"; import { GameRoot } from "./root";
import { GameSystem } from "./game_system"; import { GameSystem } from "./game_system";
import { arrayDelete, arrayDeleteValue } from "../core/utils"; import { arrayDelete, arrayDeleteValue } from "../core/utils";
import { DrawParameters } from "../core/draw_parameters";
import { globalConfig } from "../core/config";
export class GameSystemWithFilter extends GameSystem { export class GameSystemWithFilter extends GameSystem {
/** /**
* Constructs a new game system with the given component filter. It will process * Constructs a new game system with the given component filter. It will process
@ -35,80 +34,6 @@ export class GameSystemWithFilter extends GameSystem {
this.root.signals.bulkOperationFinished.add(this.refreshCaches, this); this.root.signals.bulkOperationFinished.add(this.refreshCaches, this);
} }
/**
* Calls a function for each matching entity on the screen, useful for drawing them
* @param {DrawParameters} parameters
* @param {function} callback
*/
forEachMatchingEntityOnScreen(parameters, callback) {
const cullRange = parameters.visibleRect.toTileCullRectangle();
if (this.allEntities.length < 100) {
// So, its much quicker to simply perform per-entity checking
for (let i = 0; i < this.allEntities.length; ++i) {
const entity = this.allEntities[i];
if (cullRange.containsRect(entity.components.StaticMapEntity.getTileSpaceBounds())) {
callback(parameters, entity);
}
}
return;
}
const top = cullRange.top();
const right = cullRange.right();
const bottom = cullRange.bottom();
const left = cullRange.left();
const border = 1;
const minY = top - border;
const maxY = bottom + border;
const minX = left - border;
const maxX = right + border - 1;
const map = this.root.map;
let seenUids = new Set();
const chunkStartX = Math.floor(minX / globalConfig.mapChunkSize);
const chunkStartY = Math.floor(minY / globalConfig.mapChunkSize);
const chunkEndX = Math.ceil(maxX / globalConfig.mapChunkSize);
const chunkEndY = Math.ceil(maxY / globalConfig.mapChunkSize);
const requiredComponents = this.requiredComponentIds;
// Render y from top down for proper blending
for (let chunkX = chunkStartX; chunkX <= chunkEndX; ++chunkX) {
for (let chunkY = chunkStartY; chunkY <= chunkEndY; ++chunkY) {
const chunk = map.getChunk(chunkX, chunkY, false);
if (!chunk) {
continue;
}
// BIG TODO: CULLING ON AN ENTITY BASIS
const entities = chunk.containedEntities;
entityLoop: for (let i = 0; i < entities.length; ++i) {
const entity = entities[i];
// Avoid drawing twice
if (seenUids.has(entity.uid)) {
continue;
}
seenUids.add(entity.uid);
for (let i = 0; i < requiredComponents.length; ++i) {
if (!entity.components[requiredComponents[i]]) {
continue entityLoop;
}
}
callback(parameters, entity);
}
}
}
}
/** /**
* @param {Entity} entity * @param {Entity} entity
*/ */

View File

@ -374,7 +374,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
// HACK to draw the entity sprite // HACK to draw the entity sprite
const previewSprite = metaBuilding.getBlueprintSprite(rotationVariant, this.currentVariant.get()); const previewSprite = metaBuilding.getBlueprintSprite(rotationVariant, this.currentVariant.get());
staticComp.origin = worldPos.divideScalar(globalConfig.tileSize).subScalars(0.5, 0.5); staticComp.origin = worldPos.divideScalar(globalConfig.tileSize).subScalars(0.5, 0.5);
staticComp.drawSpriteOnFullEntityBounds(parameters, previewSprite); staticComp.drawSpriteOnBoundsClipped(parameters, previewSprite);
staticComp.origin = mouseTile; staticComp.origin = mouseTile;
// Draw ejectors // Draw ejectors

View File

@ -78,7 +78,7 @@ export class HUDSandboxController extends BaseHUDPart {
if (!this.root.hubGoals.storedShapes[blueprintShape]) { if (!this.root.hubGoals.storedShapes[blueprintShape]) {
this.root.hubGoals.storedShapes[blueprintShape] = 0; this.root.hubGoals.storedShapes[blueprintShape] = 0;
} }
this.root.hubGoals.storedShapes[blueprintShape] += 1e4; this.root.hubGoals.storedShapes[blueprintShape] += 1e9;
} }
maxOutAll() { maxOutAll() {

View File

@ -64,11 +64,16 @@ export class HUDWireInfo extends BaseHUDPart {
const network = networks[0]; const network = networks[0];
if (network.valueConflict) { if (network.valueConflict) {
this.spriteConflict.draw(parameters.context, mousePos.x + 10, mousePos.y - 10, 40, 40); this.spriteConflict.draw(parameters.context, mousePos.x + 15, mousePos.y - 10, 60, 60);
} else if (!network.currentValue) { } else if (!network.currentValue) {
this.spriteEmpty.draw(parameters.context, mousePos.x + 10, mousePos.y - 10, 40, 40); this.spriteEmpty.draw(parameters.context, mousePos.x + 15, mousePos.y - 10, 60, 60);
} else { } else {
network.currentValue.drawCentered(mousePos.x + 20, mousePos.y, parameters, 40); network.currentValue.drawItemCenteredClipped(
mousePos.x + 40,
mousePos.y + 10,
parameters,
60
);
} }
} }
} }

View File

@ -4,6 +4,7 @@ import { MetaConstantSignalBuilding } from "../../buildings/constant_signal";
import { MetaLogicGateBuilding } from "../../buildings/logic_gate"; import { MetaLogicGateBuilding } from "../../buildings/logic_gate";
import { MetaLeverBuilding } from "../../buildings/lever"; import { MetaLeverBuilding } from "../../buildings/lever";
import { MetaWireTunnelBuilding } from "../../buildings/wire_tunnel"; import { MetaWireTunnelBuilding } from "../../buildings/wire_tunnel";
import { MetaVirtualProcessorBuilding } from "../../buildings/virtual_processor";
const supportedBuildings = [ const supportedBuildings = [
MetaWireBuilding, MetaWireBuilding,
@ -11,6 +12,7 @@ const supportedBuildings = [
MetaConstantSignalBuilding, MetaConstantSignalBuilding,
MetaLogicGateBuilding, MetaLogicGateBuilding,
MetaLeverBuilding, MetaLeverBuilding,
MetaVirtualProcessorBuilding,
]; ];
export class HUDWiresToolbar extends HUDBaseToolbar { export class HUDWiresToolbar extends HUDBaseToolbar {

View File

@ -2,6 +2,7 @@ import { DrawParameters } from "../../core/draw_parameters";
import { Loader } from "../../core/loader"; import { Loader } from "../../core/loader";
import { types } from "../../savegame/serialization"; import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { globalConfig } from "../../core/config";
export class BooleanItem extends BaseItem { export class BooleanItem extends BaseItem {
static getId() { static getId() {
@ -46,7 +47,7 @@ export class BooleanItem extends BaseItem {
* @param {number} diameter * @param {number} diameter
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
*/ */
drawCentered(x, y, parameters, diameter = 12) { drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
let sprite; let sprite;
if (this.value) { if (this.value) {
sprite = Loader.getSprite("sprites/wires/boolean_true.png"); sprite = Loader.getSprite("sprites/wires/boolean_true.png");

View File

@ -5,6 +5,7 @@ import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { enumColors, enumColorsToHexCode } from "../colors"; import { enumColors, enumColorsToHexCode } from "../colors";
import { THEME } from "../theme"; import { THEME } from "../theme";
import { drawSpriteClipped } from "../../core/draw_utils";
export class ColorItem extends BaseItem { export class ColorItem extends BaseItem {
static getId() { static getId() {
@ -54,23 +55,33 @@ export class ColorItem extends BaseItem {
* @param {number} diameter * @param {number} diameter
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
*/ */
drawCentered(x, y, parameters, diameter = 12) { drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
if (!this.bufferGenerator) { if (!this.bufferGenerator) {
this.bufferGenerator = this.internalGenerateColorBuffer.bind(this); this.bufferGenerator = this.internalGenerateColorBuffer.bind(this);
} }
const realDiameter = diameter * 0.6;
const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel); const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
const key = realDiameter + "/" + dpi + "/" + this.color;
const key = diameter + "/" + dpi;
const canvas = parameters.root.buffers.getForKey({ const canvas = parameters.root.buffers.getForKey({
key, key: "coloritem",
subKey: this.color, subKey: key,
w: diameter, w: realDiameter,
h: diameter, h: realDiameter,
dpi, dpi,
redrawMethod: this.bufferGenerator, redrawMethod: this.bufferGenerator,
}); });
parameters.context.drawImage(canvas, x - diameter / 2, y - diameter / 2, diameter, diameter);
drawSpriteClipped({
parameters,
sprite: canvas,
x: x - realDiameter / 2,
y: y - realDiameter / 2,
w: realDiameter,
h: realDiameter,
originalW: realDiameter * dpi,
originalH: realDiameter * dpi,
});
} }
/** /**
* *

View File

@ -3,6 +3,7 @@ import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { ShapeDefinition } from "../shape_definition"; import { ShapeDefinition } from "../shape_definition";
import { THEME } from "../theme"; import { THEME } from "../theme";
import { globalConfig } from "../../core/config";
export class ShapeItem extends BaseItem { export class ShapeItem extends BaseItem {
static getId() { static getId() {
@ -55,7 +56,7 @@ export class ShapeItem extends BaseItem {
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {number=} diameter * @param {number=} diameter
*/ */
drawCentered(x, y, parameters, diameter) { drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
this.definition.drawCentered(x, y, parameters, diameter); this.definition.drawCentered(x, y, parameters, diameter);
} }
} }

View File

@ -63,6 +63,7 @@ export const KEYMAPPINGS = {
wire_tunnel: { keyCode: key("2") }, wire_tunnel: { keyCode: key("2") },
constant_signal: { keyCode: key("3") }, constant_signal: { keyCode: key("3") },
logic_gate: { keyCode: key("4") }, logic_gate: { keyCode: key("4") },
virtual_processor: { keyCode: key("5") },
}, },
placement: { placement: {

View File

@ -52,10 +52,16 @@ export class MapChunkView extends MapChunk {
*/ */
drawForegroundLayer(parameters) { drawForegroundLayer(parameters) {
const systems = this.root.systemMgr.systems; const systems = this.root.systemMgr.systems;
systems.itemEjector.drawChunk(parameters, this);
systems.itemAcceptor.drawChunk(parameters, this);
systems.miner.drawChunk(parameters, this); systems.miner.drawChunk(parameters, this);
systems.staticMapEntities.drawChunk(parameters, this); systems.staticMapEntities.drawChunk(parameters, this);
systems.lever.drawChunk(parameters, this); systems.lever.drawChunk(parameters, this);
systems.display.drawChunk(parameters, this); systems.display.drawChunk(parameters, this);
systems.storage.drawChunk(parameters, this);
} }
/** /**
@ -97,11 +103,9 @@ export class MapChunkView extends MapChunk {
const destX = this.x * dims + patch.pos.x * globalConfig.tileSize; const destX = this.x * dims + patch.pos.x * globalConfig.tileSize;
const destY = this.y * dims + patch.pos.y * globalConfig.tileSize; const destY = this.y * dims + patch.pos.y * globalConfig.tileSize;
const destSize = Math.min(80, 30 / parameters.zoomLevel); const diameter = Math.min(80, 30 / parameters.zoomLevel);
if (parameters.visibleRect.containsCircle(destX, destY, destSize)) { patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
patch.item.drawCentered(destX, destY, parameters, destSize);
}
} }
} }
} }
@ -265,5 +269,6 @@ export class MapChunkView extends MapChunk {
const systems = this.root.systemMgr.systems; const systems = this.root.systemMgr.systems;
systems.wire.drawChunk(parameters, this); systems.wire.drawChunk(parameters, this);
systems.staticMapEntities.drawWiresChunk(parameters, this); systems.staticMapEntities.drawWiresChunk(parameters, this);
systems.wiredPins.drawChunk(parameters, this);
} }
} }

View File

@ -21,6 +21,7 @@ import { MetaLeverBuilding } from "./buildings/lever";
import { MetaFilterBuilding } from "./buildings/filter"; import { MetaFilterBuilding } from "./buildings/filter";
import { MetaWireTunnelBuilding, enumWireTunnelVariants } from "./buildings/wire_tunnel"; import { MetaWireTunnelBuilding, enumWireTunnelVariants } from "./buildings/wire_tunnel";
import { MetaDisplayBuilding } from "./buildings/display"; import { MetaDisplayBuilding } from "./buildings/display";
import { MetaVirtualProcessorBuilding, enumVirtualProcessorVariants } from "./buildings/virtual_processor";
const logger = createLogger("building_registry"); const logger = createLogger("building_registry");
@ -43,6 +44,7 @@ export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaFilterBuilding); gMetaBuildingRegistry.register(MetaFilterBuilding);
gMetaBuildingRegistry.register(MetaWireTunnelBuilding); gMetaBuildingRegistry.register(MetaWireTunnelBuilding);
gMetaBuildingRegistry.register(MetaDisplayBuilding); gMetaBuildingRegistry.register(MetaDisplayBuilding);
gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding);
// Belt // Belt
registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0); registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0);
@ -121,6 +123,13 @@ export function initMetaBuildingRegistry() {
// Display // Display
registerBuildingVariant(40, MetaDisplayBuilding); registerBuildingVariant(40, MetaDisplayBuilding);
// Virtual Processor
registerBuildingVariant(42, MetaVirtualProcessorBuilding);
registerBuildingVariant(43, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.analyzer);
registerBuildingVariant(44, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.rotater);
registerBuildingVariant(45, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.unstacker);
registerBuildingVariant(46, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.shapecompare);
// Propagate instances // Propagate instances
for (const key in gBuildingVariants) { for (const key in gBuildingVariants) {
gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass( gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass(

View File

@ -149,6 +149,8 @@ export class GameRoot {
gameSaved: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got saved gameSaved: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got saved
gameRestored: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got restored gameRestored: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got restored
gameFrameStarted: /** @type {TypedSignal<[]>} */ (new Signal()), // New frame
storyGoalCompleted: /** @type {TypedSignal<[number, string]>} */ (new Signal()), storyGoalCompleted: /** @type {TypedSignal<[number, string]>} */ (new Signal()),
upgradePurchased: /** @type {TypedSignal<[string]>} */ (new Signal()), upgradePurchased: /** @type {TypedSignal<[string]>} */ (new Signal()),

View File

@ -2,16 +2,11 @@ import { makeOffscreenBuffer } from "../core/buffer_utils";
import { globalConfig } from "../core/config"; import { globalConfig } from "../core/config";
import { smoothenDpi } from "../core/dpi_manager"; import { smoothenDpi } from "../core/dpi_manager";
import { DrawParameters } from "../core/draw_parameters"; import { DrawParameters } from "../core/draw_parameters";
import { createLogger } from "../core/logging";
import { Vector } from "../core/vector"; import { Vector } from "../core/vector";
import { BasicSerializableObject, types } from "../savegame/serialization"; import { BasicSerializableObject, types } from "../savegame/serialization";
import { enumColors, enumColorsToHexCode, enumColorToShortcode, enumShortcodeToColor } from "./colors"; import { enumColors, enumColorsToHexCode, enumColorToShortcode, enumShortcodeToColor } from "./colors";
import { THEME } from "./theme"; import { THEME } from "./theme";
const rusha = require("rusha");
const logger = createLogger("shape_definition");
/** /**
* @typedef {{ * @typedef {{
* subShape: enumSubShape, * subShape: enumSubShape,
@ -90,7 +85,7 @@ export class ShapeDefinition extends BasicSerializableObject {
return errorCode; return errorCode;
} }
const definition = ShapeDefinition.fromShortKey(data); const definition = ShapeDefinition.fromShortKey(data);
this.layers = definition.layers; this.layers = /** @type {Array<ShapeLayer>} */ (definition.layers);
} }
serialize() { serialize() {
@ -107,7 +102,8 @@ export class ShapeDefinition extends BasicSerializableObject {
/** /**
* The layers from bottom to top * The layers from bottom to top
* @type {Array<ShapeLayer>} */ * @type {Array<ShapeLayer>}
*/
this.layers = layers; this.layers = layers;
/** @type {string} */ /** @type {string} */
@ -289,10 +285,10 @@ export class ShapeDefinition extends BasicSerializableObject {
this.bufferGenerator = this.internalGenerateShapeBuffer.bind(this); this.bufferGenerator = this.internalGenerateShapeBuffer.bind(this);
} }
const key = diameter + "/" + dpi; const key = diameter + "/" + dpi + "/" + this.cachedHash;
const canvas = parameters.root.buffers.getForKey({ const canvas = parameters.root.buffers.getForKey({
key, key: "shapedef",
subKey: this.cachedHash, subKey: key,
w: diameter, w: diameter,
h: diameter, h: diameter,
dpi, dpi,

View File

@ -14,7 +14,6 @@ import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view"; import { MapChunkView } from "../map_chunk_view";
import { defaultBuildingVariant } from "../meta_building"; import { defaultBuildingVariant } from "../meta_building";
import { getCodeFromBuildingData } from "../building_codes"; import { getCodeFromBuildingData } from "../building_codes";
import { enumLayer } from "../root";
export const BELT_ANIM_COUNT = 14; export const BELT_ANIM_COUNT = 14;
@ -496,13 +495,15 @@ export class BeltSystem extends GameSystemWithFilter {
((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) * ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) *
globalConfig.itemSpacingOnBelts globalConfig.itemSpacingOnBelts
); );
const contents = chunk.containedEntitiesByLayer[enumLayer.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];
if (entity.components.Belt) { if (entity.components.Belt) {
const direction = entity.components.Belt.direction; const direction = entity.components.Belt.direction;
const sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT]; const sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT];
entity.components.StaticMapEntity.drawSpriteOnFullEntityBounds(parameters, sprite, 0);
// Culling happens within the static map entity component
entity.components.StaticMapEntity.drawSpriteOnBoundsClipped(parameters, sprite, 0);
} }
} }
} }

View File

@ -7,7 +7,6 @@ import { GameSystemWithFilter } from "../game_system_with_filter";
import { BELT_ANIM_COUNT } from "./belt"; import { BELT_ANIM_COUNT } from "./belt";
import { MapChunkView } from "../map_chunk_view"; import { MapChunkView } from "../map_chunk_view";
import { DrawParameters } from "../../core/draw_parameters"; import { DrawParameters } from "../../core/draw_parameters";
import { enumLayer } from "../root";
export class BeltUnderlaysSystem extends GameSystemWithFilter { export class BeltUnderlaysSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
@ -29,21 +28,40 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter {
// Limit speed to avoid belts going backwards // Limit speed to avoid belts going backwards
const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10); const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10);
const contents = chunk.containedEntitiesByLayer[enumLayer.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 underlayComp = entity.components.BeltUnderlays; const underlayComp = entity.components.BeltUnderlays;
if (underlayComp) { if (!underlayComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
const underlays = underlayComp.underlays; const underlays = underlayComp.underlays;
for (let i = 0; i < underlays.length; ++i) { for (let i = 0; i < underlays.length; ++i) {
const { pos, direction } = underlays[i]; const { pos, direction } = underlays[i];
const transformedPos = staticComp.localTileToWorld(pos); const transformedPos = staticComp.localTileToWorld(pos);
// Culling
if (!chunk.tileSpaceRectangle.containsPoint(transformedPos.x, transformedPos.y)) { if (!chunk.tileSpaceRectangle.containsPoint(transformedPos.x, transformedPos.y)) {
continue; continue;
} }
const destX = transformedPos.x * globalConfig.tileSize;
const destY = transformedPos.y * globalConfig.tileSize;
// Culling, #2
if (
!parameters.visibleRect.containsRect4Params(
destX,
destY,
globalConfig.tileSize,
globalConfig.tileSize
)
) {
continue;
}
const angle = enumDirectionToAngle[staticComp.localDirectionToWorld(direction)]; const angle = enumDirectionToAngle[staticComp.localDirectionToWorld(direction)];
// SYNC with systems/belt.js:drawSingleEntity! // SYNC with systems/belt.js:drawSingleEntity!
@ -55,8 +73,8 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter {
drawRotatedSprite({ drawRotatedSprite({
parameters, parameters,
sprite: this.underlayBeltSprites[animationIndex % this.underlayBeltSprites.length], sprite: this.underlayBeltSprites[animationIndex % this.underlayBeltSprites.length],
x: (transformedPos.x + 0.5) * globalConfig.tileSize, x: destX + globalConfig.halfTileSize,
y: (transformedPos.y + 0.5) * globalConfig.tileSize, y: destY + globalConfig.halfTileSize,
angle: Math.radians(angle), angle: Math.radians(angle),
size: globalConfig.tileSize, size: globalConfig.tileSize,
}); });
@ -64,4 +82,3 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter {
} }
} }
} }
}

View File

@ -66,9 +66,11 @@ export class DisplaySystem extends GameSystemWithFilter {
if (entity && entity.components.Display) { if (entity && entity.components.Display) {
const pinsComp = entity.components.WiredPins; const pinsComp = entity.components.WiredPins;
const network = pinsComp.slots[0].linkedNetwork; const network = pinsComp.slots[0].linkedNetwork;
if (!network || !network.currentValue) { if (!network || !network.currentValue) {
continue; continue;
} }
const value = this.getDisplayItem(network.currentValue); const value = this.getDisplayItem(network.currentValue);
if (!value) { if (!value) {
@ -84,7 +86,7 @@ export class DisplaySystem extends GameSystemWithFilter {
globalConfig.tileSize globalConfig.tileSize
); );
} else if (value.getItemType() === "shape") { } else if (value.getItemType() === "shape") {
value.draw( value.drawItemCenteredClipped(
(origin.x + 0.5) * globalConfig.tileSize, (origin.x + 0.5) * globalConfig.tileSize,
(origin.y + 0.5) * globalConfig.tileSize, (origin.y + 0.5) * globalConfig.tileSize,
parameters, parameters,

View File

@ -5,6 +5,14 @@ import { T } from "../../translations";
import { HubComponent } from "../components/hub"; import { HubComponent } from "../components/hub";
import { Entity } from "../entity"; import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { globalConfig } from "../../core/config";
import { smoothenDpi } from "../../core/dpi_manager";
import { drawSpriteClipped } from "../../core/draw_utils";
import { Rectangle } from "../../core/rectangle";
import { ORIGINAL_SPRITE_SCALE } from "../../core/sprites";
const HUB_SIZE_TILES = 4;
const HUB_SIZE_PIXELS = HUB_SIZE_TILES * globalConfig.tileSize;
export class HubSystem extends GameSystemWithFilter { export class HubSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
@ -13,8 +21,13 @@ export class HubSystem extends GameSystemWithFilter {
this.hubSprite = Loader.getSprite("sprites/buildings/hub.png"); this.hubSprite = Loader.getSprite("sprites/buildings/hub.png");
} }
/**
* @param {DrawParameters} parameters
*/
draw(parameters) { draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this)); for (let i = 0; i < this.allEntities.length; ++i) {
this.drawEntity(parameters, this.allEntities[i]);
}
} }
update() { update() {
@ -27,35 +40,42 @@ export class HubSystem extends GameSystemWithFilter {
); );
} }
} }
/** /**
* @param {DrawParameters} parameters *
* @param {Entity} entity * @param {HTMLCanvasElement} canvas
* @param {CanvasRenderingContext2D} context
* @param {number} w
* @param {number} h
* @param {number} dpi
*/ */
drawEntity(parameters, entity) { redrawHubBaseTexture(canvas, context, w, h, dpi) {
const context = parameters.context; // This method is quite ugly, please ignore it!
const staticComp = entity.components.StaticMapEntity;
if (!staticComp.shouldBeDrawn(parameters)) { context.scale(dpi, dpi);
return;
}
const pos = staticComp.getTileSpaceBounds().getCenter().toWorldSpace(); const parameters = new DrawParameters({
context,
visibleRect: new Rectangle(0, 0, w, h),
desiredAtlasScale: ORIGINAL_SPRITE_SCALE,
zoomLevel: dpi * 0.75,
root: this.root,
});
// Background context.clearRect(0, 0, w, h);
staticComp.drawSpriteOnFullEntityBounds(parameters, this.hubSprite, 2.2);
this.hubSprite.draw(context, 0, 0, w, h);
const definition = this.root.hubGoals.currentGoal.definition; const definition = this.root.hubGoals.currentGoal.definition;
definition.drawCentered(45, 58, parameters, 36);
definition.drawCentered(pos.x - 25, pos.y - 10, parameters, 40);
const goals = this.root.hubGoals.currentGoal; const goals = this.root.hubGoals.currentGoal;
const textOffsetX = 2; const textOffsetX = 70;
const textOffsetY = -6; const textOffsetY = 61;
// Deliver count // Deliver count
const delivered = this.root.hubGoals.getCurrentGoalDelivered(); const delivered = this.root.hubGoals.getCurrentGoalDelivered();
const deliveredText = "" + formatBigNumber(delivered);
if (delivered > 9999) { if (delivered > 9999) {
context.font = "bold 16px GameFont"; context.font = "bold 16px GameFont";
@ -66,52 +86,87 @@ export class HubSystem extends GameSystemWithFilter {
} }
context.fillStyle = "#64666e"; context.fillStyle = "#64666e";
context.textAlign = "left"; context.textAlign = "left";
context.fillText("" + formatBigNumber(delivered), pos.x + textOffsetX, pos.y + textOffsetY); context.fillText(deliveredText, textOffsetX, textOffsetY);
// Required // Required
context.font = "13px GameFont"; context.font = "13px GameFont";
context.fillStyle = "#a4a6b0"; context.fillStyle = "#a4a6b0";
context.fillText( context.fillText("/ " + formatBigNumber(goals.required), textOffsetX, textOffsetY + 13);
"/ " + formatBigNumber(goals.required),
pos.x + textOffsetX,
pos.y + textOffsetY + 13
);
// Reward // Reward
const rewardText = T.storyRewards[goals.reward].title.toUpperCase(); const rewardText = T.storyRewards[goals.reward].title.toUpperCase();
if (rewardText.length > 12) { if (rewardText.length > 12) {
context.font = "bold 9px GameFont"; context.font = "bold 8px GameFont";
} else { } else {
context.font = "bold 11px GameFont"; context.font = "bold 10px GameFont";
} }
context.fillStyle = "#fd0752"; context.fillStyle = "#fd0752";
context.textAlign = "center"; context.textAlign = "center";
context.fillText(rewardText, pos.x, pos.y + 46); context.fillText(rewardText, HUB_SIZE_PIXELS / 2, 105);
// Level // Level "8"
context.font = "bold 11px GameFont"; context.font = "bold 10px GameFont";
context.fillStyle = "#fff"; context.fillStyle = "#fff";
context.fillText("" + this.root.hubGoals.level, pos.x - 42, pos.y - 36); context.fillText("" + this.root.hubGoals.level, 27, 32);
// Texts // "LVL"
context.textAlign = "center"; context.textAlign = "center";
context.fillStyle = "#fff"; context.fillStyle = "#fff";
context.font = "bold 7px GameFont"; context.font = "bold 6px GameFont";
context.fillText(T.buildings.hub.levelShortcut, pos.x - 42, pos.y - 47); context.fillText(T.buildings.hub.levelShortcut, 27, 22);
// "Deliver"
context.fillStyle = "#64666e"; context.fillStyle = "#64666e";
context.font = "bold 11px GameFont"; context.font = "bold 10px GameFont";
context.fillText(T.buildings.hub.deliver.toUpperCase(), pos.x, pos.y - 40); context.fillText(T.buildings.hub.deliver.toUpperCase(), HUB_SIZE_PIXELS / 2, 30);
// "To unlock"
const unlockText = T.buildings.hub.toUnlock.toUpperCase(); const unlockText = T.buildings.hub.toUnlock.toUpperCase();
if (unlockText.length > 15) { if (unlockText.length > 15) {
context.font = "bold 8px GameFont"; context.font = "bold 8px GameFont";
} else { } else {
context.font = "bold 11px GameFont"; context.font = "bold 10px GameFont";
} }
context.fillText(T.buildings.hub.toUnlock.toUpperCase(), pos.x, pos.y + 30); context.fillText(T.buildings.hub.toUnlock.toUpperCase(), HUB_SIZE_PIXELS / 2, 92);
context.textAlign = "left"; context.textAlign = "left";
} }
/**
* @param {DrawParameters} parameters
* @param {Entity} entity
*/
drawEntity(parameters, entity) {
const staticComp = entity.components.StaticMapEntity;
if (!staticComp.shouldBeDrawn(parameters)) {
return;
}
// Deliver count
const delivered = this.root.hubGoals.getCurrentGoalDelivered();
const deliveredText = "" + formatBigNumber(delivered);
const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
const canvas = parameters.root.buffers.getForKey({
key: "hub",
subKey: dpi + "/" + this.root.hubGoals.level + "/" + deliveredText,
w: globalConfig.tileSize * 4,
h: globalConfig.tileSize * 4,
dpi,
redrawMethod: this.redrawHubBaseTexture.bind(this),
});
const extrude = 8;
drawSpriteClipped({
parameters,
sprite: canvas,
x: staticComp.origin.x * globalConfig.tileSize - extrude,
y: staticComp.origin.y * globalConfig.tileSize - extrude,
w: HUB_SIZE_PIXELS + 2 * extrude,
h: HUB_SIZE_PIXELS + 2 * extrude,
originalW: HUB_SIZE_PIXELS * dpi,
originalH: HUB_SIZE_PIXELS * dpi,
});
}
} }

View File

@ -3,8 +3,8 @@ 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 { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view";
export class ItemAcceptorSystem extends GameSystemWithFilter { export class ItemAcceptorSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
@ -38,43 +38,45 @@ export class ItemAcceptorSystem extends GameSystemWithFilter {
} }
/** /**
* Draws the acceptor items
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/ */
draw(parameters) { drawChunk(parameters, chunk) {
this.forEachMatchingEntityOnScreen(parameters, this.drawEntityRegularLayer.bind(this)); const contents = chunk.containedEntitiesByLayer.regular;
} for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
/**
* @param {DrawParameters} parameters
* @param {Entity} entity
*/
drawEntityRegularLayer(parameters, entity) {
const staticComp = entity.components.StaticMapEntity;
const acceptorComp = entity.components.ItemAcceptor; const acceptorComp = entity.components.ItemAcceptor;
if (!acceptorComp) {
if (!staticComp.shouldBeDrawn(parameters)) { continue;
return;
} }
const staticComp = entity.components.StaticMapEntity;
for (let animIndex = 0; animIndex < acceptorComp.itemConsumptionAnimations.length; ++animIndex) { for (let animIndex = 0; animIndex < acceptorComp.itemConsumptionAnimations.length; ++animIndex) {
const { item, slotIndex, animProgress, direction } = acceptorComp.itemConsumptionAnimations[ const { item, slotIndex, animProgress, direction } = acceptorComp.itemConsumptionAnimations[
animIndex animIndex
]; ];
const slotData = acceptorComp.slots[slotIndex]; const slotData = acceptorComp.slots[slotIndex];
const realSlotPos = staticComp.localTileToWorld(slotData.pos);
if (!chunk.tileSpaceRectangle.containsPoint(realSlotPos.x, realSlotPos.y)) {
// Not within this chunk
continue;
}
const slotWorldPos = staticComp.applyRotationToVector(slotData.pos).add(staticComp.origin);
const fadeOutDirection = enumDirectionToVector[staticComp.localDirectionToWorld(direction)]; const fadeOutDirection = enumDirectionToVector[staticComp.localDirectionToWorld(direction)];
const finalTile = slotWorldPos.subScalars( const finalTile = realSlotPos.subScalars(
fadeOutDirection.x * (animProgress / 2 - 0.5), fadeOutDirection.x * (animProgress / 2 - 0.5),
fadeOutDirection.y * (animProgress / 2 - 0.5) fadeOutDirection.y * (animProgress / 2 - 0.5)
); );
item.drawCentered(
item.drawItemCenteredClipped(
(finalTile.x + 0.5) * globalConfig.tileSize, (finalTile.x + 0.5) * globalConfig.tileSize,
(finalTile.y + 0.5) * globalConfig.tileSize, (finalTile.y + 0.5) * globalConfig.tileSize,
parameters parameters,
globalConfig.defaultItemDiameter
); );
} }
} }
} }
}

View File

@ -8,6 +8,7 @@ import { ItemEjectorComponent } from "../components/item_ejector";
import { Entity } from "../entity"; import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { enumItemProcessorTypes } from "../components/item_processor"; import { enumItemProcessorTypes } from "../components/item_processor";
import { MapChunkView } from "../map_chunk_view";
const logger = createLogger("systems/ejector"); const logger = createLogger("systems/ejector");
@ -336,25 +337,21 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
} }
/** /**
* Draws everything
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/ */
draw(parameters) { drawChunk(parameters, chunk) {
this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this)); const contents = chunk.containedEntitiesByLayer.regular;
}
/** for (let i = 0; i < contents.length; ++i) {
* @param {DrawParameters} parameters const entity = contents[i];
* @param {Entity} entity
*/
drawSingleEntity(parameters, entity) {
const ejectorComp = entity.components.ItemEjector; const ejectorComp = entity.components.ItemEjector;
const staticComp = entity.components.StaticMapEntity; if (!ejectorComp) {
continue;
if (!staticComp.shouldBeDrawn(parameters)) {
return;
} }
const staticComp = entity.components.StaticMapEntity;
for (let i = 0; i < ejectorComp.slots.length; ++i) { for (let i = 0; i < ejectorComp.slots.length; ++i) {
const slot = ejectorComp.slots[i]; const slot = ejectorComp.slots[i];
const ejectedItem = slot.item; const ejectedItem = slot.item;
@ -364,22 +361,28 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
continue; continue;
} }
const realPosition = slot.pos.rotateFastMultipleOf90(staticComp.rotation); const realPosition = staticComp.localTileToWorld(slot.pos);
const realDirection = Vector.transformDirectionFromMultipleOf90( if (!chunk.tileSpaceRectangle.containsPoint(realPosition.x, realPosition.y)) {
slot.direction, // Not within this chunk
staticComp.rotation continue;
); }
const realDirection = staticComp.localDirectionToWorld(slot.direction);
const realDirectionVector = enumDirectionToVector[realDirection]; const realDirectionVector = enumDirectionToVector[realDirection];
const tileX = const tileX = realPosition.x + 0.5 + realDirectionVector.x * 0.5 * slot.progress;
staticComp.origin.x + realPosition.x + 0.5 + realDirectionVector.x * 0.5 * slot.progress; const tileY = realPosition.y + 0.5 + realDirectionVector.y * 0.5 * slot.progress;
const tileY =
staticComp.origin.y + realPosition.y + 0.5 + realDirectionVector.y * 0.5 * slot.progress;
const worldX = tileX * globalConfig.tileSize; const worldX = tileX * globalConfig.tileSize;
const worldY = tileY * globalConfig.tileSize; const worldY = tileY * globalConfig.tileSize;
ejectedItem.drawCentered(worldX, worldY, parameters); ejectedItem.drawItemCenteredClipped(
worldX,
worldY,
parameters,
globalConfig.defaultItemDiameter
);
}
} }
} }
} }

View File

@ -34,8 +34,9 @@ export class LeverSystem extends GameSystemWithFilter {
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];
if (entity && entity.components.Lever) { const leverComp = entity.components.Lever;
const sprite = entity.components.Lever.toggled ? this.spriteOn : this.spriteOff; if (leverComp) {
const sprite = leverComp.toggled ? this.spriteOn : this.spriteOff;
const origin = entity.components.StaticMapEntity.origin; const origin = entity.components.StaticMapEntity.origin;
sprite.drawCached( sprite.drawCached(
parameters, parameters,

View File

@ -1,9 +1,12 @@
import { LogicGateComponent, enumLogicGateType } from "../components/logic_gate";
import { GameSystemWithFilter } from "../game_system_with_filter";
import { BaseItem } from "../base_item"; import { BaseItem } from "../base_item";
import { enumColors } from "../colors";
import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
import { enumPinSlotType } from "../components/wired_pins"; import { enumPinSlotType } from "../components/wired_pins";
import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON, BooleanItem } from "../items/boolean_item"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { enumItemProcessorTypes } from "../components/item_processor"; import { BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON, BooleanItem } from "../items/boolean_item";
import { COLOR_ITEM_SINGLETONS } from "../items/color_item";
import { ShapeDefinition } from "../shape_definition";
import { ShapeItem } from "../items/shape_item";
export class LogicGateSystem extends GameSystemWithFilter { export class LogicGateSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
@ -15,6 +18,12 @@ export class LogicGateSystem extends GameSystemWithFilter {
[enumLogicGateType.xor]: this.compute_XOR.bind(this), [enumLogicGateType.xor]: this.compute_XOR.bind(this),
[enumLogicGateType.or]: this.compute_OR.bind(this), [enumLogicGateType.or]: this.compute_OR.bind(this),
[enumLogicGateType.transistor]: this.compute_IF.bind(this), [enumLogicGateType.transistor]: this.compute_IF.bind(this),
[enumLogicGateType.rotater]: this.compute_ROTATE.bind(this),
[enumLogicGateType.analyzer]: this.compute_ANALYZE.bind(this),
[enumLogicGateType.cutter]: this.compute_CUT.bind(this),
[enumLogicGateType.unstacker]: this.compute_UNSTACK.bind(this),
[enumLogicGateType.shapecompare]: this.compute_SHAPECOMPARE.bind(this),
}; };
} }
@ -40,16 +49,26 @@ export class LogicGateSystem extends GameSystemWithFilter {
const result = this.boundOperations[logicComp.type](slotValues); const result = this.boundOperations[logicComp.type](slotValues);
if (Array.isArray(result)) {
let resultIndex = 0;
for (let i = 0; i < slotComp.slots.length; ++i) {
const slot = slotComp.slots[i];
if (slot.type !== enumPinSlotType.logicalEjector) {
continue;
}
slot.value = result[resultIndex++];
}
} else {
// @TODO: For now we hardcode the value to always be slot 0 // @TODO: For now we hardcode the value to always be slot 0
assert( assert(
slotValues.length === slotComp.slots.length - 1, slotValues.length === slotComp.slots.length - 1,
"Bad slot config, should have N acceptor slots and 1 ejector" "Bad slot config, should have N acceptor slots and 1 ejector"
); );
assert(slotComp.slots[0].type === enumPinSlotType.logicalEjector, "Slot 0 should be ejector"); assert(slotComp.slots[0].type === enumPinSlotType.logicalEjector, "Slot 0 should be ejector");
slotComp.slots[0].value = result; slotComp.slots[0].value = result;
} }
} }
}
/** /**
* @param {Array<BaseItem|null>} parameters * @param {Array<BaseItem|null>} parameters
@ -177,4 +196,131 @@ export class LogicGateSystem extends GameSystemWithFilter {
return null; return null;
} }
/**
* @param {Array<BaseItem|null>} parameters
* @returns {BaseItem}
*/
compute_ROTATE(parameters) {
const item = parameters[0];
if (!item || item.getItemType() !== "shape") {
// Not a shape
return null;
}
const definition = /** @type {ShapeItem} */ (item).definition;
const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(definition);
return this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition);
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {[BaseItem, BaseItem]}
*/
compute_ANALYZE(parameters) {
const item = parameters[0];
if (!item || item.getItemType() !== "shape") {
// Not a shape
return [null, null];
}
const definition = /** @type {ShapeItem} */ (item).definition;
const lowerLayer = /** @type {import("../shape_definition").ShapeLayer} */ (definition.layers[0]);
if (!lowerLayer) {
return [null, null];
}
const topRightContent = lowerLayer[0];
if (!topRightContent || topRightContent.subShape === null) {
return [null, null];
}
const newDefinition = new ShapeDefinition({
layers: [
[
{ subShape: topRightContent.subShape, color: enumColors.uncolored },
{ subShape: topRightContent.subShape, color: enumColors.uncolored },
{ subShape: topRightContent.subShape, color: enumColors.uncolored },
{ subShape: topRightContent.subShape, color: enumColors.uncolored },
],
],
});
return [
COLOR_ITEM_SINGLETONS[topRightContent.color],
this.root.shapeDefinitionMgr.getShapeItemFromDefinition(newDefinition),
];
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {[BaseItem, BaseItem]}
*/
compute_CUT(parameters) {
const item = parameters[0];
if (!item || item.getItemType() !== "shape") {
// Not a shape
return [null, null];
}
const definition = /** @type {ShapeItem} */ (item).definition;
const result = this.root.shapeDefinitionMgr.shapeActionCutHalf(definition);
return [
result[0].isEntirelyEmpty()
? null
: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[0]),
result[1].isEntirelyEmpty()
? null
: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[1]),
];
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {[BaseItem, BaseItem]}
*/
compute_UNSTACK(parameters) {
const item = parameters[0];
if (!item || item.getItemType() !== "shape") {
// Not a shape
return [null, null];
}
const definition = /** @type {ShapeItem} */ (item).definition;
const layers = /** @type {Array<import("../shape_definition").ShapeLayer>} */ (definition.layers);
const upperLayerDefinition = new ShapeDefinition({
layers: [layers[layers.length - 1]],
});
const lowerLayers = layers.slice(0, layers.length - 1);
const lowerLayerDefinition =
lowerLayers.length > 0 ? new ShapeDefinition({ layers: lowerLayers }) : null;
return [
lowerLayerDefinition
? this.root.shapeDefinitionMgr.getShapeItemFromDefinition(lowerLayerDefinition)
: null,
this.root.shapeDefinitionMgr.getShapeItemFromDefinition(upperLayerDefinition),
];
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {BaseItem}
*/
compute_SHAPECOMPARE(parameters) {
const itemA = parameters[0];
const itemB = parameters[1];
return itemA &&
itemB &&
itemA.getItemType() === "shape" &&
itemB.getItemType() === "shape" &&
/** @type {ShapeItem} */ (itemA).definition.getHash() ===
/** @type {ShapeItem} */ (itemB).definition.getHash()
? BOOL_TRUE_SINGLETON
: BOOL_FALSE_SINGLETON;
}
} }

View File

@ -13,7 +13,7 @@ export class MapResourcesSystem extends GameSystem {
*/ */
drawChunk(parameters, chunk) { drawChunk(parameters, chunk) {
const basicChunkBackground = this.root.buffers.getForKey({ const basicChunkBackground = this.root.buffers.getForKey({
key: "chunkres", key: "mapresourcebg",
subKey: chunk.renderKey, subKey: chunk.renderKey,
w: globalConfig.mapChunkSize, w: globalConfig.mapChunkSize,
h: globalConfig.mapChunkSize, h: globalConfig.mapChunkSize,
@ -42,10 +42,9 @@ export class MapResourcesSystem extends GameSystem {
const patch = chunk.patches[i]; const patch = chunk.patches[i];
const destX = chunk.x * globalConfig.mapChunkWorldSize + patch.pos.x * globalConfig.tileSize; const destX = chunk.x * globalConfig.mapChunkWorldSize + patch.pos.x * globalConfig.tileSize;
const destY = chunk.y * globalConfig.mapChunkWorldSize + patch.pos.y * globalConfig.tileSize; const destY = chunk.y * globalConfig.mapChunkWorldSize + patch.pos.y * globalConfig.tileSize;
const destSize = Math.min(80, 40 / parameters.zoomLevel); const diameter = Math.min(80, 40 / parameters.zoomLevel);
if (parameters.visibleRect.containsCircle(destX, destY, destSize / 2)) {
patch.item.drawCentered(destX, destY, parameters, destSize); patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
}
} }
} else { } else {
// HIGH QUALITY: Draw all items // HIGH QUALITY: Draw all items
@ -61,9 +60,12 @@ export class MapResourcesSystem extends GameSystem {
const destX = worldX + globalConfig.halfTileSize; const destX = worldX + globalConfig.halfTileSize;
const destY = worldY + globalConfig.halfTileSize; const destY = worldY + globalConfig.halfTileSize;
if (parameters.visibleRect.containsCircle(destX, destY, globalConfig.tileSize / 2)) { lowerItem.drawItemCenteredClipped(
lowerItem.drawCentered(destX, destY, parameters); destX,
} destY,
parameters,
globalConfig.defaultItemDiameter
);
} }
} }
} }

View File

@ -102,41 +102,39 @@ export class MinerSystem extends GameSystemWithFilter {
* @param {MapChunkView} chunk * @param {MapChunkView} chunk
*/ */
drawChunk(parameters, chunk) { drawChunk(parameters, chunk) {
const contents = chunk.contents; const contents = chunk.containedEntitiesByLayer.regular;
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
const entity = contents[x][y];
if (entity && entity.components.Miner) { for (let i = 0; i < contents.length; ++i) {
const staticComp = entity.components.StaticMapEntity; const entity = contents[i];
const minerComp = entity.components.Miner; const minerComp = entity.components.Miner;
if (!staticComp.shouldBeDrawn(parameters)) { if (!minerComp) {
continue; continue;
} }
const staticComp = entity.components.StaticMapEntity;
if (!minerComp.cachedMinedItem) { if (!minerComp.cachedMinedItem) {
continue; continue;
} }
if (minerComp.cachedMinedItem) { // Draw the item background - this is to hide the ejected item animation from
// the item ejecto
const padding = 3; const padding = 3;
const destX = staticComp.origin.x * globalConfig.tileSize + padding;
const destY = staticComp.origin.y * globalConfig.tileSize + padding;
const dimensions = globalConfig.tileSize - 2 * padding;
if (parameters.visibleRect.containsRect4Params(destX, destY, dimensions, dimensions)) {
parameters.context.fillStyle = minerComp.cachedMinedItem.getBackgroundColorAsResource(); parameters.context.fillStyle = minerComp.cachedMinedItem.getBackgroundColorAsResource();
parameters.context.fillRect( parameters.context.fillRect(destX, destY, dimensions, dimensions);
staticComp.origin.x * globalConfig.tileSize + padding,
staticComp.origin.y * globalConfig.tileSize + padding,
globalConfig.tileSize - 2 * padding,
globalConfig.tileSize - 2 * padding
);
} }
if (minerComp.cachedMinedItem) { minerComp.cachedMinedItem.drawItemCenteredClipped(
minerComp.cachedMinedItem.drawCentered(
(0.5 + staticComp.origin.x) * globalConfig.tileSize, (0.5 + staticComp.origin.x) * globalConfig.tileSize,
(0.5 + staticComp.origin.y) * globalConfig.tileSize, (0.5 + staticComp.origin.y) * globalConfig.tileSize,
parameters parameters,
globalConfig.defaultItemDiameter
); );
} }
} }
} }
}
}
}

View File

@ -6,6 +6,18 @@ 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>} */
this.drawnUids = new Set();
this.root.signals.gameFrameStarted.add(this.clearUidList, this);
}
/**
* Clears the uid list when a new frame started
*/
clearUidList() {
this.drawnUids.clear();
} }
/** /**
@ -18,25 +30,21 @@ export class StaticMapEntitySystem extends GameSystem {
return; return;
} }
const drawnUids = new Set(); const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const contents = chunk.contents;
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
const entity = contents[x][y];
if (entity) {
if (drawnUids.has(entity.uid)) {
continue;
}
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.drawSpriteOnFullEntityBounds(parameters, sprite, 2); // Avoid drawing an entity twice which has been drawn for
} // another chunk already
if (this.drawnUids.has(entity.uid)) {
continue;
} }
this.drawnUids.add(entity.uid);
staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2);
} }
} }
} }
@ -65,7 +73,7 @@ export class StaticMapEntitySystem extends GameSystem {
const sprite = staticComp.getSprite(); const sprite = staticComp.getSprite();
if (sprite) { if (sprite) {
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2); staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 2);
} }
} }
} }

View File

@ -1,16 +1,28 @@
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { StorageComponent } from "../components/storage"; import { StorageComponent } from "../components/storage";
import { Entity } from "../entity";
import { DrawParameters } from "../../core/draw_parameters"; import { DrawParameters } from "../../core/draw_parameters";
import { formatBigNumber, lerp } from "../../core/utils"; import { formatBigNumber, lerp } from "../../core/utils";
import { Loader } from "../../core/loader"; import { Loader } from "../../core/loader";
import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "../items/boolean_item"; import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "../items/boolean_item";
import { MapChunkView } from "../map_chunk_view";
export class StorageSystem extends GameSystemWithFilter { export class StorageSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
super(root, [StorageComponent]); super(root, [StorageComponent]);
this.storageOverlaySprite = Loader.getSprite("sprites/misc/storage_overlay.png"); this.storageOverlaySprite = Loader.getSprite("sprites/misc/storage_overlay.png");
/**
* Stores which uids were already drawn to avoid drawing entities twice
* @type {Set<number>}
*/
this.drawnUids = new Set();
this.root.signals.gameFrameStarted.add(this.clearDrawnUids, this);
}
clearDrawnUids() {
this.drawnUids.clear();
} }
update() { update() {
@ -43,38 +55,46 @@ export class StorageSystem extends GameSystemWithFilter {
} }
} }
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this));
}
/** /**
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {Entity} entity * @param {MapChunkView} chunk
*/ */
drawEntity(parameters, entity) { drawChunk(parameters, chunk) {
const context = parameters.context; const contents = chunk.containedEntitiesByLayer.regular;
const staticComp = entity.components.StaticMapEntity; for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
if (!staticComp.shouldBeDrawn(parameters)) { const storageComp = entity.components.Storage;
return; if (!storageComp) {
continue;
} }
const storageComp = entity.components.Storage;
const storedItem = storageComp.storedItem; const storedItem = storageComp.storedItem;
if (storedItem !== null) { if (!storedItem) {
continue;
}
if (this.drawnUids.has(entity.uid)) {
continue;
}
this.drawnUids.add(entity.uid);
const staticComp = entity.components.StaticMapEntity;
const context = parameters.context;
context.globalAlpha = storageComp.overlayOpacity; context.globalAlpha = storageComp.overlayOpacity;
const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace(); const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
storedItem.drawCentered(center.x, center.y, parameters, 30); storedItem.drawItemCenteredClipped(center.x, center.y, parameters, 30);
this.storageOverlaySprite.drawCached(parameters, center.x - 15, center.y + 15, 30, 15); this.storageOverlaySprite.drawCached(parameters, center.x - 15, center.y + 15, 30, 15);
if (parameters.visibleRect.containsCircle(center.x, center.y + 25, 20)) {
context.font = "bold 10px GameFont"; context.font = "bold 10px GameFont";
context.textAlign = "center"; context.textAlign = "center";
context.fillStyle = "#64666e"; context.fillStyle = "#64666e";
context.fillText(formatBigNumber(storageComp.storedCount), center.x, center.y + 25.5); context.fillText(formatBigNumber(storageComp.storedCount), center.x, center.y + 25.5);
context.textAlign = "left"; context.textAlign = "left";
}
context.globalAlpha = 1; context.globalAlpha = 1;
} }
} }

View File

@ -317,7 +317,9 @@ export class WireSystem extends GameSystemWithFilter {
if ( if (
currentNetwork.providers.length > 0 && currentNetwork.providers.length > 0 &&
(currentNetwork.wires.length > 0 || currentNetwork.receivers.length > 0) (currentNetwork.wires.length > 0 ||
currentNetwork.receivers.length > 0 ||
currentNetwork.tunnels.length > 0)
) { ) {
this.networks.push(currentNetwork); this.networks.push(currentNetwork);
VERBOSE_WIRES && logger.log("Attached new network with uid", currentNetwork); VERBOSE_WIRES && logger.log("Attached new network with uid", currentNetwork);
@ -624,7 +626,7 @@ export class WireSystem extends GameSystemWithFilter {
assert(sprite, "Unknown wire type: " + wireType); assert(sprite, "Unknown wire type: " + wireType);
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
parameters.context.globalAlpha = opacity; parameters.context.globalAlpha = opacity;
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 0); staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 0);
parameters.context.globalAlpha = 1; parameters.context.globalAlpha = 1;
if (G_IS_DEV && globalConfig.debug.renderWireRotations) { if (G_IS_DEV && globalConfig.debug.renderWireRotations) {

View File

@ -1,13 +1,13 @@
import { globalConfig } from "../../core/config"; import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters"; import { DrawParameters } from "../../core/draw_parameters";
import { drawRotatedSprite } from "../../core/draw_utils";
import { Loader } from "../../core/loader"; import { Loader } from "../../core/loader";
import { Vector, enumDirectionToAngle } from "../../core/vector"; import { STOP_PROPAGATION } from "../../core/signal";
import { enumDirectionToAngle, Vector } from "../../core/vector";
import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
import { Entity } from "../entity"; import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter"; import { GameSystemWithFilter } from "../game_system_with_filter";
import { STOP_PROPAGATION } from "../../core/signal"; import { MapChunkView } from "../map_chunk_view";
import { drawRotatedSprite } from "../../core/draw_utils";
import { GLOBAL_APP } from "../../core/globals";
export class WiredPinsSystem extends GameSystemWithFilter { export class WiredPinsSystem extends GameSystemWithFilter {
constructor(root) { constructor(root) {
@ -146,28 +146,41 @@ export class WiredPinsSystem extends GameSystemWithFilter {
// TODO // TODO
} }
/**
* Draws the pins
* @param {DrawParameters} parameters
*/
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this));
}
/** /**
* Draws a given entity * Draws a given entity
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
* @param {Entity} entity * @param {MapChunkView} chunk
*/ */
drawSingleEntity(parameters, entity) { drawChunk(parameters, chunk) {
const staticComp = entity.components.StaticMapEntity; const contents = chunk.containedEntities;
const slots = entity.components.WiredPins.slots;
for (let i = 0; i < slots.length; ++i) { for (let i = 0; i < contents.length; ++i) {
const slot = slots[i]; const entity = contents[i];
const pinsComp = entity.components.WiredPins;
if (!pinsComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
const slots = pinsComp.slots;
for (let j = 0; j < slots.length; ++j) {
const slot = slots[j];
const tile = staticComp.localTileToWorld(slot.pos); const tile = staticComp.localTileToWorld(slot.pos);
if (!chunk.tileSpaceRectangle.containsPoint(tile.x, tile.y)) {
// Doesn't belong to this chunk
continue;
}
const worldPos = tile.toWorldSpaceCenterOfTile(); const worldPos = tile.toWorldSpaceCenterOfTile();
// Culling
if (
!parameters.visibleRect.containsCircle(worldPos.x, worldPos.y, globalConfig.halfTileSize)
) {
continue;
}
const effectiveRotation = Math.radians( const effectiveRotation = Math.radians(
staticComp.rotation + enumDirectionToAngle[slot.direction] staticComp.rotation + enumDirectionToAngle[slot.direction]
); );
@ -189,7 +202,12 @@ export class WiredPinsSystem extends GameSystemWithFilter {
const value = slot.value; const value = slot.value;
if (value) { if (value) {
const offset = new Vector(0, -9).rotated(effectiveRotation); const offset = new Vector(0, -9).rotated(effectiveRotation);
value.drawCentered(worldPos.x + offset.x, worldPos.y + offset.y, parameters, 9); value.drawItemCenteredClipped(
worldPos.x + offset.x,
worldPos.y + offset.y,
parameters,
9
);
} }
// Debug view // Debug view
@ -209,3 +227,4 @@ export class WiredPinsSystem extends GameSystemWithFilter {
} }
} }
} }
}

View File

@ -44,6 +44,7 @@ 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]
@ -296,6 +297,7 @@ ingame:
copySelection: Kopieren copySelection: Kopieren
clearSelection: Auswahl aufheben clearSelection: Auswahl aufheben
pipette: Pipette pipette: Pipette
switchLayers: Ebenen wechseln switchLayers: Ebenen wechseln
# Names of the colors, used for the color blind mode # Names of the colors, used for the color blind mode
@ -832,7 +834,6 @@ 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: >-
@ -846,8 +847,10 @@ 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
advanced_processor: Farbnivertierer pasteLastBlueprint: Letzte Blaupause einfügen
advanced_processor: Farbinvertierer
energy_generator: Energiegenerator energy_generator: Energiegenerator
wire: Energiekabel
about: about:
title: Über dieses Spiel title: Über dieses Spiel

View File

@ -591,6 +591,27 @@ buildings:
# TEMP # TEMP
description: Can be connected on the wires layer to show a color or shape. When inputting a boolean item, the display will be white if the value is 1. description: Can be connected on the wires layer to show a color or shape. When inputting a boolean item, the display will be white if the value is 1.
virtual_processor:
default:
name: &virtual_processor Virtual Cutter
description: Virtually cuts the shape input from top to bottom and returns both halfs.
analyzer:
name: Shape Analyzer
description: Analyzes the top right quadrant of the lowest layer of the shape and returns its shape and color
rotater:
name: Virtual Rotater
description: Virtually rotates the shape by 90 degrees clockwise.
unstacker:
name: Virtual Unstacker
description: Returns the topmost layer to the right, and the remaining ones on the left.
shapecompare:
name: Compare Shapes
description: Returns true if both shapes are exactly equal
storyRewards: storyRewards:
# Those are the rewards gained from completing the store # Those are the rewards gained from completing the store
reward_cutter_and_trash: reward_cutter_and_trash: