Fix buildings not working at their advertised speed, closes #440, closes #442, closes #437, closes #449

This commit is contained in:
tobspr 2020-08-29 22:35:30 +02:00
parent 12892dcf54
commit 78fe34840a
17 changed files with 750 additions and 806 deletions

View File

@ -10,7 +10,7 @@
},
"sprites/belt/built/forward_1.png":
{
"frame": {"x":1814,"y":1070,"w":116,"h":144},
"frame": {"x":1815,"y":1070,"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":430,"y":1334,"w":116,"h":144},
"frame": {"x":1802,"y":1366,"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":426,"y":1482,"w":116,"h":144},
"frame": {"x":1922,"y":1405,"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":3,"y":1884,"w":116,"h":144},
"frame": {"x":1796,"y":1514,"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":123,"y":1884,"w":116,"h":144},
"frame": {"x":1796,"y":1662,"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":424,"y":1630,"w":116,"h":144},
"frame": {"x":1916,"y":1693,"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":243,"y":1881,"w":116,"h":144},
"frame": {"x":1795,"y":1810,"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":363,"y":1881,"w":116,"h":144},
"frame": {"x":145,"y":1887,"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":483,"y":1778,"w":116,"h":144},
"frame": {"x":265,"y":1887,"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":1545,"y":1139,"w":116,"h":144},
"frame": {"x":1537,"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":1812,"y":1218,"w":116,"h":144},
"frame": {"x":1804,"y":1218,"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":433,"y":1038,"w":116,"h":144},
"frame": {"x":1924,"y":1257,"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":431,"y":1186,"w":116,"h":144},
"frame": {"x":439,"y":1038,"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":151,"y":1035,"w":130,"h":130},
"frame": {"x":961,"y":1033,"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":151,"y":1169,"w":130,"h":130},
"frame": {"x":1523,"y":1287,"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":148,"y":1571,"w":130,"h":130},
"frame": {"x":137,"y":1700,"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":146,"y":1705,"w":130,"h":130},
"frame": {"x":271,"y":1700,"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":687,"y":1584,"w":130,"h":130},
"frame": {"x":545,"y":1736,"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":821,"y":1584,"w":130,"h":130},
"frame": {"x":927,"y":1578,"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":904,"y":1864,"w":130,"h":130},
"frame": {"x":786,"y":1649,"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":1003,"y":1704,"w":130,"h":130},
"frame": {"x":645,"y":1887,"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":1087,"y":1508,"w":130,"h":130},
"frame": {"x":779,"y":1887,"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":1038,"y":1838,"w":130,"h":130},
"frame": {"x":913,"y":1887,"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":960,"y":1033,"w":130,"h":130},
"frame": {"x":1519,"y":1421,"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":960,"y":1167,"w":130,"h":130},
"frame": {"x":1519,"y":1555,"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":151,"y":1303,"w":130,"h":130},
"frame": {"x":1915,"y":1841,"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":149,"y":1437,"w":130,"h":130},
"frame": {"x":3,"y":1700,"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":1137,"y":1642,"w":130,"h":130},
"frame": {"x":1047,"y":1887,"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":1221,"y":1508,"w":130,"h":130},
"frame": {"x":1181,"y":1887,"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":1803,"y":1428,"w":130,"h":130},
"frame": {"x":920,"y":1712,"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":1623,"y":1461,"w":130,"h":130},
"frame": {"x":1054,"y":1735,"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":1489,"y":1555,"w":130,"h":130},
"frame": {"x":1188,"y":1735,"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":1271,"y":1670,"w":130,"h":130},
"frame": {"x":1322,"y":1703,"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":1172,"y":1804,"w":130,"h":130},
"frame": {"x":405,"y":1315,"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":1306,"y":1804,"w":130,"h":130},
"frame": {"x":405,"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":1757,"y":1562,"w":130,"h":130},
"frame": {"x":405,"y":1583,"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":1623,"y":1595,"w":130,"h":130},
"frame": {"x":3,"y":1182,"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":1528,"y":1287,"w":130,"h":130},
"frame": {"x":1315,"y":1887,"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":1355,"y":1402,"w":130,"h":130},
"frame": {"x":1449,"y":1887,"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":1489,"y":1421,"w":130,"h":130},
"frame": {"x":1583,"y":1887,"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":1355,"y":1536,"w":130,"h":130},
"frame": {"x":1061,"y":1601,"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":1891,"y":1562,"w":130,"h":130},
"frame": {"x":137,"y":1182,"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":1440,"y":1689,"w":130,"h":130},
"frame": {"x":271,"y":1182,"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":603,"y":1720,"w":116,"h":144},
"frame": {"x":385,"y":1887,"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":955,"y":1564,"w":128,"h":136},
"frame": {"x":1916,"y":1553,"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":1249,"y":989,"w":144,"h":123},
"frame": {"x":1249,"y":996,"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":290,"y":890,"w":144,"h":143},
"frame": {"x":291,"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":1249,"y":852,"w":144,"h":133},
"frame": {"x":1397,"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":624,"y":1868,"w":136,"h":143},
"frame": {"x":151,"y":1035,"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":723,"y":1718,"w":136,"h":143},
"frame": {"x":1513,"y":1689,"w":136,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
@ -506,15 +506,15 @@
},
"sprites/blueprints/reader.png":
{
"frame": {"x":1241,"y":1253,"w":142,"h":144},
"frame": {"x":1086,"y":1313,"w":141,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":142,"h":144},
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/rotater-ccw.png":
{
"frame": {"x":1665,"y":1198,"w":143,"h":144},
"frame": {"x":1243,"y":1123,"w":143,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -522,7 +522,7 @@
},
"sprites/blueprints/rotater-fl.png":
{
"frame": {"x":560,"y":1036,"w":142,"h":144},
"frame": {"x":940,"y":1167,"w":142,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":142,"h":144},
@ -530,7 +530,7 @@
},
"sprites/blueprints/rotater.png":
{
"frame": {"x":813,"y":1033,"w":143,"h":144},
"frame": {"x":1390,"y":1126,"w":143,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
@ -538,7 +538,7 @@
},
"sprites/blueprints/splitter-compact-inverse.png":
{
"frame": {"x":285,"y":1182,"w":142,"h":138},
"frame": {"x":791,"y":1254,"w":142,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
@ -546,7 +546,7 @@
},
"sprites/blueprints/splitter-compact-merge-inverse.png":
{
"frame": {"x":3,"y":1326,"w":142,"h":138},
"frame": {"x":1086,"y":1171,"w":142,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
@ -554,7 +554,7 @@
},
"sprites/blueprints/splitter-compact-merge.png":
{
"frame": {"x":551,"y":1324,"w":139,"h":138},
"frame": {"x":1376,"y":1421,"w":139,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
@ -562,7 +562,7 @@
},
"sprites/blueprints/splitter-compact.png":
{
"frame": {"x":283,"y":1472,"w":139,"h":138},
"frame": {"x":1227,"y":1558,"w":139,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
@ -602,7 +602,7 @@
},
"sprites/blueprints/underground_belt_entry-tier2.png":
{
"frame": {"x":3,"y":1755,"w":138,"h":125},
"frame": {"x":405,"y":1186,"w":138,"h":125},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":19,"w":138,"h":125},
@ -610,7 +610,7 @@
},
"sprites/blueprints/underground_belt_entry.png":
{
"frame": {"x":893,"y":1448,"w":138,"h":112},
"frame": {"x":3,"y":1836,"w":138,"h":112},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":32,"w":138,"h":112},
@ -618,7 +618,7 @@
},
"sprites/blueprints/underground_belt_exit-tier2.png":
{
"frame": {"x":550,"y":1466,"w":139,"h":112},
"frame": {"x":1653,"y":1632,"w":139,"h":112},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":139,"h":112},
@ -626,7 +626,7 @@
},
"sprites/blueprints/underground_belt_exit.png":
{
"frame": {"x":739,"y":1468,"w":138,"h":112},
"frame": {"x":645,"y":1377,"w":138,"h":112},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":138,"h":112},
@ -642,7 +642,7 @@
},
"sprites/blueprints/virtual_processor-rotater.png":
{
"frame": {"x":438,"y":890,"w":118,"h":144},
"frame": {"x":1545,"y":991,"w":118,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":118,"h":144},
@ -650,7 +650,7 @@
},
"sprites/blueprints/virtual_processor-shapecompare.png":
{
"frame": {"x":1397,"y":852,"w":144,"h":133},
"frame": {"x":1397,"y":989,"w":144,"h":133},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
@ -666,7 +666,7 @@
},
"sprites/blueprints/virtual_processor.png":
{
"frame": {"x":285,"y":1037,"w":144,"h":141},
"frame": {"x":291,"y":1037,"w":144,"h":141},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":144,"h":141},
@ -682,7 +682,7 @@
},
"sprites/blueprints/wire-split.png":
{
"frame": {"x":1397,"y":989,"w":144,"h":82},
"frame": {"x":1098,"y":1000,"w":144,"h":82},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":62,"w":144,"h":82},
@ -690,7 +690,7 @@
},
"sprites/blueprints/wire-turn.png":
{
"frame": {"x":1932,"y":1257,"w":82,"h":82},
"frame": {"x":707,"y":1036,"w":82,"h":82},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":62,"y":62,"w":82,"h":82},
@ -706,15 +706,15 @@
},
"sprites/blueprints/wire_tunnel-coating.png":
{
"frame": {"x":255,"y":677,"w":33,"h":135},
"frame": {"x":255,"y":677,"w":33,"h":134},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":55,"y":4,"w":33,"h":135},
"spriteSourceSize": {"x":56,"y":5,"w":33,"h":134},
"sourceSize": {"w":144,"h":144}
},
"sprites/blueprints/wire_tunnel.png":
{
"frame": {"x":282,"y":1614,"w":138,"h":135},
"frame": {"x":1653,"y":1748,"w":138,"h":135},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":138,"h":135},
@ -722,7 +722,7 @@
},
"sprites/buildings/belt_left.png":
{
"frame": {"x":151,"y":1035,"w":130,"h":130},
"frame": {"x":961,"y":1033,"w":130,"h":130},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
@ -730,7 +730,7 @@
},
"sprites/buildings/belt_right.png":
{
"frame": {"x":1137,"y":1642,"w":130,"h":130},
"frame": {"x":1047,"y":1887,"w":130,"h":130},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
@ -810,7 +810,7 @@
},
"sprites/buildings/logic_gate-or.png":
{
"frame": {"x":1388,"y":1160,"w":143,"h":123},
"frame": {"x":559,"y":1173,"w":143,"h":123},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":123},
@ -826,7 +826,7 @@
},
"sprites/buildings/logic_gate-xor.png":
{
"frame": {"x":1094,"y":1085,"w":143,"h":143},
"frame": {"x":1657,"y":1198,"w":143,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":143},
@ -834,7 +834,7 @@
},
"sprites/buildings/logic_gate.png":
{
"frame": {"x":1094,"y":1232,"w":143,"h":132},
"frame": {"x":793,"y":1118,"w":143,"h":132},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":132},
@ -842,7 +842,7 @@
},
"sprites/buildings/miner-chainable.png":
{
"frame": {"x":764,"y":1865,"w":136,"h":142},
"frame": {"x":505,"y":1887,"w":136,"h":142},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -850,7 +850,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":863,"y":1718,"w":136,"h":142},
"frame": {"x":405,"y":1736,"w":136,"h":142},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
@ -898,7 +898,7 @@
},
"sprites/buildings/reader.png":
{
"frame": {"x":285,"y":1324,"w":141,"h":144},
"frame": {"x":937,"y":1315,"w":141,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
@ -906,7 +906,7 @@
},
"sprites/buildings/rotater-ccw.png":
{
"frame": {"x":3,"y":1468,"w":141,"h":143},
"frame": {"x":1378,"y":1274,"w":141,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -914,7 +914,7 @@
},
"sprites/buildings/rotater-fl.png":
{
"frame": {"x":791,"y":1181,"w":141,"h":143},
"frame": {"x":1231,"y":1411,"w":141,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":141,"h":143},
@ -922,7 +922,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":936,"y":1301,"w":141,"h":143},
"frame": {"x":1657,"y":1345,"w":141,"h":143},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
@ -930,7 +930,7 @@
},
"sprites/buildings/splitter-compact-inverse.png":
{
"frame": {"x":1081,"y":1368,"w":141,"h":136},
"frame": {"x":1082,"y":1461,"w":141,"h":136},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":141,"h":136},
@ -938,7 +938,7 @@
},
"sprites/buildings/splitter-compact-merge-inverse.png":
{
"frame": {"x":553,"y":1184,"w":142,"h":136},
"frame": {"x":1232,"y":1271,"w":142,"h":136},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":142,"h":136},
@ -946,7 +946,7 @@
},
"sprites/buildings/splitter-compact-merge.png":
{
"frame": {"x":3,"y":1615,"w":139,"h":136},
"frame": {"x":1653,"y":1492,"w":139,"h":136},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
@ -954,7 +954,7 @@
},
"sprites/buildings/splitter-compact.png":
{
"frame": {"x":750,"y":1328,"w":139,"h":136},
"frame": {"x":1370,"y":1563,"w":139,"h":136},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
@ -994,7 +994,7 @@
},
"sprites/buildings/underground_belt_entry-tier2.png":
{
"frame": {"x":280,"y":1753,"w":137,"h":124},
"frame": {"x":645,"y":1493,"w":137,"h":124},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":20,"w":137,"h":124},
@ -1002,7 +1002,7 @@
},
"sprites/buildings/underground_belt_entry.png":
{
"frame": {"x":483,"y":1926,"w":137,"h":111},
"frame": {"x":928,"y":1463,"w":137,"h":111},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":33,"w":137,"h":111},
@ -1010,7 +1010,7 @@
},
"sprites/buildings/underground_belt_exit-tier2.png":
{
"frame": {"x":1387,"y":1287,"w":137,"h":111},
"frame": {"x":786,"y":1534,"w":137,"h":111},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
@ -1018,7 +1018,7 @@
},
"sprites/buildings/underground_belt_exit.png":
{
"frame": {"x":1662,"y":1346,"w":137,"h":111},
"frame": {"x":645,"y":1621,"w":137,"h":111},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
@ -1034,7 +1034,7 @@
},
"sprites/buildings/virtual_processor-rotater.png":
{
"frame": {"x":1545,"y":991,"w":117,"h":144},
"frame": {"x":439,"y":890,"w":117,"h":144},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":117,"h":144},
@ -1042,7 +1042,7 @@
},
"sprites/buildings/virtual_processor-shapecompare.png":
{
"frame": {"x":1241,"y":1116,"w":143,"h":133},
"frame": {"x":560,"y":1036,"w":143,"h":133},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":143,"h":133},
@ -1058,7 +1058,7 @@
},
"sprites/buildings/virtual_processor.png":
{
"frame": {"x":3,"y":1182,"w":144,"h":140},
"frame": {"x":1249,"y":852,"w":144,"h":140},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":144,"h":140},
@ -1074,7 +1074,7 @@
},
"sprites/buildings/wire-split.png":
{
"frame": {"x":1098,"y":1000,"w":144,"h":81},
"frame": {"x":1667,"y":1028,"w":144,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1098,15 +1098,15 @@
},
"sprites/buildings/wire_tunnel-coating.png":
{
"frame": {"x":255,"y":816,"w":31,"h":134},
"frame": {"x":255,"y":815,"w":32,"h":134},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":56,"y":5,"w":31,"h":134},
"spriteSourceSize": {"x":56,"y":5,"w":32,"h":134},
"sourceSize": {"w":144,"h":144}
},
"sprites/buildings/wire_tunnel.png":
{
"frame": {"x":546,"y":1582,"w":137,"h":134},
"frame": {"x":787,"y":1396,"w":137,"h":134},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":137,"h":134},
@ -1138,7 +1138,7 @@
},
"sprites/misc/processor_disabled.png":
{
"frame": {"x":699,"y":1206,"w":78,"h":81},
"frame": {"x":3,"y":1958,"w":78,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":10,"y":10,"w":78,"h":81},
@ -1178,7 +1178,7 @@
},
"sprites/misc/storage_overlay.png":
{
"frame": {"x":1934,"y":1209,"w":89,"h":44},
"frame": {"x":1935,"y":1209,"w":89,"h":44},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":89,"h":44},
@ -1186,7 +1186,7 @@
},
"sprites/misc/waypoint.png":
{
"frame": {"x":893,"y":1328,"w":38,"h":48},
"frame": {"x":292,"y":1834,"w":38,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":38,"h":48},
@ -1194,7 +1194,7 @@
},
"sprites/wires/boolean_false.png":
{
"frame": {"x":255,"y":954,"w":31,"h":41},
"frame": {"x":255,"y":953,"w":31,"h":41},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":5,"w":31,"h":41},
@ -1250,7 +1250,7 @@
},
"sprites/wires/display/white.png":
{
"frame": {"x":699,"y":1291,"w":47,"h":47},
"frame": {"x":145,"y":1836,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
@ -1258,7 +1258,7 @@
},
"sprites/wires/display/yellow.png":
{
"frame": {"x":694,"y":1342,"w":47,"h":47},
"frame": {"x":196,"y":1836,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
@ -1290,7 +1290,7 @@
},
"sprites/wires/network_conflict.png":
{
"frame": {"x":694,"y":1393,"w":47,"h":44},
"frame": {"x":85,"y":1952,"w":47,"h":44},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":2,"w":47,"h":44},
@ -1298,7 +1298,7 @@
},
"sprites/wires/network_empty.png":
{
"frame": {"x":694,"y":1441,"w":41,"h":48},
"frame": {"x":247,"y":1834,"w":41,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":41,"h":48},
@ -1306,7 +1306,7 @@
},
"sprites/wires/overlay_tile.png":
{
"frame": {"x":1934,"y":1109,"w":96,"h":96},
"frame": {"x":1935,"y":1109,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -1330,7 +1330,7 @@
},
"sprites/wires/sets/color_split.png":
{
"frame": {"x":1397,"y":1075,"w":144,"h":81},
"frame": {"x":1667,"y":1113,"w":144,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1338,7 +1338,7 @@
},
"sprites/wires/sets/color_turn.png":
{
"frame": {"x":1932,"y":1343,"w":81,"h":81},
"frame": {"x":707,"y":1122,"w":81,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1362,7 +1362,7 @@
},
"sprites/wires/sets/conflict_split.png":
{
"frame": {"x":1666,"y":1028,"w":144,"h":81},
"frame": {"x":813,"y":1033,"w":144,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1370,7 +1370,7 @@
},
"sprites/wires/sets/conflict_turn.png":
{
"frame": {"x":706,"y":1036,"w":81,"h":81},
"frame": {"x":706,"y":1207,"w":81,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1394,7 +1394,7 @@
},
"sprites/wires/sets/regular_split.png":
{
"frame": {"x":1098,"y":1000,"w":144,"h":81},
"frame": {"x":1667,"y":1028,"w":144,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1426,7 +1426,7 @@
},
"sprites/wires/sets/shape_split.png":
{
"frame": {"x":1666,"y":1113,"w":144,"h":81},
"frame": {"x":1095,"y":1086,"w":144,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
@ -1434,7 +1434,7 @@
},
"sprites/wires/sets/shape_turn.png":
{
"frame": {"x":706,"y":1121,"w":81,"h":81},
"frame": {"x":706,"y":1292,"w":81,"h":81},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
@ -1455,6 +1455,6 @@
"format": "RGBA8888",
"size": {"w":2048,"h":2048},
"scale": "0.75",
"smartupdate": "$TexturePacker:SmartUpdate:276f2044dea94b0977ef8f929d93d3db:fe07471c4d8352b4586f9103e9e8f916:908b89f5ca8ff73e331a35a3b14d0604$"
"smartupdate": "$TexturePacker:SmartUpdate:26af492934beffa75e19b73e6d9eba56:d408ec7454e52a9384f80985bf14db9c:908b89f5ca8ff73e331a35a3b14d0604$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@ -10,7 +10,7 @@
},
"sprites/belt/built/forward_1.png":
{
"frame": {"x":405,"y":817,"w":40,"h":48},
"frame": {"x":3,"y":939,"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":930,"w":40,"h":48},
"frame": {"x":179,"y":969,"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":95,"y":960,"w":40,"h":48},
"frame": {"x":407,"y":864,"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":139,"y":960,"w":40,"h":48},
"frame": {"x":352,"y":869,"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":183,"y":954,"w":40,"h":48},
"frame": {"x":300,"y":883,"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":449,"y":823,"w":40,"h":48},
"frame": {"x":249,"y":893,"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":400,"y":869,"w":40,"h":48},
"frame": {"x":451,"y":864,"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":352,"y":913,"w":40,"h":48},
"frame": {"x":223,"y":945,"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":300,"y":925,"w":40,"h":48},
"frame": {"x":267,"y":945,"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":201,"y":901,"w":40,"h":48},
"frame": {"x":47,"y":961,"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":150,"y":902,"w":40,"h":48},
"frame": {"x":91,"y":961,"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":99,"y":908,"w":40,"h":48},
"frame": {"x":135,"y":941,"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":51,"y":927,"w":40,"h":48},
"frame": {"x":179,"y":917,"w":40,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -154,7 +154,7 @@
},
"sprites/belt/built/left_5.png":
{
"frame": {"x":261,"y":749,"w":44,"h":44},
"frame": {"x":275,"y":707,"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":208,"y":757,"w":44,"h":44},
"frame": {"x":323,"y":739,"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":363,"y":769,"w":44,"h":44},
"frame": {"x":208,"y":759,"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":309,"y":781,"w":44,"h":44},
"frame": {"x":156,"y":773,"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":256,"y":797,"w":44,"h":44},
"frame": {"x":105,"y":797,"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":208,"y":805,"w":44,"h":44},
"frame": {"x":54,"y":817,"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":156,"y":806,"w":44,"h":44},
"frame": {"x":3,"y":843,"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":304,"y":829,"w":44,"h":44},
"frame": {"x":102,"y":845,"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":256,"y":845,"w":44,"h":44},
"frame": {"x":51,"y":865,"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":204,"y":853,"w":44,"h":44},
"frame": {"x":3,"y":891,"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":153,"y":854,"w":44,"h":44},
"frame": {"x":359,"y":821,"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":102,"y":860,"w":44,"h":44},
"frame": {"x":304,"y":835,"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":879,"w":44,"h":44},
"frame": {"x":252,"y":845,"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":882,"w":44,"h":44},
"frame": {"x":201,"y":855,"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":352,"y":865,"w":44,"h":44},
"frame": {"x":150,"y":869,"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":105,"y":812,"w":44,"h":44},
"frame": {"x":311,"y":787,"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":54,"y":831,"w":44,"h":44},
"frame": {"x":256,"y":797,"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":834,"w":44,"h":44},
"frame": {"x":204,"y":807,"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":357,"y":817,"w":44,"h":44},
"frame": {"x":153,"y":821,"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":304,"y":877,"w":44,"h":44},
"frame": {"x":99,"y":893,"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":252,"y":893,"w":44,"h":44},
"frame": {"x":51,"y":913,"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":344,"y":965,"w":40,"h":48},
"frame": {"x":311,"y":935,"w":40,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
@ -418,7 +418,7 @@
},
"sprites/blueprints/logic_gate-or.png":
{
"frame": {"x":371,"y":723,"w":48,"h":42},
"frame": {"x":423,"y":818,"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":55,"y":555,"w":48,"h":45},
"frame": {"x":171,"y":622,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -450,7 +450,7 @@
},
"sprites/blueprints/miner-chainable.png":
{
"frame": {"x":55,"y":682,"w":47,"h":48},
"frame": {"x":107,"y":648,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -458,7 +458,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":3,"y":689,"w":47,"h":48},
"frame": {"x":55,"y":672,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -554,7 +554,7 @@
},
"sprites/blueprints/splitter-compact-merge.png":
{
"frame": {"x":54,"y":734,"w":47,"h":47},
"frame": {"x":106,"y":700,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -562,7 +562,7 @@
},
"sprites/blueprints/splitter-compact.png":
{
"frame": {"x":3,"y":741,"w":47,"h":47},
"frame": {"x":54,"y":724,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -602,7 +602,7 @@
},
"sprites/blueprints/underground_belt_entry-tier2.png":
{
"frame": {"x":223,"y":659,"w":48,"h":43},
"frame": {"x":447,"y":771,"w":48,"h":43},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
@ -610,7 +610,7 @@
},
"sprites/blueprints/underground_belt_entry.png":
{
"frame": {"x":3,"y":605,"w":48,"h":38},
"frame": {"x":55,"y":556,"w":48,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
@ -618,7 +618,7 @@
},
"sprites/blueprints/underground_belt_exit-tier2.png":
{
"frame": {"x":3,"y":647,"w":48,"h":38},
"frame": {"x":55,"y":598,"w":48,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -626,7 +626,7 @@
},
"sprites/blueprints/underground_belt_exit.png":
{
"frame": {"x":107,"y":604,"w":48,"h":38},
"frame": {"x":107,"y":606,"w":48,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -650,7 +650,7 @@
},
"sprites/blueprints/virtual_processor-shapecompare.png":
{
"frame": {"x":3,"y":556,"w":48,"h":45},
"frame": {"x":223,"y":659,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -698,7 +698,7 @@
},
"sprites/blueprints/wire.png":
{
"frame": {"x":437,"y":722,"w":8,"h":48},
"frame": {"x":159,"y":520,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -706,15 +706,15 @@
},
"sprites/blueprints/wire_tunnel-coating.png":
{
"frame": {"x":425,"y":638,"w":13,"h":47},
"frame": {"x":425,"y":655,"w":12,"h":46},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":17,"y":0,"w":13,"h":47},
"spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
"sourceSize": {"w":48,"h":48}
},
"sprites/blueprints/wire_tunnel.png":
{
"frame": {"x":55,"y":504,"w":48,"h":47},
"frame": {"x":107,"y":504,"w":48,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -730,7 +730,7 @@
},
"sprites/buildings/belt_right.png":
{
"frame": {"x":208,"y":805,"w":44,"h":44},
"frame": {"x":54,"y":817,"w":44,"h":44},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
@ -810,7 +810,7 @@
},
"sprites/buildings/logic_gate-or.png":
{
"frame": {"x":55,"y":604,"w":48,"h":42},
"frame": {"x":3,"y":556,"w":48,"h":42},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
@ -834,7 +834,7 @@
},
"sprites/buildings/logic_gate.png":
{
"frame": {"x":107,"y":555,"w":48,"h":45},
"frame": {"x":371,"y":723,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -842,7 +842,7 @@
},
"sprites/buildings/miner-chainable.png":
{
"frame": {"x":159,"y":703,"w":47,"h":48},
"frame": {"x":3,"y":698,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -850,7 +850,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":106,"y":710,"w":47,"h":48},
"frame": {"x":158,"y":671,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -930,7 +930,7 @@
},
"sprites/buildings/splitter-compact-inverse.png":
{
"frame": {"x":107,"y":504,"w":48,"h":47},
"frame": {"x":107,"y":555,"w":48,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -946,7 +946,7 @@
},
"sprites/buildings/splitter-compact-merge.png":
{
"frame": {"x":210,"y":706,"w":47,"h":47},
"frame": {"x":3,"y":750,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -954,7 +954,7 @@
},
"sprites/buildings/splitter-compact.png":
{
"frame": {"x":157,"y":755,"w":47,"h":47},
"frame": {"x":209,"y":708,"w":47,"h":47},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -994,7 +994,7 @@
},
"sprites/buildings/underground_belt_entry-tier2.png":
{
"frame": {"x":54,"y":785,"w":47,"h":42},
"frame": {"x":105,"y":751,"w":47,"h":42},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
@ -1002,7 +1002,7 @@
},
"sprites/buildings/underground_belt_entry.png":
{
"frame": {"x":3,"y":792,"w":47,"h":38},
"frame": {"x":54,"y":775,"w":47,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
@ -1010,7 +1010,7 @@
},
"sprites/buildings/underground_belt_exit-tier2.png":
{
"frame": {"x":261,"y":707,"w":47,"h":38},
"frame": {"x":3,"y":801,"w":47,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -1018,7 +1018,7 @@
},
"sprites/buildings/underground_belt_exit.png":
{
"frame": {"x":312,"y":739,"w":47,"h":38},
"frame": {"x":260,"y":755,"w":47,"h":38},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -1042,7 +1042,7 @@
},
"sprites/buildings/virtual_processor-shapecompare.png":
{
"frame": {"x":171,"y":622,"w":48,"h":45},
"frame": {"x":371,"y":772,"w":48,"h":45},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
@ -1066,7 +1066,7 @@
},
"sprites/buildings/wire-cross.png":
{
"frame": {"x":459,"y":667,"w":48,"h":48},
"frame": {"x":457,"y":667,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1074,7 +1074,7 @@
},
"sprites/buildings/wire-split.png":
{
"frame": {"x":107,"y":646,"w":48,"h":28},
"frame": {"x":3,"y":602,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1090,7 +1090,7 @@
},
"sprites/buildings/wire.png":
{
"frame": {"x":501,"y":771,"w":8,"h":48},
"frame": {"x":159,"y":572,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -1098,7 +1098,7 @@
},
"sprites/buildings/wire_tunnel-coating.png":
{
"frame": {"x":442,"y":672,"w":12,"h":46},
"frame": {"x":441,"y":655,"w":12,"h":46},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
@ -1106,7 +1106,7 @@
},
"sprites/buildings/wire_tunnel.png":
{
"frame": {"x":105,"y":762,"w":47,"h":46},
"frame": {"x":157,"y":723,"w":47,"h":46},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":47,"h":46},
@ -1162,7 +1162,7 @@
},
"sprites/misc/slot_bad_arrow.png":
{
"frame": {"x":442,"y":638,"w":13,"h":13},
"frame": {"x":425,"y":638,"w":13,"h":13},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -1170,7 +1170,7 @@
},
"sprites/misc/slot_good_arrow.png":
{
"frame": {"x":442,"y":655,"w":13,"h":13},
"frame": {"x":442,"y":638,"w":13,"h":13},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -1194,7 +1194,7 @@
},
"sprites/wires/boolean_false.png":
{
"frame": {"x":424,"y":689,"w":12,"h":15},
"frame": {"x":424,"y":705,"w":12,"h":15},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":1,"w":12,"h":15},
@ -1202,7 +1202,7 @@
},
"sprites/wires/boolean_true.png":
{
"frame": {"x":424,"y":708,"w":9,"h":15},
"frame": {"x":440,"y":705,"w":9,"h":15},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":9,"h":15},
@ -1314,7 +1314,7 @@
},
"sprites/wires/sets/color_cross.png":
{
"frame": {"x":458,"y":719,"w":48,"h":48},
"frame": {"x":453,"y":719,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1322,7 +1322,7 @@
},
"sprites/wires/sets/color_forward.png":
{
"frame": {"x":159,"y":520,"w":8,"h":48},
"frame": {"x":423,"y":724,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -1330,7 +1330,7 @@
},
"sprites/wires/sets/color_split.png":
{
"frame": {"x":55,"y":650,"w":48,"h":28},
"frame": {"x":3,"y":634,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1346,7 +1346,7 @@
},
"sprites/wires/sets/conflict_cross.png":
{
"frame": {"x":449,"y":771,"w":48,"h":48},
"frame": {"x":3,"y":504,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1354,7 +1354,7 @@
},
"sprites/wires/sets/conflict_forward.png":
{
"frame": {"x":159,"y":572,"w":8,"h":48},
"frame": {"x":435,"y":724,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -1362,7 +1362,7 @@
},
"sprites/wires/sets/conflict_split.png":
{
"frame": {"x":159,"y":671,"w":48,"h":28},
"frame": {"x":55,"y":640,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1378,7 +1378,7 @@
},
"sprites/wires/sets/regular_cross.png":
{
"frame": {"x":459,"y":667,"w":48,"h":48},
"frame": {"x":457,"y":667,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1386,7 +1386,7 @@
},
"sprites/wires/sets/regular_forward.png":
{
"frame": {"x":501,"y":771,"w":8,"h":48},
"frame": {"x":159,"y":572,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -1394,7 +1394,7 @@
},
"sprites/wires/sets/regular_split.png":
{
"frame": {"x":107,"y":646,"w":48,"h":28},
"frame": {"x":3,"y":602,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1410,7 +1410,7 @@
},
"sprites/wires/sets/shape_cross.png":
{
"frame": {"x":3,"y":504,"w":48,"h":48},
"frame": {"x":55,"y":504,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -1418,7 +1418,7 @@
},
"sprites/wires/sets/shape_forward.png":
{
"frame": {"x":423,"y":727,"w":8,"h":48},
"frame": {"x":499,"y":771,"w":8,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
@ -1426,7 +1426,7 @@
},
"sprites/wires/sets/shape_split.png":
{
"frame": {"x":107,"y":678,"w":48,"h":28},
"frame": {"x":3,"y":666,"w":48,"h":28},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
@ -1455,6 +1455,6 @@
"format": "RGBA8888",
"size": {"w":512,"h":1024},
"scale": "0.25",
"smartupdate": "$TexturePacker:SmartUpdate:276f2044dea94b0977ef8f929d93d3db:fe07471c4d8352b4586f9103e9e8f916:908b89f5ca8ff73e331a35a3b14d0604$"
"smartupdate": "$TexturePacker:SmartUpdate:26af492934beffa75e19b73e6d9eba56:d408ec7454e52a9384f80985bf14db9c:908b89f5ca8ff73e331a35a3b14d0604$"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 277 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 KiB

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -61,7 +61,7 @@ export const globalConfig = {
undergroundBeltMaxTilesByTier: [5, 8],
readerAnalyzeIntervalSeconds: 10,
readerAnalyzeIntervalSeconds: G_IS_DEV ? 3 : 10,
buildingSpeeds: {
cutter: 1 / 4,

View File

@ -459,67 +459,6 @@ export function removeAllChildren(elem) {
}
}
/**
* Fixes lockstep simulation by converting times like 34.0000000003 to 34.00.
* We use 3 digits of precision, this allows us to store precision of 1 ms without
* the risking simulation errors due to resync issues
* @param {number} value
*/
export function quantizeFloat(value) {
return Math.round(value * 1000.0) / 1000.0;
}
/**
* Safe check to check if a timer is expired. quantizes numbers
* @param {number} now Current time
* @param {number} lastTick Last tick of the timer
* @param {number} tickRate Interval of the timer
*/
export function checkTimerExpired(now, lastTick, tickRate) {
if (G_IS_DEV) {
if (quantizeFloat(now) !== now) {
console.error("Got non-quantizied time:" + now + " vs " + quantizeFloat(now));
now = quantizeFloat(now);
}
if (quantizeFloat(lastTick) !== lastTick) {
// FIXME: REENABLE
// console.error("Got non-quantizied timer:" + lastTick + " vs " + quantizeFloat(lastTick));
lastTick = quantizeFloat(lastTick);
}
} else {
// just to be safe
now = quantizeFloat(now);
lastTick = quantizeFloat(lastTick);
}
/*
Ok, so heres the issue (Died a bit while debugging it):
In multiplayer lockstep simulation, client A will simulate everything at T, but client B
will simulate it at T + 3. So we are running into the following precision issue:
Lets say on client A the time is T = 30. Then on clientB the time is T = 33.
Now, our timer takes 0.1 seconds and ticked at 29.90 - What does happen now?
Client A computes the timer and checks T > lastTick + interval. He computes
30 >= 29.90 + 0.1 <=> 30 >= 30.0000 <=> True <=> Tick performed
However, this is what it looks on client B:
33 >= 32.90 + 0.1 <=> 33 >= 32.999999999999998 <=> False <=> No tick performed!
This means that Client B will only tick at the *next* frame, which means it from now is out
of sync by one tick, which means the game will resync further or later and be not able to recover,
since it will run into the same issue over and over.
*/
// The next tick, in our example it would be 30.0000 / 32.99999999998. In order to fix it, we quantize
// it, so its now 30.0000 / 33.0000
const nextTick = quantizeFloat(lastTick + tickRate);
// This check is safe, but its the only check where you may compare times. You always need to use
// this method!
return now >= nextTick;
}
/**
* Returns if the game supports this browser
*/

View File

@ -109,6 +109,11 @@ export class ItemProcessorComponent extends Component {
* How long it takes until we are done with the current items
*/
this.secondsUntilEject = 0;
/**
* How much processing time we have lest from the last tick
*/
this.bonusFromLastTick = 0;
}
/**

View File

@ -1,58 +1,58 @@
import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item";
import { Component } from "../component";
import { typeItemSingleton } from "../item_resolver";
const chainBufferSize = 3;
export class MinerComponent extends Component {
static getId() {
return "Miner";
}
static getSchema() {
// cachedMinedItem is not serialized.
return {
lastMiningTime: types.ufloat,
itemChainBuffer: types.array(typeItemSingleton),
};
}
duplicateWithoutContents() {
return new MinerComponent({
chainable: this.chainable,
});
}
constructor({ chainable = false }) {
super();
this.lastMiningTime = 0;
this.chainable = chainable;
/**
* Stores items from other miners which were chained to this
* miner.
* @type {Array<BaseItem>}
*/
this.itemChainBuffer = [];
/**
* @type {BaseItem}
*/
this.cachedMinedItem = null;
}
/**
*
* @param {BaseItem} item
*/
tryAcceptChainedItem(item) {
if (this.itemChainBuffer.length > chainBufferSize) {
// Well, this one is full
return false;
}
this.itemChainBuffer.push(item);
return true;
}
}
import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item";
import { Component } from "../component";
import { typeItemSingleton } from "../item_resolver";
const chainBufferSize = 6;
export class MinerComponent extends Component {
static getId() {
return "Miner";
}
static getSchema() {
// cachedMinedItem is not serialized.
return {
lastMiningTime: types.ufloat,
itemChainBuffer: types.array(typeItemSingleton),
};
}
duplicateWithoutContents() {
return new MinerComponent({
chainable: this.chainable,
});
}
constructor({ chainable = false }) {
super();
this.lastMiningTime = 0;
this.chainable = chainable;
/**
* Stores items from other miners which were chained to this
* miner.
* @type {Array<BaseItem>}
*/
this.itemChainBuffer = [];
/**
* @type {BaseItem}
*/
this.cachedMinedItem = null;
}
/**
*
* @param {BaseItem} item
*/
tryAcceptChainedItem(item) {
if (this.itemChainBuffer.length > chainBufferSize) {
// Well, this one is full
return false;
}
this.itemChainBuffer.push(item);
return true;
}
}

View File

@ -25,10 +25,14 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
const ejectorComp = entity.components.ItemEjector;
// First of all, process the current recipe
processorComp.secondsUntilEject = Math.max(
0,
processorComp.secondsUntilEject - this.root.dynamicTickrate.deltaSeconds
);
const newSecondsUntilEject =
processorComp.secondsUntilEject - this.root.dynamicTickrate.deltaSeconds;
processorComp.secondsUntilEject = Math.max(0, newSecondsUntilEject);
if (newSecondsUntilEject < 0) {
processorComp.bonusFromLastTick -= newSecondsUntilEject;
}
if (G_IS_DEV && globalConfig.debug.instantProcessors) {
processorComp.secondsUntilEject = 0;
@ -233,7 +237,10 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
}
const baseSpeed = this.root.hubGoals.getProcessorBaseSpeed(processorComp.type);
processorComp.secondsUntilEject = 1 / baseSpeed;
// Substract one tick because we already process it this frame
processorComp.secondsUntilEject = Math.max(0, 1 / baseSpeed - processorComp.bonusFromLastTick);
processorComp.bonusFromLastTick = 0;
/** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */
const outItems = [];

View File

@ -1,140 +1,144 @@
import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters";
import { enumDirectionToVector } from "../../core/vector";
import { BaseItem } from "../base_item";
import { MinerComponent } from "../components/miner";
import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view";
export class MinerSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [MinerComponent]);
}
update() {
let miningSpeed = this.root.hubGoals.getMinerBaseSpeed();
if (G_IS_DEV && globalConfig.debug.instantMiners) {
miningSpeed *= 100;
}
for (let i = 0; i < this.allEntities.length; ++i) {
const entity = this.allEntities[i];
// Check if miner is above an actual tile
const minerComp = entity.components.Miner;
if (!minerComp.cachedMinedItem) {
const staticComp = entity.components.StaticMapEntity;
const tileBelow = this.root.map.getLowerLayerContentXY(
staticComp.origin.x,
staticComp.origin.y
);
if (!tileBelow) {
continue;
}
minerComp.cachedMinedItem = tileBelow;
}
// First, try to get rid of chained items
if (minerComp.itemChainBuffer.length > 0) {
if (this.tryPerformMinerEject(entity, minerComp.itemChainBuffer[0])) {
minerComp.itemChainBuffer.shift();
continue;
}
}
if (this.root.time.isIngameTimerExpired(minerComp.lastMiningTime, 1 / miningSpeed)) {
if (this.tryPerformMinerEject(entity, minerComp.cachedMinedItem)) {
// Analytics hook
this.root.signals.itemProduced.dispatch(minerComp.cachedMinedItem);
// Actually mine
minerComp.lastMiningTime = this.root.time.now();
}
}
}
}
/**
*
* @param {Entity} entity
* @param {BaseItem} item
*/
tryPerformMinerEject(entity, item) {
const minerComp = entity.components.Miner;
const ejectComp = entity.components.ItemEjector;
const staticComp = entity.components.StaticMapEntity;
// Check if we are a chained miner
if (minerComp.chainable) {
const ejectingSlot = ejectComp.slots[0];
const ejectingPos = staticComp.localTileToWorld(ejectingSlot.pos);
const ejectingDirection = staticComp.localDirectionToWorld(ejectingSlot.direction);
const targetTile = ejectingPos.add(enumDirectionToVector[ejectingDirection]);
const targetContents = this.root.map.getTileContent(targetTile, "regular");
// Check if we are connected to another miner and thus do not eject directly
if (targetContents) {
const targetMinerComp = targetContents.components.Miner;
if (targetMinerComp) {
if (targetMinerComp.tryAcceptChainedItem(item)) {
return true;
} else {
return false;
}
}
}
}
// Seems we are a regular miner or at the end of a row, try actually ejecting
if (ejectComp.tryEject(0, item)) {
return true;
}
return false;
}
/**
*
* @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/
drawChunk(parameters, chunk) {
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const minerComp = entity.components.Miner;
if (!minerComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
if (!minerComp.cachedMinedItem) {
continue;
}
// 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(destX, destY, dimensions, dimensions);
}
minerComp.cachedMinedItem.drawItemCenteredClipped(
(0.5 + staticComp.origin.x) * globalConfig.tileSize,
(0.5 + staticComp.origin.y) * globalConfig.tileSize,
parameters,
globalConfig.defaultItemDiameter
);
}
}
}
import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters";
import { enumDirectionToVector } from "../../core/vector";
import { BaseItem } from "../base_item";
import { MinerComponent } from "../components/miner";
import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
import { MapChunkView } from "../map_chunk_view";
export class MinerSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [MinerComponent]);
}
update() {
let miningSpeed = this.root.hubGoals.getMinerBaseSpeed();
if (G_IS_DEV && globalConfig.debug.instantMiners) {
miningSpeed *= 100;
}
for (let i = 0; i < this.allEntities.length; ++i) {
const entity = this.allEntities[i];
// Check if miner is above an actual tile
const minerComp = entity.components.Miner;
if (!minerComp.cachedMinedItem) {
const staticComp = entity.components.StaticMapEntity;
const tileBelow = this.root.map.getLowerLayerContentXY(
staticComp.origin.x,
staticComp.origin.y
);
if (!tileBelow) {
continue;
}
minerComp.cachedMinedItem = tileBelow;
}
// First, try to get rid of chained items
if (minerComp.itemChainBuffer.length > 0) {
if (this.tryPerformMinerEject(entity, minerComp.itemChainBuffer[0])) {
minerComp.itemChainBuffer.shift();
continue;
}
}
const mineDuration = 1 / miningSpeed;
const timeSinceMine = this.root.time.now() - minerComp.lastMiningTime;
if (timeSinceMine > mineDuration) {
// Store how much we overflowed
const buffer = Math.min(timeSinceMine - mineDuration, this.root.dynamicTickrate.deltaSeconds);
if (this.tryPerformMinerEject(entity, minerComp.cachedMinedItem)) {
// Analytics hook
this.root.signals.itemProduced.dispatch(minerComp.cachedMinedItem);
// Store mining time
minerComp.lastMiningTime = this.root.time.now() - buffer;
}
}
}
}
/**
*
* @param {Entity} entity
* @param {BaseItem} item
*/
tryPerformMinerEject(entity, item) {
const minerComp = entity.components.Miner;
const ejectComp = entity.components.ItemEjector;
const staticComp = entity.components.StaticMapEntity;
// Check if we are a chained miner
if (minerComp.chainable) {
const ejectingSlot = ejectComp.slots[0];
const ejectingPos = staticComp.localTileToWorld(ejectingSlot.pos);
const ejectingDirection = staticComp.localDirectionToWorld(ejectingSlot.direction);
const targetTile = ejectingPos.add(enumDirectionToVector[ejectingDirection]);
const targetContents = this.root.map.getTileContent(targetTile, "regular");
// Check if we are connected to another miner and thus do not eject directly
if (targetContents) {
const targetMinerComp = targetContents.components.Miner;
if (targetMinerComp) {
if (targetMinerComp.tryAcceptChainedItem(item)) {
return true;
} else {
return false;
}
}
}
}
// Seems we are a regular miner or at the end of a row, try actually ejecting
if (ejectComp.tryEject(0, item)) {
return true;
}
return false;
}
/**
*
* @param {DrawParameters} parameters
* @param {MapChunkView} chunk
*/
drawChunk(parameters, chunk) {
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const minerComp = entity.components.Miner;
if (!minerComp) {
continue;
}
const staticComp = entity.components.StaticMapEntity;
if (!minerComp.cachedMinedItem) {
continue;
}
// 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(destX, destY, dimensions, dimensions);
}
minerComp.cachedMinedItem.drawItemCenteredClipped(
(0.5 + staticComp.origin.x) * globalConfig.tileSize,
(0.5 + staticComp.origin.y) * globalConfig.tileSize,
parameters,
globalConfig.defaultItemDiameter
);
}
}
}

View File

@ -1,214 +1,200 @@
/* typehints:start */
import { GameRoot } from "../root";
/* typehints:end */
import { types, BasicSerializableObject } from "../../savegame/serialization";
import { RegularGameSpeed } from "./regular_game_speed";
import { BaseGameSpeed } from "./base_game_speed";
import { PausedGameSpeed } from "./paused_game_speed";
import { FastForwardGameSpeed } from "./fast_forward_game_speed";
import { gGameSpeedRegistry } from "../../core/global_registries";
import { globalConfig } from "../../core/config";
import { checkTimerExpired, quantizeFloat } from "../../core/utils";
import { createLogger } from "../../core/logging";
const logger = createLogger("game_time");
export class GameTime extends BasicSerializableObject {
/**
* @param {GameRoot} root
*/
constructor(root) {
super();
this.root = root;
// Current ingame time seconds, not incremented while paused
this.timeSeconds = 0;
// Current "realtime", a timer which always is incremented no matter whether the game is paused or no
this.realtimeSeconds = 0;
// The adjustment, used when loading savegames so we can continue where we were
this.realtimeAdjust = 0;
/** @type {BaseGameSpeed} */
this.speed = new RegularGameSpeed(this.root);
// Store how much time we have in bucket
this.logicTimeBudget = 0;
}
static getId() {
return "GameTime";
}
static getSchema() {
return {
timeSeconds: types.float,
speed: types.obj(gGameSpeedRegistry),
realtimeSeconds: types.float,
};
}
/**
* Fetches the new "real" time, called from the core once per frame, since performance now() is kinda slow
*/
updateRealtimeNow() {
this.realtimeSeconds = performance.now() / 1000.0 + this.realtimeAdjust;
}
/**
* Returns the ingame time in milliseconds
*/
getTimeMs() {
return this.timeSeconds * 1000.0;
}
/**
* Safe check to check if a timer is expired. quantizes numbers
* @param {number} lastTick Last tick of the timer
* @param {number} tickRateSeconds Interval of the timer in seconds
*/
isIngameTimerExpired(lastTick, tickRateSeconds) {
return checkTimerExpired(this.timeSeconds, lastTick, tickRateSeconds);
}
/**
* Returns how many seconds we are in the grace period
* @returns {number}
*/
getRemainingGracePeriodSeconds() {
return 0;
}
/**
* Returns if we are currently in the grace period
* @returns {boolean}
*/
getIsWithinGracePeriod() {
return this.getRemainingGracePeriodSeconds() > 0;
}
/**
* Internal method to generate new logic time budget
* @param {number} deltaMs
*/
internalAddDeltaToBudget(deltaMs) {
// Only update if game is supposed to update
if (this.root.hud.shouldPauseGame()) {
this.logicTimeBudget = 0;
} else {
const multiplier = this.getSpeed().getTimeMultiplier();
this.logicTimeBudget += deltaMs * multiplier;
}
// Check for too big pile of updates -> reduce it to 1
let maxLogicSteps = Math.max(
3,
(this.speed.getMaxLogicStepsInQueue() * this.root.dynamicTickrate.currentTickRate) / 60
);
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
maxLogicSteps *= 1 + globalConfig.debug.framePausesBetweenTicks;
}
if (this.logicTimeBudget > this.root.dynamicTickrate.deltaMs * maxLogicSteps) {
this.logicTimeBudget = this.root.dynamicTickrate.deltaMs * maxLogicSteps;
}
}
/**
* Performs update ticks based on the queued logic budget
* @param {number} deltaMs
* @param {function():boolean} updateMethod
*/
performTicks(deltaMs, updateMethod) {
this.internalAddDeltaToBudget(deltaMs);
const speedAtStart = this.root.time.getSpeed();
let effectiveDelta = this.root.dynamicTickrate.deltaMs;
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
effectiveDelta += globalConfig.debug.framePausesBetweenTicks * this.root.dynamicTickrate.deltaMs;
}
// Update physics & logic
while (this.logicTimeBudget >= effectiveDelta) {
this.logicTimeBudget -= effectiveDelta;
if (!updateMethod()) {
// Gameover happened or so, do not update anymore
return;
}
// Step game time
this.timeSeconds = quantizeFloat(this.timeSeconds + this.root.dynamicTickrate.deltaSeconds);
// Game time speed changed, need to abort since our logic steps are no longer valid
if (speedAtStart.getId() !== this.speed.getId()) {
logger.warn(
"Skipping update because speed changed from",
speedAtStart.getId(),
"to",
this.speed.getId()
);
break;
}
}
}
/**
* Returns ingame time in seconds
* @returns {number} seconds
*/
now() {
return this.timeSeconds;
}
/**
* Returns "real" time in seconds
* @returns {number} seconds
*/
realtimeNow() {
return this.realtimeSeconds;
}
/**
* Returns "real" time in seconds
* @returns {number} seconds
*/
systemNow() {
return (this.realtimeSeconds - this.realtimeAdjust) * 1000.0;
}
getIsPaused() {
return this.speed.getId() === PausedGameSpeed.getId();
}
getSpeed() {
return this.speed;
}
setSpeed(speed) {
assert(speed instanceof BaseGameSpeed, "Not a valid game speed");
if (this.speed.getId() === speed.getId()) {
logger.warn("Same speed set than current one:", speed.constructor.getId());
}
this.speed = speed;
}
deserialize(data) {
const errorCode = super.deserialize(data);
if (errorCode) {
return errorCode;
}
// Adjust realtime now difference so they match
this.realtimeAdjust = this.realtimeSeconds - performance.now() / 1000.0;
this.updateRealtimeNow();
// Make sure we have a quantizied time
this.timeSeconds = quantizeFloat(this.timeSeconds);
this.speed.initializeAfterDeserialize(this.root);
}
}
/* typehints:start */
import { GameRoot } from "../root";
/* typehints:end */
import { types, BasicSerializableObject } from "../../savegame/serialization";
import { RegularGameSpeed } from "./regular_game_speed";
import { BaseGameSpeed } from "./base_game_speed";
import { PausedGameSpeed } from "./paused_game_speed";
import { gGameSpeedRegistry } from "../../core/global_registries";
import { globalConfig } from "../../core/config";
import { createLogger } from "../../core/logging";
const logger = createLogger("game_time");
export class GameTime extends BasicSerializableObject {
/**
* @param {GameRoot} root
*/
constructor(root) {
super();
this.root = root;
// Current ingame time seconds, not incremented while paused
this.timeSeconds = 0;
// Current "realtime", a timer which always is incremented no matter whether the game is paused or no
this.realtimeSeconds = 0;
// The adjustment, used when loading savegames so we can continue where we were
this.realtimeAdjust = 0;
/** @type {BaseGameSpeed} */
this.speed = new RegularGameSpeed(this.root);
// Store how much time we have in bucket
this.logicTimeBudget = 0;
}
static getId() {
return "GameTime";
}
static getSchema() {
return {
timeSeconds: types.float,
speed: types.obj(gGameSpeedRegistry),
realtimeSeconds: types.float,
};
}
/**
* Fetches the new "real" time, called from the core once per frame, since performance now() is kinda slow
*/
updateRealtimeNow() {
this.realtimeSeconds = performance.now() / 1000.0 + this.realtimeAdjust;
}
/**
* Returns the ingame time in milliseconds
*/
getTimeMs() {
return this.timeSeconds * 1000.0;
}
/**
* Returns how many seconds we are in the grace period
* @returns {number}
*/
getRemainingGracePeriodSeconds() {
return 0;
}
/**
* Returns if we are currently in the grace period
* @returns {boolean}
*/
getIsWithinGracePeriod() {
return this.getRemainingGracePeriodSeconds() > 0;
}
/**
* Internal method to generate new logic time budget
* @param {number} deltaMs
*/
internalAddDeltaToBudget(deltaMs) {
// Only update if game is supposed to update
if (this.root.hud.shouldPauseGame()) {
this.logicTimeBudget = 0;
} else {
const multiplier = this.getSpeed().getTimeMultiplier();
this.logicTimeBudget += deltaMs * multiplier;
}
// Check for too big pile of updates -> reduce it to 1
let maxLogicSteps = Math.max(
3,
(this.speed.getMaxLogicStepsInQueue() * this.root.dynamicTickrate.currentTickRate) / 60
);
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
maxLogicSteps *= 1 + globalConfig.debug.framePausesBetweenTicks;
}
if (this.logicTimeBudget > this.root.dynamicTickrate.deltaMs * maxLogicSteps) {
this.logicTimeBudget = this.root.dynamicTickrate.deltaMs * maxLogicSteps;
}
}
/**
* Performs update ticks based on the queued logic budget
* @param {number} deltaMs
* @param {function():boolean} updateMethod
*/
performTicks(deltaMs, updateMethod) {
this.internalAddDeltaToBudget(deltaMs);
const speedAtStart = this.root.time.getSpeed();
let effectiveDelta = this.root.dynamicTickrate.deltaMs;
if (G_IS_DEV && globalConfig.debug.framePausesBetweenTicks) {
effectiveDelta += globalConfig.debug.framePausesBetweenTicks * this.root.dynamicTickrate.deltaMs;
}
// Update physics & logic
while (this.logicTimeBudget >= effectiveDelta) {
this.logicTimeBudget -= effectiveDelta;
if (!updateMethod()) {
// Gameover happened or so, do not update anymore
return;
}
// Step game time
this.timeSeconds += this.root.dynamicTickrate.deltaSeconds;
// Game time speed changed, need to abort since our logic steps are no longer valid
if (speedAtStart.getId() !== this.speed.getId()) {
logger.warn(
"Skipping update because speed changed from",
speedAtStart.getId(),
"to",
this.speed.getId()
);
break;
}
}
}
/**
* Returns ingame time in seconds
* @returns {number} seconds
*/
now() {
return this.timeSeconds;
}
/**
* Returns "real" time in seconds
* @returns {number} seconds
*/
realtimeNow() {
return this.realtimeSeconds;
}
/**
* Returns "real" time in seconds
* @returns {number} seconds
*/
systemNow() {
return (this.realtimeSeconds - this.realtimeAdjust) * 1000.0;
}
getIsPaused() {
return this.speed.getId() === PausedGameSpeed.getId();
}
getSpeed() {
return this.speed;
}
setSpeed(speed) {
assert(speed instanceof BaseGameSpeed, "Not a valid game speed");
if (this.speed.getId() === speed.getId()) {
logger.warn("Same speed set than current one:", speed.constructor.getId());
}
this.speed = speed;
}
deserialize(data) {
const errorCode = super.deserialize(data);
if (errorCode) {
return errorCode;
}
// Adjust realtime now difference so they match
this.realtimeAdjust = this.realtimeSeconds - performance.now() / 1000.0;
this.updateRealtimeNow();
this.speed.initializeAfterDeserialize(this.root);
}
}

View File

@ -126,6 +126,9 @@ export const autosaveIntervals = [
const refreshRateOptions = ["60", "75", "100", "120", "144", "165", "250", "500"];
if (G_IS_DEV) {
refreshRateOptions.unshift("30");
refreshRateOptions.unshift("10");
refreshRateOptions.unshift("5");
refreshRateOptions.push("1000");
refreshRateOptions.push("2000");
refreshRateOptions.push("5000");