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":
{
"frame": {"x":1925,"y":1008,"w":116,"h":144},
"frame": {"x":1545,"y":991,"w":116,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -18,7 +18,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -26,7 +26,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -34,7 +34,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -42,7 +42,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -50,7 +50,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -58,7 +58,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -66,7 +66,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -74,7 +74,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -82,7 +82,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -90,7 +90,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -98,7 +98,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -106,7 +106,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -114,7 +114,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -122,7 +122,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -130,7 +130,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -138,7 +138,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -146,7 +146,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -154,7 +154,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -162,7 +162,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -178,7 +178,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -186,7 +186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -194,7 +194,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -202,7 +202,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -210,7 +210,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -218,7 +218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -226,7 +226,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -234,7 +234,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -242,7 +242,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -250,7 +250,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -258,7 +258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -266,7 +266,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -274,7 +274,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -290,7 +290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -330,7 +330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -338,7 +338,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -346,7 +346,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
@ -386,7 +386,7 @@
},
"sprites/blueprints/display.png":
{
"frame": {"x":1597,"y":1562,"w":128,"h":136},
"frame": {"x":1533,"y":1287,"w":128,"h":136},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":8,"y":8,"w":128,"h":136},
@ -418,7 +418,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":123},
@ -434,7 +434,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":143},
@ -442,7 +442,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
@ -450,7 +450,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
@ -458,7 +458,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":150,"y":1182,"w":136,"h":143},
"frame": {"x":3,"y":1454,"w":136,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
@ -506,7 +506,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -514,7 +514,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":142,"h":144},
@ -522,7 +522,7 @@
},
"sprites/blueprints/rotater.png":
{
"frame": {"x":290,"y":1060,"w":143,"h":144},
"frame": {"x":1899,"y":1156,"w":143,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -530,7 +530,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
@ -538,7 +538,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":19,"w":138,"h":125},
@ -586,7 +586,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":32,"w":138,"h":112},
@ -594,7 +594,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":139,"h":112},
@ -602,13 +602,13 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":138,"h":112},
"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},
"rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"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":
{
"frame": {"x":801,"y":1022,"w":144,"h":82},
"frame": {"x":1397,"y":989,"w":144,"h":82},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":62,"w":144,"h":82},
@ -626,7 +666,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":62,"y":62,"w":82,"h":82},
@ -650,7 +690,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":138,"h":135},
@ -658,7 +698,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -666,7 +706,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -746,7 +786,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":123},
@ -762,7 +802,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":143},
@ -770,7 +810,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":132},
@ -778,7 +818,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -786,7 +826,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":290,"y":1347,"w":136,"h":142},
"frame": {"x":546,"y":1396,"w":136,"h":142},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -834,7 +874,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -842,7 +882,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":141,"h":143},
@ -850,7 +890,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":1395,"y":1127,"w":141,"h":143},
"frame": {"x":1665,"y":1346,"w":141,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -858,7 +898,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":141,"h":136},
@ -866,7 +906,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
@ -898,7 +938,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":1101,"y":704,"w":144,"h":144},
"frame": {"x":1397,"y":704,"w":144,"h":144},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -906,7 +946,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":20,"w":137,"h":124},
@ -914,7 +954,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":33,"w":137,"h":111},
@ -922,7 +962,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
@ -930,15 +970,55 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
"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":
{
"frame": {"x":1249,"y":704,"w":144,"h":144},
"frame": {"x":1672,"y":880,"w":144,"h":144},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -946,7 +1026,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -954,7 +1034,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -978,7 +1058,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":137,"h":134},
@ -1034,7 +1114,7 @@
},
"sprites/misc/waypoint.png":
{
"frame": {"x":48,"y":1977,"w":38,"h":48},
"frame": {"x":1997,"y":1643,"w":38,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":38,"h":48},
@ -1106,7 +1186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
@ -1138,7 +1218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":2,"w":47,"h":44},
@ -1146,7 +1226,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":41,"h":48},
@ -1162,7 +1242,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1178,7 +1258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1186,7 +1266,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1194,7 +1274,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1210,7 +1290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1218,7 +1298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1226,7 +1306,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1242,7 +1322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1250,7 +1330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1258,7 +1338,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
@ -1274,7 +1354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1282,7 +1362,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1303,6 +1383,6 @@
"format": "RGBA8888",
"size": {"w":2048,"h":2048},
"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":
{
"frame": {"x":415,"y":463,"w":40,"h":48},
"frame": {"x":96,"y":970,"w":40,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -10,7 +10,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -18,7 +18,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -26,7 +26,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -34,7 +34,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -42,7 +42,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -50,7 +50,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -58,7 +58,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -66,7 +66,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -74,7 +74,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -82,7 +82,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -90,7 +90,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -98,7 +98,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -106,7 +106,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -114,7 +114,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -122,7 +122,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -130,7 +130,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -138,7 +138,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -146,7 +146,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -154,7 +154,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -162,7 +162,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -178,7 +178,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -186,7 +186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -194,7 +194,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -202,7 +202,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -210,7 +210,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -218,7 +218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -226,7 +226,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -234,7 +234,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -242,7 +242,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -250,7 +250,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -258,7 +258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -266,7 +266,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -274,7 +274,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -290,7 +290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -330,7 +330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -338,7 +338,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -346,7 +346,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -386,7 +386,7 @@
},
"sprites/blueprints/display.png":
{
"frame": {"x":106,"y":620,"w":44,"h":46},
"frame": {"x":106,"y":723,"w":44,"h":46},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
@ -410,7 +410,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":42,"h":48},
@ -418,7 +418,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
@ -442,7 +442,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -458,7 +458,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":211,"y":584,"w":47,"h":48},
"frame": {"x":263,"y":597,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -538,7 +538,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
@ -586,7 +586,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
@ -594,7 +594,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -602,13 +602,13 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
"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},
"rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"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":
{
"frame": {"x":315,"y":567,"w":48,"h":28},
"frame": {"x":211,"y":593,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -650,7 +690,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -658,7 +698,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
@ -666,7 +706,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -674,7 +714,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -706,7 +746,7 @@
},
"sprites/buildings/display.png":
{
"frame": {"x":54,"y":628,"w":44,"h":46},
"frame": {"x":54,"y":724,"w":44,"h":46},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
@ -738,7 +778,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":43,"h":48},
@ -746,7 +786,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
@ -762,7 +802,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -770,7 +810,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -778,7 +818,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -786,7 +826,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":313,"y":599,"w":47,"h":48},
"frame": {"x":159,"y":653,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -834,7 +874,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -842,7 +882,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -850,7 +890,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":275,"y":442,"w":48,"h":48},
"frame": {"x":363,"y":463,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -858,7 +898,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -866,7 +906,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -898,7 +938,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":183,"y":471,"w":48,"h":48},
"frame": {"x":460,"y":501,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -906,7 +946,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
@ -914,7 +954,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
@ -922,7 +962,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -930,15 +970,55 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
"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":
{
"frame": {"x":268,"y":494,"w":48,"h":48},
"frame": {"x":3,"y":500,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -946,7 +1026,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -978,7 +1058,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":46},
@ -1162,7 +1242,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1178,7 +1258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1194,7 +1274,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1210,7 +1290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1226,7 +1306,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1242,7 +1322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1258,7 +1338,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1274,7 +1354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1303,6 +1383,6 @@
"format": "RGBA8888",
"size": {"w":512,"h":1024},
"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":
{
"frame": {"x":850,"y":1402,"w":78,"h":96},
"frame": {"x":177,"y":1647,"w":78,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -26,7 +26,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -34,7 +34,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -42,7 +42,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -50,7 +50,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -58,7 +58,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -66,7 +66,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -74,7 +74,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -82,7 +82,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -90,7 +90,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -98,7 +98,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -106,7 +106,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -114,7 +114,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -122,7 +122,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -130,7 +130,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -138,7 +138,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -146,7 +146,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -154,7 +154,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -162,7 +162,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -178,7 +178,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -186,7 +186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -194,7 +194,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -202,7 +202,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -210,7 +210,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -218,7 +218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -226,7 +226,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -234,7 +234,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -242,7 +242,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -250,7 +250,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -258,7 +258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -266,7 +266,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -274,7 +274,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -290,7 +290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -330,7 +330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -338,7 +338,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -346,7 +346,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
@ -386,7 +386,7 @@
},
"sprites/blueprints/display.png":
{
"frame": {"x":560,"y":1399,"w":86,"h":91},
"frame": {"x":367,"y":1459,"w":86,"h":91},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":86,"h":91},
@ -410,7 +410,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":7,"y":0,"w":83,"h":96},
@ -418,7 +418,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":82},
@ -442,7 +442,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
@ -458,7 +458,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":100,"y":1050,"w":92,"h":96},
"frame": {"x":398,"y":1177,"w":92,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -514,7 +514,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
@ -530,7 +530,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
@ -538,7 +538,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":12,"w":93,"h":84},
@ -586,7 +586,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":21,"w":93,"h":75},
@ -594,7 +594,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":94,"h":75},
@ -602,13 +602,13 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":93,"h":75},
"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},
"rotated": false,
@ -616,9 +616,49 @@
"spriteSourceSize": {"x":0,"y":0,"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":
{
"frame": {"x":721,"y":990,"w":96,"h":55},
"frame": {"x":103,"y":874,"w":96,"h":55},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":41,"w":96,"h":55},
@ -650,7 +690,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":93,"h":91},
@ -658,7 +698,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
@ -666,7 +706,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
@ -706,7 +746,7 @@
},
"sprites/buildings/display.png":
{
"frame": {"x":463,"y":1428,"w":84,"h":90},
"frame": {"x":457,"y":1539,"w":84,"h":90},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":84,"h":90},
@ -746,7 +786,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":83},
@ -762,7 +802,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":95},
@ -770,7 +810,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":88},
@ -778,7 +818,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -786,7 +826,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":292,"y":1082,"w":91,"h":95},
"frame": {"x":494,"y":1258,"w":91,"h":95},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -834,7 +874,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -842,7 +882,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
@ -850,7 +890,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":920,"y":1116,"w":95,"h":96},
"frame": {"x":302,"y":1001,"w":95,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -858,7 +898,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":94,"h":91},
@ -866,7 +906,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
@ -898,7 +938,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":729,"y":890,"w":96,"h":96},
"frame": {"x":3,"y":774,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -906,7 +946,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":13,"w":92,"h":83},
@ -914,7 +954,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":22,"w":92,"h":74},
@ -922,7 +962,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -930,15 +970,55 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
"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":
{
"frame": {"x":829,"y":894,"w":96,"h":96},
"frame": {"x":339,"y":803,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -946,7 +1026,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -978,7 +1058,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":92,"h":90},
@ -1162,7 +1242,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1178,7 +1258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1194,7 +1274,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1210,7 +1290,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1226,7 +1306,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1242,7 +1322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1258,7 +1338,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1274,7 +1354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
@ -1303,6 +1383,6 @@
"format": "RGBA8888",
"size": {"w":1024,"h":2048},
"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_exit-tier2.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/buildings/constant_signal.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_exit-tier2.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/wires/lever_on.png</key>
<key type="filename">sprites/wires/sets/color_cross.png</key>
@ -533,6 +535,8 @@
</struct>
<key type="filename">sprites/wires/boolean_false.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>
<struct type="IndividualSpriteSettings">
<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,
constant_signal, logic_gate, lever, filter, wire_tunnel, display;
constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor;
@each $building in $buildings {
[data-icon="building_icons/#{$building}.png"] {

View File

@ -13,7 +13,7 @@ import { round1Digit } from "./utils";
const logger = createLogger("buffers");
const bufferGcDurationSeconds = 10;
const bufferGcDurationSeconds = 5;
export class BufferMaintainer {
/**
@ -27,6 +27,31 @@ export class BufferMaintainer {
this.iterationIndex = 1;
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,
minerSpeedItemsPerSecond: 0, // COMPUTED
defaultItemDiameter: 20,
itemSpacingOnBelts: 0.63,
wiresSpeedItemsPerSecond: 6,

View File

@ -95,5 +95,14 @@ export default {
// Whether to items / s instead of items / m in stats
// 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 */
};

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;
}
/**
* 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
* @returns {Rectangle}
@ -82,28 +61,6 @@ export class Rectangle {
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 {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);
}
/**
* 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
* @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}
*/
toTileCullRectangle() {

View File

@ -1,3 +1,4 @@
import { globalConfig } from "../core/config";
import { DrawParameters } from "../core/draw_parameters";
import { BasicSerializableObject } from "../savegame/serialization";
@ -57,7 +58,22 @@ export class BaseItem extends BasicSerializableObject {
* @param {DrawParameters} parameters
* @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() {
abstract;

View File

@ -1194,9 +1194,13 @@ export class BeltPath extends BasicSerializableObject {
const worldPos = staticComp.localTileToWorld(localPos).toWorldSpaceCenterOfTile();
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
currentItemPos += distanceAndItem[_nextDistance];

View File

@ -92,7 +92,7 @@ export class Blueprint {
parameters.context.globalAlpha = 1;
}
staticComp.drawSpriteOnFullEntityBounds(parameters, staticComp.getBlueprintSprite(), 0, newPos);
staticComp.drawSpriteOnBoundsClipped(parameters, staticComp.getBlueprintSprite(), 0, newPos);
}
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",
or: "or",
transistor: "transistor",
analyzer: "analyzer",
rotater: "rotater",
unstacker: "unstacker",
cutter: "cutter",
shapecompare: "shapecompare",
};
export class LogicGateComponent extends Component {

View File

@ -162,8 +162,9 @@ export class StaticMapEntityComponent extends Component {
* @returns {Vector}
*/
localTileToWorld(localTile) {
const result = this.applyRotationToVector(localTile);
result.addInplace(this.origin);
const result = localTile.rotateFastMultipleOf90(this.rotation);
result.x += this.origin.x;
result.y += this.origin.y;
return result;
}
@ -235,7 +236,7 @@ export class StaticMapEntityComponent extends Component {
* @param {number=} extrudePixels How many pixels to extrude the sprite
* @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) {
return;
}

View File

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

View File

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

View File

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

View File

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

View File

@ -64,11 +64,16 @@ export class HUDWireInfo extends BaseHUDPart {
const network = networks[0];
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) {
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 {
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 { MetaLeverBuilding } from "../../buildings/lever";
import { MetaWireTunnelBuilding } from "../../buildings/wire_tunnel";
import { MetaVirtualProcessorBuilding } from "../../buildings/virtual_processor";
const supportedBuildings = [
MetaWireBuilding,
@ -11,6 +12,7 @@ const supportedBuildings = [
MetaConstantSignalBuilding,
MetaLogicGateBuilding,
MetaLeverBuilding,
MetaVirtualProcessorBuilding,
];
export class HUDWiresToolbar extends HUDBaseToolbar {

View File

@ -2,6 +2,7 @@ import { DrawParameters } from "../../core/draw_parameters";
import { Loader } from "../../core/loader";
import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item";
import { globalConfig } from "../../core/config";
export class BooleanItem extends BaseItem {
static getId() {
@ -46,7 +47,7 @@ export class BooleanItem extends BaseItem {
* @param {number} diameter
* @param {DrawParameters} parameters
*/
drawCentered(x, y, parameters, diameter = 12) {
drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
let sprite;
if (this.value) {
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 { enumColors, enumColorsToHexCode } from "../colors";
import { THEME } from "../theme";
import { drawSpriteClipped } from "../../core/draw_utils";
export class ColorItem extends BaseItem {
static getId() {
@ -54,23 +55,33 @@ export class ColorItem extends BaseItem {
* @param {number} diameter
* @param {DrawParameters} parameters
*/
drawCentered(x, y, parameters, diameter = 12) {
drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
if (!this.bufferGenerator) {
this.bufferGenerator = this.internalGenerateColorBuffer.bind(this);
}
const realDiameter = diameter * 0.6;
const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
const key = diameter + "/" + dpi;
const key = realDiameter + "/" + dpi + "/" + this.color;
const canvas = parameters.root.buffers.getForKey({
key,
subKey: this.color,
w: diameter,
h: diameter,
key: "coloritem",
subKey: key,
w: realDiameter,
h: realDiameter,
dpi,
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 { ShapeDefinition } from "../shape_definition";
import { THEME } from "../theme";
import { globalConfig } from "../../core/config";
export class ShapeItem extends BaseItem {
static getId() {
@ -55,7 +56,7 @@ export class ShapeItem extends BaseItem {
* @param {DrawParameters} parameters
* @param {number=} diameter
*/
drawCentered(x, y, parameters, diameter) {
drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
this.definition.drawCentered(x, y, parameters, diameter);
}
}

View File

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

View File

@ -52,10 +52,16 @@ export class MapChunkView extends MapChunk {
*/
drawForegroundLayer(parameters) {
const systems = this.root.systemMgr.systems;
systems.itemEjector.drawChunk(parameters, this);
systems.itemAcceptor.drawChunk(parameters, this);
systems.miner.drawChunk(parameters, this);
systems.staticMapEntities.drawChunk(parameters, this);
systems.lever.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 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.drawCentered(destX, destY, parameters, destSize);
}
patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
}
}
}
@ -265,5 +269,6 @@ export class MapChunkView extends MapChunk {
const systems = this.root.systemMgr.systems;
systems.wire.drawChunk(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 { MetaWireTunnelBuilding, enumWireTunnelVariants } from "./buildings/wire_tunnel";
import { MetaDisplayBuilding } from "./buildings/display";
import { MetaVirtualProcessorBuilding, enumVirtualProcessorVariants } from "./buildings/virtual_processor";
const logger = createLogger("building_registry");
@ -43,6 +44,7 @@ export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaFilterBuilding);
gMetaBuildingRegistry.register(MetaWireTunnelBuilding);
gMetaBuildingRegistry.register(MetaDisplayBuilding);
gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding);
// Belt
registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0);
@ -121,6 +123,13 @@ export function initMetaBuildingRegistry() {
// Display
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
for (const key in gBuildingVariants) {
gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass(

View File

@ -149,6 +149,8 @@ export class GameRoot {
gameSaved: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got saved
gameRestored: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got restored
gameFrameStarted: /** @type {TypedSignal<[]>} */ (new Signal()), // New frame
storyGoalCompleted: /** @type {TypedSignal<[number, 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 { smoothenDpi } from "../core/dpi_manager";
import { DrawParameters } from "../core/draw_parameters";
import { createLogger } from "../core/logging";
import { Vector } from "../core/vector";
import { BasicSerializableObject, types } from "../savegame/serialization";
import { enumColors, enumColorsToHexCode, enumColorToShortcode, enumShortcodeToColor } from "./colors";
import { THEME } from "./theme";
const rusha = require("rusha");
const logger = createLogger("shape_definition");
/**
* @typedef {{
* subShape: enumSubShape,
@ -90,7 +85,7 @@ export class ShapeDefinition extends BasicSerializableObject {
return errorCode;
}
const definition = ShapeDefinition.fromShortKey(data);
this.layers = definition.layers;
this.layers = /** @type {Array<ShapeLayer>} */ (definition.layers);
}
serialize() {
@ -107,7 +102,8 @@ export class ShapeDefinition extends BasicSerializableObject {
/**
* The layers from bottom to top
* @type {Array<ShapeLayer>} */
* @type {Array<ShapeLayer>}
*/
this.layers = layers;
/** @type {string} */
@ -289,10 +285,10 @@ export class ShapeDefinition extends BasicSerializableObject {
this.bufferGenerator = this.internalGenerateShapeBuffer.bind(this);
}
const key = diameter + "/" + dpi;
const key = diameter + "/" + dpi + "/" + this.cachedHash;
const canvas = parameters.root.buffers.getForKey({
key,
subKey: this.cachedHash,
key: "shapedef",
subKey: key,
w: diameter,
h: diameter,
dpi,

View File

@ -14,7 +14,6 @@ import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view";
import { defaultBuildingVariant } from "../meta_building";
import { getCodeFromBuildingData } from "../building_codes";
import { enumLayer } from "../root";
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) *
globalConfig.itemSpacingOnBelts
);
const contents = chunk.containedEntitiesByLayer[enumLayer.regular];
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
if (entity.components.Belt) {
const direction = entity.components.Belt.direction;
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 { MapChunkView } from "../map_chunk_view";
import { DrawParameters } from "../../core/draw_parameters";
import { enumLayer } from "../root";
export class BeltUnderlaysSystem extends GameSystemWithFilter {
constructor(root) {
@ -29,21 +28,40 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter {
// Limit speed to avoid belts going backwards
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) {
const entity = contents[i];
const underlayComp = entity.components.BeltUnderlays;
if (underlayComp) {
if (!underlayComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
const underlays = underlayComp.underlays;
for (let i = 0; i < underlays.length; ++i) {
const { pos, direction } = underlays[i];
const transformedPos = staticComp.localTileToWorld(pos);
// Culling
if (!chunk.tileSpaceRectangle.containsPoint(transformedPos.x, transformedPos.y)) {
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)];
// SYNC with systems/belt.js:drawSingleEntity!
@ -55,8 +73,8 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter {
drawRotatedSprite({
parameters,
sprite: this.underlayBeltSprites[animationIndex % this.underlayBeltSprites.length],
x: (transformedPos.x + 0.5) * globalConfig.tileSize,
y: (transformedPos.y + 0.5) * globalConfig.tileSize,
x: destX + globalConfig.halfTileSize,
y: destY + globalConfig.halfTileSize,
angle: Math.radians(angle),
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) {
const pinsComp = entity.components.WiredPins;
const network = pinsComp.slots[0].linkedNetwork;
if (!network || !network.currentValue) {
continue;
}
const value = this.getDisplayItem(network.currentValue);
if (!value) {
@ -84,7 +86,7 @@ export class DisplaySystem extends GameSystemWithFilter {
globalConfig.tileSize
);
} else if (value.getItemType() === "shape") {
value.draw(
value.drawItemCenteredClipped(
(origin.x + 0.5) * globalConfig.tileSize,
(origin.y + 0.5) * globalConfig.tileSize,
parameters,

View File

@ -5,6 +5,14 @@ import { T } from "../../translations";
import { HubComponent } from "../components/hub";
import { Entity } from "../entity";
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 {
constructor(root) {
@ -13,8 +21,13 @@ export class HubSystem extends GameSystemWithFilter {
this.hubSprite = Loader.getSprite("sprites/buildings/hub.png");
}
/**
* @param {DrawParameters} 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() {
@ -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) {
const context = parameters.context;
const staticComp = entity.components.StaticMapEntity;
redrawHubBaseTexture(canvas, context, w, h, dpi) {
// This method is quite ugly, please ignore it!
if (!staticComp.shouldBeDrawn(parameters)) {
return;
}
context.scale(dpi, dpi);
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
staticComp.drawSpriteOnFullEntityBounds(parameters, this.hubSprite, 2.2);
context.clearRect(0, 0, w, h);
this.hubSprite.draw(context, 0, 0, w, h);
const definition = this.root.hubGoals.currentGoal.definition;
definition.drawCentered(pos.x - 25, pos.y - 10, parameters, 40);
definition.drawCentered(45, 58, parameters, 36);
const goals = this.root.hubGoals.currentGoal;
const textOffsetX = 2;
const textOffsetY = -6;
const textOffsetX = 70;
const textOffsetY = 61;
// Deliver count
const delivered = this.root.hubGoals.getCurrentGoalDelivered();
const deliveredText = "" + formatBigNumber(delivered);
if (delivered > 9999) {
context.font = "bold 16px GameFont";
@ -66,52 +86,87 @@ export class HubSystem extends GameSystemWithFilter {
}
context.fillStyle = "#64666e";
context.textAlign = "left";
context.fillText("" + formatBigNumber(delivered), pos.x + textOffsetX, pos.y + textOffsetY);
context.fillText(deliveredText, textOffsetX, textOffsetY);
// Required
context.font = "13px GameFont";
context.fillStyle = "#a4a6b0";
context.fillText(
"/ " + formatBigNumber(goals.required),
pos.x + textOffsetX,
pos.y + textOffsetY + 13
);
context.fillText("/ " + formatBigNumber(goals.required), textOffsetX, textOffsetY + 13);
// Reward
const rewardText = T.storyRewards[goals.reward].title.toUpperCase();
if (rewardText.length > 12) {
context.font = "bold 9px GameFont";
context.font = "bold 8px GameFont";
} else {
context.font = "bold 11px GameFont";
context.font = "bold 10px GameFont";
}
context.fillStyle = "#fd0752";
context.textAlign = "center";
context.fillText(rewardText, pos.x, pos.y + 46);
context.fillText(rewardText, HUB_SIZE_PIXELS / 2, 105);
// Level
context.font = "bold 11px GameFont";
// Level "8"
context.font = "bold 10px GameFont";
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.fillStyle = "#fff";
context.font = "bold 7px GameFont";
context.fillText(T.buildings.hub.levelShortcut, pos.x - 42, pos.y - 47);
context.font = "bold 6px GameFont";
context.fillText(T.buildings.hub.levelShortcut, 27, 22);
// "Deliver"
context.fillStyle = "#64666e";
context.font = "bold 11px GameFont";
context.fillText(T.buildings.hub.deliver.toUpperCase(), pos.x, pos.y - 40);
context.font = "bold 10px GameFont";
context.fillText(T.buildings.hub.deliver.toUpperCase(), HUB_SIZE_PIXELS / 2, 30);
// "To unlock"
const unlockText = T.buildings.hub.toUnlock.toUpperCase();
if (unlockText.length > 15) {
context.font = "bold 8px GameFont";
} 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";
}
/**
* @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 { enumDirectionToVector } from "../../core/vector";
import { ItemAcceptorComponent } from "../components/item_acceptor";
import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view";
export class ItemAcceptorSystem extends GameSystemWithFilter {
constructor(root) {
@ -38,43 +38,45 @@ export class ItemAcceptorSystem extends GameSystemWithFilter {
}
/**
* Draws the acceptor items
* @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawEntityRegularLayer.bind(this));
}
/**
* @param {DrawParameters} parameters
* @param {Entity} entity
*/
drawEntityRegularLayer(parameters, entity) {
const staticComp = entity.components.StaticMapEntity;
drawChunk(parameters, chunk) {
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const acceptorComp = entity.components.ItemAcceptor;
if (!staticComp.shouldBeDrawn(parameters)) {
return;
if (!acceptorComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
for (let animIndex = 0; animIndex < acceptorComp.itemConsumptionAnimations.length; ++animIndex) {
const { item, slotIndex, animProgress, direction } = acceptorComp.itemConsumptionAnimations[
animIndex
];
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 finalTile = slotWorldPos.subScalars(
const finalTile = realSlotPos.subScalars(
fadeOutDirection.x * (animProgress / 2 - 0.5),
fadeOutDirection.y * (animProgress / 2 - 0.5)
);
item.drawCentered(
item.drawItemCenteredClipped(
(finalTile.x + 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 { GameSystemWithFilter } from "../game_system_with_filter";
import { enumItemProcessorTypes } from "../components/item_processor";
import { MapChunkView } from "../map_chunk_view";
const logger = createLogger("systems/ejector");
@ -336,25 +337,21 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
}
/**
* Draws everything
* @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this));
}
drawChunk(parameters, chunk) {
const contents = chunk.containedEntitiesByLayer.regular;
/**
* @param {DrawParameters} parameters
* @param {Entity} entity
*/
drawSingleEntity(parameters, entity) {
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const ejectorComp = entity.components.ItemEjector;
const staticComp = entity.components.StaticMapEntity;
if (!staticComp.shouldBeDrawn(parameters)) {
return;
if (!ejectorComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
for (let i = 0; i < ejectorComp.slots.length; ++i) {
const slot = ejectorComp.slots[i];
const ejectedItem = slot.item;
@ -364,22 +361,28 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
continue;
}
const realPosition = slot.pos.rotateFastMultipleOf90(staticComp.rotation);
const realDirection = Vector.transformDirectionFromMultipleOf90(
slot.direction,
staticComp.rotation
);
const realPosition = staticComp.localTileToWorld(slot.pos);
if (!chunk.tileSpaceRectangle.containsPoint(realPosition.x, realPosition.y)) {
// Not within this chunk
continue;
}
const realDirection = staticComp.localDirectionToWorld(slot.direction);
const realDirectionVector = enumDirectionToVector[realDirection];
const tileX =
staticComp.origin.x + realPosition.x + 0.5 + realDirectionVector.x * 0.5 * slot.progress;
const tileY =
staticComp.origin.y + realPosition.y + 0.5 + realDirectionVector.y * 0.5 * slot.progress;
const tileX = realPosition.x + 0.5 + realDirectionVector.x * 0.5 * slot.progress;
const tileY = realPosition.y + 0.5 + realDirectionVector.y * 0.5 * slot.progress;
const worldX = tileX * 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;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
if (entity && entity.components.Lever) {
const sprite = entity.components.Lever.toggled ? this.spriteOn : this.spriteOff;
const leverComp = entity.components.Lever;
if (leverComp) {
const sprite = leverComp.toggled ? this.spriteOn : this.spriteOff;
const origin = entity.components.StaticMapEntity.origin;
sprite.drawCached(
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 { enumColors } from "../colors";
import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
import { enumPinSlotType } from "../components/wired_pins";
import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON, BooleanItem } from "../items/boolean_item";
import { enumItemProcessorTypes } from "../components/item_processor";
import { GameSystemWithFilter } from "../game_system_with_filter";
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 {
constructor(root) {
@ -15,6 +18,12 @@ export class LogicGateSystem extends GameSystemWithFilter {
[enumLogicGateType.xor]: this.compute_XOR.bind(this),
[enumLogicGateType.or]: this.compute_OR.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);
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
assert(
slotValues.length === slotComp.slots.length - 1,
"Bad slot config, should have N acceptor slots and 1 ejector"
);
assert(slotComp.slots[0].type === enumPinSlotType.logicalEjector, "Slot 0 should be ejector");
slotComp.slots[0].value = result;
}
}
}
/**
* @param {Array<BaseItem|null>} parameters
@ -177,4 +196,131 @@ export class LogicGateSystem extends GameSystemWithFilter {
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) {
const basicChunkBackground = this.root.buffers.getForKey({
key: "chunkres",
key: "mapresourcebg",
subKey: chunk.renderKey,
w: globalConfig.mapChunkSize,
h: globalConfig.mapChunkSize,
@ -42,10 +42,9 @@ export class MapResourcesSystem extends GameSystem {
const patch = chunk.patches[i];
const destX = chunk.x * globalConfig.mapChunkWorldSize + patch.pos.x * globalConfig.tileSize;
const destY = chunk.y * globalConfig.mapChunkWorldSize + patch.pos.y * globalConfig.tileSize;
const destSize = Math.min(80, 40 / parameters.zoomLevel);
if (parameters.visibleRect.containsCircle(destX, destY, destSize / 2)) {
patch.item.drawCentered(destX, destY, parameters, destSize);
}
const diameter = Math.min(80, 40 / parameters.zoomLevel);
patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
}
} else {
// HIGH QUALITY: Draw all items
@ -61,9 +60,12 @@ export class MapResourcesSystem extends GameSystem {
const destX = worldX + globalConfig.halfTileSize;
const destY = worldY + globalConfig.halfTileSize;
if (parameters.visibleRect.containsCircle(destX, destY, globalConfig.tileSize / 2)) {
lowerItem.drawCentered(destX, destY, parameters);
}
lowerItem.drawItemCenteredClipped(
destX,
destY,
parameters,
globalConfig.defaultItemDiameter
);
}
}
}

View File

@ -102,41 +102,39 @@ export class MinerSystem extends GameSystemWithFilter {
* @param {MapChunkView} chunk
*/
drawChunk(parameters, chunk) {
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];
const contents = chunk.containedEntitiesByLayer.regular;
if (entity && entity.components.Miner) {
const staticComp = entity.components.StaticMapEntity;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const minerComp = entity.components.Miner;
if (!staticComp.shouldBeDrawn(parameters)) {
if (!minerComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
if (!minerComp.cachedMinedItem) {
continue;
}
if (minerComp.cachedMinedItem) {
// Draw the item background - this is to hide the ejected item animation from
// the item ejecto
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.fillRect(
staticComp.origin.x * globalConfig.tileSize + padding,
staticComp.origin.y * globalConfig.tileSize + padding,
globalConfig.tileSize - 2 * padding,
globalConfig.tileSize - 2 * padding
);
parameters.context.fillRect(destX, destY, dimensions, dimensions);
}
if (minerComp.cachedMinedItem) {
minerComp.cachedMinedItem.drawCentered(
minerComp.cachedMinedItem.drawItemCenteredClipped(
(0.5 + staticComp.origin.x) * 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 {
constructor(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;
}
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 sprite = staticComp.getSprite();
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();
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 { StorageComponent } from "../components/storage";
import { Entity } from "../entity";
import { DrawParameters } from "../../core/draw_parameters";
import { formatBigNumber, lerp } from "../../core/utils";
import { Loader } from "../../core/loader";
import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "../items/boolean_item";
import { MapChunkView } from "../map_chunk_view";
export class StorageSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [StorageComponent]);
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() {
@ -43,38 +55,46 @@ export class StorageSystem extends GameSystemWithFilter {
}
}
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this));
}
/**
* @param {DrawParameters} parameters
* @param {Entity} entity
* @param {MapChunkView} chunk
*/
drawEntity(parameters, entity) {
const context = parameters.context;
const staticComp = entity.components.StaticMapEntity;
if (!staticComp.shouldBeDrawn(parameters)) {
return;
drawChunk(parameters, chunk) {
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const storageComp = entity.components.Storage;
if (!storageComp) {
continue;
}
const storageComp = entity.components.Storage;
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;
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);
if (parameters.visibleRect.containsCircle(center.x, center.y + 25, 20)) {
context.font = "bold 10px GameFont";
context.textAlign = "center";
context.fillStyle = "#64666e";
context.fillText(formatBigNumber(storageComp.storedCount), center.x, center.y + 25.5);
context.textAlign = "left";
}
context.globalAlpha = 1;
}
}

View File

@ -317,7 +317,9 @@ export class WireSystem extends GameSystemWithFilter {
if (
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);
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);
const staticComp = entity.components.StaticMapEntity;
parameters.context.globalAlpha = opacity;
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 0);
staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 0);
parameters.context.globalAlpha = 1;
if (G_IS_DEV && globalConfig.debug.renderWireRotations) {

View File

@ -1,13 +1,13 @@
import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters";
import { drawRotatedSprite } from "../../core/draw_utils";
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 { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
import { STOP_PROPAGATION } from "../../core/signal";
import { drawRotatedSprite } from "../../core/draw_utils";
import { GLOBAL_APP } from "../../core/globals";
import { MapChunkView } from "../map_chunk_view";
export class WiredPinsSystem extends GameSystemWithFilter {
constructor(root) {
@ -146,28 +146,41 @@ export class WiredPinsSystem extends GameSystemWithFilter {
// TODO
}
/**
* Draws the pins
* @param {DrawParameters} parameters
*/
draw(parameters) {
this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this));
}
/**
* Draws a given entity
* @param {DrawParameters} parameters
* @param {Entity} entity
* @param {MapChunkView} chunk
*/
drawSingleEntity(parameters, entity) {
const staticComp = entity.components.StaticMapEntity;
const slots = entity.components.WiredPins.slots;
drawChunk(parameters, chunk) {
const contents = chunk.containedEntities;
for (let i = 0; i < slots.length; ++i) {
const slot = slots[i];
for (let i = 0; i < contents.length; ++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);
if (!chunk.tileSpaceRectangle.containsPoint(tile.x, tile.y)) {
// Doesn't belong to this chunk
continue;
}
const worldPos = tile.toWorldSpaceCenterOfTile();
// Culling
if (
!parameters.visibleRect.containsCircle(worldPos.x, worldPos.y, globalConfig.halfTileSize)
) {
continue;
}
const effectiveRotation = Math.radians(
staticComp.rotation + enumDirectionToAngle[slot.direction]
);
@ -189,7 +202,12 @@ export class WiredPinsSystem extends GameSystemWithFilter {
const value = slot.value;
if (value) {
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
@ -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!
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]
@ -296,6 +297,7 @@ ingame:
copySelection: Kopieren
clearSelection: Auswahl aufheben
pipette: Pipette
switchLayers: Ebenen wechseln
# Names of the colors, used for the color blind mode
@ -832,7 +834,6 @@ keybindings:
Modifikator: stattdessen gegen den UZS rotieren
cycleBuildingVariants: Variante wählen
confirmMassDelete: Massenlöschung bestätigen
pasteLastBlueprint: Letzte Blaupause einfügen
cycleBuildings: Gebäude rotieren
lockBeltDirection: Bandplaner aktivieren
switchDirectionLockSide: >-
@ -846,8 +847,10 @@ keybindings:
placementDisableAutoOrientation: Automatische Orientierung deaktivieren
placeMultiple: Im Platziermodus bleiben
placeInverse: Automatische Förderbandorientierung invertieren
advanced_processor: Farbnivertierer
pasteLastBlueprint: Letzte Blaupause einfügen
advanced_processor: Farbinvertierer
energy_generator: Energiegenerator
wire: Energiekabel
about:
title: Über dieses Spiel

View File

@ -591,6 +591,27 @@ buildings:
# 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.
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:
# Those are the rewards gained from completing the store
reward_cutter_and_trash: