diff --git a/README.md b/README.md index 6a0bc39d..e430ce9a 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,28 @@ This project is based on ES5. Some ES2015 features are used but most of them are 4. Add the system in `src/js/game/game_system_manager.js` (To `this.systems` and also call `add` in the `internalInitSystems()` method) 5. If your system should draw stuff, this is a bit more complicated. Have a look at existing systems on how they do it. +#### Checklist for a new building / testing it + +This is a quick checklist, if a new building is added this points should be fulfilled: + +2. The translation for all variants is done and finalized +3. The artwork (regular sprite) is finalized +4. The blueprint sprite has been generated and is up to date +5. The building has been added to the appropriate toolbar +6. The building has a keybinding which makes sense +7. The building has a reward assigned and is unlocked at a meaningful point +8. The reward for the building has a proper translation +9. The reward for the building has a proper image +10. The building has a proper tutorial image assigned +11. The buliding has a proper toolbar icon +12. The reward requires a proper shape +13. The building has a proper silhouette color +14. The building has a proper matrix for being rendered on the minimap +15. The building has proper statistics in the dialog +16. The building properly contributes to the shapes produced analytics +17. The building is properly persisted in the savegame +18. The building is explained properly, ideally via an interactive tutorial + ### Assets For most assets I use Adobe Photoshop, you can find them in `assets/`. diff --git a/gulp/convert_atlas.js b/gulp/convert_atlas.js deleted file mode 100644 index 8e0ba990..00000000 --- a/gulp/convert_atlas.js +++ /dev/null @@ -1,96 +0,0 @@ -// Converts the atlas description to a JSON file - -String.prototype.replaceAll = function (search, replacement) { - var target = this; - return target.split(search).join(replacement); -}; - -const fs = require("fs"); -const path = require("path"); - -const folder = path.join(__dirname, "res_built", "atlas"); -const files = fs.readdirSync(folder); - -const metadata = []; - -files.forEach(filename => { - if (filename.endsWith(".atlas")) { - // Read content - - const content = fs.readFileSync(path.join(folder, filename), "ascii"); - - const lines = content.replaceAll("\r", "").replaceAll("\t", "").split("\n"); - - const readLine = () => lines.splice(0, 1)[0]; - const readValue = () => readLine().replaceAll(" ", "").split(":")[1]; - const readVector = () => - readValue() - .split(",") - .map(d => parseInt(d, 10)); - - let maxAtlas = 100; - - atlasLoop: while (maxAtlas-- > 0 && lines.length >= 7) { - const result = { - entries: [], - }; - - // Extract header - const header_fileStart = readLine(); - const header_fileName = readLine(); - const header_size = readVector(); - const header_format = readLine(); - const header_filter = readLine(); - const header_repeat = readLine(); - const baseAtlasName = header_fileName.replace(".png", ""); - - // Store size - result.size = header_size; - - lineLoop: while (lines.length >= 7) { - const entryResult = {}; - - const nextLine = lines[0]; - if (nextLine.length === 0) { - break; - } - - const entry_fileName = readLine() + ".png"; - - const entry_rotate = readValue(); - const entry_xy = readVector(); - const entry_size = readVector(); - const entry_orig = readVector(); - const entry_offset = readVector(); - const entry_index = readValue(); - - entryResult.filename = entry_fileName; - entryResult.xy = entry_xy; - entryResult.size = entry_size; - // entryResult.offset = entry_offset; - - entryResult.origSize = entry_orig; - - let offset = [0, 0]; - - // GDX Atlas packer uses 1 - y coordinates. This sucks, and we have to convert it - offset[0] = entry_offset[0]; - offset[1] = entry_orig[1] - entry_offset[1] - entry_size[1]; - - entryResult.offset = offset; - - result.entries.push(entryResult); - } - - console.log("[Atlas]", "'" + baseAtlasName + "'", "has", result.entries.length, "entries"); - // fs.writeFileSync(path.join(folder, baseAtlasName + ".gen.json"), JSON.stringify(result)); - - metadata.push({ - filename: baseAtlasName + ".png", - entries: result, - }); - } - } -}); - -fs.writeFileSync(path.join(folder, "meta.gen.json"), JSON.stringify(metadata, null, 4)); 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..311df8a8 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/mixer.png b/res/ui/building_icons/mixer.png index 1dd85b9b..6ce15dbb 100644 Binary files a/res/ui/building_icons/mixer.png and b/res/ui/building_icons/mixer.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/constant_signal.png b/res/ui/building_tutorials/constant_signal.png index 6db1ebf4..70de0a21 100644 Binary files a/res/ui/building_tutorials/constant_signal.png and b/res/ui/building_tutorials/constant_signal.png differ diff --git a/res/ui/building_tutorials/cutter-quad.png b/res/ui/building_tutorials/cutter-quad.png index 22137353..696a05be 100644 Binary files a/res/ui/building_tutorials/cutter-quad.png and b/res/ui/building_tutorials/cutter-quad.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/painter-mirrored.png b/res/ui/building_tutorials/painter-mirrored.png new file mode 100644 index 00000000..63cc6683 Binary files /dev/null and b/res/ui/building_tutorials/painter-mirrored.png differ diff --git a/res/ui/building_tutorials/painter-quad.png b/res/ui/building_tutorials/painter-quad.png index 57536440..2d52a01b 100644 Binary files a/res/ui/building_tutorials/painter-quad.png and b/res/ui/building_tutorials/painter-quad.png differ diff --git a/res/ui/building_tutorials/painter.png b/res/ui/building_tutorials/painter.png index 8791082f..bb1147d5 100644 Binary files a/res/ui/building_tutorials/painter.png and b/res/ui/building_tutorials/painter.png differ diff --git a/res/ui/building_tutorials/stacker.png b/res/ui/building_tutorials/stacker.png index 55232a2c..ef11af8d 100644 Binary files a/res/ui/building_tutorials/stacker.png and b/res/ui/building_tutorials/stacker.png differ diff --git a/res/ui/building_tutorials/storage.png b/res/ui/building_tutorials/storage.png index 4bdfda9b..b5d21433 100644 Binary files a/res/ui/building_tutorials/storage.png and b/res/ui/building_tutorials/storage.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..9f2b462c 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..a5f01acf 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":381,"y":1767,"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":503,"y":1762,"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":871,"y":1811,"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":858,"y":1257,"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":945,"y":1407,"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":980,"y":1257,"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":991,"y":1557,"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":1067,"y":1407,"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":1102,"y":1167,"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":1224,"y":1181,"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":625,"y":1758,"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":747,"y":1728,"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":823,"y":1511,"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":869,"y":1661,"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":592,"y":1912,"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":1488,"y":1189,"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":1896,"y":1255,"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":1760,"y":1335,"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":1896,"y":1391,"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":1331,"y":1337,"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":1467,"y":1461,"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":1331,"y":1473,"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":1189,"y":1479,"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":1603,"y":1462,"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":1624,"y":1190,"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":1488,"y":1325,"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":1760,"y":1199,"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":1624,"y":1326,"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":1467,"y":1597,"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":1325,"y":1609,"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":1739,"y":1607,"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":1597,"y":1734,"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":1875,"y":1663,"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":1733,"y":1743,"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":1115,"y":1879,"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":1251,"y":1879,"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":1387,"y":1879,"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":1523,"y":1879,"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":1739,"y":1471,"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":1603,"y":1598,"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":1461,"y":1733,"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":1875,"y":1527,"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":300,"y":605,"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":710,"y":1247,"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":416,"y":1092,"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":561,"y":1250,"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":416,"y":1236,"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":6,"y":898,"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":1659,"y":1879,"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":1795,"y":1879,"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":993,"y":1869,"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":861,"y":860,"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":450,"y":810,"w":105,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":105,"h":127}, @@ -410,15 +426,15 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":4,"y":559,"w":548,"h":144}, + "frame": {"x":6,"y":306,"w":532,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":0,"w":548,"h":144}, + "spriteSourceSize": {"x":24,"y":0,"w":532,"h":144}, "sourceSize": {"w":576,"h":144} }, "sprites/blueprints/cutter.png": { - "frame": {"x":4,"y":1589,"w":256,"h":144}, + "frame": {"x":1393,"y":456,"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":993,"y":1707,"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":1714,"y":156,"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":411,"y":1522,"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":1917,"y":515,"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":861,"y":999,"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":561,"y":860,"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":1071,"y":890,"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":419,"y":943,"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":1898,"y":1106,"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":1126,"y":441,"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":6,"y":605,"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":1420,"y":6,"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":6,"y":6,"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":1714,"y":6,"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":262,"y":1444,"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":711,"y":1097,"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":561,"y":1100,"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":6,"y":1345,"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":1693,"y":306,"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":1655,"y":605,"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":155,"y":1527,"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":156,"y":1257,"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":300,"y":755,"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":448,"y":1917,"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":517,"y":1522,"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":439,"y":1644,"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":584,"y":1640,"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":1911,"y":665,"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":134,"y":1784,"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":1911,"y":815,"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":566,"y":710,"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":6,"y":1198,"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":1904,"y":965,"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":269,"y":905,"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":1356,"y":1047,"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":1503,"y":1047,"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":413,"y":1380,"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":1648,"y":1048,"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":1100,"y":591,"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":592,"y":1912,"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":1467,"y":1597,"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":381,"y":1767,"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":6,"y":1495,"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":156,"y":1048,"w":104,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":104,"h":127}, @@ -810,15 +794,15 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":1124,"y":4,"w":548,"h":143}, + "frame": {"x":6,"y":456,"w":524,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":0,"w":548,"h":143}, + "spriteSourceSize": {"x":25,"y":0,"w":524,"h":143}, "sourceSize": {"w":576,"h":144} }, "sprites/buildings/cutter.png": { - "frame": {"x":258,"y":1307,"w":256,"h":143}, + "frame": {"x":1655,"y":456,"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":1224,"y":1040,"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":1420,"y":306,"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":572,"y":6,"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":335,"y":1647,"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":6,"y":1784,"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":860,"y":1128,"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":264,"y":1295,"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":1071,"y":1029,"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":1346,"y":1189,"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":1189,"y":1331,"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":568,"y":561,"w":260,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143}, @@ -922,15 +898,15 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":4,"y":709,"w":288,"h":286}, + "frame": {"x":1126,"y":6,"w":288,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":288,"h":286}, + "spriteSourceSize": {"x":0,"y":0,"w":288,"h":279}, "sourceSize": {"w":288,"h":288} }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":1126,"y":303,"w":288,"h":144}, + "frame": {"x":1420,"y":156,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -938,15 +914,15 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":558,"y":154,"w":560,"h":144}, + "frame": {"x":6,"y":156,"w":537,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":560,"h":144}, + "spriteSourceSize": {"x":13,"y":0,"w":537,"h":144}, "sourceSize": {"w":576,"h":144} }, "sprites/buildings/painter.png": { - "frame": {"x":852,"y":454,"w":288,"h":144}, + "frame": {"x":1126,"y":291,"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":6,"y":1634,"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":1357,"y":898,"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":1504,"y":898,"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":1651,"y":899,"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":834,"y":561,"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":1362,"y":606,"w":245,"h":286}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":0,"w":248,"h":288}, + "spriteSourceSize": {"x":22,"y":2,"w":245,"h":286}, "sourceSize": {"w":288,"h":288} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":1793,"y":1049,"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":1798,"y":899,"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":6,"y":1048,"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":305,"y":1918,"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":561,"y":1394,"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":661,"y":1511,"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":704,"y":1394,"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":1226,"y":740,"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":258,"y":1768,"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":1221,"y":890,"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":266,"y":1055,"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":711,"y":860,"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":728,"y":1908,"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":1988,"y":203,"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":1988,"y":258,"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":1016,"y":710,"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":1016,"y":765,"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":1016,"y":820,"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":1011,"y":875,"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":1011,"y":930,"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":1011,"y":985,"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":549,"y":156,"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":549,"y":174,"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":1011,"y":1040,"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":450,"y":605,"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":1960,"y":313,"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":156,"y":1181,"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":1613,"y":606,"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":1917,"y":456,"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":728,"y":1628,"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":261,"y":1594,"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":6,"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":544,"y":306,"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":1009,"y":1148,"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":305,"y":1594,"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":199,"y":1934,"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":199,"y":1987,"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":252,"y":1934,"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":252,"y":1987,"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":358,"y":1594,"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":155,"y":1407,"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":1960,"y":403,"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":450,"y":692,"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":728,"y":1678,"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":516,"y":756,"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":6,"y":1934,"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":716,"y":710,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -1450,95 +1354,95 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":2026,"y":416,"w":18,"h":144}, + "frame": {"x":536,"y":456,"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":711,"y":1006,"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":108,"y":1934,"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":866,"y":710,"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":2008,"y":53,"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":561,"y":1009,"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":153,"y":1677,"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":1076,"y":740,"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":534,"y":606,"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":266,"y":1204,"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":244,"y":1677,"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/wires_preview.png": { - "frame": {"x":1360,"y":1996,"w":48,"h":48}, + "frame": {"x":1011,"y":1094,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1551,6 +1455,6 @@ "format": "RGBA8888", "size": {"w":2048,"h":2048}, "scale": "0.75", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:c61d9c7c8f387e344954d344de26c19e:20296b3e09d5b363b1e55eee3b673411:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_hq.png b/res_built/atlas/atlas0_hq.png index 63dbe6ea..4fd522ec 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..b3ebc4c1 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":978,"y":383,"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":531,"y":422,"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":411,"y":518,"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":289,"y":565,"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":234,"y":596,"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":155,"y":611,"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":102,"y":647,"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":52,"y":675,"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":6,"y":679,"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":678,"y":375,"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":109,"y":593,"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":56,"y":621,"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":6,"y":625,"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":365,"y":518,"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":628,"y":275,"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":678,"y":275,"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":578,"y":327,"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":482,"y":372,"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":381,"y":418,"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":431,"y":418,"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":265,"y":496,"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":189,"y":511,"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":134,"y":543,"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":59,"y":571,"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":728,"y":275,"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":778,"y":275,"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":828,"y":318,"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":628,"y":325,"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":6,"y":575,"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":678,"y":325,"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":928,"y":383,"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":628,"y":375,"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":577,"y":377,"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":481,"y":422,"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":381,"y":468,"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":431,"y":468,"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":481,"y":472,"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":315,"y":515,"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":728,"y":325,"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":778,"y":325,"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":828,"y":368,"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":878,"y":368,"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":96,"y":222,"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":188,"y":251,"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":632,"y":222,"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":96,"y":276,"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":685,"y":222,"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":588,"y":114,"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":239,"y":546,"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":184,"y":561,"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":627,"y":425,"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":389,"y":270,"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":239,"y":305,"w":36,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43}, @@ -410,15 +426,15 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":4,"y":58,"w":184,"h":48}, + "frame": {"x":6,"y":114,"w":179,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, + "spriteSourceSize": {"x":7,"y":0,"w":179,"h":48}, "sourceSize": {"w":192,"h":48} }, "sprites/blueprints/cutter.png": { - "frame": {"x":863,"y":58,"w":87,"h":48}, + "frame": {"x":485,"y":160,"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":947,"y":331,"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":594,"y":60,"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":441,"y":340,"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":232,"y":403,"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":280,"y":404,"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":6,"y":324,"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":281,"y":353,"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":212,"y":457,"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":136,"y":489,"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":390,"y":108,"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":390,"y":6,"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":594,"y":6,"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":6,"y":6,"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":696,"y":6,"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":681,"y":114,"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":735,"y":114,"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":789,"y":114,"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":843,"y":114,"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":691,"y":60,"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":282,"y":197,"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":242,"y":251,"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":537,"y":214,"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":897,"y":114,"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":387,"y":321,"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":280,"y":452,"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":143,"y":410,"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":84,"y":438,"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":974,"y":72,"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":334,"y":407,"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":973,"y":126,"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":578,"y":168,"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":483,"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/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":951,"y":180,"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":389,"y":216,"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":578,"y":222,"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":738,"y":222,"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":483,"y":268,"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":791,"y":222,"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":390,"y":162,"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":628,"y":275,"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":6,"y":575,"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":978,"y":383,"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":178,"y":359,"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":239,"y":354,"w":36,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43}, @@ -810,15 +794,15 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":194,"y":58,"w":184,"h":48}, + "frame": {"x":6,"y":168,"w":177,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, + "spriteSourceSize": {"x":7,"y":0,"w":177,"h":48}, "sourceSize": {"w":192,"h":48} }, "sprites/buildings/cutter.png": { - "frame": {"x":675,"y":112,"w":87,"h":48}, + "frame": {"x":189,"y":197,"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":578,"y":275,"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":492,"y":106,"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":200,"y":6,"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":443,"y":270,"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":902,"y":168,"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":383,"y":370,"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":282,"y":299,"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":482,"y":321,"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":81,"y":517,"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":6,"y":521,"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":786,"y":60,"w":88,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, @@ -922,15 +898,15 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":106,"y":112,"w":96,"h":96}, + "frame": {"x":492,"y":6,"w":96,"h":94}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":94}, "sourceSize": {"w":96,"h":96} }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":4,"y":214,"w":96,"h":48}, + "frame": {"x":798,"y":6,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -938,15 +914,15 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":198,"y":4,"w":188,"h":48}, + "frame": {"x":6,"y":60,"w":181,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, + "spriteSourceSize": {"x":3,"y":0,"w":181,"h":48}, "sourceSize": {"w":192,"h":48} }, "sprites/buildings/painter.png": { - "frame": {"x":106,"y":214,"w":96,"h":48}, + "frame": {"x":900,"y":6,"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":185,"y":305,"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":95,"y":330,"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":6,"y":378,"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":89,"y":384,"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":880,"y":60,"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":6,"y":222,"w":84,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, + "spriteSourceSize": {"x":6,"y":0,"w":84,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":443,"y":216,"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":537,"y":268,"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":6,"y":432,"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":897,"y":222,"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":950,"y":233,"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":897,"y":270,"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":844,"y":274,"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":950,"y":277,"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":334,"y":461,"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":897,"y":314,"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":632,"y":168,"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":686,"y":168,"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":844,"y":222,"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":60,"y":430,"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":336,"y":334,"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":143,"y":386,"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":335,"y":358,"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":443,"y":316,"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":359,"y":359,"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":335,"y":382,"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":359,"y":383,"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":189,"y":168,"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":189,"y":178,"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":1002,"y":6,"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":150,"y":316,"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":149,"y":351,"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":536,"y":322,"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":180,"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":199,"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":150,"y":260,"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":192,"y":454,"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":218,"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":467,"y":316,"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":1002,"y":28,"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":1002,"y":50,"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":951,"y":114,"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":951,"y":136,"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":951,"y":158,"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":60,"y":454,"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":60,"y":476,"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":536,"y":353,"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":60,"y":359,"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":60,"y":401,"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":197,"y":410,"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":60,"y":498,"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":150,"y":222,"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":740,"y":168,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -1450,95 +1354,95 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":363,"y":305,"w":8,"h":48}, + "frame": {"x":373,"y":197,"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":6,"y":486,"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":150,"y":281,"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":794,"y":168,"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":373,"y":251,"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":138,"y":454,"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":60,"y":324,"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":848,"y":168,"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":371,"y":305,"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":82,"y":482,"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":336,"y":299,"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/wires_preview.png": { - "frame": {"x":550,"y":272,"w":16,"h":16}, + "frame": {"x":197,"y":432,"w":16,"h":16}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, @@ -1551,6 +1455,6 @@ "format": "RGBA8888", "size": {"w":1024,"h":1024}, "scale": "0.25", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:c61d9c7c8f387e344954d344de26c19e:20296b3e09d5b363b1e55eee3b673411:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_lq.png b/res_built/atlas/atlas0_lq.png index 15cdd7bc..1d33b061 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..47e1845c 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":659,"y":883,"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":94,"y":1900,"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":262,"y":1918,"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":346,"y":1918,"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":430,"y":1853,"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":835,"y":1509,"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":734,"y":1597,"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":919,"y":1509,"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":560,"y":1674,"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":644,"y":1674,"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":178,"y":1871,"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":476,"y":1672,"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":378,"y":1751,"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":285,"y":1816,"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":799,"y":1318,"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":699,"y":1395,"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":176,"y":1406,"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":370,"y":1444,"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":269,"y":1493,"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":463,"y":1472,"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":362,"y":1537,"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":556,"y":1486,"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":455,"y":1565,"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":649,"y":1488,"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":892,"y":1323,"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":792,"y":1411,"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":885,"y":1416,"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":277,"y":1400,"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":548,"y":1579,"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":742,"y":1504,"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":99,"y":1592,"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":6,"y":1618,"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":290,"y":1630,"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":192,"y":1679,"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":99,"y":1685,"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":6,"y":1711,"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":383,"y":1658,"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":285,"y":1723,"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":641,"y":1581,"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":104,"y":1499,"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":6,"y":1525,"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":197,"y":1586,"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":6,"y":720,"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":530,"y":1080,"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":733,"y":1008,"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":425,"y":1083,"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":631,"y":1087,"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":366,"y":583,"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":192,"y":1772,"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":99,"y":1778,"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":818,"y":1611,"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":6,"y":924,"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":846,"y":804,"w":71,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":71,"h":85}, @@ -410,15 +426,15 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":376,"y":106,"w":366,"h":96}, + "frame": {"x":6,"y":210,"w":355,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, + "spriteSourceSize": {"x":16,"y":0,"w":355,"h":96}, "sourceSize": {"w":384,"h":96} }, "sprites/blueprints/cutter.png": { - "frame": {"x":362,"y":616,"w":172,"h":96}, + "frame": {"x":568,"y":679,"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":829,"y":1141,"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":385,"y":481,"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":108,"y":924,"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":1039,"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":182,"y":1017,"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":353,"y":685,"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":6,"y":1019,"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":179,"y":1304,"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":6,"y":1423,"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":204,"y":414,"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":758,"y":6,"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":386,"y":379,"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":6,"y":6,"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":757,"y":396,"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":923,"y":721,"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":455,"y":685,"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":557,"y":781,"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":744,"y":804,"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":756,"y":600,"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":584,"y":379,"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":108,"y":1091,"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":108,"y":720,"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":922,"y":925,"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":526,"y":1179,"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":422,"y":1182,"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":6,"y":1342,"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":319,"y":1239,"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":613,"y":1282,"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":937,"y":619,"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":513,"y":1370,"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":353,"y":787,"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":182,"y":917,"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":730,"y":1107,"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":455,"y":787,"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":180,"y":1207,"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":921,"y":1129,"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":321,"y":1142,"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":921,"y":1226,"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":746,"y":702,"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":799,"y":1318,"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":548,"y":1579,"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":659,"y":883,"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":530,"y":985,"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":846,"y":895,"w":70,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":70,"h":85}, @@ -810,15 +794,15 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":376,"y":208,"w":366,"h":96}, + "frame": {"x":6,"y":312,"w":350,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, + "spriteSourceSize": {"x":16,"y":0,"w":350,"h":96}, "sourceSize": {"w":384,"h":96} }, "sprites/buildings/cutter.png": { - "frame": {"x":4,"y":683,"w":171,"h":96}, + "frame": {"x":6,"y":618,"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":6,"y":1804,"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":571,"y":577,"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":386,"y":6,"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":107,"y":1295,"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":6,"y":1900,"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":326,"y":990,"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":326,"y":889,"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":428,"y":989,"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":516,"y":1269,"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":416,"y":1343,"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":6,"y":516,"w":174,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, @@ -922,15 +898,15 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":748,"y":202,"w":192,"h":191}, + "frame": {"x":758,"y":204,"w":192,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":192,"h":191}, + "spriteSourceSize": {"x":0,"y":0,"w":192,"h":186}, "sourceSize": {"w":192,"h":192} }, "sprites/buildings/painter-mirrored.png": { - "frame": {"x":747,"y":399,"w":192,"h":96}, + "frame": {"x":757,"y":498,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -938,15 +914,15 @@ }, "sprites/buildings/painter-quad.png": { - "frame": {"x":384,"y":4,"w":374,"h":96}, + "frame": {"x":6,"y":108,"w":359,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, + "spriteSourceSize": {"x":8,"y":0,"w":359,"h":96}, "sourceSize": {"w":384,"h":96} }, "sprites/buildings/painter.png": { - "frame": {"x":747,"y":501,"w":192,"h":96}, + "frame": {"x":6,"y":414,"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":923,"y":823,"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":181,"y":1105,"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":6,"y":1240,"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":632,"y":985,"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":186,"y":516,"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":183,"y":618,"w":164,"h":191}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":14,"y":0,"w":166,"h":192}, + "spriteSourceSize": {"x":14,"y":1,"w":164,"h":191}, "sourceSize": {"w":192,"h":192} }, +"sprites/buildings/transistor-mirrored.png": +{ + "frame": {"x":108,"y":1193,"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":108,"y":822,"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":182,"y":815,"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":723,"y":1204,"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":821,"y":1238,"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":418,"y":1263,"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":318,"y":1320,"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":706,"y":1293,"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":659,"y":781,"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":606,"y":1384,"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":6,"y":822,"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":428,"y":889,"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":625,"y":1186,"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":955,"y":483,"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":955,"y":523,"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":955,"y":563,"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":284,"y":815,"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":284,"y":855,"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":284,"y":895,"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":284,"y":935,"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":284,"y":975,"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":371,"y":108,"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":371,"y":122,"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":280,"y":1288,"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":956,"y":231,"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":956,"y":292,"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":845,"y":986,"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":978,"y":1431,"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":985,"y":1399,"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":956,"y":6,"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":985,"y":1361,"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":997,"y":483,"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":1002,"y":432,"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":284,"y":1015,"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":284,"y":1054,"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":284,"y":1093,"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":282,"y":1132,"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":282,"y":1171,"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":280,"y":1210,"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":280,"y":1249,"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":108,"y":1008,"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":956,"y":355,"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":955,"y":432,"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":277,"y":1364,"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":985,"y":1323,"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":106,"y":1378,"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":557,"y":883,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -1450,95 +1354,95 @@ }, "sprites/wires/sets/conflict_forward.png": { - "frame": {"x":887,"y":1113,"w":12,"h":96}, + "frame": {"x":362,"y":312,"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":6,"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":956,"y":42,"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":743,"y":906,"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":997,"y":517,"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":6,"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":956,"y":105,"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":921,"y":1027,"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":544,"y":583,"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":323,"y":1079,"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":956,"y":168,"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/wires_preview.png": { - "frame": {"x":952,"y":1629,"w":32,"h":32}, + "frame": {"x":277,"y":1326,"w":32,"h":32}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32}, @@ -1551,6 +1455,6 @@ "format": "RGBA8888", "size": {"w":1024,"h":2048}, "scale": "0.5", - "smartupdate": "$TexturePacker:SmartUpdate:5429cdf3b92834776437a91974e89d3c:fa61fb225cd312db144ce6a38d97871b:908b89f5ca8ff73e331a35a3b14d0604$" + "smartupdate": "$TexturePacker:SmartUpdate:c61d9c7c8f387e344954d344de26c19e:20296b3e09d5b363b1e55eee3b673411:908b89f5ca8ff73e331a35a3b14d0604$" } } diff --git a/res_built/atlas/atlas0_mq.png b/res_built/atlas/atlas0_mq.png index 50e3181d..45275573 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 57c5ea0d..97f309be 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 @@ -257,16 +257,20 @@ sprites/belt/built/right_7.png sprites/belt/built/right_8.png sprites/belt/built/right_9.png + sprites/blueprints/analyzer.png sprites/blueprints/balancer-merger-inverse.png sprites/blueprints/balancer-merger.png sprites/blueprints/balancer-splitter-inverse.png sprites/blueprints/balancer-splitter.png + sprites/blueprints/belt_left.png + sprites/blueprints/belt_right.png + sprites/blueprints/belt_top.png + sprites/blueprints/comparator.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 @@ -275,67 +279,62 @@ sprites/blueprints/rotater-ccw.png sprites/blueprints/rotater-rotate180.png sprites/blueprints/rotater.png + sprites/blueprints/transistor-mirrored.png + sprites/blueprints/transistor.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/analyzer.png sprites/buildings/balancer-merger-inverse.png sprites/buildings/balancer-merger.png sprites/buildings/balancer-splitter-inverse.png sprites/buildings/balancer-splitter.png + sprites/buildings/comparator.png sprites/buildings/constant_signal.png sprites/buildings/display.png 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 sprites/buildings/underground_belt_exit.png - sprites/buildings/virtual_processor-analyzer.png sprites/buildings/virtual_processor-painter.png sprites/buildings/virtual_processor-rotater.png - sprites/buildings/virtual_processor-shapecompare.png 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 pivotPoint 0.5,0.5 @@ -374,34 +373,6 @@ 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 - spriteScale - 1 - scale9Enabled - - scale9Borders - 32,32,63,63 - scale9Paddings - 32,32,63,63 - scale9FromFile - - sprites/blueprints/cutter-quad.png sprites/blueprints/painter-quad.png sprites/buildings/cutter-quad.png @@ -421,8 +392,9 @@ sprites/blueprints/painter-double.png - sprites/blueprints/trash-storage.png + sprites/blueprints/storage.png sprites/buildings/painter-double.png + sprites/buildings/storage.png pivotPoint 0.5,0.5 @@ -437,6 +409,23 @@ scale9FromFile + sprites/buildings/belt_left.png + sprites/buildings/belt_right.png + sprites/buildings/belt_top.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 32,32,63,63 + scale9Paddings + 32,32,63,63 + scale9FromFile + + sprites/buildings/cutter.png sprites/buildings/mixer.png sprites/buildings/painter.png @@ -492,21 +481,6 @@ scale9FromFile - sprites/buildings/trash-storage.png - - pivotPoint - 0.5,0.5 - spriteScale - 1 - scale9Enabled - - scale9Borders - 144,144,288,288 - scale9Paddings - 144,144,288,288 - 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..7db9782c 100644 --- a/res_raw/sprites/belt/generate_wire_sprites.js +++ b/res_raw/sprites/belt/generate_wire_sprites.js @@ -1,226 +1,212 @@ -/** - * - * 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: "#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/cutter-quad.png b/res_raw/sprites/blueprints/cutter-quad.png index 5ae8989e..a2bcefdb 100644 Binary files a/res_raw/sprites/blueprints/cutter-quad.png and b/res_raw/sprites/blueprints/cutter-quad.png differ 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/constant_signal.png b/res_raw/sprites/buildings/constant_signal.png index ae9329e0..cba902bf 100644 Binary files a/res_raw/sprites/buildings/constant_signal.png and b/res_raw/sprites/buildings/constant_signal.png differ diff --git a/res_raw/sprites/buildings/cutter-quad.png b/res_raw/sprites/buildings/cutter-quad.png index e67628f2..00d70cdc 100644 Binary files a/res_raw/sprites/buildings/cutter-quad.png and b/res_raw/sprites/buildings/cutter-quad.png differ diff --git a/res_raw/sprites/buildings/painter-double.png b/res_raw/sprites/buildings/painter-double.png index 0d909786..9d2c472e 100644 Binary files a/res_raw/sprites/buildings/painter-double.png and b/res_raw/sprites/buildings/painter-double.png differ diff --git a/res_raw/sprites/buildings/painter-mirrored.png b/res_raw/sprites/buildings/painter-mirrored.png index da0e199d..2a3310d7 100644 Binary files a/res_raw/sprites/buildings/painter-mirrored.png and b/res_raw/sprites/buildings/painter-mirrored.png differ diff --git a/res_raw/sprites/buildings/painter-quad.png b/res_raw/sprites/buildings/painter-quad.png index d14bd382..698b753a 100644 Binary files a/res_raw/sprites/buildings/painter-quad.png and b/res_raw/sprites/buildings/painter-quad.png differ diff --git a/res_raw/sprites/buildings/painter.png b/res_raw/sprites/buildings/painter.png index 1ebca21f..3382d420 100644 Binary files a/res_raw/sprites/buildings/painter.png and b/res_raw/sprites/buildings/painter.png differ diff --git a/res_raw/sprites/buildings/storage.png b/res_raw/sprites/buildings/storage.png index 56fbcc38..1e30b766 100644 Binary files a/res_raw/sprites/buildings/storage.png and b/res_raw/sprites/buildings/storage.png differ 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..7c5008b6 Binary files /dev/null and b/res_raw/sprites/wires/sets/second_cross.png differ diff --git a/res_raw/sprites/wires/sets/second_forward.png b/res_raw/sprites/wires/sets/second_forward.png new file mode 100644 index 00000000..3656acd7 Binary files /dev/null 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..dd1a51a8 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..b2be4bb6 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_forward.png b/res_raw/sprites/wires/sets/shape_forward.png deleted file mode 100644 index 15ec3b9c..00000000 Binary files a/res_raw/sprites/wires/sets/shape_forward.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/src/css/resources.scss b/src/css/resources.scss index d5777d40..45c3dd13 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, portable_hub; + constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, storage, + transistor, analyzer, comparator, portable_hub; @each $building in $buildings { [data-icon="building_icons/#{$building}.png"] { @@ -8,10 +9,12 @@ $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, portable_hub; +$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, wire-second, painter, painter-mirrored, portable_hub; + @each $building in $buildingsAndVariants { [data-icon="building_tutorials/#{$building}.png"] { /* @load-async */ @@ -19,26 +22,43 @@ $buildingsAndVariants: belt, balancer, balancer-merger, balancer-splitter, under } } -// @TODO: New buildings (balancer, wires, etc) - -// Special cases for mirrored vairants -[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; } +// 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/core/config.js b/src/js/core/config.js index 14c39ab1..7c1fe81f 100644 --- a/src/js/core/config.js +++ b/src/js/core/config.js @@ -65,7 +65,7 @@ export const globalConfig = { buildingSpeeds: { cutter: 1 / 4, - cutterQuad: 1 / 3, + cutterQuad: 1 / 4, rotater: 1 / 1, rotaterCCW: 1 / 1, rotater180: 1 / 1, @@ -73,7 +73,7 @@ export const globalConfig = { painterDouble: 1 / 8, painterQuad: 1 / 2, mixer: 1 / 5, - stacker: 1 / 6, + stacker: 1 / 8, }, // Zooming diff --git a/src/js/core/config.local.js b/src/js/core/config.local.js index b75c5650..87aaaa14 100644 --- a/src/js/core/config.local.js +++ b/src/js/core/config.local.js @@ -26,9 +26,6 @@ export default { // Allow to zoom freely without limits // disableZoomLimits: true, // ----------------------------------------------------------------------------------- - // Shows a border arround every chunk - // showChunkBorders: true, - // ----------------------------------------------------------------------------------- // All rewards can be unlocked by passing just 1 of any shape // rewardsInstant: true, // ----------------------------------------------------------------------------------- @@ -110,5 +107,8 @@ export default { // Allows manual ticking // manualTickOnly: true, // ----------------------------------------------------------------------------------- + // Disables slow asserts, useful for debugging performance + // disableSlowAsserts: true, + // ----------------------------------------------------------------------------------- /* dev:end */ }; 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..983594cb 100644 --- a/src/js/game/buildings/constant_signal.js +++ b/src/js/game/buildings/constant_signal.js @@ -4,6 +4,10 @@ import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { ConstantSignalComponent } from "../components/constant_signal"; +import { generateMatrixRotations } from "../../core/utils"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +const overlayMatrix = generateMatrixRotations([0, 1, 0, 1, 1, 1, 1, 1, 1]); export class MetaConstantSignalBuilding extends MetaBuilding { constructor() { @@ -11,15 +15,14 @@ export class MetaConstantSignalBuilding extends MetaBuilding { } getSilhouetteColor() { - return "#2bafda"; + return "#2b84fd"; } /** * @param {GameRoot} root */ getIsUnlocked(root) { - // @todo - return true; + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_constant_signal); } /** @returns {"wires"} **/ @@ -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/filter.js b/src/js/game/buildings/filter.js index 698ac4db..b537fcb5 100644 --- a/src/js/game/buildings/filter.js +++ b/src/js/game/buildings/filter.js @@ -1,4 +1,6 @@ +import { formatItemsPerSecond } from "../../core/utils"; import { enumDirection, Vector } from "../../core/vector"; +import { T } from "../../translations"; import { FilterComponent } from "../components/filter"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemEjectorComponent } from "../components/item_ejector"; @@ -32,6 +34,16 @@ export class MetaFilterBuilding extends MetaBuilding { return true; } + /** + * @param {GameRoot} root + * @param {string} variant + * @returns {Array<[string, string]>} + */ + getAdditionalStatistics(root, variant) { + const beltSpeed = root.hubGoals.getBeltBaseSpeed(); + return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)]]; + } + /** * 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/trash.js b/src/js/game/buildings/trash.js index ca6018a7..43108b9e 100644 --- a/src/js/game/buildings/trash.js +++ b/src/js/game/buildings/trash.js @@ -1,3 +1,4 @@ +import { generateMatrixRotations } from "../../core/utils"; import { enumDirection, Vector } from "../../core/vector"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; @@ -6,6 +7,8 @@ import { MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; +const overlayMatrix = generateMatrixRotations([1, 1, 0, 1, 1, 1, 0, 1, 1]); + export class MetaTrashBuilding extends MetaBuilding { constructor() { super("trash"); @@ -16,13 +19,17 @@ export class MetaTrashBuilding extends MetaBuilding { } getSilhouetteColor() { - return "#cd7d86"; + return "#ed1d5d"; } getDimensions() { return new Vector(1, 1); } + getSpecialOverlayRenderMatrix(rotation) { + return overlayMatrix[rotation]; + } + /** * @param {GameRoot} root */ diff --git a/src/js/game/buildings/underground_belt.js b/src/js/game/buildings/underground_belt.js index 2239b703..fde018fe 100644 --- a/src/js/game/buildings/underground_belt.js +++ b/src/js/game/buildings/underground_belt.js @@ -25,7 +25,7 @@ export const enumUndergroundBeltVariantToTier = { [enumUndergroundBeltVariants.tier2]: 1, }; -const colorsByRotationVariant = ["#6d9dff", "#9cad40"]; +const colorsByRotationVariant = ["#6d9dff", "#71ff9c"]; const overlayMatrices = [ // Sender 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..ae5bab42 100644 --- a/src/js/game/buildings/wire.js +++ b/src/js/game/buildings/wire.js @@ -1,263 +1,270 @@ -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"; +import { enumHubGoalRewards } from "../tutorial_goals"; + +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", +}; + +const enumWireVariantToVariant = { + [defaultBuildingVariant]: enumWireVariant.first, + [wireVariants.second]: enumWireVariant.second, +}; + +export class MetaWireBuilding extends MetaBuilding { + constructor() { + super("wire"); + } + + getHasDirectionLockAvailable() { + return true; + } + + getSilhouetteColor() { + return "#61ef6f"; + } + + getAvailableVariants() { + return [defaultBuildingVariant, wireVariants.second]; + } + + 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) { + return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_filters_and_levers); + } + + /** + * 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..d0e354e2 100644 --- a/src/js/game/components/wire.js +++ b/src/js/game/components/wire.js @@ -2,12 +2,18 @@ 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", +}; + export class WireComponent extends Component { static getId() { return "Wire"; @@ -16,54 +22,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/base_toolbar.js b/src/js/game/hud/parts/base_toolbar.js index 8697eaf6..a0e2a49f 100644 --- a/src/js/game/hud/parts/base_toolbar.js +++ b/src/js/game/hud/parts/base_toolbar.js @@ -15,14 +15,19 @@ export class HUDBaseToolbar extends BaseHUDPart { * @param {Array=} param0.secondaryBuildings * @param {function} param0.visibilityCondition * @param {string} param0.htmlElementId + * @param {Layer=} param0.layer */ - constructor(root, { primaryBuildings, secondaryBuildings = [], visibilityCondition, htmlElementId }) { + constructor( + root, + { primaryBuildings, secondaryBuildings = [], visibilityCondition, htmlElementId, layer = "regular" } + ) { super(root); this.primaryBuildings = primaryBuildings; this.secondaryBuildings = secondaryBuildings; this.visibilityCondition = visibilityCondition; this.htmlElementId = htmlElementId; + this.layer = layer; /** @type {Object.", "" + binding.getKeyCodeString() + "" diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js index b3b292a5..d03c8f73 100644 --- a/src/js/game/hud/parts/buildings_toolbar.js +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -38,10 +38,10 @@ export class HUDBuildingsToolbar extends HUDBaseToolbar { ], secondaryBuildings: [ MetaStorageBuilding, + MetaReaderBuilding, MetaLeverBuilding, MetaFilterBuilding, MetaDisplayBuilding, - MetaReaderBuilding, ], visibilityCondition: () => !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "regular", diff --git a/src/js/game/hud/parts/wires_overlay.js b/src/js/game/hud/parts/wires_overlay.js index 8d1d213e..7d856d5f 100644 --- a/src/js/game/hud/parts/wires_overlay.js +++ b/src/js/game/hud/parts/wires_overlay.js @@ -6,6 +6,7 @@ import { THEME } from "../../theme"; import { BaseHUDPart } from "../base_hud_part"; import { Loader } from "../../../core/loader"; import { lerp } from "../../../core/utils"; +import { enumHubGoalRewards } from "../../tutorial_goals"; const wiresBackgroundDpi = 4; @@ -26,7 +27,9 @@ export class HUDWiresOverlay extends BaseHUDPart { */ switchLayers() { if (this.root.currentLayer === "regular") { - this.root.currentLayer = "wires"; + if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_filters_and_levers)) { + this.root.currentLayer = "wires"; + } } else { this.root.currentLayer = "regular"; } diff --git a/src/js/game/hud/parts/wires_toolbar.js b/src/js/game/hud/parts/wires_toolbar.js index 74075329..2e43386d 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,13 +16,17 @@ export class HUDWiresToolbar extends HUDBaseToolbar { MetaWireBuilding, MetaWireTunnelBuilding, MetaConstantSignalBuilding, - MetaLogicGateBuilding, MetaLeverBuilding, + MetaTransistorBuilding, + MetaLogicGateBuilding, + MetaAnalyzerBuilding, MetaVirtualProcessorBuilding, + MetaComparatorBuilding, ], visibilityCondition: () => !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "wires", htmlElementId: "ingame_HUD_wires_toolbar", + layer: "wires", }); } } diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index fbfd0ffb..65283b7f 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -26,7 +26,7 @@ export const KEYMAPPINGS = { exportScreenshot: { keyCode: 114 }, // F3PS toggleFPSInfo: { keyCode: 115 }, // F4 - switchLayers: { keyCode: key("Y") }, + switchLayers: { keyCode: key("E") }, }, navigation: { @@ -44,6 +44,7 @@ export const KEYMAPPINGS = { }, buildings: { + // Primary Toolbar belt: { keyCode: key("1") }, balancer: { keyCode: key("2") }, underground_belt: { keyCode: key("3") }, @@ -54,20 +55,28 @@ export const KEYMAPPINGS = { mixer: { keyCode: key("8") }, painter: { keyCode: key("9") }, trash: { keyCode: key("0") }, - storage: { keyCode: key("I") }, - lever: { keyCode: key("L") }, - filter: { keyCode: key("B") }, - display: { keyCode: key("N") }, - reader: { keyCode: key("J") }, + // Secondary toolbar + storage: { keyCode: key("Y") }, + reader: { keyCode: key("U") }, + lever: { keyCode: key("I") }, + filter: { keyCode: key("O") }, + display: { keyCode: key("P") }, + // Wires toolbar wire: { keyCode: key("1") }, wire_tunnel: { keyCode: key("2") }, constant_signal: { keyCode: key("3") }, - logic_gate: { keyCode: key("4") }, - virtual_processor: { keyCode: key("5") }, portable_hub: { keyCode: key("P") }, + + lever_wires: { keyCode: key("4") }, + logic_gate: { keyCode: key("5") }, + virtual_processor: { keyCode: key("6") }, + transistor: { keyCode: key("7") }, + analyzer: { keyCode: key("8") }, + comparator: { keyCode: key("9") }, + }, 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 0d69eaec..b6087019 100644 --- a/src/js/game/meta_building_registry.js +++ b/src/js/game/meta_building_registry.js @@ -1,31 +1,43 @@ 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 {MetaPortableHubBuilding} from "./buildings/portable_hub"; +import { MetaPortableHubBuilding } from "./buildings/portable_hub"; 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"); @@ -51,7 +63,12 @@ export function initMetaBuildingRegistry() { gMetaBuildingRegistry.register(MetaDisplayBuilding); gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding); gMetaBuildingRegistry.register(MetaReaderBuilding); + gMetaBuildingRegistry.register(MetaPortableHubBuilding); + + gMetaBuildingRegistry.register(MetaTransistorBuilding); + gMetaBuildingRegistry.register(MetaAnalyzerBuilding); + gMetaBuildingRegistry.register(MetaComparatorBuilding); // Belt registerBuildingVariant(1, MetaBeltBuilding, defaultBuildingVariant, 0); @@ -111,6 +128,11 @@ 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); + // Constant signal registerBuildingVariant(31, MetaConstantSignalBuilding); @@ -119,7 +141,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); @@ -129,20 +154,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/src/js/game/themes/dark.json b/src/js/game/themes/dark.json index 2f03b767..227d4532 100644 --- a/src/js/game/themes/dark.json +++ b/src/js/game/themes/dark.json @@ -17,8 +17,8 @@ "background": "rgba(74, 237, 134, 0.2)" }, "wires": { - "color": "rgb(209, 107, 203)", - "background": "rgba(209, 107, 203, 0.2)" + "color": "rgb(74, 237, 134)", + "background": "rgba(74, 237, 134, 0.2)" } }, diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json index 728135ab..47616d82 100644 --- a/src/js/game/themes/light.json +++ b/src/js/game/themes/light.json @@ -17,8 +17,8 @@ "background": "rgba(74, 237, 134, 0.2)" }, "wires": { - "color": "rgb(209, 107, 203)", - "background": "rgba(209, 107, 203, 0.2)" + "color": "rgb(74, 237, 134)", + "background": "rgba(74, 237, 134, 0.2)" } }, diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js index d83bd04d..3d1a36fd 100644 --- a/src/js/game/tutorial_goals.js +++ b/src/js/game/tutorial_goals.js @@ -30,7 +30,6 @@ export const enumHubGoalRewards = { reward_constant_signal: "reward_constant_signal", reward_logic_gates: "reward_logic_gates", reward_virtual_processing: "reward_virtual_processing", - reward_second_wire: "reward_second_wire", reward_blueprints: "reward_blueprints", reward_freeplay: "reward_freeplay", @@ -244,15 +243,7 @@ export const tutorialGoals = [ reward: enumHubGoalRewards.reward_virtual_processing, }, - // 26 Secondary type of wire - { - // @TODO - shape: "CuCuCuCu", - required: 50000, - reward: enumHubGoalRewards.reward_second_wire, - }, - - // 27 Freeplay + // 26 Freeplay { // @TODO shape: "CuCuCuCu", diff --git a/src/js/game/tutorial_goals_mappings.js b/src/js/game/tutorial_goals_mappings.js index 6cf5ce75..4542acf3 100644 --- a/src/js/game/tutorial_goals_mappings.js +++ b/src/js/game/tutorial_goals_mappings.js @@ -53,7 +53,6 @@ export const enumHubGoalRewardsToContentUnlocked = { [enumHubGoalRewards.reward_constant_signal]: typed([ [MetaConstantSignalBuilding, defaultBuildingVariant], ]), - [enumHubGoalRewards.reward_second_wire]: null, // @TODO! [enumHubGoalRewards.reward_logic_gates]: null, // @TODO! [enumHubGoalRewards.reward_virtual_processing]: null, // @TODO! diff --git a/translations/base-en.yaml b/translations/base-en.yaml index b5839997..84d381f3 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -331,7 +331,7 @@ ingame: infoTexts: speed: Speed range: Range - storage: Storage + storage: Capacity oneItemPerSecond: 1 item / second itemsPerSecond: items / s itemsPerSecondDouble: (x2) @@ -528,7 +528,7 @@ buildings: stacker: default: name: &stacker Stacker - description: Stacks both items. If they can not be merged, the right item is placed above the left item. + description: Combines both items side by side. If this is not possible, they are stacked on top of each other. mixer: default: @@ -538,11 +538,11 @@ buildings: painter: default: name: &painter Painter - description: &painter_desc Colors the whole shape on the left input with the color from the top input. + description: &painter_desc Paints the whole shape on the left input with the color from the top input. mirrored: name: *painter - description: *painter_desc + description: Paints the whole shape on the left input with the color from the bottom input. double: name: Painter (Double) @@ -550,7 +550,7 @@ buildings: quad: name: Painter (Quad) - description: Allows you to color each quadrant of the shape with a different color. + description: Allows you to color each quadrant of the shape individually. Only slots with a truthy signal on the wires layer will be painted! trash: default: @@ -565,49 +565,54 @@ buildings: wire: default: name: &wire Wire - description: &wire_desc Allows to connect logical components and can transfer items, colors or boolean signals. + description: &wire_desc Transfers signals, which can be items, colors or booleans (1 / 0). Different colored wires do not connect. + + second: + name: *wire + description: *wire_desc 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 - description: Emits a constant signal, which can be either a shape, color or boolean. + description: Emits a constant signal, which can be either a shape, color or boolean (1 / 0). lever: default: name: &lever Switch - description: Can be toggled to emit a boolean signal, which can then be used to control for example an item filter. + description: Can be toggled to emit a boolean signal (1 / 0) on the wires layer, which can then be used to control for example an item filter. logic_gate: default: - name: &logic_gate AND Gate - description: Emits a truthy boolean signal if both inputs are truthy. + name: AND Gate + 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 Transistor + 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: name: &filter Filter - description: Connect with a signal to route all matching items to the top and the remaining to the right. Can be controlled with boolean signals too. + description: Connect a signal to route all matching items to the top and the remaining to the right. Can be controlled with boolean signals too. display: default: @@ -619,14 +624,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 @@ -635,16 +646,7 @@ buildings: unstacker: 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. - - portable_hub: - default: - name: &portable_hub Portable hub - description: Like the hub but mini - + stacker: name: Virtual Stacker description: Virtually stacks the right shape onto the left. @@ -653,11 +655,20 @@ buildings: name: Virtual Painter description: Virtually paints the shape from the bottom input with the shape on the right input. + shapecompare: + name: Compare + description: Returns true if both items are exactly equal. Can compare shapes, items and booleans. + + portable_hub: + default: + name: &portable_hub Portable hub + description: Like the hub but mini + storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: title: Cutting Shapes - desc: You just unlocked the cutter - it cuts shapes in half from top to bottom regardless of its orientation!

