diff --git a/gulp/image-resources.js b/gulp/image-resources.js index 2d0d5fb1..80c4ca85 100644 --- a/gulp/image-resources.js +++ b/gulp/image-resources.js @@ -1,148 +1,141 @@ -// @ts-ignore -const path = require("path"); - -// Globs for non-ui resources -const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/*.webm"]; - -// Globs for ui resources -const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg", "../res/**/*.gif"]; - -function gulptasksImageResources($, gulp, buildFolder) { - // Lossless options - const minifyImagesOptsLossless = () => [ - $.imageminJpegtran({ - progressive: true, - }), - $.imagemin.svgo({}), - $.imagemin.optipng({ - optimizationLevel: 3, - }), - $.imageminGifsicle({ - optimizationLevel: 3, - colors: 128, - }), - ]; - - // Lossy options - const minifyImagesOpts = () => [ - $.imagemin.mozjpeg({ - quality: 80, - maxMemory: 1024 * 1024 * 8, - }), - $.imagemin.svgo({}), - $.imageminPngquant({ - speed: 1, - strip: true, - quality: [0.65, 0.9], - dithering: false, - verbose: false, - }), - $.imagemin.optipng({ - optimizationLevel: 3, - }), - $.imageminGifsicle({ - optimizationLevel: 3, - colors: 128, - }), - ]; - - // Where the resources folder are - const resourcesDestFolder = path.join(buildFolder, "res"); - - /** - * Determines if an atlas must use lossless compression - * @param {string} fname - */ - function fileMustBeLossless(fname) { - return fname.indexOf("lossless") >= 0; - } - - /////////////// ATLAS ///////////////////// - - // Copies the atlas to the final destination - gulp.task("imgres.atlas", () => { - return gulp - .src(["../res_built/atlas/*.png"]) - .pipe($.cached("imgres.atlas")) - .pipe(gulp.dest(resourcesDestFolder)); - }); - - // Copies the atlas to the final destination after optimizing it (lossy compression) - gulp.task("imgres.atlasOptimized", () => { - return gulp - .src(["../res_built/atlas/*.png"]) - .pipe($.cached("imgres.atlasOptimized")) - .pipe( - $.if( - fname => fileMustBeLossless(fname.history[0]), - $.imagemin(minifyImagesOptsLossless()), - $.imagemin(minifyImagesOpts()) - ) - ) - .pipe(gulp.dest(resourcesDestFolder)); - }); - - //////////////////// RESOURCES ////////////////////// - - // Copies all resources which are no ui resources - gulp.task("imgres.copyNonImageResources", () => { - return gulp - .src(nonImageResourcesGlobs) - .pipe($.cached("imgres.copyNonImageResources")) - .pipe(gulp.dest(resourcesDestFolder)); - }); - - // Copies all ui resources - gulp.task("imgres.copyImageResources", () => { - return gulp - .src(imageResourcesGlobs) - .pipe($.cached("copyImageResources")) - .pipe(gulp.dest(path.join(resourcesDestFolder))); - }); - - // Copies all ui resources and optimizes them - gulp.task("imgres.copyImageResourcesOptimized", () => { - return gulp - .src(imageResourcesGlobs) - .pipe($.cached("imgres.copyImageResourcesOptimized")) - .pipe( - $.if( - fname => fileMustBeLossless(fname.history[0]), - $.imagemin(minifyImagesOptsLossless()), - $.imagemin(minifyImagesOpts()) - ) - ) - .pipe(gulp.dest(path.join(resourcesDestFolder))); - }); - - // Copies all resources and optimizes them - gulp.task( - "imgres.allOptimized", - gulp.parallel( - "imgres.atlasOptimized", - "imgres.copyNonImageResources", - "imgres.copyImageResourcesOptimized" - ) - ); - - // Cleans up unused images which are instead inline into the css - gulp.task("imgres.cleanupUnusedCssInlineImages", () => { - return gulp - .src( - [ - path.join(buildFolder, "res", "ui", "**", "*.png"), - path.join(buildFolder, "res", "ui", "**", "*.jpg"), - path.join(buildFolder, "res", "ui", "**", "*.svg"), - path.join(buildFolder, "res", "ui", "**", "*.gif"), - ], - { read: false } - ) - .pipe($.if(fname => fname.history[0].indexOf("noinline") < 0, $.clean({ force: true }))); - }); -} - -module.exports = { - nonImageResourcesGlobs, - imageResourcesGlobs, - gulptasksImageResources, -}; +// @ts-ignore +const path = require("path"); + +// Globs for non-ui resources +const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/*.webm"]; + +// Globs for ui resources +const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg", "../res/**/*.gif"]; + +function gulptasksImageResources($, gulp, buildFolder) { + // Lossless options + const minifyImagesOptsLossless = () => [ + $.imageminJpegtran({ + progressive: true, + }), + $.imagemin.svgo({}), + $.imagemin.optipng({ + optimizationLevel: 3, + }), + $.imageminGifsicle({ + optimizationLevel: 3, + colors: 128, + }), + ]; + + // Lossy options + const minifyImagesOpts = () => [ + $.imagemin.mozjpeg({ + quality: 80, + maxMemory: 1024 * 1024 * 8, + }), + $.imagemin.svgo({}), + $.imageminPngquant({ + speed: 1, + strip: true, + quality: [0.65, 0.9], + dithering: false, + verbose: false, + }), + $.imagemin.optipng({ + optimizationLevel: 3, + }), + $.imageminGifsicle({ + optimizationLevel: 3, + colors: 128, + }), + ]; + + // Where the resources folder are + const resourcesDestFolder = path.join(buildFolder, "res"); + + /** + * Determines if an atlas must use lossless compression + * @param {string} fname + */ + function fileMustBeLossless(fname) { + return fname.indexOf("lossless") >= 0; + } + + /////////////// ATLAS ///////////////////// + + // Copies the atlas to the final destination + gulp.task("imgres.atlas", () => { + return gulp.src(["../res_built/atlas/*.png"]).pipe(gulp.dest(resourcesDestFolder)); + }); + + // Copies the atlas to the final destination after optimizing it (lossy compression) + gulp.task("imgres.atlasOptimized", () => { + return gulp + .src(["../res_built/atlas/*.png"]) + .pipe( + $.if( + fname => fileMustBeLossless(fname.history[0]), + $.imagemin(minifyImagesOptsLossless()), + $.imagemin(minifyImagesOpts()) + ) + ) + .pipe(gulp.dest(resourcesDestFolder)); + }); + + //////////////////// RESOURCES ////////////////////// + + // Copies all resources which are no ui resources + gulp.task("imgres.copyNonImageResources", () => { + return gulp.src(nonImageResourcesGlobs).pipe(gulp.dest(resourcesDestFolder)); + }); + + // Copies all ui resources + gulp.task("imgres.copyImageResources", () => { + return gulp + .src(imageResourcesGlobs) + + .pipe($.cached("imgres.copyImageResources")) + .pipe(gulp.dest(path.join(resourcesDestFolder))); + }); + + // Copies all ui resources and optimizes them + gulp.task("imgres.copyImageResourcesOptimized", () => { + return gulp + .src(imageResourcesGlobs) + .pipe( + $.if( + fname => fileMustBeLossless(fname.history[0]), + $.imagemin(minifyImagesOptsLossless()), + $.imagemin(minifyImagesOpts()) + ) + ) + .pipe(gulp.dest(path.join(resourcesDestFolder))); + }); + + // Copies all resources and optimizes them + gulp.task( + "imgres.allOptimized", + gulp.parallel( + "imgres.atlasOptimized", + "imgres.copyNonImageResources", + "imgres.copyImageResourcesOptimized" + ) + ); + + // Cleans up unused images which are instead inline into the css + gulp.task("imgres.cleanupUnusedCssInlineImages", () => { + return gulp + .src( + [ + path.join(buildFolder, "res", "ui", "**", "*.png"), + path.join(buildFolder, "res", "ui", "**", "*.jpg"), + path.join(buildFolder, "res", "ui", "**", "*.svg"), + path.join(buildFolder, "res", "ui", "**", "*.gif"), + ], + { read: false } + ) + .pipe($.if(fname => fname.history[0].indexOf("noinline") < 0, $.clean({ force: true }))); + }); +} + +module.exports = { + nonImageResourcesGlobs, + imageResourcesGlobs, + gulptasksImageResources, +}; diff --git a/gulp/sounds.js b/gulp/sounds.js index aaae606f..1cffd897 100644 --- a/gulp/sounds.js +++ b/gulp/sounds.js @@ -18,7 +18,7 @@ function gulptasksSounds($, gulp, buildFolder) { function getFileCacheValue(file) { const { _isVinyl, base, cwd, contents, history, stat, path } = file; - const encodedContents = Buffer.from(contents).toString('base64'); + const encodedContents = Buffer.from(contents).toString("base64"); return { _isVinyl, base, cwd, contents: encodedContents, history, stat, path }; } @@ -118,7 +118,6 @@ function gulptasksSounds($, gulp, buildFolder) { return gulp .src(path.join(builtSoundsDir, "**", "*.mp3")) .pipe($.plumber()) - .pipe($.cached("sounds.copy")) .pipe(gulp.dest(path.join(buildFolder, "res", "sounds"))); }); diff --git a/res/ui/building_icons/analyzer.png b/res/ui/building_icons/analyzer.png new file mode 100644 index 00000000..61f9e1ba Binary files /dev/null and b/res/ui/building_icons/analyzer.png differ diff --git a/res/ui/building_icons/comparator.png b/res/ui/building_icons/comparator.png new file mode 100644 index 00000000..d8c95df5 Binary files /dev/null and b/res/ui/building_icons/comparator.png differ diff --git a/res/ui/building_icons/constant_signal.png b/res/ui/building_icons/constant_signal.png index c913837a..b88506ca 100644 Binary files a/res/ui/building_icons/constant_signal.png and b/res/ui/building_icons/constant_signal.png differ diff --git a/res/ui/building_icons/display.png b/res/ui/building_icons/display.png index 322d84e2..56548fde 100644 Binary files a/res/ui/building_icons/display.png and b/res/ui/building_icons/display.png differ diff --git a/res/ui/building_icons/logic_gate.png b/res/ui/building_icons/logic_gate.png index d71ddbc5..1de56dfa 100644 Binary files a/res/ui/building_icons/logic_gate.png and b/res/ui/building_icons/logic_gate.png differ diff --git a/res/ui/building_icons/transistor.png b/res/ui/building_icons/transistor.png new file mode 100644 index 00000000..5296edbb Binary files /dev/null and b/res/ui/building_icons/transistor.png differ diff --git a/res/ui/building_icons/virtual_processor.png b/res/ui/building_icons/virtual_processor.png index 310f130e..f67f4c84 100644 Binary files a/res/ui/building_icons/virtual_processor.png and b/res/ui/building_icons/virtual_processor.png differ diff --git a/res/ui/building_icons/wire.png b/res/ui/building_icons/wire.png index bc2a128d..1f07a846 100644 Binary files a/res/ui/building_icons/wire.png and b/res/ui/building_icons/wire.png differ diff --git a/res/ui/building_tutorials/analyzer.png b/res/ui/building_tutorials/analyzer.png new file mode 100644 index 00000000..d0e820c1 Binary files /dev/null and b/res/ui/building_tutorials/analyzer.png differ diff --git a/res/ui/building_tutorials/logic_gate-and.png b/res/ui/building_tutorials/logic_gate-and.png new file mode 100644 index 00000000..e8c31683 Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-and.png differ diff --git a/res/ui/building_tutorials/logic_gate-not.png b/res/ui/building_tutorials/logic_gate-not.png new file mode 100644 index 00000000..47fbeb1b Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-not.png differ diff --git a/res/ui/building_tutorials/logic_gate-or.png b/res/ui/building_tutorials/logic_gate-or.png new file mode 100644 index 00000000..d1c82770 Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-or.png differ diff --git a/res/ui/building_tutorials/logic_gate-xor.png b/res/ui/building_tutorials/logic_gate-xor.png new file mode 100644 index 00000000..d9d282f7 Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-xor.png differ diff --git a/res/ui/building_tutorials/transistor.png b/res/ui/building_tutorials/transistor.png new file mode 100644 index 00000000..e3ca0ba6 Binary files /dev/null and b/res/ui/building_tutorials/transistor.png differ diff --git a/res/ui/building_tutorials/virtual_processor-cutter.png b/res/ui/building_tutorials/virtual_processor-cutter.png new file mode 100644 index 00000000..45ad6d3a Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-cutter.png differ diff --git a/res/ui/building_tutorials/virtual_processor-painter.png b/res/ui/building_tutorials/virtual_processor-painter.png new file mode 100644 index 00000000..2b9387eb Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-painter.png differ diff --git a/res/ui/building_tutorials/virtual_processor-rotater.png b/res/ui/building_tutorials/virtual_processor-rotater.png new file mode 100644 index 00000000..25eccaf6 Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-rotater.png differ diff --git a/res/ui/building_tutorials/virtual_processor-stacker.png b/res/ui/building_tutorials/virtual_processor-stacker.png new file mode 100644 index 00000000..fdaccb02 Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-stacker.png differ diff --git a/res/ui/building_tutorials/virtual_processor-unstacker.png b/res/ui/building_tutorials/virtual_processor-unstacker.png new file mode 100644 index 00000000..697c21cd Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-unstacker.png differ diff --git a/res/ui/building_tutorials/wire-second.png b/res/ui/building_tutorials/wire-second.png new file mode 100644 index 00000000..cac945f2 Binary files /dev/null and b/res/ui/building_tutorials/wire-second.png differ diff --git a/res/ui/building_tutorials/wire.png b/res/ui/building_tutorials/wire.png new file mode 100644 index 00000000..d5cf0bed Binary files /dev/null and b/res/ui/building_tutorials/wire.png differ diff --git a/res/ui/building_tutorials/wire_tunnel.png b/res/ui/building_tutorials/wire_tunnel.png new file mode 100644 index 00000000..e8b25063 Binary files /dev/null and b/res/ui/building_tutorials/wire_tunnel.png differ diff --git a/res_built/atlas/atlas0_hq.json b/res_built/atlas/atlas0_hq.json index 6dbf5d17..ec0c5f81 100644 --- a/res_built/atlas/atlas0_hq.json +++ b/res_built/atlas/atlas0_hq.json @@ -2,7 +2,7 @@ "sprites/belt/built/forward_0.png": { - "frame": {"x":1239,"y":1197,"w":116,"h":144}, + "frame": {"x":1888,"y":604,"w":116,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, @@ -10,7 +10,7 @@ }, "sprites/belt/built/forward_1.png": { - "frame": {"x":1361,"y":1195,"w":116,"h":144}, + "frame": {"x":527,"y":1010,"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":1436,"y":753,"w":116,"h":144}, + "frame": {"x":774,"y":1139,"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":1433,"y":903,"w":116,"h":144}, + "frame": {"x":791,"y":1289,"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":1483,"y":1195,"w":116,"h":144}, + "frame": {"x":896,"y":1137,"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":1501,"y":1345,"w":116,"h":144}, + "frame": {"x":913,"y":1287,"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":1510,"y":1495,"w":116,"h":144}, + "frame": {"x":1035,"y":1285,"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":1555,"y":903,"w":116,"h":144}, + "frame": {"x":847,"y":1439,"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":1696,"y":1053,"w":116,"h":144}, + "frame": {"x":969,"y":1437,"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":1623,"y":1339,"w":116,"h":144}, + "frame": {"x":1091,"y":1435,"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":1379,"y":1345,"w":116,"h":144}, + "frame": {"x":649,"y":989,"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":706,"y":1711,"w":116,"h":144}, + "frame": {"x":652,"y":1139,"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":1861,"y":593,"w":116,"h":144}, + "frame": {"x":669,"y":1289,"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":1875,"y":743,"w":116,"h":144}, + "frame": {"x":771,"y":989,"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":1238,"y":1464,"w":130,"h":130}, + "frame": {"x":1166,"y":893,"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":1374,"y":1495,"w":130,"h":130}, + "frame": {"x":1302,"y":893,"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":1741,"y":1203,"w":130,"h":130}, + "frame": {"x":1394,"y":1554,"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":1745,"y":1339,"w":130,"h":130}, + "frame": {"x":1406,"y":1690,"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":1754,"y":1475,"w":130,"h":130}, + "frame": {"x":1406,"y":1826,"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":1813,"y":917,"w":130,"h":130}, + "frame": {"x":1454,"y":1418,"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":1818,"y":1053,"w":130,"h":130}, + "frame": {"x":1530,"y":1554,"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":1877,"y":1189,"w":130,"h":130}, + "frame": {"x":1542,"y":1690,"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":1881,"y":1325,"w":130,"h":130}, + "frame": {"x":1542,"y":1826,"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":1890,"y":1461,"w":130,"h":130}, + "frame": {"x":1881,"y":890,"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":939,"y":1712,"w":130,"h":130}, + "frame": {"x":1304,"y":1029,"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":1677,"y":917,"w":130,"h":130}, + "frame": {"x":1881,"y":754,"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":1560,"y":1053,"w":130,"h":130}, + "frame": {"x":1304,"y":1165,"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":1605,"y":1203,"w":130,"h":130}, + "frame": {"x":1318,"y":1418,"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":1754,"y":1611,"w":130,"h":130}, + "frame": {"x":707,"y":1880,"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":1890,"y":1597,"w":130,"h":130}, + "frame": {"x":571,"y":1884,"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":842,"y":1848,"w":130,"h":130}, + "frame": {"x":1574,"y":892,"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":978,"y":1848,"w":130,"h":130}, + "frame": {"x":1576,"y":1028,"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":1114,"y":1848,"w":130,"h":130}, + "frame": {"x":1576,"y":1164,"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":271,"y":1885,"w":130,"h":130}, + "frame": {"x":1712,"y":1007,"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":407,"y":1885,"w":130,"h":130}, + "frame": {"x":1712,"y":1143,"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":1211,"y":1600,"w":130,"h":130}, + "frame": {"x":1848,"y":1026,"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":1347,"y":1631,"w":130,"h":130}, + "frame": {"x":1848,"y":1162,"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":1483,"y":1645,"w":130,"h":130}, + "frame": {"x":1712,"y":1279,"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":1075,"y":1712,"w":130,"h":130}, + "frame": {"x":843,"y":1881,"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":1890,"y":1733,"w":130,"h":130}, + "frame": {"x":1438,"y":893,"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":570,"y":1878,"w":130,"h":130}, + "frame": {"x":1440,"y":1029,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, @@ -330,15 +330,23 @@ }, "sprites/belt/built/right_13.png": { - "frame": {"x":706,"y":1861,"w":130,"h":130}, + "frame": {"x":1440,"y":1165,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, "sourceSize": {"w":144,"h":144} }, +"sprites/blueprints/analyzer.png": +{ + "frame": {"x":1419,"y":154,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, "sprites/blueprints/balancer-merger-inverse.png": { - "frame": {"x":993,"y":753,"w":142,"h":138}, + "frame": {"x":521,"y":1310,"w":142,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138}, @@ -346,7 +354,7 @@ }, "sprites/blueprints/balancer-merger.png": { - "frame": {"x":1281,"y":1051,"w":139,"h":138}, + "frame": {"x":702,"y":1439,"w":139,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138}, @@ -354,7 +362,7 @@ }, "sprites/blueprints/balancer-splitter-inverse.png": { - "frame": {"x":1141,"y":753,"w":142,"h":138}, + "frame": {"x":844,"y":752,"w":142,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138}, @@ -362,7 +370,7 @@ }, "sprites/blueprints/balancer-splitter.png": { - "frame": {"x":664,"y":1174,"w":139,"h":138}, + "frame": {"x":1159,"y":1029,"w":139,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138}, @@ -370,7 +378,7 @@ }, "sprites/blueprints/balancer.png": { - "frame": {"x":298,"y":709,"w":257,"h":144}, + "frame": {"x":299,"y":710,"w":257,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":257,"h":144}, @@ -378,7 +386,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":1250,"y":1838,"w":130,"h":130}, + "frame": {"x":1848,"y":1298,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, @@ -386,7 +394,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":1726,"y":1747,"w":130,"h":130}, + "frame": {"x":1694,"y":1415,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, @@ -394,15 +402,23 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":1632,"y":1489,"w":116,"h":144}, + "frame": {"x":1157,"y":1275,"w":116,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "sourceSize": {"w":144,"h":144} }, +"sprites/blueprints/comparator.png": +{ + "frame": {"x":1140,"y":754,"w":144,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133}, + "sourceSize": {"w":144,"h":144} +}, "sprites/blueprints/constant_signal.png": { - "frame": {"x":828,"y":1709,"w":105,"h":127}, + "frame": {"x":1830,"y":1434,"w":105,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":105,"h":127}, @@ -410,7 +426,7 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":4,"y":559,"w":548,"h":144}, + "frame": {"x":5,"y":560,"w":548,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":548,"h":144}, @@ -418,7 +434,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":4,"y":1589,"w":256,"h":144}, + "frame": {"x":5,"y":1590,"w":256,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":256,"h":144}, @@ -426,7 +442,7 @@ }, "sprites/blueprints/display.png": { - "frame": {"x":1426,"y":1053,"w":128,"h":136}, + "frame": {"x":845,"y":1589,"w":128,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":128,"h":136}, @@ -434,7 +450,7 @@ }, "sprites/blueprints/filter.png": { - "frame": {"x":852,"y":304,"w":268,"h":144}, + "frame": {"x":853,"y":305,"w":268,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":0,"w":268,"h":144}, @@ -442,7 +458,7 @@ }, "sprites/blueprints/lever.png": { - "frame": {"x":1719,"y":453,"w":100,"h":116}, + "frame": {"x":1941,"y":1434,"w":100,"h":116}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":9,"w":100,"h":116}, @@ -450,7 +466,7 @@ }, "sprites/blueprints/logic_gate-not.png": { - "frame": {"x":1596,"y":603,"w":123,"h":144}, + "frame": {"x":523,"y":1160,"w":123,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":123,"h":144}, @@ -458,23 +474,15 @@ }, "sprites/blueprints/logic_gate-or.png": { - "frame": {"x":258,"y":1456,"w":144,"h":123}, + "frame": {"x":259,"y":1457,"w":144,"h":123}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":123}, "sourceSize": {"w":144,"h":144} }, -"sprites/blueprints/logic_gate-transistor.png": -{ - "frame": {"x":1568,"y":153,"w":102,"h":144}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":102,"h":144}, - "sourceSize": {"w":144,"h":144} -}, "sprites/blueprints/logic_gate-xor.png": { - "frame": {"x":1676,"y":154,"w":144,"h":143}, + "frame": {"x":1677,"y":155,"w":144,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":143}, @@ -482,7 +490,7 @@ }, "sprites/blueprints/logic_gate.png": { - "frame": {"x":1825,"y":454,"w":144,"h":133}, + "frame": {"x":1290,"y":754,"w":144,"h":133}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133}, @@ -490,7 +498,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":522,"y":1159,"w":136,"h":143}, + "frame": {"x":561,"y":1585,"w":136,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143}, @@ -498,7 +506,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":951,"y":1328,"w":136,"h":143}, + "frame": {"x":703,"y":1583,"w":136,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143}, @@ -506,7 +514,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":298,"y":859,"w":261,"h":144}, + "frame": {"x":299,"y":860,"w":261,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144}, @@ -514,7 +522,7 @@ }, "sprites/blueprints/painter-double.png": { - "frame": {"x":558,"y":304,"w":288,"h":287}, + "frame": {"x":559,"y":305,"w":288,"h":287}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":287}, @@ -522,7 +530,7 @@ }, "sprites/blueprints/painter-mirrored.png": { - "frame": {"x":1124,"y":153,"w":288,"h":144}, + "frame": {"x":1125,"y":154,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -530,7 +538,7 @@ }, "sprites/blueprints/painter-quad.png": { - "frame": {"x":558,"y":4,"w":560,"h":144}, + "frame": {"x":559,"y":5,"w":560,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":560,"h":144}, @@ -538,7 +546,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":1678,"y":4,"w":288,"h":144}, + "frame": {"x":1679,"y":5,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -546,7 +554,7 @@ }, "sprites/blueprints/reader.png": { - "frame": {"x":266,"y":1585,"w":141,"h":144}, + "frame": {"x":267,"y":1586,"w":141,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144}, @@ -554,7 +562,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":1420,"y":303,"w":143,"h":144}, + "frame": {"x":1421,"y":304,"w":143,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, @@ -562,7 +570,7 @@ }, "sprites/blueprints/rotater-rotate180.png": { - "frame": {"x":271,"y":1735,"w":143,"h":144}, + "frame": {"x":272,"y":1736,"w":143,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, @@ -570,7 +578,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":1826,"y":154,"w":143,"h":144}, + "frame": {"x":1827,"y":155,"w":143,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, @@ -578,7 +586,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":4,"y":1739,"w":261,"h":144}, + "frame": {"x":5,"y":1740,"w":261,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144}, @@ -586,15 +594,31 @@ }, "sprites/blueprints/storage.png": { - "frame": {"x":4,"y":1001,"w":250,"h":288}, + "frame": {"x":5,"y":1002,"w":250,"h":288}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":0,"w":250,"h":288}, "sourceSize": {"w":288,"h":288} }, +"sprites/blueprints/transistor-mirrored.png": +{ + "frame": {"x":1720,"y":304,"w":100,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":0,"w":100,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/blueprints/transistor.png": +{ + "frame": {"x":1569,"y":154,"w":102,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":102,"h":144}, + "sourceSize": {"w":144,"h":144} +}, "sprites/blueprints/trash.png": { - "frame": {"x":1418,"y":153,"w":144,"h":144}, + "frame": {"x":1420,"y":454,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -602,7 +626,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":806,"y":1461,"w":138,"h":125}, + "frame": {"x":558,"y":1454,"w":138,"h":125}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":19,"w":138,"h":125}, @@ -610,7 +634,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":950,"y":1477,"w":138,"h":112}, + "frame": {"x":272,"y":1886,"w":138,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":32,"w":138,"h":112}, @@ -618,7 +642,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":661,"y":1460,"w":139,"h":112}, + "frame": {"x":985,"y":1871,"w":139,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":139,"h":112}, @@ -626,23 +650,15 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":1094,"y":1475,"w":138,"h":112}, + "frame": {"x":416,"y":1886,"w":138,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":138,"h":112}, "sourceSize": {"w":144,"h":144} }, -"sprites/blueprints/virtual_processor-analyzer.png": -{ - "frame": {"x":1419,"y":453,"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-painter.png": { - "frame": {"x":711,"y":597,"w":130,"h":144}, + "frame": {"x":712,"y":598,"w":130,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":130,"h":144}, @@ -650,23 +666,15 @@ }, "sprites/blueprints/virtual_processor-rotater.png": { - "frame": {"x":1162,"y":897,"w":118,"h":144}, + "frame": {"x":893,"y":987,"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":715,"y":897,"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-stacker.png": { - "frame": {"x":560,"y":1578,"w":130,"h":144}, + "frame": {"x":571,"y":1734,"w":130,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":130,"h":144}, @@ -674,7 +682,7 @@ }, "sprites/blueprints/virtual_processor-unstacker.png": { - "frame": {"x":1569,"y":303,"w":144,"h":144}, + "frame": {"x":1570,"y":304,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -682,63 +690,31 @@ }, "sprites/blueprints/virtual_processor.png": { - "frame": {"x":847,"y":604,"w":144,"h":141}, + "frame": {"x":848,"y":605,"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":1569,"y":453,"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":558,"y":597,"w":144,"h":82}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":62,"w":144,"h":82}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/blueprints/wire-turn.png": -{ - "frame": {"x":1386,"y":1767,"w":82,"h":82}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":62,"y":62,"w":82,"h":82}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/blueprints/wire.png": -{ - "frame": {"x":1954,"y":1033,"w":20,"h":144}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":62,"y":0,"w":20,"h":144}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/blueprints/wire_tunnel-coating.png": -{ - "frame": {"x":526,"y":1009,"w":33,"h":134}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":56,"y":5,"w":33,"h":134}, - "sourceSize": {"w":144,"h":144} -}, "sprites/blueprints/wire_tunnel.png": { - "frame": {"x":807,"y":1320,"w":138,"h":135}, + "frame": {"x":1130,"y":1727,"w":138,"h":135}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":138,"h":135}, "sourceSize": {"w":144,"h":144} }, +"sprites/buildings/analyzer.png": +{ + "frame": {"x":1570,"y":454,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, "sprites/buildings/balancer-merger-inverse.png": { - "frame": {"x":864,"y":1036,"w":141,"h":136}, + "frame": {"x":979,"y":1587,"w":141,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":141,"h":136}, @@ -746,7 +722,7 @@ }, "sprites/buildings/balancer-merger.png": { - "frame": {"x":662,"y":1318,"w":139,"h":136}, + "frame": {"x":985,"y":1729,"w":139,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136}, @@ -754,7 +730,7 @@ }, "sprites/buildings/balancer-splitter-inverse.png": { - "frame": {"x":1014,"y":897,"w":142,"h":136}, + "frame": {"x":992,"y":754,"w":142,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":142,"h":136}, @@ -762,7 +738,7 @@ }, "sprites/buildings/balancer-splitter.png": { - "frame": {"x":809,"y":1178,"w":139,"h":136}, + "frame": {"x":1126,"y":1585,"w":139,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136}, @@ -770,7 +746,7 @@ }, "sprites/buildings/balancer.png": { - "frame": {"x":260,"y":1158,"w":256,"h":143}, + "frame": {"x":261,"y":1159,"w":256,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":256,"h":143}, @@ -778,7 +754,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":1238,"y":1464,"w":130,"h":130}, + "frame": {"x":1166,"y":893,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130}, @@ -786,7 +762,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":1754,"y":1611,"w":130,"h":130}, + "frame": {"x":707,"y":1880,"w":130,"h":130}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130}, @@ -794,15 +770,23 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":1239,"y":1197,"w":116,"h":144}, + "frame": {"x":1888,"y":604,"w":116,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144}, "sourceSize": {"w":144,"h":144} }, +"sprites/buildings/comparator.png": +{ + "frame": {"x":1440,"y":753,"w":143,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":143,"h":133}, + "sourceSize": {"w":144,"h":144} +}, "sprites/buildings/constant_signal.png": { - "frame": {"x":696,"y":1578,"w":104,"h":127}, + "frame": {"x":1666,"y":1554,"w":104,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":104,"h":127}, @@ -810,7 +794,7 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":1124,"y":4,"w":548,"h":143}, + "frame": {"x":1125,"y":5,"w":548,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":548,"h":143}, @@ -818,7 +802,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":258,"y":1307,"w":256,"h":143}, + "frame": {"x":259,"y":1308,"w":256,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":256,"h":143}, @@ -826,7 +810,7 @@ }, "sprites/buildings/display.png": { - "frame": {"x":1558,"y":753,"w":126,"h":135}, + "frame": {"x":1274,"y":1725,"w":126,"h":135}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":126,"h":135}, @@ -834,7 +818,7 @@ }, "sprites/buildings/filter.png": { - "frame": {"x":1146,"y":453,"w":267,"h":144}, + "frame": {"x":1147,"y":454,"w":267,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":267,"h":144}, @@ -842,7 +826,7 @@ }, "sprites/buildings/hub.png": { - "frame": {"x":4,"y":4,"w":548,"h":549}, + "frame": {"x":5,"y":5,"w":548,"h":549}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":16,"w":548,"h":549}, @@ -850,7 +834,7 @@ }, "sprites/buildings/lever.png": { - "frame": {"x":557,"y":1456,"w":98,"h":114}, + "frame": {"x":1590,"y":1434,"w":98,"h":114}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":10,"w":98,"h":114}, @@ -858,7 +842,7 @@ }, "sprites/buildings/logic_gate-not.png": { - "frame": {"x":715,"y":747,"w":122,"h":144}, + "frame": {"x":716,"y":748,"w":122,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":0,"w":122,"h":144}, @@ -866,23 +850,15 @@ }, "sprites/buildings/logic_gate-or.png": { - "frame": {"x":408,"y":1456,"w":143,"h":123}, + "frame": {"x":409,"y":1457,"w":143,"h":123}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":123}, "sourceSize": {"w":144,"h":144} }, -"sprites/buildings/logic_gate-transistor.png": -{ - "frame": {"x":1719,"y":303,"w":100,"h":144}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":100,"h":144}, - "sourceSize": {"w":144,"h":144} -}, "sprites/buildings/logic_gate-xor.png": { - "frame": {"x":997,"y":604,"w":143,"h":143}, + "frame": {"x":998,"y":605,"w":143,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":143}, @@ -890,7 +866,7 @@ }, "sprites/buildings/logic_gate.png": { - "frame": {"x":715,"y":1036,"w":143,"h":132}, + "frame": {"x":1589,"y":753,"w":143,"h":132}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":132}, @@ -898,7 +874,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":520,"y":1308,"w":136,"h":142}, + "frame": {"x":707,"y":1732,"w":136,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, @@ -906,7 +882,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":1097,"y":1197,"w":136,"h":142}, + "frame": {"x":1017,"y":987,"w":136,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, @@ -914,7 +890,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":4,"y":1889,"w":260,"h":143}, + "frame": {"x":5,"y":1890,"w":260,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143}, @@ -922,7 +898,7 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":4,"y":709,"w":288,"h":286}, + "frame": {"x":5,"y":710,"w":288,"h":286}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":286}, @@ -930,7 +906,7 @@ }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":1126,"y":303,"w":288,"h":144}, + "frame": {"x":1127,"y":304,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -938,7 +914,7 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":558,"y":154,"w":560,"h":144}, + "frame": {"x":559,"y":155,"w":560,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":560,"h":144}, @@ -946,7 +922,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":852,"y":454,"w":288,"h":144}, + "frame": {"x":853,"y":455,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -954,7 +930,7 @@ }, "sprites/buildings/reader.png": { - "frame": {"x":413,"y":1585,"w":141,"h":144}, + "frame": {"x":414,"y":1586,"w":141,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144}, @@ -962,7 +938,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":1289,"y":753,"w":141,"h":143}, + "frame": {"x":1297,"y":604,"w":141,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, @@ -970,7 +946,7 @@ }, "sprites/buildings/rotater-rotate180.png": { - "frame": {"x":1286,"y":902,"w":141,"h":143}, + "frame": {"x":1444,"y":604,"w":141,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, @@ -978,7 +954,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":1011,"y":1039,"w":141,"h":143}, + "frame": {"x":1591,"y":604,"w":141,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, @@ -986,7 +962,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":260,"y":1009,"w":260,"h":143}, + "frame": {"x":261,"y":1010,"w":260,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143}, @@ -994,15 +970,31 @@ }, "sprites/buildings/storage.png": { - "frame": {"x":4,"y":1295,"w":248,"h":288}, + "frame": {"x":5,"y":1296,"w":248,"h":288}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":0,"w":248,"h":288}, "sourceSize": {"w":288,"h":288} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":1213,"y":1425,"w":99,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":0,"w":99,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/buildings/transistor.png": +{ + "frame": {"x":1720,"y":454,"w":100,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":100,"h":144}, + "sourceSize": {"w":144,"h":144} +}, "sprites/buildings/trash.png": { - "frame": {"x":1825,"y":304,"w":144,"h":144}, + "frame": {"x":1826,"y":305,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -1010,7 +1002,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":1093,"y":1345,"w":137,"h":124}, + "frame": {"x":1130,"y":1868,"w":137,"h":124}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":20,"w":137,"h":124}, @@ -1018,7 +1010,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":1236,"y":1347,"w":137,"h":111}, + "frame": {"x":1279,"y":1301,"w":137,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":33,"w":137,"h":111}, @@ -1026,7 +1018,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":806,"y":1592,"w":137,"h":111}, + "frame": {"x":1422,"y":1301,"w":137,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111}, @@ -1034,23 +1026,15 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":949,"y":1595,"w":137,"h":111}, + "frame": {"x":1738,"y":890,"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":420,"y":1735,"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-painter.png": { - "frame": {"x":570,"y":1728,"w":130,"h":144}, + "frame": {"x":1018,"y":1135,"w":130,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":130,"h":144}, @@ -1058,23 +1042,15 @@ }, "sprites/buildings/virtual_processor-rotater.png": { - "frame": {"x":1158,"y":1047,"w":117,"h":144}, + "frame": {"x":1271,"y":1575,"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":865,"y":897,"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-stacker.png": { - "frame": {"x":1725,"y":593,"w":130,"h":144}, + "frame": {"x":849,"y":1731,"w":130,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":130,"h":144}, @@ -1082,7 +1058,7 @@ }, "sprites/buildings/virtual_processor-unstacker.png": { - "frame": {"x":1446,"y":603,"w":144,"h":143}, + "frame": {"x":1826,"y":455,"w":144,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":144,"h":143}, @@ -1090,55 +1066,15 @@ }, "sprites/buildings/virtual_processor.png": { - "frame": {"x":843,"y":751,"w":144,"h":140}, + "frame": {"x":1738,"y":604,"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":561,"y":685,"w":144,"h":144}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/buildings/wire-split.png": -{ - "frame": {"x":565,"y":985,"w":144,"h":81}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/buildings/wire-turn.png": -{ - "frame": {"x":1386,"y":1855,"w":81,"h":81}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/buildings/wire.png": -{ - "frame": {"x":2026,"y":116,"w":18,"h":144}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/buildings/wire_tunnel-coating.png": -{ - "frame": {"x":1949,"y":893,"w":32,"h":134}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":56,"y":5,"w":32,"h":134}, - "sourceSize": {"w":144,"h":144} -}, "sprites/buildings/wire_tunnel.png": { - "frame": {"x":954,"y":1188,"w":137,"h":134}, + "frame": {"x":1738,"y":750,"w":137,"h":134}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":137,"h":134}, @@ -1146,7 +1082,7 @@ }, "sprites/colors/blue.png": { - "frame": {"x":960,"y":1984,"w":54,"h":49}, + "frame": {"x":1785,"y":1745,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1154,7 +1090,7 @@ }, "sprites/colors/cyan.png": { - "frame": {"x":1020,"y":1984,"w":54,"h":49}, + "frame": {"x":1984,"y":1026,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1162,7 +1098,7 @@ }, "sprites/colors/green.png": { - "frame": {"x":1080,"y":1984,"w":54,"h":49}, + "frame": {"x":1984,"y":1081,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1170,7 +1106,7 @@ }, "sprites/colors/purple.png": { - "frame": {"x":1140,"y":1984,"w":54,"h":49}, + "frame": {"x":1984,"y":1136,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1178,7 +1114,7 @@ }, "sprites/colors/red.png": { - "frame": {"x":1987,"y":928,"w":54,"h":49}, + "frame": {"x":1984,"y":1191,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1186,7 +1122,7 @@ }, "sprites/colors/uncolored.png": { - "frame": {"x":1987,"y":983,"w":54,"h":49}, + "frame": {"x":1984,"y":1246,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1194,7 +1130,7 @@ }, "sprites/colors/white.png": { - "frame": {"x":1980,"y":1038,"w":54,"h":49}, + "frame": {"x":1984,"y":1301,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1202,7 +1138,7 @@ }, "sprites/colors/yellow.png": { - "frame": {"x":1980,"y":1093,"w":54,"h":49}, + "frame": {"x":1984,"y":1356,"w":54,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":54,"h":49}, @@ -1210,7 +1146,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":1719,"y":575,"w":12,"h":12}, + "frame": {"x":1830,"y":1415,"w":12,"h":12}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, @@ -1218,7 +1154,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":1737,"y":575,"w":12,"h":12}, + "frame": {"x":566,"y":989,"w":12,"h":12}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12}, @@ -1226,7 +1162,7 @@ }, "sprites/misc/hub_direction_indicator.png": { - "frame": {"x":1386,"y":1942,"w":48,"h":48}, + "frame": {"x":1074,"y":1989,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1234,7 +1170,7 @@ }, "sprites/misc/processor_disabled.png": { - "frame": {"x":1561,"y":1781,"w":78,"h":81}, + "frame": {"x":1785,"y":1658,"w":78,"h":81}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":78,"h":81}, @@ -1242,7 +1178,7 @@ }, "sprites/misc/processor_disconnected.png": { - "frame": {"x":1645,"y":1765,"w":65,"h":84}, + "frame": {"x":1869,"y":1658,"w":65,"h":84}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":8,"w":65,"h":84}, @@ -1250,7 +1186,7 @@ }, "sprites/misc/reader_overlay.png": { - "frame": {"x":1250,"y":1974,"w":104,"h":70}, + "frame": {"x":1678,"y":1807,"w":104,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":38,"w":104,"h":70}, @@ -1258,7 +1194,7 @@ }, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":1980,"y":1148,"w":35,"h":35}, + "frame": {"x":2008,"y":200,"w":35,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":35,"h":35}, @@ -1266,7 +1202,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":1766,"y":1883,"w":35,"h":39}, + "frame": {"x":2008,"y":155,"w":35,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":35,"h":39}, @@ -1274,7 +1210,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":865,"y":1984,"w":89,"h":44}, + "frame": {"x":979,"y":1989,"w":89,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":89,"h":44}, @@ -1282,7 +1218,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":1414,"y":1996,"w":38,"h":48}, + "frame": {"x":1769,"y":1883,"w":38,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":38,"h":48}, @@ -1290,7 +1226,7 @@ }, "sprites/wires/boolean_false.png": { - "frame": {"x":2013,"y":1189,"w":31,"h":41}, + "frame": {"x":2008,"y":241,"w":31,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":31,"h":41}, @@ -1298,7 +1234,7 @@ }, "sprites/wires/boolean_true.png": { - "frame": {"x":1862,"y":1747,"w":22,"h":41}, + "frame": {"x":1710,"y":891,"w":22,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":5,"w":22,"h":41}, @@ -1306,7 +1242,7 @@ }, "sprites/wires/display/blue.png": { - "frame": {"x":706,"y":1997,"w":47,"h":47}, + "frame": {"x":1769,"y":1937,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1314,7 +1250,7 @@ }, "sprites/wires/display/cyan.png": { - "frame": {"x":759,"y":1997,"w":47,"h":47}, + "frame": {"x":1822,"y":1927,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1322,7 +1258,7 @@ }, "sprites/wires/display/green.png": { - "frame": {"x":812,"y":1997,"w":47,"h":47}, + "frame": {"x":1940,"y":1658,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1330,7 +1266,7 @@ }, "sprites/wires/display/purple.png": { - "frame": {"x":1997,"y":716,"w":47,"h":47}, + "frame": {"x":1993,"y":1647,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1338,7 +1274,7 @@ }, "sprites/wires/display/red.png": { - "frame": {"x":1997,"y":769,"w":47,"h":47}, + "frame": {"x":1940,"y":1711,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1346,7 +1282,7 @@ }, "sprites/wires/display/white.png": { - "frame": {"x":1997,"y":822,"w":47,"h":47}, + "frame": {"x":1993,"y":1700,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1354,7 +1290,7 @@ }, "sprites/wires/display/yellow.png": { - "frame": {"x":1997,"y":875,"w":47,"h":47}, + "frame": {"x":1565,"y":1301,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47}, @@ -1362,7 +1298,7 @@ }, "sprites/wires/lever_on.png": { - "frame": {"x":1619,"y":1645,"w":101,"h":114}, + "frame": {"x":1678,"y":1687,"w":101,"h":114}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":10,"w":101,"h":114}, @@ -1370,7 +1306,7 @@ }, "sprites/wires/logical_acceptor.png": { - "frame": {"x":1972,"y":4,"w":62,"h":106}, + "frame": {"x":1976,"y":455,"w":62,"h":106}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":43,"y":0,"w":62,"h":106}, @@ -1378,7 +1314,7 @@ }, "sprites/wires/logical_ejector.png": { - "frame": {"x":1647,"y":1855,"w":60,"h":67}, + "frame": {"x":1788,"y":1800,"w":60,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":44,"y":0,"w":60,"h":67}, @@ -1386,7 +1322,7 @@ }, "sprites/wires/network_conflict.png": { - "frame": {"x":1713,"y":1883,"w":47,"h":44}, + "frame": {"x":1128,"y":1998,"w":47,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":47,"h":44}, @@ -1394,7 +1330,7 @@ }, "sprites/wires/network_empty.png": { - "frame": {"x":1200,"y":1984,"w":41,"h":48}, + "frame": {"x":1256,"y":1173,"w":41,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":41,"h":48}, @@ -1402,47 +1338,15 @@ }, "sprites/wires/overlay_tile.png": { - "frame": {"x":1211,"y":1736,"w":96,"h":96}, + "frame": {"x":1154,"y":1173,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/color_cross.png": -{ - "frame": {"x":565,"y":835,"w":144,"h":144}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/wires/sets/color_forward.png": -{ - "frame": {"x":2026,"y":266,"w":18,"h":144}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/wires/sets/color_split.png": -{ - "frame": {"x":565,"y":1072,"w":144,"h":81}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, - "sourceSize": {"w":144,"h":144} -}, -"sprites/wires/sets/color_turn.png": -{ - "frame": {"x":1474,"y":1781,"w":81,"h":81}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, - "sourceSize": {"w":144,"h":144} -}, "sprites/wires/sets/conflict_cross.png": { - "frame": {"x":1146,"y":603,"w":144,"h":144}, + "frame": {"x":421,"y":1736,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -1450,95 +1354,127 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":2026,"y":416,"w":18,"h":144}, + "frame": {"x":1973,"y":5,"w":26,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144}, + "spriteSourceSize": {"x":59,"y":0,"w":26,"h":144}, "sourceSize": {"w":144,"h":144} }, "sprites/wires/sets/conflict_split.png": { - "frame": {"x":1725,"y":743,"w":144,"h":81}, + "frame": {"x":559,"y":598,"w":144,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, + "spriteSourceSize": {"x":0,"y":59,"w":144,"h":85}, "sourceSize": {"w":144,"h":144} }, "sprites/wires/sets/conflict_turn.png": { - "frame": {"x":1473,"y":1868,"w":81,"h":81}, + "frame": {"x":1678,"y":1883,"w":85,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, + "spriteSourceSize": {"x":59,"y":59,"w":85,"h":85}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/regular_cross.png": +"sprites/wires/sets/first_cross.png": { - "frame": {"x":561,"y":685,"w":144,"h":144}, + "frame": {"x":562,"y":689,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/regular_forward.png": +"sprites/wires/sets/first_forward.png": { - "frame": {"x":2026,"y":116,"w":18,"h":144}, + "frame": {"x":2005,"y":5,"w":26,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144}, + "spriteSourceSize": {"x":59,"y":0,"w":26,"h":144}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/regular_split.png": +"sprites/wires/sets/first_split.png": { - "frame": {"x":565,"y":985,"w":144,"h":81}, + "frame": {"x":716,"y":898,"w":144,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, + "spriteSourceSize": {"x":0,"y":59,"w":144,"h":85}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/regular_turn.png": +"sprites/wires/sets/first_turn.png": { - "frame": {"x":1386,"y":1855,"w":81,"h":81}, + "frame": {"x":1776,"y":1567,"w":85,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, + "spriteSourceSize": {"x":59,"y":59,"w":85,"h":85}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/shape_cross.png": +"sprites/wires/sets/second_cross.png": { - "frame": {"x":1296,"y":603,"w":144,"h":144}, + "frame": {"x":566,"y":839,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/shape_forward.png": +"sprites/wires/sets/second_forward.png": { - "frame": {"x":2026,"y":566,"w":18,"h":144}, + "frame": {"x":1976,"y":155,"w":26,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144}, + "spriteSourceSize": {"x":59,"y":0,"w":26,"h":144}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/shape_split.png": +"sprites/wires/sets/second_split.png": { - "frame": {"x":1690,"y":830,"w":144,"h":81}, + "frame": {"x":866,"y":896,"w":144,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81}, + "spriteSourceSize": {"x":0,"y":59,"w":144,"h":85}, "sourceSize": {"w":144,"h":144} }, -"sprites/wires/sets/shape_turn.png": +"sprites/wires/sets/second_turn.png": { - "frame": {"x":1560,"y":1868,"w":81,"h":81}, + "frame": {"x":1867,"y":1567,"w":85,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81}, + "spriteSourceSize": {"x":59,"y":59,"w":85,"h":85}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/wires/sets/third_cross.png": +{ + "frame": {"x":1147,"y":604,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/wires/sets/third_forward.png": +{ + "frame": {"x":1976,"y":305,"w":26,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":59,"y":0,"w":26,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/wires/sets/third_split.png": +{ + "frame": {"x":1016,"y":896,"w":144,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":59,"w":144,"h":85}, + "sourceSize": {"w":144,"h":144} +}, +"sprites/wires/sets/third_turn.png": +{ + "frame": {"x":1958,"y":1556,"w":85,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":59,"y":59,"w":85,"h":85}, "sourceSize": {"w":144,"h":144} }, "sprites/wires/wires_preview.png": { - "frame": {"x":1360,"y":1996,"w":48,"h":48}, + "frame": {"x":1813,"y":1873,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1551,6 +1487,6 @@ "format": "RGBA8888", "size": {"w":2048,"h":2048}, "scale": "0.75", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:d64dc60885c70016feef302a1c9d887e:b61ebeff39ec84001fc764203098f3eb:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_hq.png b/res_built/atlas/atlas0_hq.png index 63dbe6ea..446b104a 100644 Binary files a/res_built/atlas/atlas0_hq.png and b/res_built/atlas/atlas0_hq.png differ diff --git a/res_built/atlas/atlas0_lq.json b/res_built/atlas/atlas0_lq.json index de5ae000..7acb5a5b 100644 --- a/res_built/atlas/atlas0_lq.json +++ b/res_built/atlas/atlas0_lq.json @@ -2,7 +2,7 @@ "sprites/belt/built/forward_0.png": { - "frame": {"x":902,"y":294,"w":40,"h":48}, + "frame": {"x":901,"y":349,"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":200,"y":476,"w":40,"h":48}, + "frame": {"x":901,"y":403,"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":146,"y":514,"w":40,"h":48}, + "frame": {"x":853,"y":507,"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":50,"y":552,"w":40,"h":48}, + "frame": {"x":939,"y":520,"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":4,"y":553,"w":40,"h":48}, + "frame": {"x":462,"y":405,"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":96,"y":552,"w":40,"h":48}, + "frame": {"x":508,"y":405,"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":559,"y":432,"w":40,"h":48}, + "frame": {"x":358,"y":453,"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":605,"y":432,"w":40,"h":48}, + "frame": {"x":308,"y":479,"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":651,"y":480,"w":40,"h":48}, + "frame": {"x":258,"y":525,"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":697,"y":499,"w":40,"h":48}, + "frame": {"x":404,"y":453,"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":246,"y":476,"w":40,"h":48}, + "frame": {"x":162,"y":473,"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":54,"y":498,"w":40,"h":48}, + "frame": {"x":715,"y":419,"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":4,"y":499,"w":40,"h":48}, + "frame": {"x":761,"y":427,"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":100,"y":498,"w":40,"h":48}, + "frame": {"x":807,"y":472,"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":668,"y":380,"w":44,"h":44}, + "frame": {"x":839,"y":422,"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":718,"y":399,"w":44,"h":44}, + "frame": {"x":889,"y":457,"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":932,"y":480,"w":44,"h":44}, + "frame": {"x":436,"y":303,"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":718,"y":449,"w":44,"h":44}, + "frame": {"x":316,"y":329,"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":768,"y":449,"w":44,"h":44}, + "frame": {"x":262,"y":375,"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":832,"y":478,"w":44,"h":44}, + "frame": {"x":208,"y":377,"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":882,"y":500,"w":44,"h":44}, + "frame": {"x":112,"y":446,"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":932,"y":530,"w":44,"h":44}, + "frame": {"x":58,"y":495,"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":384,"y":302,"w":44,"h":44}, + "frame": {"x":5,"y":504,"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":207,"y":376,"w":44,"h":44}, + "frame": {"x":366,"y":353,"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":668,"y":430,"w":44,"h":44}, + "frame": {"x":939,"y":470,"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":768,"y":399,"w":44,"h":44}, + "frame": {"x":567,"y":329,"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":832,"y":428,"w":44,"h":44}, + "frame": {"x":617,"y":329,"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":882,"y":450,"w":44,"h":44}, + "frame": {"x":386,"y":303,"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":257,"y":376,"w":44,"h":44}, + "frame": {"x":312,"y":379,"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":434,"y":302,"w":44,"h":44}, + "frame": {"x":258,"y":425,"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":252,"y":426,"w":44,"h":44}, + "frame": {"x":416,"y":353,"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":427,"y":352,"w":44,"h":44}, + "frame": {"x":466,"y":355,"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":477,"y":352,"w":44,"h":44}, + "frame": {"x":516,"y":355,"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":561,"y":382,"w":44,"h":44}, + "frame": {"x":362,"y":403,"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":58,"y":448,"w":44,"h":44}, + "frame": {"x":308,"y":429,"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":4,"y":449,"w":44,"h":44}, + "frame": {"x":258,"y":475,"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":108,"y":448,"w":44,"h":44}, + "frame": {"x":208,"y":477,"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":376,"y":402,"w":44,"h":44}, + "frame": {"x":412,"y":403,"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":484,"y":302,"w":44,"h":44}, + "frame": {"x":208,"y":427,"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":377,"y":352,"w":44,"h":44}, + "frame": {"x":108,"y":496,"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":307,"y":382,"w":44,"h":44}, + "frame": {"x":55,"y":545,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, @@ -330,15 +330,23 @@ }, "sprites/belt/built/right_13.png": { - "frame": {"x":202,"y":426,"w":44,"h":44}, + "frame": {"x":5,"y":554,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, "sourceSize": {"w":48,"h":48} }, +"sprites/blueprints/analyzer.png": +{ + "frame": {"x":311,"y":113,"w":48,"h":48}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, + "sourceSize": {"w":48,"h":48} +}, "sprites/blueprints/balancer-merger-inverse.png": { - "frame": {"x":310,"y":112,"w":48,"h":48}, + "frame": {"x":311,"y":167,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -346,7 +354,7 @@ }, "sprites/blueprints/balancer-merger.png": { - "frame": {"x":678,"y":274,"w":47,"h":47}, + "frame": {"x":795,"y":269,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -354,7 +362,7 @@ }, "sprites/blueprints/balancer-splitter-inverse.png": { - "frame": {"x":310,"y":166,"w":48,"h":48}, + "frame": {"x":966,"y":5,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -362,7 +370,7 @@ }, "sprites/blueprints/balancer-splitter.png": { - "frame": {"x":731,"y":302,"w":47,"h":47}, + "frame": {"x":848,"y":269,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -370,7 +378,7 @@ }, "sprites/blueprints/balancer.png": { - "frame": {"x":770,"y":58,"w":87,"h":48}, + "frame": {"x":771,"y":59,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -378,7 +386,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":302,"y":432,"w":44,"h":44}, + "frame": {"x":566,"y":379,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, @@ -386,7 +394,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":426,"y":402,"w":44,"h":44}, + "frame": {"x":616,"y":379,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, @@ -394,15 +402,23 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":743,"y":499,"w":40,"h":48}, + "frame": {"x":158,"y":527,"w":40,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "sourceSize": {"w":48,"h":48} }, +"sprites/blueprints/comparator.png": +{ + "frame": {"x":497,"y":250,"w":48,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, + "sourceSize": {"w":48,"h":48} +}, "sprites/blueprints/constant_signal.png": { - "frame": {"x":166,"y":268,"w":36,"h":43}, + "frame": {"x":167,"y":269,"w":36,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43}, @@ -410,7 +426,7 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":4,"y":58,"w":184,"h":48}, + "frame": {"x":5,"y":59,"w":184,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, @@ -418,7 +434,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":863,"y":58,"w":87,"h":48}, + "frame": {"x":864,"y":59,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -426,7 +442,7 @@ }, "sprites/blueprints/display.png": { - "frame": {"x":618,"y":328,"w":44,"h":46}, + "frame": {"x":739,"y":367,"w":44,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46}, @@ -434,7 +450,7 @@ }, "sprites/blueprints/filter.png": { - "frame": {"x":582,"y":4,"w":91,"h":48}, + "frame": {"x":583,"y":5,"w":91,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":91,"h":48}, @@ -442,7 +458,7 @@ }, "sprites/blueprints/lever.png": { - "frame": {"x":982,"y":483,"w":35,"h":41}, + "frame": {"x":167,"y":426,"w":35,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":2,"w":35,"h":41}, @@ -450,7 +466,7 @@ }, "sprites/blueprints/logic_gate-not.png": { - "frame": {"x":316,"y":220,"w":42,"h":48}, + "frame": {"x":317,"y":221,"w":42,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":42,"h":48}, @@ -458,23 +474,15 @@ }, "sprites/blueprints/logic_gate-or.png": { - "frame": {"x":58,"y":322,"w":48,"h":42}, + "frame": {"x":5,"y":323,"w":48,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42}, "sourceSize": {"w":48,"h":48} }, -"sprites/blueprints/logic_gate-transistor.png": -{ - "frame": {"x":166,"y":317,"w":35,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48}, - "sourceSize": {"w":48,"h":48} -}, "sprites/blueprints/logic_gate-xor.png": { - "frame": {"x":965,"y":4,"w":48,"h":48}, + "frame": {"x":957,"y":59,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -482,7 +490,7 @@ }, "sprites/blueprints/logic_gate.png": { - "frame": {"x":208,"y":274,"w":48,"h":45}, + "frame": {"x":209,"y":275,"w":48,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, @@ -490,7 +498,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":849,"y":268,"w":47,"h":48}, + "frame": {"x":59,"y":441,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -498,7 +506,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":948,"y":328,"w":47,"h":48}, + "frame": {"x":5,"y":450,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -506,7 +514,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":775,"y":4,"w":89,"h":48}, + "frame": {"x":776,"y":5,"w":89,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, @@ -514,7 +522,7 @@ }, "sprites/blueprints/painter-double.png": { - "frame": {"x":4,"y":112,"w":96,"h":96}, + "frame": {"x":5,"y":113,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -522,7 +530,7 @@ }, "sprites/blueprints/painter-mirrored.png": { - "frame": {"x":208,"y":112,"w":96,"h":48}, + "frame": {"x":209,"y":113,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -530,7 +538,7 @@ }, "sprites/blueprints/painter-quad.png": { - "frame": {"x":4,"y":4,"w":188,"h":48}, + "frame": {"x":5,"y":5,"w":188,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, @@ -538,7 +546,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":208,"y":166,"w":96,"h":48}, + "frame": {"x":209,"y":167,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -546,7 +554,7 @@ }, "sprites/blueprints/reader.png": { - "frame": {"x":956,"y":58,"w":48,"h":48}, + "frame": {"x":951,"y":113,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -554,7 +562,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":950,"y":112,"w":48,"h":48}, + "frame": {"x":951,"y":167,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -562,7 +570,7 @@ }, "sprites/blueprints/rotater-rotate180.png": { - "frame": {"x":950,"y":166,"w":48,"h":48}, + "frame": {"x":583,"y":167,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -570,7 +578,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":582,"y":166,"w":48,"h":48}, + "frame": {"x":637,"y":167,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -578,7 +586,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":870,"y":4,"w":89,"h":48}, + "frame": {"x":871,"y":5,"w":89,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, @@ -586,15 +594,31 @@ }, "sprites/blueprints/storage.png": { - "frame": {"x":768,"y":112,"w":85,"h":96}, + "frame": {"x":769,"y":113,"w":85,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/blueprints/transistor-mirrored.png": +{ + "frame": {"x":899,"y":507,"w":34,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":0,"w":34,"h":48}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/blueprints/transistor.png": +{ + "frame": {"x":167,"y":318,"w":35,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48}, + "sourceSize": {"w":48,"h":48} +}, "sprites/blueprints/trash.png": { - "frame": {"x":636,"y":166,"w":48,"h":48}, + "frame": {"x":691,"y":167,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -602,7 +626,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":4,"y":322,"w":48,"h":43}, + "frame": {"x":262,"y":326,"w":48,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":48,"h":43}, @@ -610,7 +634,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":58,"y":370,"w":48,"h":38}, + "frame": {"x":113,"y":323,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":10,"w":48,"h":38}, @@ -618,7 +642,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":4,"y":371,"w":48,"h":38}, + "frame": {"x":113,"y":367,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, @@ -626,23 +650,15 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":112,"y":370,"w":48,"h":38}, + "frame": {"x":5,"y":371,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, "sourceSize": {"w":48,"h":48} }, -"sprites/blueprints/virtual_processor-analyzer.png": -{ - "frame": {"x":690,"y":166,"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-painter.png": { - "frame": {"x":837,"y":374,"w":44,"h":48}, + "frame": {"x":573,"y":275,"w":44,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":44,"h":48}, @@ -650,23 +666,15 @@ }, "sprites/blueprints/virtual_processor-rotater.png": { - "frame": {"x":316,"y":274,"w":41,"h":48}, + "frame": {"x":317,"y":275,"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":262,"y":274,"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-stacker.png": { - "frame": {"x":887,"y":396,"w":44,"h":48}, + "frame": {"x":497,"y":301,"w":44,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":44,"h":48}, @@ -674,7 +682,7 @@ }, "sprites/blueprints/virtual_processor-unstacker.png": { - "frame": {"x":388,"y":195,"w":48,"h":48}, + "frame": {"x":389,"y":196,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -682,63 +690,31 @@ }, "sprites/blueprints/virtual_processor.png": { - "frame": {"x":442,"y":195,"w":48,"h":48}, + "frame": {"x":443,"y":196,"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":496,"y":195,"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":58,"y":414,"w":48,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/blueprints/wire-turn.png": -{ - "frame": {"x":166,"y":446,"w":28,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/blueprints/wire.png": -{ - "frame": {"x":1010,"y":79,"w":8,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/blueprints/wire_tunnel-coating.png": -{ - "frame": {"x":550,"y":294,"w":12,"h":46}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46}, - "sourceSize": {"w":48,"h":48} -}, "sprites/blueprints/wire_tunnel.png": { - "frame": {"x":388,"y":249,"w":48,"h":47}, + "frame": {"x":688,"y":221,"w":48,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, "sourceSize": {"w":48,"h":48} }, +"sprites/buildings/analyzer.png": +{ + "frame": {"x":497,"y":196,"w":48,"h":48}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, + "sourceSize": {"w":48,"h":48} +}, "sprites/buildings/balancer-merger-inverse.png": { - "frame": {"x":442,"y":249,"w":48,"h":47}, + "frame": {"x":389,"y":250,"w":48,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, @@ -746,7 +722,7 @@ }, "sprites/buildings/balancer-merger.png": { - "frame": {"x":678,"y":327,"w":47,"h":47}, + "frame": {"x":948,"y":329,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -754,7 +730,7 @@ }, "sprites/buildings/balancer-splitter-inverse.png": { - "frame": {"x":496,"y":249,"w":48,"h":47}, + "frame": {"x":443,"y":250,"w":48,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, @@ -762,7 +738,7 @@ }, "sprites/buildings/balancer-splitter.png": { - "frame": {"x":784,"y":302,"w":47,"h":47}, + "frame": {"x":795,"y":322,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -770,7 +746,7 @@ }, "sprites/buildings/balancer.png": { - "frame": {"x":582,"y":112,"w":87,"h":48}, + "frame": {"x":583,"y":113,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -778,7 +754,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":668,"y":380,"w":44,"h":44}, + "frame": {"x":839,"y":422,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44}, @@ -786,7 +762,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":257,"y":376,"w":44,"h":44}, + "frame": {"x":312,"y":379,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44}, @@ -794,15 +770,23 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":902,"y":294,"w":40,"h":48}, + "frame": {"x":901,"y":349,"w":40,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48}, "sourceSize": {"w":48,"h":48} }, +"sprites/buildings/comparator.png": +{ + "frame": {"x":263,"y":275,"w":48,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, + "sourceSize": {"w":48,"h":48} +}, "sprites/buildings/constant_signal.png": { - "frame": {"x":906,"y":214,"w":36,"h":43}, + "frame": {"x":907,"y":215,"w":36,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43}, @@ -810,7 +794,7 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":194,"y":58,"w":184,"h":48}, + "frame": {"x":195,"y":59,"w":184,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, @@ -818,7 +802,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":675,"y":112,"w":87,"h":48}, + "frame": {"x":676,"y":113,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -826,7 +810,7 @@ }, "sprites/buildings/display.png": { - "frame": {"x":618,"y":380,"w":44,"h":46}, + "frame": {"x":789,"y":375,"w":44,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46}, @@ -834,7 +818,7 @@ }, "sprites/buildings/filter.png": { - "frame": {"x":679,"y":4,"w":90,"h":48}, + "frame": {"x":680,"y":5,"w":90,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":90,"h":48}, @@ -842,7 +826,7 @@ }, "sprites/buildings/hub.png": { - "frame": {"x":392,"y":4,"w":184,"h":185}, + "frame": {"x":393,"y":5,"w":184,"h":185}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":184,"h":185}, @@ -850,7 +834,7 @@ }, "sprites/buildings/lever.png": { - "frame": {"x":982,"y":576,"w":34,"h":40}, + "frame": {"x":204,"y":527,"w":34,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":2,"w":34,"h":40}, @@ -858,7 +842,7 @@ }, "sprites/buildings/logic_gate-not.png": { - "frame": {"x":476,"y":402,"w":43,"h":48}, + "frame": {"x":666,"y":382,"w":43,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":43,"h":48}, @@ -866,23 +850,15 @@ }, "sprites/buildings/logic_gate-or.png": { - "frame": {"x":112,"y":322,"w":48,"h":42}, + "frame": {"x":59,"y":323,"w":48,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42}, "sourceSize": {"w":48,"h":48} }, -"sprites/buildings/logic_gate-transistor.png": -{ - "frame": {"x":166,"y":371,"w":35,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48}, - "sourceSize": {"w":48,"h":48} -}, "sprites/buildings/logic_gate-xor.png": { - "frame": {"x":208,"y":220,"w":48,"h":48}, + "frame": {"x":209,"y":221,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -890,7 +866,7 @@ }, "sprites/buildings/logic_gate.png": { - "frame": {"x":207,"y":325,"w":48,"h":45}, + "frame": {"x":208,"y":326,"w":48,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45}, @@ -898,7 +874,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":572,"y":274,"w":47,"h":48}, + "frame": {"x":742,"y":269,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -906,7 +882,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":625,"y":274,"w":47,"h":48}, + "frame": {"x":688,"y":274,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -914,7 +890,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":582,"y":58,"w":88,"h":48}, + "frame": {"x":583,"y":59,"w":88,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, @@ -922,7 +898,7 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":106,"y":112,"w":96,"h":96}, + "frame": {"x":107,"y":113,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -930,7 +906,7 @@ }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":4,"y":214,"w":96,"h":48}, + "frame": {"x":5,"y":215,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -938,7 +914,7 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":198,"y":4,"w":188,"h":48}, + "frame": {"x":199,"y":5,"w":188,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, @@ -946,7 +922,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":106,"y":214,"w":96,"h":48}, + "frame": {"x":107,"y":215,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -954,7 +930,7 @@ }, "sprites/buildings/reader.png": { - "frame": {"x":262,"y":220,"w":48,"h":48}, + "frame": {"x":263,"y":221,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -962,7 +938,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":4,"y":268,"w":48,"h":48}, + "frame": {"x":5,"y":269,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -970,7 +946,7 @@ }, "sprites/buildings/rotater-rotate180.png": { - "frame": {"x":58,"y":268,"w":48,"h":48}, + "frame": {"x":59,"y":269,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -978,7 +954,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":112,"y":268,"w":48,"h":48}, + "frame": {"x":113,"y":269,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -986,7 +962,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":676,"y":58,"w":88,"h":48}, + "frame": {"x":677,"y":59,"w":88,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, @@ -994,15 +970,31 @@ }, "sprites/buildings/storage.png": { - "frame": {"x":859,"y":112,"w":85,"h":96}, + "frame": {"x":860,"y":113,"w":85,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":985,"y":521,"w":34,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":0,"w":34,"h":48}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/buildings/transistor.png": +{ + "frame": {"x":167,"y":372,"w":35,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48}, + "sourceSize": {"w":48,"h":48} +}, "sprites/buildings/trash.png": { - "frame": {"x":744,"y":214,"w":48,"h":48}, + "frame": {"x":745,"y":215,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1010,7 +1002,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":890,"y":348,"w":47,"h":42}, + "frame": {"x":848,"y":374,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":6,"w":47,"h":42}, @@ -1018,7 +1010,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":943,"y":382,"w":47,"h":38}, + "frame": {"x":947,"y":382,"w":47,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":10,"w":47,"h":38}, @@ -1026,7 +1018,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":731,"y":355,"w":47,"h":38}, + "frame": {"x":741,"y":323,"w":47,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, @@ -1034,23 +1026,15 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":784,"y":355,"w":47,"h":38}, + "frame": {"x":947,"y":426,"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":798,"y":214,"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-painter.png": { - "frame": {"x":937,"y":426,"w":44,"h":48}, + "frame": {"x":623,"y":275,"w":44,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":44,"h":48}, @@ -1058,23 +1042,15 @@ }, "sprites/buildings/virtual_processor-rotater.png": { - "frame": {"x":315,"y":328,"w":41,"h":48}, + "frame": {"x":901,"y":295,"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":261,"y":325,"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-stacker.png": { - "frame": {"x":568,"y":328,"w":44,"h":48}, + "frame": {"x":673,"y":328,"w":44,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":44,"h":48}, @@ -1082,7 +1058,7 @@ }, "sprites/buildings/virtual_processor-unstacker.png": { - "frame": {"x":852,"y":214,"w":48,"h":48}, + "frame": {"x":799,"y":215,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1090,55 +1066,15 @@ }, "sprites/buildings/virtual_processor.png": { - "frame": {"x":948,"y":220,"w":48,"h":48}, + "frame": {"x":853,"y":215,"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":948,"y":274,"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-split.png": -{ - "frame": {"x":4,"y":415,"w":48,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/buildings/wire-turn.png": -{ - "frame": {"x":527,"y":381,"w":28,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/buildings/wire.png": -{ - "frame": {"x":818,"y":420,"w":8,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/buildings/wire_tunnel-coating.png": -{ - "frame": {"x":996,"y":393,"w":12,"h":46}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46}, - "sourceSize": {"w":48,"h":48} -}, "sprites/buildings/wire_tunnel.png": { - "frame": {"x":837,"y":322,"w":47,"h":46}, + "frame": {"x":848,"y":322,"w":47,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":47,"h":46}, @@ -1146,7 +1082,7 @@ }, "sprites/colors/blue.png": { - "frame": {"x":364,"y":141,"w":18,"h":18}, + "frame": {"x":365,"y":142,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1154,7 +1090,7 @@ }, "sprites/colors/cyan.png": { - "frame": {"x":364,"y":165,"w":18,"h":18}, + "frame": {"x":365,"y":166,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1162,7 +1098,7 @@ }, "sprites/colors/green.png": { - "frame": {"x":364,"y":189,"w":18,"h":18}, + "frame": {"x":365,"y":190,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1170,7 +1106,7 @@ }, "sprites/colors/purple.png": { - "frame": {"x":744,"y":166,"w":18,"h":18}, + "frame": {"x":745,"y":167,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1178,7 +1114,7 @@ }, "sprites/colors/red.png": { - "frame": {"x":744,"y":190,"w":18,"h":18}, + "frame": {"x":745,"y":191,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1186,7 +1122,7 @@ }, "sprites/colors/uncolored.png": { - "frame": {"x":364,"y":213,"w":18,"h":18}, + "frame": {"x":365,"y":214,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1194,7 +1130,7 @@ }, "sprites/colors/white.png": { - "frame": {"x":364,"y":237,"w":18,"h":18}, + "frame": {"x":365,"y":238,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1202,7 +1138,7 @@ }, "sprites/colors/yellow.png": { - "frame": {"x":1002,"y":221,"w":18,"h":18}, + "frame": {"x":365,"y":262,"w":18,"h":18}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":18}, @@ -1210,7 +1146,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":731,"y":274,"w":4,"h":4}, + "frame": {"x":1011,"y":59,"w":4,"h":4}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, @@ -1218,7 +1154,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":731,"y":284,"w":4,"h":4}, + "frame": {"x":1011,"y":69,"w":4,"h":4}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, @@ -1226,7 +1162,7 @@ }, "sprites/misc/hub_direction_indicator.png": { - "frame": {"x":1004,"y":133,"w":16,"h":16}, + "frame": {"x":1003,"y":248,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1234,7 +1170,7 @@ }, "sprites/misc/processor_disabled.png": { - "frame": {"x":534,"y":346,"w":28,"h":29}, + "frame": {"x":5,"y":604,"w":28,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":28,"h":29}, @@ -1242,7 +1178,7 @@ }, "sprites/misc/processor_disconnected.png": { - "frame": {"x":550,"y":237,"w":23,"h":29}, + "frame": {"x":551,"y":238,"w":23,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":23,"h":29}, @@ -1250,7 +1186,7 @@ }, "sprites/misc/reader_overlay.png": { - "frame": {"x":906,"y":263,"w":36,"h":25}, + "frame": {"x":907,"y":264,"w":36,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":12,"w":36,"h":25}, @@ -1258,7 +1194,7 @@ }, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":1001,"y":355,"w":13,"h":13}, + "frame": {"x":1005,"y":135,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -1266,7 +1202,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":1001,"y":374,"w":13,"h":13}, + "frame": {"x":1005,"y":154,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -1274,7 +1210,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":166,"y":425,"w":30,"h":15}, + "frame": {"x":989,"y":500,"w":30,"h":15}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":30,"h":15}, @@ -1282,7 +1218,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":1001,"y":333,"w":14,"h":16}, + "frame": {"x":1005,"y":113,"w":14,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, @@ -1290,7 +1226,7 @@ }, "sprites/wires/boolean_false.png": { - "frame": {"x":818,"y":399,"w":12,"h":15}, + "frame": {"x":1005,"y":173,"w":12,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":12,"h":15}, @@ -1298,7 +1234,7 @@ }, "sprites/wires/boolean_true.png": { - "frame": {"x":1010,"y":58,"w":9,"h":15}, + "frame": {"x":673,"y":275,"w":9,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":9,"h":15}, @@ -1306,7 +1242,7 @@ }, "sprites/wires/display/blue.png": { - "frame": {"x":1004,"y":155,"w":16,"h":16}, + "frame": {"x":1003,"y":270,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1314,7 +1250,7 @@ }, "sprites/wires/display/cyan.png": { - "frame": {"x":1004,"y":177,"w":16,"h":16}, + "frame": {"x":1003,"y":292,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1322,7 +1258,7 @@ }, "sprites/wires/display/green.png": { - "frame": {"x":1004,"y":199,"w":16,"h":16}, + "frame": {"x":1003,"y":314,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1330,7 +1266,7 @@ }, "sprites/wires/display/purple.png": { - "frame": {"x":1002,"y":245,"w":16,"h":16}, + "frame": {"x":551,"y":273,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1338,7 +1274,7 @@ }, "sprites/wires/display/red.png": { - "frame": {"x":1002,"y":267,"w":16,"h":16}, + "frame": {"x":364,"y":286,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1346,7 +1282,7 @@ }, "sprites/wires/display/white.png": { - "frame": {"x":1002,"y":289,"w":16,"h":16}, + "frame": {"x":1001,"y":336,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1354,7 +1290,7 @@ }, "sprites/wires/display/yellow.png": { - "frame": {"x":1002,"y":311,"w":16,"h":16}, + "frame": {"x":1001,"y":358,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1362,7 +1298,7 @@ }, "sprites/wires/lever_on.png": { - "frame": {"x":982,"y":530,"w":35,"h":40}, + "frame": {"x":105,"y":546,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":2,"w":35,"h":40}, @@ -1370,7 +1306,7 @@ }, "sprites/wires/logical_acceptor.png": { - "frame": {"x":550,"y":195,"w":23,"h":36}, + "frame": {"x":551,"y":196,"w":23,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":23,"h":36}, @@ -1378,7 +1314,7 @@ }, "sprites/wires/logical_ejector.png": { - "frame": {"x":364,"y":112,"w":22,"h":23}, + "frame": {"x":365,"y":113,"w":22,"h":23}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":22,"h":23}, @@ -1386,7 +1322,7 @@ }, "sprites/wires/network_conflict.png": { - "frame": {"x":364,"y":261,"w":16,"h":16}, + "frame": {"x":1001,"y":380,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1394,7 +1330,7 @@ }, "sprites/wires/network_empty.png": { - "frame": {"x":363,"y":283,"w":15,"h":16}, + "frame": {"x":1000,"y":424,"w":15,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":15,"h":16}, @@ -1402,47 +1338,15 @@ }, "sprites/wires/overlay_tile.png": { - "frame": {"x":987,"y":445,"w":32,"h":32}, + "frame": {"x":204,"y":573,"w":32,"h":32}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32}, "sourceSize": {"w":32,"h":32} }, -"sprites/wires/sets/color_cross.png": -{ - "frame": {"x":579,"y":220,"w":48,"h":48}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/wires/sets/color_forward.png": -{ - "frame": {"x":818,"y":474,"w":8,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/wires/sets/color_split.png": -{ - "frame": {"x":112,"y":414,"w":48,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, - "sourceSize": {"w":48,"h":48} -}, -"sprites/wires/sets/color_turn.png": -{ - "frame": {"x":525,"y":415,"w":28,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, - "sourceSize": {"w":48,"h":48} -}, "sprites/wires/sets/conflict_cross.png": { - "frame": {"x":633,"y":220,"w":48,"h":48}, + "frame": {"x":949,"y":221,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1450,95 +1354,127 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":363,"y":305,"w":8,"h":48}, + "frame": {"x":1005,"y":194,"w":10,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, + "spriteSourceSize": {"x":19,"y":0,"w":10,"h":48}, "sourceSize": {"w":48,"h":48} }, "sprites/wires/sets/conflict_split.png": { - "frame": {"x":741,"y":268,"w":48,"h":28}, + "frame": {"x":59,"y":371,"w":48,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, + "spriteSourceSize": {"x":0,"y":19,"w":48,"h":29}, "sourceSize": {"w":48,"h":48} }, "sprites/wires/sets/conflict_turn.png": { - "frame": {"x":158,"y":480,"w":28,"h":28}, + "frame": {"x":853,"y":472,"w":29,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, + "spriteSourceSize": {"x":19,"y":19,"w":29,"h":29}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/regular_cross.png": +"sprites/wires/sets/first_cross.png": { - "frame": {"x":948,"y":274,"w":48,"h":48}, + "frame": {"x":949,"y":275,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/regular_forward.png": +"sprites/wires/sets/first_forward.png": { - "frame": {"x":818,"y":420,"w":8,"h":48}, + "frame": {"x":1000,"y":446,"w":10,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, + "spriteSourceSize": {"x":19,"y":0,"w":10,"h":48}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/regular_split.png": +"sprites/wires/sets/first_split.png": { - "frame": {"x":4,"y":415,"w":48,"h":28}, + "frame": {"x":59,"y":406,"w":48,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, + "spriteSourceSize": {"x":0,"y":19,"w":48,"h":29}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/regular_turn.png": +"sprites/wires/sets/first_turn.png": { - "frame": {"x":527,"y":381,"w":28,"h":28}, + "frame": {"x":146,"y":581,"w":29,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, + "spriteSourceSize": {"x":19,"y":19,"w":29,"h":29}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/shape_cross.png": +"sprites/wires/sets/second_cross.png": { - "frame": {"x":687,"y":220,"w":48,"h":48}, + "frame": {"x":580,"y":221,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/shape_forward.png": +"sprites/wires/sets/second_forward.png": { - "frame": {"x":362,"y":359,"w":8,"h":48}, + "frame": {"x":551,"y":295,"w":10,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48}, + "spriteSourceSize": {"x":19,"y":0,"w":10,"h":48}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/shape_split.png": +"sprites/wires/sets/second_split.png": { - "frame": {"x":795,"y":268,"w":48,"h":28}, + "frame": {"x":5,"y":415,"w":48,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28}, + "spriteSourceSize": {"x":0,"y":19,"w":48,"h":29}, "sourceSize": {"w":48,"h":48} }, -"sprites/wires/sets/shape_turn.png": +"sprites/wires/sets/second_turn.png": { - "frame": {"x":525,"y":449,"w":28,"h":28}, + "frame": {"x":105,"y":592,"w":29,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28}, + "spriteSourceSize": {"x":19,"y":19,"w":29,"h":29}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/wires/sets/third_cross.png": +{ + "frame": {"x":634,"y":221,"w":48,"h":48}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/wires/sets/third_forward.png": +{ + "frame": {"x":723,"y":328,"w":10,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":10,"h":48}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/wires/sets/third_split.png": +{ + "frame": {"x":113,"y":411,"w":48,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":48,"h":29}, + "sourceSize": {"w":48,"h":48} +}, +"sprites/wires/sets/third_turn.png": +{ + "frame": {"x":55,"y":595,"w":29,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":29,"h":29}, "sourceSize": {"w":48,"h":48} }, "sprites/wires/wires_preview.png": { - "frame": {"x":550,"y":272,"w":16,"h":16}, + "frame": {"x":1000,"y":402,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1551,6 +1487,6 @@ "format": "RGBA8888", "size": {"w":1024,"h":1024}, "scale": "0.25", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:d64dc60885c70016feef302a1c9d887e:b61ebeff39ec84001fc764203098f3eb:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_lq.png b/res_built/atlas/atlas0_lq.png index 15cdd7bc..9c74e26e 100644 Binary files a/res_built/atlas/atlas0_lq.png and b/res_built/atlas/atlas0_lq.png differ diff --git a/res_built/atlas/atlas0_mq.json b/res_built/atlas/atlas0_mq.json index 98dfe66a..a2b03906 100644 --- a/res_built/atlas/atlas0_mq.json +++ b/res_built/atlas/atlas0_mq.json @@ -2,7 +2,7 @@ "sprites/belt/built/forward_0.png": { - "frame": {"x":97,"y":1812,"w":78,"h":96}, + "frame": {"x":93,"y":1850,"w":78,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, @@ -10,7 +10,7 @@ }, "sprites/belt/built/forward_1.png": { - "frame": {"x":4,"y":1831,"w":78,"h":96}, + "frame": {"x":177,"y":1850,"w":78,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, @@ -18,7 +18,7 @@ }, "sprites/belt/built/forward_2.png": { - "frame": {"x":566,"y":1691,"w":78,"h":96}, + "frame": {"x":429,"y":1727,"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":466,"y":1760,"w":78,"h":96}, + "frame": {"x":656,"y":1594,"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":368,"y":1792,"w":78,"h":96}, + "frame": {"x":740,"y":1606,"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":275,"y":1818,"w":78,"h":96}, + "frame": {"x":513,"y":1687,"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":181,"y":1882,"w":78,"h":96}, + "frame": {"x":597,"y":1696,"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":88,"y":1914,"w":78,"h":96}, + "frame": {"x":513,"y":1789,"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":265,"y":1920,"w":78,"h":96}, + "frame": {"x":452,"y":1891,"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":349,"y":1920,"w":78,"h":96}, + "frame": {"x":536,"y":1891,"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":4,"y":1933,"w":78,"h":96}, + "frame": {"x":261,"y":1813,"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":868,"y":1567,"w":78,"h":96}, + "frame": {"x":284,"y":1915,"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":769,"y":1608,"w":78,"h":96}, + "frame": {"x":345,"y":1773,"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":665,"y":1690,"w":78,"h":96}, + "frame": {"x":368,"y":1875,"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":102,"y":1440,"w":87,"h":87}, + "frame": {"x":385,"y":1448,"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":4,"y":1459,"w":87,"h":87}, + "frame": {"x":478,"y":1498,"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":195,"y":1501,"w":87,"h":87}, + "frame": {"x":377,"y":1541,"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":97,"y":1533,"w":87,"h":87}, + "frame": {"x":5,"y":1478,"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":4,"y":1552,"w":87,"h":87}, + "frame": {"x":98,"y":1478,"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":688,"y":1411,"w":87,"h":87}, + "frame": {"x":191,"y":1534,"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":589,"y":1412,"w":87,"h":87}, + "frame": {"x":284,"y":1587,"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":490,"y":1477,"w":87,"h":87}, + "frame": {"x":5,"y":1571,"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":386,"y":1510,"w":87,"h":87}, + "frame": {"x":98,"y":1571,"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":288,"y":1530,"w":87,"h":87}, + "frame": {"x":191,"y":1627,"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":595,"y":1319,"w":87,"h":87}, + "frame": {"x":5,"y":1385,"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":496,"y":1384,"w":87,"h":87}, + "frame": {"x":98,"y":1385,"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":397,"y":1417,"w":87,"h":87}, + "frame": {"x":191,"y":1441,"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":293,"y":1437,"w":87,"h":87}, + "frame": {"x":284,"y":1494,"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":190,"y":1594,"w":87,"h":87}, + "frame": {"x":5,"y":1664,"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":97,"y":1626,"w":87,"h":87}, + "frame": {"x":98,"y":1664,"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":479,"y":1570,"w":87,"h":87}, + "frame": {"x":191,"y":1720,"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":381,"y":1603,"w":87,"h":87}, + "frame": {"x":664,"y":1501,"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":283,"y":1623,"w":87,"h":87}, + "frame": {"x":757,"y":1513,"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":190,"y":1687,"w":87,"h":87}, + "frame": {"x":850,"y":1546,"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":97,"y":1719,"w":87,"h":87}, + "frame": {"x":5,"y":1757,"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":4,"y":1738,"w":87,"h":87}, + "frame": {"x":98,"y":1757,"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":874,"y":1474,"w":87,"h":87}, + "frame": {"x":5,"y":1952,"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":775,"y":1515,"w":87,"h":87}, + "frame": {"x":98,"y":1952,"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":4,"y":1645,"w":87,"h":87}, + "frame": {"x":571,"y":1501,"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":781,"y":1422,"w":87,"h":87}, + "frame": {"x":470,"y":1591,"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":682,"y":1504,"w":87,"h":87}, + "frame": {"x":377,"y":1634,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, @@ -330,15 +330,23 @@ }, "sprites/belt/built/right_13.png": { - "frame": {"x":583,"y":1505,"w":87,"h":87}, + "frame": {"x":284,"y":1680,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, "sourceSize": {"w":96,"h":96} }, +"sprites/blueprints/analyzer.png": +{ + "frame": {"x":573,"y":707,"w":96,"h":96}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, + "sourceSize": {"w":96,"h":96} +}, "sprites/blueprints/balancer-merger-inverse.png": { - "frame": {"x":716,"y":1215,"w":95,"h":93}, + "frame": {"x":245,"y":1047,"w":95,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, @@ -346,7 +354,7 @@ }, "sprites/blueprints/balancer-merger.png": { - "frame": {"x":4,"y":1081,"w":93,"h":93}, + "frame": {"x":772,"y":1414,"w":93,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, @@ -354,7 +362,7 @@ }, "sprites/blueprints/balancer-splitter-inverse.png": { - "frame": {"x":614,"y":1220,"w":95,"h":93}, + "frame": {"x":346,"y":1114,"w":95,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, @@ -362,7 +370,7 @@ }, "sprites/blueprints/balancer-splitter.png": { - "frame": {"x":103,"y":1081,"w":93,"h":93}, + "frame": {"x":871,"y":1447,"w":93,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, @@ -370,7 +378,7 @@ }, "sprites/blueprints/balancer.png": { - "frame": {"x":184,"y":581,"w":172,"h":96}, + "frame": {"x":185,"y":582,"w":172,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":172,"h":96}, @@ -378,7 +386,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":676,"y":1597,"w":87,"h":87}, + "frame": {"x":191,"y":1952,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, @@ -386,7 +394,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":572,"y":1598,"w":87,"h":87}, + "frame": {"x":563,"y":1594,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, @@ -394,15 +402,23 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":853,"y":1669,"w":78,"h":96}, + "frame": {"x":824,"y":1639,"w":78,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/blueprints/comparator.png": +{ + "frame": {"x":921,"y":1250,"w":96,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, + "sourceSize": {"w":96,"h":96} +}, "sprites/blueprints/constant_signal.png": { - "frame": {"x":946,"y":245,"w":71,"h":85}, + "frame": {"x":947,"y":206,"w":71,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":71,"h":85}, @@ -410,7 +426,7 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":376,"y":106,"w":366,"h":96}, + "frame": {"x":377,"y":107,"w":366,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, @@ -418,7 +434,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":362,"y":616,"w":172,"h":96}, + "frame": {"x":363,"y":617,"w":172,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":172,"h":96}, @@ -426,7 +442,7 @@ }, "sprites/blueprints/display.png": { - "frame": {"x":474,"y":1663,"w":86,"h":91}, + "frame": {"x":933,"y":645,"w":86,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":86,"h":91}, @@ -434,7 +450,7 @@ }, "sprites/blueprints/filter.png": { - "frame": {"x":746,"y":603,"w":180,"h":96}, + "frame": {"x":747,"y":604,"w":180,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":0,"w":180,"h":96}, @@ -442,7 +458,7 @@ }, "sprites/blueprints/lever.png": { - "frame": {"x":283,"y":683,"w":68,"h":78}, + "frame": {"x":284,"y":684,"w":68,"h":78}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":6,"w":68,"h":78}, @@ -450,7 +466,7 @@ }, "sprites/blueprints/logic_gate-not.png": { - "frame": {"x":816,"y":1320,"w":83,"h":96}, + "frame": {"x":832,"y":1210,"w":83,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":83,"h":96}, @@ -458,23 +474,15 @@ }, "sprites/blueprints/logic_gate-or.png": { - "frame": {"x":525,"y":1012,"w":96,"h":82}, + "frame": {"x":455,"y":1102,"w":96,"h":82}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":82}, "sourceSize": {"w":96,"h":96} }, -"sprites/blueprints/logic_gate-transistor.png": -{ - "frame": {"x":945,"y":480,"w":68,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96}, - "sourceSize": {"w":96,"h":96} -}, "sprites/blueprints/logic_gate-xor.png": { - "frame": {"x":572,"y":706,"w":96,"h":96}, + "frame": {"x":182,"y":684,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -482,7 +490,7 @@ }, "sprites/blueprints/logic_gate.png": { - "frame": {"x":321,"y":922,"w":96,"h":89}, + "frame": {"x":5,"y":888,"w":96,"h":89}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, @@ -490,7 +498,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":4,"y":1277,"w":92,"h":96}, + "frame": {"x":5,"y":1182,"w":92,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, @@ -498,7 +506,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":301,"y":1234,"w":92,"h":96}, + "frame": {"x":103,"y":1182,"w":92,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, @@ -506,7 +514,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":4,"y":479,"w":175,"h":96}, + "frame": {"x":5,"y":480,"w":175,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, @@ -514,7 +522,7 @@ }, "sprites/blueprints/painter-double.png": { - "frame": {"x":764,"y":4,"w":192,"h":192}, + "frame": {"x":765,"y":5,"w":192,"h":192}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":192}, @@ -522,7 +530,7 @@ }, "sprites/blueprints/painter-mirrored.png": { - "frame": {"x":376,"y":310,"w":192,"h":96}, + "frame": {"x":377,"y":311,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -530,7 +538,7 @@ }, "sprites/blueprints/painter-quad.png": { - "frame": {"x":4,"y":4,"w":374,"h":96}, + "frame": {"x":5,"y":5,"w":374,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, @@ -538,7 +546,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":376,"y":412,"w":192,"h":96}, + "frame": {"x":377,"y":413,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -546,7 +554,7 @@ }, "sprites/blueprints/reader.png": { - "frame": {"x":514,"y":1100,"w":95,"h":96}, + "frame": {"x":924,"y":844,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -554,7 +562,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":921,"y":888,"w":96,"h":96}, + "frame": {"x":358,"y":719,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -562,7 +570,7 @@ }, "sprites/blueprints/rotater-rotate180.png": { - "frame": {"x":181,"y":683,"w":96,"h":96}, + "frame": {"x":358,"y":821,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -570,7 +578,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":357,"y":718,"w":96,"h":96}, + "frame": {"x":572,"y":809,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -578,7 +586,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":185,"y":479,"w":175,"h":96}, + "frame": {"x":186,"y":480,"w":175,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, @@ -586,15 +594,31 @@ }, "sprites/blueprints/storage.png": { - "frame": {"x":574,"y":310,"w":167,"h":192}, + "frame": {"x":575,"y":311,"w":167,"h":192}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":167,"h":192}, "sourceSize": {"w":192,"h":192} }, +"sprites/blueprints/transistor-mirrored.png": +{ + "frame": {"x":460,"y":719,"w":67,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":0,"w":67,"h":96}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/blueprints/transistor.png": +{ + "frame": {"x":946,"y":441,"w":68,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96}, + "sourceSize": {"w":96,"h":96} +}, "sprites/blueprints/trash.png": { - "frame": {"x":459,"y":720,"w":96,"h":96}, + "frame": {"x":571,"y":911,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -602,7 +626,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":103,"y":1180,"w":93,"h":84}, + "frame": {"x":302,"y":1213,"w":93,"h":84}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":12,"w":93,"h":84}, @@ -610,7 +634,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":202,"y":1222,"w":93,"h":75}, + "frame": {"x":401,"y":1287,"w":93,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":21,"w":93,"h":75}, @@ -618,7 +642,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":905,"y":1393,"w":94,"h":75}, + "frame": {"x":672,"y":1340,"w":94,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":94,"h":75}, @@ -626,23 +650,15 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":103,"y":1270,"w":93,"h":75}, + "frame": {"x":500,"y":1337,"w":93,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":93,"h":75}, "sourceSize": {"w":96,"h":96} }, -"sprites/blueprints/virtual_processor-analyzer.png": -{ - "frame": {"x":357,"y":820,"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-painter.png": { - "frame": {"x":932,"y":684,"w":87,"h":96}, + "frame": {"x":932,"y":742,"w":87,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":87,"h":96}, @@ -650,23 +666,15 @@ }, "sprites/blueprints/virtual_processor-rotater.png": { - "frame": {"x":283,"y":1716,"w":79,"h":96}, + "frame": {"x":839,"y":910,"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":208,"y":970,"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-stacker.png": { - "frame": {"x":931,"y":786,"w":87,"h":96}, + "frame": {"x":827,"y":1312,"w":87,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":87,"h":96}, @@ -674,7 +682,7 @@ }, "sprites/blueprints/virtual_processor-unstacker.png": { - "frame": {"x":561,"y":808,"w":96,"h":96}, + "frame": {"x":737,"y":910,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -682,63 +690,31 @@ }, "sprites/blueprints/virtual_processor.png": { - "frame": {"x":106,"y":886,"w":96,"h":94}, + "frame": {"x":730,"y":1114,"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":459,"y":822,"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":423,"y":1013,"w":96,"h":55}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":41,"w":96,"h":55}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/blueprints/wire-turn.png": -{ - "frame": {"x":962,"y":4,"w":55,"h":55}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":41,"y":41,"w":55,"h":55}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/blueprints/wire.png": -{ - "frame": {"x":723,"y":929,"w":14,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":41,"y":0,"w":14,"h":96}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/blueprints/wire_tunnel-coating.png": -{ - "frame": {"x":250,"y":847,"w":23,"h":90}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":37,"y":3,"w":23,"h":90}, - "sourceSize": {"w":96,"h":96} -}, "sprites/blueprints/wire_tunnel.png": { - "frame": {"x":202,"y":1125,"w":93,"h":91}, + "frame": {"x":5,"y":1085,"w":93,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":93,"h":91}, "sourceSize": {"w":96,"h":96} }, +"sprites/buildings/analyzer.png": +{ + "frame": {"x":736,"y":1012,"w":96,"h":96}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, + "sourceSize": {"w":96,"h":96} +}, "sprites/buildings/balancer-merger-inverse.png": { - "frame": {"x":905,"y":1296,"w":94,"h":91}, + "frame": {"x":548,"y":1240,"w":94,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":94,"h":91}, @@ -746,7 +722,7 @@ }, "sprites/buildings/balancer-merger.png": { - "frame": {"x":301,"y":1137,"w":93,"h":91}, + "frame": {"x":104,"y":1085,"w":93,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, @@ -754,7 +730,7 @@ }, "sprites/buildings/balancer-splitter-inverse.png": { - "frame": {"x":715,"y":1314,"w":95,"h":91}, + "frame": {"x":447,"y":1190,"w":95,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":95,"h":91}, @@ -762,7 +738,7 @@ }, "sprites/buildings/balancer-splitter.png": { - "frame": {"x":4,"y":1180,"w":93,"h":91}, + "frame": {"x":203,"y":1146,"w":93,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, @@ -770,7 +746,7 @@ }, "sprites/buildings/balancer.png": { - "frame": {"x":744,"y":807,"w":171,"h":96}, + "frame": {"x":747,"y":808,"w":171,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, @@ -778,7 +754,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":102,"y":1440,"w":87,"h":87}, + "frame": {"x":385,"y":1448,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87}, @@ -786,7 +762,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":190,"y":1594,"w":87,"h":87}, + "frame": {"x":5,"y":1664,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87}, @@ -794,15 +770,23 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":97,"y":1812,"w":78,"h":96}, + "frame": {"x":93,"y":1850,"w":78,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/buildings/comparator.png": +{ + "frame": {"x":107,"y":888,"w":96,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89}, + "sourceSize": {"w":96,"h":96} +}, "sprites/buildings/constant_signal.png": { - "frame": {"x":946,"y":336,"w":70,"h":85}, + "frame": {"x":947,"y":297,"w":70,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":70,"h":85}, @@ -810,7 +794,7 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":376,"y":208,"w":366,"h":96}, + "frame": {"x":377,"y":209,"w":366,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, @@ -818,7 +802,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":4,"y":683,"w":171,"h":96}, + "frame": {"x":5,"y":684,"w":171,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, @@ -826,7 +810,7 @@ }, "sprites/buildings/display.png": { - "frame": {"x":376,"y":1696,"w":84,"h":90}, + "frame": {"x":832,"y":1114,"w":84,"h":90}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":84,"h":90}, @@ -834,7 +818,7 @@ }, "sprites/buildings/filter.png": { - "frame": {"x":746,"y":705,"w":179,"h":96}, + "frame": {"x":747,"y":706,"w":179,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":179,"h":96}, @@ -842,7 +826,7 @@ }, "sprites/buildings/hub.png": { - "frame": {"x":4,"y":106,"w":366,"h":367}, + "frame": {"x":5,"y":107,"w":366,"h":367}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":10,"w":366,"h":367}, @@ -850,7 +834,7 @@ }, "sprites/buildings/lever.png": { - "frame": {"x":674,"y":706,"w":66,"h":77}, + "frame": {"x":460,"y":821,"w":66,"h":77}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":6,"w":66,"h":77}, @@ -858,7 +842,7 @@ }, "sprites/buildings/logic_gate-not.png": { - "frame": {"x":817,"y":1218,"w":82,"h":96}, + "frame": {"x":5,"y":1850,"w":82,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":82,"h":96}, @@ -866,23 +850,15 @@ }, "sprites/buildings/logic_gate-or.png": { - "frame": {"x":423,"y":924,"w":96,"h":83}, + "frame": {"x":353,"y":1025,"w":96,"h":83}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":83}, "sourceSize": {"w":96,"h":96} }, -"sprites/buildings/logic_gate-transistor.png": -{ - "frame": {"x":945,"y":582,"w":68,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96}, - "sourceSize": {"w":96,"h":96} -}, "sprites/buildings/logic_gate-xor.png": { - "frame": {"x":106,"y":785,"w":96,"h":95}, + "frame": {"x":562,"y":1013,"w":96,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":95}, @@ -890,7 +866,7 @@ }, "sprites/buildings/logic_gate.png": { - "frame": {"x":4,"y":987,"w":96,"h":88}, + "frame": {"x":251,"y":953,"w":96,"h":88}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":88}, @@ -898,7 +874,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":399,"y":1316,"w":91,"h":95}, + "frame": {"x":5,"y":1284,"w":91,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, @@ -906,7 +882,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":300,"y":1336,"w":91,"h":95}, + "frame": {"x":102,"y":1284,"w":91,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, @@ -914,7 +890,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":366,"y":514,"w":174,"h":96}, + "frame": {"x":367,"y":515,"w":174,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, @@ -922,7 +898,7 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":748,"y":202,"w":192,"h":191}, + "frame": {"x":749,"y":203,"w":192,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":191}, @@ -930,7 +906,7 @@ }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":747,"y":399,"w":192,"h":96}, + "frame": {"x":748,"y":400,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -938,7 +914,7 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":384,"y":4,"w":374,"h":96}, + "frame": {"x":385,"y":5,"w":374,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, @@ -946,7 +922,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":747,"y":501,"w":192,"h":96}, + "frame": {"x":748,"y":502,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -954,7 +930,7 @@ }, "sprites/buildings/reader.png": { - "frame": {"x":412,"y":1134,"w":95,"h":96}, + "frame": {"x":924,"y":946,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -962,7 +938,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":720,"y":1113,"w":95,"h":96}, + "frame": {"x":920,"y":1345,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -970,7 +946,7 @@ }, "sprites/buildings/rotater-rotate180.png": { - "frame": {"x":615,"y":1118,"w":95,"h":96}, + "frame": {"x":5,"y":983,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -978,7 +954,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":513,"y":1202,"w":95,"h":96}, + "frame": {"x":106,"y":983,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -986,7 +962,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":4,"y":581,"w":174,"h":96}, + "frame": {"x":5,"y":582,"w":174,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, @@ -994,15 +970,31 @@ }, "sprites/buildings/storage.png": { - "frame": {"x":574,"y":508,"w":166,"h":192}, + "frame": {"x":575,"y":509,"w":166,"h":192}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":166,"h":192}, "sourceSize": {"w":192,"h":192} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":675,"y":707,"w":66,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":30,"y":0,"w":66,"h":96}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/buildings/transistor.png": +{ + "frame": {"x":946,"y":543,"w":68,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96}, + "sourceSize": {"w":96,"h":96} +}, "sprites/buildings/trash.png": { - "frame": {"x":561,"y":910,"w":96,"h":96}, + "frame": {"x":923,"y":1048,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -1010,7 +1002,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":102,"y":1351,"w":92,"h":83}, + "frame": {"x":299,"y":1303,"w":92,"h":83}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":13,"w":92,"h":83}, @@ -1018,7 +1010,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":4,"y":1379,"w":92,"h":74}, + "frame": {"x":397,"y":1368,"w":92,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":22,"w":92,"h":74}, @@ -1026,7 +1018,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":399,"y":1236,"w":92,"h":74}, + "frame": {"x":495,"y":1418,"w":92,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, @@ -1034,23 +1026,15 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":497,"y":1304,"w":92,"h":74}, + "frame": {"x":593,"y":1421,"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":744,"y":909,"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-painter.png": { - "frame": {"x":627,"y":1016,"w":87,"h":96}, + "frame": {"x":199,"y":1339,"w":87,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":87,"h":96}, @@ -1058,23 +1042,15 @@ }, "sprites/buildings/virtual_processor-rotater.png": { - "frame": {"x":190,"y":1780,"w":79,"h":96}, + "frame": {"x":838,"y":1012,"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":106,"y":986,"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-stacker.png": { - "frame": {"x":200,"y":1399,"w":87,"h":96}, + "frame": {"x":292,"y":1392,"w":87,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":87,"h":96}, @@ -1082,7 +1058,7 @@ }, "sprites/buildings/virtual_processor-unstacker.png": { - "frame": {"x":743,"y":1011,"w":96,"h":96}, + "frame": {"x":5,"y":786,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -1090,55 +1066,15 @@ }, "sprites/buildings/virtual_processor.png": { - "frame": {"x":4,"y":887,"w":96,"h":94}, + "frame": {"x":922,"y":1150,"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":914,"y":990,"w":96,"h":96}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/buildings/wire-split.png": -{ - "frame": {"x":310,"y":1017,"w":96,"h":54}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/buildings/wire-turn.png": -{ - "frame": {"x":962,"y":65,"w":54,"h":54}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/buildings/wire.png": -{ - "frame": {"x":896,"y":909,"w":12,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/buildings/wire_tunnel-coating.png": -{ - "frame": {"x":546,"y":514,"w":22,"h":90}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":37,"y":3,"w":22,"h":90}, - "sourceSize": {"w":96,"h":96} -}, "sprites/buildings/wire_tunnel.png": { - "frame": {"x":202,"y":1303,"w":92,"h":90}, + "frame": {"x":201,"y":1243,"w":92,"h":90}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":92,"h":90}, @@ -1146,7 +1082,7 @@ }, "sprites/colors/blue.png": { - "frame": {"x":845,"y":1100,"w":36,"h":34}, + "frame": {"x":664,"y":1034,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1154,7 +1090,7 @@ }, "sprites/colors/cyan.png": { - "frame": {"x":208,"y":785,"w":36,"h":34}, + "frame": {"x":664,"y":1074,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1162,7 +1098,7 @@ }, "sprites/colors/green.png": { - "frame": {"x":208,"y":825,"w":36,"h":34}, + "frame": {"x":209,"y":900,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1170,7 +1106,7 @@ }, "sprites/colors/purple.png": { - "frame": {"x":208,"y":865,"w":36,"h":34}, + "frame": {"x":209,"y":940,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1178,7 +1114,7 @@ }, "sprites/colors/red.png": { - "frame": {"x":208,"y":905,"w":36,"h":34}, + "frame": {"x":209,"y":980,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1186,7 +1122,7 @@ }, "sprites/colors/uncolored.png": { - "frame": {"x":279,"y":850,"w":36,"h":34}, + "frame": {"x":659,"y":1114,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1194,7 +1130,7 @@ }, "sprites/colors/white.png": { - "frame": {"x":279,"y":890,"w":36,"h":34}, + "frame": {"x":659,"y":1154,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1202,7 +1138,7 @@ }, "sprites/colors/yellow.png": { - "frame": {"x":279,"y":930,"w":36,"h":34}, + "frame": {"x":659,"y":1194,"w":36,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":36,"h":34}, @@ -1210,7 +1146,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":748,"y":106,"w":8,"h":8}, + "frame": {"x":1011,"y":129,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -1218,7 +1154,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":748,"y":120,"w":8,"h":8}, + "frame": {"x":1011,"y":143,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -1226,7 +1162,7 @@ }, "sprites/misc/hub_direction_indicator.png": { - "frame": {"x":952,"y":1591,"w":32,"h":32}, + "frame": {"x":659,"y":1234,"w":32,"h":32}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32}, @@ -1234,7 +1170,7 @@ }, "sprites/misc/processor_disabled.png": { - "frame": {"x":663,"y":955,"w":53,"h":55}, + "frame": {"x":963,"y":5,"w":53,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":53,"h":55}, @@ -1242,7 +1178,7 @@ }, "sprites/misc/processor_disconnected.png": { - "frame": {"x":846,"y":909,"w":44,"h":57}, + "frame": {"x":963,"y":66,"w":44,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":5,"w":44,"h":57}, @@ -1250,7 +1186,7 @@ }, "sprites/misc/reader_overlay.png": { - "frame": {"x":945,"y":427,"w":70,"h":47}, + "frame": {"x":947,"y":388,"w":70,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":25,"w":70,"h":47}, @@ -1258,7 +1194,7 @@ }, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":250,"y":817,"w":24,"h":24}, + "frame": {"x":706,"y":1066,"w":24,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":24,"h":24}, @@ -1266,7 +1202,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":250,"y":785,"w":24,"h":26}, + "frame": {"x":706,"y":1034,"w":24,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":24,"h":26}, @@ -1274,7 +1210,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":663,"y":859,"w":60,"h":30}, + "frame": {"x":674,"y":809,"w":60,"h":30}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":60,"h":30}, @@ -1282,7 +1218,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":540,"y":682,"w":26,"h":32}, + "frame": {"x":541,"y":689,"w":26,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32}, @@ -1290,7 +1226,7 @@ }, "sprites/wires/boolean_false.png": { - "frame": {"x":546,"y":610,"w":21,"h":28}, + "frame": {"x":547,"y":515,"w":21,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":21,"h":28}, @@ -1298,7 +1234,7 @@ }, "sprites/wires/boolean_true.png": { - "frame": {"x":723,"y":895,"w":15,"h":28}, + "frame": {"x":672,"y":1272,"w":15,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":3,"w":15,"h":28}, @@ -1306,7 +1242,7 @@ }, "sprites/wires/display/blue.png": { - "frame": {"x":821,"y":1140,"w":33,"h":33}, + "frame": {"x":533,"y":727,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1314,7 +1250,7 @@ }, "sprites/wires/display/cyan.png": { - "frame": {"x":821,"y":1179,"w":33,"h":33}, + "frame": {"x":533,"y":766,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1322,7 +1258,7 @@ }, "sprites/wires/display/green.png": { - "frame": {"x":967,"y":1474,"w":33,"h":33}, + "frame": {"x":533,"y":805,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1330,7 +1266,7 @@ }, "sprites/wires/display/purple.png": { - "frame": {"x":967,"y":1513,"w":33,"h":33}, + "frame": {"x":532,"y":844,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1338,7 +1274,7 @@ }, "sprites/wires/display/red.png": { - "frame": {"x":967,"y":1552,"w":33,"h":33}, + "frame": {"x":532,"y":883,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1346,7 +1282,7 @@ }, "sprites/wires/display/white.png": { - "frame": {"x":172,"y":1984,"w":33,"h":33}, + "frame": {"x":530,"y":922,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1354,7 +1290,7 @@ }, "sprites/wires/display/yellow.png": { - "frame": {"x":211,"y":1984,"w":33,"h":33}, + "frame": {"x":530,"y":961,"w":33,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -1362,7 +1298,7 @@ }, "sprites/wires/lever_on.png": { - "frame": {"x":283,"y":767,"w":68,"h":77}, + "frame": {"x":284,"y":768,"w":68,"h":77}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":6,"w":68,"h":77}, @@ -1370,7 +1306,7 @@ }, "sprites/wires/logical_acceptor.png": { - "frame": {"x":846,"y":972,"w":42,"h":71}, + "frame": {"x":963,"y":129,"w":42,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":0,"w":42,"h":71}, @@ -1378,7 +1314,7 @@ }, "sprites/wires/logical_ejector.png": { - "frame": {"x":845,"y":1049,"w":41,"h":45}, + "frame": {"x":209,"y":849,"w":41,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":29,"y":0,"w":41,"h":45}, @@ -1386,7 +1322,7 @@ }, "sprites/wires/network_conflict.png": { - "frame": {"x":952,"y":1667,"w":32,"h":30}, + "frame": {"x":207,"y":1058,"w":32,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":32,"h":30}, @@ -1394,7 +1330,7 @@ }, "sprites/wires/network_empty.png": { - "frame": {"x":540,"y":644,"w":28,"h":32}, + "frame": {"x":541,"y":651,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":28,"h":32}, @@ -1402,47 +1338,15 @@ }, "sprites/wires/overlay_tile.png": { - "frame": {"x":674,"y":789,"w":64,"h":64}, + "frame": {"x":460,"y":904,"w":64,"h":64}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, "sourceSize": {"w":64,"h":64} }, -"sprites/wires/sets/color_cross.png": -{ - "frame": {"x":912,"y":1092,"w":96,"h":96}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/wires/sets/color_forward.png": -{ - "frame": {"x":894,"y":1011,"w":12,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/wires/sets/color_split.png": -{ - "frame": {"x":208,"y":1065,"w":96,"h":54}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, - "sourceSize": {"w":96,"h":96} -}, -"sprites/wires/sets/color_turn.png": -{ - "frame": {"x":962,"y":125,"w":54,"h":54}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54}, - "sourceSize": {"w":96,"h":96} -}, "sprites/wires/sets/conflict_cross.png": { - "frame": {"x":905,"y":1194,"w":96,"h":96}, + "frame": {"x":107,"y":786,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -1450,95 +1354,127 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":887,"y":1113,"w":12,"h":96}, + "frame": {"x":547,"y":549,"w":18,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96}, + "spriteSourceSize": {"x":39,"y":0,"w":18,"h":96}, "sourceSize": {"w":96,"h":96} }, "sprites/wires/sets/conflict_split.png": { - "frame": {"x":412,"y":1074,"w":96,"h":54}, + "frame": {"x":557,"y":1114,"w":96,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, + "spriteSourceSize": {"x":0,"y":39,"w":96,"h":57}, "sourceSize": {"w":96,"h":96} }, "sprites/wires/sets/conflict_turn.png": { - "frame": {"x":962,"y":185,"w":54,"h":54}, + "frame": {"x":674,"y":845,"w":57,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54}, + "spriteSourceSize": {"x":39,"y":39,"w":57,"h":57}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/regular_cross.png": +"sprites/wires/sets/first_cross.png": { - "frame": {"x":914,"y":990,"w":96,"h":96}, + "frame": {"x":256,"y":851,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/regular_forward.png": +"sprites/wires/sets/first_forward.png": { - "frame": {"x":896,"y":909,"w":12,"h":96}, + "frame": {"x":706,"y":1096,"w":18,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96}, + "spriteSourceSize": {"x":39,"y":0,"w":18,"h":96}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/regular_split.png": +"sprites/wires/sets/first_split.png": { - "frame": {"x":310,"y":1017,"w":96,"h":54}, + "frame": {"x":557,"y":1177,"w":96,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, + "spriteSourceSize": {"x":0,"y":39,"w":96,"h":57}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/regular_turn.png": +"sprites/wires/sets/first_turn.png": { - "frame": {"x":962,"y":65,"w":54,"h":54}, + "frame": {"x":674,"y":908,"w":57,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54}, + "spriteSourceSize": {"x":39,"y":39,"w":57,"h":57}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/shape_cross.png": +"sprites/wires/sets/second_cross.png": { - "frame": {"x":4,"y":785,"w":96,"h":96}, + "frame": {"x":358,"y":923,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/shape_forward.png": +"sprites/wires/sets/second_forward.png": { - "frame": {"x":1007,"y":1194,"w":12,"h":96}, + "frame": {"x":701,"y":1198,"w":18,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96}, + "spriteSourceSize": {"x":39,"y":0,"w":18,"h":96}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/shape_split.png": +"sprites/wires/sets/second_split.png": { - "frame": {"x":310,"y":1077,"w":96,"h":54}, + "frame": {"x":725,"y":1214,"w":96,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54}, + "spriteSourceSize": {"x":0,"y":39,"w":96,"h":57}, "sourceSize": {"w":96,"h":96} }, -"sprites/wires/sets/shape_turn.png": +"sprites/wires/sets/second_turn.png": { - "frame": {"x":663,"y":895,"w":54,"h":54}, + "frame": {"x":673,"y":971,"w":57,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54}, + "spriteSourceSize": {"x":39,"y":39,"w":57,"h":57}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/wires/sets/third_cross.png": +{ + "frame": {"x":460,"y":1000,"w":96,"h":96}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/wires/sets/third_forward.png": +{ + "frame": {"x":648,"y":1272,"w":18,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":0,"w":18,"h":96}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/wires/sets/third_split.png": +{ + "frame": {"x":725,"y":1277,"w":96,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":39,"w":96,"h":57}, + "sourceSize": {"w":96,"h":96} +}, +"sprites/wires/sets/third_turn.png": +{ + "frame": {"x":209,"y":786,"w":57,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":39,"w":57,"h":57}, "sourceSize": {"w":96,"h":96} }, "sprites/wires/wires_preview.png": { - "frame": {"x":952,"y":1629,"w":32,"h":32}, + "frame": {"x":207,"y":1020,"w":32,"h":32}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32}, @@ -1551,6 +1487,6 @@ "format": "RGBA8888", "size": {"w":1024,"h":2048}, "scale": "0.5", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:d64dc60885c70016feef302a1c9d887e:b61ebeff39ec84001fc764203098f3eb:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_mq.png b/res_built/atlas/atlas0_mq.png index 50e3181d..4188fc55 100644 Binary files a/res_built/atlas/atlas0_mq.png and b/res_built/atlas/atlas0_mq.png differ diff --git a/res_raw/atlas.tps b/res_raw/atlas.tps index bc74ed93..0c03e2a4 100644 --- a/res_raw/atlas.tps +++ b/res_raw/atlas.tps @@ -104,7 +104,7 @@ shapePadding - 0 + 2 jpgQuality 80 pngOptimizationLevel @@ -118,7 +118,7 @@ textureFormat png borderPadding - 1 + 3 maxTextureSize width @@ -197,7 +197,7 @@ scaleMode Smooth extrude - 3 + 2 trimThreshold 2 trimMargin @@ -260,35 +260,6 @@ sprites/blueprints/balancer-merger-inverse.png sprites/blueprints/balancer-merger.png sprites/blueprints/balancer-splitter-inverse.png - sprites/blueprints/balancer-splitter.png - sprites/blueprints/constant_signal.png - sprites/blueprints/display.png - sprites/blueprints/lever.png - sprites/blueprints/logic_gate-not.png - sprites/blueprints/logic_gate-or.png - sprites/blueprints/logic_gate-transistor.png - sprites/blueprints/logic_gate-xor.png - sprites/blueprints/logic_gate.png - sprites/blueprints/miner-chainable.png - sprites/blueprints/miner.png - sprites/blueprints/reader.png - sprites/blueprints/rotater-ccw.png - sprites/blueprints/rotater-rotate180.png - sprites/blueprints/rotater.png - sprites/blueprints/trash.png - sprites/blueprints/underground_belt_entry-tier2.png - sprites/blueprints/underground_belt_entry.png - sprites/blueprints/underground_belt_exit-tier2.png - sprites/blueprints/underground_belt_exit.png - sprites/blueprints/virtual_processor-analyzer.png - sprites/blueprints/virtual_processor-painter.png - sprites/blueprints/virtual_processor-rotater.png - sprites/blueprints/virtual_processor-shapecompare.png - sprites/blueprints/virtual_processor-stacker.png - sprites/blueprints/virtual_processor-unstacker.png - sprites/blueprints/virtual_processor.png - sprites/blueprints/wire_tunnel-coating.png - sprites/blueprints/wire_tunnel.png sprites/buildings/balancer-merger-inverse.png sprites/buildings/balancer-merger.png sprites/buildings/balancer-splitter-inverse.png @@ -298,13 +269,14 @@ sprites/buildings/lever.png sprites/buildings/logic_gate-not.png sprites/buildings/logic_gate-or.png - sprites/buildings/logic_gate-transistor.png sprites/buildings/logic_gate-xor.png sprites/buildings/logic_gate.png sprites/buildings/miner-chainable.png sprites/buildings/reader.png sprites/buildings/rotater-ccw.png sprites/buildings/rotater-rotate180.png + sprites/buildings/transistor-mirrored.png + sprites/buildings/transistor.png sprites/buildings/underground_belt_entry-tier2.png sprites/buildings/underground_belt_entry.png sprites/buildings/underground_belt_exit-tier2.png @@ -316,26 +288,25 @@ sprites/buildings/virtual_processor-stacker.png sprites/buildings/virtual_processor-unstacker.png sprites/buildings/virtual_processor.png - sprites/buildings/wire_tunnel-coating.png sprites/buildings/wire_tunnel.png sprites/misc/reader_overlay.png sprites/wires/lever_on.png - sprites/wires/sets/color_cross.png - sprites/wires/sets/color_forward.png - sprites/wires/sets/color_split.png - sprites/wires/sets/color_turn.png sprites/wires/sets/conflict_cross.png sprites/wires/sets/conflict_forward.png sprites/wires/sets/conflict_split.png sprites/wires/sets/conflict_turn.png - sprites/wires/sets/regular_cross.png - sprites/wires/sets/regular_forward.png - sprites/wires/sets/regular_split.png - sprites/wires/sets/regular_turn.png - sprites/wires/sets/shape_cross.png - sprites/wires/sets/shape_forward.png - sprites/wires/sets/shape_split.png - sprites/wires/sets/shape_turn.png + sprites/wires/sets/first_cross.png + sprites/wires/sets/first_forward.png + sprites/wires/sets/first_split.png + sprites/wires/sets/first_turn.png + sprites/wires/sets/second_cross.png + sprites/wires/sets/second_forward.png + sprites/wires/sets/second_split.png + sprites/wires/sets/second_turn.png + sprites/wires/sets/third_cross.png + sprites/wires/sets/third_forward.png + sprites/wires/sets/third_split.png + sprites/wires/sets/third_turn.png pivotPoint 0.5,0.5 @@ -350,13 +321,6 @@ scale9FromFile - sprites/blueprints/balancer.png - sprites/blueprints/cutter.png - sprites/blueprints/filter.png - sprites/blueprints/mixer.png - sprites/blueprints/painter-mirrored.png - sprites/blueprints/painter.png - sprites/blueprints/stacker.png sprites/buildings/balancer.png sprites/buildings/filter.png sprites/buildings/painter-mirrored.png @@ -374,20 +338,9 @@ scale9FromFile - sprites/blueprints/belt_left.png - sprites/blueprints/belt_right.png - sprites/blueprints/belt_top.png - sprites/blueprints/wire-cross.png - sprites/blueprints/wire-split.png - sprites/blueprints/wire-turn.png - sprites/blueprints/wire.png sprites/buildings/belt_left.png sprites/buildings/belt_right.png sprites/buildings/belt_top.png - sprites/buildings/wire-cross.png - sprites/buildings/wire-split.png - sprites/buildings/wire-turn.png - sprites/buildings/wire.png pivotPoint 0.5,0.5 @@ -402,8 +355,6 @@ scale9FromFile - sprites/blueprints/cutter-quad.png - sprites/blueprints/painter-quad.png sprites/buildings/cutter-quad.png sprites/buildings/painter-quad.png @@ -420,24 +371,6 @@ scale9FromFile - sprites/blueprints/painter-double.png - sprites/blueprints/storage.png - sprites/buildings/painter-double.png - sprites/buildings/storage.png - - pivotPoint - 0.5,0.5 - spriteScale - 1 - scale9Enabled - - scale9Borders - 96,96,192,192 - scale9Paddings - 96,96,192,192 - scale9FromFile - - sprites/buildings/cutter.png sprites/buildings/mixer.png sprites/buildings/painter.png @@ -493,6 +426,22 @@ scale9FromFile + sprites/buildings/painter-double.png + sprites/buildings/storage.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 96,96,192,192 + scale9Paddings + 96,96,192,192 + scale9FromFile + + sprites/colors/blue.png sprites/colors/cyan.png sprites/colors/green.png diff --git a/res_raw/sprites/belt/generate_wire_sprites.js b/res_raw/sprites/belt/generate_wire_sprites.js index 24ac319b..699b01bb 100644 --- a/res_raw/sprites/belt/generate_wire_sprites.js +++ b/res_raw/sprites/belt/generate_wire_sprites.js @@ -1,226 +1,213 @@ -/** - * - * Run `yarn global add canvas` first - */ - -const { createCanvas } = require("canvas"); -const fs = require("fs"); -const path = require("path"); - -const outputFolder = path.join(__dirname, "..", "wires", "sets"); - -const dimensions = 192; -const lineSize = 12; -const lowerLineSize = 20; - -function hexToRGB(h) { - let r = 0, - g = 0, - b = 0; - - // 3 digits - if (h.length == 4) { - r = "0x" + h[1] + h[1]; - g = "0x" + h[2] + h[2]; - b = "0x" + h[3] + h[3]; - - // 6 digits - } else if (h.length == 7) { - r = "0x" + h[1] + h[2]; - g = "0x" + h[3] + h[4]; - b = "0x" + h[5] + h[6]; - } - - return [+r, +g, +b]; -} - -function RGBToHSL(r, g, b) { - // Make r, g, and b fractions of 1 - r /= 255; - g /= 255; - b /= 255; - - // Find greatest and smallest channel values - let cmin = Math.min(r, g, b), - cmax = Math.max(r, g, b), - delta = cmax - cmin, - h = 0, - s = 0, - l = 0; - // Calculate hue - // No difference - if (delta == 0) h = 0; - // Red is max - else if (cmax == r) h = ((g - b) / delta) % 6; - // Green is max - else if (cmax == g) h = (b - r) / delta + 2; - // Blue is max - else h = (r - g) / delta + 4; - - h = Math.round(h * 60); - - // Make negative hues positive behind 360° - if (h < 0) h += 360; - - // Calculate lightness - l = (cmax + cmin) / 2; - - // Calculate saturation - s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); - - // Multiply l and s by 100 - s = +(s * 100).toFixed(1); - l = +(l * 100).toFixed(1); - - return [h, s, l]; -} - -function HSLToRGB(h, s, l) { - // Must be fractions of 1 - s /= 100; - l /= 100; - - let c = (1 - Math.abs(2 * l - 1)) * s, - x = c * (1 - Math.abs(((h / 60) % 2) - 1)), - m = l - c / 2, - r = 0, - g = 0, - b = 0; - - if (0 <= h && h < 60) { - r = c; - g = x; - b = 0; - } else if (60 <= h && h < 120) { - r = x; - g = c; - b = 0; - } else if (120 <= h && h < 180) { - r = 0; - g = c; - b = x; - } else if (180 <= h && h < 240) { - r = 0; - g = x; - b = c; - } else if (240 <= h && h < 300) { - r = x; - g = 0; - b = c; - } else if (300 <= h && h < 360) { - r = c; - g = 0; - b = x; - } - r = Math.round((r + m) * 255); - g = Math.round((g + m) * 255); - b = Math.round((b + m) * 255); - - return [r, g, b]; -} - -async function run() { - console.log("Running"); - - const variants = { - regular: "#25fff2", - color: "#eba458", - shape: "#8858eb", - conflict: "#ff3e3e", - }; - - const promises = []; - - for (const variantId in variants) { - const variantColor = variants[variantId]; - const variantHSL = RGBToHSL(...hexToRGB(variantColor)); - const darkenedColor = HSLToRGB(variantHSL[0], variantHSL[1] - 15, variantHSL[2] - 20); - const hexDarkenedColor = "rgb(" + darkenedColor.join(",") + ")"; - - console.log(variantColor, "->", hexToRGB(variantColor), variantHSL, "->", darkenedColor); - - const parts = { - forward: [[0.5, 0, 0.5, 1]], - turn: [ - [0.5, 0.5, 0.5, 1], - [0.5, 0.5, 1, 0.5], - ], - split: [ - [0.5, 0.5, 0.5, 1], - [0, 0.5, 1, 0.5], - ], - cross: [ - [0, 0.5, 1, 0.5], - [0.5, 0, 0.5, 1], - ], - }; - - for (const partId in parts) { - const partLines = parts[partId]; - - const canvas = createCanvas(dimensions, dimensions); - const context = canvas.getContext("2d"); - context.quality = "best"; - context.clearRect(0, 0, dimensions, dimensions); - - context.strokeStyle = hexDarkenedColor; - context.lineWidth = lowerLineSize; - context.lineCap = "square"; - context.imageSmoothingEnabled = false; - - // Draw lower lines - partLines.forEach(([x1, y1, x2, y2]) => { - context.beginPath(); - context.moveTo(x1 * dimensions, y1 * dimensions); - context.lineTo(x2 * dimensions, y2 * dimensions); - context.stroke(); - }); - - context.strokeStyle = variantColor; - context.lineWidth = lineSize; - - // Draw upper lines - partLines.forEach(([x1, y1, x2, y2]) => { - context.beginPath(); - context.moveTo(x1 * dimensions, y1 * dimensions); - context.lineTo(x2 * dimensions, y2 * dimensions); - context.stroke(); - }); - - const out = fs.createWriteStream(path.join(outputFolder, variantId + "_" + partId + ".png")); - const stream = canvas.createPNGStream(); - stream.pipe(out); - promises.push(new Promise(resolve => stream.on("end", resolve))); - } - } - - console.log("Waiting for completion"); - await Promise.all(promises); - - // Also wait a bit more - await new Promise(resolve => setTimeout(resolve, 1000)); - - console.log("Copying files to all locations"); - - // // Copy other files - fs.copyFileSync( - path.join(outputFolder, "regular_forward.png"), - path.join(__dirname, "..", "buildings", "wire.png") - ); - fs.copyFileSync( - path.join(outputFolder, "regular_turn.png"), - path.join(__dirname, "..", "buildings", "wire-turn.png") - ); - fs.copyFileSync( - path.join(outputFolder, "regular_split.png"), - path.join(__dirname, "..", "buildings", "wire-split.png") - ); - fs.copyFileSync( - path.join(outputFolder, "regular_cross.png"), - path.join(__dirname, "..", "buildings", "wire-cross.png") - ); - - console.log("Done!"); -} - -run(); +/** + * + * Run `yarn global add canvas` first + */ + +const { createCanvas } = require("canvas"); +const fs = require("fs"); +const path = require("path"); + +const outputFolder = path.join(__dirname, "..", "wires", "sets"); + +const dimensions = 192; +const lineSize = 14; +const lowerLineSize = 32; + +const variants = { + first: "#61ef6f", + second: "#f0bd65", + third: "#5fb2f1", + conflict: "#f74c4c", +}; + +function hexToRGB(h) { + let r = 0, + g = 0, + b = 0; + + // 3 digits + if (h.length == 4) { + r = "0x" + h[1] + h[1]; + g = "0x" + h[2] + h[2]; + b = "0x" + h[3] + h[3]; + + // 6 digits + } else if (h.length == 7) { + r = "0x" + h[1] + h[2]; + g = "0x" + h[3] + h[4]; + b = "0x" + h[5] + h[6]; + } + + return [+r, +g, +b]; +} + +function RGBToHSL(r, g, b) { + // Make r, g, and b fractions of 1 + r /= 255; + g /= 255; + b /= 255; + + // Find greatest and smallest channel values + let cmin = Math.min(r, g, b), + cmax = Math.max(r, g, b), + delta = cmax - cmin, + h = 0, + s = 0, + l = 0; + // Calculate hue + // No difference + if (delta == 0) h = 0; + // Red is max + else if (cmax == r) h = ((g - b) / delta) % 6; + // Green is max + else if (cmax == g) h = (b - r) / delta + 2; + // Blue is max + else h = (r - g) / delta + 4; + + h = Math.round(h * 60); + + // Make negative hues positive behind 360° + if (h < 0) h += 360; + + // Calculate lightness + l = (cmax + cmin) / 2; + + // Calculate saturation + s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); + + // Multiply l and s by 100 + s = +(s * 100).toFixed(1); + l = +(l * 100).toFixed(1); + + return [h, s, l]; +} + +function HSLToRGB(h, s, l) { + // Must be fractions of 1 + s /= 100; + l /= 100; + + let c = (1 - Math.abs(2 * l - 1)) * s, + x = c * (1 - Math.abs(((h / 60) % 2) - 1)), + m = l - c / 2, + r = 0, + g = 0, + b = 0; + + if (0 <= h && h < 60) { + r = c; + g = x; + b = 0; + } else if (60 <= h && h < 120) { + r = x; + g = c; + b = 0; + } else if (120 <= h && h < 180) { + r = 0; + g = c; + b = x; + } else if (180 <= h && h < 240) { + r = 0; + g = x; + b = c; + } else if (240 <= h && h < 300) { + r = x; + g = 0; + b = c; + } else if (300 <= h && h < 360) { + r = c; + g = 0; + b = x; + } + r = Math.round((r + m) * 255); + g = Math.round((g + m) * 255); + b = Math.round((b + m) * 255); + + return [r, g, b]; +} + +async function run() { + console.log("Running"); + + const promises = []; + + for (const variantId in variants) { + const variantColor = variants[variantId]; + const variantHSL = RGBToHSL(...hexToRGB(variantColor)); + const darkenedColor = HSLToRGB(variantHSL[0], variantHSL[1] - 15, variantHSL[2] - 20); + const hexDarkenedColor = "rgb(" + darkenedColor.join(",") + ")"; + + console.log(variantColor, "->", hexToRGB(variantColor), variantHSL, "->", darkenedColor); + + const parts = { + forward: [[0.5, 0, 0.5, 1]], + turn: [ + [0.5, 0.5, 0.5, 1], + [0.5, 0.5, 1, 0.5], + ], + split: [ + [0.5, 0.5, 0.5, 1], + [0, 0.5, 1, 0.5], + ], + cross: [ + [0, 0.5, 1, 0.5], + [0.5, 0, 0.5, 1], + ], + }; + + for (const partId in parts) { + const partLines = parts[partId]; + + const canvas = createCanvas(dimensions, dimensions); + const context = canvas.getContext("2d"); + context.quality = "best"; + context.clearRect(0, 0, dimensions, dimensions); + + const lineCanvas = createCanvas(dimensions, dimensions); + const lineContext = lineCanvas.getContext("2d"); + lineContext.quality = "best"; + lineContext.clearRect(0, 0, dimensions, dimensions); + lineContext.strokeStyle = hexDarkenedColor; + lineContext.lineWidth = lowerLineSize; + lineContext.lineCap = "square"; + lineContext.imageSmoothingEnabled = false; + + // Draw lower lines + partLines.forEach(([x1, y1, x2, y2]) => { + lineContext.beginPath(); + lineContext.moveTo(x1 * dimensions, y1 * dimensions); + lineContext.lineTo(x2 * dimensions, y2 * dimensions); + lineContext.stroke(); + }); + + context.globalAlpha = 0.4; + context.drawImage(lineCanvas, 0, 0, dimensions, dimensions); + + context.globalAlpha = 1; + context.imageSmoothingEnabled = false; + context.lineCap = "square"; + context.strokeStyle = variantColor; + context.lineWidth = lineSize; + + // Draw upper lines + partLines.forEach(([x1, y1, x2, y2]) => { + context.beginPath(); + context.moveTo(x1 * dimensions, y1 * dimensions); + context.lineTo(x2 * dimensions, y2 * dimensions); + context.stroke(); + }); + + const out = fs.createWriteStream(path.join(outputFolder, variantId + "_" + partId + ".png")); + const stream = canvas.createPNGStream(); + stream.pipe(out); + promises.push(new Promise(resolve => stream.on("end", resolve))); + } + } + + console.log("Waiting for completion"); + await Promise.all(promises); + + console.log("Done!"); +} + +run(); diff --git a/res_raw/sprites/blueprints/virtual_processor-analyzer.png b/res_raw/sprites/blueprints/analyzer.png similarity index 100% rename from res_raw/sprites/blueprints/virtual_processor-analyzer.png rename to res_raw/sprites/blueprints/analyzer.png diff --git a/res_raw/sprites/blueprints/virtual_processor-shapecompare.png b/res_raw/sprites/blueprints/comparator.png similarity index 100% rename from res_raw/sprites/blueprints/virtual_processor-shapecompare.png rename to res_raw/sprites/blueprints/comparator.png diff --git a/res_raw/sprites/blueprints/transistor-mirrored.png b/res_raw/sprites/blueprints/transistor-mirrored.png new file mode 100644 index 00000000..88eaad0d Binary files /dev/null and b/res_raw/sprites/blueprints/transistor-mirrored.png differ diff --git a/res_raw/sprites/blueprints/logic_gate-transistor.png b/res_raw/sprites/blueprints/transistor.png similarity index 100% rename from res_raw/sprites/blueprints/logic_gate-transistor.png rename to res_raw/sprites/blueprints/transistor.png diff --git a/res_raw/sprites/blueprints/wire-cross.png b/res_raw/sprites/blueprints/wire-cross.png deleted file mode 100644 index c9aeb1c5..00000000 Binary files a/res_raw/sprites/blueprints/wire-cross.png and /dev/null differ diff --git a/res_raw/sprites/blueprints/wire-split.png b/res_raw/sprites/blueprints/wire-split.png deleted file mode 100644 index f0cdfb11..00000000 Binary files a/res_raw/sprites/blueprints/wire-split.png and /dev/null differ diff --git a/res_raw/sprites/blueprints/wire-turn.png b/res_raw/sprites/blueprints/wire-turn.png deleted file mode 100644 index becf6411..00000000 Binary files a/res_raw/sprites/blueprints/wire-turn.png and /dev/null differ diff --git a/res_raw/sprites/blueprints/wire.png b/res_raw/sprites/blueprints/wire.png deleted file mode 100644 index 15bfde22..00000000 Binary files a/res_raw/sprites/blueprints/wire.png and /dev/null differ diff --git a/res_raw/sprites/blueprints/wire_tunnel-coating.png b/res_raw/sprites/blueprints/wire_tunnel-coating.png deleted file mode 100644 index af93022a..00000000 Binary files a/res_raw/sprites/blueprints/wire_tunnel-coating.png and /dev/null differ diff --git a/res_raw/sprites/blueprints/wire_tunnel.png b/res_raw/sprites/blueprints/wire_tunnel.png index 9a7cdd2a..7f9a1063 100644 Binary files a/res_raw/sprites/blueprints/wire_tunnel.png and b/res_raw/sprites/blueprints/wire_tunnel.png differ diff --git a/res_raw/sprites/buildings/virtual_processor-analyzer.png b/res_raw/sprites/buildings/analyzer.png similarity index 100% rename from res_raw/sprites/buildings/virtual_processor-analyzer.png rename to res_raw/sprites/buildings/analyzer.png diff --git a/res_raw/sprites/buildings/virtual_processor-shapecompare.png b/res_raw/sprites/buildings/comparator.png similarity index 100% rename from res_raw/sprites/buildings/virtual_processor-shapecompare.png rename to res_raw/sprites/buildings/comparator.png diff --git a/res_raw/sprites/buildings/transistor-mirrored.png b/res_raw/sprites/buildings/transistor-mirrored.png new file mode 100644 index 00000000..606bfce3 Binary files /dev/null and b/res_raw/sprites/buildings/transistor-mirrored.png differ diff --git a/res_raw/sprites/buildings/logic_gate-transistor.png b/res_raw/sprites/buildings/transistor.png similarity index 100% rename from res_raw/sprites/buildings/logic_gate-transistor.png rename to res_raw/sprites/buildings/transistor.png diff --git a/res_raw/sprites/buildings/wire-cross.png b/res_raw/sprites/buildings/wire-cross.png deleted file mode 100644 index e9c71dac..00000000 Binary files a/res_raw/sprites/buildings/wire-cross.png and /dev/null differ diff --git a/res_raw/sprites/buildings/wire-split.png b/res_raw/sprites/buildings/wire-split.png deleted file mode 100644 index e26b552c..00000000 Binary files a/res_raw/sprites/buildings/wire-split.png and /dev/null differ diff --git a/res_raw/sprites/buildings/wire-turn.png b/res_raw/sprites/buildings/wire-turn.png deleted file mode 100644 index 5b50bb09..00000000 Binary files a/res_raw/sprites/buildings/wire-turn.png and /dev/null differ diff --git a/res_raw/sprites/buildings/wire.png b/res_raw/sprites/buildings/wire.png deleted file mode 100644 index 8310be84..00000000 Binary files a/res_raw/sprites/buildings/wire.png and /dev/null differ diff --git a/res_raw/sprites/buildings/wire_tunnel-coating.png b/res_raw/sprites/buildings/wire_tunnel-coating.png deleted file mode 100644 index f5dd3ffe..00000000 Binary files a/res_raw/sprites/buildings/wire_tunnel-coating.png and /dev/null differ diff --git a/res_raw/sprites/create_blueprint_previews.py b/res_raw/sprites/create_blueprint_previews.py index cceefae0..96688fe4 100644 --- a/res_raw/sprites/create_blueprint_previews.py +++ b/res_raw/sprites/create_blueprint_previews.py @@ -1,110 +1,92 @@ -# Requirements: numpy, scipy, Pillow, -from __future__ import print_function -import sys -import numpy as np -from scipy import ndimage -from PIL import Image, ImageFilter, ImageChops -import math -from os import listdir -from os.path import isdir, isfile - -roberts_cross_v = np.array([[0, 0, 0], - [0, 1, 0], - [0, 0, -1]]) - -roberts_cross_h = np.array([[0, 0, 0], - [0, 0, 1], - [0, -1, 0]]) - - -def rgb2gray(rgb): - return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140]) - - - - -def save_image(data, outfilename, src_image): - img = Image.fromarray(np.asarray( - np.clip(data, 0, 255), dtype="uint8"), "L") - dest = Image.new("RGBA", (img.width, img.height)) - src = img.load() - dst = dest.load() - - realSrc = src_image.load() - mask = src_image.filter(ImageFilter.GaussianBlur(10)).load() - orig = src_image.load() - - - isWire = "wire" in outfilename - - targetR = 104 - targetG = 200 - targetB = 255 - - if isWire: - targetR = 255 - targetG = 104 - targetB = 232 - - for x in range(img.width): - for y in range(img.height): - realpixl = realSrc[x, y] - greyval = float(src[x, y]) - greyval = min(255.0, greyval) - greyval = math.pow( - min(1, float(greyval / 255.0 * 1)), 1.5) * 255.0 * 1 - greyval = max(0, greyval) - alpha = mask[x, y][3] / 255.0 * 1 - - edgeFactor = src[x, y] / 255.0 - noEdge = 1 - edgeFactor - - shadow = min(1, 1 - realpixl[3] / 255.0 - edgeFactor) - noShadow = 1 - shadow - - dst[x, y] = ( - min(255, int((realpixl[0] / 255.0 * 0.4 + 0.6) * targetR * 1.1)), - min(255, int((realpixl[1] / 255.0 * 0.4 + 0.6) * targetG * 1.1)), - min(255, int((realpixl[2] / 255.0 * 0.4 + 0.6) * targetB * 1.1)), - min(255, int(float(realpixl[3]) * (0.6 + 5 * edgeFactor)))) - - - dest.save(outfilename) - - -def roberts_cross(infilename, outfilename): - print("Processing", infilename) - img = Image.open(infilename) - img.load() - img = img.filter(ImageFilter.GaussianBlur(0.5)) - - image = rgb2gray(np.asarray(img, dtype="int32")) - vertical = ndimage.convolve(image, roberts_cross_v) - horizontal = ndimage.convolve(image, roberts_cross_h) - output_image = np.sqrt(np.square(horizontal) + np.square(vertical)) - save_image(output_image, outfilename, img) - - -def generateUiPreview(srcPath, buildingId): - print(srcPath, buildingId) - img = Image.open(srcPath) - img.load() - img.thumbnail((110, 110), Image.ANTIALIAS) - img.save("../res/ui/hud/building_previews/" + buildingId + ".png") - - img = img.convert("LA") - - data = img.load() - for x in range(img.width): - for y in range(img.height): - data[x, y] = (data[x, y][0], int(data[x, y][1] * 0.5)) - - img.save("../res/ui/hud/building_previews/" + buildingId + "_disabled.png") - - -buildings = listdir("buildings") - -for buildingId in buildings: - if "hub" in buildingId: - continue - roberts_cross("buildings/" + buildingId + "", "blueprints/" + buildingId + "") +# Requirements: numpy, scipy, Pillow, +from __future__ import print_function +import sys +import numpy as np +from scipy import ndimage +from PIL import Image, ImageFilter, ImageChops +import math +from os import listdir +from os.path import isdir, isfile + +generate_blueprint_sprite_v = np.array([[0, 0, 0], + [0, 1, 0], + [0, 0, -1]]) + +generate_blueprint_sprite_h = np.array([[0, 0, 0], + [0, 0, 1], + [0, -1, 0]]) + + +def rgb2gray(rgb): + return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140]) + +def process_image(data, outfilename, src_image): + img = Image.fromarray(np.asarray( + np.clip(data, 0, 255), dtype="uint8"), "L") + dest = Image.new("RGBA", (img.width, img.height)) + src = img.load() + dst = dest.load() + + realSrc = src_image.load() + mask = src_image.filter(ImageFilter.GaussianBlur(10)).load() + orig = src_image.load() + + # isWire = "wire" in outfilename + isWire = False + + targetR = 104 + targetG = 200 + targetB = 255 + + if isWire: + targetR = 255 + targetG = 104 + targetB = 232 + + for x in range(img.width): + for y in range(img.height): + realpixl = realSrc[x, y] + greyval = float(src[x, y]) + greyval = min(255.0, greyval) + greyval = math.pow( + min(1, float(greyval / 255.0 * 1)), 1.5) * 255.0 * 1 + greyval = max(0, greyval) + alpha = mask[x, y][3] / 255.0 * 1 + + edgeFactor = src[x, y] / 255.0 + noEdge = 1 - edgeFactor + + shadow = min(1, 1 - realpixl[3] / 255.0 - edgeFactor) + noShadow = 1 - shadow + + dst[x, y] = ( + min(255, int((realpixl[0] / 255.0 * 0.4 + 0.6) * targetR * 1.1)), + min(255, int((realpixl[1] / 255.0 * 0.4 + 0.6) * targetG * 1.1)), + min(255, int((realpixl[2] / 255.0 * 0.4 + 0.6) * targetB * 1.1)), + min(255, int(float(realpixl[3]) * (0.6 + 5 * edgeFactor)))) + + + dest.save(outfilename) + + +def generate_blueprint_sprite(infilename, outfilename): + print("Processing", infilename) + img = Image.open(infilename) + img.load() + img = img.filter(ImageFilter.GaussianBlur(0.5)) + + image = rgb2gray(np.asarray(img, dtype="int32")) + vertical = ndimage.convolve(image, generate_blueprint_sprite_v) + horizontal = ndimage.convolve(image, generate_blueprint_sprite_h) + output_image = np.sqrt(np.square(horizontal) + np.square(vertical)) + process_image(output_image, outfilename, img) + + +buildings = listdir("buildings") + +for buildingId in buildings: + if "hub" in buildingId: + continue + if "wire-" in buildingId: + continue + generate_blueprint_sprite("buildings/" + buildingId + "", "blueprints/" + buildingId + "") diff --git a/res_raw/sprites/wires/sets/color_cross.png b/res_raw/sprites/wires/sets/color_cross.png deleted file mode 100644 index c3b2a3c2..00000000 Binary files a/res_raw/sprites/wires/sets/color_cross.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/color_forward.png b/res_raw/sprites/wires/sets/color_forward.png deleted file mode 100644 index f6584aaa..00000000 Binary files a/res_raw/sprites/wires/sets/color_forward.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/color_split.png b/res_raw/sprites/wires/sets/color_split.png deleted file mode 100644 index af9ddfb6..00000000 Binary files a/res_raw/sprites/wires/sets/color_split.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/color_turn.png b/res_raw/sprites/wires/sets/color_turn.png deleted file mode 100644 index 1cf4dcb0..00000000 Binary files a/res_raw/sprites/wires/sets/color_turn.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/conflict_cross.png b/res_raw/sprites/wires/sets/conflict_cross.png index fee403a6..3be1e9b9 100644 Binary files a/res_raw/sprites/wires/sets/conflict_cross.png and b/res_raw/sprites/wires/sets/conflict_cross.png differ diff --git a/res_raw/sprites/wires/sets/conflict_forward.png b/res_raw/sprites/wires/sets/conflict_forward.png index 8b9ab43a..abb02d18 100644 Binary files a/res_raw/sprites/wires/sets/conflict_forward.png and b/res_raw/sprites/wires/sets/conflict_forward.png differ diff --git a/res_raw/sprites/wires/sets/conflict_split.png b/res_raw/sprites/wires/sets/conflict_split.png index 6e22aaf0..c74a0e41 100644 Binary files a/res_raw/sprites/wires/sets/conflict_split.png and b/res_raw/sprites/wires/sets/conflict_split.png differ diff --git a/res_raw/sprites/wires/sets/conflict_turn.png b/res_raw/sprites/wires/sets/conflict_turn.png index 93bd3250..d359969b 100644 Binary files a/res_raw/sprites/wires/sets/conflict_turn.png and b/res_raw/sprites/wires/sets/conflict_turn.png differ diff --git a/res_raw/sprites/wires/sets/first_cross.png b/res_raw/sprites/wires/sets/first_cross.png new file mode 100644 index 00000000..5ec6e11b Binary files /dev/null and b/res_raw/sprites/wires/sets/first_cross.png differ diff --git a/res_raw/sprites/wires/sets/first_forward.png b/res_raw/sprites/wires/sets/first_forward.png new file mode 100644 index 00000000..a6e0df71 Binary files /dev/null and b/res_raw/sprites/wires/sets/first_forward.png differ diff --git a/res_raw/sprites/wires/sets/first_split.png b/res_raw/sprites/wires/sets/first_split.png new file mode 100644 index 00000000..f77ff0b8 Binary files /dev/null and b/res_raw/sprites/wires/sets/first_split.png differ diff --git a/res_raw/sprites/wires/sets/first_turn.png b/res_raw/sprites/wires/sets/first_turn.png new file mode 100644 index 00000000..6d005aae Binary files /dev/null and b/res_raw/sprites/wires/sets/first_turn.png differ diff --git a/res_raw/sprites/wires/sets/regular_cross.png b/res_raw/sprites/wires/sets/regular_cross.png deleted file mode 100644 index e9c71dac..00000000 Binary files a/res_raw/sprites/wires/sets/regular_cross.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/regular_forward.png b/res_raw/sprites/wires/sets/regular_forward.png deleted file mode 100644 index 8310be84..00000000 Binary files a/res_raw/sprites/wires/sets/regular_forward.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/regular_split.png b/res_raw/sprites/wires/sets/regular_split.png deleted file mode 100644 index e26b552c..00000000 Binary files a/res_raw/sprites/wires/sets/regular_split.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/regular_turn.png b/res_raw/sprites/wires/sets/regular_turn.png deleted file mode 100644 index 5b50bb09..00000000 Binary files a/res_raw/sprites/wires/sets/regular_turn.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/second_cross.png b/res_raw/sprites/wires/sets/second_cross.png new file mode 100644 index 00000000..0aad63f3 Binary files /dev/null and b/res_raw/sprites/wires/sets/second_cross.png differ diff --git a/res_raw/sprites/wires/sets/shape_forward.png b/res_raw/sprites/wires/sets/second_forward.png similarity index 50% rename from res_raw/sprites/wires/sets/shape_forward.png rename to res_raw/sprites/wires/sets/second_forward.png index 15ec3b9c..cfb4dbed 100644 Binary files a/res_raw/sprites/wires/sets/shape_forward.png and b/res_raw/sprites/wires/sets/second_forward.png differ diff --git a/res_raw/sprites/wires/sets/second_split.png b/res_raw/sprites/wires/sets/second_split.png new file mode 100644 index 00000000..bb7b5911 Binary files /dev/null and b/res_raw/sprites/wires/sets/second_split.png differ diff --git a/res_raw/sprites/wires/sets/second_turn.png b/res_raw/sprites/wires/sets/second_turn.png new file mode 100644 index 00000000..4505c3b6 Binary files /dev/null and b/res_raw/sprites/wires/sets/second_turn.png differ diff --git a/res_raw/sprites/wires/sets/shape_cross.png b/res_raw/sprites/wires/sets/shape_cross.png deleted file mode 100644 index d04812aa..00000000 Binary files a/res_raw/sprites/wires/sets/shape_cross.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/shape_split.png b/res_raw/sprites/wires/sets/shape_split.png deleted file mode 100644 index d19c9b71..00000000 Binary files a/res_raw/sprites/wires/sets/shape_split.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/shape_turn.png b/res_raw/sprites/wires/sets/shape_turn.png deleted file mode 100644 index 4f40caa7..00000000 Binary files a/res_raw/sprites/wires/sets/shape_turn.png and /dev/null differ diff --git a/res_raw/sprites/wires/sets/third_cross.png b/res_raw/sprites/wires/sets/third_cross.png new file mode 100644 index 00000000..7c5008b6 Binary files /dev/null and b/res_raw/sprites/wires/sets/third_cross.png differ diff --git a/res_raw/sprites/wires/sets/third_forward.png b/res_raw/sprites/wires/sets/third_forward.png new file mode 100644 index 00000000..3656acd7 Binary files /dev/null and b/res_raw/sprites/wires/sets/third_forward.png differ diff --git a/res_raw/sprites/wires/sets/third_split.png b/res_raw/sprites/wires/sets/third_split.png new file mode 100644 index 00000000..dd1a51a8 Binary files /dev/null and b/res_raw/sprites/wires/sets/third_split.png differ diff --git a/res_raw/sprites/wires/sets/third_turn.png b/res_raw/sprites/wires/sets/third_turn.png new file mode 100644 index 00000000..b2be4bb6 Binary files /dev/null and b/res_raw/sprites/wires/sets/third_turn.png differ diff --git a/src/css/resources.scss b/src/css/resources.scss index d34c49c6..bd3fe902 100644 --- a/src/css/resources.scss +++ b/src/css/resources.scss @@ -1,5 +1,6 @@ $buildings: belt, cutter, miner, mixer, painter, rotater, balancer, stacker, trash, underground_belt, wire, - constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, storage; + constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, storage, + transistor, analyzer, comparator; @each $building in $buildings { [data-icon="building_icons/#{$building}.png"] { @@ -8,10 +9,11 @@ $buildings: belt, cutter, miner, mixer, painter, rotater, balancer, stacker, tra } } -$buildingsAndVariants: belt, balancer, balancer-merger, balancer-splitter, underground_belt, - underground_belt-tier2, miner, miner-chainable, cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, - painter, painter-double, painter-quad, trash, storage, reader, rotater-rotate180, lever, display, - constant_signal; +$buildingsAndVariants: belt, balancer, underground_belt, underground_belt-tier2, miner, miner-chainable, + cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, painter-double, painter-quad, trash, storage, + reader, rotater-rotate180, display, constant_signal, wire, wire_tunnel, logic_gate-or, logic_gate-not, + logic_gate-xor, analyzer, virtual_processor-rotater, virtual_processor-unstacker, + virtual_processor-stacker, virtual_processor-painter; @each $building in $buildingsAndVariants { [data-icon="building_tutorials/#{$building}.png"] { /* @load-async */ @@ -19,26 +21,57 @@ $buildingsAndVariants: belt, balancer, balancer-merger, balancer-splitter, under } } -// @TODO: New buildings (balancer, wires, etc) - // Special cases for mirrored vairants +[data-icon="building_tutorials/painter.png"], [data-icon="building_tutorials/painter-mirrored.png"] { /* @load-async */ background-image: uiResource("res/ui/building_tutorials/painter.png") !important; } + +[data-icon="building_tutorials/balancer-merger.png"], [data-icon="building_tutorials/balancer-merger-inverse.png"] { /* @load-async */ background-image: uiResource("res/ui/building_tutorials/balancer-merger.png") !important; } + +[data-icon="building_tutorials/balancer-splitter.png"], [data-icon="building_tutorials/balancer-splitter-inverse.png"] { /* @load-async */ background-image: uiResource("res/ui/building_tutorials/balancer-splitter.png") !important; } -[data-icon="building_tutorials/filter.png"] { + +[data-icon="building_tutorials/transistor.png"], +[data-icon="building_tutorials/transistor-mirrored.png"] { + /* @load-async */ + background-image: uiResource("res/ui/building_tutorials/transistor.png") !important; +} + +// Filter and lever share tutorials +[data-icon="building_tutorials/filter.png"], +[data-icon="building_tutorials/lever.png"] { /* @load-async */ background-image: uiResource("res/ui/building_tutorials/lever.png") !important; } +// Wire types share tutorials +[data-icon="building_tutorials/wire-second.png"], +[data-icon="building_tutorials/wire-third.png"] { + /* @load-async */ + background-image: uiResource("res/ui/building_tutorials/wire-second.png") !important; +} + +// Logic gate +[data-icon="building_tutorials/logic_gate.png"] { + /* @load-async */ + background-image: uiResource("res/ui/building_tutorials/logic_gate-and.png") !important; +} + +// Virtual processor +[data-icon="building_tutorials/virtual_processor.png"] { + /* @load-async */ + background-image: uiResource("res/ui/building_tutorials/virtual_processor-cutter.png") !important; +} + $icons: notification_saved, notification_success, notification_upgrade; @each $icon in $icons { [data-icon="icons/#{$icon}.png"] { diff --git a/src/js/game/buildings/analyzer.js b/src/js/game/buildings/analyzer.js new file mode 100644 index 00000000..a18a3b56 --- /dev/null +++ b/src/js/game/buildings/analyzer.js @@ -0,0 +1,79 @@ +import { generateMatrixRotations } from "../../core/utils"; +import { enumDirection, Vector } from "../../core/vector"; +import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; +import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; + +const overlayMatrix = generateMatrixRotations([1, 1, 0, 1, 1, 1, 0, 1, 0]); + +export class MetaAnalyzerBuilding extends MetaBuilding { + constructor() { + super("analyzer"); + } + + getSilhouetteColor() { + return "#3a52bc"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // @todo + return true; + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + getDimensions() { + return new Vector(1, 1); + } + + getRenderPins() { + // We already have it included + return false; + } + + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) { + return overlayMatrix[rotation]; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + 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, + }, + ], + }) + ); + + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.analyzer, + }) + ); + } +} diff --git a/src/js/game/buildings/comparator.js b/src/js/game/buildings/comparator.js new file mode 100644 index 00000000..0a284930 --- /dev/null +++ b/src/js/game/buildings/comparator.js @@ -0,0 +1,72 @@ +import { enumDirection, Vector } from "../../core/vector"; +import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; +import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; + +export class MetaComparatorBuilding extends MetaBuilding { + constructor() { + super("comparator"); + } + + getSilhouetteColor() { + return "#823cab"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // @todo + return true; + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + getDimensions() { + return new Vector(1, 1); + } + + getRenderPins() { + // We already have it included + return false; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + 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, + }, + ], + }) + ); + + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.compare, + }) + ); + } +} diff --git a/src/js/game/buildings/constant_signal.js b/src/js/game/buildings/constant_signal.js index d2c47c26..21583052 100644 --- a/src/js/game/buildings/constant_signal.js +++ b/src/js/game/buildings/constant_signal.js @@ -4,6 +4,9 @@ import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { ConstantSignalComponent } from "../components/constant_signal"; +import { generateMatrixRotations } from "../../core/utils"; + +const overlayMatrix = generateMatrixRotations([0, 1, 0, 1, 1, 1, 1, 1, 1]); export class MetaConstantSignalBuilding extends MetaBuilding { constructor() { @@ -11,7 +14,7 @@ export class MetaConstantSignalBuilding extends MetaBuilding { } getSilhouetteColor() { - return "#2bafda"; + return "#2b84fd"; } /** @@ -35,6 +38,10 @@ export class MetaConstantSignalBuilding extends MetaBuilding { return false; } + getSpecialOverlayRenderMatrix(rotation) { + return overlayMatrix[rotation]; + } + /** * Creates the entity at the given location * @param {Entity} entity diff --git a/src/js/game/buildings/logic_gate.js b/src/js/game/buildings/logic_gate.js index e07db3ea..1511f5ab 100644 --- a/src/js/game/buildings/logic_gate.js +++ b/src/js/game/buildings/logic_gate.js @@ -1,155 +1,151 @@ -import { enumDirection, Vector } from "../../core/vector"; -import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; -import { Entity } from "../entity"; -import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; -import { GameRoot } from "../root"; -import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; - -/** @enum {string} */ -export const enumLogicGateVariants = { - not: "not", - xor: "xor", - or: "or", - transistor: "transistor", -}; - -/** @enum {string} */ -export const enumVariantToGate = { - [defaultBuildingVariant]: enumLogicGateType.and, - [enumLogicGateVariants.not]: enumLogicGateType.not, - [enumLogicGateVariants.xor]: enumLogicGateType.xor, - [enumLogicGateVariants.or]: enumLogicGateType.or, - [enumLogicGateVariants.transistor]: enumLogicGateType.transistor, -}; - -export class MetaLogicGateBuilding extends MetaBuilding { - constructor() { - super("logic_gate"); - } - - getSilhouetteColor() { - return "#89dc60"; - } - - /** - * @param {GameRoot} root - */ - getIsUnlocked(root) { - // @todo - return true; - } - - /** @returns {"wires"} **/ - getLayer() { - return "wires"; - } - - getDimensions() { - return new Vector(1, 1); - } - - getAvailableVariants() { - return [ - defaultBuildingVariant, - enumLogicGateVariants.not, - enumLogicGateVariants.xor, - enumLogicGateVariants.or, - enumLogicGateVariants.transistor, - ]; - } - - 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.and: - case enumLogicGateType.xor: - case enumLogicGateType.or: { - 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; - } - case enumLogicGateType.transistor: { - 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.bottom, - type: enumPinSlotType.logicalAcceptor, - }, - ]); - break; - } - - case enumLogicGateType.not: { - 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; - } - - 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({})); - } -} +import { enumDirection, Vector } from "../../core/vector"; +import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; +import { Entity } from "../entity"; +import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; +import { generateMatrixRotations } from "../../core/utils"; + +/** @enum {string} */ +export const enumLogicGateVariants = { + not: "not", + xor: "xor", + or: "or", +}; + +/** @enum {string} */ +export const enumVariantToGate = { + [defaultBuildingVariant]: enumLogicGateType.and, + [enumLogicGateVariants.not]: enumLogicGateType.not, + [enumLogicGateVariants.xor]: enumLogicGateType.xor, + [enumLogicGateVariants.or]: enumLogicGateType.or, +}; + +const overlayMatrices = { + [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]), + [enumLogicGateVariants.xor]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]), + [enumLogicGateVariants.or]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]), + [enumLogicGateVariants.not]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]), +}; + +const colors = { + [defaultBuildingVariant]: "#f48d41", + [enumLogicGateVariants.xor]: "#f4a241", + [enumLogicGateVariants.or]: "#f4d041", + [enumLogicGateVariants.not]: "#f44184", +}; + +export class MetaLogicGateBuilding extends MetaBuilding { + constructor() { + super("logic_gate"); + } + + getSilhouetteColor(variant) { + return colors[variant]; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // @todo + return true; + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + getDimensions() { + return new Vector(1, 1); + } + + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) { + return overlayMatrices[variant][rotation]; + } + + getAvailableVariants() { + return [ + defaultBuildingVariant, + enumLogicGateVariants.or, + enumLogicGateVariants.not, + enumLogicGateVariants.xor, + ]; + } + + 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.and: + case enumLogicGateType.xor: + case enumLogicGateType.or: { + 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; + } + + case enumLogicGateType.not: { + 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; + } + + 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({})); + } +} diff --git a/src/js/game/buildings/transistor.js b/src/js/game/buildings/transistor.js new file mode 100644 index 00000000..5a4be935 --- /dev/null +++ b/src/js/game/buildings/transistor.js @@ -0,0 +1,101 @@ +import { generateMatrixRotations } from "../../core/utils"; +import { enumDirection, Vector } from "../../core/vector"; +import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; +import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; +import { Entity } from "../entity"; +import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; + +/** @enum {string} */ +export const enumTransistorVariants = { + mirrored: "mirrored", +}; + +const overlayMatrices = { + [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 0, 0, 1, 0]), + [enumTransistorVariants.mirrored]: generateMatrixRotations([0, 1, 0, 0, 1, 1, 0, 1, 0]), +}; + +export class MetaTransistorBuilding extends MetaBuilding { + constructor() { + super("transistor"); + } + + getSilhouetteColor() { + return "#bc3a61"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // @todo + return true; + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + getDimensions() { + return new Vector(1, 1); + } + + getAvailableVariants() { + return [defaultBuildingVariant, enumTransistorVariants.mirrored]; + } + + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) { + return overlayMatrices[variant][rotation]; + } + + getRenderPins() { + // We already have it included + return false; + } + + /** + * + * @param {Entity} entity + * @param {number} rotationVariant + */ + updateVariants(entity, rotationVariant, variant) { + entity.components.WiredPins.slots[1].direction = + variant === enumTransistorVariants.mirrored ? enumDirection.right : enumDirection.left; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + 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.bottom, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ); + + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.transistor, + }) + ); + } +} diff --git a/src/js/game/buildings/virtual_processor.js b/src/js/game/buildings/virtual_processor.js index acdb0dbe..fb0ef0e3 100644 --- a/src/js/game/buildings/virtual_processor.js +++ b/src/js/game/buildings/virtual_processor.js @@ -4,13 +4,15 @@ import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins"; import { Entity } from "../entity"; import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; +import { MetaCutterBuilding } from "./cutter"; +import { MetaPainterBuilding } from "./painter"; +import { MetaRotaterBuilding } from "./rotater"; +import { MetaStackerBuilding } from "./stacker"; /** @enum {string} */ export const enumVirtualProcessorVariants = { - analyzer: "analyzer", rotater: "rotater", unstacker: "unstacker", - shapecompare: "shapecompare", stacker: "stacker", painter: "painter", }; @@ -18,21 +20,27 @@ export const enumVirtualProcessorVariants = { /** @enum {string} */ export const enumVariantToGate = { [defaultBuildingVariant]: enumLogicGateType.cutter, - [enumVirtualProcessorVariants.analyzer]: enumLogicGateType.analyzer, [enumVirtualProcessorVariants.rotater]: enumLogicGateType.rotater, [enumVirtualProcessorVariants.unstacker]: enumLogicGateType.unstacker, - [enumVirtualProcessorVariants.shapecompare]: enumLogicGateType.shapecompare, [enumVirtualProcessorVariants.stacker]: enumLogicGateType.stacker, [enumVirtualProcessorVariants.painter]: enumLogicGateType.painter, }; +const colors = { + [defaultBuildingVariant]: new MetaCutterBuilding().getSilhouetteColor(), + [enumVirtualProcessorVariants.rotater]: new MetaRotaterBuilding().getSilhouetteColor(), + [enumVirtualProcessorVariants.unstacker]: new MetaStackerBuilding().getSilhouetteColor(), + [enumVirtualProcessorVariants.stacker]: new MetaStackerBuilding().getSilhouetteColor(), + [enumVirtualProcessorVariants.painter]: new MetaPainterBuilding().getSilhouetteColor(), +}; + export class MetaVirtualProcessorBuilding extends MetaBuilding { constructor() { super("virtual_processor"); } - getSilhouetteColor() { - return "#823cab"; + getSilhouetteColor(variant) { + return colors[variant]; } /** @@ -56,11 +64,9 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding { return [ defaultBuildingVariant, enumVirtualProcessorVariants.rotater, - enumVirtualProcessorVariants.unstacker, - enumVirtualProcessorVariants.analyzer, enumVirtualProcessorVariants.stacker, enumVirtualProcessorVariants.painter, - enumVirtualProcessorVariants.shapecompare, + enumVirtualProcessorVariants.unstacker, ]; } @@ -80,7 +86,6 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding { const pinComp = entity.components.WiredPins; switch (gateType) { case enumLogicGateType.cutter: - case enumLogicGateType.analyzer: case enumLogicGateType.unstacker: { pinComp.setSlots([ { @@ -116,26 +121,6 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding { ]); 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; - } case enumLogicGateType.stacker: case enumLogicGateType.painter: { pinComp.setSlots([ diff --git a/src/js/game/buildings/wire.js b/src/js/game/buildings/wire.js index 59c9cb7d..6b2305a0 100644 --- a/src/js/game/buildings/wire.js +++ b/src/js/game/buildings/wire.js @@ -1,263 +1,272 @@ -import { Loader } from "../../core/loader"; -import { generateMatrixRotations } from "../../core/utils"; -import { enumDirection, enumDirectionToAngle, enumDirectionToVector, Vector } from "../../core/vector"; -import { SOUNDS } from "../../platform/sound"; -import { enumWireType, WireComponent } from "../components/wire"; -import { Entity } from "../entity"; -import { MetaBuilding } from "../meta_building"; -import { GameRoot } from "../root"; - -export const arrayWireRotationVariantToType = [ - enumWireType.regular, - enumWireType.turn, - enumWireType.split, - enumWireType.cross, -]; - -export const wireOverlayMatrices = { - [enumWireType.regular]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]), - [enumWireType.split]: generateMatrixRotations([0, 0, 0, 1, 1, 1, 0, 1, 0]), - [enumWireType.turn]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]), - [enumWireType.cross]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]), -}; - -export class MetaWireBuilding extends MetaBuilding { - constructor() { - super("wire"); - } - - getHasDirectionLockAvailable() { - return true; - } - - getSilhouetteColor() { - return "#25fff2"; - } - - getDimensions() { - return new Vector(1, 1); - } - - getStayInPlacementMode() { - return true; - } - - getPlacementSound() { - return SOUNDS.placeBelt; - } - - getRotateAutomaticallyWhilePlacing() { - return true; - } - - /** @returns {"wires"} **/ - getLayer() { - return "wires"; - } - - getSprite() { - return null; - } - - getIsReplaceable() { - return true; - } - - /** - * @param {GameRoot} root - */ - getIsUnlocked(root) { - // @todo - return true; - } - - /** - * Creates the entity at the given location - * @param {Entity} entity - */ - setupEntityComponents(entity) { - // @todo - entity.addComponent(new WireComponent({})); - } - - /** - * - * @param {Entity} entity - * @param {number} rotationVariant - */ - updateVariants(entity, rotationVariant) { - entity.components.Wire.type = arrayWireRotationVariantToType[rotationVariant]; - } - - /** - * - * @param {number} rotation - * @param {number} rotationVariant - * @param {string} variant - * @param {Entity} entity - */ - getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { - return wireOverlayMatrices[entity.components.Wire.type][rotation]; - } - - getPreviewSprite(rotationVariant) { - switch (arrayWireRotationVariantToType[rotationVariant]) { - case enumWireType.regular: { - return Loader.getSprite("sprites/buildings/wire.png"); - } - case enumWireType.turn: { - return Loader.getSprite("sprites/buildings/wire-turn.png"); - } - case enumWireType.split: { - return Loader.getSprite("sprites/buildings/wire-split.png"); - } - case enumWireType.cross: { - return Loader.getSprite("sprites/buildings/wire-cross.png"); - } - default: { - assertAlways(false, "Invalid wire rotation variant"); - } - } - } - - getBlueprintSprite(rotationVariant) { - switch (arrayWireRotationVariantToType[rotationVariant]) { - case enumWireType.regular: { - return Loader.getSprite("sprites/blueprints/wire.png"); - } - case enumWireType.turn: { - return Loader.getSprite("sprites/blueprints/wire-turn.png"); - } - case enumWireType.split: { - return Loader.getSprite("sprites/blueprints/wire-split.png"); - } - case enumWireType.cross: { - return Loader.getSprite("sprites/blueprints/wire-cross.png"); - } - default: { - assertAlways(false, "Invalid wire rotation variant"); - } - } - } - - /** - * Should compute the optimal rotation variant on the given tile - * @param {object} param0 - * @param {GameRoot} param0.root - * @param {Vector} param0.tile - * @param {number} param0.rotation - * @param {string} param0.variant - * @param {string} param0.layer - * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }} - */ - computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) { - const connections = { - top: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.top }), - right: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.right }), - bottom: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.bottom }), - left: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.left }), - }; - - let flag = 0; - flag |= connections.top ? 0x1000 : 0; - flag |= connections.right ? 0x100 : 0; - flag |= connections.bottom ? 0x10 : 0; - flag |= connections.left ? 0x1 : 0; - - let targetType = enumWireType.regular; - - // First, reset rotation - rotation = 0; - - switch (flag) { - case 0x0000: - // Nothing - break; - - case 0x0001: - // Left - rotation += 90; - break; - - case 0x0010: - // Bottom - // END - break; - - case 0x0011: - // Bottom | Left - targetType = enumWireType.turn; - rotation += 90; - break; - - case 0x0100: - // Right - rotation += 90; - break; - - case 0x0101: - // Right | Left - rotation += 90; - break; - - case 0x0110: - // Right | Bottom - targetType = enumWireType.turn; - break; - - case 0x0111: - // Right | Bottom | Left - targetType = enumWireType.split; - break; - - case 0x1000: - // Top - break; - - case 0x1001: - // Top | Left - targetType = enumWireType.turn; - rotation += 180; - break; - - case 0x1010: - // Top | Bottom - break; - - case 0x1011: - // Top | Bottom | Left - targetType = enumWireType.split; - rotation += 90; - break; - - case 0x1100: - // Top | Right - targetType = enumWireType.turn; - rotation -= 90; - break; - - case 0x1101: - // Top | Right | Left - targetType = enumWireType.split; - rotation += 180; - break; - - case 0x1110: - // Top | Right | Bottom - targetType = enumWireType.split; - rotation -= 90; - break; - - case 0x1111: - // Top | Right | Bottom | Left - targetType = enumWireType.cross; - break; - } - - return { - // Clamp rotation - rotation: (rotation + 360 * 10) % 360, - rotationVariant: arrayWireRotationVariantToType.indexOf(targetType), - }; - } -} +import { Loader } from "../../core/loader"; +import { generateMatrixRotations } from "../../core/utils"; +import { enumDirection, Vector } from "../../core/vector"; +import { SOUNDS } from "../../platform/sound"; +import { enumWireType, enumWireVariant, WireComponent } from "../components/wire"; +import { Entity } from "../entity"; +import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; + +export const arrayWireRotationVariantToType = [ + enumWireType.forward, + enumWireType.turn, + enumWireType.split, + enumWireType.cross, +]; + +export const wireOverlayMatrices = { + [enumWireType.forward]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]), + [enumWireType.split]: generateMatrixRotations([0, 0, 0, 1, 1, 1, 0, 1, 0]), + [enumWireType.turn]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]), + [enumWireType.cross]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]), +}; + +/** @enum {string} */ +export const wireVariants = { + second: "second", + third: "third", +}; + +const enumWireVariantToVariant = { + [defaultBuildingVariant]: enumWireVariant.first, + [wireVariants.second]: enumWireVariant.second, + [wireVariants.third]: enumWireVariant.third, +}; + +export class MetaWireBuilding extends MetaBuilding { + constructor() { + super("wire"); + } + + getHasDirectionLockAvailable() { + return true; + } + + getSilhouetteColor() { + return "#61ef6f"; + } + + getAvailableVariants() { + return [defaultBuildingVariant, wireVariants.second, wireVariants.third]; + } + + getDimensions() { + return new Vector(1, 1); + } + + getStayInPlacementMode() { + return true; + } + + getPlacementSound() { + return SOUNDS.placeBelt; + } + + getRotateAutomaticallyWhilePlacing() { + return true; + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + getSprite() { + return null; + } + + getIsReplaceable() { + return true; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // @todo + return true; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent(new WireComponent({})); + } + + /** + * + * @param {Entity} entity + * @param {number} rotationVariant + * @param {string} variant + */ + updateVariants(entity, rotationVariant, variant) { + entity.components.Wire.type = arrayWireRotationVariantToType[rotationVariant]; + entity.components.Wire.variant = enumWireVariantToVariant[variant]; + } + + /** + * + * @param {number} rotation + * @param {number} rotationVariant + * @param {string} variant + * @param {Entity} entity + */ + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { + return wireOverlayMatrices[entity.components.Wire.type][rotation]; + } + + /** + * + * @param {number} rotationVariant + * @param {string} variant + * @returns {import("../../core/draw_utils").AtlasSprite} + */ + getPreviewSprite(rotationVariant, variant) { + const wireVariant = enumWireVariantToVariant[variant]; + switch (arrayWireRotationVariantToType[rotationVariant]) { + case enumWireType.forward: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_forward.png"); + } + case enumWireType.turn: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_turn.png"); + } + case enumWireType.split: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_split.png"); + } + case enumWireType.cross: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_cross.png"); + } + default: { + assertAlways(false, "Invalid wire rotation variant"); + } + } + } + + getBlueprintSprite(rotationVariant, variant) { + return this.getPreviewSprite(rotationVariant, variant); + } + + /** + * Should compute the optimal rotation variant on the given tile + * @param {object} param0 + * @param {GameRoot} param0.root + * @param {Vector} param0.tile + * @param {number} param0.rotation + * @param {string} param0.variant + * @param {string} param0.layer + * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }} + */ + computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) { + const wireVariant = enumWireVariantToVariant[variant]; + const connections = { + top: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.top }), + right: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.right }), + bottom: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.bottom }), + left: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.left }), + }; + + let flag = 0; + flag |= connections.top ? 0x1000 : 0; + flag |= connections.right ? 0x100 : 0; + flag |= connections.bottom ? 0x10 : 0; + flag |= connections.left ? 0x1 : 0; + + let targetType = enumWireType.forward; + + // First, reset rotation + rotation = 0; + + switch (flag) { + case 0x0000: + // Nothing + break; + + case 0x0001: + // Left + rotation += 90; + break; + + case 0x0010: + // Bottom + // END + break; + + case 0x0011: + // Bottom | Left + targetType = enumWireType.turn; + rotation += 90; + break; + + case 0x0100: + // Right + rotation += 90; + break; + + case 0x0101: + // Right | Left + rotation += 90; + break; + + case 0x0110: + // Right | Bottom + targetType = enumWireType.turn; + break; + + case 0x0111: + // Right | Bottom | Left + targetType = enumWireType.split; + break; + + case 0x1000: + // Top + break; + + case 0x1001: + // Top | Left + targetType = enumWireType.turn; + rotation += 180; + break; + + case 0x1010: + // Top | Bottom + break; + + case 0x1011: + // Top | Bottom | Left + targetType = enumWireType.split; + rotation += 90; + break; + + case 0x1100: + // Top | Right + targetType = enumWireType.turn; + rotation -= 90; + break; + + case 0x1101: + // Top | Right | Left + targetType = enumWireType.split; + rotation += 180; + break; + + case 0x1110: + // Top | Right | Bottom + targetType = enumWireType.split; + rotation -= 90; + break; + + case 0x1111: + // Top | Right | Bottom | Left + targetType = enumWireType.cross; + break; + } + + return { + // Clamp rotation + rotation: (rotation + 360 * 10) % 360, + rotationVariant: arrayWireRotationVariantToType.indexOf(targetType), + }; + } +} diff --git a/src/js/game/buildings/wire_tunnel.js b/src/js/game/buildings/wire_tunnel.js index f885abc6..05d595df 100644 --- a/src/js/game/buildings/wire_tunnel.js +++ b/src/js/game/buildings/wire_tunnel.js @@ -1,87 +1,58 @@ -import { Vector } from "../../core/vector"; -import { Entity } from "../entity"; -import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; -import { GameRoot } from "../root"; -import { WireTunnelComponent } from "../components/wire_tunnel"; -import { generateMatrixRotations } from "../../core/utils"; - -/** @enum {string} */ -export const enumWireTunnelVariants = { - coating: "coating", -}; - -const wireTunnelOverlayMatrices = { - [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]), - [enumWireTunnelVariants.coating]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]), -}; - -export class MetaWireTunnelBuilding extends MetaBuilding { - constructor() { - super("wire_tunnel"); - } - - getSilhouetteColor() { - return "#777a86"; - } - - /** - * @param {GameRoot} root - */ - getIsUnlocked(root) { - // @todo - return true; - } - - /** - * - * @param {number} rotation - * @param {number} rotationVariant - * @param {string} variant - * @param {Entity} entity - */ - getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { - return wireTunnelOverlayMatrices[variant][rotation]; - } - - getIsRotateable(variant) { - return variant !== defaultBuildingVariant; - } - - getDimensions() { - return new Vector(1, 1); - } - - getAvailableVariants() { - return [defaultBuildingVariant, enumWireTunnelVariants.coating]; - } - - /** @returns {"wires"} **/ - getLayer() { - return "wires"; - } - - getRotateAutomaticallyWhilePlacing() { - return true; - } - - getStayInPlacementMode() { - return true; - } - - /** - * Creates the entity at the given location - * @param {Entity} entity - */ - setupEntityComponents(entity) { - entity.addComponent(new WireTunnelComponent({})); - } - - /** - * @param {Entity} entity - * @param {number} rotationVariant - * @param {string} variant - */ - updateVariants(entity, rotationVariant, variant) { - entity.components.WireTunnel.multipleDirections = variant === defaultBuildingVariant; - } -} +import { generateMatrixRotations } from "../../core/utils"; +import { Vector } from "../../core/vector"; +import { WireTunnelComponent } from "../components/wire_tunnel"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +const wireTunnelOverlayMatrix = generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]); + +export class MetaWireTunnelBuilding extends MetaBuilding { + constructor() { + super("wire_tunnel"); + } + + getSilhouetteColor() { + return "#777a86"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_filters_and_levers); + } + + /** + * + * @param {number} rotation + * @param {number} rotationVariant + * @param {string} variant + * @param {Entity} entity + */ + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { + return wireTunnelOverlayMatrix[rotation]; + } + + getIsRotateable() { + return false; + } + + getDimensions() { + return new Vector(1, 1); + } + + /** @returns {"wires"} **/ + getLayer() { + return "wires"; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent(new WireTunnelComponent({})); + } +} diff --git a/src/js/game/components/logic_gate.js b/src/js/game/components/logic_gate.js index a19f70b6..62cd3365 100644 --- a/src/js/game/components/logic_gate.js +++ b/src/js/game/components/logic_gate.js @@ -12,7 +12,7 @@ export const enumLogicGateType = { rotater: "rotater", unstacker: "unstacker", cutter: "cutter", - shapecompare: "shapecompare", + compare: "compare", stacker: "stacker", painter: "painter", }; diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js index d5daa998..7e2f5314 100644 --- a/src/js/game/components/static_map_entity.js +++ b/src/js/game/components/static_map_entity.js @@ -63,6 +63,14 @@ export class StaticMapEntityComponent extends Component { return getBuildingDataFromCode(this.code).metaInstance; } + /** + * Returns the buildings variant + * @returns {string} + */ + getVariant() { + return getBuildingDataFromCode(this.code).variant; + } + /** * Copy the current state to another component * @param {Component} otherComponent diff --git a/src/js/game/components/wire.js b/src/js/game/components/wire.js index 4bb1edca..057ea5d0 100644 --- a/src/js/game/components/wire.js +++ b/src/js/game/components/wire.js @@ -2,12 +2,19 @@ import { Component } from "../component"; /** @enum {string} */ export const enumWireType = { - regular: "regular", + forward: "forward", turn: "turn", split: "split", cross: "cross", }; +/** @enum {string} */ +export const enumWireVariant = { + first: "first", + second: "second", + third: "third", +}; + export class WireComponent extends Component { static getId() { return "Wire"; @@ -16,54 +23,21 @@ export class WireComponent extends Component { /** * @param {object} param0 * @param {enumWireType=} param0.type + * @param {enumWireVariant=} param0.variant */ - constructor({ type = enumWireType.regular }) { + constructor({ type = enumWireType.forward, variant = enumWireVariant.first }) { super(); this.type = type; + /** + * The variant of the wire, different variants do not connect + * @type {enumWireVariant} + */ + this.variant = variant; + /** * @type {import("../systems/wire").WireNetwork} */ this.linkedNetwork = null; } - - /** - * Returns the local connections - * @returns {import("../../core/utils").DirectionalObject} - */ - getLocalConnections() { - return { - top: true, - right: false, - bottom: true, - left: false, - }; - - // switch (this.type) { - // case enumWireType.regular: - // return { - // top: true, - // right: false, - // bottom: true, - // left: false, - // }; - // case enumWireType.turn: - // return { - // top: false, - // right: true, - // bottom: true, - // left: false, - // }; - // case enumWireType.split: - // return { - // top: false, - // right: true, - // bottom: true, - // left: true, - // }; - - // default: - // assertAlways(false, "Invalid wire type: " + this.type); - // } - } } diff --git a/src/js/game/components/wire_tunnel.js b/src/js/game/components/wire_tunnel.js index e1be448b..1c170484 100644 --- a/src/js/game/components/wire_tunnel.js +++ b/src/js/game/components/wire_tunnel.js @@ -5,13 +5,8 @@ export class WireTunnelComponent extends Component { return "WireTunnel"; } - /** - * @param {object} param0 - * @param {boolean=} param0.multipleDirections - */ - constructor({ multipleDirections = true }) { + constructor() { super(); - this.multipleDirections = multipleDirections; /** * Linked network, only if its not multiple directions diff --git a/src/js/game/hud/parts/wires_toolbar.js b/src/js/game/hud/parts/wires_toolbar.js index 74075329..6d19df1f 100644 --- a/src/js/game/hud/parts/wires_toolbar.js +++ b/src/js/game/hud/parts/wires_toolbar.js @@ -5,6 +5,9 @@ import { MetaLogicGateBuilding } from "../../buildings/logic_gate"; import { MetaLeverBuilding } from "../../buildings/lever"; import { MetaWireTunnelBuilding } from "../../buildings/wire_tunnel"; import { MetaVirtualProcessorBuilding } from "../../buildings/virtual_processor"; +import { MetaTransistorBuilding } from "../../buildings/transistor"; +import { MetaAnalyzerBuilding } from "../../buildings/analyzer"; +import { MetaComparatorBuilding } from "../../buildings/comparator"; export class HUDWiresToolbar extends HUDBaseToolbar { constructor(root) { @@ -13,9 +16,12 @@ export class HUDWiresToolbar extends HUDBaseToolbar { MetaWireBuilding, MetaWireTunnelBuilding, MetaConstantSignalBuilding, + MetaTransistorBuilding, MetaLogicGateBuilding, + MetaAnalyzerBuilding, MetaLeverBuilding, MetaVirtualProcessorBuilding, + MetaComparatorBuilding, ], visibilityCondition: () => !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "wires", diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index 4e2f4505..ad8cf124 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -64,8 +64,11 @@ export const KEYMAPPINGS = { wire: { keyCode: key("1") }, wire_tunnel: { keyCode: key("2") }, constant_signal: { keyCode: key("3") }, + transistor: { keyCode: key("6") }, logic_gate: { keyCode: key("4") }, virtual_processor: { keyCode: key("5") }, + analyzer: { keyCode: key("7") }, + comparator: { keyCode: key("8") }, }, placement: { diff --git a/src/js/game/logic.js b/src/js/game/logic.js index ce4d18a5..7ec7b8ab 100644 --- a/src/js/game/logic.js +++ b/src/js/game/logic.js @@ -1,23 +1,18 @@ +import { globalConfig } from "../core/config"; import { createLogger } from "../core/logging"; import { STOP_PROPAGATION } from "../core/signal"; import { round2Digits } from "../core/utils"; import { enumDirection, enumDirectionToVector, enumInvertedDirections, Vector } from "../core/vector"; import { getBuildingDataFromCode } from "./building_codes"; +import { enumWireVariant } from "./components/wire"; import { Entity } from "./entity"; +import { CHUNK_OVERLAY_RES } from "./map_chunk_view"; import { MetaBuilding } from "./meta_building"; import { GameRoot } from "./root"; import { WireNetwork } from "./systems/wire"; -import { globalConfig } from "../core/config"; -import { CHUNK_OVERLAY_RES } from "./map_chunk_view"; const logger = createLogger("ingame/logic"); -/** @enum {number} */ -export const enumWireEdgeFlag = { - empty: 0, - connected: 2, -}; - /** * Typing helper * @typedef {Array<{ @@ -193,28 +188,72 @@ export class GameLogic { * * Computes the flag for a given tile * @param {object} param0 + * @param {enumWireVariant} param0.wireVariant * @param {Vector} param0.tile The tile to check at * @param {enumDirection} param0.edge The edge to check for - * @param {number} param0.rotation The local tiles base rotation */ - computeWireEdgeStatus({ tile, edge, rotation }) { + computeWireEdgeStatus({ wireVariant, tile, edge }) { const offset = enumDirectionToVector[edge]; - const refTile = tile.add(offset); - // const angle = enumDirectionToAngle[edge]; + const targetTile = tile.add(offset); - // // First, check if this edge can be connected from locally - // const canConnectLocally = rotation === angle || (rotation + 180) % 360 === angle; + // Search for relevant pins + const pinEntities = this.root.map.getLayersContentsMultipleXY(targetTile.x, targetTile.y); - const neighbourStatus = this.getWireEdgeFlag(refTile, edge); + // Go over all entities which could have a pin + for (let i = 0; i < pinEntities.length; ++i) { + const pinEntity = pinEntities[i]; + const pinComp = pinEntity.components.WiredPins; + const staticComp = pinEntity.components.StaticMapEntity; - if (neighbourStatus === enumWireEdgeFlag.empty) { - // It's empty, no point in connecting + // Skip those who don't have pins + if (!pinComp) { + continue; + } + + // Go over all pins + const pins = pinComp.slots; + for (let k = 0; k < pinComp.slots.length; ++k) { + const pinSlot = pins[k]; + const pinLocation = staticComp.localTileToWorld(pinSlot.pos); + const pinDirection = staticComp.localDirectionToWorld(pinSlot.direction); + + // Check if the pin has the right location + if (!pinLocation.equals(targetTile)) { + continue; + } + + // Check if the pin has the right direction + if (pinDirection !== enumInvertedDirections[edge]) { + continue; + } + + // Found a pin! + return true; + } + } + + // Now check if there's a connectable entity on the wires layer + const targetEntity = this.root.map.getTileContent(targetTile, "wires"); + if (!targetEntity) { return false; } - if (neighbourStatus === enumWireEdgeFlag.connected) { + const targetStaticComp = targetEntity.components.StaticMapEntity; + + // Check if its a crossing + const wireTunnelComp = targetEntity.components.WireTunnel; + if (wireTunnelComp) { return true; } + + // Check if its a wire + const wiresComp = targetEntity.components.Wire; + if (!wiresComp) { + return false; + } + + // It's connected if its the same variant + return wiresComp.variant === wireVariant; } /** @@ -303,85 +342,7 @@ export class GameLogic { return !!overlayMatrix[localPosition.x + localPosition.y * 3]; } - /** - * Gets the flag at the given tile - * @param {Vector} tile - * @param {enumDirection} edge - * @returns {enumWireEdgeFlag} - */ - getWireEdgeFlag(tile, edge) { - // Search for relevant pins - const pinEntities = this.root.map.getLayersContentsMultipleXY(tile.x, tile.y); - - // Go over all entities which could have a pin - for (let i = 0; i < pinEntities.length; ++i) { - const pinEntity = pinEntities[i]; - const pinComp = pinEntity.components.WiredPins; - const staticComp = pinEntity.components.StaticMapEntity; - - // Skip those who don't have pins - if (!pinComp) { - continue; - } - - // Go over all pins - const pins = pinComp.slots; - for (let k = 0; k < pinComp.slots.length; ++k) { - const pinSlot = pins[k]; - const pinLocation = staticComp.localTileToWorld(pinSlot.pos); - const pinDirection = staticComp.localDirectionToWorld(pinSlot.direction); - - // Check if the pin has the right location - if (!pinLocation.equals(tile)) { - continue; - } - - // Check if the pin has the right direction - if (pinDirection !== enumInvertedDirections[edge]) { - continue; - } - - // Found a pin! - return enumWireEdgeFlag.connected; - } - } - - // Now check if there's a connectable wire - const targetEntity = this.root.map.getTileContent(tile, "wires"); - if (!targetEntity) { - return enumWireEdgeFlag.empty; - } - - const targetStaticComp = targetEntity.components.StaticMapEntity; - - // Check if its a crossing - const wireTunnelComp = targetEntity.components.WireTunnel; - if (wireTunnelComp) { - // Check if the crossing is connected - if (wireTunnelComp.multipleDirections) { - return enumWireEdgeFlag.connected; - } else { - // Its a coating, check if it matches the direction - const referenceDirection = targetStaticComp.localDirectionToWorld(enumDirection.top); - return referenceDirection === edge || enumInvertedDirections[referenceDirection] === edge - ? enumWireEdgeFlag.connected - : enumWireEdgeFlag.empty; - } - } - - // Check if its a wire - const wiresComp = targetEntity.components.Wire; - if (!wiresComp) { - return enumWireEdgeFlag.empty; - } - - // const refAngle = enumDirectionToAngle[edge]; - // const refRotation = targetEntity.components.StaticMapEntity.originalRotation; - // const canConnectRemotely = refRotation === refAngle || (refRotation + 180) % 360 === refAngle; - - // Actually connected - return enumWireEdgeFlag.connected; - } + g(tile, edge) {} /** * Returns the acceptors and ejectors which affect the current tile diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js index ce3f83cf..17f549de 100644 --- a/src/js/game/meta_building_registry.js +++ b/src/js/game/meta_building_registry.js @@ -1,30 +1,34 @@ import { gMetaBuildingRegistry } from "../core/global_registries"; import { createLogger } from "../core/logging"; +import { T } from "../translations"; +import { MetaAnalyzerBuilding } from "./buildings/analyzer"; +import { enumBalancerVariants, MetaBalancerBuilding } from "./buildings/balancer"; import { MetaBeltBuilding } from "./buildings/belt"; +import { MetaComparatorBuilding } from "./buildings/comparator"; +import { MetaConstantSignalBuilding } from "./buildings/constant_signal"; import { enumCutterVariants, MetaCutterBuilding } from "./buildings/cutter"; +import { MetaDisplayBuilding } from "./buildings/display"; +import { MetaFilterBuilding } from "./buildings/filter"; import { MetaHubBuilding } from "./buildings/hub"; +import { MetaLeverBuilding } from "./buildings/lever"; +import { enumLogicGateVariants, MetaLogicGateBuilding } from "./buildings/logic_gate"; import { enumMinerVariants, MetaMinerBuilding } from "./buildings/miner"; import { MetaMixerBuilding } from "./buildings/mixer"; import { enumPainterVariants, MetaPainterBuilding } from "./buildings/painter"; +import { MetaReaderBuilding } from "./buildings/reader"; import { enumRotaterVariants, MetaRotaterBuilding } from "./buildings/rotater"; -import { enumBalancerVariants, MetaBalancerBuilding } from "./buildings/balancer"; import { MetaStackerBuilding } from "./buildings/stacker"; +import { MetaStorageBuilding } from "./buildings/storage"; +import { MetaTransistorBuilding, enumTransistorVariants } from "./buildings/transistor"; import { MetaTrashBuilding } from "./buildings/trash"; import { enumUndergroundBeltVariants, MetaUndergroundBeltBuilding } from "./buildings/underground_belt"; +import { enumVirtualProcessorVariants, MetaVirtualProcessorBuilding } from "./buildings/virtual_processor"; import { MetaWireBuilding } from "./buildings/wire"; +import { MetaWireTunnelBuilding } from "./buildings/wire_tunnel"; import { buildBuildingCodeCache, gBuildingVariants, registerBuildingVariant } from "./building_codes"; -import { defaultBuildingVariant } from "./meta_building"; -import { MetaConstantSignalBuilding } from "./buildings/constant_signal"; -import { MetaLogicGateBuilding, enumLogicGateVariants } from "./buildings/logic_gate"; -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"; -import { MetaReaderBuilding } from "./buildings/reader"; -import { MetaStorageBuilding } from "./buildings/storage"; +import { enumWireVariant } from "./components/wire"; import { KEYMAPPINGS } from "./key_action_mapper"; -import { T } from "../translations"; +import { defaultBuildingVariant } from "./meta_building"; const logger = createLogger("building_registry"); @@ -50,6 +54,9 @@ export function initMetaBuildingRegistry() { gMetaBuildingRegistry.register(MetaDisplayBuilding); gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding); gMetaBuildingRegistry.register(MetaReaderBuilding); + gMetaBuildingRegistry.register(MetaTransistorBuilding); + gMetaBuildingRegistry.register(MetaAnalyzerBuilding); + gMetaBuildingRegistry.register(MetaComparatorBuilding); // Belt registerBuildingVariant(1, MetaBeltBuilding, defaultBuildingVariant, 0); @@ -109,6 +116,16 @@ export function initMetaBuildingRegistry() { registerBuildingVariant(29, MetaWireBuilding, defaultBuildingVariant, 2); registerBuildingVariant(30, MetaWireBuilding, defaultBuildingVariant, 3); + registerBuildingVariant(52, MetaWireBuilding, enumWireVariant.second, 0); + registerBuildingVariant(53, MetaWireBuilding, enumWireVariant.second, 1); + registerBuildingVariant(54, MetaWireBuilding, enumWireVariant.second, 2); + registerBuildingVariant(55, MetaWireBuilding, enumWireVariant.second, 3); + + registerBuildingVariant(56, MetaWireBuilding, enumWireVariant.third, 0); + registerBuildingVariant(57, MetaWireBuilding, enumWireVariant.third, 1); + registerBuildingVariant(58, MetaWireBuilding, enumWireVariant.third, 2); + registerBuildingVariant(59, MetaWireBuilding, enumWireVariant.third, 3); + // Constant signal registerBuildingVariant(31, MetaConstantSignalBuilding); @@ -117,7 +134,10 @@ export function initMetaBuildingRegistry() { registerBuildingVariant(34, MetaLogicGateBuilding, enumLogicGateVariants.not); registerBuildingVariant(35, MetaLogicGateBuilding, enumLogicGateVariants.xor); registerBuildingVariant(36, MetaLogicGateBuilding, enumLogicGateVariants.or); - registerBuildingVariant(38, MetaLogicGateBuilding, enumLogicGateVariants.transistor); + + // Transistor + registerBuildingVariant(38, MetaTransistorBuilding, defaultBuildingVariant); + registerBuildingVariant(60, MetaTransistorBuilding, enumTransistorVariants.mirrored); // Lever registerBuildingVariant(33, MetaLeverBuilding); @@ -127,20 +147,21 @@ export function initMetaBuildingRegistry() { // Wire tunnel registerBuildingVariant(39, MetaWireTunnelBuilding); - registerBuildingVariant(41, MetaWireTunnelBuilding, enumWireTunnelVariants.coating); // 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); registerBuildingVariant(50, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.stacker); registerBuildingVariant(51, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.painter); + // Analyzer + registerBuildingVariant(46, MetaComparatorBuilding); + registerBuildingVariant(43, MetaAnalyzerBuilding); + // Reader registerBuildingVariant(49, MetaReaderBuilding); diff --git a/src/js/game/systems/logic_gate.js b/src/js/game/systems/logic_gate.js index cd2d7dfb..2de11f59 100644 --- a/src/js/game/systems/logic_gate.js +++ b/src/js/game/systems/logic_gate.js @@ -3,11 +3,9 @@ import { enumColors } from "../colors"; import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate"; import { enumPinSlotType } from "../components/wired_pins"; import { GameSystemWithFilter } from "../game_system_with_filter"; -import { BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON, isTruthyItem, BooleanItem } from "../items/boolean_item"; -import { COLOR_ITEM_SINGLETONS, ColorItem } from "../items/color_item"; +import { BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON, isTruthyItem } from "../items/boolean_item"; +import { COLOR_ITEM_SINGLETONS } from "../items/color_item"; import { ShapeDefinition } from "../shape_definition"; -import { ShapeItem } from "../items/shape_item"; -import { enumInvertedDirections } from "../../core/vector"; export class LogicGateSystem extends GameSystemWithFilter { constructor(root) { @@ -24,7 +22,7 @@ export class LogicGateSystem extends GameSystemWithFilter { [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), + [enumLogicGateType.compare]: this.compute_COMPARE.bind(this), [enumLogicGateType.stacker]: this.compute_STACKER.bind(this), [enumLogicGateType.painter]: this.compute_PAINTER.bind(this), }; @@ -318,7 +316,7 @@ export class LogicGateSystem extends GameSystemWithFilter { * @param {Array} parameters * @returns {BaseItem} */ - compute_SHAPECOMPARE(parameters) { + compute_COMPARE(parameters) { const itemA = parameters[0]; const itemB = parameters[1]; diff --git a/src/js/game/systems/wire.js b/src/js/game/systems/wire.js index 4168edc4..4d0e6de4 100644 --- a/src/js/game/systems/wire.js +++ b/src/js/game/systems/wire.js @@ -3,6 +3,7 @@ import { gMetaBuildingRegistry } from "../../core/global_registries"; import { Loader } from "../../core/loader"; import { createLogger } from "../../core/logging"; import { Rectangle } from "../../core/rectangle"; +import { AtlasSprite } from "../../core/sprites"; import { StaleAreaDetector } from "../../core/stale_area_detector"; import { fastArrayDeleteValueIfContained } from "../../core/utils"; import { @@ -13,16 +14,15 @@ import { Vector, } from "../../core/vector"; import { BaseItem } from "../base_item"; -import { isTrueItem } from "../items/boolean_item"; import { arrayWireRotationVariantToType, MetaWireBuilding } from "../buildings/wire"; import { getCodeFromBuildingData } from "../building_codes"; -import { enumWireType, WireComponent } from "../components/wire"; +import { enumWireType, enumWireVariant, WireComponent } from "../components/wire"; import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; import { WireTunnelComponent } from "../components/wire_tunnel"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; +import { isTruthyItem } from "../items/boolean_item"; import { MapChunkView } from "../map_chunk_view"; -import { defaultBuildingVariant } from "../meta_building"; const logger = createLogger("wires"); @@ -93,32 +93,22 @@ export class WireSystem extends GameSystemWithFilter { constructor(root) { super(root, [WireComponent]); - this.wireSprites = { - regular: { - [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/regular_forward.png"), - [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/regular_turn.png"), - [enumWireType.split]: Loader.getSprite("sprites/wires/sets/regular_split.png"), - [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/regular_cross.png"), - }, - conflict: { - [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/conflict_forward.png"), - [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/conflict_turn.png"), - [enumWireType.split]: Loader.getSprite("sprites/wires/sets/conflict_split.png"), - [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/conflict_cross.png"), - }, - shape: { - [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/shape_forward.png"), - [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/shape_turn.png"), - [enumWireType.split]: Loader.getSprite("sprites/wires/sets/shape_split.png"), - [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/shape_cross.png"), - }, - color: { - [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/color_forward.png"), - [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/color_turn.png"), - [enumWireType.split]: Loader.getSprite("sprites/wires/sets/color_split.png"), - [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/color_cross.png"), - }, - }; + /** + * @type {Object>} + */ + this.wireSprites = {}; + + const variants = ["conflict", ...Object.keys(enumWireVariant)]; + for (let i = 0; i < variants.length; ++i) { + const wireVariant = variants[i]; + const sprites = {}; + for (const wireType in enumWireType) { + sprites[wireType] = Loader.getSprite( + "sprites/wires/sets/" + wireVariant + "_" + wireType + ".png" + ); + } + this.wireSprites[wireVariant] = sprites; + } this.root.signals.entityDestroyed.add(this.queuePlacementUpdate, this); this.root.signals.entityAdded.add(this.queuePlacementUpdate, this); @@ -230,6 +220,13 @@ export class WireSystem extends GameSystemWithFilter { }, ]; + /** + * Once we occur a wire, we store its variant so we don't connect to + * mismatching ones + * @type {enumWireVariant} + */ + let variantMask = null; + while (entitiesToVisit.length > 0) { const nextData = entitiesToVisit.pop(); const nextEntity = nextData.entity; @@ -257,13 +254,18 @@ export class WireSystem extends GameSystemWithFilter { ); if (!wireComp.linkedNetwork) { - // This one is new! :D - VERBOSE_WIRES && logger.log(" Visited new wire:", staticComp.origin.toString()); - wireComp.linkedNetwork = currentNetwork; - currentNetwork.wires.push(nextEntity); + if (variantMask && wireComp.variant !== variantMask) { + // Mismatching variant + } else { + // This one is new! :D + VERBOSE_WIRES && logger.log(" Visited new wire:", staticComp.origin.toString()); + wireComp.linkedNetwork = currentNetwork; + currentNetwork.wires.push(nextEntity); - newSearchDirections = arrayAllDirections; - newSearchTile = nextEntity.components.StaticMapEntity.origin; + newSearchDirections = arrayAllDirections; + newSearchTile = nextEntity.components.StaticMapEntity.origin; + variantMask = wireComp.variant; + } } } @@ -319,7 +321,8 @@ export class WireSystem extends GameSystemWithFilter { const newTargets = this.findSurroundingWireTargets( newSearchTile, newSearchDirections, - currentNetwork + currentNetwork, + variantMask ); VERBOSE_WIRES && logger.log(" Found", newTargets, "new targets to visit!"); @@ -361,13 +364,21 @@ export class WireSystem extends GameSystemWithFilter { * @param {Vector} initialTile * @param {Array} directions * @param {WireNetwork} network + * @param {enumWireVariant=} variantMask Only accept connections to this mask * @returns {Array} */ - findSurroundingWireTargets(initialTile, directions, network) { + findSurroundingWireTargets(initialTile, directions, network, variantMask = null) { let result = []; VERBOSE_WIRES && - logger.log(" Searching for new targets at", initialTile.toString(), "and d=", directions); + logger.log( + " Searching for new targets at", + initialTile.toString(), + "and d=", + directions, + "with mask=", + variantMask + ); // Go over all directions we should search for for (let i = 0; i < directions.length; ++i) { @@ -399,7 +410,11 @@ export class WireSystem extends GameSystemWithFilter { const wireComp = entity.components.Wire; // Check for wire - if (wireComp && !wireComp.linkedNetwork) { + if ( + wireComp && + !wireComp.linkedNetwork && + (!variantMask || wireComp.variant === variantMask) + ) { // Wires accept connections from everywhere result.push({ entity, @@ -449,17 +464,6 @@ export class WireSystem extends GameSystemWithFilter { const staticComp = entity.components.StaticMapEntity; - if ( - !tunnelComp.multipleDirections && - !( - direction === staticComp.localDirectionToWorld(enumDirection.top) || - direction === staticComp.localDirectionToWorld(enumDirection.bottom) - ) - ) { - // It's a coating, and it doesn't connect here - continue; - } - // Compute where this tunnel connects to const forwardedTile = staticComp.origin.add(offset); VERBOSE_WIRES && @@ -570,8 +574,8 @@ export class WireSystem extends GameSystemWithFilter { if (!wireComp.linkedNetwork) { // There is no network, it's empty return { - spriteSet: this.wireSprites.regular, - opacity: 0.3, + spriteSet: this.wireSprites[wireComp.variant], + opacity: 0.5, }; } @@ -584,38 +588,9 @@ export class WireSystem extends GameSystemWithFilter { }; } - const value = network.currentValue; - if (!value) { - // There is no value stored - return { - spriteSet: this.wireSprites.regular, - opacity: 0.3, - }; - } - - const valueType = value.getItemType(); - if (valueType === "shape") { - return { - spriteSet: this.wireSprites.shape, - opacity: 1, - }; - } else if (valueType === "color") { - return { - spriteSet: this.wireSprites.color, - opacity: 1, - }; - } else if (valueType === "boolean") { - return { - spriteSet: this.wireSprites.regular, - opacity: isTrueItem(value) ? 1 : 0.5, - }; - } else { - assertAlways(false, "Unknown item type: " + valueType); - } - return { - spriteSet: this.wireSprites.regular, - opacity: 1, + spriteSet: this.wireSprites[wireComp.variant], + opacity: isTruthyItem(network.currentValue) ? 1 : 0.5, }; } @@ -641,9 +616,10 @@ export class WireSystem extends GameSystemWithFilter { const staticComp = entity.components.StaticMapEntity; parameters.context.globalAlpha = opacity; staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 0); - parameters.context.globalAlpha = 1; + // DEBUG Rendering if (G_IS_DEV && globalConfig.debug.renderWireRotations) { + parameters.context.globalAlpha = 1; parameters.context.fillStyle = "red"; parameters.context.font = "5px Tahoma"; parameters.context.fillText( @@ -691,6 +667,8 @@ export class WireSystem extends GameSystemWithFilter { } } } + + parameters.context.globalAlpha = 1; } /** @@ -746,6 +724,8 @@ export class WireSystem extends GameSystemWithFilter { continue; } + const variant = targetStaticComp.getVariant(); + const { rotation, rotationVariant, @@ -753,7 +733,7 @@ export class WireSystem extends GameSystemWithFilter { root: this.root, tile: new Vector(x, y), rotation: targetStaticComp.originalRotation, - variant: defaultBuildingVariant, + variant, layer: targetEntity.layer, }); @@ -763,14 +743,10 @@ export class WireSystem extends GameSystemWithFilter { if (targetStaticComp.rotation !== rotation || newType !== targetWireComp.type) { // Change stuff targetStaticComp.rotation = rotation; - metaWire.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant); + metaWire.updateVariants(targetEntity, rotationVariant, variant); // Update code as well - targetStaticComp.code = getCodeFromBuildingData( - metaWire, - defaultBuildingVariant, - rotationVariant - ); + targetStaticComp.code = getCodeFromBuildingData(metaWire, variant, rotationVariant); // Make sure the chunks know about the update this.root.signals.entityChanged.dispatch(targetEntity); diff --git a/translations/base-en.yaml b/translations/base-en.yaml index edec6d28..7e828293 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -566,16 +566,18 @@ buildings: default: name: &wire Wire description: &wire_desc Allows to connect logical components and can transfer items, colors or boolean signals. + second: + name: Wire (Type 2) + description: &wire_desc_second Allows to connect logical components and can transfer items, colors or boolean signals. Different colored wires do not connect. + third: + name: Wire (Type 3) + description: *wire_desc_second wire_tunnel: default: name: &wire_tunnel Wire Tunnel description: Allows to cross two wires without connecting them. - coating: - name: Wire Insulation - description: Allows to pass through signals without connecting to other wires on the sides. - constant_signal: default: name: &constant_signal Constant Signal @@ -589,20 +591,25 @@ buildings: logic_gate: default: name: &logic_gate AND Gate - description: Emits a truthy boolean signal if both inputs are truthy. + description: Emits a boolean "1" if both inputs are truthy. not: - name: NOT - description: Inverts the given signal. + name: NOT Gate + description: Emits a boolean "1" if the input is not truthy. xor: - name: XOR - description: Emits a truthy signal if one of the inputs is truthy, but not both. + name: XOR Gate + description: Emits a boolean "1" if one of the inputs is truthy, but not both. or: - name: OR - description: Emits a truthy signal if one of the inputs is truthy. + name: OR Gate + description: Emits a boolean "1" if one of the inputs is truthy. - transistor: - name: Gate - description: Only forwards the bottom input if the left input is true. + transistor: + default: + name: &transistor Gate + description: &transistor_desc Forwards the bottom input if the side input is truthy (a shape, color or "1"). + + mirrored: + name: *transistor + description: *transistor_desc filter: default: @@ -619,14 +626,20 @@ buildings: name: &reader Belt Reader description: Allows to measure belt throughput. Outputs the last read item on the wires layer (once unlocked). + analyzer: + default: + name: &analyzer Shape Analyzer + description: Analyzes the top right quadrant of the lowest layer of the shape and returns its shape and color. + + comparator: + default: + name: &comparator Compare + description: Returns boolean "1" if both items are exactly equal. Can compare shapes, items and booleans. + 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 + description: Computes rotater: name: Virtual Rotater @@ -636,10 +649,6 @@ buildings: name: Virtual Unstacker description: Returns the topmost layer to the right, and the remaining ones on the left. - shapecompare: - name: Compare - description: Returns true if both items are exactly equal. Can compare shapes, items and booleans. - stacker: name: Virtual Stacker description: Virtually stacks the right shape onto the left. @@ -1040,6 +1049,9 @@ keybindings: display: *display reader: *reader virtual_processor: *virtual_processor + transistor: *transistor + analyzer: *analyzer + comparator: *comparator # --- pipette: Pipette