Be sure to get rid of the waste, or otherwise it will stall - For this purpose I have given you the trash can, which destroys everything you put into it! + desc: You just unlocked the cutter - it cuts shapes in half from top to bottom regardless of its orientation!

Be sure to get rid of the waste, or otherwise it will stall - For this purpose I have given you the trash, which destroys everything you put into it! reward_rotater: title: Rotating @@ -670,7 +681,7 @@ storyRewards: reward_mixer: title: Color Mixing - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + desc: The mixer has been unlocked - It mixes two colors using additive blending! reward_stacker: title: Stacker @@ -682,7 +693,7 @@ storyRewards: reward_tunnel: title: Tunnel - desc: The tunnel has been unlocked - You can now tunnel items through belts and buildings with it! + desc: The tunnel has been unlocked - You can now tunnel items below belts and buildings with it! reward_rotater_ccw: title: CCW Rotating @@ -701,12 +712,12 @@ storyRewards: reward_merger: title: Compact Merger desc: >- - You have unlocked a merger variant of the balancer - It accepts two inputs and merges them into one belt! + You have unlocked a merger variant of the balancer - It accepts two inputs and merges them into one belt! reward_splitter: title: Compact Splitter desc: >- - You have unlocked a splitter variant of the balancer - It accepts one input and splits them into two! + You have unlocked a splitter variant of the balancer - It accepts one input and splits them into two! reward_belt_reader: title: Belt reader @@ -719,13 +730,13 @@ storyRewards: reward_painter_double: title: Double Painting - desc: You have unlocked a variant of the painter - It works as the regular painter but processes two shapes at once consuming just one color instead of two! + desc: You have unlocked a variant of the painter - It works similar to the regular painter but processes two shapes at once, consuming just one color instead of two! reward_painter_quad: title: Quad Painting desc: >- You have unlocked a variant of the painter - It allows you to paint each part of the shape individually!

- To use it, connect each slot which should be painted on the wires layer! + Connect each slot you'd like to paint with a truthy signal (shape, item or boolean "1") on the wires layer! reward_storage: title: Storage Buffer @@ -756,7 +767,8 @@ storyRewards: reward_constant_signal: title: Constant Signal desc: >- - You can now emit a constant signal on the wires layer! This is useful to connect it to item filters for example! + You unlocked the constant signal building on the wires layer! This is useful to connect it to item filters for example.

+ The constant signal can emit a shape, color or boolean (1 / 0). reward_logic_gates: title: Logic Gates @@ -774,12 +786,6 @@ storyRewards: - Build something cool with wires.

- Continue to play regulary. - reward_second_wire: - title: Second Wire Type - desc: >- - Annoyed by wires automatically connecting? I just gave you another type of wire!

- Different types of wires do not connect to each other, so you can now build much compacter circuits. - # Special reward, which is shown when there is no reward actually no_reward: title: Next level @@ -1038,14 +1044,18 @@ keybindings: storage: *storage wire: *wire constant_signal: *constant_signal - logic_gate: *logic_gate - lever: *lever + logic_gate: Logic Gate + lever: Switch (regular) + lever_wires: Switch (wires) filter: *filter wire_tunnel: *wire_tunnel display: *display reader: *reader portable_hub: *portable_hub virtual_processor: *virtual_processor + transistor: *transistor + analyzer: *analyzer + comparator: *comparator # --- pipette: Pipette @@ -1148,3 +1158,4 @@ tips: - This game has a lot of useful keybindings! Be sure to check out the settings page. - This game has a lot of settings, be sure to check them out! - The marker to your hub has a small compass to indicate its direction! + - To clear belts, cut the area and then paste it at the same location. diff --git a/translations/base-es.yaml b/translations/base-es.yaml index 765970d6..dbac38d2 100644 --- a/translations/base-es.yaml +++ b/translations/base-es.yaml @@ -240,7 +240,7 @@ dialogs: massCutConfirm: title: Confirmar corte desc: >- - ¡Estás cortando muchos edificios ( para ser exactos)! ¿Estas seguro de que quieres hacer esto? + ¡Estás cortando muchos edificios ( para ser exactos)! ¿Estas seguro de que quieres hacer esto? massCutInsufficientConfirm: title: Confirm cut @@ -264,7 +264,7 @@ dialogs: createMarker: title: Nuevo marcador titleEdit: Editar marcador - desc: Dale un nombre significativo, también puedes agregarle una clave de una forma (La cual puedes generar aquí) + desc: Dale un nombre significativo, también puedes agregarle la clave de una forma (La cual puedes generar aquí) markerDemoLimit: desc: Solo puedes crear dos marcadores en la versión de prueba. ¡Obtén el juego completo para marcadores ilimitados! @@ -294,7 +294,7 @@ ingame: cutSelection: Cortar copySelection: Copiar clearSelection: Limpiar selección - pipette: Pipette + pipette: Cuentagotas switchLayers: Cambiar capas # Names of the colors, used for the color blind mode @@ -536,7 +536,7 @@ buildings: trash: default: name: &trash Basurero - description: Acepta entradas desde todos los lados y los destruye. Para siempre. + description: Acepta formas desde todos los lados y las destruye. Para siempre. storage: name: Almacenamiento. @@ -648,7 +648,7 @@ settings: categories: general: General userInterface: User Interface - advanced: Advanced + advanced: Avanzado versionBadges: dev: Desarrollo @@ -829,7 +829,7 @@ keybindings: trash: *trash wire: *wire - pipette: Pipette + pipette: Cuentagotas rotateWhilePlacing: Rotar rotateInverseModifier: >- Modificador: Rotar inversamente