diff --git a/.gitignore b/.gitignore index 566478c8..3c599ecc 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,4 @@ tmp_standalone_files # Local config config.local.js +.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..84a7327f --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": ["esbenp.prettier-vscode"], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} diff --git a/README.md b/README.md index 0d8c70b5..97087812 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Your goal is to produce shapes by cutting, rotating, merging and painting parts - Make sure git `git lfs` extension is on your path - Run `git lfs pull` to download sound assets - Make sure `ffmpeg` is on your path -- Install Yarn and Node.js 10 +- Install Node.js and Yarn - Run `yarn` in the root folder, then run `yarn` in the `gulp/` folder - Cd into `gulp` and run `yarn gulp` - it should now open in your browser diff --git a/artwork/buildings/buildings_2x1.psd b/artwork/buildings/buildings_2x1.psd index e0ef0a8b..117507a9 100644 --- a/artwork/buildings/buildings_2x1.psd +++ b/artwork/buildings/buildings_2x1.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6463b33b2cae50d1ecb11f0a845f06633aff331a5c2c0998d9eb93e40ad576b1 -size 636254 +oid sha256:7d05e340acb18f7b6b6f05fa7536f14179cda54a9ead0923fbb8e39c68da148c +size 703229 diff --git a/artwork/itch.io/screenshots/11.png b/artwork/itch.io/screenshots/11.png new file mode 100644 index 00000000..d2de5570 Binary files /dev/null and b/artwork/itch.io/screenshots/11.png differ diff --git a/artwork/reddit/banner.png b/artwork/reddit/banner.png new file mode 100644 index 00000000..3982791f Binary files /dev/null and b/artwork/reddit/banner.png differ diff --git a/artwork/steam/announcement-cover.png b/artwork/steam/announcement-cover.png new file mode 100644 index 00000000..60af9100 Binary files /dev/null and b/artwork/steam/announcement-cover.png differ diff --git a/artwork/steam/announcement.png b/artwork/steam/announcement.png index a5d64005..1aacc62e 100644 Binary files a/artwork/steam/announcement.png and b/artwork/steam/announcement.png differ diff --git a/artwork/steam/announcement.psd b/artwork/steam/announcement.psd index c08e72cd..30dce1e6 100644 --- a/artwork/steam/announcement.psd +++ b/artwork/steam/announcement.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47b6aca7fe07f4628b041f32ce813a840793cfdce8ffa27c7ff4562858ac05f9 -size 194245 +oid sha256:ebde52e75e54d2f4add0cf498c85f059082a0745212a23c4de7328a7d78b00a5 +size 238170 diff --git a/artwork/steam/devlog.png b/artwork/steam/devlog.png new file mode 100644 index 00000000..8e5c29e6 Binary files /dev/null and b/artwork/steam/devlog.png differ diff --git a/artwork/steam/devlog.psd b/artwork/steam/devlog.psd new file mode 100644 index 00000000..0c06ba5d --- /dev/null +++ b/artwork/steam/devlog.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:746c6cf3f0284798a78c08f77d7e9d0c28b02323081fda42b5fa876a7ade29a0 +size 205925 diff --git a/artwork/twitch/box-image.jpg b/artwork/twitch/box-image.jpg new file mode 100644 index 00000000..90526447 Binary files /dev/null and b/artwork/twitch/box-image.jpg differ diff --git a/artwork/twitch/box-image.psd b/artwork/twitch/box-image.psd new file mode 100644 index 00000000..ea3443fe --- /dev/null +++ b/artwork/twitch/box-image.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0cd2d82917e470202d38d32277f7519ccfd1821cb21791266539ddf07486d1b +size 7314327 diff --git a/artwork/wires/prefab.png b/artwork/wires/prefab.png new file mode 100644 index 00000000..99df19b8 Binary files /dev/null and b/artwork/wires/prefab.png differ diff --git a/artwork/wires/prefab.psd b/artwork/wires/prefab.psd new file mode 100644 index 00000000..71c38097 --- /dev/null +++ b/artwork/wires/prefab.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:498dea7314b8720c40dcd8bdd64b1b4a7a35259b2ffe7e896fc3db22878d6414 +size 1954036 diff --git a/electron/favicon.icns b/electron/favicon.icns new file mode 100644 index 00000000..13d21f26 Binary files /dev/null and b/electron/favicon.icns differ diff --git a/gulp/cordova.js b/gulp/cordova.js index 408691cf..dc968df0 100644 --- a/gulp/cordova.js +++ b/gulp/cordova.js @@ -2,13 +2,15 @@ const path = require("path"); const fs = require("fs"); const buildUtils = require("./buildutils"); -export function gulptasksCordova($, gulp, buildFolder) { +function gulptasksCordova($, gulp, buildFolder) { const cdvRes = path.join("..", "..", "res"); // Cleans up the app assets // Removes all temporary folders used while optimizing the assets gulp.task("cleanupAppAssetsBuiltFolder", () => { - return gulp.src(path.join(cdvRes, "built"), { read: false }).pipe($.clean({ force: true })); + return gulp + .src(path.join(cdvRes, "built"), { read: false, allowEmpty: true }) + .pipe($.clean({ force: true })); }); // Optimizes all built assets @@ -64,7 +66,7 @@ export function gulptasksCordova($, gulp, buildFolder) { .pipe(gulp.dest(path.join(cdvRes, "built", "ios"))); }); - gulp.task("prepareIosRes", ["scaleIconIos", "copyOtherIosResources"]); + gulp.task("prepareIosRes", gulp.series("scaleIconIos", "copyOtherIosResources")); gulp.task("copyAndroidResources", () => { return gulp @@ -72,19 +74,20 @@ export function gulptasksCordova($, gulp, buildFolder) { .pipe(gulp.dest(path.join(cdvRes, "built", "android"))); }); - gulp.task("prepareAndroidRes", ["copyAndroidResources"]); + gulp.task("prepareAndroidRes", gulp.series("copyAndroidResources")); - gulp.task("prepareCordovaAssets", cb => { - return $.sequence( + gulp.task( + "prepareCordovaAssets", + gulp.series( "cleanupAppAssetsBuiltFolder", - ["prepareIosRes", "prepareAndroidRes"], + gulp.parallel("prepareIosRes", "prepareAndroidRes"), "optimizeBuiltAppAssets" - )(cb); - }); + ) + ); // Patches the config.xml by replacing the app id to app_beta - gulp.task("patchConfigXML", () => { + gulp.task("patchConfigXML", cb => { const configUrl = path.join("..", "..", "config.xml"); let configContent = fs.readFileSync(configUrl).toString(); const version = buildUtils.getVersion(); @@ -92,14 +95,16 @@ export function gulptasksCordova($, gulp, buildFolder) { configContent = configContent.replace(' id="io.shapez.app" ', ' id="io.shapez.app_beta" '); configContent = configContent.replace("Shapez.io", "Shapez.io BETA"); fs.writeFileSync(configUrl, configContent); + cb(); }); - gulp.task("patchConfigXMLChangeStagingToProd", () => { + gulp.task("patchConfigXMLChangeStagingToProd", cb => { const configUrl = path.join("..", "..", "config.xml"); let configContent = fs.readFileSync(configUrl).toString(); configContent = configContent.replace(' id="io.shapez.app_beta" ', ' id="io.shapez.app" '); configContent = configContent.replace("Shapez.io BETA", "Shapez.io"); fs.writeFileSync(configUrl, configContent); + cb(); }); // Triggers a new build on phonegap diff --git a/gulp/docs.js b/gulp/docs.js index 68e3f0ea..399e0fa1 100644 --- a/gulp/docs.js +++ b/gulp/docs.js @@ -13,7 +13,7 @@ function gulptasksDocs($, gulp, buildFolder) { .pipe(gulp.dest(path.join("..", "tsc_temp"))); }); - gulp.task("docs.copyTsconfigForHints", () => { + gulp.task("docs.copyTsconfigForHints", cb => { const src = fs.readFileSync(path.join("..", "src", "js", "tsconfig.json")).toString(); const baseConfig = JSON.parse($.stripJsonComments(src)); @@ -28,9 +28,10 @@ function gulptasksDocs($, gulp, buildFolder) { baseConfig.composite = true; baseConfig.outFile = "bundled-ts.js"; fs.writeFileSync(path.join("..", "tsc_temp", "tsconfig.json"), JSON.stringify(baseConfig)); + cb(); }); - gulp.task("main.prepareDocs", $.sequence("docs.convertJsToTs", "docs.copyTsconfigForHints")); + gulp.task("main.prepareDocs", gulp.series("docs.convertJsToTs", "docs.copyTsconfigForHints")); } module.exports = { diff --git a/gulp/ftp.js b/gulp/ftp.js index 4d328a6e..2d342ac4 100644 --- a/gulp/ftp.js +++ b/gulp/ftp.js @@ -28,7 +28,7 @@ function gulptasksFTP($, gulp, buildFolder) { }; // Write the "commit.txt" file - gulp.task("ftp.writeVersion", () => { + gulp.task("ftp.writeVersion", cb => { fs.writeFileSync( path.join(buildFolder, "version.json"), JSON.stringify( @@ -41,6 +41,7 @@ function gulptasksFTP($, gulp, buildFolder) { 4 ) ); + cb(); }); const gameSrcGlobs = [ @@ -78,14 +79,15 @@ function gulptasksFTP($, gulp, buildFolder) { .pipe($.sftp(deployCredentials)); }); - gulp.task(`ftp.upload.${deployEnv}`, cb => { - $.sequence( + gulp.task( + `ftp.upload.${deployEnv}`, + gulp.series( "ftp.writeVersion", `ftp.upload.${deployEnv}.game`, `ftp.upload.${deployEnv}.indexHtml`, `ftp.upload.${deployEnv}.additionalFiles` - )(cb); - }); + ) + ); } } diff --git a/gulp/gulpfile.js b/gulp/gulpfile.js index fca5d84c..f2fdd9d4 100644 --- a/gulp/gulpfile.js +++ b/gulp/gulpfile.js @@ -1,11 +1,5 @@ /* eslint-disable */ -const nodeVersion = process.versions.node.split(".")[0]; -if (nodeVersion !== "10") { - console.error("This cli requires exactly Node.js 10. You are using Node.js " + nodeVersion); - process.exit(1); -} - require("colors"); const gulp = require("gulp"); @@ -95,15 +89,15 @@ translations.gulptasksTranslations($, gulp, buildFolder); // Cleans up everything gulp.task("utils.cleanBuildFolder", () => { - return gulp.src(buildFolder, { read: false }).pipe($.clean({ force: true })); + return gulp.src(buildFolder, { read: false, allowEmpty: true }).pipe($.clean({ force: true })); }); gulp.task("utils.cleanBuildTempFolder", () => { return gulp - .src(path.join(__dirname, "..", "src", "js", "built-temp"), { read: false }) + .src(path.join(__dirname, "..", "src", "js", "built-temp"), { read: false, allowEmpty: true }) .pipe($.clean({ force: true })); }); -gulp.task("utils.cleanup", $.sequence("utils.cleanBuildFolder", "utils.cleanBuildTempFolder")); +gulp.task("utils.cleanup", gulp.series("utils.cleanBuildFolder", "utils.cleanBuildTempFolder")); // Requires no uncomitted files gulp.task("utils.requireCleanWorkingTree", cb => { @@ -166,71 +160,66 @@ function serve({ standalone }) { }); // Watch .scss files, those trigger a css rebuild - gulp.watch(["../src/**/*.scss"], ["css.dev"]); + gulp.watch(["../src/**/*.scss"], gulp.series("css.dev")); // Watch .html files, those trigger a html rebuild - gulp.watch("../src/**/*.html", [standalone ? "html.standalone-dev" : "html.dev"]); + gulp.watch("../src/**/*.html", gulp.series(standalone ? "html.standalone-dev" : "html.dev")); // Watch sound files - // gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], ["sounds.dev"]); + // gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], gulp.series("sounds.dev")); // Watch translations - gulp.watch("../translations/**/*.yaml", ["translations.convertToJson"]); + gulp.watch("../translations/**/*.yaml", gulp.series("translations.convertToJson")); gulp.watch( ["../res_raw/sounds/sfx/*.mp3", "../res_raw/sounds/sfx/*.wav"], - $.sequence("sounds.sfx", "sounds.copy") + gulp.series("sounds.sfx", "sounds.copy") ); gulp.watch( ["../res_raw/sounds/music/*.mp3", "../res_raw/sounds/music/*.wav"], - $.sequence("sounds.music", "sounds.copy") + gulp.series("sounds.music", "sounds.copy") ); // Watch resource files and copy them on change - gulp.watch(imgres.nonImageResourcesGlobs, ["imgres.copyNonImageResources"]); - gulp.watch(imgres.imageResourcesGlobs, ["imgres.copyImageResources"]); + gulp.watch(imgres.nonImageResourcesGlobs, gulp.series("imgres.copyNonImageResources")); + gulp.watch(imgres.imageResourcesGlobs, gulp.series("imgres.copyImageResources")); // Watch .atlas files and recompile the atlas on change - gulp.watch("../res_built/atlas/*.json", ["imgres.atlas"]); + gulp.watch("../res_built/atlas/*.json", gulp.series("imgres.atlas")); // Watch the build folder and reload when anything changed const extensions = ["html", "js", "png", "gif", "jpg", "svg", "mp3", "ico", "woff2", "json"]; - gulp.watch(extensions.map(ext => path.join(buildFolder, "**", "*." + ext))).on("change", function (e) { - return gulp.src(e.path).pipe(browserSync.reload({ stream: true })); + gulp.watch(extensions.map(ext => path.join(buildFolder, "**", "*." + ext))).on("change", function (path) { + return gulp.src(path).pipe(browserSync.reload({ stream: true })); }); - gulp.watch("../src/js/built-temp/*.json").on("change", function (e) { - return gulp.src(e.path).pipe(browserSync.reload({ stream: true })); + gulp.watch("../src/js/built-temp/*.json").on("change", function (path) { + return gulp.src(path).pipe(browserSync.reload({ stream: true })); }); // Start the webpack watching server (Will never return) if (standalone) { - $.sequence("js.standalone-dev.watch")(() => true); + gulp.series("js.standalone-dev.watch")(() => true); } else { - $.sequence("js.dev.watch")(() => true); + gulp.series("js.dev.watch")(() => true); } } -// Live-development -gulp.task("main.serveDev", ["build.dev"], () => serve({ standalone: false })); -gulp.task("main.serveStandalone", ["build.standalone.dev"], () => serve({ standalone: true })); - -gulp.task("default", ["main.serveDev"]); - ///////////////////// RUNNABLE TASKS ///////////////////// // Pre and postbuild -gulp.task("step.baseResources", cb => $.sequence("imgres.allOptimized")(cb)); +gulp.task("step.baseResources", gulp.series("imgres.allOptimized")); gulp.task("step.deleteEmpty", cb => { deleteEmpty.sync(buildFolder); cb(); }); -gulp.task("step.postbuild", $.sequence("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty")); +gulp.task("step.postbuild", gulp.series("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty")); // Builds everything (dev) -gulp.task("build.dev", cb => { - $.sequence( +gulp.task( + "build.dev", + gulp.series( "utils.cleanup", "utils.copyAdditionalBuildFiles", "imgres.atlas", @@ -240,12 +229,13 @@ gulp.task("build.dev", cb => { "translations.fullBuild", "css.dev", "html.dev" - )(cb); -}); + ) +); // Builds everything (standalone -dev) -gulp.task("build.standalone.dev", cb => { - $.sequence( +gulp.task( + "build.standalone.dev", + gulp.series( "utils.cleanup", "imgres.atlas", "sounds.dev", @@ -255,58 +245,74 @@ gulp.task("build.standalone.dev", cb => { "js.standalone-dev", "css.dev", "html.standalone-dev" - )(cb); -}); + ) +); // Builds everything (staging) -gulp.task("step.staging.code", $.sequence("sounds.fullbuild", "translations.fullBuild", "js.staging")); -gulp.task("step.staging.mainbuild", cb => - $.multiProcess(["utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code"], cb, false) +gulp.task("step.staging.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.staging")); +gulp.task( + "step.staging.mainbuild", + gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code") ); -gulp.task("step.staging.all", $.sequence("step.staging.mainbuild", "css.prod", "html.staging")); -gulp.task("build.staging", $.sequence("utils.cleanup", "step.staging.all", "step.postbuild")); +gulp.task("step.staging.all", gulp.series("step.staging.mainbuild", "css.prod", "html.staging")); +gulp.task("build.staging", gulp.series("utils.cleanup", "step.staging.all", "step.postbuild")); // Builds everything (prod) -gulp.task("step.prod.code", $.sequence("sounds.fullbuild", "translations.fullBuild", "js.prod")); -gulp.task("step.prod.mainbuild", cb => - $.multiProcess(["utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code"], cb, false) +gulp.task("step.prod.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.prod")); +gulp.task( + "step.prod.mainbuild", + gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code") ); -gulp.task("step.prod.all", $.sequence("step.prod.mainbuild", "css.prod", "html.prod")); -gulp.task("build.prod", $.sequence("utils.cleanup", "step.prod.all", "step.postbuild")); +gulp.task("step.prod.all", gulp.series("step.prod.mainbuild", "css.prod", "html.prod")); +gulp.task("build.prod", gulp.series("utils.cleanup", "step.prod.all", "step.postbuild")); // Builds everything (standalone-beta) gulp.task( "step.standalone-beta.code", - $.sequence("sounds.fullbuild", "translations.fullBuild", "js.standalone-beta") -); -gulp.task("step.standalone-beta.mainbuild", cb => - $.multiProcess(["step.baseResources", "step.standalone-beta.code"], cb, false) + gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-beta") ); +gulp.task("step.standalone-beta.mainbuild", gulp.parallel("step.baseResources", "step.standalone-beta.code")); gulp.task( "step.standalone-beta.all", - $.sequence("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta") + gulp.series("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta") +); +gulp.task( + "build.standalone-beta", + gulp.series("utils.cleanup", "step.standalone-beta.all", "step.postbuild") ); -gulp.task("build.standalone-beta", $.sequence("utils.cleanup", "step.standalone-beta.all", "step.postbuild")); // Builds everything (standalone-prod) gulp.task( "step.standalone-prod.code", - $.sequence("sounds.fullbuild", "translations.fullBuild", "js.standalone-prod") -); -gulp.task("step.standalone-prod.mainbuild", cb => - $.multiProcess(["step.baseResources", "step.standalone-prod.code"], cb, false) + gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-prod") ); +gulp.task("step.standalone-prod.mainbuild", gulp.parallel("step.baseResources", "step.standalone-prod.code")); gulp.task( "step.standalone-prod.all", - $.sequence("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod") + gulp.series("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod") +); +gulp.task( + "build.standalone-prod", + gulp.series("utils.cleanup", "step.standalone-prod.all", "step.postbuild") ); -gulp.task("build.standalone-prod", $.sequence("utils.cleanup", "step.standalone-prod.all", "step.postbuild")); // Deploying! gulp.task( "main.deploy.staging", - $.sequence("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging") + gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging") ); -gulp.task("main.deploy.prod", $.sequence("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod")); -gulp.task("main.deploy.all", $.sequence("main.deploy.staging", "main.deploy.prod")); -gulp.task("main.standalone", $.sequence("build.standalone-prod", "standalone.package.prod")); +gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod")); +gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod")); +gulp.task("main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod")); + +// Live-development +gulp.task( + "main.serveDev", + gulp.series("build.dev", () => serve({ standalone: false })) +); +gulp.task( + "main.serveStandalone", + gulp.series("build.standalone.dev", () => serve({ standalone: true })) +); + +gulp.task("default", gulp.series("main.serveDev")); diff --git a/gulp/image-resources.js b/gulp/image-resources.js index 90268517..2d0d5fb1 100644 --- a/gulp/image-resources.js +++ b/gulp/image-resources.js @@ -10,7 +10,7 @@ const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*. function gulptasksImageResources($, gulp, buildFolder) { // Lossless options const minifyImagesOptsLossless = () => [ - $.imagemin.jpegtran({ + $.imageminJpegtran({ progressive: true, }), $.imagemin.svgo({}), @@ -25,7 +25,7 @@ function gulptasksImageResources($, gulp, buildFolder) { // Lossy options const minifyImagesOpts = () => [ - $.imageminMozjpeg({ + $.imagemin.mozjpeg({ quality: 80, maxMemory: 1024 * 1024 * 8, }), @@ -116,11 +116,12 @@ function gulptasksImageResources($, gulp, buildFolder) { }); // Copies all resources and optimizes them - gulp.task("imgres.allOptimized", cb => - $.multiProcess( - ["imgres.atlasOptimized", "imgres.copyNonImageResources", "imgres.copyImageResourcesOptimized"], - cb, - false + gulp.task( + "imgres.allOptimized", + gulp.parallel( + "imgres.atlasOptimized", + "imgres.copyNonImageResources", + "imgres.copyImageResourcesOptimized" ) ); diff --git a/gulp/js.js b/gulp/js.js index 0425e469..6faccfca 100644 --- a/gulp/js.js +++ b/gulp/js.js @@ -68,7 +68,7 @@ function gulptasksJS($, gulp, buildFolder, browserSync) { ) .pipe(gulp.dest(buildFolder)); }); - gulp.task("js.staging", cb => $.multiProcess(["js.staging.transpiled", "js.staging.latest"], cb, false)); + gulp.task("js.staging", gulp.parallel("js.staging.transpiled", "js.staging.latest")); //// PROD gulp.task("js.prod.transpiled", () => { @@ -104,7 +104,7 @@ function gulptasksJS($, gulp, buildFolder, browserSync) { .pipe(browserSync.stream()); }); - gulp.task("js.prod", cb => $.multiProcess(["js.prod.transpiled", "js.prod.latest"], cb, false)); + gulp.task("js.prod", gulp.parallel("js.prod.transpiled", "js.prod.latest")); //// STANDALONE diff --git a/gulp/package.json b/gulp/package.json index f2d542a8..653db52d 100644 --- a/gulp/package.json +++ b/gulp/package.json @@ -70,40 +70,38 @@ "css-mqpacker": "^7.0.0", "cssnano": "^4.1.10", "electron-packager": "^14.0.6", - "imagemin-gifsicle": "^7.0.0", "faster.js": "^1.1.0", "glob": "^7.1.3", - "gulp": "^3.9.1", + "gulp": "^4.0.2", "gulp-cache": "^1.1.3", "gulp-cached": "^1.1.1", "gulp-clean": "^0.4.0", - "gulp-cssbeautify": "^1.0.1", + "gulp-cssbeautify": "^2.0.1", "gulp-csslint": "^1.0.1", "gulp-dom": "^1.0.0", "gulp-flatten": "^0.4.0", - "gulp-fluent-ffmpeg": "^1.0.2", + "gulp-fluent-ffmpeg": "^2.0.0", "gulp-html-beautify": "^1.0.1", "gulp-htmlmin": "^5.0.1", - "gulp-if": "^2.0.2", - "gulp-imagemin": "^5.0.3", + "gulp-if": "^3.0.0", + "gulp-imagemin": "^7.1.0", "gulp-javascript-obfuscator": "^1.1.5", "gulp-jsbeautifier": "^3.0.0", - "gulp-load-plugins": "^1.5.0", - "gulp-multi-process": "^1.3.1", + "gulp-load-plugins": "^2.0.3", "gulp-phonegap-build": "^0.1.5", "gulp-plumber": "^1.2.1", - "gulp-pngquant": "^1.0.12", + "gulp-pngquant": "^1.0.13", "gulp-postcss": "^8.0.0", - "gulp-rename": "^1.4.0", - "gulp-sass": "^4.0.1", + "gulp-rename": "^2.0.0", + "gulp-sass": "^4.1.0", "gulp-sass-lint": "^1.4.0", - "gulp-sequence": "^1.0.0", - "gulp-sftp": "^0.1.5", + "gulp-sftp": "git+https://git@github.com/webksde/gulp-sftp", "gulp-terser": "^1.2.0", "gulp-webserver": "^0.9.1", "gulp-yaml": "^2.0.4", - "imagemin-mozjpeg": "^8.0.0", - "imagemin-pngquant": "^8.0.0", + "imagemin-gifsicle": "^7.0.0", + "imagemin-jpegtran": "^7.0.0", + "imagemin-pngquant": "^9.0.0", "jimp": "^0.6.1", "js-yaml": "^3.13.1", "onesky-fetch": "^0.0.7", diff --git a/gulp/sounds.js b/gulp/sounds.js index 042cb5a6..c38e7a6e 100644 --- a/gulp/sounds.js +++ b/gulp/sounds.js @@ -3,11 +3,11 @@ const audiosprite = require("gulp-audiosprite"); function gulptasksSounds($, gulp, buildFolder) { // Gather some basic infos - const soundsDir = path.join("..", "res_raw", "sounds"); - const builtSoundsDir = path.join("..", "res_built", "sounds"); + const soundsDir = path.join(__dirname, "..", "res_raw", "sounds"); + const builtSoundsDir = path.join(__dirname, "..", "res_built", "sounds"); gulp.task("sounds.clear", () => { - return gulp.src(builtSoundsDir).pipe($.clean({ force: true })); + return gulp.src(builtSoundsDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true })); }); const filters = ["volume=0.2"]; @@ -29,7 +29,7 @@ function gulptasksSounds($, gulp, buildFolder) { .audioChannels(1) .audioFrequency(22050) .audioCodec("libmp3lame") - .audioFilters(["volume=0.3"]); + .audioFilters(["volume=0.15"]); }), { name: "music", @@ -40,6 +40,30 @@ function gulptasksSounds($, gulp, buildFolder) { .pipe(gulp.dest(path.join(builtSoundsDir, "music"))); }); + // Encodes the game music in high quality for the standalone + gulp.task("sounds.musicHQ", () => { + return gulp + .src([path.join(soundsDir, "music", "**", "*.wav"), path.join(soundsDir, "music", "**", "*.mp3")]) + .pipe($.plumber()) + .pipe( + $.cache( + $.fluentFfmpeg("mp3", function (cmd) { + return cmd + .audioBitrate(256) + .audioChannels(2) + .audioFrequency(44100) + .audioCodec("libmp3lame") + .audioFilters(["volume=0.15"]); + }), + { + name: "music-high-quality", + fileCache, + } + ) + ) + .pipe(gulp.dest(path.join(builtSoundsDir, "music"))); + }); + // Encodes the ui sounds gulp.task("sounds.sfxGenerateSprites", () => { return gulp @@ -79,7 +103,7 @@ function gulptasksSounds($, gulp, buildFolder) { gulp.task( "sounds.sfx", - $.sequence("sounds.sfxGenerateSprites", "sounds.sfxOptimize", "sounds.sfxCopyAtlas") + gulp.series("sounds.sfxGenerateSprites", "sounds.sfxOptimize", "sounds.sfxCopyAtlas") ); gulp.task("sounds.copy", () => { @@ -90,10 +114,12 @@ function gulptasksSounds($, gulp, buildFolder) { .pipe(gulp.dest(path.join(buildFolder, "res", "sounds"))); }); - gulp.task("sounds.buildall", cb => $.multiProcess(["sounds.music", "sounds.sfx"], cb, true)); + gulp.task("sounds.buildall", gulp.parallel("sounds.music", "sounds.sfx")); + gulp.task("sounds.buildallHQ", gulp.parallel("sounds.musicHQ", "sounds.sfx")); - gulp.task("sounds.fullbuild", cb => $.sequence("sounds.clear", "sounds.buildall", "sounds.copy")(cb)); - gulp.task("sounds.dev", cb => $.sequence("sounds.buildall", "sounds.copy")(cb)); + gulp.task("sounds.fullbuild", gulp.series("sounds.clear", "sounds.buildall", "sounds.copy")); + gulp.task("sounds.fullbuildHQ", gulp.series("sounds.clear", "sounds.buildallHQ", "sounds.copy")); + gulp.task("sounds.dev", gulp.series("sounds.buildall", "sounds.copy")); } module.exports = { diff --git a/gulp/standalone.js b/gulp/standalone.js index 6c5995bd..f5126780 100644 --- a/gulp/standalone.js +++ b/gulp/standalone.js @@ -6,13 +6,13 @@ const fse = require("fs-extra"); const execSync = require("child_process").execSync; function gulptasksStandalone($, gulp, buildFolder) { - const electronBaseDir = path.join("../electron"); + const electronBaseDir = path.join(__dirname, "..", "electron"); - const tempDestDir = path.join("..", "tmp_standalone_files"); + const tempDestDir = path.join(__dirname, "..", "tmp_standalone_files"); const tempDestBuildDir = path.join(tempDestDir, "built"); gulp.task("standalone.prepare.cleanup", () => { - return gulp.src(tempDestDir, { read: false }).pipe($.clean({ force: true })); + return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true })); }); gulp.task("standalone.prepare.copyPrefab", () => { @@ -30,7 +30,7 @@ function gulptasksStandalone($, gulp, buildFolder) { return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir)); }); - gulp.task("standalone.prepare.writePackageJson", () => { + gulp.task("standalone.prepare.writePackageJson", cb => { fs.writeFileSync( path.join(tempDestBuildDir, "package.json"), JSON.stringify( @@ -43,67 +43,71 @@ function gulptasksStandalone($, gulp, buildFolder) { 4 ) ); + cb(); }); gulp.task("standalone.prepare.minifyCode", () => { - return gulp - .src(path.join(electronBaseDir, "*.js")) - .pipe( - $.terser({ - ecma: 6, - parse: {}, - module: false, - toplevel: true, - keep_classnames: false, - keep_fnames: false, - safari10: false, - compress: { - arguments: false, // breaks - drop_console: false, - // keep_fargs: false, - keep_infinity: true, - passes: 2, - module: false, - toplevel: true, - unsafe_math: true, - unsafe_arrows: false, - warnings: true, - }, - mangle: { - eval: true, - keep_classnames: false, - keep_fnames: false, - module: false, - toplevel: true, - safari10: false, - }, - output: { - comments: false, - ascii_only: true, - beautify: false, - braces: false, - ecma: 6, - }, - }) - ) - .pipe(gulp.dest(tempDestBuildDir)); + return ( + gulp + .src(path.join(electronBaseDir, "*.js")) + // .pipe( + // $.terser({ + // ecma: 6, + // parse: {}, + // module: false, + // toplevel: true, + // keep_classnames: false, + // keep_fnames: false, + // safari10: false, + // compress: { + // arguments: false, // breaks + // drop_console: false, + // // keep_fargs: false, + // keep_infinity: true, + // passes: 2, + // module: false, + // toplevel: true, + // unsafe_math: true, + // unsafe_arrows: false, + // warnings: true, + // }, + // mangle: { + // eval: true, + // keep_classnames: false, + // keep_fnames: false, + // module: false, + // toplevel: true, + // safari10: false, + // }, + // output: { + // comments: false, + // ascii_only: true, + // beautify: false, + // braces: false, + // ecma: 6, + // }, + // }) + // ) + .pipe(gulp.dest(tempDestBuildDir)) + ); }); gulp.task("standalone.prepare.copyGamefiles", () => { return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir)); }); - gulp.task("standalone.killRunningInstances", () => { + gulp.task("standalone.killRunningInstances", cb => { try { execSync("taskkill /F /IM shapezio.exe"); } catch (ex) { console.warn("Failed to kill running instances, maybe none are up."); } + cb(); }); gulp.task( "standalone.prepare", - $.sequence( + gulp.series( "standalone.killRunningInstances", "standalone.prepare.cleanup", "standalone.prepare.copyPrefab", @@ -190,13 +194,16 @@ function gulptasksStandalone($, gulp, buildFolder) { gulp.task( "standalone.package.prod", - $.sequence("standalone.prepare", [ - "standalone.package.prod.win64", - "standalone.package.prod.linux64", - "standalone.package.prod.darwin64", - // "standalone.package.prod.win32", - // "standalone.package.prod.linux32", - ]) + gulp.series( + "standalone.prepare", + gulp.parallel( + "standalone.package.prod.win64", + "standalone.package.prod.linux64", + "standalone.package.prod.darwin64" + // "standalone.package.prod.win32", + // "standalone.package.prod.linux32", + ) + ) ); } diff --git a/gulp/translations.js b/gulp/translations.js index 98f0ce95..50404390 100644 --- a/gulp/translations.js +++ b/gulp/translations.js @@ -14,7 +14,7 @@ function gulptasksTranslations($, gulp, buildFolder) { .pipe(gulp.dest(translationsJsonDir)); }); - gulp.task("translations.fullBuild", $.sequence("translations.convertToJson")); + gulp.task("translations.fullBuild", gulp.series("translations.convertToJson")); } module.exports = { diff --git a/gulp/yarn.lock b/gulp/yarn.lock index 8e92a91f..755d1648 100644 --- a/gulp/yarn.lock +++ b/gulp/yarn.lock @@ -1075,18 +1075,26 @@ dependencies: core-js "^2.5.7" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -1105,6 +1113,11 @@ dependencies: defer-to-connect "^1.0.1" +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + "@types/cordova@^0.0.34": version "0.0.34" resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04" @@ -1122,6 +1135,24 @@ resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" integrity sha1-wFTor02d11205jq8dviFFocU1LM= +"@types/glob@^7.1.1": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987" + integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.0.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" + integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== + "@types/node@^12.7.5": version "12.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" @@ -1491,6 +1522,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -1509,6 +1548,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1519,13 +1565,6 @@ arch@^2.1.0: resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== -archive-type@^3.0.0, archive-type@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" - integrity sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y= - dependencies: - file-type "^3.1.0" - archive-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" @@ -1575,23 +1614,30 @@ arr-diff@^1.0.1: arr-flatten "^1.0.1" array-slice "^0.2.3" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + arr-union@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" @@ -1607,7 +1653,7 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= -array-each@^1.0.1: +array-each@^1.0.0, array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= @@ -1627,6 +1673,21 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -1637,6 +1698,15 @@ array-slice@^1.0.0: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1644,7 +1714,12 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2: +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1, array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= @@ -1654,11 +1729,6 @@ array-uniq@^2.1.0: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1669,7 +1739,7 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -1696,12 +1766,7 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -asn1@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.1.tgz#ecc73f75d31ea3c6ed9d47428db35fecc7b2c6dc" - integrity sha1-7Mc/ddMeo8btnUdCjbNf7Meyxtw= - -asn1@~0.2.3: +asn1@~0.2.0, asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== @@ -1753,16 +1818,21 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" + integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^2.0.0" + stream-exhaust "^1.0.1" + async-each-series@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= -async-each-series@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" - integrity sha1-9C/YFV048hpbjqB8KOBj7RcAsTg= - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1778,54 +1848,12 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async.queue@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.queue/-/async.queue-0.5.2.tgz#8d5d90812e1481066bc0904e8cc1712b17c3bd7c" - integrity sha1-jV2QgS4UgQZrwJBOjMFxKxfDvXw= +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= dependencies: - async.util.queue "0.5.2" - -async.util.arrayeach@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz#58c4e98028d55d69bfb05aeb3af44e0a555a829c" - integrity sha1-WMTpgCjVXWm/sFrrOvROClVagpw= - -async.util.isarray@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.isarray/-/async.util.isarray-0.5.2.tgz#e62dac8f2636f65875dcf7521c2d24d0dfb2bbdf" - integrity sha1-5i2sjyY29lh13PdSHC0k0N+yu98= - -async.util.map@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.map/-/async.util.map-0.5.2.tgz#e588ef86e0b3ab5f027d97af4d6835d055ca69d6" - integrity sha1-5YjvhuCzq18CfZevTWg10FXKadY= - -async.util.noop@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.noop/-/async.util.noop-0.5.2.tgz#bdd62b97cb0aa3f60b586ad148468698975e58b9" - integrity sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk= - -async.util.onlyonce@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz#b8e6fc004adc923164d79e32f2813ee465c24ff2" - integrity sha1-uOb8AErckjFk154y8oE+5GXCT/I= - -async.util.queue@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.queue/-/async.util.queue-0.5.2.tgz#57f65abe1a3cdf273d31abd28ab95425f8222ee5" - integrity sha1-V/Zavho83yc9MavSirlUJfgiLuU= - dependencies: - async.util.arrayeach "0.5.2" - async.util.isarray "0.5.2" - async.util.map "0.5.2" - async.util.noop "0.5.2" - async.util.onlyonce "0.5.2" - async.util.setimmediate "0.5.2" - -async.util.setimmediate@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz#2812ebabf2a58027758d4bc7793d1ccfaf10255f" - integrity sha1-KBLrq/KlgCd1jUvHeT0cz68QJV8= + async-done "^1.2.2" async@1.5.2: version "1.5.2" @@ -1982,6 +2010,21 @@ babel-runtime@^7.0.0-beta.3: core-js "^2.4.0" regenerator-runtime "^0.11.0" +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -2064,19 +2107,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bin-build@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" - integrity sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw= - dependencies: - archive-type "^3.0.1" - decompress "^3.0.0" - download "^4.1.2" - exec-series "^1.0.0" - rimraf "^2.2.6" - tempfile "^1.0.0" - url-regex "^3.0.0" - bin-build@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" @@ -2088,13 +2118,6 @@ bin-build@^3.0.0: p-map-series "^1.0.0" tempfile "^2.0.0" -bin-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" - integrity sha1-hvjm9CU4k99g3DFpV/WvAqywWTA= - dependencies: - executable "^1.0.0" - bin-check@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" @@ -2103,16 +2126,6 @@ bin-check@^4.1.0: execa "^0.7.0" executable "^4.1.0" -bin-version-check@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" - integrity sha1-5OXfKQuQaffRETJAMe/BP90RpbA= - dependencies: - bin-version "^1.0.0" - minimist "^1.1.0" - semver "^4.0.3" - semver-truncate "^1.0.0" - bin-version-check@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" @@ -2122,13 +2135,6 @@ bin-version-check@^4.0.0: semver "^5.6.0" semver-truncate "^1.1.2" -bin-version@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" - integrity sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144= - dependencies: - find-versions "^1.0.0" - bin-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" @@ -2137,18 +2143,6 @@ bin-version@^3.0.0: execa "^1.0.0" find-versions "^3.0.0" -bin-wrapper@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" - integrity sha1-Z9MwYmLksaXy+I7iNGT2plVneus= - dependencies: - bin-check "^2.0.0" - bin-version-check "^2.1.0" - download "^4.0.0" - each-async "^1.1.1" - lazy-req "^1.0.0" - os-filter-obj "^1.0.0" - bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" @@ -2258,15 +2252,6 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2283,6 +2268,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2452,6 +2444,11 @@ buffer-equal@0.0.1: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -2462,16 +2459,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer-to-vinyl@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" - integrity sha1-APFfruOreh3aLN5tkSG//dB7ImI= - dependencies: - file-type "^3.1.0" - readable-stream "^2.0.2" - uuid "^2.0.1" - vinyl "^1.0.0" - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -2630,11 +2617,6 @@ calipers@^2.0.0: dependencies: bluebird "3.x.x" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2722,26 +2704,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -caw@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" - integrity sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ= - dependencies: - get-proxy "^1.0.1" - is-obj "^1.0.0" - object-assign "^3.0.0" - tunnel-agent "^0.4.0" - caw@^2.0.0, caw@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" @@ -2801,6 +2768,14 @@ chalk@^0.5.0: strip-ansi "^0.3.0" supports-color "^0.2.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chance@1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.13.tgz#666bec2db42b3084456a3e4f4c28a82db5ccb7e6" @@ -2831,7 +2806,7 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -chokidar@^2.0.2, chokidar@^2.0.4: +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3012,11 +2987,6 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -co@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" - integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g= - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3036,6 +3006,15 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3051,12 +3030,19 @@ color-convert@^1.9.0, color-convert@^1.9.1: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -3177,7 +3163,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.4.8, concat-stream@^1.5.0: +concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3187,6 +3173,16 @@ concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.4.8, concat-stream@ readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + config-chain@^1.1.11, config-chain@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" @@ -3259,14 +3255,7 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -3305,6 +3294,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + core-js-compat@^3.1.1: version "3.2.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" @@ -3354,13 +3351,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -3726,7 +3716,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@^1.0.11, dateformat@^1.0.7-1.2.3: +dateformat@^1.0.7-1.2.3: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= @@ -3789,18 +3779,6 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -decompress-tar@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" - integrity sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY= - dependencies: - is-tar "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" @@ -3810,19 +3788,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: is-stream "^1.1.0" tar-stream "^1.5.2" -decompress-tarbz2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" - integrity sha1-iyOTVoE1X58YnYclag+L3ZbZZm0= - dependencies: - is-bzip2 "^1.0.0" - object-assign "^2.0.0" - seek-bzip "^1.0.3" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - decompress-tarbz2@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" @@ -3834,18 +3799,6 @@ decompress-tarbz2@^4.0.0: seek-bzip "^1.0.5" unbzip2-stream "^1.0.9" -decompress-targz@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" - integrity sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA= - dependencies: - is-gzip "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - decompress-targz@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" @@ -3855,19 +3808,6 @@ decompress-targz@^4.0.0: file-type "^5.2.0" is-stream "^1.1.0" -decompress-unzip@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" - integrity sha1-YUdbQVIGa74/7hL51inRX+ZHjus= - dependencies: - is-zip "^1.0.0" - read-all-stream "^3.0.0" - stat-mode "^0.2.0" - strip-dirs "^1.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - yauzl "^2.2.1" - decompress-unzip@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" @@ -3878,21 +3818,6 @@ decompress-unzip@^4.0.1: pify "^2.3.0" yauzl "^2.4.2" -decompress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" - integrity sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0= - dependencies: - buffer-to-vinyl "^1.0.0" - concat-stream "^1.4.6" - decompress-tar "^3.0.0" - decompress-tarbz2 "^3.0.0" - decompress-targz "^3.0.0" - decompress-unzip "^3.0.0" - stream-combiner2 "^1.1.1" - vinyl-assign "^1.0.1" - vinyl-fs "^2.2.0" - decompress@^4.0.0, decompress@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" @@ -3925,6 +3850,18 @@ deep-scope-analyser@^1.7.0: esrecurse "^4.2.1" estraverse "^4.2.0" +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + defaults@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -4038,13 +3975,12 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - arrify "^1.0.1" - path-type "^3.0.0" + path-type "^4.0.0" doctrine@^1.2.2: version "1.5.0" @@ -4111,27 +4047,6 @@ dot-prop@^4.1.1: dependencies: is-obj "^1.0.0" -download@^4.0.0, download@^4.1.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" - integrity sha1-qlX9rTktldS2jowr4D4MKqIbqaw= - dependencies: - caw "^1.0.1" - concat-stream "^1.4.7" - each-async "^1.0.0" - filenamify "^1.0.1" - got "^5.0.0" - gulp-decompress "^1.2.0" - gulp-rename "^1.2.0" - is-url "^1.2.0" - object-assign "^4.0.1" - read-all-stream "^3.0.0" - readable-stream "^2.0.2" - stream-combiner2 "^1.1.1" - vinyl "^1.0.0" - vinyl-fs "^2.2.0" - ware "^1.2.0" - download@^6.2.2: version "6.2.5" resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" @@ -4174,13 +4089,6 @@ duplexer2@0.0.2: dependencies: readable-stream "~1.1.9" -duplexer2@^0.1.4, duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -4191,7 +4099,7 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= -duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== @@ -4201,13 +4109,23 @@ duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -each-async@^1.0.0, each-async@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" - integrity sha1-3uUim98KtrogEqOV4bhpq/iBNHM= +duplexify@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" + integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== dependencies: - onetime "^1.0.0" - set-immediate-shim "^1.0.0" + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" easy-extender@^2.3.4: version "2.3.4" @@ -4356,6 +4274,13 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + end-of-stream@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" @@ -4498,7 +4423,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@ es6-symbol "~3.1.1" next-tick "^1.0.0" -es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -4837,14 +4762,6 @@ exec-buffer@^3.0.0: rimraf "^2.5.4" tempfile "^2.0.0" -exec-series@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" - integrity sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo= - dependencies: - async-each-series "^1.1.0" - object-assign "^4.1.0" - execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -4899,13 +4816,6 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -executable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" - integrity sha1-h3mA6REvM5EGbaNyZd562ENKtNk= - dependencies: - meow "^3.1.0" - executable@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -4923,13 +4833,6 @@ exit-hook@^1.0.0: resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -4943,13 +4846,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -5053,13 +4949,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5109,17 +4998,17 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== +fast-glob@^3.0.3: + version "3.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" + integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -5148,6 +5037,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + faye-websocket@~0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" @@ -5209,12 +5105,17 @@ file-type@5.2.0, file-type@^5.2.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" integrity sha1-LdvqfHP/42No365J3DOMBYwritY= -file-type@^10.4.0, file-type@^10.7.0: +file-type@^10.4.0: version "10.11.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== -file-type@^3.1.0, file-type@^3.8.0: +file-type@^12.0.0: + version "12.4.2" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9" + integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg== + +file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= @@ -5239,30 +5140,11 @@ file-type@^9.0.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= - filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= -filenamify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= - dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - filenamify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" @@ -5277,17 +5159,6 @@ filesize@^3.6.1: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -5298,6 +5169,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" @@ -5360,16 +5238,6 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-versions@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" - integrity sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I= - dependencies: - array-uniq "^1.0.0" - get-stdin "^4.0.1" - meow "^3.5.0" - semver-regex "^1.0.0" - find-versions@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d" @@ -5398,6 +5266,16 @@ findup-sync@^2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + fined@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" @@ -5456,7 +5334,7 @@ flora-colossus@^1.0.0: debug "^4.1.1" fs-extra "^7.0.0" -fluent-ffmpeg@^2.0.1: +fluent-ffmpeg@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74" integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ= @@ -5464,7 +5342,7 @@ fluent-ffmpeg@^2.0.1: async ">=0.2.9" which "^1.1.1" -flush-write-stream@^1.0.0: +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== @@ -5491,13 +5369,6 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" @@ -5604,6 +5475,14 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.6.0" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -5723,13 +5602,6 @@ get-package-info@^1.0.0: lodash.get "^4.0.0" read-pkg-up "^2.0.0" -get-proxy@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" - integrity sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus= - dependencies: - rc "^1.1.2" - get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -5781,16 +5653,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -gifsicle@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-4.0.1.tgz#30e1e61e3ee4884ef702641b2e98a15c2127b2e2" - integrity sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg== - dependencies: - bin-build "^3.0.0" - bin-wrapper "^4.0.0" - execa "^1.0.0" - logalot "^2.0.0" - gifsicle@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.1.0.tgz#08f878e9048c70adf046185115a6350516a1fdc0" @@ -5809,22 +5671,7 @@ glob-all@^3.1.0: glob "^7.0.5" yargs "~1.2.6" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0, glob-parent@^3.1.0: +glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= @@ -5832,6 +5679,13 @@ glob-parent@^3.0.0, glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob-stream@^3.1.5: version "3.1.18" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" @@ -5844,25 +5698,22 @@ glob-stream@^3.1.5: through2 "^0.6.1" unique-stream "^1.0.0" -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - integrity sha1-pVZlqajM3EGRWofHAeMtTgFvrSI= +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= dependencies: extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob-watcher@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" @@ -5870,6 +5721,18 @@ glob-watcher@^0.0.6: dependencies: gaze "^0.5.1" +glob-watcher@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" + glob2base@^0.0.12: version "0.0.12" resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" @@ -5887,17 +5750,6 @@ glob@^4.3.1: minimatch "^2.0.1" once "^1.3.0" -glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -5921,6 +5773,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~3.1.21: version "3.1.21" resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" @@ -5992,18 +5856,19 @@ globals@^9.2.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== +globby@^10.0.0: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" globule@^1.0.0: version "1.2.1" @@ -6049,27 +5914,6 @@ google-libphonenumber@^3.1.6: resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.5.tgz#2ebe6437fd3dbbffd65f4339ad1ba93b3dc56836" integrity sha512-Y0r7MFCI11UDLn0KaMPBEInhROyIOkWkQIyvWMFVF2I+h+sHE3vbl5a7FVe39td6u/w+nlKDdUMP9dMOZyv+2Q== -got@^5.0.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - integrity sha1-X4FjWmHkplifGAVp6k44FoClHzU= - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - got@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" @@ -6142,6 +5986,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.1 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.2.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -6193,14 +6042,38 @@ gulp-clean@^0.4.0: through2 "^2.0.3" vinyl "^2.1.0" -gulp-cssbeautify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gulp-cssbeautify/-/gulp-cssbeautify-1.0.1.tgz#136903ab47e8d6c14ec1306acd1064433c5cc592" - integrity sha512-6eMR1sqbdm0O5WLdnM3nDxFJc4XkdOJcYDPv2XGnDeSF05ed3PpJlJNVTBW+l5Yl6m9tUn6L17x/vnjx9MALwA== +gulp-cli@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.4.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.2.0" + yargs "^7.1.0" + +gulp-cssbeautify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gulp-cssbeautify/-/gulp-cssbeautify-2.0.1.tgz#39903a8fa0b4f384f20d4eb4bc6591d83c4e47ac" + integrity sha512-IOFGr2KQuO9koeQ5i0aWFhyUU4DBXmIHHblE5xfVxQEzPy5YXdKb54maP1sXTIDDhihilL+y3RhcCcxStem4Ig== dependencies: cssbeautify "^0.3.1" plugin-error "^1.0.1" - through2 "^2.0.3" + through2 "^3.0.1" gulp-csslint@^1.0.1: version "1.0.1" @@ -6214,16 +6087,6 @@ gulp-csslint@^1.0.1: through2 "^2.0.1" vinyl "^2.1.0" -gulp-decompress@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" - integrity sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc= - dependencies: - archive-type "^3.0.0" - decompress "^3.0.0" - gulp-util "^3.0.1" - readable-stream "^2.0.2" - gulp-dom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gulp-dom/-/gulp-dom-1.0.0.tgz#f834d5299c09b85e11c32505044a2ebe86ae1375" @@ -6241,15 +6104,15 @@ gulp-flatten@^0.4.0: plugin-error "^0.1.2" through2 "^2.0.0" -gulp-fluent-ffmpeg@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/gulp-fluent-ffmpeg/-/gulp-fluent-ffmpeg-1.0.2.tgz#1521b803254f17598274162cc536ae2a9b7cb8f7" - integrity sha1-FSG4AyVPF1mCdBYsxTauKpt8uPc= +gulp-fluent-ffmpeg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-fluent-ffmpeg/-/gulp-fluent-ffmpeg-2.0.0.tgz#5b5ed180d317fd3d800ddbcd6376ffb46294b836" + integrity sha512-pwG6N+NKwLzO/0ybzgcwiADKZ4OzpFjNR4drqCvbvluYcSh/yvsAW7wm63jFzpJIjfFnanYGPNWiUn8+TuTR/g== dependencies: - concat-stream "^1.4.8" - fluent-ffmpeg "^2.0.1" - gulp-util "^3.0.4" - through2 "^0.6.5" + concat-stream "^2.0.0" + fluent-ffmpeg "^2.1.2" + plugin-error "^1.0.1" + through2 "^3.0.1" gulp-html-beautify@^1.0.1: version "1.0.1" @@ -6269,31 +6132,31 @@ gulp-htmlmin@^5.0.1: plugin-error "^1.0.1" through2 "^2.0.3" -gulp-if@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" - integrity sha1-pJe351cwBQQcqivIt92jyARE1ik= +gulp-if@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-3.0.0.tgz#6c3e7edc8bafadc34f2ebecb314bf43324ba1e40" + integrity sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw== dependencies: - gulp-match "^1.0.3" - ternary-stream "^2.0.1" - through2 "^2.0.1" + gulp-match "^1.1.0" + ternary-stream "^3.0.0" + through2 "^3.0.1" -gulp-imagemin@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-5.0.3.tgz#b8236aff523eebd2d4b552a814a35df07ee710bc" - integrity sha512-bKJMix4r6EQPVV2u8sUglw6Rn0PSp6i70pSK2ECN7j0dRy0w/Lz5SBbynY3MfGBZ0cTMZlaUq+6LyKlZgP74Ew== +gulp-imagemin@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz#d1810a908fb64b4fbf15a750d303d988443e68cf" + integrity sha512-6xBTNybmPY2YrvrhhlS8Mxi0zn0ypusLon63p9XXxDtIf7U7c6KcViz94K7Skosucr3378A6IY2kJSjJyuwylQ== dependencies: - chalk "^2.4.1" + chalk "^3.0.0" fancy-log "^1.3.2" - imagemin "^6.0.0" + imagemin "^7.0.0" plugin-error "^1.0.1" plur "^3.0.1" - pretty-bytes "^5.1.0" + pretty-bytes "^5.3.0" through2-concurrent "^2.0.0" optionalDependencies: - imagemin-gifsicle "^6.0.1" - imagemin-jpegtran "^6.0.0" - imagemin-optipng "^6.0.0" + imagemin-gifsicle "^7.0.0" + imagemin-mozjpeg "^8.0.0" + imagemin-optipng "^7.0.0" imagemin-svgo "^7.0.0" gulp-javascript-obfuscator@^1.1.5: @@ -6319,33 +6182,26 @@ gulp-jsbeautifier@^3.0.0: plugin-error "^1.0.1" through2 "^3.0.1" -gulp-load-plugins@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-1.6.0.tgz#2d060c42faf481141ef638431572923d8701bd0d" - integrity sha512-HlCODki0WHJvQIgAsJYOTkyo0c7TsDCetvfhrdGz9JYPL6A4mFRMGmKfoi6JmXjA/vvzg+fkT91c9FBh7rnkyg== +gulp-load-plugins@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-2.0.3.tgz#5f275c0b7f1925d8a1ce57cbd5c346d6af6b64fb" + integrity sha512-U/1Sml7UbyOu2kH6Fbpo+ka2xyp4DRH6+oDtHgC8oKsnlQRuiBQYQ/LS4k6HxBv1HJlucaNV/SdwZXtLBuvSqg== dependencies: - array-unique "^0.2.1" + array-unique "^0.3.2" fancy-log "^1.2.0" - findup-sync "^3.0.0" + findup-sync "^4.0.0" gulplog "^1.0.0" has-gulplog "^0.1.0" - micromatch "^3.1.10" - resolve "^1.1.7" + micromatch "^4.0.2" + resolve "^1.15.1" -gulp-match@^1.0.3: +gulp-match@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f" integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ== dependencies: minimatch "^3.0.3" -gulp-multi-process@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/gulp-multi-process/-/gulp-multi-process-1.3.1.tgz#e12aa818e4c234357ad99d5caff8df8a18f46e9e" - integrity sha512-okxYy3mxUkekM0RNjkBg8OPuzpnD2yXMAdnGOaQPSJ2wzBdE9R9pkTV+tzPZ65ORK7b57YUc6s+gROA4+EIOLg== - dependencies: - async.queue "^0.5.2" - gulp-phonegap-build@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/gulp-phonegap-build/-/gulp-phonegap-build-0.1.5.tgz#36c145e63cd204702be0f3b99be19e096712bcaf" @@ -6371,15 +6227,16 @@ gulp-plumber@^1.2.1: plugin-error "^0.1.2" through2 "^2.0.3" -gulp-pngquant@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/gulp-pngquant/-/gulp-pngquant-1.0.12.tgz#48db0a5a99d923d74d3f292b55ef38fba531eae1" - integrity sha512-fGdXZtxnH4gM+Pa0wt9EceGwHDYN6lANkY3ISufb5K5GHvKJ5JK07kARYqoulb5HzyeerJxHLTd1QyP7diQE7A== +gulp-pngquant@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/gulp-pngquant/-/gulp-pngquant-1.0.13.tgz#7160b4b51080898c9bed896ae0432546c46a8130" + integrity sha512-oSo5Rw2Rb10eyGhc8XKbghq6yteMmxvsSAKGOZU0ssbylMHk3WoTWcEpNg0YWMyRjrY913y+B+PA4wHM1AL2wA== dependencies: - chalk "1.1.3" - gulp-util "3.0.7" - pngquant-bin "3.1.1" - through2 "2.0.1" + chalk "^3.0.0" + fancy-log "^1.3.3" + plugin-error "^1.0.1" + pngquant-bin "^5.0.2" + through2 "^3.0.1" gulp-postcss@^8.0.0: version "8.0.0" @@ -6392,10 +6249,10 @@ gulp-postcss@^8.0.0: postcss-load-config "^2.0.0" vinyl-sourcemaps-apply "^0.2.1" -gulp-rename@^1.2.0, gulp-rename@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" - integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg== +gulp-rename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c" + integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ== gulp-sass-lint@^1.4.0: version "1.4.0" @@ -6406,13 +6263,13 @@ gulp-sass-lint@^1.4.0: sass-lint "^1.12.0" through2 "^2.0.2" -gulp-sass@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.0.2.tgz#cfb1e3eff2bd9852431c7ce87f43880807d8d505" - integrity sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg== +gulp-sass@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427" + integrity sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA== dependencies: chalk "^2.3.0" - lodash.clonedeep "^4.3.2" + lodash "^4.17.11" node-sass "^4.8.3" plugin-error "^1.0.1" replace-ext "^1.0.0" @@ -6420,36 +6277,17 @@ gulp-sass@^4.0.1: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-sequence@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-sequence/-/gulp-sequence-1.0.0.tgz#862f93e6503e67c350a42948fa666953cf88ba67" - integrity sha512-c+p+EcyBl1UCpbfFA/vUD6MuC7uxoY6Y4g2lq9lLtzOHh9o1wijAQ4o0TIRQ14C7cG6zR6Zi+bpA0cW78CFt6g== - dependencies: - thunks "^4.9.0" - -gulp-sftp@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/gulp-sftp/-/gulp-sftp-0.1.5.tgz#57afec28b23823465d9ac44deba2f02de8dc5c70" - integrity sha1-V6/sKLI4I0ZdmsRN66LwLejcXHA= +"gulp-sftp@git+https://git@github.com/webksde/gulp-sftp": + version "0.1.6" + resolved "git+https://git@github.com/webksde/gulp-sftp#c8dfb20e290477eeed66a867406576d0c3d4fc6b" dependencies: async "~0.9.0" gulp-util "~3.0.0" object-assign "~0.3.1" parents "~1.0.0" - ssh2 "~0.3.3" + ssh2 "~0.6.1" through2 "~0.4.2" -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - integrity sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw= - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - gulp-terser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b" @@ -6460,30 +6298,6 @@ gulp-terser@^1.2.0: through2 "^3.0.1" vinyl-sourcemaps-apply "^0.2.1" -gulp-util@3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" - integrity sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs= - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^1.0.11" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - gulp-util@^2.2.19: version "2.2.20" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" @@ -6498,7 +6312,7 @@ gulp-util@^2.2.19: through2 "^0.5.0" vinyl "^0.2.1" -gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.4, gulp-util@~3.0.0: +gulp-util@^3.0.0, gulp-util@~3.0.0: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= @@ -6552,24 +6366,15 @@ gulp-yaml@^2.0.4: replace-ext "^1.0.0" through2 "^3.0.0" -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" gulp@~3.8.7: version "3.8.11" @@ -6654,6 +6459,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -6932,7 +6742,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.1.2, ignore@^3.3.5: +ignore@^3.1.2: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== @@ -6942,14 +6752,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -imagemin-gifsicle@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz#6abad4e95566d52e5a104aba1c24b4f3b48581b3" - integrity sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng== - dependencies: - exec-buffer "^3.0.0" - gifsicle "^4.0.0" - is-gif "^3.0.0" +ignore@^5.1.1: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== imagemin-gifsicle@^7.0.0: version "7.0.0" @@ -6960,14 +6766,14 @@ imagemin-gifsicle@^7.0.0: gifsicle "^5.0.0" is-gif "^3.0.0" -imagemin-jpegtran@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz#c8d3bcfb6ec9c561c20a987142854be70d90b04f" - integrity sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g== +imagemin-jpegtran@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-7.0.0.tgz#7728f84876362d489b9a1656e0cc8e2009406e6f" + integrity sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ== dependencies: exec-buffer "^3.0.0" is-jpg "^2.0.0" - jpegtran-bin "^4.0.0" + jpegtran-bin "^5.0.0" imagemin-mozjpeg@^8.0.0: version "8.0.0" @@ -6978,25 +6784,25 @@ imagemin-mozjpeg@^8.0.0: is-jpg "^2.0.0" mozjpeg "^6.0.0" -imagemin-optipng@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz#a6bfc7b542fc08fc687e83dfb131249179a51a68" - integrity sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A== +imagemin-optipng@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz#2225c82c35e5c29b7fa98d4f9ecee1161a68e888" + integrity sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ== dependencies: exec-buffer "^3.0.0" - is-png "^1.0.0" - optipng-bin "^5.0.0" + is-png "^2.0.0" + optipng-bin "^6.0.0" -imagemin-pngquant@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz#bf7a41d850c6998f2475c54058ab1db9c516385d" - integrity sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg== +imagemin-pngquant@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-9.0.0.tgz#f22ba4276cde1799fb15dd475e33984f8607e871" + integrity sha512-9cqnTEaJwAHWUi+8EMTB3NUouWToCWxtL+QnoYr8bfVwuKilHvRVWKsa9lt+0c3aWaGxCAkHs++j8qINvSqomA== dependencies: - execa "^1.0.0" + execa "^4.0.0" is-png "^2.0.0" is-stream "^2.0.0" - ow "^0.13.2" - pngquant-bin "^5.0.0" + ow "^0.17.0" + pngquant-bin "^6.0.0" imagemin-svgo@^7.0.0: version "7.0.0" @@ -7006,16 +6812,17 @@ imagemin-svgo@^7.0.0: is-svg "^3.0.0" svgo "^1.0.5" -imagemin@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-6.1.0.tgz#62508b465728fea36c03cdc07d915fe2d8cf9e13" - integrity sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A== +imagemin@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf" + integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w== dependencies: - file-type "^10.7.0" - globby "^8.0.1" - make-dir "^1.0.0" - p-pipe "^1.1.0" - pify "^4.0.1" + file-type "^12.0.0" + globby "^10.0.0" + graceful-fs "^4.2.2" + junk "^3.1.0" + make-dir "^3.0.0" + p-pipe "^3.0.0" replace-ext "^1.0.0" immutable@^3: @@ -7188,7 +6995,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -interpret@1.2.0, interpret@^1.0.0: +interpret@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -7198,6 +7005,11 @@ interpret@^0.3.2: resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.3.10.tgz#088c25de731c6c5b112a90f0071cfaf459e5a7bb" integrity sha1-CIwl3nMcbFsRKpDwBxz69Fnlp7s= +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -7233,11 +7045,6 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ip-regex@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" - integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= - ipaddr.js@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" @@ -7253,13 +7060,6 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= -is-absolute@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - integrity sha1-hHSREZ/MtftDYhfMc39/qtUPYD8= - dependencies: - is-relative "^0.1.0" - is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -7309,11 +7109,6 @@ is-buffer@^2.0.2: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== -is-bzip2@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" - integrity sha1-XuWOqlounIDiFAe+3yOuWsCRs/w= - is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -7373,18 +7168,6 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -7397,11 +7180,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7438,13 +7216,6 @@ is-gif@^3.0.0: dependencies: file-type "^10.4.0" -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -7452,18 +7223,13 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" - integrity sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= - is-jpg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" @@ -7485,16 +7251,16 @@ is-my-json-valid@^2.10.0: jsonpointer "^4.0.0" xtend "^4.0.0" -is-natural-number@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" - integrity sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec= - is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + is-number-like@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" @@ -7502,13 +7268,6 @@ is-number-like@^1.0.3: dependencies: lodash.isfinite "^3.3.2" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7521,6 +7280,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -7536,33 +7300,18 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-png@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" - integrity sha1-1XSxK/J1wDUEVVcLDltXqwYgd84= - is-png@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -7573,11 +7322,6 @@ is-property@^1.0.0, is-property@^1.0.2: resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -7585,11 +7329,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" - integrity sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI= - is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" @@ -7631,11 +7370,6 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-tar@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" - integrity sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0= - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -7648,20 +7382,15 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-url@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - integrity sha1-1LVcafUYhvm2XHDWwmItN+KfSP4= +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" @@ -7673,11 +7402,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-zip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" - integrity sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU= - is@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" @@ -7800,10 +7524,10 @@ jpeg-js@^0.3.4: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c" integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw== -jpegtran-bin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz#d00aed809fba7aa6f30817e59eee4ddf198f8f10" - integrity sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ== +jpegtran-bin@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-5.0.1.tgz#3cecaa471726bbcb66adabeeb544c409b17c73e5" + integrity sha512-xQoXWkIEt4ckmvcHd9xG3RcCIn00sf2TshDyFMOAE+46EspEqwqoPWotVI3e55FGWafMa9cEqaoIyrCeWDnFPw== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" @@ -7989,6 +7713,11 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + keyv@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" @@ -8022,7 +7751,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -8042,10 +7771,13 @@ known-css-properties@^0.3.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ== -lazy-req@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" - integrity sha1-va6+rTD42CQDnODOFJ1Nqge6H6w= +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" lazystream@^1.0.0: version "1.0.0" @@ -8075,6 +7807,13 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -8083,7 +7822,7 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@^2.0.1, liftoff@^2.1.0: +liftoff@^2.0.1: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= @@ -8097,6 +7836,20 @@ liftoff@^2.0.1, liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + limiter@^1.0.5: version "1.1.4" resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1" @@ -8352,11 +8105,6 @@ lodash.isarray@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - lodash.isfinite@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" @@ -8616,6 +8364,13 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -8665,10 +8420,15 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" md5.js@^1.3.4: version "1.3.5" @@ -8720,7 +8480,7 @@ memory-fs@^0.4.0, memory-fs@^0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0: +meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -8741,13 +8501,6 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -8758,6 +8511,11 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -8768,25 +8526,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -8806,6 +8545,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -9066,6 +8813,11 @@ multipipe@^0.1.0, multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -9263,11 +9015,6 @@ node-sri@^1.1.1: resolved "https://registry.yarnpkg.com/node-sri/-/node-sri-1.1.1.tgz#041096d2b11f232b65dedc4c3ae1cb62babb54b0" integrity sha1-BBCW0rEfIytl3txMOuHLYrq7VLA= -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - integrity sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8= - node.extend@^1.0.10: version "1.1.8" resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0" @@ -9301,7 +9048,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -9337,6 +9084,13 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.4.1.tgz#81e9c153b0ad5743755696f2aa20488d48e962b6" integrity sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg== +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -9418,17 +9172,12 @@ obfuscator-loader@^1.1.2: javascript-obfuscator "^0.15.0" loader-utils "^1.1.0" -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -9479,7 +9228,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: +object.assign@^4.0.4, object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -9489,7 +9238,7 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.1.0: +object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= @@ -9515,14 +9264,6 @@ object.map@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -9530,6 +9271,14 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" @@ -9559,7 +9308,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9662,10 +9411,10 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -optipng-bin@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-5.1.0.tgz#a7c7ab600a3ab5a177dae2f94c2d800aa386b5a9" - integrity sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA== +optipng-bin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-6.0.0.tgz#376120fa79d5e71eee2f524176efdd3a5eabd316" + integrity sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" @@ -9685,12 +9434,11 @@ ordered-read-streams@^0.1.0: resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - integrity sha1-cTfmmzKYuzQiR6G77jiByA4v14s= +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= dependencies: - is-stream "^1.0.1" readable-stream "^2.0.1" os-browserify@^0.3.0: @@ -9698,11 +9446,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-filter-obj@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" - integrity sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60= - os-filter-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" @@ -9744,12 +9487,12 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -ow@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ow/-/ow-0.13.2.tgz#375e76d3d3f928a8dfcf0cd0b9c921cb62e469a0" - integrity sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A== +ow@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c" + integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA== dependencies: - type-fest "^0.5.1" + type-fest "^0.11.0" p-cancelable@^0.3.0: version "0.3.0" @@ -9835,10 +9578,10 @@ p-map-series@^1.0.0: dependencies: p-reduce "^1.0.0" -p-pipe@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= +p-pipe@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== p-reduce@^1.0.0: version "1.0.0" @@ -9950,16 +9693,6 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-headers@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" @@ -9968,7 +9701,7 @@ parse-headers@^2.0.0: for-each "^0.3.3" string.prototype.trim "^1.1.2" -parse-json@^2.1.0, parse-json@^2.2.0: +parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= @@ -10117,12 +9850,10 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: version "3.0.17" @@ -10155,6 +9886,11 @@ phonegap-plugin-mobile-accessibility@^1.0.5: resolved "https://registry.yarnpkg.com/phonegap-plugin-mobile-accessibility/-/phonegap-plugin-mobile-accessibility-1.0.5.tgz#95a8754d127508bc6e1ae259a53ce765836eac03" integrity sha1-lah1TRJ1CLxuGuJZpTznZYNurAM= +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10258,16 +9994,7 @@ pngjs@^3.0.0, pngjs@^3.3.3: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -pngquant-bin@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-3.1.1.tgz#d124d98a75a9487f40c1640b4dbfcbb2bd5a1fd1" - integrity sha1-0STZinWpSH9AwWQLTb/Lsr1aH9E= - dependencies: - bin-build "^2.0.0" - bin-wrapper "^3.0.0" - logalot "^2.0.0" - -pngquant-bin@^5.0.0: +pngquant-bin@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460" integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA== @@ -10277,6 +10004,16 @@ pngquant-bin@^5.0.0: execa "^0.10.0" logalot "^2.0.0" +pngquant-bin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.0.tgz#aff0d7e61095feb96ced379ad8c7294ad3dd1712" + integrity sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.1" + execa "^4.0.0" + logalot "^2.0.0" + portscanner@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" @@ -10970,12 +10707,7 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -pretty-bytes@^5.1.0: +pretty-bytes@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== @@ -11000,11 +10732,6 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -11106,7 +10833,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: +pumpify@^1.3.3, pumpify@^1.3.5: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -11188,15 +10915,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -11245,7 +10963,7 @@ raw-body@^2.3.2: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.1.2, rc@^1.2.7: +rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -11285,14 +11003,6 @@ rcloader@^0.2.1: lodash.merge "^4.6.0" rcfinder "^0.1.6" -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - integrity sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po= - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -11334,7 +11044,7 @@ read@~1.0.4: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -11347,16 +11057,6 @@ read@~1.0.4: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0.27-1: - version "1.0.27-1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078" - integrity sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - "readable-stream@2 || 3": version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" @@ -11386,17 +11086,14 @@ readable-stream@^1.0.27-1, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= +readable-stream@^3.0.2, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" readdirp@^2.1.0, readdirp@^2.2.1: version "2.2.1" @@ -11490,13 +11187,6 @@ regenerator-transform@^0.14.0: dependencies: private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -11544,7 +11234,24 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remove-trailing-separator@^1.0.1: +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -11554,7 +11261,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -11576,6 +11283,15 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + request-promise-core@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" @@ -11676,6 +11392,13 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -11688,6 +11411,13 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" +resolve@^1.15.1, resolve@^1.4.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" @@ -11724,6 +11454,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -11734,7 +11469,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.2.6, rimraf@^2.4.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.4.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11777,6 +11512,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -11925,36 +11665,38 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -seek-bzip@^1.0.3, seek-bzip@^1.0.5: +seek-bzip@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= dependencies: commander "~2.8.1" -semver-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" - integrity sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk= +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" semver-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -semver-truncate@^1.0.0, semver-truncate@^1.1.2: +semver-truncate@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^4.0.3, semver@^4.1.0: +semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= @@ -12065,11 +11807,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -12149,10 +11886,10 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@0.0.4: version "0.0.4" @@ -12443,14 +12180,21 @@ squeak@^1.0.0: console-stream "^0.1.1" lpad-align "^1.0.1" -ssh2@~0.3.3: - version "0.3.6" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.3.6.tgz#49034434aee3821ee5fc22b952081e7801ff92ed" - integrity sha1-SQNENK7jgh7l/CK5UggeeAH/ku0= +ssh2-streams@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.2.1.tgz#9c9c9964be60e9644575af328677f64b1e5cbd79" + integrity sha512-3zCOsmunh1JWgPshfhKmBCL3lUtHPoh+a/cyQ49Ft0Q0aF7xgN06b76L+oKtFi0fgO57FLjFztb1GlJcEZ4a3Q== dependencies: - asn1 "0.2.1" - readable-stream "1.0.27-1" - streamsearch "0.1.2" + asn1 "~0.2.0" + semver "^5.1.0" + streamsearch "~0.1.2" + +ssh2@~0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.6.2.tgz#b065d6e2133a2d4b557447d613b3511cb15e3a2e" + integrity sha512-DJ+dOhXEEsmNpcQTI0x69FS++JH6qqL/ltEHf01pI1SSLMAcmD+hL4jRwvHjPwynPsmSUbHJ/WIZYzROfqZWjA== + dependencies: + ssh2-streams "~0.2.0" sshpk@^1.7.0: version "1.16.1" @@ -12479,16 +12223,11 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.x: +stack-trace@0.0.10, stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - integrity sha1-5sgLYjEj19gM8TLOU480YokHJQI= - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -12532,14 +12271,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - stream-consume@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" @@ -12553,6 +12284,11 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" @@ -12577,7 +12313,7 @@ stream-throttle@^0.1.3: commander "^2.2.0" limiter "^1.0.5" -streamsearch@0.1.2: +streamsearch@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= @@ -12712,14 +12448,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4= - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -12740,18 +12468,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-dirs@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" - integrity sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA= - dependencies: - chalk "^1.0.0" - get-stdin "^4.0.1" - is-absolute "^0.1.5" - is-natural-number "^2.0.0" - minimist "^1.1.0" - sum-up "^1.0.1" - strip-dirs@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" @@ -12814,13 +12530,6 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -sum-up@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= - dependencies: - chalk "^1.0.0" - sumchecker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.0.tgz#da5457b4605184575c76540e5e99cc777cb8ce4c" @@ -12859,6 +12568,21 @@ supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + svgo@^1.0.0, svgo@^1.0.5: version "1.3.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" @@ -12915,7 +12639,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar-stream@^1.1.1, tar-stream@^1.5.2: +tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== @@ -12965,14 +12689,6 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= -tempfile@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" - integrity sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I= - dependencies: - os-tmpdir "^1.0.0" - uuid "^2.0.1" - tempfile@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" @@ -12981,15 +12697,15 @@ tempfile@^2.0.0: temp-dir "^1.0.0" uuid "^3.0.1" -ternary-stream@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.1.1.tgz#4ad64b98668d796a085af2c493885a435a8a8bfc" - integrity sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw== +ternary-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253" + integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ== dependencies: - duplexify "^3.5.0" + duplexify "^4.1.1" fork-stream "^0.0.4" - merge-stream "^1.0.0" - through2 "^2.0.1" + merge-stream "^2.0.0" + through2 "^3.0.1" terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1: version "1.4.1" @@ -13035,14 +12751,6 @@ through2-concurrent@^2.0.0: dependencies: through2 "^2.0.0" -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - through2-filter@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" @@ -13058,14 +12766,6 @@ through2@*, through2@3.0.1, through2@^3.0.0, through2@^3.0.1: dependencies: readable-stream "2 || 3" -through2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" - integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= - dependencies: - readable-stream "~2.0.0" - xtend "~4.0.0" - through2@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -13090,7 +12790,7 @@ through2@^0.5.0, through2@^0.5.1: readable-stream "~1.0.17" xtend "~3.0.0" -through2@^0.6.0, through2@^0.6.1, through2@^0.6.5, through2@~0.6.1: +through2@^0.6.1, through2@~0.6.1: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= @@ -13119,11 +12819,6 @@ through@^2.3.6, through@^2.3.8, through@~2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -thunks@^4.9.0: - version "4.9.5" - resolved "https://registry.yarnpkg.com/thunks/-/thunks-4.9.5.tgz#fc764983de4de7230a2f300cfe2dc77092bc38f4" - integrity sha512-L0s0QzX1x0fcsP52TQs42t3CGX/z6lw0Ktz0ciex47OUhog5K3AsfH3mQ4JTLBYbnsNBhaIUcVMrY8sR+0Lo6w== - tildify@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" @@ -13136,11 +12831,6 @@ time-stamp@^1.0.0: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - integrity sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc= - timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -13201,12 +12891,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - integrity sha1-HN+kcqnvUMI57maZm2YsoOs5k38= +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= dependencies: - extend-shallow "^2.0.1" + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" to-array@0.1.4: version "0.1.4" @@ -13248,6 +12939,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -13258,6 +12956,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -13347,11 +13052,6 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tunnel-agent@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -13371,10 +13071,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== type-is@~1.5.1: version "1.5.7" @@ -13443,6 +13143,26 @@ underscore@~1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" + integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -13547,11 +13267,6 @@ unused-files-webpack-plugin@^3.4.0: util.promisify "^1.0.0" warning "^3.0.0" -unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - integrity sha1-uYTwh3/AqJwsdzzB73tbIytbBv4= - upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -13588,13 +13303,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-regex@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" - integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ= - dependencies: - ip-regex "^1.0.1" - url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -13676,11 +13384,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= - uuid@^3.0.1, uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" @@ -13698,10 +13401,12 @@ v8flags@^2.0.2: dependencies: user-home "^1.1.1" -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -13721,6 +13426,11 @@ validator@9.2.0: resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" integrity sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA== +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13740,14 +13450,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl-assign@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" - integrity sha1-TRmIkbVRWRHXcajNnFSApGoHSkU= - dependencies: - object-assign "^4.0.1" - readable-stream "^2.0.0" - vinyl-buffer@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-0.0.0.tgz#d197a824badcb11cccf9643ac91be24d43eda8db" @@ -13770,28 +13472,28 @@ vinyl-fs@^0.3.0: through2 "^0.6.1" vinyl "^0.4.0" -vinyl-fs@^2.2.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - integrity sha1-vm/zJwy1Xf19MGNkDegfJddTIjk= +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" + is-valid-glob "^1.0.0" lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" vinyl-source-stream@^0.1.1: version "0.1.1" @@ -13801,6 +13503,19 @@ vinyl-source-stream@^0.1.1: through2 "~0.3.0" vinyl "~0.2.2" +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" @@ -13808,7 +13523,7 @@ vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: dependencies: source-map "^0.5.1" -vinyl@*, vinyl@^2.1.0, vinyl@^2.2.0: +vinyl@*, vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== @@ -13827,7 +13542,7 @@ vinyl@^0.2.1, vinyl@~0.2.2: dependencies: clone-stats "~0.0.1" -vinyl@^0.4.0, vinyl@^0.4.3: +vinyl@^0.4.0: version "0.4.6" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= @@ -13844,15 +13559,6 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - vm-browserify@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" @@ -13865,13 +13571,6 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -ware@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" - integrity sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q= - dependencies: - wrap-fn "^0.1.0" - warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" @@ -14136,13 +13835,6 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-fn@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" - integrity sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU= - dependencies: - co "3.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14289,6 +13981,14 @@ yaml@^1.8.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yargs-parser@5.0.0-security.0: + version "5.0.0-security.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24" + integrity sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ== + dependencies: + camelcase "^3.0.0" + object.assign "^4.1.0" + yargs-parser@^13.0.0, yargs-parser@^13.1.0: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" @@ -14386,6 +14086,25 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" +yargs@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6" + integrity sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g== + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "5.0.0-security.0" + yargs@~1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" @@ -14393,7 +14112,7 @@ yargs@~1.2.6: dependencies: minimist "^0.1.0" -yauzl@^2.2.1, yauzl@^2.4.2: +yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= diff --git a/package.json b/package.json index d7f49b38..af94e173 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "license": "MIT", "private": true, "scripts": { - "dev": "./gulp/gulp main.serveDev", + "dev": "cd gulp && yarn gulp main.serveDev", "tslint": "cd src/js && tsc", "lint": "npx eslint src/js", "prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*", diff --git a/res/ui/building_tutorials/underground_belt-tier2.png b/res/ui/building_tutorials/underground_belt-tier2.png index 476ad4da..69981b26 100644 Binary files a/res/ui/building_tutorials/underground_belt-tier2.png and b/res/ui/building_tutorials/underground_belt-tier2.png differ diff --git a/res/ui/languages/es-419.svg b/res/ui/languages/es-419.svg index d894b258..7deefd93 100644 --- a/res/ui/languages/es-419.svg +++ b/res/ui/languages/es-419.svg @@ -1,60 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/res/ui/languages/no.svg b/res/ui/languages/no.svg new file mode 100644 index 00000000..5f5a4b6c --- /dev/null +++ b/res/ui/languages/no.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/ui/languages/pt-PT.svg b/res/ui/languages/pt-PT.svg new file mode 100644 index 00000000..4daa9aeb --- /dev/null +++ b/res/ui/languages/pt-PT.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/ui/languages/zh-CN.svg b/res/ui/languages/zh-CN.svg new file mode 100644 index 00000000..f89219a0 --- /dev/null +++ b/res/ui/languages/zh-CN.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res_built/atlas/atlas0_10.json b/res_built/atlas/atlas0_10.json index 52fb27cc..8aeef6ae 100644 --- a/res_built/atlas/atlas0_10.json +++ b/res_built/atlas/atlas0_10.json @@ -74,7 +74,7 @@ }, "sprites/belt/left_3.png": { - "frame": {"x":313,"y":112,"w":13,"h":13}, + "frame": {"x":289,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -82,7 +82,7 @@ }, "sprites/belt/left_4.png": { - "frame": {"x":289,"y":26,"w":13,"h":13}, + "frame": {"x":306,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -90,7 +90,7 @@ }, "sprites/belt/left_5.png": { - "frame": {"x":306,"y":26,"w":13,"h":13}, + "frame": {"x":323,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -98,7 +98,7 @@ }, "sprites/belt/right_0.png": { - "frame": {"x":330,"y":112,"w":13,"h":13}, + "frame": {"x":313,"y":112,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -106,7 +106,7 @@ }, "sprites/belt/right_1.png": { - "frame": {"x":347,"y":112,"w":13,"h":13}, + "frame": {"x":330,"y":112,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -114,7 +114,7 @@ }, "sprites/belt/right_2.png": { - "frame": {"x":323,"y":26,"w":13,"h":13}, + "frame": {"x":340,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -122,7 +122,7 @@ }, "sprites/belt/right_3.png": { - "frame": {"x":364,"y":111,"w":13,"h":13}, + "frame": {"x":347,"y":112,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -130,7 +130,7 @@ }, "sprites/belt/right_4.png": { - "frame": {"x":381,"y":111,"w":13,"h":13}, + "frame": {"x":357,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -138,7 +138,7 @@ }, "sprites/belt/right_5.png": { - "frame": {"x":340,"y":25,"w":13,"h":13}, + "frame": {"x":374,"y":49,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -146,7 +146,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":357,"y":23,"w":13,"h":13}, + "frame": {"x":391,"y":48,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -154,7 +154,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":374,"y":23,"w":13,"h":13}, + "frame": {"x":404,"y":25,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -162,7 +162,7 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":391,"y":23,"w":13,"h":13}, + "frame": {"x":400,"y":85,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -178,7 +178,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":207,"y":43,"w":36,"h":19}, + "frame": {"x":245,"y":66,"w":36,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, @@ -186,7 +186,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":285,"y":3,"w":19,"h":19}, + "frame": {"x":285,"y":66,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -194,7 +194,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":245,"y":89,"w":19,"h":19}, + "frame": {"x":285,"y":89,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -202,7 +202,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":166,"y":45,"w":37,"h":19}, + "frame": {"x":204,"y":68,"w":37,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, @@ -216,6 +216,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":38,"h":38}, "sourceSize": {"w":38,"h":38} }, +"sprites/blueprints/painter-mirrored.png": +{ + "frame": {"x":82,"y":49,"w":38,"h":19}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, + "sourceSize": {"w":38,"h":19} +}, "sprites/blueprints/painter-quad.png": { "frame": {"x":3,"y":83,"w":77,"h":19}, @@ -226,7 +234,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":82,"y":49,"w":38,"h":19}, + "frame": {"x":124,"y":49,"w":38,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, @@ -234,7 +242,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":268,"y":89,"w":19,"h":19}, + "frame": {"x":289,"y":26,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -242,7 +250,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":285,"y":66,"w":19,"h":19}, + "frame": {"x":312,"y":26,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -250,7 +258,7 @@ }, "sprites/blueprints/splitter-compact-inverse.png": { - "frame": {"x":291,"y":89,"w":19,"h":19}, + "frame": {"x":327,"y":3,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -258,7 +266,7 @@ }, "sprites/blueprints/splitter-compact.png": { - "frame": {"x":287,"y":43,"w":19,"h":19}, + "frame": {"x":308,"y":66,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -266,7 +274,7 @@ }, "sprites/blueprints/splitter.png": { - "frame": {"x":245,"y":3,"w":36,"h":19}, + "frame": {"x":249,"y":43,"w":36,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, @@ -274,7 +282,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":204,"y":3,"w":37,"h":19}, + "frame": {"x":204,"y":91,"w":37,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, @@ -290,7 +298,7 @@ }, "sprites/blueprints/trash.png": { - "frame": {"x":308,"y":66,"w":19,"h":19}, + "frame": {"x":335,"y":26,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -298,7 +306,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":360,"y":89,"w":19,"h":18}, + "frame": {"x":381,"y":26,"w":19,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":19,"h":18}, @@ -306,7 +314,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":354,"y":3,"w":19,"h":16}, + "frame": {"x":354,"y":89,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":19,"h":16}, @@ -314,7 +322,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":356,"y":42,"w":19,"h":16}, + "frame": {"x":364,"y":109,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, @@ -322,7 +330,7 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":377,"y":62,"w":19,"h":16}, + "frame": {"x":377,"y":66,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, @@ -338,7 +346,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":330,"y":112,"w":13,"h":13}, + "frame": {"x":313,"y":112,"w":13,"h":13}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, @@ -362,7 +370,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":245,"y":66,"w":36,"h":19}, + "frame": {"x":287,"y":3,"w":36,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, @@ -378,7 +386,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":314,"y":89,"w":19,"h":19}, + "frame": {"x":350,"y":3,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -386,7 +394,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":310,"y":43,"w":19,"h":19}, + "frame": {"x":308,"y":89,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -394,7 +402,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":204,"y":68,"w":37,"h":19}, + "frame": {"x":208,"y":43,"w":37,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, @@ -408,6 +416,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":38,"h":38}, "sourceSize": {"w":38,"h":38} }, +"sprites/buildings/painter-mirrored.png": +{ + "frame": {"x":166,"y":45,"w":38,"h":19}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, + "sourceSize": {"w":38,"h":19} +}, "sprites/buildings/painter-quad.png": { "frame": {"x":3,"y":106,"w":77,"h":19}, @@ -418,7 +434,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":124,"y":49,"w":38,"h":19}, + "frame": {"x":204,"y":3,"w":38,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, @@ -434,7 +450,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":337,"y":89,"w":19,"h":19}, + "frame": {"x":331,"y":89,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -442,7 +458,7 @@ }, "sprites/buildings/splitter-compact-inverse.png": { - "frame": {"x":308,"y":3,"w":19,"h":19}, + "frame": {"x":354,"y":66,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -450,7 +466,7 @@ }, "sprites/buildings/splitter-compact.png": { - "frame": {"x":333,"y":43,"w":19,"h":19}, + "frame": {"x":358,"y":26,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -458,7 +474,7 @@ }, "sprites/buildings/splitter.png": { - "frame": {"x":247,"y":43,"w":36,"h":19}, + "frame": {"x":245,"y":89,"w":36,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, @@ -466,7 +482,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":204,"y":91,"w":37,"h":19}, + "frame": {"x":246,"y":3,"w":37,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, @@ -482,7 +498,7 @@ }, "sprites/buildings/trash.png": { - "frame": {"x":354,"y":66,"w":19,"h":19}, + "frame": {"x":373,"y":3,"w":19,"h":19}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, @@ -490,7 +506,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":331,"y":3,"w":19,"h":18}, + "frame": {"x":396,"y":3,"w":19,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":19,"h":18}, @@ -498,7 +514,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":383,"y":82,"w":19,"h":16}, + "frame": {"x":377,"y":86,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":19,"h":16}, @@ -506,7 +522,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":377,"y":3,"w":19,"h":16}, + "frame": {"x":387,"y":106,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, @@ -514,7 +530,7 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":379,"y":40,"w":19,"h":16}, + "frame": {"x":400,"y":65,"w":19,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, @@ -538,7 +554,7 @@ }, "sprites/map_overview/belt_forward.png": { - "frame": {"x":102,"y":72,"w":3,"h":3}, + "frame": {"x":111,"y":72,"w":3,"h":3}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, @@ -546,7 +562,7 @@ }, "sprites/map_overview/belt_left.png": { - "frame": {"x":109,"y":72,"w":3,"h":3}, + "frame": {"x":118,"y":72,"w":3,"h":3}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, @@ -554,7 +570,7 @@ }, "sprites/map_overview/belt_right.png": { - "frame": {"x":116,"y":72,"w":3,"h":3}, + "frame": {"x":125,"y":72,"w":3,"h":3}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, @@ -568,6 +584,22 @@ "spriteSourceSize": {"x":0,"y":0,"w":10,"h":10}, "sourceSize": {"w":10,"h":10} }, +"sprites/misc/hub_direction_indicator.png": +{ + "frame": {"x":132,"y":72,"w":3,"h":3}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":3,"h":3} +}, +"sprites/misc/lock_direction_indicator.png": +{ + "frame": {"x":102,"y":72,"w":5,"h":5}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":5,"h":5}, + "sourceSize": {"w":5,"h":5} +}, "sprites/misc/slot_bad_arrow.png": { "frame": {"x":187,"y":114,"w":10,"h":10}, @@ -594,7 +626,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":123,"y":72,"w":3,"h":3}, + "frame": {"x":139,"y":72,"w":3,"h":3}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, @@ -605,8 +637,8 @@ "version": "1.0", "image": "atlas0_10.png", "format": "RGBA8888", - "size": {"w":407,"h":128}, + "size": {"w":422,"h":128}, "scale": "0.1", - "smartupdate": "$TexturePacker:SmartUpdate:3dd7a89f30024dd4787ad4af6b14588a:9ba11f8b02134c4376ab4e0a44f8b850:f159918d23e5952766c6d23ab52278c6$" + "smartupdate": "$TexturePacker:SmartUpdate:8985524bba1a3f16cecab3c03b6aaa06:d614d20bfce033d8a8ab0990af085d16:f159918d23e5952766c6d23ab52278c6$" } } diff --git a/res_built/atlas/atlas0_10.png b/res_built/atlas/atlas0_10.png index 35d9ea6e..adab820d 100644 Binary files a/res_built/atlas/atlas0_10.png and b/res_built/atlas/atlas0_10.png differ diff --git a/res_built/atlas/atlas0_100.json b/res_built/atlas/atlas0_100.json index ed6e5338..ba671365 100644 --- a/res_built/atlas/atlas0_100.json +++ b/res_built/atlas/atlas0_100.json @@ -2,7 +2,7 @@ "sprites/belt/forward_0.png": { - "frame": {"x":1871,"y":1504,"w":100,"h":126}, + "frame": {"x":1876,"y":1166,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -10,7 +10,7 @@ }, "sprites/belt/forward_1.png": { - "frame": {"x":1871,"y":240,"w":100,"h":126}, + "frame": {"x":1876,"y":1296,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -18,7 +18,7 @@ }, "sprites/belt/forward_2.png": { - "frame": {"x":1844,"y":394,"w":100,"h":126}, + "frame": {"x":1869,"y":1543,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -26,7 +26,7 @@ }, "sprites/belt/forward_3.png": { - "frame": {"x":1871,"y":1634,"w":100,"h":126}, + "frame": {"x":1857,"y":395,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -34,7 +34,7 @@ }, "sprites/belt/forward_4.png": { - "frame": {"x":1433,"y":785,"w":100,"h":126}, + "frame": {"x":1865,"y":1690,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -42,7 +42,7 @@ }, "sprites/belt/forward_5.png": { - "frame": {"x":917,"y":1564,"w":100,"h":126}, + "frame": {"x":920,"y":1370,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -50,7 +50,7 @@ }, "sprites/belt/left_0.png": { - "frame": {"x":1021,"y":1563,"w":113,"h":113}, + "frame": {"x":1870,"y":1426,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -58,7 +58,7 @@ }, "sprites/belt/left_1.png": { - "frame": {"x":1138,"y":1563,"w":113,"h":113}, + "frame": {"x":920,"y":1500,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -66,7 +66,7 @@ }, "sprites/belt/left_2.png": { - "frame": {"x":1255,"y":1563,"w":113,"h":113}, + "frame": {"x":935,"y":1617,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -74,7 +74,7 @@ }, "sprites/belt/left_3.png": { - "frame": {"x":1372,"y":1562,"w":113,"h":113}, + "frame": {"x":935,"y":1734,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -82,7 +82,7 @@ }, "sprites/belt/left_4.png": { - "frame": {"x":1489,"y":1562,"w":113,"h":113}, + "frame": {"x":1052,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -90,7 +90,7 @@ }, "sprites/belt/left_5.png": { - "frame": {"x":1021,"y":1680,"w":113,"h":113}, + "frame": {"x":1169,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -98,7 +98,7 @@ }, "sprites/belt/right_0.png": { - "frame": {"x":1138,"y":1680,"w":113,"h":113}, + "frame": {"x":1286,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -106,7 +106,7 @@ }, "sprites/belt/right_1.png": { - "frame": {"x":1255,"y":1680,"w":113,"h":113}, + "frame": {"x":1403,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -114,7 +114,7 @@ }, "sprites/belt/right_2.png": { - "frame": {"x":1372,"y":1679,"w":113,"h":113}, + "frame": {"x":1520,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -122,7 +122,7 @@ }, "sprites/belt/right_3.png": { - "frame": {"x":1489,"y":1679,"w":113,"h":113}, + "frame": {"x":1052,"y":1552,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -130,7 +130,7 @@ }, "sprites/belt/right_4.png": { - "frame": {"x":1606,"y":1676,"w":113,"h":113}, + "frame": {"x":1169,"y":1552,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -138,7 +138,7 @@ }, "sprites/belt/right_5.png": { - "frame": {"x":1723,"y":1676,"w":113,"h":113}, + "frame": {"x":1286,"y":1554,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -162,7 +162,7 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":1871,"y":1374,"w":102,"h":126}, + "frame": {"x":1871,"y":240,"w":102,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":0,"w":102,"h":126}, @@ -178,7 +178,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":726,"y":979,"w":341,"h":191}, + "frame": {"x":1433,"y":785,"w":341,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":0,"w":341,"h":191}, @@ -186,7 +186,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":1500,"y":1368,"w":182,"h":190}, + "frame": {"x":749,"y":1655,"w":182,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":182,"h":190}, @@ -194,7 +194,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":1437,"y":590,"w":182,"h":190}, + "frame": {"x":1690,"y":1174,"w":182,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":182,"h":190}, @@ -202,7 +202,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":735,"y":590,"w":347,"h":191}, + "frame": {"x":1123,"y":590,"w":347,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":347,"h":191}, @@ -216,6 +216,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":384,"h":382}, "sourceSize": {"w":384,"h":384} }, +"sprites/blueprints/painter-mirrored.png": +{ + "frame": {"x":1485,"y":3,"w":384,"h":192}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":384,"h":192}, + "sourceSize": {"w":384,"h":192} +}, "sprites/blueprints/painter-quad.png": { "frame": {"x":735,"y":3,"w":746,"h":192}, @@ -226,7 +234,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":1485,"y":3,"w":384,"h":192}, + "frame": {"x":1483,"y":199,"w":384,"h":192}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":384,"h":192}, @@ -234,7 +242,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":1116,"y":1368,"w":189,"h":191}, + "frame": {"x":922,"y":1174,"w":189,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":189,"h":191}, @@ -242,7 +250,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":724,"y":1564,"w":189,"h":191}, + "frame": {"x":1115,"y":1173,"w":189,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":189,"h":191}, @@ -250,7 +258,7 @@ }, "sprites/blueprints/splitter-compact-inverse.png": { - "frame": {"x":1652,"y":394,"w":188,"h":182}, + "frame": {"x":1756,"y":980,"w":188,"h":182}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":188,"h":182}, @@ -258,7 +266,7 @@ }, "sprites/blueprints/splitter-compact.png": { - "frame": {"x":1623,"y":587,"w":185,"h":182}, + "frame": {"x":1306,"y":1368,"w":185,"h":182}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":185,"h":182}, @@ -266,7 +274,7 @@ }, "sprites/blueprints/splitter.png": { - "frame": {"x":1071,"y":979,"w":340,"h":191}, + "frame": {"x":726,"y":979,"w":340,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":0,"w":340,"h":191}, @@ -274,7 +282,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":1086,"y":590,"w":347,"h":191}, + "frame": {"x":1474,"y":590,"w":347,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":347,"h":191}, @@ -290,7 +298,7 @@ }, "sprites/blueprints/trash.png": { - "frame": {"x":724,"y":1368,"w":192,"h":192}, + "frame": {"x":726,"y":1174,"w":192,"h":192}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":192}, @@ -298,7 +306,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":1791,"y":1035,"w":183,"h":166}, + "frame": {"x":1683,"y":1368,"w":183,"h":166}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":26,"w":183,"h":166}, @@ -306,7 +314,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":1812,"y":580,"w":182,"h":148}, + "frame": {"x":192,"y":1702,"w":182,"h":148}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":44,"w":182,"h":148}, @@ -314,7 +322,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":1623,"y":773,"w":185,"h":148}, + "frame": {"x":3,"y":1702,"w":185,"h":148}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":185,"h":148}, @@ -322,7 +330,7 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":1812,"y":732,"w":182,"h":148}, + "frame": {"x":1683,"y":1538,"w":182,"h":148}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":182,"h":148}, @@ -330,7 +338,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":1021,"y":1563,"w":113,"h":113}, + "frame": {"x":1870,"y":1426,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":113,"h":113}, @@ -338,7 +346,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":1138,"y":1680,"w":113,"h":113}, + "frame": {"x":1286,"y":1721,"w":113,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":113,"h":113}, @@ -346,7 +354,7 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":1871,"y":1504,"w":100,"h":126}, + "frame": {"x":1876,"y":1166,"w":100,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":100,"h":126}, @@ -362,7 +370,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":726,"y":1174,"w":339,"h":190}, + "frame": {"x":1070,"y":979,"w":339,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":0,"w":339,"h":190}, @@ -378,7 +386,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":1469,"y":395,"w":179,"h":188}, + "frame": {"x":1825,"y":590,"w":179,"h":188}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":1,"w":179,"h":188}, @@ -386,7 +394,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":1415,"y":979,"w":179,"h":189}, + "frame": {"x":1778,"y":785,"w":179,"h":189}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":179,"h":189}, @@ -408,6 +416,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":384,"h":381}, "sourceSize": {"w":384,"h":384} }, +"sprites/buildings/painter-mirrored.png": +{ + "frame": {"x":735,"y":590,"w":384,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":384,"h":191}, + "sourceSize": {"w":384,"h":192} +}, "sprites/buildings/painter-quad.png": { "frame": {"x":735,"y":199,"w":744,"h":192}, @@ -418,7 +434,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":1483,"y":199,"w":384,"h":191}, + "frame": {"x":1469,"y":395,"w":384,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":384,"h":191}, @@ -426,7 +442,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":1309,"y":1368,"w":187,"h":190}, + "frame": {"x":1308,"y":1174,"w":187,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":187,"h":190}, @@ -434,7 +450,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":1412,"y":1174,"w":187,"h":190}, + "frame": {"x":1499,"y":1174,"w":187,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":187,"h":190}, @@ -442,7 +458,7 @@ }, "sprites/buildings/splitter-compact-inverse.png": { - "frame": {"x":1598,"y":925,"w":187,"h":180}, + "frame": {"x":1115,"y":1368,"w":187,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":187,"h":180}, @@ -450,7 +466,7 @@ }, "sprites/buildings/splitter-compact.png": { - "frame": {"x":1603,"y":1109,"w":184,"h":180}, + "frame": {"x":1495,"y":1368,"w":184,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":5,"w":184,"h":180}, @@ -458,7 +474,7 @@ }, "sprites/buildings/splitter.png": { - "frame": {"x":1069,"y":1174,"w":339,"h":190}, + "frame": {"x":1413,"y":980,"w":339,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":0,"w":339,"h":190}, @@ -482,7 +498,7 @@ }, "sprites/buildings/trash.png": { - "frame": {"x":920,"y":1368,"w":192,"h":191}, + "frame": {"x":724,"y":1370,"w":192,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":192,"h":191}, @@ -490,7 +506,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":1791,"y":1205,"w":181,"h":165}, + "frame": {"x":1495,"y":1552,"w":181,"h":165}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":27,"w":181,"h":165}, @@ -498,7 +514,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":1686,"y":1374,"w":181,"h":147}, + "frame": {"x":564,"y":1707,"w":181,"h":147}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":45,"w":181,"h":147}, @@ -506,7 +522,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":1812,"y":884,"w":182,"h":147}, + "frame": {"x":378,"y":1707,"w":182,"h":147}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":182,"h":147}, @@ -514,7 +530,7 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":1686,"y":1525,"w":181,"h":147}, + "frame": {"x":1680,"y":1690,"w":181,"h":147}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":181,"h":147}, @@ -522,7 +538,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":1603,"y":1293,"w":50,"h":64}, + "frame": {"x":1961,"y":782,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":50,"h":64}, @@ -530,7 +546,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":1606,"y":1562,"w":50,"h":64}, + "frame": {"x":1961,"y":850,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":50,"h":64}, @@ -538,7 +554,7 @@ }, "sprites/map_overview/belt_forward.png": { - "frame": {"x":353,"y":1702,"w":24,"h":32}, + "frame": {"x":1637,"y":1721,"w":24,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":24,"h":32}, @@ -546,7 +562,7 @@ }, "sprites/map_overview/belt_left.png": { - "frame": {"x":1433,"y":915,"w":28,"h":28}, + "frame": {"x":1893,"y":525,"w":28,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":28,"h":28}, @@ -554,7 +570,7 @@ }, "sprites/map_overview/belt_right.png": { - "frame": {"x":1433,"y":947,"w":28,"h":28}, + "frame": {"x":1080,"y":1669,"w":28,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":28,"h":28}, @@ -562,15 +578,31 @@ }, "sprites/misc/deletion_marker.png": { - "frame": {"x":267,"y":1702,"w":82,"h":82}, + "frame": {"x":1403,"y":1554,"w":82,"h":82}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":82,"h":82}, "sourceSize": {"w":96,"h":96} }, +"sprites/misc/hub_direction_indicator.png": +{ + "frame": {"x":1857,"y":525,"w":32,"h":32}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32}, + "sourceSize": {"w":32,"h":32} +}, +"sprites/misc/lock_direction_indicator.png": +{ + "frame": {"x":1961,"y":918,"w":48,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":9,"w":48,"h":30}, + "sourceSize": {"w":48,"h":48} +}, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":267,"y":1702,"w":82,"h":82}, + "frame": {"x":1403,"y":1554,"w":82,"h":82}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":82,"h":82}, @@ -578,7 +610,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":183,"y":1702,"w":80,"h":96}, + "frame": {"x":1024,"y":1369,"w":80,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":80,"h":96}, @@ -586,7 +618,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":3,"y":1702,"w":176,"h":86}, + "frame": {"x":724,"y":1565,"w":176,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":4,"w":176,"h":86}, @@ -594,7 +626,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":1844,"y":524,"w":24,"h":32}, + "frame": {"x":1052,"y":1669,"w":24,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":24,"h":32}, @@ -605,8 +637,8 @@ "version": "1.0", "image": "atlas0_100.png", "format": "RGBA8888", - "size": {"w":1997,"h":1801}, + "size": {"w":2014,"h":1857}, "scale": "1", - "smartupdate": "$TexturePacker:SmartUpdate:3dd7a89f30024dd4787ad4af6b14588a:9ba11f8b02134c4376ab4e0a44f8b850:f159918d23e5952766c6d23ab52278c6$" + "smartupdate": "$TexturePacker:SmartUpdate:8985524bba1a3f16cecab3c03b6aaa06:d614d20bfce033d8a8ab0990af085d16:f159918d23e5952766c6d23ab52278c6$" } } diff --git a/res_built/atlas/atlas0_100.png b/res_built/atlas/atlas0_100.png index 570464fe..181adc30 100644 Binary files a/res_built/atlas/atlas0_100.png and b/res_built/atlas/atlas0_100.png differ diff --git a/res_built/atlas/atlas0_25.json b/res_built/atlas/atlas0_25.json index 2969f3de..a4aac8ed 100644 --- a/res_built/atlas/atlas0_25.json +++ b/res_built/atlas/atlas0_25.json @@ -2,7 +2,7 @@ "sprites/belt/forward_0.png": { - "frame": {"x":479,"y":103,"w":28,"h":32}, + "frame": {"x":3,"y":1010,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -10,7 +10,7 @@ }, "sprites/belt/forward_1.png": { - "frame": {"x":479,"y":139,"w":28,"h":32}, + "frame": {"x":3,"y":967,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -18,7 +18,7 @@ }, "sprites/belt/forward_2.png": { - "frame": {"x":479,"y":175,"w":28,"h":32}, + "frame": {"x":3,"y":1046,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -26,7 +26,7 @@ }, "sprites/belt/forward_3.png": { - "frame": {"x":262,"y":331,"w":28,"h":32}, + "frame": {"x":35,"y":1044,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -34,7 +34,7 @@ }, "sprites/belt/forward_4.png": { - "frame": {"x":285,"y":383,"w":28,"h":32}, + "frame": {"x":67,"y":1044,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -42,7 +42,7 @@ }, "sprites/belt/forward_5.png": { - "frame": {"x":317,"y":383,"w":28,"h":32}, + "frame": {"x":133,"y":1053,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -50,7 +50,7 @@ }, "sprites/belt/left_0.png": { - "frame": {"x":343,"y":159,"w":30,"h":30}, + "frame": {"x":143,"y":883,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -58,7 +58,7 @@ }, "sprites/belt/left_1.png": { - "frame": {"x":343,"y":193,"w":30,"h":30}, + "frame": {"x":143,"y":917,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -66,7 +66,7 @@ }, "sprites/belt/left_2.png": { - "frame": {"x":477,"y":211,"w":30,"h":30}, + "frame": {"x":143,"y":951,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -74,7 +74,7 @@ }, "sprites/belt/left_3.png": { - "frame": {"x":477,"y":245,"w":30,"h":30}, + "frame": {"x":35,"y":960,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -82,7 +82,7 @@ }, "sprites/belt/left_4.png": { - "frame": {"x":469,"y":279,"w":30,"h":30}, + "frame": {"x":69,"y":967,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -90,7 +90,7 @@ }, "sprites/belt/left_5.png": { - "frame": {"x":3,"y":331,"w":30,"h":30}, + "frame": {"x":35,"y":994,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -98,7 +98,7 @@ }, "sprites/belt/right_0.png": { - "frame": {"x":37,"y":331,"w":30,"h":30}, + "frame": {"x":103,"y":967,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -106,7 +106,7 @@ }, "sprites/belt/right_1.png": { - "frame": {"x":71,"y":331,"w":30,"h":30}, + "frame": {"x":137,"y":985,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -114,7 +114,7 @@ }, "sprites/belt/right_2.png": { - "frame": {"x":3,"y":296,"w":30,"h":30}, + "frame": {"x":171,"y":997,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -122,7 +122,7 @@ }, "sprites/belt/right_3.png": { - "frame": {"x":37,"y":296,"w":30,"h":30}, + "frame": {"x":205,"y":1010,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -130,7 +130,7 @@ }, "sprites/belt/right_4.png": { - "frame": {"x":71,"y":296,"w":30,"h":30}, + "frame": {"x":99,"y":1001,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -138,7 +138,7 @@ }, "sprites/belt/right_5.png": { - "frame": {"x":105,"y":331,"w":30,"h":30}, + "frame": {"x":133,"y":1019,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -146,7 +146,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":139,"y":331,"w":30,"h":30}, + "frame": {"x":99,"y":1035,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -154,7 +154,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":173,"y":331,"w":30,"h":30}, + "frame": {"x":167,"y":1031,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -162,7 +162,7 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":467,"y":416,"w":28,"h":32}, + "frame": {"x":201,"y":1044,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -170,7 +170,7 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":191,"y":55,"w":184,"h":48}, + "frame": {"x":3,"y":296,"w":184,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, @@ -178,7 +178,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":95,"y":244,"w":87,"h":48}, + "frame": {"x":155,"y":419,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -186,7 +186,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":262,"y":419,"w":47,"h":48}, + "frame": {"x":195,"y":3,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -194,7 +194,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":313,"y":419,"w":47,"h":48}, + "frame": {"x":195,"y":55,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -202,7 +202,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":191,"y":211,"w":89,"h":48}, + "frame": {"x":3,"y":808,"w":89,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, @@ -210,12 +210,20 @@ }, "sprites/blueprints/painter-double.png": { - "frame": {"x":387,"y":3,"w":96,"h":96}, + "frame": {"x":3,"y":400,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/blueprints/painter-mirrored.png": +{ + "frame": {"x":3,"y":600,"w":96,"h":48}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, + "sourceSize": {"w":96,"h":48} +}, "sprites/blueprints/painter-quad.png": { "frame": {"x":3,"y":3,"w":188,"h":48}, @@ -226,7 +234,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":191,"y":159,"w":96,"h":48}, + "frame": {"x":3,"y":652,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -234,7 +242,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":291,"y":159,"w":48,"h":48}, + "frame": {"x":191,"y":107,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -242,7 +250,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":459,"y":313,"w":48,"h":48}, + "frame": {"x":191,"y":159,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -250,7 +258,7 @@ }, "sprites/blueprints/splitter-compact-inverse.png": { - "frame": {"x":210,"y":315,"w":48,"h":48}, + "frame": {"x":191,"y":211,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -258,7 +266,7 @@ }, "sprites/blueprints/splitter-compact.png": { - "frame": {"x":415,"y":416,"w":47,"h":47}, + "frame": {"x":103,"y":780,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -266,7 +274,7 @@ }, "sprites/blueprints/splitter.png": { - "frame": {"x":186,"y":263,"w":87,"h":48}, + "frame": {"x":155,"y":471,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -274,7 +282,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":284,"y":227,"w":89,"h":48}, + "frame": {"x":96,"y":831,"w":89,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, @@ -282,7 +290,7 @@ }, "sprites/blueprints/trash-storage.png": { - "frame": {"x":3,"y":365,"w":85,"h":96}, + "frame": {"x":155,"y":627,"w":85,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, @@ -290,7 +298,7 @@ }, "sprites/blueprints/trash.png": { - "frame": {"x":181,"y":391,"w":48,"h":48}, + "frame": {"x":191,"y":263,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -298,7 +306,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":3,"y":465,"w":48,"h":43}, + "frame": {"x":103,"y":503,"w":48,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":48,"h":43}, @@ -306,7 +314,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":106,"y":465,"w":48,"h":38}, + "frame": {"x":103,"y":550,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":10,"w":48,"h":38}, @@ -314,7 +322,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":158,"y":465,"w":48,"h":38}, + "frame": {"x":103,"y":592,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, @@ -322,7 +330,7 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":262,"y":471,"w":48,"h":38}, + "frame": {"x":103,"y":634,"w":48,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, @@ -330,7 +338,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":343,"y":159,"w":30,"h":30}, + "frame": {"x":143,"y":883,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, @@ -338,7 +346,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":37,"y":331,"w":30,"h":30}, + "frame": {"x":103,"y":967,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, @@ -346,7 +354,7 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":479,"y":103,"w":28,"h":32}, + "frame": {"x":3,"y":1010,"w":28,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, @@ -354,7 +362,7 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":191,"y":107,"w":184,"h":48}, + "frame": {"x":3,"y":348,"w":184,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, @@ -362,7 +370,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":277,"y":279,"w":87,"h":48}, + "frame": {"x":155,"y":523,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -370,7 +378,7 @@ }, "sprites/buildings/hub.png": { - "frame": {"x":3,"y":55,"w":184,"h":185}, + "frame": {"x":3,"y":107,"w":184,"h":185}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":184,"h":185}, @@ -378,7 +386,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":349,"y":365,"w":47,"h":48}, + "frame": {"x":103,"y":676,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -386,7 +394,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":364,"y":417,"w":47,"h":48}, + "frame": {"x":103,"y":728,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, @@ -394,7 +402,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":377,"y":255,"w":88,"h":48}, + "frame": {"x":154,"y":727,"w":88,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, @@ -402,15 +410,23 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":379,"y":103,"w":96,"h":96}, + "frame": {"x":3,"y":500,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "sourceSize": {"w":96,"h":96} }, +"sprites/buildings/painter-mirrored.png": +{ + "frame": {"x":3,"y":704,"w":96,"h":48}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, + "sourceSize": {"w":96,"h":48} +}, "sprites/buildings/painter-quad.png": { - "frame": {"x":195,"y":3,"w":188,"h":48}, + "frame": {"x":3,"y":55,"w":188,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, @@ -418,7 +434,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":377,"y":203,"w":96,"h":48}, + "frame": {"x":3,"y":756,"w":96,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, @@ -426,7 +442,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":210,"y":443,"w":48,"h":48}, + "frame": {"x":191,"y":315,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -434,7 +450,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":233,"y":367,"w":48,"h":48}, + "frame": {"x":191,"y":367,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -442,7 +458,7 @@ }, "sprites/buildings/splitter-compact-inverse.png": { - "frame": {"x":400,"y":365,"w":48,"h":47}, + "frame": {"x":103,"y":452,"w":48,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, @@ -450,7 +466,7 @@ }, "sprites/buildings/splitter-compact.png": { - "frame": {"x":452,"y":365,"w":47,"h":47}, + "frame": {"x":189,"y":831,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, @@ -458,7 +474,7 @@ }, "sprites/buildings/splitter.png": { - "frame": {"x":368,"y":307,"w":87,"h":48}, + "frame": {"x":155,"y":575,"w":87,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, @@ -466,7 +482,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":3,"y":244,"w":88,"h":48}, + "frame": {"x":154,"y":779,"w":88,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, @@ -474,7 +490,7 @@ }, "sprites/buildings/trash-storage.png": { - "frame": {"x":92,"y":365,"w":85,"h":96}, + "frame": {"x":3,"y":860,"w":85,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, @@ -482,7 +498,7 @@ }, "sprites/buildings/trash.png": { - "frame": {"x":294,"y":331,"w":48,"h":48}, + "frame": {"x":103,"y":400,"w":48,"h":48}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, @@ -490,7 +506,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":55,"y":465,"w":47,"h":42}, + "frame": {"x":189,"y":882,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":6,"w":47,"h":42}, @@ -498,7 +514,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":314,"y":471,"w":47,"h":38}, + "frame": {"x":92,"y":883,"w":47,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":10,"w":47,"h":38}, @@ -506,7 +522,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":365,"y":469,"w":47,"h":38}, + "frame": {"x":92,"y":925,"w":47,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, @@ -514,7 +530,7 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":416,"y":467,"w":47,"h":38}, + "frame": {"x":189,"y":928,"w":47,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, @@ -522,7 +538,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":487,"y":3,"w":14,"h":16}, + "frame": {"x":226,"y":970,"w":14,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, @@ -530,7 +546,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":487,"y":23,"w":14,"h":16}, + "frame": {"x":226,"y":990,"w":14,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, @@ -538,7 +554,7 @@ }, "sprites/map_overview/belt_forward.png": { - "frame": {"x":487,"y":43,"w":8,"h":8}, + "frame": {"x":171,"y":400,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -546,7 +562,7 @@ }, "sprites/map_overview/belt_left.png": { - "frame": {"x":499,"y":43,"w":8,"h":8}, + "frame": {"x":177,"y":883,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -554,7 +570,7 @@ }, "sprites/map_overview/belt_right.png": { - "frame": {"x":487,"y":55,"w":8,"h":8}, + "frame": {"x":177,"y":895,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -562,15 +578,31 @@ }, "sprites/misc/deletion_marker.png": { - "frame": {"x":181,"y":365,"w":22,"h":22}, + "frame": {"x":165,"y":1065,"w":22,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, "sourceSize": {"w":24,"h":24} }, +"sprites/misc/hub_direction_indicator.png": +{ + "frame": {"x":177,"y":907,"w":8,"h":8}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, + "sourceSize": {"w":8,"h":8} +}, +"sprites/misc/lock_direction_indicator.png": +{ + "frame": {"x":155,"y":400,"w":12,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":12,"h":10}, + "sourceSize": {"w":12,"h":12} +}, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":181,"y":365,"w":22,"h":22}, + "frame": {"x":165,"y":1065,"w":22,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, @@ -578,7 +610,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":105,"y":296,"w":22,"h":24}, + "frame": {"x":69,"y":1001,"w":22,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, @@ -586,7 +618,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":131,"y":296,"w":45,"h":23}, + "frame": {"x":177,"y":970,"w":45,"h":23}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":45,"h":23}, @@ -594,7 +626,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":499,"y":55,"w":8,"h":8}, + "frame": {"x":177,"y":919,"w":8,"h":8}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, @@ -605,8 +637,8 @@ "version": "1.0", "image": "atlas0_25.png", "format": "RGBA8888", - "size": {"w":510,"h":512}, + "size": {"w":245,"h":1090}, "scale": "0.25", - "smartupdate": "$TexturePacker:SmartUpdate:3dd7a89f30024dd4787ad4af6b14588a:9ba11f8b02134c4376ab4e0a44f8b850:f159918d23e5952766c6d23ab52278c6$" + "smartupdate": "$TexturePacker:SmartUpdate:8985524bba1a3f16cecab3c03b6aaa06:d614d20bfce033d8a8ab0990af085d16:f159918d23e5952766c6d23ab52278c6$" } } diff --git a/res_built/atlas/atlas0_25.png b/res_built/atlas/atlas0_25.png index c7c7041e..4581d71d 100644 Binary files a/res_built/atlas/atlas0_25.png and b/res_built/atlas/atlas0_25.png differ diff --git a/res_built/atlas/atlas0_50.json b/res_built/atlas/atlas0_50.json index 8fd9b5ba..f31bbb3d 100644 --- a/res_built/atlas/atlas0_50.json +++ b/res_built/atlas/atlas0_50.json @@ -2,7 +2,7 @@ "sprites/belt/forward_0.png": { - "frame": {"x":49,"y":1765,"w":51,"h":63}, + "frame": {"x":1966,"y":3,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -10,7 +10,7 @@ }, "sprites/belt/forward_1.png": { - "frame": {"x":3,"y":1902,"w":51,"h":63}, + "frame": {"x":1835,"y":203,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -18,7 +18,7 @@ }, "sprites/belt/forward_2.png": { - "frame": {"x":58,"y":1902,"w":51,"h":63}, + "frame": {"x":1879,"y":304,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -26,7 +26,7 @@ }, "sprites/belt/forward_3.png": { - "frame": {"x":113,"y":1887,"w":51,"h":63}, + "frame": {"x":1934,"y":304,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -34,7 +34,7 @@ }, "sprites/belt/forward_4.png": { - "frame": {"x":168,"y":1830,"w":51,"h":63}, + "frame": {"x":1844,"y":381,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -42,7 +42,7 @@ }, "sprites/belt/forward_5.png": { - "frame": {"x":168,"y":1897,"w":51,"h":63}, + "frame": {"x":1899,"y":371,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -50,7 +50,7 @@ }, "sprites/belt/left_0.png": { - "frame": {"x":104,"y":1765,"w":57,"h":57}, + "frame": {"x":1890,"y":243,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -58,7 +58,7 @@ }, "sprites/belt/left_1.png": { - "frame": {"x":165,"y":1769,"w":57,"h":57}, + "frame": {"x":1951,"y":243,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -66,7 +66,7 @@ }, "sprites/belt/left_2.png": { - "frame": {"x":104,"y":1826,"w":57,"h":57}, + "frame": {"x":1783,"y":381,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -74,7 +74,7 @@ }, "sprites/belt/left_3.png": { - "frame": {"x":226,"y":1782,"w":57,"h":57}, + "frame": {"x":1954,"y":371,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -82,7 +82,7 @@ }, "sprites/belt/left_4.png": { - "frame": {"x":287,"y":1782,"w":57,"h":57}, + "frame": {"x":1954,"y":432,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -90,7 +90,7 @@ }, "sprites/belt/left_5.png": { - "frame": {"x":348,"y":1835,"w":57,"h":57}, + "frame": {"x":1363,"y":403,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -98,7 +98,7 @@ }, "sprites/belt/right_0.png": { - "frame": {"x":409,"y":1835,"w":57,"h":57}, + "frame": {"x":1424,"y":403,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -106,7 +106,7 @@ }, "sprites/belt/right_1.png": { - "frame": {"x":223,"y":1896,"w":57,"h":57}, + "frame": {"x":1485,"y":403,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -114,7 +114,7 @@ }, "sprites/belt/right_2.png": { - "frame": {"x":284,"y":1843,"w":57,"h":57}, + "frame": {"x":1546,"y":403,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -122,7 +122,7 @@ }, "sprites/belt/right_3.png": { - "frame": {"x":284,"y":1904,"w":57,"h":57}, + "frame": {"x":1607,"y":402,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -130,7 +130,7 @@ }, "sprites/belt/right_4.png": { - "frame": {"x":345,"y":1896,"w":57,"h":57}, + "frame": {"x":1668,"y":402,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -138,7 +138,7 @@ }, "sprites/belt/right_5.png": { - "frame": {"x":406,"y":1896,"w":57,"h":57}, + "frame": {"x":1952,"y":181,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -146,7 +146,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":178,"y":1707,"w":58,"h":58}, + "frame": {"x":1301,"y":400,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":58,"h":58}, @@ -154,7 +154,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":370,"y":1773,"w":58,"h":58}, + "frame": {"x":1890,"y":181,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":58,"h":58}, @@ -162,7 +162,7 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":3,"y":1835,"w":53,"h":63}, + "frame": {"x":1151,"y":403,"w":53,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":53,"h":63}, @@ -170,7 +170,7 @@ }, "sprites/blueprints/cutter-quad.png": { - "frame": {"x":3,"y":574,"w":366,"h":96}, + "frame": {"x":3,"y":374,"w":366,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, @@ -178,7 +178,7 @@ }, "sprites/blueprints/cutter.png": { - "frame": {"x":3,"y":1465,"w":172,"h":96}, + "frame": {"x":1285,"y":203,"w":172,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":172,"h":96}, @@ -186,7 +186,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":179,"y":1507,"w":92,"h":96}, + "frame": {"x":1401,"y":303,"w":92,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, @@ -194,7 +194,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":178,"y":1607,"w":92,"h":96}, + "frame": {"x":1497,"y":303,"w":92,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, @@ -202,7 +202,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":296,"y":1217,"w":175,"h":96}, + "frame": {"x":1143,"y":103,"w":175,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, @@ -210,15 +210,23 @@ }, "sprites/blueprints/painter-double.png": { - "frame": {"x":3,"y":774,"w":192,"h":192}, + "frame": {"x":373,"y":203,"w":192,"h":192}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":192}, "sourceSize": {"w":192,"h":192} }, +"sprites/blueprints/painter-mirrored.png": +{ + "frame": {"x":751,"y":103,"w":192,"h":96}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, + "sourceSize": {"w":192,"h":96} +}, "sprites/blueprints/painter-quad.png": { - "frame": {"x":3,"y":3,"w":374,"h":96}, + "frame": {"x":373,"y":3,"w":374,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, @@ -226,7 +234,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":3,"y":1165,"w":192,"h":96}, + "frame": {"x":1121,"y":3,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -234,7 +242,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":373,"y":249,"w":96,"h":96}, + "frame": {"x":1866,"y":3,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -242,7 +250,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":373,"y":349,"w":96,"h":96}, + "frame": {"x":1675,"y":103,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -250,7 +258,7 @@ }, "sprites/blueprints/splitter-compact-inverse.png": { - "frame": {"x":370,"y":849,"w":95,"h":93}, + "frame": {"x":1205,"y":303,"w":95,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, @@ -258,7 +266,7 @@ }, "sprites/blueprints/splitter-compact.png": { - "frame": {"x":369,"y":1120,"w":93,"h":93}, + "frame": {"x":1304,"y":303,"w":93,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, @@ -266,7 +274,7 @@ }, "sprites/blueprints/splitter.png": { - "frame": {"x":3,"y":1565,"w":171,"h":96}, + "frame": {"x":1691,"y":3,"w":171,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, @@ -274,7 +282,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":296,"y":1317,"w":175,"h":96}, + "frame": {"x":1106,"y":203,"w":175,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, @@ -282,7 +290,7 @@ }, "sprites/blueprints/trash-storage.png": { - "frame": {"x":199,"y":774,"w":167,"h":192}, + "frame": {"x":765,"y":203,"w":167,"h":192}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":167,"h":192}, @@ -290,7 +298,7 @@ }, "sprites/blueprints/trash.png": { - "frame": {"x":373,"y":449,"w":96,"h":96}, + "frame": {"x":1636,"y":203,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -298,7 +306,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":199,"y":1261,"w":93,"h":84}, + "frame": {"x":764,"y":399,"w":93,"h":84}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":12,"w":93,"h":84}, @@ -306,7 +314,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":199,"y":1349,"w":93,"h":75}, + "frame": {"x":373,"y":399,"w":93,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":21,"w":93,"h":75}, @@ -314,7 +322,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":369,"y":1041,"w":94,"h":75}, + "frame": {"x":957,"y":399,"w":94,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":94,"h":75}, @@ -322,7 +330,7 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":181,"y":1428,"w":93,"h":75}, + "frame": {"x":470,"y":399,"w":93,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":93,"h":75}, @@ -330,7 +338,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":104,"y":1765,"w":57,"h":57}, + "frame": {"x":1890,"y":243,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, @@ -338,7 +346,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":409,"y":1835,"w":57,"h":57}, + "frame": {"x":1424,"y":403,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, @@ -346,7 +354,7 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":49,"y":1765,"w":51,"h":63}, + "frame": {"x":1966,"y":3,"w":51,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, @@ -354,7 +362,7 @@ }, "sprites/buildings/cutter-quad.png": { - "frame": {"x":3,"y":674,"w":366,"h":96}, + "frame": {"x":751,"y":3,"w":366,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, @@ -362,7 +370,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":275,"y":1517,"w":171,"h":96}, + "frame": {"x":1500,"y":103,"w":171,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, @@ -370,7 +378,7 @@ }, "sprites/buildings/hub.png": { - "frame": {"x":3,"y":203,"w":366,"h":367}, + "frame": {"x":3,"y":3,"w":366,"h":367}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":10,"w":366,"h":367}, @@ -378,7 +386,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":381,"y":3,"w":91,"h":95}, + "frame": {"x":1593,"y":303,"w":91,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, @@ -386,7 +394,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":381,"y":102,"w":91,"h":95}, + "frame": {"x":1688,"y":303,"w":91,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, @@ -394,7 +402,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":296,"y":1417,"w":174,"h":96}, + "frame": {"x":1513,"y":3,"w":174,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, @@ -402,15 +410,23 @@ }, "sprites/buildings/painter-double.png": { - "frame": {"x":3,"y":970,"w":192,"h":191}, + "frame": {"x":569,"y":203,"w":192,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":191}, "sourceSize": {"w":192,"h":192} }, +"sprites/buildings/painter-mirrored.png": +{ + "frame": {"x":947,"y":103,"w":192,"h":96}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, + "sourceSize": {"w":192,"h":96} +}, "sprites/buildings/painter-quad.png": { - "frame": {"x":3,"y":103,"w":374,"h":96}, + "frame": {"x":373,"y":103,"w":374,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, @@ -418,7 +434,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":3,"y":1265,"w":192,"h":96}, + "frame": {"x":1317,"y":3,"w":192,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, @@ -426,7 +442,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":373,"y":649,"w":95,"h":96}, + "frame": {"x":1736,"y":203,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -434,7 +450,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":373,"y":749,"w":95,"h":96}, + "frame": {"x":1106,"y":303,"w":95,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, @@ -442,7 +458,7 @@ }, "sprites/buildings/splitter-compact-inverse.png": { - "frame": {"x":370,"y":946,"w":94,"h":91}, + "frame": {"x":569,"y":398,"w":94,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":94,"h":91}, @@ -450,7 +466,7 @@ }, "sprites/buildings/splitter-compact.png": { - "frame": {"x":199,"y":1166,"w":93,"h":91}, + "frame": {"x":667,"y":398,"w":93,"h":91}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, @@ -458,7 +474,7 @@ }, "sprites/buildings/splitter.png": { - "frame": {"x":3,"y":1665,"w":171,"h":96}, + "frame": {"x":1461,"y":203,"w":171,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, @@ -466,7 +482,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":3,"y":1365,"w":174,"h":96}, + "frame": {"x":1322,"y":103,"w":174,"h":96}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, @@ -474,7 +490,7 @@ }, "sprites/buildings/trash-storage.png": { - "frame": {"x":199,"y":970,"w":166,"h":192}, + "frame": {"x":936,"y":203,"w":166,"h":192}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":166,"h":192}, @@ -482,7 +498,7 @@ }, "sprites/buildings/trash.png": { - "frame": {"x":373,"y":549,"w":96,"h":96}, + "frame": {"x":1775,"y":103,"w":96,"h":96}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, @@ -490,7 +506,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":274,"y":1617,"w":92,"h":83}, + "frame": {"x":861,"y":399,"w":92,"h":83}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":13,"w":92,"h":83}, @@ -498,7 +514,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":370,"y":1617,"w":92,"h":74}, + "frame": {"x":1875,"y":103,"w":92,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":22,"w":92,"h":74}, @@ -506,7 +522,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":370,"y":1695,"w":92,"h":74}, + "frame": {"x":1783,"y":303,"w":92,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, @@ -514,7 +530,7 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":274,"y":1704,"w":92,"h":74}, + "frame": {"x":1055,"y":403,"w":92,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, @@ -522,7 +538,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":240,"y":1707,"w":26,"h":32}, + "frame": {"x":1989,"y":304,"w":26,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32}, @@ -530,7 +546,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":240,"y":1743,"w":26,"h":32}, + "frame": {"x":1971,"y":116,"w":26,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32}, @@ -538,7 +554,7 @@ }, "sprites/map_overview/belt_forward.png": { - "frame": {"x":181,"y":1365,"w":14,"h":16}, + "frame": {"x":1835,"y":270,"w":14,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, @@ -546,7 +562,7 @@ }, "sprites/map_overview/belt_left.png": { - "frame": {"x":342,"y":1166,"w":15,"h":15}, + "frame": {"x":3,"y":474,"w":15,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":15,"h":15}, @@ -554,7 +570,7 @@ }, "sprites/map_overview/belt_right.png": { - "frame": {"x":342,"y":1185,"w":15,"h":15}, + "frame": {"x":22,"y":474,"w":15,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":15,"h":15}, @@ -562,15 +578,31 @@ }, "sprites/misc/deletion_marker.png": { - "frame": {"x":296,"y":1166,"w":42,"h":42}, + "frame": {"x":1971,"y":70,"w":42,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":42,"h":42}, "sourceSize": {"w":48,"h":48} }, +"sprites/misc/hub_direction_indicator.png": +{ + "frame": {"x":2001,"y":116,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"sprites/misc/lock_direction_indicator.png": +{ + "frame": {"x":1208,"y":448,"w":24,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":24,"h":16}, + "sourceSize": {"w":24,"h":24} +}, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":296,"y":1166,"w":42,"h":42}, + "frame": {"x":1971,"y":70,"w":42,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":42,"h":42}, @@ -578,7 +610,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":3,"y":1782,"w":42,"h":48}, + "frame": {"x":1729,"y":402,"w":42,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":42,"h":48}, @@ -586,7 +618,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":381,"y":201,"w":89,"h":44}, + "frame": {"x":1208,"y":400,"w":89,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":89,"h":44}, @@ -594,7 +626,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":181,"y":1385,"w":14,"h":16}, + "frame": {"x":1989,"y":340,"w":14,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, @@ -605,8 +637,8 @@ "version": "1.0", "image": "atlas0_50.png", "format": "RGBA8888", - "size": {"w":475,"h":1968}, + "size": {"w":2020,"h":492}, "scale": "0.5", - "smartupdate": "$TexturePacker:SmartUpdate:3dd7a89f30024dd4787ad4af6b14588a:9ba11f8b02134c4376ab4e0a44f8b850:f159918d23e5952766c6d23ab52278c6$" + "smartupdate": "$TexturePacker:SmartUpdate:8985524bba1a3f16cecab3c03b6aaa06:d614d20bfce033d8a8ab0990af085d16:f159918d23e5952766c6d23ab52278c6$" } } diff --git a/res_built/atlas/atlas0_50.png b/res_built/atlas/atlas0_50.png index ea864923..60e1f644 100644 Binary files a/res_built/atlas/atlas0_50.png and b/res_built/atlas/atlas0_50.png differ diff --git a/res_built/atlas/atlas0_75.json b/res_built/atlas/atlas0_75.json index 23042b66..392448be 100644 --- a/res_built/atlas/atlas0_75.json +++ b/res_built/atlas/atlas0_75.json @@ -2,7 +2,7 @@ "sprites/belt/forward_0.png": { - "frame": {"x":1936,"y":151,"w":77,"h":95}, + "frame": {"x":1963,"y":102,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -10,7 +10,7 @@ }, "sprites/belt/forward_1.png": { - "frame": {"x":1936,"y":250,"w":77,"h":95}, + "frame": {"x":1963,"y":201,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -18,7 +18,7 @@ }, "sprites/belt/forward_2.png": { - "frame": {"x":1600,"y":708,"w":77,"h":95}, + "frame": {"x":1967,"y":300,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -26,7 +26,7 @@ }, "sprites/belt/forward_3.png": { - "frame": {"x":1544,"y":808,"w":77,"h":95}, + "frame": {"x":1967,"y":399,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -34,7 +34,7 @@ }, "sprites/belt/forward_4.png": { - "frame": {"x":1625,"y":807,"w":77,"h":95}, + "frame": {"x":1967,"y":498,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -42,7 +42,7 @@ }, "sprites/belt/forward_5.png": { - "frame": {"x":1544,"y":907,"w":77,"h":95}, + "frame": {"x":1679,"y":952,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -50,7 +50,7 @@ }, "sprites/belt/left_0.png": { - "frame": {"x":1680,"y":593,"w":86,"h":86}, + "frame": {"x":1217,"y":969,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -58,7 +58,7 @@ }, "sprites/belt/left_1.png": { - "frame": {"x":1770,"y":592,"w":86,"h":86}, + "frame": {"x":1307,"y":969,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -66,7 +66,7 @@ }, "sprites/belt/left_2.png": { - "frame": {"x":1860,"y":592,"w":86,"h":86}, + "frame": {"x":1916,"y":597,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -74,7 +74,7 @@ }, "sprites/belt/left_3.png": { - "frame": {"x":1681,"y":683,"w":86,"h":86}, + "frame": {"x":1916,"y":687,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -82,7 +82,7 @@ }, "sprites/belt/left_4.png": { - "frame": {"x":1771,"y":682,"w":86,"h":86}, + "frame": {"x":1916,"y":777,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -90,7 +90,7 @@ }, "sprites/belt/left_5.png": { - "frame": {"x":1861,"y":682,"w":86,"h":86}, + "frame": {"x":1914,"y":867,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -98,7 +98,7 @@ }, "sprites/belt/right_0.png": { - "frame": {"x":1706,"y":773,"w":86,"h":86}, + "frame": {"x":1499,"y":852,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -106,7 +106,7 @@ }, "sprites/belt/right_1.png": { - "frame": {"x":1796,"y":772,"w":86,"h":86}, + "frame": {"x":1397,"y":967,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -114,7 +114,7 @@ }, "sprites/belt/right_2.png": { - "frame": {"x":1886,"y":772,"w":86,"h":86}, + "frame": {"x":1589,"y":862,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -122,7 +122,7 @@ }, "sprites/belt/right_3.png": { - "frame": {"x":1716,"y":863,"w":86,"h":86}, + "frame": {"x":1679,"y":862,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -130,7 +130,7 @@ }, "sprites/belt/right_4.png": { - "frame": {"x":1806,"y":862,"w":86,"h":86}, + "frame": {"x":1499,"y":942,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -138,7 +138,7 @@ }, "sprites/belt/right_5.png": { - "frame": {"x":1896,"y":862,"w":86,"h":86}, + "frame": {"x":1589,"y":952,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -146,7 +146,7 @@ }, "sprites/blueprints/belt_left.png": { - "frame": {"x":1924,"y":349,"w":87,"h":87}, + "frame": {"x":1397,"y":593,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":8,"w":87,"h":87}, @@ -154,7 +154,7 @@ }, "sprites/blueprints/belt_right.png": { - "frame": {"x":1625,"y":906,"w":87,"h":87}, + "frame": {"x":1397,"y":684,"w":87,"h":87}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":87,"h":87}, @@ -162,7 +162,7 @@ }, "sprites/blueprints/belt_top.png": { - "frame": {"x":1517,"y":709,"w":79,"h":95}, + "frame": {"x":1963,"y":3,"w":79,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":79,"h":95}, @@ -186,7 +186,7 @@ }, "sprites/blueprints/miner-chainable.png": { - "frame": {"x":1784,"y":299,"w":136,"h":143}, + "frame": {"x":1827,"y":447,"w":136,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143}, @@ -194,7 +194,7 @@ }, "sprites/blueprints/miner.png": { - "frame": {"x":1544,"y":446,"w":136,"h":143}, + "frame": {"x":1076,"y":739,"w":136,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143}, @@ -202,7 +202,7 @@ }, "sprites/blueprints/mixer.png": { - "frame": {"x":1671,"y":151,"w":261,"h":144}, + "frame": {"x":547,"y":738,"w":261,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144}, @@ -216,6 +216,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":288,"h":287}, "sourceSize": {"w":288,"h":288} }, +"sprites/blueprints/painter-mirrored.png": +{ + "frame": {"x":1119,"y":150,"w":288,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, + "sourceSize": {"w":288,"h":144} +}, "sprites/blueprints/painter-quad.png": { "frame": {"x":555,"y":3,"w":560,"h":144}, @@ -226,7 +234,7 @@ }, "sprites/blueprints/painter.png": { - "frame": {"x":1119,"y":150,"w":288,"h":144}, + "frame": {"x":1671,"y":3,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -234,7 +242,7 @@ }, "sprites/blueprints/rotater-ccw.png": { - "frame": {"x":1397,"y":445,"w":143,"h":144}, + "frame": {"x":1639,"y":299,"w":143,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, @@ -242,7 +250,7 @@ }, "sprites/blueprints/rotater.png": { - "frame": {"x":1084,"y":594,"w":143,"h":144}, + "frame": {"x":1786,"y":299,"w":143,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144}, @@ -250,7 +258,7 @@ }, "sprites/blueprints/splitter-compact-inverse.png": { - "frame": {"x":1071,"y":742,"w":142,"h":138}, + "frame": {"x":1071,"y":886,"w":142,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138}, @@ -258,7 +266,7 @@ }, "sprites/blueprints/splitter-compact.png": { - "frame": {"x":1217,"y":742,"w":139,"h":138}, + "frame": {"x":1488,"y":594,"w":139,"h":138}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138}, @@ -266,7 +274,7 @@ }, "sprites/blueprints/splitter.png": { - "frame": {"x":1119,"y":298,"w":256,"h":144}, + "frame": {"x":811,"y":886,"w":256,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":256,"h":144}, @@ -274,7 +282,7 @@ }, "sprites/blueprints/stacker.png": { - "frame": {"x":555,"y":590,"w":261,"h":144}, + "frame": {"x":847,"y":591,"w":261,"h":144}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144}, @@ -290,7 +298,7 @@ }, "sprites/blueprints/trash.png": { - "frame": {"x":1101,"y":446,"w":144,"h":144}, + "frame": {"x":1241,"y":445,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -298,7 +306,7 @@ }, "sprites/blueprints/underground_belt_entry-tier2.png": { - "frame": {"x":835,"y":885,"w":138,"h":125}, + "frame": {"x":1774,"y":594,"w":138,"h":125}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":19,"w":138,"h":125}, @@ -306,7 +314,7 @@ }, "sprites/blueprints/underground_belt_entry.png": { - "frame": {"x":1261,"y":884,"w":138,"h":112}, + "frame": {"x":1774,"y":723,"w":138,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":32,"w":138,"h":112}, @@ -314,7 +322,7 @@ }, "sprites/blueprints/underground_belt_exit-tier2.png": { - "frame": {"x":1118,"y":884,"w":139,"h":112}, + "frame": {"x":1488,"y":736,"w":139,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":139,"h":112}, @@ -322,7 +330,7 @@ }, "sprites/blueprints/underground_belt_exit.png": { - "frame": {"x":1397,"y":593,"w":138,"h":112}, + "frame": {"x":1772,"y":839,"w":138,"h":112}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":138,"h":112}, @@ -330,7 +338,7 @@ }, "sprites/buildings/belt_left.png": { - "frame": {"x":1680,"y":593,"w":86,"h":86}, + "frame": {"x":1217,"y":969,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":9,"w":86,"h":86}, @@ -338,7 +346,7 @@ }, "sprites/buildings/belt_right.png": { - "frame": {"x":1706,"y":773,"w":86,"h":86}, + "frame": {"x":1499,"y":852,"w":86,"h":86}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":86,"h":86}, @@ -346,7 +354,7 @@ }, "sprites/buildings/belt_top.png": { - "frame": {"x":1936,"y":151,"w":77,"h":95}, + "frame": {"x":1963,"y":102,"w":77,"h":95}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":77,"h":95}, @@ -362,7 +370,7 @@ }, "sprites/buildings/cutter.png": { - "frame": {"x":811,"y":738,"w":256,"h":143}, + "frame": {"x":1119,"y":298,"w":256,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":256,"h":143}, @@ -378,7 +386,7 @@ }, "sprites/buildings/miner-chainable.png": { - "frame": {"x":1684,"y":446,"w":136,"h":142}, + "frame": {"x":1101,"y":445,"w":136,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, @@ -386,7 +394,7 @@ }, "sprites/buildings/miner.png": { - "frame": {"x":1824,"y":446,"w":136,"h":142}, + "frame": {"x":1112,"y":593,"w":136,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142}, @@ -394,7 +402,7 @@ }, "sprites/buildings/mixer.png": { - "frame": {"x":547,"y":738,"w":260,"h":143}, + "frame": {"x":812,"y":739,"w":260,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143}, @@ -408,6 +416,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":288,"h":286}, "sourceSize": {"w":288,"h":288} }, +"sprites/buildings/painter-mirrored.png": +{ + "frame": {"x":1671,"y":151,"w":288,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, + "sourceSize": {"w":288,"h":144} +}, "sprites/buildings/painter-quad.png": { "frame": {"x":555,"y":151,"w":560,"h":144}, @@ -418,7 +434,7 @@ }, "sprites/buildings/painter.png": { - "frame": {"x":1671,"y":3,"w":288,"h":144}, + "frame": {"x":555,"y":590,"w":288,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144}, @@ -426,7 +442,7 @@ }, "sprites/buildings/rotater-ccw.png": { - "frame": {"x":1231,"y":594,"w":141,"h":143}, + "frame": {"x":1537,"y":447,"w":141,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, @@ -434,7 +450,7 @@ }, "sprites/buildings/rotater.png": { - "frame": {"x":1639,"y":299,"w":141,"h":143}, + "frame": {"x":1682,"y":447,"w":141,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143}, @@ -442,7 +458,7 @@ }, "sprites/buildings/splitter-compact-inverse.png": { - "frame": {"x":547,"y":885,"w":141,"h":136}, + "frame": {"x":1252,"y":593,"w":141,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":141,"h":136}, @@ -450,7 +466,7 @@ }, "sprites/buildings/splitter-compact.png": { - "frame": {"x":692,"y":885,"w":139,"h":136}, + "frame": {"x":1631,"y":594,"w":139,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136}, @@ -466,7 +482,7 @@ }, "sprites/buildings/stacker.png": { - "frame": {"x":820,"y":591,"w":260,"h":143}, + "frame": {"x":547,"y":886,"w":260,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143}, @@ -482,7 +498,7 @@ }, "sprites/buildings/trash.png": { - "frame": {"x":1249,"y":446,"w":144,"h":144}, + "frame": {"x":1389,"y":445,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -490,7 +506,7 @@ }, "sprites/buildings/underground_belt_entry-tier2.png": { - "frame": {"x":977,"y":885,"w":137,"h":124}, + "frame": {"x":1631,"y":734,"w":137,"h":124}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":20,"w":137,"h":124}, @@ -498,7 +514,7 @@ }, "sprites/buildings/underground_belt_entry.png": { - "frame": {"x":1539,"y":593,"w":137,"h":111}, + "frame": {"x":1216,"y":739,"w":137,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":33,"w":137,"h":111}, @@ -506,7 +522,7 @@ }, "sprites/buildings/underground_belt_exit-tier2.png": { - "frame": {"x":1376,"y":709,"w":137,"h":111}, + "frame": {"x":1217,"y":854,"w":137,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111}, @@ -514,7 +530,7 @@ }, "sprites/buildings/underground_belt_exit.png": { - "frame": {"x":1403,"y":824,"w":137,"h":111}, + "frame": {"x":1358,"y":852,"w":137,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111}, @@ -522,7 +538,7 @@ }, "sprites/debug/acceptor_slot.png": { - "frame": {"x":1963,"y":3,"w":38,"h":48}, + "frame": {"x":2006,"y":597,"w":38,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":38,"h":48}, @@ -530,7 +546,7 @@ }, "sprites/debug/ejector_slot.png": { - "frame": {"x":1963,"y":55,"w":38,"h":48}, + "frame": {"x":2006,"y":649,"w":38,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":38,"h":48}, @@ -538,7 +554,7 @@ }, "sprites/map_overview/belt_forward.png": { - "frame": {"x":1625,"y":997,"w":20,"h":24}, + "frame": {"x":1826,"y":955,"w":20,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":20,"h":24}, @@ -546,7 +562,7 @@ }, "sprites/map_overview/belt_left.png": { - "frame": {"x":3,"y":994,"w":22,"h":22}, + "frame": {"x":206,"y":994,"w":22,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":22,"h":22}, @@ -554,7 +570,7 @@ }, "sprites/map_overview/belt_right.png": { - "frame": {"x":1963,"y":107,"w":22,"h":22}, + "frame": {"x":2006,"y":701,"w":22,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":22,"h":22}, @@ -562,15 +578,31 @@ }, "sprites/misc/deletion_marker.png": { - "frame": {"x":1716,"y":953,"w":62,"h":62}, + "frame": {"x":140,"y":994,"w":62,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":62,"h":62}, "sourceSize": {"w":72,"h":72} }, +"sprites/misc/hub_direction_indicator.png": +{ + "frame": {"x":1933,"y":299,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"sprites/misc/lock_direction_indicator.png": +{ + "frame": {"x":1357,"y":733,"w":36,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":36,"h":24}, + "sourceSize": {"w":36,"h":36} +}, "sprites/misc/slot_bad_arrow.png": { - "frame": {"x":1716,"y":953,"w":62,"h":62}, + "frame": {"x":140,"y":994,"w":62,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":62,"h":62}, @@ -578,7 +610,7 @@ }, "sprites/misc/slot_good_arrow.png": { - "frame": {"x":1950,"y":592,"w":62,"h":72}, + "frame": {"x":1760,"y":955,"w":62,"h":72}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":62,"h":72}, @@ -586,7 +618,7 @@ }, "sprites/misc/storage_overlay.png": { - "frame": {"x":1403,"y":939,"w":133,"h":66}, + "frame": {"x":3,"y":994,"w":133,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":133,"h":66}, @@ -594,7 +626,7 @@ }, "sprites/misc/waypoint.png": { - "frame": {"x":1649,"y":997,"w":20,"h":24}, + "frame": {"x":1357,"y":761,"w":20,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":20,"h":24}, @@ -605,8 +637,8 @@ "version": "1.0", "image": "atlas0_75.png", "format": "RGBA8888", - "size": {"w":2016,"h":1024}, + "size": {"w":2047,"h":1063}, "scale": "0.75", - "smartupdate": "$TexturePacker:SmartUpdate:3dd7a89f30024dd4787ad4af6b14588a:9ba11f8b02134c4376ab4e0a44f8b850:f159918d23e5952766c6d23ab52278c6$" + "smartupdate": "$TexturePacker:SmartUpdate:8985524bba1a3f16cecab3c03b6aaa06:d614d20bfce033d8a8ab0990af085d16:f159918d23e5952766c6d23ab52278c6$" } } diff --git a/res_built/atlas/atlas0_75.png b/res_built/atlas/atlas0_75.png index d6185e44..f4844add 100644 Binary files a/res_built/atlas/atlas0_75.png and b/res_built/atlas/atlas0_75.png differ diff --git a/res_raw/atlas.tps b/res_raw/atlas.tps index 6bf8fe1c..07da7809 100644 --- a/res_raw/atlas.tps +++ b/res_raw/atlas.tps @@ -324,9 +324,11 @@ sprites/blueprints/cutter.png sprites/blueprints/mixer.png + sprites/blueprints/painter-mirrored.png sprites/blueprints/painter.png sprites/blueprints/splitter.png sprites/blueprints/stacker.png + sprites/buildings/painter-mirrored.png pivotPoint 0.5,0.5 @@ -445,6 +447,7 @@ sprites/map_overview/belt_forward.png sprites/map_overview/belt_left.png sprites/map_overview/belt_right.png + sprites/misc/hub_direction_indicator.png sprites/misc/waypoint.png pivotPoint @@ -477,6 +480,21 @@ scale9FromFile + sprites/misc/lock_direction_indicator.png + + pivotPoint + 0.5,0.5 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,12,24,24 + scale9Paddings + 12,12,24,24 + scale9FromFile + + sprites/misc/storage_overlay.png pivotPoint diff --git a/res_raw/sounds/music/theme.mp3 b/res_raw/sounds/music/theme.mp3 deleted file mode 100644 index 66b78e55..00000000 --- a/res_raw/sounds/music/theme.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f61e851402fbc92d6909912fb203c63258fedbdea83e81f7ececb5091f4bee03 -size 3732550 diff --git a/res_raw/sounds/music/theme.wav b/res_raw/sounds/music/theme.wav new file mode 100644 index 00000000..a2014603 --- /dev/null +++ b/res_raw/sounds/music/theme.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c334a9f100fce4647b4803d2a8270b30e26d53622b3717bdb81b3ea07f84aed +size 150286082 diff --git a/res_raw/sprites/blueprints/painter-mirrored.png b/res_raw/sprites/blueprints/painter-mirrored.png new file mode 100644 index 00000000..f72f80e2 Binary files /dev/null and b/res_raw/sprites/blueprints/painter-mirrored.png differ diff --git a/res_raw/sprites/buildings/painter-mirrored.png b/res_raw/sprites/buildings/painter-mirrored.png new file mode 100644 index 00000000..da0e199d Binary files /dev/null and b/res_raw/sprites/buildings/painter-mirrored.png differ diff --git a/res_raw/sprites/misc/hub_direction_indicator.png b/res_raw/sprites/misc/hub_direction_indicator.png new file mode 100644 index 00000000..006ba8fa Binary files /dev/null and b/res_raw/sprites/misc/hub_direction_indicator.png differ diff --git a/res_raw/sprites/misc/lock_direction_indicator.png b/res_raw/sprites/misc/lock_direction_indicator.png new file mode 100644 index 00000000..fe693ba2 Binary files /dev/null and b/res_raw/sprites/misc/lock_direction_indicator.png differ diff --git a/src/css/common.scss b/src/css/common.scss index 22b39cb9..6a87012e 100644 --- a/src/css/common.scss +++ b/src/css/common.scss @@ -38,6 +38,10 @@ html { right: 0; background: #dee1ea; + + @include DarkThemeOverride { + background: $darkModeGameBackground; + } } body { @@ -413,6 +417,10 @@ canvas { display: inline-block; vertical-align: middle; } + + @include DarkThemeOverride { + color: #fff; + } } .prefab_LoadingTextWithAnimDelayed { diff --git a/src/css/icons.scss b/src/css/icons.scss index ea5850ff..2128fde3 100644 --- a/src/css/icons.scss +++ b/src/css/icons.scss @@ -15,6 +15,11 @@ $buildingsAndVariants: belt, splitter, splitter-compact, splitter-compact-invers } } +// Special case +[data-icon="building_tutorials/painter-mirrored.png"] { + background-image: uiResource("res/ui/building_tutorials/painter.png") !important; +} + $icons: notification_saved, notification_success, notification_upgrade; @each $icon in $icons { [data-icon="icons/#{$icon}.png"] { @@ -22,8 +27,8 @@ $icons: notification_saved, notification_success, notification_upgrade; } } -$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, nb, mt-MT, ar, nl, vi, th, - hu, pl, ja, kor; +$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi, th, + hu, pl, ja, kor, no, pt-PT; @each $language in $languages { [data-languageicon="#{$language}"] { diff --git a/src/css/ingame_hud/building_placer.scss b/src/css/ingame_hud/building_placer.scss index 99c4d654..e63868ab 100644 --- a/src/css/ingame_hud/building_placer.scss +++ b/src/css/ingame_hud/building_placer.scss @@ -75,6 +75,15 @@ @include StyleBelowWidth(700px) { display: none !important; } + + &.compact { + width: unset !important; + grid-template-columns: 1fr; + .buildingImage, + .description > .text { + display: none; + } + } } #ingame_HUD_PlacerVariants { @@ -86,6 +95,10 @@ flex-direction: column; align-items: flex-end; + &.compact { + @include S(top, 150px); + } + .explanation { text-transform: uppercase; grid-row: 1 / 2; diff --git a/src/css/ingame_hud/dialogs.scss b/src/css/ingame_hud/dialogs.scss index 2e1c417d..d72265e7 100644 --- a/src/css/ingame_hud/dialogs.scss +++ b/src/css/ingame_hud/dialogs.scss @@ -21,15 +21,32 @@ } } + $darkModeDialogBg: darken($darkModeGameBackground, 10); + @include DarkThemeOverride { - background: rgba(#33363d, 0.9); + background: rgba($darkModeDialogBg, 0.9); @include InlineAnimation(0.12s ease-in-out) { 0% { background-color: transparent; opacity: 0.5; } 100% { - background-color: rgba(#33363d, 0.9); + background-color: rgba($darkModeDialogBg, 0.9); + } + } + + > .dialogInner.optionChooserDialog .optionParent { + .option { + background: #3d3f42; + + &:hover { + background-color: #424348; + } + + &.active { + background: $colorBlueBright; + color: #fff; + } } } } @@ -122,6 +139,10 @@ color: #aaa; } + a { + color: $colorBlueBright; + } + strong { font-weight: bold; } diff --git a/src/css/ingame_hud/keybindings_overlay.scss b/src/css/ingame_hud/keybindings_overlay.scss index d6235406..38b560d8 100644 --- a/src/css/ingame_hud/keybindings_overlay.scss +++ b/src/css/ingame_hud/keybindings_overlay.scss @@ -14,6 +14,10 @@ } > .binding { + &:not(.visible) { + display: none !important; + } + display: inline-grid; @include PlainText; align-items: center; @@ -57,42 +61,6 @@ @include S(margin-left, 5px); } } - - &:not(.placementActive) .binding.placementOnly, - &.mapOverviewActive .binding.placementOnly { - display: none; - } - - &.placementActive:not(.mapOverviewActive) .noPlacementOnly { - display: none; - } - - &:not(.mapOverviewActive) .binding.overviewOnly { - display: none; - } - - &.mapOverviewActive .noOverviewOnly { - display: none; - } - - .binding.placementOnly, - &:not(.placementActive) .binding.noPlacementOnly { - transform-origin: 0% 50%; - @include InlineAnimation(0.3s ease-in-out) { - 0% { - color: $colorRedBright; - transform: scale(1.2); - } - } - } - - .keybinding.builtinKey { - transition: all 0.1s ease-in-out; - transition-property: background-color, color, border-color; - background: $colorRedBright; - border-color: $colorRedBright; - color: #fff; - } } body.uiHidden #ingame_HUD_KeybindingOverlay .binding:not(.hudToggle) { diff --git a/src/css/ingame_hud/mass_selector.scss b/src/css/ingame_hud/mass_selector.scss deleted file mode 100644 index ddd2d40a..00000000 --- a/src/css/ingame_hud/mass_selector.scss +++ /dev/null @@ -1,22 +0,0 @@ -#ingame_HUD_MassSelector { - position: absolute; - @include S(top, 50px); - left: 50%; - transform: translateX(-50%); - background: $ingameHudBg; - @include S(padding, 6px, 10px); - @include SuperSmallText; - color: #fff; - // color: #f77; - - .keybinding { - vertical-align: middle; - @include S(margin, 0, 1px); - position: relative; - top: unset; - left: unset; - right: unset; - bottom: unset; - @include S(margin-top, -2px); - } -} diff --git a/src/css/ingame_hud/shop.scss b/src/css/ingame_hud/shop.scss index 66e46159..26f5d759 100644 --- a/src/css/ingame_hud/shop.scss +++ b/src/css/ingame_hud/shop.scss @@ -241,6 +241,10 @@ &.complete { background-color: $colorGreenBright; + + @include DarkThemeOverride { + background-color: $colorGreenBright; + } } } } diff --git a/src/css/ingame_hud/waypoints.scss b/src/css/ingame_hud/waypoints.scss index fee1ec37..fecb2c66 100644 --- a/src/css/ingame_hud/waypoints.scss +++ b/src/css/ingame_hud/waypoints.scss @@ -29,7 +29,7 @@ #ingame_HUD_Waypoints { position: absolute; @include S(right, 10px); - @include S(top, 60px); + @include S(top, 45px); display: flex; flex-direction: column; @include DarkThemeInvert(); @@ -47,6 +47,7 @@ opacity: 0.7; @include S(margin-bottom, 1px); font-weight: bold; + &:hover { opacity: 1; } @@ -63,5 +64,29 @@ transform: scale(1.5); } } + + &.hub { + // Transform because there is a canvas before + @include S(margin-left, -2px); + + grid-template-columns: auto 1fr; + background: none !important; + @include S(padding-left, 0); + canvas { + @include S(width, 12px); + @include S(height, 12px); + @include S(margin-right, 1px); + } + } + + &.shapeIcon { + canvas { + @include S(width, 15px); + @include S(height, 15px); + pointer-events: none; + // Double invert, to make sure it has the right color + @include DarkThemeInvert(); + } + } } } diff --git a/src/css/main.scss b/src/css/main.scss index 10bf384e..178f398b 100644 --- a/src/css/main.scss +++ b/src/css/main.scss @@ -37,7 +37,6 @@ @import "ingame_hud/shop"; @import "ingame_hud/game_menu"; @import "ingame_hud/dialogs"; -@import "ingame_hud/mass_selector"; @import "ingame_hud/vignette_overlay"; @import "ingame_hud/statistics"; @import "ingame_hud/pinned_shapes"; @@ -67,7 +66,6 @@ ingame_HUD_PinnedShapes, ingame_HUD_GameMenu, ingame_HUD_KeybindingOverlay, ingame_HUD_Notifications, -ingame_HUD_MassSelector, ingame_HUD_DebugInfo, ingame_HUD_EntityDebugger, ingame_HUD_InteractiveTutorial, @@ -101,7 +99,6 @@ body.uiHidden { #ingame_HUD_buildings_toolbar, #ingame_HUD_PlacementHints, #ingame_HUD_GameMenu, - #ingame_HUD_MassSelector, #ingame_HUD_PinnedShapes, #ingame_HUD_Notifications, #ingame_HUD_TutorialHints, @@ -115,6 +112,6 @@ body.modalDialogActive, body.externalAdOpen, body.ingameDialogOpen { > *:not(.ingameDialog):not(.modalDialogParent):not(.loadingDialog):not(.gameLoadingOverlay):not(#ingame_HUD_ModalDialogs):not(.noBlur) { - filter: blur(5px) !important; + // filter: blur(5px) !important; } } diff --git a/src/css/mixins.scss b/src/css/mixins.scss index dc5eeb86..ee0a9752 100644 --- a/src/css/mixins.scss +++ b/src/css/mixins.scss @@ -350,7 +350,7 @@ button, } @mixin DarkThemeOverride { - @at-root body[data-theme="dark"] &, + @at-root html[data-theme="dark"] &, &[data-theme="dark"] { @content; } diff --git a/src/css/states/ingame.scss b/src/css/states/ingame.scss index 8b0a614c..3f220a5d 100644 --- a/src/css/states/ingame.scss +++ b/src/css/states/ingame.scss @@ -28,4 +28,10 @@ right: 0; bottom: 0; } + + @include DarkThemeOverride { + .gameLoadingOverlay { + background: $darkModeGameBackground; + } + } } diff --git a/src/css/states/keybindings.scss b/src/css/states/keybindings.scss index f5ee3170..cf211403 100644 --- a/src/css/states/keybindings.scss +++ b/src/css/states/keybindings.scss @@ -51,4 +51,21 @@ } } } + + @include DarkThemeOverride { + .content { + .hint { + background: #3b3d40; + } + + .category .entry { + color: #c0c4c8; + border-bottom-color: #888; + + button { + filter: invert(1); + } + } + } + } } diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index 8c598c20..fa9d430c 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -37,6 +37,7 @@ .languageChoose { @include S(border-radius, 8px); border: solid #222428; + background-color: #fff; @include S(border-width, 2px); background-size: cover; } @@ -233,7 +234,8 @@ @include S(width, 300px); } - .playButton { + .playButton, + .continueButton { @include SuperHeading; @include S(min-width, 130px); @include S(padding, 15px, 20px); @@ -246,12 +248,21 @@ &:hover { transform: scale(1.02); } + + &.continueButton { + @include Heading; + } } .importButton { @include S(margin-top, 15px); } + .newGameButton { + @include S(margin-top, 15px); + @include S(margin-left, 15px); + } + .savegames { @include S(max-height, 105px); overflow-y: auto; @@ -390,4 +401,44 @@ } } } + + @include DarkThemeOverride { + background: $darkModeGameBackground center center / cover !important; + + .topButtons { + filter: invert(1); + + .languageChoose { + filter: invert(1); + } + } + + .mainContainer { + background: darken($darkModeGameBackground, 10); + + .savegames .savegame { + background: darken($darkModeGameBackground, 15); + color: white; + } + } + + .footer { + > a { + background: darken($darkModeGameBackground, 10); + color: #eee; + } + + .author { + color: #bdbdbd; + + > a { + color: white; + } + } + + .thirdpartyLogo.githubLogo { + filter: invert(1); + } + } + } } diff --git a/src/css/states/preload.scss b/src/css/states/preload.scss index 413abd32..ba0a372d 100644 --- a/src/css/states/preload.scss +++ b/src/css/states/preload.scss @@ -14,6 +14,10 @@ padding: 10px; box-sizing: border-box; background: #eef1f4; + + @include DarkThemeOverride { + background: #424242; + } .version { @include Heading; diff --git a/src/css/states/settings.scss b/src/css/states/settings.scss index e52152c3..f06c9b31 100644 --- a/src/css/states/settings.scss +++ b/src/css/states/settings.scss @@ -88,4 +88,26 @@ } } } + + @include DarkThemeOverride { + .content { + .setting { + background: darken($darkModeGameBackground, 10); + + .value.enum { + // dirty but works + filter: invert(0.85); + color: #222; + } + + .value.checkbox { + background-color: #74767b; + + &.checked { + background-color: $colorBlueBright; + } + } + } + } + } } diff --git a/src/css/textual_game_state.scss b/src/css/textual_game_state.scss index 897c379a..a8d7a31f 100644 --- a/src/css/textual_game_state.scss +++ b/src/css/textual_game_state.scss @@ -61,4 +61,21 @@ } } } + + @include DarkThemeOverride { + .headerBar { + h1 { + color: #e2e0db; + } + + .backButton { + filter: invert(1); + } + } + + > .container > .content { + background: darken($darkModeGameBackground, 3); + color: #eee; + } + } } diff --git a/src/css/variables.scss b/src/css/variables.scss index 5f056a00..c1c69371 100644 --- a/src/css/variables.scss +++ b/src/css/variables.scss @@ -38,6 +38,8 @@ $ingameHudBg: rgba(#333438, 0.9); $text3dColor: #f4ffff; +$darkModeGameBackground: #5c606c; + // Dialog properties $modalDialogBg: rgba(160, 165, 180, 0.8); $dialogBgColor: lighten($mainBgColor, 10); diff --git a/src/js/changelog.js b/src/js/changelog.js index 292be78a..95553f19 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -1,4 +1,83 @@ export const CHANGELOG = [ + { + version: "1.1.17", + date: "unreleased", + entries: [ + "Allow configuring autosave interval and disabling it in the settings", + "The smart-tunnel placement has been reworked to properly replace belts. Thus the setting has been turned on again by default", + "The soundtrack now has a higher quality on the standalone version than the web version", + "Add setting to disable cut/delete warnings (by hexy)", + "Fix bug where belts in blueprints don't orient correctly (by hexy)", + "Fix camera moving weird after dragging and holding (by hexy)", + "Fix keybinding for pipette showing while pasting blueprints", + "Update tutorial image for tier 2 tunnels to explain mix/match (by jimmyshadow1)", + "Prevent default actions on all keybindings in the web version so you don't accidentally use builtin browser shortcuts", + ], + }, + { + version: "1.1.16", + date: "21.06.2020", + entries: [ + "You can now pickup buildings below your cursor with 'Q'!", + "The game soundtrack has been extended! There are now 4 songs with over 13 minutes of playtime from Peppsen!", + "Refactor keybindings overlay to show more appropriate keybindings", + "Show keybindings for area-select in the upper left instead", + "Automatically deselect area when selecting a new building", + "Raise markers limit from 14 characters to 71 (by Joker-vD)", + "Optimize performance by caching extractor items (by Phlosioneer)", + "Added setting to enable compact building infos, which only show ratios and hide the image / description", + "Apply dark theme to menu as well (by dengr1065)", + "Fix belt planner not placing the last belt", + "Fix buildings getting deleted when right clicking while placing a blueprint", + "Fix for exporting screenshots for huge bases (It was showing an empty file) (by xSparfuchs)", + "Fix buttons not responding when using right click directly after left click (by davidburhans)", + "Fix hub marker being hidden by building info panel", + "Disable dialog background blur since it can cause performance issues", + "Added simplified chinese translations", + "Update translations (Thanks to all translators!)", + ], + }, + { + version: "1.1.15", + date: "17.06.2020", + entries: [ + "You can now place straight belts (and tunnels) by holding SHIFT! (For you, @giantwaffle ❤️)", + "Added continue button to main menu and add seperate 'New game' button (by jaysc)", + "Added setting to disable smart tunnel placement introduced with the last update", + "Added setting to disable vignette", + "Update translations", + ], + }, + { + version: "1.1.14", + date: "16.06.2020", + entries: [ + "There is now an indicator (compass) to the HUB for the HUB Marker!", + "You can now include shape short keys in markers to render shape icons instead of text!", + "Added mirrored variant of the painter", + "When placing tunnels, unnecessary belts inbetween are now removed!", + "You can now drag tunnels and they will automatically expand! (Just try it out, its intuitive)", + ], + }, + { + version: "1.1.13", + date: "15.06.2020", + entries: [ + "Added shift modifier for faster pan (by jaysc)", + "Added Japanese translations", + "Added Portuguese (Portugal) translations", + "Updated icon for Spanish (Latin America) - It was showing a Spanish flag before", + "Updated existing translations", + ], + }, + { + version: "1.1.12", + date: "14.06.2020", + entries: [ + "Huge performance improvements! The game should now run up to 60% faster!", + "Added norwegian translation", + ], + }, { version: "1.1.11", date: "13.06.2020", diff --git a/src/js/core/click_detector.js b/src/js/core/click_detector.js index 5f6816f7..508e9375 100644 --- a/src/js/core/click_detector.js +++ b/src/js/core/click_detector.js @@ -3,7 +3,7 @@ import { createLogger } from "../core/logging"; import { Signal } from "../core/signal"; import { fastArrayDelete, fastArrayDeleteValueIfContained } from "./utils"; import { Vector } from "./vector"; -import { IS_MOBILE } from "./config"; +import { IS_MOBILE, SUPPORT_TOUCH } from "./config"; import { SOUNDS } from "../platform/sound"; import { GLOBAL_APP } from "./globals"; @@ -119,16 +119,21 @@ export class ClickDetector { } } const options = this.internalGetEventListenerOptions(); - this.element.removeEventListener("touchstart", this.handlerTouchStart, options); - this.element.removeEventListener("touchend", this.handlerTouchEnd, options); - this.element.removeEventListener("touchcancel", this.handlerTouchCancel, options); + + if (SUPPORT_TOUCH) { + this.element.removeEventListener("touchstart", this.handlerTouchStart, options); + this.element.removeEventListener("touchend", this.handlerTouchEnd, options); + this.element.removeEventListener("touchcancel", this.handlerTouchCancel, options); + } this.element.removeEventListener("mouseup", this.handlerTouchStart, options); this.element.removeEventListener("mousedown", this.handlerTouchEnd, options); this.element.removeEventListener("mouseout", this.handlerTouchCancel, options); if (this.captureTouchmove) { - this.element.removeEventListener("touchmove", this.handlerTouchMove, options); + if (SUPPORT_TOUCH) { + this.element.removeEventListener("touchmove", this.handlerTouchMove, options); + } this.element.removeEventListener("mousemove", this.handlerTouchMove, options); } @@ -186,16 +191,20 @@ export class ClickDetector { element.addEventListener("click", this.handlerPreventClick, options); } - element.addEventListener("touchstart", this.handlerTouchStart, options); - element.addEventListener("touchend", this.handlerTouchEnd, options); - element.addEventListener("touchcancel", this.handlerTouchCancel, options); + if (SUPPORT_TOUCH) { + element.addEventListener("touchstart", this.handlerTouchStart, options); + element.addEventListener("touchend", this.handlerTouchEnd, options); + element.addEventListener("touchcancel", this.handlerTouchCancel, options); + } element.addEventListener("mousedown", this.handlerTouchStart, options); element.addEventListener("mouseup", this.handlerTouchEnd, options); element.addEventListener("mouseout", this.handlerTouchCancel, options); if (this.captureTouchmove) { - element.addEventListener("touchmove", this.handlerTouchMove, options); + if (SUPPORT_TOUCH) { + element.addEventListener("touchmove", this.handlerTouchMove, options); + } element.addEventListener("mousemove", this.handlerTouchMove, options); } @@ -316,6 +325,7 @@ export class ClickDetector { // Ignore right clicks this.rightClick.dispatch(position, event); this.cancelled = true; + this.clickDownPosition = null; return; } } diff --git a/src/js/core/config.js b/src/js/core/config.js index 4a8953d4..aad3d245 100644 --- a/src/js/core/config.js +++ b/src/js/core/config.js @@ -12,6 +12,8 @@ export const IS_DEMO = queryParamOptions.fullVersion : (G_IS_PROD && !G_IS_STANDALONE) || (typeof window !== "undefined" && window.location.search.indexOf("demo") >= 0); +export const SUPPORT_TOUCH = false; + const smoothCanvas = true; export const THIRDPARTY_URLS = { diff --git a/src/js/core/input_distributor.js b/src/js/core/input_distributor.js index 03ad8e0c..a59f4fbc 100644 --- a/src/js/core/input_distributor.js +++ b/src/js/core/input_distributor.js @@ -191,17 +191,7 @@ export class InputDistributor { */ handleKeyMouseDown(event) { const keyCode = event instanceof MouseEvent ? event.button + 1 : event.keyCode; - if ( - keyCode === 4 || // MB4 - keyCode === 5 || // MB5 - keyCode === 9 || // TAB - keyCode === 16 || // SHIFT - keyCode === 17 || // CTRL - keyCode === 18 || // ALT - (keyCode >= 112 && keyCode < 122) // F1 - F10 - ) { - event.preventDefault(); - } + event.preventDefault(); const isInitial = !this.keysDown.has(keyCode); this.keysDown.add(keyCode); diff --git a/src/js/core/utils.js b/src/js/core/utils.js index 7399d375..fdf97880 100644 --- a/src/js/core/utils.js +++ b/src/js/core/utils.js @@ -646,13 +646,12 @@ export function measure(name, target) { } /** - * Helper method to create a new div - * @param {Element} parent + * Helper method to create a new div element * @param {string=} id * @param {Array=} classes * @param {string=} innerHTML */ -export function makeDiv(parent, id = null, classes = [], innerHTML = "") { +export function makeDivElement(id = null, classes = [], innerHTML = "") { const div = document.createElement("div"); if (id) { div.id = id; @@ -661,10 +660,51 @@ export function makeDiv(parent, id = null, classes = [], innerHTML = "") { div.classList.add(classes[i]); } div.innerHTML = innerHTML; + return div; +} + +/** + * Helper method to create a new div + * @param {Element} parent + * @param {string=} id + * @param {Array=} classes + * @param {string=} innerHTML + */ +export function makeDiv(parent, id = null, classes = [], innerHTML = "") { + const div = makeDivElement(id, classes, innerHTML); parent.appendChild(div); return div; } +/** + * Helper method to create a new div and place before reference Node + * @param {Element} parent + * @param {Element} referenceNode + * @param {string=} id + * @param {Array=} classes + * @param {string=} innerHTML + */ +export function makeDivBefore(parent, referenceNode, id = null, classes = [], innerHTML = "") { + const div = makeDivElement(id, classes, innerHTML); + parent.insertBefore(div, referenceNode); + return div; +} + +/** + * Helper method to create a new button element + * @param {Array=} classes + * @param {string=} innerHTML + */ +export function makeButtonElement(classes = [], innerHTML = "") { + const element = document.createElement("button"); + for (let i = 0; i < classes.length; ++i) { + element.classList.add(classes[i]); + } + element.classList.add("styledButton"); + element.innerHTML = innerHTML; + return element; +} + /** * Helper method to create a new button * @param {Element} parent @@ -672,16 +712,24 @@ export function makeDiv(parent, id = null, classes = [], innerHTML = "") { * @param {string=} innerHTML */ export function makeButton(parent, classes = [], innerHTML = "") { - const element = document.createElement("button"); - for (let i = 0; i < classes.length; ++i) { - element.classList.add(classes[i]); - } - element.classList.add("styledButton"); - element.innerHTML = innerHTML; + const element = makeButtonElement(classes, innerHTML); parent.appendChild(element); return element; } +/** + * Helper method to create a new button and place before reference Node + * @param {Element} parent + * @param {Element} referenceNode + * @param {Array=} classes + * @param {string=} innerHTML + */ +export function makeButtonBefore(parent, referenceNode, classes = [], innerHTML = "") { + const element = makeButtonElement(classes, innerHTML); + parent.insertBefore(element, referenceNode); + return element; +} + /** * Removes all children of the given element * @param {Element} elem diff --git a/src/js/game/automatic_save.js b/src/js/game/automatic_save.js index 6c80976f..1b3f13ca 100644 --- a/src/js/game/automatic_save.js +++ b/src/js/game/automatic_save.js @@ -47,10 +47,16 @@ export class AutomaticSave { return; } + const saveInterval = this.root.app.settings.getAutosaveIntervalSeconds(); + if (!saveInterval) { + // Disabled + return; + } + // Check when the last save was, but make sure that if it fails, we don't spam const lastSaveTime = Math_max(this.lastSaveAttempt, this.root.savegame.getRealLastUpdate()); - let secondsSinceLastSave = (Date.now() - lastSaveTime) / 1000.0; + const secondsSinceLastSave = (Date.now() - lastSaveTime) / 1000.0; let shouldSave = false; switch (this.saveImportance) { @@ -61,7 +67,7 @@ export class AutomaticSave { case enumSavePriority.regular: // Could determine if there is a good / bad point here - shouldSave = secondsSinceLastSave > MIN_INTERVAL_SECS; + shouldSave = secondsSinceLastSave > saveInterval; break; default: diff --git a/src/js/game/buildings/belt_base.js b/src/js/game/buildings/belt_base.js index b662ea77..10174943 100644 --- a/src/js/game/buildings/belt_base.js +++ b/src/js/game/buildings/belt_base.js @@ -22,6 +22,10 @@ export class MetaBeltBaseBuilding extends MetaBuilding { return "#777"; } + getHasDirectionLockAvailable() { + return true; + } + /** * @param {GameRoot} root * @param {string} variant diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js index 7fa8bb38..835dde1e 100644 --- a/src/js/game/buildings/painter.js +++ b/src/js/game/buildings/painter.js @@ -11,7 +11,7 @@ import { T } from "../../translations"; import { formatItemsPerSecond } from "../../core/utils"; /** @enum {string} */ -export const enumPainterVariants = { double: "double", quad: "quad" }; +export const enumPainterVariants = { mirrored: "mirrored", double: "double", quad: "quad" }; export class MetaPainterBuilding extends MetaBuilding { constructor() { @@ -21,6 +21,7 @@ export class MetaPainterBuilding extends MetaBuilding { getDimensions(variant) { switch (variant) { case defaultBuildingVariant: + case enumPainterVariants.mirrored: return new Vector(2, 1); case enumPainterVariants.double: return new Vector(2, 2); @@ -42,7 +43,8 @@ export class MetaPainterBuilding extends MetaBuilding { */ getAdditionalStatistics(root, variant) { switch (variant) { - case defaultBuildingVariant: { + case defaultBuildingVariant: + case enumPainterVariants.mirrored: { const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.painter); return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; } @@ -61,7 +63,7 @@ export class MetaPainterBuilding extends MetaBuilding { * @param {GameRoot} root */ getAvailableVariants(root) { - let variants = [defaultBuildingVariant]; + let variants = [defaultBuildingVariant, enumPainterVariants.mirrored]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter_double)) { variants.push(enumPainterVariants.double); } @@ -116,7 +118,8 @@ export class MetaPainterBuilding extends MetaBuilding { */ updateVariants(entity, rotationVariant, variant) { switch (variant) { - case defaultBuildingVariant: { + case defaultBuildingVariant: + case enumPainterVariants.mirrored: { entity.components.ItemAcceptor.setSlots([ { pos: new Vector(0, 0), @@ -125,7 +128,9 @@ export class MetaPainterBuilding extends MetaBuilding { }, { pos: new Vector(1, 0), - directions: [enumDirection.top], + directions: [ + variant === defaultBuildingVariant ? enumDirection.top : enumDirection.bottom, + ], filter: enumItemAcceptorItemFilter.color, }, ]); diff --git a/src/js/game/camera.js b/src/js/game/camera.js index 1125bf84..d2c468c9 100644 --- a/src/js/game/camera.js +++ b/src/js/game/camera.js @@ -8,7 +8,7 @@ import { performanceNow, } from "../core/builtins"; import { clickDetectorGlobals } from "../core/click_detector"; -import { globalConfig } from "../core/config"; +import { globalConfig, SUPPORT_TOUCH } from "../core/config"; import { createLogger } from "../core/logging"; import { Rectangle } from "../core/rectangle"; import { Signal, STOP_PROPAGATION } from "../core/signal"; @@ -28,6 +28,7 @@ const velocitySmoothing = 0.5; const velocityFade = 0.98; const velocityStrength = 0.4; const velocityMax = 20; +const ticksBeforeErasingVelocity = 10; /** * @enum {string} @@ -58,6 +59,8 @@ export class Camera extends BasicSerializableObject { // Input handling this.currentlyMoving = false; this.lastMovingPosition = null; + this.lastMovingPositionLastTick = null; + this.numTicksStandingStill = null; this.cameraUpdateTimeBucket = 0.0; this.didMoveSinceTouchStart = false; this.currentlyPinching = false; @@ -312,32 +315,36 @@ export class Camera extends BasicSerializableObject { this.eventListenerMouseMove = this.onMouseMove.bind(this); this.eventListenerMouseUp = this.onMouseUp.bind(this); - this.root.canvas.addEventListener("touchstart", this.eventListenerTouchStart); - this.root.canvas.addEventListener("touchend", this.eventListenerTouchEnd); - this.root.canvas.addEventListener("touchcancel", this.eventListenerTouchEnd); - this.root.canvas.addEventListener("touchmove", this.eventListenerTouchMove); + if (SUPPORT_TOUCH) { + this.root.canvas.addEventListener("touchstart", this.eventListenerTouchStart); + this.root.canvas.addEventListener("touchend", this.eventListenerTouchEnd); + this.root.canvas.addEventListener("touchcancel", this.eventListenerTouchEnd); + this.root.canvas.addEventListener("touchmove", this.eventListenerTouchMove); + } this.root.canvas.addEventListener("wheel", this.eventListenerMousewheel); this.root.canvas.addEventListener("mousedown", this.eventListenerMouseDown); this.root.canvas.addEventListener("mousemove", this.eventListenerMouseMove); - this.root.canvas.addEventListener("mouseup", this.eventListenerMouseUp); - this.root.canvas.addEventListener("mouseout", this.eventListenerMouseUp); + window.addEventListener("mouseup", this.eventListenerMouseUp); + // this.root.canvas.addEventListener("mouseout", this.eventListenerMouseUp); } /** * Cleans up all event listeners */ cleanup() { - this.root.canvas.removeEventListener("touchstart", this.eventListenerTouchStart); - this.root.canvas.removeEventListener("touchend", this.eventListenerTouchEnd); - this.root.canvas.removeEventListener("touchcancel", this.eventListenerTouchEnd); - this.root.canvas.removeEventListener("touchmove", this.eventListenerTouchMove); + if (SUPPORT_TOUCH) { + this.root.canvas.removeEventListener("touchstart", this.eventListenerTouchStart); + this.root.canvas.removeEventListener("touchend", this.eventListenerTouchEnd); + this.root.canvas.removeEventListener("touchcancel", this.eventListenerTouchEnd); + this.root.canvas.removeEventListener("touchmove", this.eventListenerTouchMove); + } this.root.canvas.removeEventListener("wheel", this.eventListenerMousewheel); this.root.canvas.removeEventListener("mousedown", this.eventListenerMouseDown); this.root.canvas.removeEventListener("mousemove", this.eventListenerMouseMove); - this.root.canvas.removeEventListener("mouseup", this.eventListenerMouseUp); - this.root.canvas.removeEventListener("mouseout", this.eventListenerMouseUp); + window.removeEventListener("mouseup", this.eventListenerMouseUp); + // this.root.canvas.removeEventListener("mouseout", this.eventListenerMouseUp); } /** @@ -663,6 +670,8 @@ export class Camera extends BasicSerializableObject { this.touchPostMoveVelocity = new Vector(0, 0); this.currentlyMoving = true; this.lastMovingPosition = pos; + this.lastMovingPositionLastTick = null; + this.numTicksStandingStill = 0; this.didMoveSinceTouchStart = false; } @@ -712,6 +721,8 @@ export class Camera extends BasicSerializableObject { this.currentlyMoving = false; this.currentlyPinching = false; this.lastMovingPosition = null; + this.lastMovingPositionLastTick = null; + this.numTicksStandingStill = 0; this.lastPinchPositions = null; this.userInteraction.dispatch(USER_INTERACT_TOUCHEND); this.didMoveSinceTouchStart = false; @@ -809,6 +820,23 @@ export class Camera extends BasicSerializableObject { this.touchPostMoveVelocity = this.touchPostMoveVelocity.multiplyScalar(velocityFade); + // Check if the camera is being dragged but standing still: if not, zero out `touchPostMoveVelocity`. + if (this.currentlyMoving && this.desiredCenter === null) { + if ( + this.lastMovingPositionLastTick !== null && + this.lastMovingPositionLastTick.equalsEpsilon(this.lastMovingPosition) + ) { + this.numTicksStandingStill++; + } else { + this.numTicksStandingStill = 0; + } + this.lastMovingPositionLastTick = this.lastMovingPosition.copy(); + + if (this.numTicksStandingStill >= ticksBeforeErasingVelocity) { + this.touchPostMoveVelocity.x = 0; + this.touchPostMoveVelocity.y = 0; + } + } // Check influence of past points if (!this.currentlyMoving && !this.currentlyPinching) { const len = this.touchPostMoveVelocity.length(); @@ -885,24 +913,28 @@ export class Camera extends BasicSerializableObject { let forceY = 0; const actionMapper = this.root.keyMapper; - if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).isCurrentlyPressed()) { + if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).pressed) { forceY -= 1; } - if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).isCurrentlyPressed()) { + if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).pressed) { forceY += 1; } - if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).isCurrentlyPressed()) { + if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).pressed) { forceX -= 1; } - if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).isCurrentlyPressed()) { + if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).pressed) { forceX += 1; } - this.center.x += moveAmount * forceX * this.root.app.settings.getMovementSpeed(); - this.center.y += moveAmount * forceY * this.root.app.settings.getMovementSpeed(); + let movementSpeed = + this.root.app.settings.getMovementSpeed() * + (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveFaster).pressed ? 4 : 1); + + this.center.x += moveAmount * forceX * movementSpeed; + this.center.y += moveAmount * forceY * movementSpeed; } } } diff --git a/src/js/game/canvas_click_interceptor.js b/src/js/game/canvas_click_interceptor.js deleted file mode 100644 index 675c1387..00000000 --- a/src/js/game/canvas_click_interceptor.js +++ /dev/null @@ -1,70 +0,0 @@ -import { STOP_PROPAGATION } from "../core/signal"; -import { GameRoot } from "./root"; -import { ClickDetector } from "../core/click_detector"; -import { createLogger } from "../core/logging"; - -const logger = createLogger("canvas_click_interceptor"); - -export class CanvasClickInterceptor { - /** - * @param {GameRoot} root - */ - constructor(root) { - this.root = root; - - this.root.signals.postLoadHook.add(this.initialize, this); - this.root.signals.aboutToDestruct.add(this.cleanup, this); - - /** @type {Array} */ - this.interceptors = []; - } - - initialize() { - this.clickDetector = new ClickDetector(this.root.canvas, { - applyCssClass: null, - captureTouchmove: false, - targetOnly: true, - preventDefault: true, - maxDistance: 13, - clickSound: null, - }); - this.clickDetector.click.add(this.onCanvasClick, this); - this.clickDetector.rightClick.add(this.onCanvasRightClick, this); - - if (this.root.hud.parts.buildingPlacer) { - this.interceptors.push(this.root.hud.parts.buildingPlacer); - } - - logger.log("Registered", this.interceptors.length, "interceptors"); - } - - cleanup() { - if (this.clickDetector) { - this.clickDetector.cleanup(); - } - this.interceptors = []; - } - - onCanvasClick(position, event, cancelAction = false) { - if (!this.root.gameInitialized) { - logger.warn("Skipping click outside of game initiaization!"); - return; - } - - if (this.root.hud.hasBlockingOverlayOpen()) { - return; - } - - for (let i = 0; i < this.interceptors.length; ++i) { - const interceptor = this.interceptors[i]; - if (interceptor.onCanvasClick(position, cancelAction) === STOP_PROPAGATION) { - // log(this, "Interceptor", interceptor.constructor.name, "catched click"); - break; - } - } - } - - onCanvasRightClick(position, event) { - this.onCanvasClick(position, event, true); - } -} diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js index dcac6ecb..d98db49a 100644 --- a/src/js/game/components/belt.js +++ b/src/js/game/components/belt.js @@ -64,7 +64,7 @@ export class BeltComponent extends Component { /** * Returns if the belt can currently accept an item from the given direction */ - canAcceptItem(leftoverProgress = 0.0) { + canAcceptItem() { const firstItem = this.sortedItems[0]; if (!firstItem) { return true; diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js index d370ae61..6f3895aa 100644 --- a/src/js/game/components/item_acceptor.js +++ b/src/js/game/components/item_acceptor.js @@ -20,6 +20,14 @@ export const enumItemAcceptorItemFilter = { * filter?: enumItemAcceptorItemFilter * }} ItemAcceptorSlot */ +/** + * Contains information about a slot plus its location + * @typedef {{ + * slot: ItemAcceptorSlot, + * index: number, + * acceptedDirection: enumDirection + * }} ItemAcceptorLocatedSlot */ + export class ItemAcceptorComponent extends Component { static getId() { return "ItemAcceptor"; @@ -164,11 +172,7 @@ export class ItemAcceptorComponent extends Component { * Tries to find a slot which accepts the current item * @param {Vector} targetLocalTile * @param {enumDirection} fromLocalDirection - * @returns {{ - * slot: ItemAcceptorSlot, - * index: number, - * acceptedDirection: enumDirection - * }|null} + * @returns {ItemAcceptorLocatedSlot|null} */ findMatchingSlot(targetLocalTile, fromLocalDirection) { // We need to invert our direction since the acceptor specifies *from* which direction diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js index 57de7e2f..74a4b616 100644 --- a/src/js/game/components/miner.js +++ b/src/js/game/components/miner.js @@ -12,6 +12,7 @@ export class MinerComponent extends Component { } static getSchema() { + // cachedMinedItem is not serialized. return { lastMiningTime: types.ufloat, chainable: types.bool, @@ -25,8 +26,6 @@ export class MinerComponent extends Component { }); } - /** - */ constructor({ chainable = false }) { super(); this.lastMiningTime = 0; @@ -38,6 +37,11 @@ export class MinerComponent extends Component { * @type {Array} */ this.itemChainBuffer = []; + + /** + * @type {BaseItem} + */ + this.cachedMinedItem = null; } /** diff --git a/src/js/game/core.js b/src/js/game/core.js index 8b1c464d..3fc02397 100644 --- a/src/js/game/core.js +++ b/src/js/game/core.js @@ -17,7 +17,6 @@ import { SavegameSerializer } from "../savegame/savegame_serializer"; import { AutomaticSave } from "./automatic_save"; import { MetaHubBuilding } from "./buildings/hub"; import { Camera } from "./camera"; -import { CanvasClickInterceptor } from "./canvas_click_interceptor"; import { EntityManager } from "./entity_manager"; import { GameSystemManager } from "./game_system_manager"; import { HubGoals } from "./hub_goals"; @@ -98,7 +97,6 @@ export class GameCore { root.logic = new GameLogic(root); root.hud = new GameHUD(root); root.time = new GameTime(root); - root.canvasClickInterceptor = new CanvasClickInterceptor(root); root.automaticSave = new AutomaticSave(root); root.soundProxy = new SoundProxy(root); diff --git a/src/js/game/game_system_manager.js b/src/js/game/game_system_manager.js index a8e9cf0c..20d74dda 100644 --- a/src/js/game/game_system_manager.js +++ b/src/js/game/game_system_manager.js @@ -92,6 +92,9 @@ export class GameSystemManager { add("staticMapEntities", StaticMapEntitySystem); + // IMPORTANT: Must be after belt system since belt system can change the + // orientation of an entity after it is placed -> the item acceptor cache + // then would be invalid add("itemAcceptor", ItemAcceptorSystem); logger.log("📦 There are", this.systemUpdateOrder.length, "game systems"); diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js index 979190f8..c322c707 100644 --- a/src/js/game/hud/hud.js +++ b/src/js/game/hud/hud.js @@ -34,6 +34,7 @@ import { HUDPartTutorialHints } from "./parts/tutorial_hints"; import { HUDWaypoints } from "./parts/waypoints"; import { HUDInteractiveTutorial } from "./parts/interactive_tutorial"; import { HUDScreenshotExporter } from "./parts/screenshot_exporter"; +import { Entity } from "../entity"; export class GameHUD { /** @@ -58,7 +59,6 @@ export class GameHUD { shop: new HUDShop(this.root), statistics: new HUDStatistics(this.root), waypoints: new HUDWaypoints(this.root), - vignetteOverlay: new HUDVignetteOverlay(this.root), // Must always exist pinnedShapes: new HUDPinnedShapes(this.root), @@ -90,11 +90,16 @@ export class GameHUD { if (IS_DEMO) { this.parts.watermark = new HUDWatermark(this.root); } + if (this.root.app.settings.getAllSettings().offerHints) { this.parts.tutorialHints = new HUDPartTutorialHints(this.root); this.parts.interactiveTutorial = new HUDInteractiveTutorial(this.root); } + if (this.root.app.settings.getAllSettings().vignette) { + this.parts.vignetteOverlay = new HUDVignetteOverlay(this.root); + } + const frag = document.createDocumentFragment(); for (const key in this.parts) { this.parts[key].createElements(frag); diff --git a/src/js/game/hud/parts/blueprint.js b/src/js/game/hud/parts/blueprint.js index 6dcd4c43..c53163d9 100644 --- a/src/js/game/hud/parts/blueprint.js +++ b/src/js/game/hud/parts/blueprint.js @@ -176,6 +176,7 @@ export class Blueprint { tryPlace(root, tile) { return root.logic.performBulkOperation(() => { let anyPlaced = false; + const beltsToRegisterLater = []; for (let i = 0; i < this.entities.length; ++i) { let placeable = true; const entity = this.entities[i]; @@ -202,10 +203,10 @@ export class Blueprint { "Can not delete entity for blueprint" ); if (!root.logic.tryDeleteBuilding(contents)) { - logger.error( + assertAlways( + false, "Building has replaceable component but is also unremovable in blueprint" ); - return false; } } } @@ -215,10 +216,22 @@ export class Blueprint { clone.components.StaticMapEntity.origin.addInplace(tile); root.map.placeStaticEntity(clone); - root.entityMgr.registerEntity(clone); + + // Registering a belt immediately triggers a recalculation of surrounding belt + // directions, which is no good when not all belts have been placed. To resolve + // this, only register belts after all entities have been placed. + if (!clone.components.Belt) { + root.entityMgr.registerEntity(clone); + } else { + beltsToRegisterLater.push(clone); + } anyPlaced = true; } } + + for (let i = 0; i < beltsToRegisterLater.length; i++) { + root.entityMgr.registerEntity(beltsToRegisterLater[i]); + } return anyPlaced; }); } diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index 0ffff9b4..ef46f101 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -1,15 +1,15 @@ import { DrawParameters } from "../../../core/draw_parameters"; import { STOP_PROPAGATION } from "../../../core/signal"; import { TrackedState } from "../../../core/tracked_state"; +import { makeDiv } from "../../../core/utils"; import { Vector } from "../../../core/vector"; +import { T } from "../../../translations"; import { enumMouseButton } from "../../camera"; import { KEYMAPPINGS } from "../../key_action_mapper"; -import { BaseHUDPart } from "../base_hud_part"; -import { Blueprint } from "./blueprint"; -import { makeDiv } from "../../../core/utils"; -import { DynamicDomAttach } from "../dynamic_dom_attach"; import { blueprintShape } from "../../upgrades"; -import { T } from "../../../translations"; +import { BaseHUDPart } from "../base_hud_part"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { Blueprint } from "./blueprint"; export class HUDBlueprintPlacer extends BaseHUDPart { createElements(parent) { @@ -34,9 +34,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { const keyActionMapper = this.root.keyMapper; keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this); - keyActionMapper - .getBinding(KEYMAPPINGS.placement.abortBuildingPlacement) - .add(this.abortPlacement, this); + keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.abortPlacement, this); keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.rotateBlueprint, this); keyActionMapper.getBinding(KEYMAPPINGS.massSelect.pasteLastBlueprint).add(this.pasteBlueprint, this); @@ -62,10 +60,9 @@ export class HUDBlueprintPlacer extends BaseHUDPart { } update() { - this.domAttach.update(this.currentBlueprint.get()); - this.trackedCanAfford.set( - this.currentBlueprint.get() && this.currentBlueprint.get().canAfford(this.root) - ); + const currentBlueprint = this.currentBlueprint.get(); + this.domAttach.update(currentBlueprint && currentBlueprint.getCost() > 0); + this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root)); } /** @@ -108,7 +105,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { this.root.hubGoals.takeShapeByKey(blueprintShape, cost); // This actually feels weird - // if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).isCurrentlyPressed()) { + // if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).pressed) { // this.currentBlueprint.set(null); // } } @@ -133,11 +130,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { rotateBlueprint() { if (this.currentBlueprint.get()) { - if ( - this.root.keyMapper - .getBinding(KEYMAPPINGS.placement.rotateInverseModifier) - .isCurrentlyPressed() - ) { + if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) { this.currentBlueprint.get().rotateCcw(); } else { this.currentBlueprint.get().rotateCw(); diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js index 6da065b2..5faec6ab 100644 --- a/src/js/game/hud/parts/building_placer.js +++ b/src/js/game/hud/parts/building_placer.js @@ -1,85 +1,26 @@ -import { Math_abs, Math_degrees, Math_radians } from "../../../core/builtins"; +import { Math_radians } from "../../../core/builtins"; import { globalConfig } from "../../../core/config"; import { DrawParameters } from "../../../core/draw_parameters"; import { drawRotatedSprite } from "../../../core/draw_utils"; import { Loader } from "../../../core/loader"; -import { STOP_PROPAGATION } from "../../../core/signal"; -import { TrackedState } from "../../../core/tracked_state"; -import { makeDiv, removeAllChildren } from "../../../core/utils"; +import { makeDiv, removeAllChildren, pulseAnimation, clamp } from "../../../core/utils"; import { enumDirectionToAngle, enumDirectionToVector, enumInvertedDirections, Vector, } from "../../../core/vector"; -import { enumMouseButton } from "../../camera"; -import { StaticMapEntityComponent } from "../../components/static_map_entity"; -import { Entity } from "../../entity"; -import { defaultBuildingVariant, MetaBuilding } from "../../meta_building"; -import { BaseHUDPart } from "../base_hud_part"; -import { DynamicDomAttach } from "../dynamic_dom_attach"; import { T } from "../../../translations"; import { KEYMAPPINGS } from "../../key_action_mapper"; +import { defaultBuildingVariant } from "../../meta_building"; +import { THEME } from "../../theme"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { HUDBuildingPlacerLogic } from "./building_placer_logic"; -export class HUDBuildingPlacer extends BaseHUDPart { - initialize() { - /** @type {TypedTrackedState} */ - this.currentMetaBuilding = new TrackedState(this.onSelectedMetaBuildingChanged, this); - this.currentBaseRotation = 0; - - /** @type {Entity} */ - this.fakeEntity = null; - - const keyActionMapper = this.root.keyMapper; - keyActionMapper - .getBinding(KEYMAPPINGS.placement.abortBuildingPlacement) - .add(this.abortPlacement, this); - keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this); - - keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.tryRotate, this); - keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this); - - this.root.hud.signals.buildingsSelectedForCopy.add(this.abortPlacement, this); - this.root.hud.signals.pasteBlueprintRequested.add(this.abortPlacement, this); - - this.domAttach = new DynamicDomAttach(this.root, this.element, {}); - - this.root.camera.downPreHandler.add(this.onMouseDown, this); - this.root.camera.movePreHandler.add(this.onMouseMove, this); - this.root.camera.upPostHandler.add(this.abortDragging, this); - - this.currentlyDragging = false; - this.currentVariant = new TrackedState(this.rerenderVariants, this); - - this.variantsAttach = new DynamicDomAttach(this.root, this.variantsElement, {}); - - /** - * Whether we are currently drag-deleting - */ - this.currentlyDeleting = false; - - /** - * Stores which variants for each building we prefer, this is based on what - * the user last selected - */ - this.preferredVariants = {}; - - /** - * The tile we last dragged onto - * @type {Vector} - * */ - this.lastDragTile = null; - - /** - * The tile we initially dragged from - * @type {Vector} - */ - this.initialDragTile = null; - - this.root.signals.storyGoalCompleted.add(this.rerenderVariants, this); - this.root.signals.upgradePurchased.add(this.rerenderVariants, this); - } - +export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { + /** + * @param {HTMLElement} parent + */ createElements(parent) { this.element = makeDiv(parent, "ingame_HUD_PlacementHints", [], ``); @@ -97,183 +38,24 @@ export class HUDBuildingPlacer extends BaseHUDPart { this.buildingInfoElements.tutorialImage = makeDiv(this.element, null, ["buildingImage"]); this.variantsElement = makeDiv(parent, "ingame_HUD_PlacerVariants"); + + const compact = this.root.app.settings.getAllSettings().compactBuildingInfo; + this.element.classList.toggle("compact", compact); + this.variantsElement.classList.toggle("compact", compact); } - abortPlacement() { - if (this.currentMetaBuilding.get()) { - this.currentMetaBuilding.set(null); - return STOP_PROPAGATION; - } - } + initialize() { + super.initialize(); - /** - * mouse down pre handler - * @param {Vector} pos - * @param {enumMouseButton} button - */ - onMouseDown(pos, button) { - if (this.root.camera.getIsMapOverlayActive()) { - return; - } + // Bind to signals + this.signals.variantChanged.add(this.rerenderVariants, this); - // Placement - if (button === enumMouseButton.left && this.currentMetaBuilding.get()) { - this.currentlyDragging = true; - this.currentlyDeleting = false; - this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace(); + this.domAttach = new DynamicDomAttach(this.root, this.element, {}); + this.variantsAttach = new DynamicDomAttach(this.root, this.variantsElement, {}); - // Place initial building - this.tryPlaceCurrentBuildingAt(this.lastDragTile); + this.currentInterpolatedCornerTile = new Vector(); - return STOP_PROPAGATION; - } - - // Deletion - if (button === enumMouseButton.right && !this.currentMetaBuilding.get()) { - this.currentlyDragging = true; - this.currentlyDeleting = true; - this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace(); - this.currentMetaBuilding.set(null); - return STOP_PROPAGATION; - } - } - - /** - * mouse move pre handler - * @param {Vector} pos - */ - onMouseMove(pos) { - if (this.root.camera.getIsMapOverlayActive()) { - return; - } - - const metaBuilding = this.currentMetaBuilding.get(); - if ((metaBuilding || this.currentlyDeleting) && this.lastDragTile) { - const oldPos = this.lastDragTile; - const newPos = this.root.camera.screenToWorld(pos).toTileSpace(); - - if (this.root.camera.desiredCenter) { - // Camera is moving - this.lastDragTile = newPos; - return; - } - - if (!oldPos.equals(newPos)) { - if ( - metaBuilding && - metaBuilding.getRotateAutomaticallyWhilePlacing(this.currentVariant.get()) && - !this.root.keyMapper - .getBinding(KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation) - .isCurrentlyPressed() - ) { - const delta = newPos.sub(oldPos); - const angleDeg = Math_degrees(delta.angle()); - this.currentBaseRotation = (Math.round(angleDeg / 90) * 90 + 360) % 360; - - // Holding alt inverts the placement - if ( - this.root.keyMapper - .getBinding(KEYMAPPINGS.placementModifiers.placeInverse) - .isCurrentlyPressed() - ) { - this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; - } - } - - // - Using bresenhams algorithmus - - let x0 = oldPos.x; - let y0 = oldPos.y; - let x1 = newPos.x; - let y1 = newPos.y; - - var dx = Math_abs(x1 - x0); - var dy = Math_abs(y1 - y0); - var sx = x0 < x1 ? 1 : -1; - var sy = y0 < y1 ? 1 : -1; - var err = dx - dy; - - while (this.currentlyDeleting || this.currentMetaBuilding.get()) { - if (this.currentlyDeleting) { - const contents = this.root.map.getTileContentXY(x0, y0); - if (contents && !contents.queuedForDestroy && !contents.destroyed) { - this.root.logic.tryDeleteBuilding(contents); - } - } else { - this.tryPlaceCurrentBuildingAt(new Vector(x0, y0)); - } - if (x0 === x1 && y0 === y1) break; - var e2 = 2 * err; - if (e2 > -dy) { - err -= dy; - x0 += sx; - } - if (e2 < dx) { - err += dx; - y0 += sy; - } - } - } - - this.lastDragTile = newPos; - - return STOP_PROPAGATION; - } - } - - update() { - // ALways update since the camera might have moved - const mousePos = this.root.app.mousePosition; - if (mousePos) { - this.onMouseMove(mousePos); - } - } - - /** - * aborts any dragging op - */ - abortDragging() { - this.currentlyDragging = true; - this.currentlyDeleting = false; - this.lastDragTile = null; - } - - /** - * - * @param {MetaBuilding} metaBuilding - */ - startSelection(metaBuilding) { - this.currentMetaBuilding.set(metaBuilding); - } - - /** - * @param {MetaBuilding} metaBuilding - */ - onSelectedMetaBuildingChanged(metaBuilding) { - this.abortDragging(); - this.root.hud.signals.selectedPlacementBuildingChanged.dispatch(metaBuilding); - if (metaBuilding) { - const variant = this.preferredVariants[metaBuilding.getId()] || defaultBuildingVariant; - this.currentVariant.set(variant); - - this.fakeEntity = new Entity(null); - metaBuilding.setupEntityComponents(this.fakeEntity, null); - - this.fakeEntity.addComponent( - new StaticMapEntityComponent({ - origin: new Vector(0, 0), - rotation: 0, - tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(), - blueprintSpriteKey: "", - }) - ); - metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get()); - } else { - this.fakeEntity = null; - } - - // Since it depends on both, rerender twice - this.rerenderVariants(); + this.lockIndicatorSprite = Loader.getSprite("sprites/misc/lock_direction_indicator.png"); } /** @@ -368,147 +150,6 @@ export class HUDBuildingPlacer extends BaseHUDPart { } } - /** - * Cycles through the variants - */ - cycleVariants() { - const metaBuilding = this.currentMetaBuilding.get(); - if (!metaBuilding) { - this.currentVariant.set(defaultBuildingVariant); - } else { - const availableVariants = metaBuilding.getAvailableVariants(this.root); - const index = availableVariants.indexOf(this.currentVariant.get()); - assert( - index >= 0, - "Current variant was invalid: " + this.currentVariant.get() + " out of " + availableVariants - ); - const newIndex = (index + 1) % availableVariants.length; - const newVariant = availableVariants[newIndex]; - this.currentVariant.set(newVariant); - - this.preferredVariants[metaBuilding.getId()] = newVariant; - } - } - - /** - * Tries to rotate - */ - tryRotate() { - const selectedBuilding = this.currentMetaBuilding.get(); - if (selectedBuilding) { - if ( - this.root.keyMapper - .getBinding(KEYMAPPINGS.placement.rotateInverseModifier) - .isCurrentlyPressed() - ) { - this.currentBaseRotation = (this.currentBaseRotation + 270) % 360; - } else { - this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; - } - - const staticComp = this.fakeEntity.components.StaticMapEntity; - staticComp.rotation = this.currentBaseRotation; - } - } - - /** - * Tries to delete the building under the mouse - */ - deleteBelowCursor() { - const mousePosition = this.root.app.mousePosition; - if (!mousePosition) { - // Not on screen - return; - } - - const worldPos = this.root.camera.screenToWorld(mousePosition); - const tile = worldPos.toTileSpace(); - const contents = this.root.map.getTileContent(tile); - if (contents) { - this.root.logic.tryDeleteBuilding(contents); - } - } - - /** - * Canvas click handler - * @param {Vector} mousePos - * @param {boolean} cancelAction - */ - onCanvasClick(mousePos, cancelAction = false) { - if (cancelAction) { - if (this.currentMetaBuilding.get()) { - this.currentMetaBuilding.set(null); - } else { - this.deleteBelowCursor(); - } - return STOP_PROPAGATION; - } - - if (!this.currentMetaBuilding.get()) { - return; - } - - return STOP_PROPAGATION; - } - - /** - * Tries to place the current building at the given tile - * @param {Vector} tile - */ - tryPlaceCurrentBuildingAt(tile) { - if (this.root.camera.zoomLevel < globalConfig.mapChunkOverviewMinZoom) { - // Dont allow placing in overview mode - return; - } - // Transform to world space - - const metaBuilding = this.currentMetaBuilding.get(); - - const { rotation, rotationVariant } = metaBuilding.computeOptimalDirectionAndRotationVariantAtTile( - this.root, - tile, - this.currentBaseRotation, - this.currentVariant.get() - ); - - if ( - this.root.logic.tryPlaceBuilding({ - origin: tile, - rotation, - rotationVariant, - originalRotation: this.currentBaseRotation, - building: this.currentMetaBuilding.get(), - variant: this.currentVariant.get(), - }) - ) { - // Succesfully placed - - if ( - metaBuilding.getFlipOrientationAfterPlacement() && - !this.root.keyMapper - .getBinding(KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation) - .isCurrentlyPressed() - ) { - this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; - } - - if ( - !metaBuilding.getStayInPlacementMode() && - !this.root.keyMapper - .getBinding(KEYMAPPINGS.placementModifiers.placeMultiple) - .isCurrentlyPressed() && - !this.root.app.settings.getAllSettings().alwaysMultiplace - ) { - // Stop placement - this.currentMetaBuilding.set(null); - } - - return true; - } else { - return false; - } - } - /** * * @param {DrawParameters} parameters @@ -529,14 +170,28 @@ export class HUDBuildingPlacer extends BaseHUDPart { return; } + // Draw direction lock + if (this.isDirectionLockActive) { + this.drawDirectionLock(parameters); + } else { + this.drawRegularPlacement(parameters); + } + } + + /** + * @param {DrawParameters} parameters + */ + drawRegularPlacement(parameters) { const mousePosition = this.root.app.mousePosition; if (!mousePosition) { // Not on screen return; } + const metaBuilding = this.currentMetaBuilding.get(); + const worldPos = this.root.camera.screenToWorld(mousePosition); - const tile = worldPos.toTileSpace(); + const mouseTile = worldPos.toTileSpace(); // Compute best rotation variant const { @@ -545,7 +200,7 @@ export class HUDBuildingPlacer extends BaseHUDPart { connectedEntities, } = metaBuilding.computeOptimalDirectionAndRotationVariantAtTile( this.root, - tile, + mouseTile, this.currentBaseRotation, this.currentVariant.get() ); @@ -558,7 +213,7 @@ export class HUDBuildingPlacer extends BaseHUDPart { .getCenter() .toWorldSpace(); - const startWsPoint = tile.toWorldSpaceCenterOfTile(); + const startWsPoint = mouseTile.toWorldSpaceCenterOfTile(); const startOffset = connectedWsPoint .sub(startWsPoint) @@ -583,14 +238,14 @@ export class HUDBuildingPlacer extends BaseHUDPart { // Synchronize rotation and origin const staticComp = this.fakeEntity.components.StaticMapEntity; - staticComp.origin = tile; + staticComp.origin = mouseTile; staticComp.rotation = rotation; staticComp.tileSize = metaBuilding.getDimensions(this.currentVariant.get()); metaBuilding.updateVariants(this.fakeEntity, rotationVariant, this.currentVariant.get()); // Check if we could place the buildnig const canBuild = this.root.logic.checkCanPlaceBuilding({ - origin: tile, + origin: mouseTile, rotation, rotationVariant, building: metaBuilding, @@ -627,7 +282,7 @@ export class HUDBuildingPlacer extends BaseHUDPart { const previewSprite = metaBuilding.getBlueprintSprite(rotationVariant, this.currentVariant.get()); staticComp.origin = worldPos.divideScalar(globalConfig.tileSize).subScalars(0.5, 0.5); staticComp.drawSpriteOnFullEntityBounds(parameters, previewSprite); - staticComp.origin = tile; + staticComp.origin = mouseTile; // Draw ejectors if (canBuild) { @@ -636,7 +291,63 @@ export class HUDBuildingPlacer extends BaseHUDPart { } /** - * + * @param {DrawParameters} parameters + */ + drawDirectionLock(parameters) { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return; + } + + const mouseWorld = this.root.camera.screenToWorld(mousePosition); + const mouseTile = mouseWorld.toTileSpace(); + parameters.context.fillStyle = THEME.map.directionLock; + parameters.context.strokeStyle = THEME.map.directionLockTrack; + parameters.context.lineWidth = 10; + + parameters.context.beginCircle(mouseWorld.x, mouseWorld.y, 4); + parameters.context.fill(); + + if (this.lastDragTile) { + const startLine = this.lastDragTile.toWorldSpaceCenterOfTile(); + const endLine = mouseTile.toWorldSpaceCenterOfTile(); + const midLine = this.currentDirectionLockCorner.toWorldSpaceCenterOfTile(); + + parameters.context.beginCircle(startLine.x, startLine.y, 8); + parameters.context.fill(); + + parameters.context.beginPath(); + parameters.context.moveTo(startLine.x, startLine.y); + parameters.context.lineTo(midLine.x, midLine.y); + parameters.context.lineTo(endLine.x, endLine.y); + parameters.context.stroke(); + + parameters.context.beginCircle(endLine.x, endLine.y, 5); + parameters.context.fill(); + + // Draw arrows + const path = this.computeDirectionLockPath(); + for (let i = 0; i < path.length - 1; i += 1) { + const { rotation, tile } = path[i]; + const worldPos = tile.toWorldSpaceCenterOfTile(); + drawRotatedSprite({ + parameters, + sprite: this.lockIndicatorSprite, + x: worldPos.x, + y: worldPos.y, + angle: Math_radians(rotation), + size: 12, + offsetY: + -globalConfig.halfTileSize - + clamp((this.root.time.now() * 1.5) % 1.0, 0, 1) * 1 * globalConfig.tileSize + + globalConfig.halfTileSize, + }); + } + } + } + + /** * @param {DrawParameters} parameters */ drawMatchingAcceptorsAndEjectors(parameters) { diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js new file mode 100644 index 00000000..0da81d4a --- /dev/null +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -0,0 +1,690 @@ +import { Math_abs, Math_degrees, Math_round } from "../../../core/builtins"; +import { globalConfig } from "../../../core/config"; +import { gMetaBuildingRegistry } from "../../../core/global_registries"; +import { Signal, STOP_PROPAGATION } from "../../../core/signal"; +import { TrackedState } from "../../../core/tracked_state"; +import { Vector } from "../../../core/vector"; +import { enumMouseButton } from "../../camera"; +import { StaticMapEntityComponent } from "../../components/static_map_entity"; +import { Entity } from "../../entity"; +import { KEYMAPPINGS } from "../../key_action_mapper"; +import { defaultBuildingVariant, MetaBuilding } from "../../meta_building"; +import { BaseHUDPart } from "../base_hud_part"; + +/** + * Contains all logic for the building placer - this doesn't include the rendering + * of info boxes or drawing. + */ +export class HUDBuildingPlacerLogic extends BaseHUDPart { + /** + * Initializes the logic + * @see BaseHUDPart.initialize + */ + initialize() { + /** + * We use a fake entity to get information about how a building will look + * once placed + * @type {Entity} + */ + this.fakeEntity = null; + + // Signals + this.signals = { + variantChanged: new Signal(), + draggingStarted: new Signal(), + }; + + /** + * The current building + * @type {TypedTrackedState} + */ + this.currentMetaBuilding = new TrackedState(this.onSelectedMetaBuildingChanged, this); + + /** + * The current rotation + * @type {number} + */ + this.currentBaseRotation = 0; + + /** + * Whether we are currently dragging + * @type {boolean} + */ + this.currentlyDragging = false; + + /** + * Current building variant + * @type {TypedTrackedState} + */ + this.currentVariant = new TrackedState(() => this.signals.variantChanged.dispatch()); + + /** + * Whether we are currently drag-deleting + * @type {boolean} + */ + this.currentlyDeleting = false; + + /** + * Stores which variants for each building we prefer, this is based on what + * the user last selected + * @type {Object.} + */ + this.preferredVariants = {}; + + /** + * The tile we last dragged from + * @type {Vector} + */ + this.lastDragTile = null; + + /** + * The side for direction lock + * @type {number} (0|1) + */ + this.currentDirectionLockSide = 0; + + this.initializeBindings(); + } + + /** + * Initializes all bindings + */ + initializeBindings() { + // KEYBINDINGS + const keyActionMapper = this.root.keyMapper; + keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.tryRotate, this); + keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this); + keyActionMapper + .getBinding(KEYMAPPINGS.placement.switchDirectionLockSide) + .add(this.switchDirectionLockSide, this); + keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this); + keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.startPipette, this); + this.root.gameState.inputReciever.keyup.add(this.checkForDirectionLockSwitch, this); + + // BINDINGS TO GAME EVENTS + this.root.hud.signals.buildingsSelectedForCopy.add(this.abortPlacement, this); + this.root.hud.signals.pasteBlueprintRequested.add(this.abortPlacement, this); + this.root.signals.storyGoalCompleted.add(() => this.signals.variantChanged.dispatch()); + this.root.signals.upgradePurchased.add(() => this.signals.variantChanged.dispatch()); + + // MOUSE BINDINGS + this.root.camera.downPreHandler.add(this.onMouseDown, this); + this.root.camera.movePreHandler.add(this.onMouseMove, this); + this.root.camera.upPostHandler.add(this.onMouseUp, this); + } + + /** + * Returns if the direction lock is currently active + * @returns {boolean} + */ + get isDirectionLockActive() { + const metaBuilding = this.currentMetaBuilding.get(); + return ( + metaBuilding && + metaBuilding.getHasDirectionLockAvailable() && + this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.lockBeltDirection).pressed + ); + } + + /** + * Returns the current direction lock corner, that is, the corner between + * mouse and original start point + * @returns {Vector|null} + */ + get currentDirectionLockCorner() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return null; + } + + if (!this.lastDragTile) { + // Haven't dragged yet + return null; + } + + // Figure which points the line visits + const worldPos = this.root.camera.screenToWorld(mousePosition); + const mouseTile = worldPos.toTileSpace(); + + if (this.currentDirectionLockSide === 0) { + return new Vector(this.lastDragTile.x, mouseTile.y); + } else { + return new Vector(mouseTile.x, this.lastDragTile.y); + } + } + + /** + * Aborts the placement + */ + abortPlacement() { + if (this.currentMetaBuilding.get()) { + this.currentMetaBuilding.set(null); + return STOP_PROPAGATION; + } + } + + /** + * Aborts any dragging + */ + abortDragging() { + this.currentlyDragging = true; + this.currentlyDeleting = false; + this.initialPlacementVector = null; + this.lastDragTile = null; + } + + /** + * @see BaseHUDPart.update + */ + update() { + // Always update since the camera might have moved + const mousePos = this.root.app.mousePosition; + if (mousePos) { + this.onMouseMove(mousePos); + } + } + + /** + * Tries to rotate the current building + */ + tryRotate() { + const selectedBuilding = this.currentMetaBuilding.get(); + if (selectedBuilding) { + if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) { + this.currentBaseRotation = (this.currentBaseRotation + 270) % 360; + } else { + this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; + } + const staticComp = this.fakeEntity.components.StaticMapEntity; + staticComp.rotation = this.currentBaseRotation; + } + } + /** + * Tries to delete the building under the mouse + */ + deleteBelowCursor() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + const contents = this.root.map.getTileContent(tile); + if (contents) { + this.root.logic.tryDeleteBuilding(contents); + } + } + + /** + * Starts the pipette function + */ + startPipette() { + // Disable in overview + if (this.root.camera.getIsMapOverlayActive()) { + return; + } + + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return; + } + + const worldPos = this.root.camera.screenToWorld(mousePosition); + const tile = worldPos.toTileSpace(); + const contents = this.root.map.getTileContent(tile); + + if (!contents) { + this.currentMetaBuilding.set(null); + return; + } + + // Try to extract the building + const extracted = this.hack_reconstructMetaBuildingAndVariantFromBuilding(contents); + if (!extracted) { + this.currentMetaBuilding.set(null); + return; + } + + this.currentMetaBuilding.set(extracted.metaBuilding); + this.currentVariant.set(extracted.variant); + this.currentBaseRotation = contents.components.StaticMapEntity.rotation; + + // Make sure we selected something, and also make sure it's not a special entity + // if (contents && !contents.components.Unremovable) { + + // } + } + + /** + * HACK! + * + * This attempts to reconstruct the meta building and its variant from a given entity + * @param {Entity} entity + * @returns {{ metaBuilding: MetaBuilding, variant: string }} + */ + hack_reconstructMetaBuildingAndVariantFromBuilding(entity) { + if (entity.components.Hub) { + // Hub is not copyable + return null; + } + + const matches = []; + const metaBuildings = gMetaBuildingRegistry.entries; + for (let i = 0; i < metaBuildings.length; ++i) { + const metaBuilding = metaBuildings[i]; + const availableVariants = metaBuilding.getAvailableVariants(this.root); + checkVariant: for (let k = 0; k < availableVariants.length; ++k) { + const variant = availableVariants[k]; + let unplaced = metaBuilding.createEntity({ + root: this.root, + variant, + origin: new Vector(0, 0), + rotation: 0, + originalRotation: 0, + rotationVariant: 0, + }); + + // Compare if both entities share the same components + for (let component in entity.components) { + if ((entity.components[component] == null) !== (unplaced.components[component] == null)) { + continue checkVariant; + } + } + + // Check for same item processor + if ( + entity.components.ItemProcessor && + entity.components.ItemProcessor.type != unplaced.components.ItemProcessor.type + ) { + continue checkVariant; + } + + // Check for underground belt + if ( + entity.components.UndergroundBelt && + entity.components.UndergroundBelt.tier != unplaced.components.UndergroundBelt.tier + ) { + continue checkVariant; + } + + // Check for same sprite key - except for underground belts + // since the sprite may vary here + if ( + !entity.components.UndergroundBelt && + entity.components.StaticMapEntity.spriteKey != + unplaced.components.StaticMapEntity.spriteKey + ) { + continue checkVariant; + } + matches.push({ metaBuilding, variant }); + } + } + + if (matches.length == 1) { + const staticEntity = entity.components.StaticMapEntity; + const key = staticEntity.spriteKey || staticEntity.blueprintSpriteKey; + assert( + key && + key.includes(matches[0].metaBuilding.id) && + (matches[0].variant === defaultBuildingVariant || key.includes(matches[0].variant)) + ); + return matches[0]; + } + return null; + } + + switchDirectionLockSide() { + this.currentDirectionLockSide = 1 - this.currentDirectionLockSide; + } + + /** + * Checks if the direction lock key got released and if such, resets the placement + * @param {any} args + */ + checkForDirectionLockSwitch({ keyCode }) { + if ( + keyCode === + this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.lockBeltDirection).keyCode + ) { + this.abortDragging(); + } + } + + /** + * Tries to place the current building at the given tile + * @param {Vector} tile + */ + tryPlaceCurrentBuildingAt(tile) { + if (this.root.camera.zoomLevel < globalConfig.mapChunkOverviewMinZoom) { + // Dont allow placing in overview mode + return; + } + + const metaBuilding = this.currentMetaBuilding.get(); + const { rotation, rotationVariant } = metaBuilding.computeOptimalDirectionAndRotationVariantAtTile( + this.root, + tile, + this.currentBaseRotation, + this.currentVariant.get() + ); + + const entity = this.root.logic.tryPlaceBuilding({ + origin: tile, + rotation, + rotationVariant, + originalRotation: this.currentBaseRotation, + building: this.currentMetaBuilding.get(), + variant: this.currentVariant.get(), + }); + + if (entity) { + // Succesfully placed, find which entity we actually placed + this.root.signals.entityManuallyPlaced.dispatch(entity); + + // Check if we should flip the orientation (used for tunnels) + if ( + metaBuilding.getFlipOrientationAfterPlacement() && + !this.root.keyMapper.getBinding( + KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation + ).pressed + ) { + this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; + } + + // Check if we should stop placement + if ( + !metaBuilding.getStayInPlacementMode() && + !this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).pressed && + !this.root.app.settings.getAllSettings().alwaysMultiplace + ) { + // Stop placement + this.currentMetaBuilding.set(null); + } + return true; + } else { + return false; + } + } + + /** + * Cycles through the variants + */ + cycleVariants() { + const metaBuilding = this.currentMetaBuilding.get(); + if (!metaBuilding) { + this.currentVariant.set(defaultBuildingVariant); + } else { + const availableVariants = metaBuilding.getAvailableVariants(this.root); + const index = availableVariants.indexOf(this.currentVariant.get()); + assert( + index >= 0, + "Current variant was invalid: " + this.currentVariant.get() + " out of " + availableVariants + ); + const newIndex = (index + 1) % availableVariants.length; + const newVariant = availableVariants[newIndex]; + this.currentVariant.set(newVariant); + + this.preferredVariants[metaBuilding.getId()] = newVariant; + } + } + + /** + * Performs the direction locked placement between two points after + * releasing the mouse + */ + executeDirectionLockedPlacement() { + const path = this.computeDirectionLockPath(); + this.root.logic.performBulkOperation(() => { + for (let i = 0; i < path.length; ++i) { + const { rotation, tile } = path[i]; + + this.currentBaseRotation = rotation; + this.tryPlaceCurrentBuildingAt(tile); + } + }); + } + + /** + * Finds the path which the current direction lock will use + * @returns {Array<{ tile: Vector, rotation: number }>} + */ + computeDirectionLockPath() { + const mousePosition = this.root.app.mousePosition; + if (!mousePosition) { + // Not on screen + return []; + } + + let result = []; + + // Figure which points the line visits + const worldPos = this.root.camera.screenToWorld(mousePosition); + const mouseTile = worldPos.toTileSpace(); + const startTile = this.lastDragTile; + + // Place from start to corner + const pathToCorner = this.currentDirectionLockCorner.sub(startTile); + const deltaToCorner = pathToCorner.normalize().round(); + const lengthToCorner = Math_round(pathToCorner.length()); + let currentPos = startTile.copy(); + + let rotation = (Math.round(Math_degrees(deltaToCorner.angle()) / 90) * 90 + 360) % 360; + + if (lengthToCorner > 0) { + for (let i = 0; i < lengthToCorner; ++i) { + result.push({ + tile: currentPos.copy(), + rotation, + }); + currentPos.addInplace(deltaToCorner); + } + } + + // Place from corner to end + const pathFromCorner = mouseTile.sub(this.currentDirectionLockCorner); + const deltaFromCorner = pathFromCorner.normalize().round(); + const lengthFromCorner = Math_round(pathFromCorner.length()); + + if (lengthFromCorner > 0) { + rotation = (Math.round(Math_degrees(deltaFromCorner.angle()) / 90) * 90 + 360) % 360; + for (let i = 0; i < lengthFromCorner + 1; ++i) { + result.push({ + tile: currentPos.copy(), + rotation, + }); + currentPos.addInplace(deltaFromCorner); + } + } else { + // Finish last one + result.push({ + tile: currentPos.copy(), + rotation, + }); + } + return result; + } + + /** + * Selects a given building + * @param {MetaBuilding} metaBuilding + */ + startSelection(metaBuilding) { + this.currentMetaBuilding.set(metaBuilding); + } + + /** + * Called when the selected buildings changed + * @param {MetaBuilding} metaBuilding + */ + onSelectedMetaBuildingChanged(metaBuilding) { + this.abortDragging(); + this.root.hud.signals.selectedPlacementBuildingChanged.dispatch(metaBuilding); + if (metaBuilding) { + const variant = this.preferredVariants[metaBuilding.getId()] || defaultBuildingVariant; + this.currentVariant.set(variant); + + this.fakeEntity = new Entity(null); + metaBuilding.setupEntityComponents(this.fakeEntity, null); + + this.fakeEntity.addComponent( + new StaticMapEntityComponent({ + origin: new Vector(0, 0), + rotation: 0, + tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(), + blueprintSpriteKey: "", + }) + ); + metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get()); + } else { + this.fakeEntity = null; + } + + // Since it depends on both, rerender twice + this.signals.variantChanged.dispatch(); + } + + /** + * mouse down pre handler + * @param {Vector} pos + * @param {enumMouseButton} button + */ + onMouseDown(pos, button) { + if (this.root.camera.getIsMapOverlayActive()) { + // We do not allow dragging if the overlay is active + return; + } + + const metaBuilding = this.currentMetaBuilding.get(); + + // Placement + if (button === enumMouseButton.left && metaBuilding) { + this.currentlyDragging = true; + this.currentlyDeleting = false; + this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace(); + + // Place initial building, but only if direction lock is not active + if (!this.isDirectionLockActive) { + this.tryPlaceCurrentBuildingAt(this.lastDragTile); + } + return STOP_PROPAGATION; + } + + // Deletion + if (button === enumMouseButton.right && !metaBuilding) { + this.currentlyDragging = true; + this.currentlyDeleting = true; + this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace(); + this.deleteBelowCursor(); + return STOP_PROPAGATION; + } + + // Cancel placement + if (button === enumMouseButton.right && metaBuilding) { + this.currentMetaBuilding.set(null); + } + } + + /** + * mouse move pre handler + * @param {Vector} pos + */ + onMouseMove(pos) { + if (this.root.camera.getIsMapOverlayActive()) { + return; + } + + // Check for direction lock + if (this.isDirectionLockActive) { + return; + } + + const metaBuilding = this.currentMetaBuilding.get(); + if ((metaBuilding || this.currentlyDeleting) && this.lastDragTile) { + const oldPos = this.lastDragTile; + let newPos = this.root.camera.screenToWorld(pos).toTileSpace(); + + // Check if camera is moving, since then we do nothing + if (this.root.camera.desiredCenter) { + this.lastDragTile = newPos; + return; + } + + // Check if anything changed + if (!oldPos.equals(newPos)) { + // Automatic Direction + if ( + metaBuilding && + metaBuilding.getRotateAutomaticallyWhilePlacing(this.currentVariant.get()) && + !this.root.keyMapper.getBinding( + KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation + ).pressed + ) { + const delta = newPos.sub(oldPos); + const angleDeg = Math_degrees(delta.angle()); + this.currentBaseRotation = (Math.round(angleDeg / 90) * 90 + 360) % 360; + + // Holding alt inverts the placement + if (this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeInverse).pressed) { + this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; + } + } + + // bresenham + let x0 = oldPos.x; + let y0 = oldPos.y; + let x1 = newPos.x; + let y1 = newPos.y; + + var dx = Math_abs(x1 - x0); + var dy = Math_abs(y1 - y0); + var sx = x0 < x1 ? 1 : -1; + var sy = y0 < y1 ? 1 : -1; + var err = dx - dy; + + while (this.currentlyDeleting || this.currentMetaBuilding.get()) { + if (this.currentlyDeleting) { + const contents = this.root.map.getTileContentXY(x0, y0); + if (contents && !contents.queuedForDestroy && !contents.destroyed) { + this.root.logic.tryDeleteBuilding(contents); + } + } else { + this.tryPlaceCurrentBuildingAt(new Vector(x0, y0)); + } + if (x0 === x1 && y0 === y1) break; + var e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x0 += sx; + } + if (e2 < dx) { + err += dx; + y0 += sy; + } + } + } + + this.lastDragTile = newPos; + return STOP_PROPAGATION; + } + } + + /** + * Mouse up handler + */ + onMouseUp() { + if (this.root.camera.getIsMapOverlayActive()) { + return; + } + + // Check for direction lock + if (this.lastDragTile && this.currentlyDragging && this.isDirectionLockActive) { + this.executeDirectionLockedPlacement(); + } + + this.abortDragging(); + } +} diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js index 24d7040e..63208b19 100644 --- a/src/js/game/hud/parts/keybinding_overlay.js +++ b/src/js/game/hud/parts/keybinding_overlay.js @@ -1,102 +1,316 @@ import { makeDiv } from "../../../core/utils"; import { T } from "../../../translations"; -import { getStringForKeyCode, KEYMAPPINGS } from "../../key_action_mapper"; +import { + getStringForKeyCode, + KEYCODE_LMB, + KEYCODE_MMB, + KEYCODE_RMB, + KEYMAPPINGS, +} from "../../key_action_mapper"; import { BaseHUDPart } from "../base_hud_part"; -import { TrackedState } from "../../../core/tracked_state"; +import { DynamicDomAttach } from "../dynamic_dom_attach"; + +const DIVIDER_TOKEN = "/"; +const ADDER_TOKEN = "+"; + +/** + * @typedef {{ keyCode: number }} KeyCode + */ + +/** + * @typedef {{ + * condition: () => boolean, + * keys: Array, + * label: string, + * cachedElement?: HTMLElement, + * cachedVisibility?: boolean + * }} KeyBinding + */ export class HUDKeybindingOverlay extends BaseHUDPart { - initialize() { - this.root.hud.signals.selectedPlacementBuildingChanged.add( - this.onSelectedBuildingForPlacementChanged, - this - ); + initialize() {} - this.trackedMapOverviewActive = new TrackedState(this.applyCssClasses, this); + /** + * HELPER / Returns if there is a building selected for placement + * @returns {boolean} + */ + get buildingPlacementActive() { + const placer = this.root.hud.parts.buildingPlacer; + return !this.mapOverviewActive && placer && !!placer.currentMetaBuilding.get(); } + /** + * HELPER / Returns if there is a building selected for placement and + * it supports the belt planner + * @returns {boolean} + */ + get buildingPlacementSupportsBeltPlanner() { + const placer = this.root.hud.parts.buildingPlacer; + return ( + !this.mapOverviewActive && + placer && + placer.currentMetaBuilding.get() && + placer.currentMetaBuilding.get().getHasDirectionLockAvailable() + ); + } + + /** + * HELPER / Returns if there is a building selected for placement and + * it has multiplace enabled by default + * @returns {boolean} + */ + get buildingPlacementStaysInPlacement() { + const placer = this.root.hud.parts.buildingPlacer; + return ( + !this.mapOverviewActive && + placer && + placer.currentMetaBuilding.get() && + placer.currentMetaBuilding.get().getStayInPlacementMode() + ); + } + + /** + * HELPER / Returns if there is a blueprint selected for placement + * @returns {boolean} + */ + get blueprintPlacementActive() { + const placer = this.root.hud.parts.blueprintPlacer; + return placer && !!placer.currentBlueprint.get(); + } + + /** + * HELPER / Returns if the belt planner is currently active + * @returns {boolean} + */ + get beltPlannerActive() { + const placer = this.root.hud.parts.buildingPlacer; + return !this.mapOverviewActive && placer && placer.isDirectionLockActive; + } + + /** + * HELPER / Returns if there is a last blueprint available + * @returns {boolean} + */ + get lastBlueprintAvailable() { + const placer = this.root.hud.parts.blueprintPlacer; + return placer && !!placer.lastBlueprintUsed; + } + + /** + * HELPER / Returns if there is anything selected on the map + * @returns {boolean} + */ + get anythingSelectedOnMap() { + const selector = this.root.hud.parts.massSelector; + return selector && selector.selectedUids.size > 0; + } + + /** + * HELPER / Returns if there is a building or blueprint selected for placement + * @returns {boolean} + */ + get anyPlacementActive() { + return this.buildingPlacementActive || this.blueprintPlacementActive; + } + + /** + * HELPER / Returns if the map overview is active + * @returns {boolean} + */ + get mapOverviewActive() { + return this.root.camera.getIsMapOverlayActive(); + } + + /** + * Initializes the element + * @param {HTMLElement} parent + */ createElements(parent) { const mapper = this.root.keyMapper; + const k = KEYMAPPINGS; - const getKeycode = id => { - return getStringForKeyCode(mapper.getBinding(id).keyCode); - }; + /** @type {Array} */ + this.keybindings = [ + { + // Move map - Including mouse + label: T.ingame.keybindingsOverlay.moveMap, + keys: [ + KEYCODE_LMB, + DIVIDER_TOKEN, + k.navigation.mapMoveUp, + k.navigation.mapMoveLeft, + k.navigation.mapMoveDown, + k.navigation.mapMoveRight, + ], + condition: () => !this.anyPlacementActive, + }, - this.element = makeDiv( - parent, - "ingame_HUD_KeybindingOverlay", - [], - ` + { + // Move map - No mouse + label: T.ingame.keybindingsOverlay.moveMap, + keys: [ + k.navigation.mapMoveUp, + k.navigation.mapMoveLeft, + k.navigation.mapMoveDown, + k.navigation.mapMoveRight, + ], + condition: () => this.anyPlacementActive, + }, - - - ${getKeycode(KEYMAPPINGS.navigation.mapMoveUp)} - ${getKeycode(KEYMAPPINGS.navigation.mapMoveLeft)} - ${getKeycode(KEYMAPPINGS.navigation.mapMoveDown)} - ${getKeycode(KEYMAPPINGS.navigation.mapMoveRight)} - ${T.ingame.keybindingsOverlay.moveMap} - + { + // [OVERVIEW] Create marker with right click + label: T.ingame.keybindingsOverlay.createMarker, + keys: [KEYCODE_RMB], + condition: () => this.mapOverviewActive && !this.blueprintPlacementActive, + }, + { + // Pipette + label: T.ingame.keybindingsOverlay.pipette, + keys: [k.placement.pipette], + condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive, + }, + { + // Cancel placement + label: T.ingame.keybindingsOverlay.stopPlacement, + keys: [KEYCODE_RMB], + condition: () => this.anyPlacementActive, + }, - - - ${T.ingame.keybindingsOverlay.delete} - + { + // Delete with right click + label: T.ingame.keybindingsOverlay.delete, + keys: [KEYCODE_RMB], + condition: () => + !this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap, + }, - - - ${T.ingame.keybindingsOverlay.createMarker} - + { + // Area select + label: T.ingame.keybindingsOverlay.selectBuildings, + keys: [k.massSelect.massSelectStart, ADDER_TOKEN, KEYCODE_LMB], + condition: () => !this.anyPlacementActive && !this.anythingSelectedOnMap, + }, + { + // Place building + label: T.ingame.keybindingsOverlay.placeBuilding, + keys: [KEYCODE_LMB], + condition: () => this.anyPlacementActive, + }, - - ${getKeycode( - KEYMAPPINGS.massSelect.massSelectStart - )}+ - - ${T.ingame.keybindingsOverlay.selectBuildings} - + { + // Rotate + label: T.ingame.keybindingsOverlay.rotateBuilding, + keys: [k.placement.rotateWhilePlacing], + condition: () => this.anyPlacementActive && !this.beltPlannerActive, + }, - - - ${T.ingame.keybindingsOverlay.placeBuilding} - + { + // [BELT PLANNER] Flip Side + label: T.ingame.keybindingsOverlay.plannerSwitchSide, + keys: [k.placement.switchDirectionLockSide], + condition: () => this.beltPlannerActive, + }, - - - ${getKeycode(KEYMAPPINGS.placement.abortBuildingPlacement)} - ${T.ingame.keybindingsOverlay.stopPlacement} - + { + // Place last blueprint + label: T.ingame.keybindingsOverlay.pasteLastBlueprint, + keys: [k.massSelect.pasteLastBlueprint], + condition: () => !this.blueprintPlacementActive && this.lastBlueprintAvailable, + }, - - ${getKeycode(KEYMAPPINGS.placement.rotateWhilePlacing)} - ${T.ingame.keybindingsOverlay.rotateBuilding} - + { + // Belt planner + label: T.ingame.keybindingsOverlay.lockBeltDirection, + keys: [k.placementModifiers.lockBeltDirection], + condition: () => this.buildingPlacementSupportsBeltPlanner && !this.beltPlannerActive, + }, - ` + - (this.root.app.settings.getAllSettings().alwaysMultiplace - ? "" - : ` - - ${getKeycode( - KEYMAPPINGS.placementModifiers.placeMultiple - )} - ${T.ingame.keybindingsOverlay.placeMultiple} - `) + - ` - ` - ); - } + { + // [SELECTION] Destroy + label: T.ingame.keybindingsOverlay.delete, + keys: [k.massSelect.confirmMassDelete], + condition: () => this.anythingSelectedOnMap, + }, - onSelectedBuildingForPlacementChanged(selectedMetaBuilding) { - this.element.classList.toggle("placementActive", !!selectedMetaBuilding); - } + { + // [SELECTION] Cancel + label: T.ingame.keybindingsOverlay.clearSelection, + keys: [k.general.back], + condition: () => this.anythingSelectedOnMap, + }, + { + // [SELECTION] Cut + label: T.ingame.keybindingsOverlay.cutSelection, + keys: [k.massSelect.massSelectCut], + condition: () => this.anythingSelectedOnMap, + }, - applyCssClasses() { - this.element.classList.toggle("mapOverviewActive", this.root.camera.getIsMapOverlayActive()); + { + // [SELECTION] Copy + label: T.ingame.keybindingsOverlay.copySelection, + keys: [k.massSelect.massSelectCopy], + condition: () => this.anythingSelectedOnMap, + }, + ]; + + if (!this.root.app.settings.getAllSettings().alwaysMultiplace) { + this.keybindings.push({ + // Multiplace + label: T.ingame.keybindingsOverlay.placeMultiple, + keys: [k.placementModifiers.placeMultiple], + condition: () => this.anyPlacementActive && !this.buildingPlacementStaysInPlacement, + }); + } + + this.element = makeDiv(parent, "ingame_HUD_KeybindingOverlay", []); + + for (let i = 0; i < this.keybindings.length; ++i) { + let html = ""; + const handle = this.keybindings[i]; + + for (let k = 0; k < handle.keys.length; ++k) { + const key = handle.keys[k]; + + switch (key) { + case KEYCODE_LMB: + html += ``; + break; + case KEYCODE_RMB: + html += ``; + break; + case KEYCODE_MMB: + html += ``; + break; + case DIVIDER_TOKEN: + html += ``; + break; + case ADDER_TOKEN: + html += `+`; + break; + default: + html += `${getStringForKeyCode( + mapper.getBinding(/** @type {KeyCode} */ (key)).keyCode + )}`; + } + } + html += `${handle.label}`; + + handle.cachedElement = makeDiv(this.element, null, ["binding"], html); + handle.cachedVisibility = false; + } } update() { - this.trackedMapOverviewActive.set(this.root.camera.getIsMapOverlayActive()); + for (let i = 0; i < this.keybindings.length; ++i) { + const handle = this.keybindings[i]; + const visibility = handle.condition(); + if (visibility !== handle.cachedVisibility) { + handle.cachedVisibility = visibility; + handle.cachedElement.classList.toggle("visible", visibility); + } + } } } diff --git a/src/js/game/hud/parts/mass_selector.js b/src/js/game/hud/parts/mass_selector.js index b89108c0..a3505e2d 100644 --- a/src/js/game/hud/parts/mass_selector.js +++ b/src/js/game/hud/parts/mass_selector.js @@ -17,29 +17,7 @@ import { enumHubGoalRewards } from "../../tutorial_goals"; const logger = createLogger("hud/mass_selector"); export class HUDMassSelector extends BaseHUDPart { - createElements(parent) { - const removalKeybinding = this.root.keyMapper - .getBinding(KEYMAPPINGS.massSelect.confirmMassDelete) - .getKeyCodeString(); - const abortKeybinding = this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).getKeyCodeString(); - const cutKeybinding = this.root.keyMapper - .getBinding(KEYMAPPINGS.massSelect.massSelectCut) - .getKeyCodeString(); - const copyKeybinding = this.root.keyMapper - .getBinding(KEYMAPPINGS.massSelect.massSelectCopy) - .getKeyCodeString(); - - this.element = makeDiv( - parent, - "ingame_HUD_MassSelector", - [], - T.ingame.massSelect.infoText - .replace("", `${removalKeybinding}`) - .replace("", `${cutKeybinding}`) - .replace("", `${copyKeybinding}`) - .replace("", `${abortKeybinding}`) - ); - } + createElements(parent) {} initialize() { this.deletionMarker = Loader.getSprite("sprites/misc/deletion_marker.png"); @@ -49,6 +27,7 @@ export class HUDMassSelector extends BaseHUDPart { this.selectedUids = new Set(); this.root.signals.entityQueuedForDestroy.add(this.onEntityDestroyed, this); + this.root.hud.signals.pasteBlueprintRequested.add(this.clearSelection, this); this.root.camera.downPreHandler.add(this.onMouseDown, this); this.root.camera.movePreHandler.add(this.onMouseMove, this); @@ -61,7 +40,7 @@ export class HUDMassSelector extends BaseHUDPart { this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectCut).add(this.confirmCut, this); this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectCopy).add(this.startCopy, this); - this.domAttach = new DynamicDomAttach(this.root, this.element); + this.root.hud.signals.selectedPlacementBuildingChanged.add(this.clearSelection, this); } /** @@ -83,15 +62,25 @@ export class HUDMassSelector extends BaseHUDPart { } } + /** + * Clears the entire selection + */ + clearSelection() { + this.selectedUids = new Set(); + } + confirmDelete() { - if (this.selectedUids.size > 100) { + if ( + !this.root.app.settings.getAllSettings().disableCutDeleteWarnings && + this.selectedUids.size > 100 + ) { const { ok } = this.root.hud.parts.dialogs.showWarning( T.dialogs.massDeleteConfirm.title, T.dialogs.massDeleteConfirm.desc.replace( "", "" + formatBigNumberFull(this.selectedUids.size) ), - ["cancel:good", "ok:bad"] + ["cancel:good:escape", "ok:bad:enter"] ); ok.add(() => this.doDelete()); } else { @@ -134,14 +123,17 @@ export class HUDMassSelector extends BaseHUDPart { T.dialogs.blueprintsNotUnlocked.title, T.dialogs.blueprintsNotUnlocked.desc ); - } else if (this.selectedUids.size > 100) { + } else if ( + !this.root.app.settings.getAllSettings().disableCutDeleteWarnings && + this.selectedUids.size > 100 + ) { const { ok } = this.root.hud.parts.dialogs.showWarning( T.dialogs.massCutConfirm.title, T.dialogs.massCutConfirm.desc.replace( "", "" + formatBigNumberFull(this.selectedUids.size) ), - ["cancel:good", "ok:bad"] + ["cancel:good:escape", "ok:bad:enter"] ); ok.add(() => this.doCut()); } else { @@ -177,7 +169,7 @@ export class HUDMassSelector extends BaseHUDPart { * @param {enumMouseButton} mouseButton */ onMouseDown(pos, mouseButton) { - if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectStart).isCurrentlyPressed()) { + if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectStart).pressed) { return; } @@ -185,11 +177,7 @@ export class HUDMassSelector extends BaseHUDPart { return; } - if ( - !this.root.keyMapper - .getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiple) - .isCurrentlyPressed() - ) { + if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiple).pressed) { // Start new selection this.selectedUids = new Set(); } @@ -234,10 +222,6 @@ export class HUDMassSelector extends BaseHUDPart { } } - update() { - this.domAttach.update(this.selectedUids.size > 0); - } - /** * * @param {DrawParameters} parameters diff --git a/src/js/game/hud/parts/screenshot_exporter.js b/src/js/game/hud/parts/screenshot_exporter.js index dfdd8224..8623f902 100644 --- a/src/js/game/hud/parts/screenshot_exporter.js +++ b/src/js/game/hud/parts/screenshot_exporter.js @@ -5,7 +5,7 @@ import { T } from "../../../translations"; import { createLogger } from "../../../core/logging"; import { StaticMapEntityComponent } from "../../components/static_map_entity"; import { Vector } from "../../../core/vector"; -import { Math_max, Math_min } from "../../../core/builtins"; +import { Math_max, Math_min, Math_floor } from "../../../core/builtins"; import { makeOffscreenBuffer } from "../../../core/buffer_utils"; import { DrawParameters } from "../../../core/draw_parameters"; import { Rectangle } from "../../../core/rectangle"; @@ -56,7 +56,14 @@ export class HUDScreenshotExporter extends BaseHUDPart { const dimensions = maxChunk.sub(minChunk); logger.log("Dimensions:", dimensions); - const chunkSizePixels = 128; + let chunkSizePixels = 128; + const maxDimensions = Math_max(dimensions.x, dimensions.y); + + if (maxDimensions > 128) { + chunkSizePixels = Math_max(1, Math_floor(128 * (128 / maxDimensions))); + } + logger.log("ChunkSizePixels:", chunkSizePixels); + const chunkScale = chunkSizePixels / (globalConfig.mapChunkSize * globalConfig.tileSize); logger.log("Scale:", chunkScale); diff --git a/src/js/game/hud/parts/waypoints.js b/src/js/game/hud/parts/waypoints.js index 82187e55..2472e57a 100644 --- a/src/js/game/hud/parts/waypoints.js +++ b/src/js/game/hud/parts/waypoints.js @@ -1,5 +1,5 @@ import { makeOffscreenBuffer } from "../../../core/buffer_utils"; -import { Math_max } from "../../../core/builtins"; +import { Math_max, Math_PI, Math_radians } from "../../../core/builtins"; import { globalConfig, IS_DEMO } from "../../../core/config"; import { DrawParameters } from "../../../core/draw_parameters"; import { Loader } from "../../../core/loader"; @@ -7,7 +7,7 @@ import { DialogWithForm } from "../../../core/modal_dialog_elements"; import { FormElementInput } from "../../../core/modal_dialog_forms"; import { Rectangle } from "../../../core/rectangle"; import { STOP_PROPAGATION } from "../../../core/signal"; -import { arrayDeleteValue, lerp, makeDiv, removeAllChildren } from "../../../core/utils"; +import { arrayDeleteValue, lerp, makeDiv, removeAllChildren, clamp } from "../../../core/utils"; import { Vector } from "../../../core/vector"; import { T } from "../../../translations"; import { enumMouseButton } from "../../camera"; @@ -15,16 +15,28 @@ import { KEYMAPPINGS } from "../../key_action_mapper"; import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; import { enumNotificationType } from "./notifications"; +import { ShapeDefinition } from "../../shape_definition"; /** @typedef {{ - * label: string, + * label: string | null, * center: { x: number, y: number }, - * zoomLevel: number, - * deletable: boolean + * zoomLevel: number * }} Waypoint */ +/** + * Used when a shape icon is rendered instead + */ +const SHAPE_LABEL_PLACEHOLDER = " "; + +const MAX_LABEL_LENGTH = 71; + export class HUDWaypoints extends BaseHUDPart { + /** + * Creates the overview of waypoints + * @param {HTMLElement} parent + */ createElements(parent) { + // Create the helper box on the lower right when zooming out if (this.root.app.settings.getAllSettings().offerHints) { this.hintElement = makeDiv( parent, @@ -42,17 +54,23 @@ export class HUDWaypoints extends BaseHUDPart { ); } - this.waypointSprite = Loader.getSprite("sprites/misc/waypoint.png"); - + // Create the waypoint list on the upper right this.waypointsListElement = makeDiv(parent, "ingame_HUD_Waypoints", [], "Waypoints"); } + /** + * Serializes the waypoints + */ serialize() { return { waypoints: this.waypoints, }; } + /** + * Deserializes the waypoints + * @param {{waypoints: Array}} data + */ deserialize(data) { if (!data || !data.waypoints || !Array.isArray(data.waypoints)) { return "Invalid waypoints data"; @@ -61,21 +79,97 @@ export class HUDWaypoints extends BaseHUDPart { this.rerenderWaypointList(); } + /** + * Initializes everything + */ + initialize() { + // Cache the sprite for the waypoints + this.waypointSprite = Loader.getSprite("sprites/misc/waypoint.png"); + this.directionIndicatorSprite = Loader.getSprite("sprites/misc/hub_direction_indicator.png"); + + /** @type {Array} + */ + this.waypoints = [ + { + label: null, + center: { x: 0, y: 0 }, + zoomLevel: 3, + }, + ]; + + // Create a buffer we can use to measure text + this.dummyBuffer = makeOffscreenBuffer(1, 1, { + reusable: false, + label: "waypoints-measure-canvas", + })[1]; + + // Dynamically attach/detach the lower right hint in the map overview + if (this.hintElement) { + this.domAttach = new DynamicDomAttach(this.root, this.hintElement); + } + + // Catch mouse and key events + this.root.camera.downPreHandler.add(this.onMouseDown, this); + this.root.keyMapper + .getBinding(KEYMAPPINGS.navigation.createMarker) + .add(this.requestCreateMarker, this); + + /** + * Stores at how much opacity the markers should be rendered on the map. + * This is interpolated over multiple frames so we have some sort of fade effect + */ + this.currentMarkerOpacity = 1; + this.currentCompassOpacity = 0; + + // Create buffer which is used to indicate the hub direction + const [canvas, context] = makeOffscreenBuffer(48, 48, { + smooth: true, + reusable: false, + label: "waypoints-compass", + }); + this.compassBuffer = { canvas, context }; + + /** + * Stores a cache from a shape short key to its canvas representation + */ + this.cachedKeyToCanvas = {}; + + // Initial render + this.rerenderWaypointList(); + } + + /** + * Re-renders the waypoint list to account for changes + */ rerenderWaypointList() { removeAllChildren(this.waypointsListElement); this.cleanupClickDetectors(); for (let i = 0; i < this.waypoints.length; ++i) { const waypoint = this.waypoints[i]; + const label = this.getWaypointLabel(waypoint); const element = makeDiv(this.waypointsListElement, null, ["waypoint"]); - element.innerText = waypoint.label; - if (waypoint.deletable) { + if (ShapeDefinition.isValidShortKey(label)) { + const canvas = this.getWaypointCanvas(waypoint); + element.appendChild(canvas); + element.classList.add("shapeIcon"); + } else { + element.innerText = label; + } + + if (this.isWaypointDeletable(waypoint)) { const deleteButton = makeDiv(element, null, ["deleteButton"]); this.trackClicks(deleteButton, () => this.deleteWaypoint(waypoint)); } + if (!waypoint.label) { + // This must be the hub label + element.classList.add("hub"); + element.insertBefore(this.compassBuffer.canvas, element.childNodes[0]); + } + this.trackClicks(element, () => this.moveToWaypoint(waypoint), { targetOnly: true, }); @@ -83,6 +177,7 @@ export class HUDWaypoints extends BaseHUDPart { } /** + * Moves the camera to a given waypoint * @param {Waypoint} waypoint */ moveToWaypoint(waypoint) { @@ -91,6 +186,7 @@ export class HUDWaypoints extends BaseHUDPart { } /** + * Deletes a waypoint from the list * @param {Waypoint} waypoint */ deleteWaypoint(waypoint) { @@ -98,86 +194,132 @@ export class HUDWaypoints extends BaseHUDPart { this.rerenderWaypointList(); } - initialize() { - /** @type {Array} - */ - this.waypoints = [ - { - label: T.ingame.waypoints.hub, - center: { x: 0, y: 0 }, - zoomLevel: 3, - deletable: false, - }, - ]; - - this.dummyBuffer = makeOffscreenBuffer(1, 1, { - reusable: false, - label: "waypoints-measure-canvas", - })[1]; - - this.root.camera.downPreHandler.add(this.onMouseDown, this); - - if (this.hintElement) { - this.domAttach = new DynamicDomAttach(this.root, this.hintElement); + /** + * Gets the canvas for a given waypoint + * @param {Waypoint} waypoint + * @returns {HTMLCanvasElement} + */ + getWaypointCanvas(waypoint) { + const key = waypoint.label; + if (this.cachedKeyToCanvas[key]) { + return this.cachedKeyToCanvas[key]; } - this.root.keyMapper - .getBinding(KEYMAPPINGS.navigation.createMarker) - .add(this.requestCreateMarker, this); - - this.currentMarkerOpacity = 1; - this.rerenderWaypointList(); + assert(ShapeDefinition.isValidShortKey(key), "Invalid short key: " + key); + const definition = ShapeDefinition.fromShortKey(key); + const preRendered = definition.generateAsCanvas(48); + return (this.cachedKeyToCanvas[key] = preRendered); } /** + * Requests to create a marker at the current camera position. If worldPos is set, + * uses that position instead. * @param {Vector=} worldPos Override the world pos, otherwise it is the camera position */ requestCreateMarker(worldPos = null) { + // Construct dialog with input field const markerNameInput = new FormElementInput({ id: "markerName", label: null, placeholder: "", - validator: val => val.length > 0 && val.length < 15, + validator: val => + val.length > 0 && (val.length < MAX_LABEL_LENGTH || ShapeDefinition.isValidShortKey(val)), }); - const dialog = new DialogWithForm({ app: this.root.app, title: T.dialogs.createMarker.title, desc: T.dialogs.createMarker.desc, formElements: [markerNameInput], }); - this.root.hud.parts.dialogs.internalShowDialog(dialog); + // Compute where to create the marker const center = worldPos || this.root.camera.center; dialog.buttonSignals.ok.add(() => { + // Show info that you can have only N markers in the demo, + // actually show this *after* entering the name so you want the + // standalone even more (I'm evil :P) if (IS_DEMO && this.waypoints.length > 2) { this.root.hud.parts.dialogs.showFeatureRestrictionInfo("", T.dialogs.markerDemoLimit.desc); return; } - this.waypoints.push({ - label: markerNameInput.getValue(), - center: { x: center.x, y: center.y }, - zoomLevel: Math_max(this.root.camera.zoomLevel, globalConfig.mapChunkOverviewMinZoom + 0.05), - deletable: true, - }); - this.waypoints.sort((a, b) => a.label.padStart(20, "0").localeCompare(b.label.padStart(20, "0"))); - this.root.hud.signals.notification.dispatch( - T.ingame.waypoints.creationSuccessNotification, - enumNotificationType.success - ); - this.rerenderWaypointList(); + // Actually create the waypoint + this.addWaypoint(markerNameInput.getValue(), center); }); } + /** + * Adds a new waypoint at the given location with the given label + * @param {string} label + * @param {Vector} position + */ + addWaypoint(label, position) { + this.waypoints.push({ + label, + center: { x: position.x, y: position.y }, + // Make sure the zoom is *just* a bit above the zoom level where the map overview + // starts, so you always see all buildings + zoomLevel: Math_max(this.root.camera.zoomLevel, globalConfig.mapChunkOverviewMinZoom + 0.05), + }); + + // Sort waypoints by name + this.waypoints.sort((a, b) => { + if (!a.label) { + return -1; + } + if (!b.label) { + return 1; + } + return this.getWaypointLabel(a) + .padEnd(MAX_LABEL_LENGTH, "0") + .localeCompare(this.getWaypointLabel(b).padEnd(MAX_LABEL_LENGTH, "0")); + }); + + // Show notification about creation + this.root.hud.signals.notification.dispatch( + T.ingame.waypoints.creationSuccessNotification, + enumNotificationType.success + ); + + // Re-render the list and thus add it + this.rerenderWaypointList(); + } + + /** + * Called every frame to update stuff + */ update() { if (this.domAttach) { this.domAttach.update(this.root.camera.getIsMapOverlayActive()); } } + /** + * Returns the label for a given waypoint + * @param {Waypoint} waypoint + * @returns {string} + */ + getWaypointLabel(waypoint) { + return waypoint.label || T.ingame.waypoints.hub; + } + + /** + * Returns if a waypoint is deletable + * @param {Waypoint} waypoint + * @returns {boolean} + */ + isWaypointDeletable(waypoint) { + return waypoint.label !== null; + } + + /** + * Finds the currently intersected waypoint on the map overview under + * the cursor. + * + * @returns {Waypoint | null} + */ findCurrentIntersectedWaypoint() { const mousePos = this.root.app.mousePosition; if (!mousePos) { @@ -197,10 +339,18 @@ export class HUDWaypoints extends BaseHUDPart { const screenPos = this.root.camera.worldToScreen( new Vector(waypoint.center.x, waypoint.center.y) ); + + let label = this.getWaypointLabel(waypoint); + + // Special case for icons + if (ShapeDefinition.isValidShortKey(label)) { + label = SHAPE_LABEL_PLACEHOLDER; + } + const intersectionRect = new Rectangle( screenPos.x - 7 * scale, screenPos.y - 12 * scale, - 15 * scale + this.dummyBuffer.measureText(waypoint.label).width, + 15 * scale + this.dummyBuffer.measureText(label).width, 15 * scale ); if (intersectionRect.containsPoint(mousePos.x, mousePos.y)) { @@ -210,7 +360,7 @@ export class HUDWaypoints extends BaseHUDPart { } /** - * + * Mouse-Down handler * @param {Vector} pos * @param {enumMouseButton} button */ @@ -221,7 +371,7 @@ export class HUDWaypoints extends BaseHUDPart { this.root.soundProxy.playUiClick(); this.moveToWaypoint(waypoint); } else if (button === enumMouseButton.right) { - if (waypoint.deletable) { + if (this.isWaypointDeletable(waypoint)) { this.root.soundProxy.playUiClick(); this.deleteWaypoint(waypoint); } else { @@ -243,50 +393,111 @@ export class HUDWaypoints extends BaseHUDPart { } /** - * + * Rerenders the compass + */ + rerenderWaypointsCompass() { + const context = this.compassBuffer.context; + const dims = 48; + context.clearRect(0, 0, dims, dims); + const indicatorSize = 30; + + const cameraPos = this.root.camera.center; + + const distanceToHub = cameraPos.length(); + const compassVisible = distanceToHub > (10 * globalConfig.tileSize) / this.root.camera.zoomLevel; + const targetCompassAlpha = compassVisible ? 1 : 0; + this.currentCompassOpacity = lerp(this.currentCompassOpacity, targetCompassAlpha, 0.08); + + if (this.currentCompassOpacity > 0.01) { + context.globalAlpha = this.currentCompassOpacity; + const angle = cameraPos.angle() + Math_radians(45) + Math_PI / 2; + context.translate(dims / 2, dims / 2); + context.rotate(angle); + this.directionIndicatorSprite.drawCentered(context, 0, 0, indicatorSize); + context.rotate(-angle); + context.translate(-dims / 2, -dims / 2); + context.globalAlpha = 1; + } + + const iconOpacity = 1 - this.currentCompassOpacity; + if (iconOpacity > 0.01) { + // Draw icon + context.globalAlpha = iconOpacity; + this.waypointSprite.drawCentered(context, dims / 2, dims / 2, dims * 0.7); + context.globalAlpha = 1; + } + } + + /** + * Draws the waypoints on the map * @param {DrawParameters} parameters */ draw(parameters) { const desiredOpacity = this.root.camera.getIsMapOverlayActive() ? 1 : 0; this.currentMarkerOpacity = lerp(this.currentMarkerOpacity, desiredOpacity, 0.08); + this.rerenderWaypointsCompass(); + + // Don't render with low opacity if (this.currentMarkerOpacity < 0.01) { return; } + // Find waypoint below cursor const selected = this.findCurrentIntersectedWaypoint(); + // Determine rendering scale const scale = (1 / this.root.camera.zoomLevel) * this.root.app.getEffectiveUiScale(); + // Render all of 'em for (let i = 0; i < this.waypoints.length; ++i) { const waypoint = this.waypoints[i]; const pos = waypoint.center; - parameters.context.globalAlpha = this.currentMarkerOpacity * (selected === waypoint ? 1 : 0.7); const yOffset = -5 * scale; + const originalLabel = this.getWaypointLabel(waypoint); + let renderLabel = originalLabel; + let isShapeIcon = false; + if (ShapeDefinition.isValidShortKey(originalLabel)) { + renderLabel = SHAPE_LABEL_PLACEHOLDER; + isShapeIcon = true; + } + + // Render the background rectangle parameters.context.font = "bold " + 12 * scale + "px GameFont"; - parameters.context.fillStyle = "rgba(255, 255, 255, 0.7)"; parameters.context.fillRect( pos.x - 7 * scale, pos.y - 12 * scale, - 15 * scale + this.dummyBuffer.measureText(waypoint.label).width / this.root.camera.zoomLevel, + 15 * scale + this.dummyBuffer.measureText(renderLabel).width / this.root.camera.zoomLevel, 15 * scale ); - parameters.context.fillStyle = "#000"; - parameters.context.textAlign = "left"; - parameters.context.textBaseline = "middle"; - parameters.context.fillText(waypoint.label, pos.x + 6 * scale, pos.y + 0.5 * scale + yOffset); - - parameters.context.textBaseline = "alphabetic"; - parameters.context.textAlign = "left"; + // Render the text + if (isShapeIcon) { + const canvas = this.getWaypointCanvas(waypoint); + parameters.context.drawImage( + canvas, + pos.x + 6 * scale, + pos.y - 11.5 * scale, + 14 * scale, + 14 * scale + ); + } else { + // Render the text + parameters.context.fillStyle = "#000"; + parameters.context.textBaseline = "middle"; + parameters.context.fillText(renderLabel, pos.x + 6 * scale, pos.y + 0.5 * scale + yOffset); + parameters.context.textBaseline = "alphabetic"; + } + // Render the small icon on the left this.waypointSprite.drawCentered(parameters.context, pos.x, pos.y + yOffset, 10 * scale); } + parameters.context.globalAlpha = 1; } } diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index 816c5cd3..c514446d 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -24,7 +24,7 @@ export const KEYMAPPINGS = { menuOpenStats: { keyCode: key("G") }, toggleHud: { keyCode: 113 }, // F2 - exportScreenshot: { keyCode: 114 }, // F3 + exportScreenshot: { keyCode: 114 }, // F3PS toggleFPSInfo: { keyCode: 115 }, // F4 }, @@ -33,6 +33,7 @@ export const KEYMAPPINGS = { mapMoveRight: { keyCode: key("D") }, mapMoveDown: { keyCode: key("S") }, mapMoveLeft: { keyCode: key("A") }, + mapMoveFaster: { keyCode: 16 }, //shift centerMap: { keyCode: 32 }, // SPACE mapZoomIn: { keyCode: 187, repeated: true }, // "+" @@ -55,11 +56,12 @@ export const KEYMAPPINGS = { }, placement: { - abortBuildingPlacement: { keyCode: key("Q") }, + pipette: { keyCode: key("Q") }, rotateWhilePlacing: { keyCode: key("R") }, rotateInverseModifier: { keyCode: 16 }, // SHIFT cycleBuildingVariants: { keyCode: key("T") }, cycleBuildings: { keyCode: 9 }, // TAB + switchDirectionLockSide: { keyCode: key("R") }, }, massSelect: { @@ -72,6 +74,7 @@ export const KEYMAPPINGS = { }, placementModifiers: { + lockBeltDirection: { keyCode: 16 }, // SHIFT placementDisableAutoOrientation: { keyCode: 17 }, // CTRL placeMultiple: { keyCode: 16 }, // SHIFT placeInverse: { keyCode: 18 }, // ALT @@ -85,6 +88,10 @@ for (const categoryId in KEYMAPPINGS) { } } +export const KEYCODE_LMB = 1; +export const KEYCODE_MMB = 2; +export const KEYCODE_RMB = 3; + /** * Returns a keycode -> string * @param {number} code @@ -92,11 +99,11 @@ for (const categoryId in KEYMAPPINGS) { */ export function getStringForKeyCode(code) { switch (code) { - case 1: + case KEYCODE_LMB: return "LMB"; - case 2: + case KEYCODE_MMB: return "MMB"; - case 3: + case KEYCODE_RMB: return "RMB"; case 4: return "MB4"; @@ -259,14 +266,16 @@ export class Keybinding { /** * Returns whether this binding is currently pressed + * @returns {boolean} */ - isCurrentlyPressed() { + get pressed() { // Check if the key is down if (this.app.inputMgr.keysDown.has(this.keyCode)) { // Check if it is the top reciever const reciever = this.keyMapper.inputReceiver; return this.app.inputMgr.getTopReciever() === reciever; } + return false; } /** diff --git a/src/js/game/logic.js b/src/js/game/logic.js index 90597e52..408bf89d 100644 --- a/src/js/game/logic.js +++ b/src/js/game/logic.js @@ -151,6 +151,7 @@ export class GameLogic { * @param {number} param0.rotationVariant * @param {string} param0.variant * @param {MetaBuilding} param0.building + * @returns {Entity} */ tryPlaceBuilding({ origin, rotation, rotationVariant, originalRotation, variant, building }) { if (this.checkCanPlaceBuilding({ origin, rotation, rotationVariant, variant, building })) { @@ -170,13 +171,13 @@ export class GameLogic { if (contents) { if (!this.tryDeleteBuilding(contents)) { logger.error("Building has replaceable component but is also unremovable"); - return false; + return null; } } } } - building.createAndPlaceEntity({ + const entity = building.createAndPlaceEntity({ root: this.root, origin, rotation, @@ -186,10 +187,9 @@ export class GameLogic { }); this.root.soundProxy.playUi(building.getPlacementSound()); - - return true; + return entity; } - return false; + return null; } /** diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js index 262a33cb..11da28f3 100644 --- a/src/js/game/meta_building.js +++ b/src/js/game/meta_building.js @@ -31,6 +31,13 @@ export class MetaBuilding { return new Vector(1, 1); } + /** + * Returns whether the building has the direction lock switch available + */ + getHasDirectionLockAvailable() { + return false; + } + /** * Whether to stay in placement mode after having placed a building */ @@ -140,10 +147,32 @@ export class MetaBuilding { * @param {string} param0.variant */ createAndPlaceEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) { + const entity = this.createEntity({ + root, + origin, + rotation, + originalRotation, + rotationVariant, + variant, + }); + root.map.placeStaticEntity(entity); + root.entityMgr.registerEntity(entity); + return entity; + } + + /** + * Creates the entity without placing it + * @param {object} param0 + * @param {GameRoot} param0.root + * @param {Vector} param0.origin Origin tile + * @param {number=} param0.rotation Rotation + * @param {number} param0.originalRotation Original Rotation + * @param {number} param0.rotationVariant Rotation variant + * @param {string} param0.variant + */ + createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) { const entity = new Entity(root); - const blueprintSprite = this.getBlueprintSprite(rotationVariant, variant); - entity.addComponent( new StaticMapEntityComponent({ spriteKey: @@ -159,12 +188,8 @@ export class MetaBuilding { blueprintSpriteKey: blueprintSprite ? blueprintSprite.spriteName : "", }) ); - this.setupEntityComponents(entity, root); this.updateVariants(entity, rotationVariant, variant); - - root.map.placeStaticEntity(entity); - root.entityMgr.registerEntity(entity); return entity; } diff --git a/src/js/game/root.js b/src/js/game/root.js index 91efd137..0456952c 100644 --- a/src/js/game/root.js +++ b/src/js/game/root.js @@ -19,7 +19,6 @@ import { SoundProxy } from "./sound_proxy"; import { Savegame } from "../savegame/savegame"; import { GameLogic } from "./logic"; import { ShapeDefinitionManager } from "./shape_definition_manager"; -import { CanvasClickInterceptor } from "./canvas_click_interceptor"; import { HubGoals } from "./hub_goals"; import { BufferMaintainer } from "../core/buffer_maintainer"; import { ProductionAnalytics } from "./production_analytics"; @@ -110,9 +109,6 @@ export class GameRoot { /** @type {BufferMaintainer} */ this.buffers = null; - /** @type {CanvasClickInterceptor} */ - this.canvasClickInterceptor = null; - /** @type {AutomaticSave} */ this.automaticSave = null; @@ -130,6 +126,7 @@ export class GameRoot { this.signals = { // Entities + entityManuallyPlaced: /** @type {TypedSignal<[Entity]>} */ (new Signal()), entityAdded: /** @type {TypedSignal<[Entity]>} */ (new Signal()), entityGotNewComponent: /** @type {TypedSignal<[Entity]>} */ (new Signal()), entityComponentRemoved: /** @type {TypedSignal<[Entity]>} */ (new Signal()), diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index 64cc3eab..d785f6ab 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -70,6 +70,12 @@ export function createSimpleShape(layers) { return layers; } +/** + * Cache which shapes are valid short keys and which not + * @type {Map} + */ +const SHORT_KEY_CACHE = new Map(); + export class ShapeDefinition extends BasicSerializableObject { static getId() { return "ShapeDefinition"; @@ -114,6 +120,8 @@ export class ShapeDefinition extends BasicSerializableObject { /** * Generates the definition from the given short key + * @param {string} key + * @returns {ShapeDefinition} */ static fromShortKey(key) { const sourceLayers = key.split(":"); @@ -147,6 +155,81 @@ export class ShapeDefinition extends BasicSerializableObject { return definition; } + /** + * Checks if a given string is a valid short key + * @param {string} key + * @returns {boolean} + */ + static isValidShortKey(key) { + if (SHORT_KEY_CACHE.has(key)) { + return SHORT_KEY_CACHE.get(key); + } + + const result = ShapeDefinition.isValidShortKeyInternal(key); + SHORT_KEY_CACHE.set(key, result); + return result; + } + + /** + * INTERNAL + * Checks if a given string is a valid short key + * @param {string} key + * @returns {boolean} + */ + static isValidShortKeyInternal(key) { + const sourceLayers = key.split(":"); + let layers = []; + for (let i = 0; i < sourceLayers.length; ++i) { + const text = sourceLayers[i]; + if (text.length !== 8) { + return false; + } + + /** @type {ShapeLayer} */ + const quads = [null, null, null, null]; + let anyFilled = false; + for (let quad = 0; quad < 4; ++quad) { + const shapeText = text[quad * 2 + 0]; + const colorText = text[quad * 2 + 1]; + const subShape = enumShortcodeToSubShape[shapeText]; + const color = enumShortcodeToColor[colorText]; + + // Valid shape + if (subShape) { + if (!color) { + // Invalid color + return false; + } + quads[quad] = { + subShape, + color, + }; + anyFilled = true; + } else if (shapeText === "-") { + // Make sure color is empty then, too + if (colorText !== "-") { + return false; + } + } else { + // Invalid shape key + return false; + } + } + + if (!anyFilled) { + // Empty layer + return false; + } + layers.push(quads); + } + + if (layers.length === 0 || layers.length > 4) { + return false; + } + + return true; + } + /** * Internal method to clone the shape definition * @returns {Array} diff --git a/src/js/game/sound_proxy.js b/src/js/game/sound_proxy.js index 1c19c9fb..d0f4c660 100644 --- a/src/js/game/sound_proxy.js +++ b/src/js/game/sound_proxy.js @@ -6,7 +6,9 @@ import { Vector } from "../core/vector"; import { SOUNDS } from "../platform/sound"; const avgSoundDurationSeconds = 0.25; -const maxOngoingSounds = 10; +const maxOngoingSounds = 2; + +const maxOngoingUiSounds = 25; // Proxy to the application sound instance export class SoundProxy { @@ -17,7 +19,8 @@ export class SoundProxy { this.root = root; // Store a list of sounds and when we started them - this.playingSounds = []; + this.playing3DSounds = []; + this.playingUiSounds = []; } /** @@ -26,7 +29,14 @@ export class SoundProxy { */ playUi(id) { assert(typeof id === "string", "Not a valid sound id: " + id); + this.internalUpdateOngoingSounds(); + if (this.playingUiSounds.length > maxOngoingUiSounds) { + // Too many ongoing sounds + return false; + } + this.root.app.sound.playUiSound(id); + this.playingUiSounds.push(this.root.time.realtimeNow()); } /** @@ -53,13 +63,13 @@ export class SoundProxy { assert(pos instanceof Vector, "Invalid sound position"); this.internalUpdateOngoingSounds(); - if (this.playingSounds.length > maxOngoingSounds) { + if (this.playing3DSounds.length > maxOngoingSounds) { // Too many ongoing sounds return false; } this.root.app.sound.play3DSound(id, pos, this.root); - this.playingSounds.push(this.root.time.realtimeNow()); + this.playing3DSounds.push(this.root.time.realtimeNow()); return true; } @@ -68,9 +78,16 @@ export class SoundProxy { */ internalUpdateOngoingSounds() { const now = this.root.time.realtimeNow(); - for (let i = 0; i < this.playingSounds.length; ++i) { - if (now - this.playingSounds[i] > avgSoundDurationSeconds) { - this.playingSounds.splice(i, 1); + for (let i = 0; i < this.playing3DSounds.length; ++i) { + if (now - this.playing3DSounds[i] > avgSoundDurationSeconds) { + this.playing3DSounds.splice(i, 1); + i -= 1; + } + } + + for (let i = 0; i < this.playingUiSounds.length; ++i) { + if (now - this.playingUiSounds[i] > avgSoundDurationSeconds) { + this.playingUiSounds.splice(i, 1); i -= 1; } } diff --git a/src/js/game/systems/belt.js b/src/js/game/systems/belt.js index 0b299964..5fa5a265 100644 --- a/src/js/game/systems/belt.js +++ b/src/js/game/systems/belt.js @@ -1,4 +1,4 @@ -import { Math_radians, Math_min, Math_max } from "../../core/builtins"; +import { Math_radians, Math_min, Math_max, Math_sqrt } from "../../core/builtins"; import { globalConfig } from "../../core/config"; import { DrawParameters } from "../../core/draw_parameters"; import { Loader } from "../../core/loader"; @@ -15,6 +15,7 @@ import { GameRoot } from "../root"; import { createLogger } from "../../core/logging"; const BELT_ANIM_COUNT = 6; +const SQRT_2 = Math_sqrt(2); const logger = createLogger("belt"); @@ -211,6 +212,7 @@ export class BeltSystem extends GameSystemWithFilter { this.root.hubGoals.getBeltBaseSpeed() * this.root.dynamicTickrate.deltaSeconds * globalConfig.itemSpacingOnBelts; + if (G_IS_DEV && globalConfig.debug.instantBelts) { beltSpeed *= 100; } @@ -229,35 +231,43 @@ export class BeltSystem extends GameSystemWithFilter { const ejectorComp = entity.components.ItemEjector; let maxProgress = 1; + /* PERFORMANCE OPTIMIZATION */ + // Original: + // const isCurrentlyEjecting = ejectorComp.isAnySlotEjecting(); + // Replaced (Since belts always have just one slot): + const ejectorSlot = ejectorComp.slots[0]; + const isCurrentlyEjecting = ejectorSlot.item; + // When ejecting, we can not go further than the item spacing since it // will be on the corner - if (ejectorComp.isAnySlotEjecting()) { + if (isCurrentlyEjecting) { maxProgress = 1 - globalConfig.itemSpacingOnBelts; } else { // Otherwise our progress depends on the follow up if (followUp) { const spacingOnBelt = followUp.components.Belt.getDistanceToFirstItemCenter(); - maxProgress = Math_min(2, 1 - globalConfig.itemSpacingOnBelts + spacingOnBelt); - assert(maxProgress >= 0.0, "max progress < 0 (I)"); + maxProgress = Math.min(2, 1 - globalConfig.itemSpacingOnBelts + spacingOnBelt); + + // Useful check, but hurts performance + // assert(maxProgress >= 0.0, "max progress < 0 (I)"); } } let speedMultiplier = 1; if (beltComp.direction !== enumDirection.top) { - // Shaped belts are longer, thus being quicker - speedMultiplier = 1.41; + // Curved belts are shorter, thus being quicker (Looks weird otherwise) + speedMultiplier = SQRT_2; } // Not really nice. haven't found the reason for this yet. if (items.length > 2 / globalConfig.itemSpacingOnBelts) { - logger.error("Fixing broken belt:", entity, items); beltComp.sortedItems = []; } for (let itemIndex = items.length - 1; itemIndex >= 0; --itemIndex) { const progressAndItem = items[itemIndex]; - progressAndItem[0] = Math_min(maxProgress, progressAndItem[0] + speedMultiplier * beltSpeed); + progressAndItem[0] = Math.min(maxProgress, progressAndItem[0] + speedMultiplier * beltSpeed); if (progressAndItem[0] >= 1.0) { if (followUp) { @@ -273,14 +283,18 @@ export class BeltSystem extends GameSystemWithFilter { } } else { // Try to give this item to a new belt - const freeSlot = ejectorComp.getFirstFreeSlot(); - if (freeSlot === null) { + + /* PERFORMANCE OPTIMIZATION */ + // Original: + // const freeSlot = ejectorComp.getFirstFreeSlot(); + // Replaced + if (ejectorSlot.item) { // So, we don't have a free slot - damned! progressAndItem[0] = 1.0; maxProgress = 1 - globalConfig.itemSpacingOnBelts; } else { // We got a free slot, remove this item and keep it on the ejector slot - if (!ejectorComp.tryEject(freeSlot, progressAndItem[1])) { + if (!ejectorComp.tryEject(0, progressAndItem[1])) { assert(false, "Ejection failed"); } items.splice(itemIndex, 1); @@ -290,7 +304,7 @@ export class BeltSystem extends GameSystemWithFilter { } } else { // We just moved this item forward, so determine the maximum progress of other items - maxProgress = Math_max(0, progressAndItem[0] - globalConfig.itemSpacingOnBelts); + maxProgress = Math.max(0, progressAndItem[0] - globalConfig.itemSpacingOnBelts); } } } diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js index e714cce5..2f327725 100644 --- a/src/js/game/systems/item_ejector.js +++ b/src/js/game/systems/item_ejector.js @@ -6,19 +6,40 @@ import { ItemEjectorComponent } from "../components/item_ejector"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { Math_min } from "../../core/builtins"; +import { createLogger } from "../../core/logging"; + +const logger = createLogger("systems/ejector"); export class ItemEjectorSystem extends GameSystemWithFilter { constructor(root) { super(root, [ItemEjectorComponent]); + + /** + * @type {Array<{ + * targetEntity: Entity, + * sourceSlot: import("../components/item_ejector").ItemEjectorSlot, + * destSlot: import("../components/item_acceptor").ItemAcceptorLocatedSlot + * }>} + */ + this.cache = []; + + this.cacheNeedsUpdate = true; + + this.root.signals.entityAdded.add(this.invalidateCache, this); + this.root.signals.entityDestroyed.add(this.invalidateCache, this); } - update() { - const effectiveBeltSpeed = this.root.hubGoals.getBeltBaseSpeed() * globalConfig.itemSpacingOnBelts; - let progressGrowth = (effectiveBeltSpeed / 0.5) * this.root.dynamicTickrate.deltaSeconds; + invalidateCache() { + this.cacheNeedsUpdate = true; + } - if (G_IS_DEV && globalConfig.debug.instantBelts) { - progressGrowth = 1; - } + /** + * Precomputes the cache, which makes up for a huge performance improvement + */ + recomputeCache() { + logger.log("Recomputing cache"); + + const cache = []; // Try to find acceptors for every ejector for (let i = 0; i < this.allEntities.length; ++i) { @@ -29,17 +50,6 @@ export class ItemEjectorSystem extends GameSystemWithFilter { // For every ejector slot, try to find an acceptor for (let ejectorSlotIndex = 0; ejectorSlotIndex < ejectorComp.slots.length; ++ejectorSlotIndex) { const ejectorSlot = ejectorComp.slots[ejectorSlotIndex]; - const ejectingItem = ejectorSlot.item; - if (!ejectingItem) { - // No item ejected - continue; - } - - ejectorSlot.progress = Math_min(1, ejectorSlot.progress + progressGrowth); - if (ejectorSlot.progress < 1.0) { - // Still ejecting - continue; - } // Figure out where and into which direction we eject items const ejectSlotWsTile = staticComp.localTileToWorld(ejectorSlot.pos); @@ -71,20 +81,63 @@ export class ItemEjectorSystem extends GameSystemWithFilter { continue; } - if (!targetAcceptorComp.canAcceptItem(matchingSlot.index, ejectingItem)) { - // Can not accept item - continue; - } + // Ok we found a connection + cache.push({ + targetEntity, + sourceSlot: ejectorSlot, + destSlot: matchingSlot, + }); + } + } - if (this.tryPassOverItem(ejectingItem, targetEntity, matchingSlot.index)) { - targetAcceptorComp.onItemAccepted( - matchingSlot.index, - matchingSlot.acceptedDirection, - ejectingItem - ); - ejectorSlot.item = null; - continue; - } + this.cache = cache; + logger.log("Found", cache.length, "entries to update"); + } + + update() { + if (this.cacheNeedsUpdate) { + this.cacheNeedsUpdate = false; + this.recomputeCache(); + } + + // Precompute effective belt speed + const effectiveBeltSpeed = this.root.hubGoals.getBeltBaseSpeed() * globalConfig.itemSpacingOnBelts; + let progressGrowth = (effectiveBeltSpeed / 0.5) * this.root.dynamicTickrate.deltaSeconds; + + if (G_IS_DEV && globalConfig.debug.instantBelts) { + progressGrowth = 1; + } + + // Go over all cache entries + for (let i = 0; i < this.cache.length; ++i) { + const { sourceSlot, destSlot, targetEntity } = this.cache[i]; + const item = sourceSlot.item; + + if (!item) { + // No item available to be ejected + continue; + } + + // Advance items on the slot + sourceSlot.progress = Math_min(1, sourceSlot.progress + progressGrowth); + + // Check if we are still in the process of ejecting, can't proceed then + if (sourceSlot.progress < 1.0) { + continue; + } + + // Check if the target acceptor can actually accept this item + const targetAcceptorComp = targetEntity.components.ItemAcceptor; + if (!targetAcceptorComp.canAcceptItem(destSlot.index, item)) { + continue; + } + + // Try to hand over the item + if (this.tryPassOverItem(item, targetEntity, destSlot.index)) { + // Handover successful, clear slot + targetAcceptorComp.onItemAccepted(destSlot.index, destSlot.acceptedDirection, item); + sourceSlot.item = null; + continue; } } } diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js index 78223516..b195e6ab 100644 --- a/src/js/game/systems/miner.js +++ b/src/js/game/systems/miner.js @@ -24,11 +24,17 @@ export class MinerSystem extends GameSystemWithFilter { // Check if miner is above an actual tile const minerComp = entity.components.Miner; - const staticComp = entity.components.StaticMapEntity; - const tileBelow = this.root.map.getLowerLayerContentXY(staticComp.origin.x, staticComp.origin.y); - if (!tileBelow) { - continue; + if (!minerComp.cachedMinedItem) { + const staticComp = entity.components.StaticMapEntity; + const tileBelow = this.root.map.getLowerLayerContentXY( + staticComp.origin.x, + staticComp.origin.y + ); + if (!tileBelow) { + continue; + } + minerComp.cachedMinedItem = tileBelow; } // First, try to get rid of chained items @@ -40,20 +46,9 @@ export class MinerSystem extends GameSystemWithFilter { } if (this.root.time.isIngameTimerExpired(minerComp.lastMiningTime, 1 / miningSpeed)) { - const lowerLayerItem = this.root.map.getLowerLayerContentXY( - staticComp.origin.x, - staticComp.origin.y - ); - - // TODO: Should not be required actually - if (!lowerLayerItem) { - // Nothing below; - continue; - } - - if (this.tryPerformMinerEject(entity, lowerLayerItem)) { + if (this.tryPerformMinerEject(entity, minerComp.cachedMinedItem)) { // Analytics hook - this.root.signals.itemProduced.dispatch(lowerLayerItem); + this.root.signals.itemProduced.dispatch(minerComp.cachedMinedItem); // Actually mine minerComp.lastMiningTime = this.root.time.now(); @@ -114,18 +109,17 @@ export class MinerSystem extends GameSystemWithFilter { if (entity && entity.components.Miner) { const staticComp = entity.components.StaticMapEntity; + const minerComp = entity.components.Miner; if (!staticComp.shouldBeDrawn(parameters)) { continue; } + if (!minerComp.cachedMinedItem) { + continue; + } - const lowerLayerItem = this.root.map.getLowerLayerContentXY( - staticComp.origin.x, - staticComp.origin.y - ); - - if (lowerLayerItem) { + if (minerComp.cachedMinedItem) { const padding = 3; - parameters.context.fillStyle = lowerLayerItem.getBackgroundColorAsResource(); + parameters.context.fillStyle = minerComp.cachedMinedItem.getBackgroundColorAsResource(); parameters.context.fillRect( staticComp.origin.x * globalConfig.tileSize + padding, staticComp.origin.y * globalConfig.tileSize + padding, @@ -134,8 +128,8 @@ export class MinerSystem extends GameSystemWithFilter { ); } - if (lowerLayerItem) { - lowerLayerItem.draw( + if (minerComp.cachedMinedItem) { + minerComp.cachedMinedItem.draw( (0.5 + staticComp.origin.x) * globalConfig.tileSize, (0.5 + staticComp.origin.y) * globalConfig.tileSize, parameters diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js index 34decc11..0456638a 100644 --- a/src/js/game/systems/underground_belt.js +++ b/src/js/game/systems/underground_belt.js @@ -1,12 +1,17 @@ -import { GameSystemWithFilter } from "../game_system_with_filter"; -import { UndergroundBeltComponent, enumUndergroundBeltMode } from "../components/underground_belt"; -import { Entity } from "../entity"; -import { Loader } from "../../core/loader"; import { Math_max } from "../../core/builtins"; import { globalConfig } from "../../core/config"; -import { enumDirection, enumDirectionToVector, enumDirectionToAngle } from "../../core/vector"; -import { MapChunkView } from "../map_chunk_view"; -import { DrawParameters } from "../../core/draw_parameters"; +import { Loader } from "../../core/loader"; +import { + enumDirection, + enumDirectionToAngle, + enumDirectionToVector, + Vector, + enumAngleToDirection, + enumInvertedDirections, +} from "../../core/vector"; +import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt"; +import { Entity } from "../entity"; +import { GameSystemWithFilter } from "../game_system_with_filter"; export class UndergroundBeltSystem extends GameSystemWithFilter { constructor(root) { @@ -20,6 +25,8 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { "sprites/buildings/underground_belt_exit.png" ), }; + + this.root.signals.entityManuallyPlaced.add(this.onEntityPlaced, this); } update() { @@ -46,6 +53,159 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { } } + /** + * Callback when an entity got placed, used to remove belts between underground belts + * @param {Entity} entity + */ + onEntityPlaced(entity) { + if (!this.root.app.settings.getAllSettings().enableTunnelSmartplace) { + // Smart-place disabled + return; + } + + const undergroundComp = entity.components.UndergroundBelt; + if (undergroundComp && undergroundComp.mode === enumUndergroundBeltMode.receiver) { + const staticComp = entity.components.StaticMapEntity; + const tile = staticComp.origin; + + const direction = enumAngleToDirection[staticComp.rotation]; + const inverseDirection = enumInvertedDirections[direction]; + const offset = enumDirectionToVector[inverseDirection]; + + let currentPos = tile.copy(); + + const tier = undergroundComp.tier; + const range = globalConfig.undergroundBeltMaxTilesByTier[tier]; + + // FIND ENTRANCE + // Search for the entrance which is furthes apart (this is why we can't reuse logic here) + let matchingEntrance = null; + for (let i = 0; i < range; ++i) { + currentPos.addInplace(offset); + const contents = this.root.map.getTileContent(currentPos); + if (!contents) { + continue; + } + + const contentsUndergroundComp = contents.components.UndergroundBelt; + if ( + contentsUndergroundComp && + contentsUndergroundComp.tier === undergroundComp.tier && + contentsUndergroundComp.mode === enumUndergroundBeltMode.sender + ) { + matchingEntrance = { + entity: contents, + range: i, + }; + } + } + + if (!matchingEntrance) { + // Nothing found + return; + } + + // DETECT OBSOLETE BELTS BETWEEN + // Remove any belts between entrance and exit which have the same direction, + // but only if they *all* have the right direction + currentPos = tile.copy(); + let allBeltsMatch = true; + for (let i = 0; i < matchingEntrance.range; ++i) { + currentPos.addInplace(offset); + + const contents = this.root.map.getTileContent(currentPos); + if (!contents) { + allBeltsMatch = false; + break; + } + + const contentsStaticComp = contents.components.StaticMapEntity; + const contentsBeltComp = contents.components.Belt; + if (!contentsBeltComp) { + allBeltsMatch = false; + break; + } + + // It's a belt + if ( + contentsBeltComp.direction !== enumDirection.top || + enumAngleToDirection[contentsStaticComp.rotation] !== direction + ) { + allBeltsMatch = false; + break; + } + } + + currentPos = tile.copy(); + if (allBeltsMatch) { + // All belts between this are obsolete, so drop them + for (let i = 0; i < matchingEntrance.range; ++i) { + currentPos.addInplace(offset); + const contents = this.root.map.getTileContent(currentPos); + assert(contents, "Invalid smart underground belt logic"); + this.root.logic.tryDeleteBuilding(contents); + } + } + + // REMOVE OBSOLETE TUNNELS + // Remove any double tunnels, by checking the tile plus the tile above + currentPos = tile.copy().add(offset); + for (let i = 0; i < matchingEntrance.range - 1; ++i) { + const posBefore = currentPos.copy(); + currentPos.addInplace(offset); + + const entityBefore = this.root.map.getTileContent(posBefore); + const entityAfter = this.root.map.getTileContent(currentPos); + + if (!entityBefore || !entityAfter) { + continue; + } + + const undergroundBefore = entityBefore.components.UndergroundBelt; + const undergroundAfter = entityAfter.components.UndergroundBelt; + + if (!undergroundBefore || !undergroundAfter) { + // Not an underground belt + continue; + } + + if ( + // Both same tier + undergroundBefore.tier !== undergroundAfter.tier || + // And same tier as our original entity + undergroundBefore.tier !== undergroundComp.tier + ) { + // Mismatching tier + continue; + } + + if ( + undergroundBefore.mode !== enumUndergroundBeltMode.sender || + undergroundAfter.mode !== enumUndergroundBeltMode.receiver + ) { + // Not the right mode + continue; + } + + // Check rotations + const staticBefore = entityBefore.components.StaticMapEntity; + const staticAfter = entityAfter.components.StaticMapEntity; + + if ( + enumAngleToDirection[staticBefore.rotation] !== direction || + enumAngleToDirection[staticAfter.rotation] !== direction + ) { + // Wrong rotation + continue; + } + + // All good, can remove + this.root.logic.tryDeleteBuilding(entityBefore); + this.root.logic.tryDeleteBuilding(entityAfter); + } + } + } + /** * * @param {Entity} entity diff --git a/src/js/game/themes/dark.json b/src/js/game/themes/dark.json index 760ab510..ef707663 100644 --- a/src/js/game/themes/dark.json +++ b/src/js/game/themes/dark.json @@ -9,6 +9,9 @@ "selectionOutline": "rgba(74, 163, 223, 0.5)", "selectionBackground": "rgba(74, 163, 223, 0.2)", + "directionLock": "rgb(74, 237, 134)", + "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "resources": { "shape": "#3d3f4a", "red": "#4a3d3f", diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json index 59e9e58f..c5eead32 100644 --- a/src/js/game/themes/light.json +++ b/src/js/game/themes/light.json @@ -9,6 +9,9 @@ "selectionOutline": "rgba(74, 163, 223, 0.5)", "selectionBackground": "rgba(74, 163, 223, 0.2)", + "directionLock": "rgb(74, 237, 134)", + "directionLockTrack": "rgba(74, 237, 134, 0.2)", + "resources": { "shape": "#eaebec", "red": "#ffbfc1", diff --git a/src/js/languages.js b/src/js/languages.js index 02077a72..2d40037b 100644 --- a/src/js/languages.js +++ b/src/js/languages.js @@ -20,12 +20,30 @@ export const LANGUAGES = { code: "fr", region: "", }, + "ja": { + name: "日本語", + data: require("./built-temp/base-ja.json"), + code: "ja", + region: "", + }, + "pt-PT": { + name: "Português (Portugal)", + data: require("./built-temp/base-pt-PT.json"), + code: "pt", + region: "PT", + }, "pt-BR": { name: "Português (Brasil)", data: require("./built-temp/base-pt-BR.json"), code: "pt", region: "BR", }, + "ru": { + name: "Русский", + data: require("./built-temp/base-ru.json"), + code: "ru", + region: "", + }, "cs": { name: "Čeština", data: require("./built-temp/base-cz.json"), @@ -44,12 +62,6 @@ export const LANGUAGES = { code: "pl", region: "", }, - "ru": { - name: "Русский", - data: require("./built-temp/base-ru.json"), - code: "ru", - region: "", - }, "kor": { name: "한국어", data: require("./built-temp/base-kor.json"), @@ -62,4 +74,16 @@ export const LANGUAGES = { code: "nl", region: "", }, + "no": { + name: "Norsk", + data: require("./built-temp/base-no.json"), + code: "no", + region: "", + }, + "zh-CN": { + name: "简体中文", + data: require("./built-temp/base-zh-CN.json"), + code: "zh", + region: "CN", + }, }; diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js index 17563ab9..83aa21fb 100644 --- a/src/js/profile/application_settings.js +++ b/src/js/profile/application_settings.js @@ -89,6 +89,33 @@ export const movementSpeeds = [ }, ]; +export const autosaveIntervals = [ + { + id: "one_minute", + seconds: 60, + }, + { + id: "two_minutes", + seconds: 120, + }, + { + id: "five_minutes", + seconds: 5 * 60, + }, + { + id: "ten_minutes", + seconds: 10 * 60, + }, + { + id: "twenty_minutes", + seconds: 20 * 60, + }, + { + id: "disabled", + seconds: null, + }, +]; + /** @type {Array} */ export const allApplicationSettings = [ new EnumSetting("language", { @@ -146,6 +173,7 @@ export const allApplicationSettings = [ ), // GAME + new BoolSetting("offerHints", categoryGame, (app, value) => {}), new EnumSetting("theme", { options: Object.keys(THEMES), @@ -159,11 +187,24 @@ export const allApplicationSettings = [ */ (app, id) => { applyGameTheme(id); - document.body.setAttribute("data-theme", id); + document.documentElement.setAttribute("data-theme", id); }, enabled: !IS_DEMO, }), + new EnumSetting("autosaveInterval", { + options: autosaveIntervals, + valueGetter: interval => interval.id, + textGetter: interval => T.settings.labels.autosaveInterval.intervals[interval.id], + category: categoryGame, + restartRequired: false, + changeCb: + /** + * @param {Application} app + */ + (app, id) => null, + }), + new EnumSetting("refreshRate", { options: ["60", "100", "144", "165", "250", "500"], valueGetter: rate => rate, @@ -197,7 +238,10 @@ export const allApplicationSettings = [ }), new BoolSetting("alwaysMultiplace", categoryGame, (app, value) => {}), - new BoolSetting("offerHints", categoryGame, (app, value) => {}), + new BoolSetting("enableTunnelSmartplace", categoryGame, (app, value) => {}), + new BoolSetting("vignette", categoryGame, (app, value) => {}), + new BoolSetting("compactBuildingInfo", categoryGame, (app, value) => {}), + new BoolSetting("disableCutDeleteWarnings", categoryGame, (app, value) => {}), ]; export function getApplicationSettingById(id) { @@ -216,9 +260,14 @@ class SettingsStorage { this.scrollWheelSensitivity = "regular"; this.movementSpeed = "regular"; this.language = "auto-detect"; + this.autosaveInterval = "two_minutes"; this.alwaysMultiplace = false; this.offerHints = true; + this.enableTunnelSmartplace = true; + this.vignette = true; + this.compactBuildingInfo = false; + this.disableCutDeleteWarnings = false; /** * @type {Object.} @@ -313,6 +362,17 @@ export class ApplicationSettings extends ReadWriteProxy { return 1; } + getAutosaveIntervalSeconds() { + const id = this.getAllSettings().autosaveInterval; + for (let i = 0; i < autosaveIntervals.length; ++i) { + if (autosaveIntervals[i].id === id) { + return autosaveIntervals[i].seconds; + } + } + logger.error("Unknown autosave interval id:", id); + return 120; + } + getIsFullScreen() { return this.getAllSettings().fullscreen; } @@ -408,7 +468,7 @@ export class ApplicationSettings extends ReadWriteProxy { } getCurrentVersion() { - return 10; + return 16; } /** @param {{settings: SettingsStorage, version: number}} data */ @@ -445,6 +505,37 @@ export class ApplicationSettings extends ReadWriteProxy { data.version = 10; } + if (data.version < 11) { + data.settings.enableTunnelSmartplace = true; + data.version = 11; + } + + if (data.version < 12) { + data.settings.vignette = true; + data.version = 12; + } + + if (data.version < 13) { + data.settings.compactBuildingInfo = false; + data.version = 13; + } + + if (data.version < 14) { + data.settings.disableCutDeleteWarnings = false; + data.version = 14; + } + + if (data.version < 15) { + data.settings.autosaveInterval = "two_minutes"; + data.version = 15; + } + + if (data.version < 16) { + // RE-ENABLE this setting, it already existed + data.settings.enableTunnelSmartplace = true; + data.version = 16; + } + return ExplainedResult.good(); } } diff --git a/src/js/profile/setting_types.js b/src/js/profile/setting_types.js index 3b1b3dd7..1255f961 100644 --- a/src/js/profile/setting_types.js +++ b/src/js/profile/setting_types.js @@ -7,8 +7,6 @@ import { T } from "../translations"; const logger = createLogger("setting_types"); -const standaloneOnlySettingHtml = `${T.demo.settingNotAvailable}`; - export class BaseSetting { /** * @@ -115,7 +113,7 @@ export class EnumSetting extends BaseSetting { getHtml() { return ` - ${this.enabled ? "" : standaloneOnlySettingHtml} + ${this.enabled ? "" : `${T.demo.settingNotAvailable}`} ${T.settings.labels[this.id].title} @@ -189,7 +187,7 @@ export class BoolSetting extends BaseSetting { getHtml() { return ` - ${this.enabled ? "" : standaloneOnlySettingHtml} + ${this.enabled ? "" : `${T.demo.settingNotAvailable}`} ${T.settings.labels[this.id].title} diff --git a/src/js/savegame/savegame.js b/src/js/savegame/savegame.js index b67a8d0d..359a48b5 100644 --- a/src/js/savegame/savegame.js +++ b/src/js/savegame/savegame.js @@ -13,6 +13,7 @@ import { getSavegameInterface, savegameInterfaces } from "./savegame_interface_r import { SavegameInterface_V1001 } from "./schemas/1001"; import { SavegameInterface_V1002 } from "./schemas/1002"; import { SavegameInterface_V1003 } from "./schemas/1003"; +import { SavegameInterface_V1004 } from "./schemas/1004"; const logger = createLogger("savegame"); @@ -44,7 +45,7 @@ export class Savegame extends ReadWriteProxy { * @returns {number} */ static getCurrentVersion() { - return 1003; + return 1004; } /** @@ -98,6 +99,11 @@ export class Savegame extends ReadWriteProxy { data.version = 1003; } + if (data.version === 1003) { + SavegameInterface_V1004.migrate1003to1004(data); + data.version = 1004; + } + return ExplainedResult.good(); } diff --git a/src/js/savegame/savegame_interface_registry.js b/src/js/savegame/savegame_interface_registry.js index 8c28fcc9..6144ca62 100644 --- a/src/js/savegame/savegame_interface_registry.js +++ b/src/js/savegame/savegame_interface_registry.js @@ -4,6 +4,7 @@ import { createLogger } from "../core/logging"; import { SavegameInterface_V1001 } from "./schemas/1001"; import { SavegameInterface_V1002 } from "./schemas/1002"; import { SavegameInterface_V1003 } from "./schemas/1003"; +import { SavegameInterface_V1004 } from "./schemas/1004"; /** @type {Object.} */ export const savegameInterfaces = { @@ -11,6 +12,7 @@ export const savegameInterfaces = { 1001: SavegameInterface_V1001, 1002: SavegameInterface_V1002, 1003: SavegameInterface_V1003, + 1004: SavegameInterface_V1004, }; const logger = createLogger("savegame_interface_registry"); diff --git a/src/js/savegame/schemas/1004.js b/src/js/savegame/schemas/1004.js new file mode 100644 index 00000000..c9feda1a --- /dev/null +++ b/src/js/savegame/schemas/1004.js @@ -0,0 +1,36 @@ +import { createLogger } from "../../core/logging.js"; +import { SavegameInterface_V1003 } from "./1003.js"; + +const schema = require("./1004.json"); +const logger = createLogger("savegame_interface/1004"); + +export class SavegameInterface_V1004 extends SavegameInterface_V1003 { + getVersion() { + return 1004; + } + + getSchemaUncached() { + return schema; + } + + /** + * @param {import("../savegame_typedefs.js").SavegameData} data + */ + static migrate1003to1004(data) { + logger.log("Migrating 1003 to 1004"); + const dump = data.dump; + if (!dump) { + return true; + } + + // The hub simply has an empty label + const waypointData = dump.waypoints.waypoints; + for (let i = 0; i < waypointData.length; ++i) { + const waypoint = waypointData[i]; + if (!waypoint.deletable) { + waypoint.label = null; + } + delete waypoint.deletable; + } + } +} diff --git a/src/js/savegame/schemas/1004.json b/src/js/savegame/schemas/1004.json new file mode 100644 index 00000000..6682f615 --- /dev/null +++ b/src/js/savegame/schemas/1004.json @@ -0,0 +1,5 @@ +{ + "type": "object", + "required": [], + "additionalProperties": true +} diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js index b782155f..8665b80e 100644 --- a/src/js/states/main_menu.js +++ b/src/js/states/main_menu.js @@ -3,10 +3,12 @@ import { cachebust } from "../core/cachebust"; import { globalConfig, IS_DEBUG, IS_DEMO, THIRDPARTY_URLS } from "../core/config"; import { makeDiv, + makeButtonElement, formatSecondsToTimeAgo, generateFileDownload, waitNextFrame, isSupportedBrowser, + makeButton, } from "../core/utils"; import { ReadWriteProxy } from "../core/read_write_proxy"; import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs"; @@ -23,7 +25,7 @@ export class MainMenuState extends GameState { getInnerHTML() { const bannerHtml = ` ${T.demoBanners.title} - + ${T.demoBanners.intro} Get the shapez.io standalone! @@ -59,9 +61,9 @@ export class MainMenuState extends GameState { - + - ${IS_DEMO ? `${bannerHtml}` : ""} + ${IS_DEMO ? `${bannerHtml}` : ""} @@ -70,11 +72,9 @@ export class MainMenuState extends GameState { ? "" : `${T.mainMenu.browserWarning}` } - ${T.mainMenu.play} - ${T.mainMenu.importSavegame} - - + + `; @@ -186,8 +189,6 @@ export class MainMenuState extends GameState { } const qs = this.htmlElement.querySelector.bind(this.htmlElement); - this.trackClicks(qs(".mainContainer .playButton"), this.onPlayButtonClicked); - this.trackClicks(qs(".mainContainer .importButton"), this.requestImportSavegame); if (G_IS_DEV && globalConfig.debug.fastGameEnter) { const games = this.app.savegameMgr.getSavegamesMetaData(); @@ -223,6 +224,7 @@ export class MainMenuState extends GameState { this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked); } + this.renderMainMenu(); this.renderSavegames(); const steamLink = this.htmlElement.querySelector(".steamLink"); @@ -252,6 +254,50 @@ export class MainMenuState extends GameState { ); } + renderMainMenu() { + const importButtonElement = makeButtonElement( + ["importButton", "styledButton"], + T.mainMenu.importSavegame + ); + this.trackClicks(importButtonElement, this.requestImportSavegame); + + if (this.savedGames.length > 0) { + const continueButton = makeButton( + this.htmlElement.querySelector(".mainContainer"), + ["continueButton", "styledButton"], + T.mainMenu.continue + ); + this.trackClicks(continueButton, this.onContinueButtonClicked); + + const outerDiv = makeDiv(this.htmlElement.querySelector(".mainContainer"), null, ["outer"], null); + outerDiv.appendChild(importButtonElement); + const newGameButton = makeButton( + this.htmlElement.querySelector(".mainContainer .outer"), + ["newGameButton", "styledButton"], + T.mainMenu.newGame + ); + this.trackClicks(newGameButton, this.onPlayButtonClicked); + + const oldPlayButton = this.htmlElement.querySelector(".mainContainer .playButton"); + if (oldPlayButton) oldPlayButton.remove(); + } else { + const playBtn = makeButton( + this.htmlElement.querySelector(".mainContainer"), + ["playButton", "styledButton"], + T.mainMenu.play + ); + this.trackClicks(playBtn, this.onPlayButtonClicked); + + this.htmlElement.querySelector(".mainContainer").appendChild(importButtonElement); + + const outerDiv = this.htmlElement.querySelector(".mainContainer .outer"); + if (outerDiv) { + outerDiv.remove(); + this.htmlElement.querySelector(".mainContainer .continueButton").remove(); + } + } + } + onSteamLinkClicked() { this.app.analytics.trackUiClick("main_menu_steam_link_2"); this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.standaloneStorePage); @@ -310,12 +356,16 @@ export class MainMenuState extends GameState { }, this); } + get savedGames() { + return this.app.savegameMgr.getSavegamesMetaData(); + } + renderSavegames() { const oldContainer = this.htmlElement.querySelector(".mainContainer .savegames"); if (oldContainer) { oldContainer.remove(); } - const games = this.app.savegameMgr.getSavegamesMetaData(); + const games = this.savedGames; if (games.length > 0) { const parent = makeDiv(this.htmlElement.querySelector(".mainContainer"), null, ["savegames"]); @@ -346,13 +396,13 @@ export class MainMenuState extends GameState { downloadButton.classList.add("styledButton", "downloadGame"); elem.appendChild(downloadButton); - const resumeBtn = document.createElement("button"); - resumeBtn.classList.add("styledButton", "resumeGame"); - elem.appendChild(resumeBtn); + const resumeButton = document.createElement("button"); + resumeButton.classList.add("styledButton", "resumeGame"); + elem.appendChild(resumeButton); this.trackClicks(deleteButton, () => this.deleteGame(games[i])); this.trackClicks(downloadButton, () => this.downloadGame(games[i])); - this.trackClicks(resumeBtn, () => this.resumeGame(games[i])); + this.trackClicks(resumeButton, () => this.resumeGame(games[i])); } } } @@ -398,6 +448,7 @@ export class MainMenuState extends GameState { this.app.savegameMgr.deleteSavegame(game).then( () => { this.renderSavegames(); + if (this.savedGames.length <= 0) this.renderMainMenu(); }, err => { this.dialogs.showWarning( @@ -455,6 +506,24 @@ export class MainMenuState extends GameState { }); } + onContinueButtonClicked() { + let latestLastUpdate = 0; + let latestInternalId; + this.app.savegameMgr.currentData.savegames.forEach(saveGame => { + if (saveGame.lastUpdate > latestLastUpdate) { + latestLastUpdate = saveGame.lastUpdate; + latestInternalId = saveGame.internalId; + } + }); + + const savegame = this.app.savegameMgr.getSavegameById(latestInternalId); + savegame.readAsync().then(() => { + this.moveToState("InGameState", { + savegame, + }); + }); + } + onLeave() { this.dialogs.cleanup(); } diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index e42edc98..5184bc42 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -54,5 +54,5 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ "resolveJsonModule": true - }, + } } diff --git a/translations/README.md b/translations/README.md index 3b6c54a5..e799926c 100644 --- a/translations/README.md +++ b/translations/README.md @@ -19,12 +19,14 @@ The base translation is `base-en.yaml`. It will always contain the latest phrase - [Swedish](base-sv.yaml) - [Chinese (Simplified)](base-zh-CN.yaml) - [Chinese (Traditional)](base-zh-TW.yaml) -- [Spanish](base-es.yaml) +- [Spanish (Latin America)](base-es.yaml) - [Hungarian](base-hu.yaml) - [Turkish](base-tr.yaml) - [Japanese](base-ja.yaml) - [Lithuanian](base-lt.yaml) - [Arabic](base-ar.yaml) +- [Norwegian](base-no.yaml) +- [Kroatian](base-hr.yaml) (If you want to translate into a new language, see below!) diff --git a/translations/base-ar.yaml b/translations/base-ar.yaml index 11864c3c..10a2e7e9 100644 --- a/translations/base-ar.yaml +++ b/translations/base-ar.yaml @@ -153,6 +153,9 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -250,7 +253,7 @@ dialogs: createMarker: title: New Marker - desc: Give it a meaningful name + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! @@ -282,6 +285,12 @@ ingame: createMarker: Create Marker delete: Destroy pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -317,11 +326,6 @@ ingame: newUpgrade: A new upgrade is available! gameSaved: Your game has been saved. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Upgrades @@ -480,13 +484,16 @@ buildings: painter: default: name: &painter Painter - description: Colors the whole shape on the left input with the color from the top input. + description: &painter_desc Colors the whole shape on the left input with the color from the top input. double: name: Painter (Double) description: Colors the shapes on the left inputs with the color from the top input. quad: name: Painter (Quad) description: Allows to color each quadrant of the shape with a different color. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -668,6 +675,42 @@ settings: fast: Fast super_fast: Super Fast extremely_fast: Extremely Fast + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. + This also enables to drag tunnels and excess tunnels will get removed. + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. + keybindings: title: Keybindings hint: >- @@ -713,7 +756,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement rotateWhilePlacing: Rotate rotateInverseModifier: >- Modifier: Rotate CCW instead @@ -731,6 +773,10 @@ keybindings: pasteLastBlueprint: Paste last blueprint massSelectCut: Cut area exportScreenshot: Export whole Base as Image + mapMoveFaster: Move Faster + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: About this Game diff --git a/translations/base-cz.yaml b/translations/base-cz.yaml index ec1d6f55..3eb2bccd 100644 --- a/translations/base-cz.yaml +++ b/translations/base-cz.yaml @@ -134,6 +134,9 @@ mainMenu: showInfo: Zobrazit contestOver: Tato soutěž skončila - Připojte se na Discord a získejte informace o nových soutěžích! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -231,21 +234,21 @@ dialogs: createMarker: title: Nová značka - desc: Dejte jí smysluplné jméno + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: V ukázce můžete vytvořit pouze dvě značky. Získejte plnou verzi pro neomezený počet značek! massCutConfirm: - title: Confirm cut + title: Potvrdit vyjmutí desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + Chceš vyjmout spoustu budov (přesněji řečeno )! Vážně to + chceš udělat? exportScreenshotWarning: - title: Export screenshot + title: Exportuj snímek obrazovky desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + Zažádal jsi o exportování své základny jako obrázek. Měj prosím na paměti, že to + může zejména u větších základen dlouho trvat, nebo dokonce shodit hru! ingame: # This is shown in the top left corner and displays useful keybindings in @@ -262,7 +265,13 @@ ingame: placeBuilding: Položit budovu createMarker: Vytvořit značku delete: Zničit - pasteLastBlueprint: Paste last blueprint + pasteLastBlueprint: Vložit poslední plán + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -298,11 +307,6 @@ ingame: newUpgrade: Nová aktualizace je k dispozici! gameSaved: Hra byla uložena. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Vylepšení @@ -461,13 +465,16 @@ buildings: painter: default: name: &painter Barvič - description: Obarví celý tvar v levém vstupu barvou z pravého vstupu. + description: &painter_desc Obarví celý tvar v levém vstupu barvou z pravého vstupu. double: name: Barvič (dvojnásobný) description: Obarví tvary z levých vstupů barvou z horního vstupu. quad: name: Barvič (čtyřnásobný) description: Umožňuje obarvit každý dílek tvaru samostatně. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -622,11 +629,11 @@ settings: Vybere motiv (světlý / tmavý). themes: - dark: Dark - light: Light + dark: Tmavý + light: Světlý refreshRate: - title: Cíl simulace + title: Obnovovací frekvence description: >- Pokud máte 144 Hz monitor, změňte si rychlost obnovování obrazu. Toto nastavení může snížit FPS, pokud máte pomalý počítač. @@ -641,15 +648,50 @@ settings: Pokud zapnuté, budou se ve hře zobrazovat tipy a nápovědy. Také schová určité elementy na obrazovce pro jednodušší dostání se do hry. movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Rychlost kamery + description: Mění, jak rychle se kamera posouvá při použití klávesnice. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Hodně pomalá + slow: Pomalá + regular: Normální + fast: Rychlá + super_fast: Hodně Rychlá + extremely_fast: Extrémně Rychlá + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. + This also enables to drag tunnels and excess tunnels will get removed. + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Klávesové zkratky @@ -674,6 +716,7 @@ keybindings: mapMoveRight: Posun doprava mapMoveDown: Posun dolů mapMoveLeft: Posun doleva + mapMoveFaster: Rychlejší posun centerMap: Vycentrovat mapu mapZoomIn: Přiblížit @@ -696,7 +739,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Zrušit stavbu rotateWhilePlacing: Otočit rotateInverseModifier: >- Modifikátor: Otočit proti směru hodinových ručiček @@ -711,29 +753,32 @@ keybindings: placementDisableAutoOrientation: Zrušit automatickou orientaci placeMultiple: Zůstat ve stavebním módu placeInverse: Přepnout automatickou orientaci pásů - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + pasteLastBlueprint: Vložit poslední plán + massSelectCut: Vyjmout oblast + exportScreenshot: Exportovat celou základnu jako obrázek + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: O hře body: >- - This game is open source and developed by Tobias Springer (this is me). + Tato hra je open source a je vyvíjená Tobiasem Springerem (česky neumí, ale je to fakt frajer :) ). - If you want to contribute, check out shapez.io on github. + Pokud se chceš na hře podílet, podívej se na shapez.io na githubu. - This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server! - The soundtrack was made by Peppsen - He's awesome. + Soundtrack udělal Peppsen - Je úžasnej. - Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + V neposlední řadě by Tobias (já jen tlumočím) rád poděkoval skvělému kamarádovi Niklasi - Bez hodin strávených + u factoria by tato hra nikdy neexistovala. changelog: title: Seznam změn @@ -744,6 +789,6 @@ demo: importingGames: Importování uložených her oneGameLimit: Omezeno pouze na jednu uloženou hru customizeKeybindings: Změna klávesových zkratek - exportingBase: Exporting whole Base as Image + exportingBase: Exportovat celou základnu jako obrázek settingNotAvailable: Nedostupné v demo verzi. diff --git a/translations/base-de.yaml b/translations/base-de.yaml index 74e4d927..fee20525 100644 --- a/translations/base-de.yaml +++ b/translations/base-de.yaml @@ -75,10 +75,10 @@ global: # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: - thousands: T + thousands: k millions: M - billions: B - trillions: tr + billions: G + trillions: T # Shown for infinitely big numbers infinite: unend @@ -151,7 +151,10 @@ mainMenu: showInfo: Anschauen contestOver: Dieser Wettbewerb ist vorbei! Tritt dem Discord Server bei, um über neue Wettbewerbe informiert zu werden! - helpTranslate: Help translate! + helpTranslate: Hilf beim Übersetzen! + continue: Fortsetzen + newGame: Neues Spiel + madeBy: Ein Spiel von dialogs: buttons: @@ -168,14 +171,14 @@ dialogs: showKeybindings: Kürzel anzeigen importSavegameError: - title: Import Fehler + title: Importierfehler text: >- Fehler beim Importieren deines Spielstands: importSavegameSuccess: title: Spielstand importieren text: >- - Dein Spielstand wurde erfolgreich importiert + Dein Spielstand wurde erfolgreich importiert. gameLoadFailure: title: Der Spielstand ist kaputt @@ -183,9 +186,9 @@ dialogs: Der Spielstand konnte nicht geladen werden. confirmSavegameDelete: - title: Bestätige Löschen + title: Löschen bestätigen text: >- - Bist du sicher, dass du das Spiel löschen willst? + Bist du sicher, dass du den Spielstand löschen willst? savegameDeletionError: title: Löschen gescheitert @@ -195,15 +198,15 @@ dialogs: restartRequired: title: Neustart benötigt text: >- - Du muss das Spiel neu starten, um die Einstellungen anzuwenden + Du muss das Spiel neu starten, um die Einstellungen anzuwenden. editKeybinding: - title: Ändere Tastenbelegung + title: Tastenbelegung ändern desc: Drücke die Taste oder Maustaste, die du vergeben willst, oder ESC um abzubrechen. resetKeybindingsConfirmation: title: Tastenbelegung zurücksetzen - desc: Das wird all deine Tastenbelegungen auf den Standard zurücksetzen. Bitte bestätige. + desc: Das wird alle deine Tastenbelegungen auf den Standard zurücksetzen. Bist du dir sicher? keybindingsResetOk: title: Tastenbelegung zurückgesetzt @@ -211,11 +214,11 @@ dialogs: featureRestriction: title: Demo Version - desc: Du hast ein Feature probiert (), welches nicht in der Demo enthalten ist. Erwerbe die Standalone für das volle Erlebnis! + desc: Du hast ein Feature gefunden (), welches nicht in der Demo enthalten ist. Erwerbe die Standalone für das volle Erlebnis! oneSavegameLimit: title: Begrenzte Spielstände - desc: Du kannst in der Demo nur einen Spielstand haben. Bitte lösche das Spiel oder hole dir die Standalone! + desc: Du kannst in der Demo nur einen Spielstand haben. Bitte lösche den existierenden Spielstand oder hole dir die Standalone! updateSummary: title: Neues Update! @@ -226,78 +229,82 @@ dialogs: title: Upgrades Freischalten desc: >- Viele deiner Formen können noch benutzt werden, um Upgrades freizuschalten - Zerstöre deine alten Fabriken nicht! - Den Upgrade Tab kannst du oben rechts im Bildschirm finden. + Den Upgrade-Tab kannst du oben rechts im Bildschirm finden. massDeleteConfirm: - title: Bestätige Löschen + title: Löschen bestätigen desc: >- Du löscht sehr viele Gebäude ( um genau zu sein)! Bist du dir sicher? blueprintsNotUnlocked: title: Noch nicht freigeschaltet desc: >- - Blueprints werden erst in Level 12 freigeschalten! + Blueprints werden erst in Level 12 freigeschaltet! keybindingsIntroduction: - title: Nützliche Tastenbelegung + title: Nützliche Hotkeys desc: >- - Dieses Spiel hat viele Tastenbelegungen, die es einfacher machen, Fabriken zu bauen. - Hier sind ein paar, aber prüfe am besten die Tastenkürzel-Einstellungen! + Dieses Spiel hat viele Hotkeys, die den Bau von Fabriken vereinfachen und beschleunigen. + Hier sind ein paar, aber prüfe am besten die Tastenbelegung-Einstellungen! STRG + Ziehen: Wähle Areal aus. UMSCH: Halten, um mehrere Gebäude zu platzieren. - ALT: Invertiere die Platzierung der Förderbänder. + ALT: Invertiere die Platzierungsrichtung der Förderbänder. createMarker: title: Neuer Marker - desc: Gib ihm einen sinnvollen Namen + desc: Gib ihm einen griffigen Namen. Du kannst sogar die Abkürzung einer Form eingeben (Diese kann hier generiert werden). markerDemoLimit: - desc: Du kannst nur 2 benutzerdefinierte Marker in der Demo benutzen. Hol dir die Standalone um unendlich viele Marker zu benutzen! + desc: Du kannst nur 2 benutzerdefinierte Marker in der Demo benutzen. Hol dir die Standalone, um unendlich viele Marker zu erstellen! massCutConfirm: - title: Confirm cut + title: Ausschneiden bestätigen desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + Du schneidest sehr viele Gebäude aus ( um genau zu sein)! Bist du dir sicher? exportScreenshotWarning: - title: Export screenshot + title: Bildschirmfoto exportieren desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + Hier kannst du ein Bildschirmfoto von deiner ganzen Fabrik erstellen. Für extrem große Fabriken kann das jedoch sehr lange dauern und ggf. zum Spielabsturz führen! ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: moveMap: Bewegen - selectBuildings: Wähle Areal - stopPlacement: Stoppe Platzierung - rotateBuilding: Rotiere Gebäude - placeMultiple: Platziere Mehrere - reverseOrientation: Umgedrehte Orientierung - disableAutoOrientation: Deaktiviere Auto-Orientierung - toggleHud: Umschaltung HUD Sichtbarkeit - placeBuilding: Platziere Gebäude - createMarker: Erstelle Marker + selectBuildings: Areal markieren + stopPlacement: Platzierung stoppen + rotateBuilding: Gebäude rotieren + placeMultiple: Mehrere platzieren + reverseOrientation: Orientierung umkehren + disableAutoOrientation: Auto-Orientierung deaktivieren + toggleHud: HUD-Sichtbarkeit an/aus + placeBuilding: Gebäude platzieren + createMarker: Marker erstellen delete: Löschen - pasteLastBlueprint: Paste last blueprint + pasteLastBlueprint: Letzte Blaupause einfügen + lockBeltDirection: Bandplaner aktivieren + plannerSwitchSide: "Planer: Seite wechseln" + cutSelection: Ausschneiden + copySelection: Kopieren + clearSelection: Leere Selektion + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: # Buildings can have different variants which are unlocked at later levels, # and this is the hint shown when there are multiple variants available. - cycleBuildingVariants: Drücke um zwischen den Varianten zu wählen. + cycleBuildingVariants: Drücke , um zwischen den Varianten zu wählen. # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- Taste: infoTexts: - speed: Geschwindigkeit + speed: Geschw. range: Reichweite storage: Kapazität - oneItemPerSecond: 1 Item / Sekunde + oneItemPerSecond: 1 Item / s itemsPerSecond: Items / s itemsPerSecondDouble: (x2) @@ -308,7 +315,7 @@ ingame: # is replaced by the actual level, so this gets 'Level 03' for example. levelTitle: Level completed: Abgeschlossen - unlockText: freigeschalten! + unlockText: freigeschaltet! buttonNextLevel: Nächstes Level # Notifications on the lower right @@ -316,23 +323,18 @@ ingame: newUpgrade: Ein neues Upgrade ist verfügbar! gameSaved: Dein Spiel wurde gespeichert. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Upgrades buttonUnlock: Upgrade # Gets replaced to e.g. "Tier IX" - tier: Level + tier: Stufe # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMALES LEVEL (Geschw. x) + maximumLevel: MAXIMALE STUFE (Geschw. x) # The "Statistics" window statistics: @@ -345,8 +347,8 @@ ingame: title: Produziert description: Zeigt die Menge an Formen, die deine ganze Fabrik produziert (auch Zwischenprodukte). delivered: - title: Eingeliefert - description: Zeigt die Menge an Formen, die ins zentrale Gebäude eingeliefert werden. + title: Abgeliefert + description: Zeigt die Menge an Formen, die im zentralen Gebäude abgeliefert werden. noShapesProduced: Bisher wurden keine Formen produziert. # Displays the shapes per minute, e.g. '523 / m' @@ -378,19 +380,19 @@ ingame: waypoints: waypoints: Markierungen hub: HUB - description: Linksklick auf einen Marker um dort hinzugelangen, Rechts-Klick um ihn zu löschen.Drücke um einen Marker aus deinem Blickwinkel zu erschaffen, oder Rechts-Klicke um einen Marker auf deiner ausgewählten Position zu erschaffen. + description: Linksklick auf einen Marker, um dort hinzugelangen, Rechtsklick, um ihn zu löschen.Drücke um einen Marker aus deinem Blickwinkel, oder rechtsklicke, um einen Marker auf der ausgewählten Position zu erschaffen. creationSuccessNotification: Marker wurde erstellt. # Interactive tutorial interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Platziere einen Extrahierer auf der Kreis-Form um sie zu extrahieren! + 1_1_extractor: Platziere einen Extrahierer auf der Kreisform um sie zu extrahieren! 1_2_conveyor: >- - Verbinde den Extrahierer mit einem Förderband und schließe ihn am zentralen Gebäude an!Tipp: Drück und Ziehe das Förderband mit der Maus! + Verbinde den Extrahierer mit einem Förderband und schließe ihn am zentralen Gebäude an!Tipp: Drück und ziehe das Förderband mit der Maus! 1_3_expand: >- - Dies ist KEIN Idle-Game! Baue mehr Extrahierer und Fördebänder, um das Ziel schneller zu erreichen.Tipp: Halte UMSCH, um mehrere Gebäude zu platzieren und nutze R um sie zu rotieren. + Dies ist KEIN Idle-Game! Baue mehr Extrahierer und Förderbänder, um das Ziel schneller zu erreichen.Tipp: Halte UMSCH, um mehrere Gebäude zu platzieren und nutze R um sie zu rotieren. # All shop upgrades shopUpgrades: @@ -401,10 +403,10 @@ shopUpgrades: name: Extrahierer description: Geschw. x → x processors: - name: Schneiden, Rotieren & Stapeln + name: Schneider, Rotierer & Stapler description: Geschw. x → x painting: - name: Mischen & Färben + name: Mischer & Färber description: Geschw. x → x # Buildings and their name / description @@ -412,12 +414,12 @@ buildings: belt: default: name: &belt Förderband - description: Transportiert Items, halte und ziehe um mehrere zu platzieren. + description: Transportiert Items. Halte und ziehe um mehrere zu platzieren. miner: # Internal name for the Extractor default: name: &miner Extrahierer - description: Platziere in über einer Form oder Farbe um sie zu extrahieren. + description: Platziere ihn auf einer Form oder Farbe um sie zu extrahieren. chainable: name: Extrahierer (Kette) @@ -429,8 +431,8 @@ buildings: description: Erlaubt dir, Formen und Farbe unter Gebäuden und Förderbändern durchzuleiten. tier2: - name: Tunnel Level II - description: Erlaubt dir, Formen und Farbe unter Gebäuden und Förderbändern durchzuleiten. + name: Tunnel Stufe II + description: Erlaubt dir, Formen und Farbe unter Gebäuden und Förderbändern durchzuleiten. Höhere Reichweite. splitter: # Internal name for the Balancer default: @@ -439,18 +441,18 @@ buildings: compact: name: Kombinierer (Kompakt) - description: Vereint zwei Förderbänder in eins. + description: Vereint zwei Förderbänder zu einem. compact-inverse: name: Kombinierer (Kompakt) - description: Vereint zwei Förderbänder in eins. + description: Vereint zwei Förderbänder zu einem. cutter: default: - name: &cutter Zerschneider + name: &cutter Schneider description: Zerschneidet Formen von oben nach unten. Benutze oder zerstöre beide Hälften, sonst verstopft die Maschine! quad: - name: Zerschneider (4-fach) + name: Schneider (4-fach) description: Zerschneidet Formen in vier Teile. Benutze oder zerstöre alle Viertel, sonst verstopft die Maschine! rotater: @@ -459,8 +461,8 @@ buildings: description: Rotiert Formen im Uhrzeigersinn um 90 Grad. ccw: - name: Rotate (CCW) - description: Rotates shapes counter clockwise by 90 degrees. + name: Rotierer (CCW) + description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad. stacker: default: @@ -475,15 +477,18 @@ buildings: painter: default: name: &painter Färber - description: Färbt die ganze Form aus dem linken Eingang mit der Farbe aus dem oberen Eingang. + description: &painter_desc Färbt die ganze Form aus dem linken Eingang mit der Farbe aus dem oberen Eingang. double: name: Färber (2-Fach) - description: Färbt die Formen aus dem linken Eingang mit der Farbe aus dem oberen Eingang. + description: Färbt beide Formen aus dem linken Eingang mit der Farbe aus dem oberen Eingang. quad: name: Färber (4-Fach) description: Erlaubt jedes einzelne Viertel einer Form beliebig einzufärben. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -492,7 +497,7 @@ buildings: storage: name: Lager - description: Lagert den Überschuss, bis zu einer gegebenen Kapazität. Kann als Überlauftor agieren. + description: Lagert den Überschuss bis zu einer gegebenen Kapazität. Kann als Überlauftor agieren. hub: deliver: Liefere @@ -504,7 +509,7 @@ storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: title: Formen zerschneiden - desc: Du hast den Zerschneider freigeschaltet! - Er zerschneidet Formen von oben nach unten unabhängig von ihrer Orientierung!Stelle sicher, dass du den Abfall loswirst, sonst verstopft die Maschine! - Dafür habe ich dir extra einen Mülleimer freigeschalten. + desc: Du hast den Schneider freigeschaltet! - Er zerschneidet Formen von oben nach unten, unabhängig von ihrer Orientierung!Stelle sicher, dass du den Abfall loswirst, sonst verstopft die Maschine! - Dafür habe ich dir extra einen Mülleimer freigeschaltet. reward_rotater: title: Rotieren @@ -532,56 +537,56 @@ storyRewards: desc: Der Tunnel wurde freigeschaltet! Du kannst Items nun unter Gebäuden oder Förderbändern hindurchleiten! reward_rotater_ccw: - title: GdUZ Rotieren + title: Gegen UZS Rotieren desc: Du hast eine zweite Variante des Rotierers freigeschaltet! Damit können Items gegen den Uhrzeigensinn gedreht werden. Wähle den Rotierer aus und drücke 'T', um auf verschiedene Varianten zuzugreifen! reward_miner_chainable: - title: Chaining Extractor - desc: You have unlocked the chaining extractor! It can forward its resources to other extractors so you can more efficiently extract resources! + title: Extrahierer (Kette) + desc: Du hast den Extrahierer (Kette) freigeschaltet! Damit können die Ressourcen an den Nächsten weitergegeben werden, um Ressourcen effizienter zu extrahieren. reward_underground_belt_tier_2: - title: Tunnel Tier II - desc: You have unlocked a new variant of the tunnel - It has a bigger range, and you can also mix-n-match those tunnels now! + title: Tunnel Stufe II + desc: Du hast eine neue Variante des Tunnels freigeschaltet! Dieser hat eine höhere Reichweite und du kannst beide Tunnel miteinander mischen! reward_splitter_compact: - title: Compact Balancer + title: Kompakter Kombinierer desc: >- - You have unlocked a compact variant of the balancer - It accepts two inputs and merges them into one! + Du hast eine kompakte Variante des Kombinierers freigeschaltet! Er hat zwei Eingänge und gibt zwei Förderbänder als eines aus! reward_cutter_quad: - title: Quad Cutting - desc: You have unlocked a variant of the cutter - It allows you to cut shapes in four parts instead of just two! + title: Schneider (4-fach) + desc: Du hast eine neue Variante des Schneiders freigeschaltet! Damit kannst du Formen in alle vier Teile zerschneiden! 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! + title: Färber (2-fach) + desc: Du hast eine neue Variante des Färbers freigeschaltet! Hiermit kannst du zwei Formen auf einmal färben und verbrauchst nur eine Farbe! reward_painter_quad: - title: Quad Painting - desc: You have unlocked a variant of the painter - It allows to paint each part of the shape individually! + title: Färber (4-fach) + desc: Du hast eine neue Variante des Färbers freigeschaltet! Er kann jedes Viertel einer Form einzeln färben, verbraucht aber auch jeweils eine Farbe! reward_storage: - title: Storage Buffer - desc: You have unlocked a variant of the trash - It allows to store items up to a given capacity! + title: Zwischenlager + desc: Du hast eine neue Variante des Mülleimers freigeschaltet! Bis zu einer gewissen Kapazität können hier Items zwischengelagert werden! reward_freeplay: - title: Freeplay - desc: You did it! You unlocked the free-play mode! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!) + title: Freispiel + desc: Du hast es geschafft! Du hast den Freispielmodus freigeschaltet! Das heißt, dass abzuliefernde Formen jetzt zufällig generiert werden! (Keine Sorge, für die Standaloneversion ist noch mehr geplant!) reward_blueprints: - title: Blueprints - desc: You can now copy and paste parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.Pasting it is not free, you need to produce blueprint shapes to afford it! (Those you just delivered). + title: Blaupause + desc: Jetzt kannst du Teile deiner Fabrik kopieren und einfügen! Wähle ein Areal aus (Halte STRG und ziehe mit deiner Maus) und drücke 'C', um zu kopieren.Einfügen ist nicht kostenlos, du musst Blaupausenformen produzieren, um die Kopierkosten zu decken (Welche du gerade produziert hast)! # Special reward, which is shown when there is no reward actually no_reward: - title: Next level + title: Nächstes Level desc: >- - This level gave you no reward, but the next one will! PS: Better don't destroy your existing factory - You need all those shapes later again to unlock upgrades! + Dieses Level hat dir keine Belohnung gegeben, aber das nächste schon! PS: Denk daran, deine alten Fabriken nicht zu zerstören - Du wirst sie später alle noch brauchen, um Upgrades freizuschalten! no_reward_freeplay: - title: Next level + title: Nächstes Level desc: >- - Congratulations! By the way, more content is planned for the standalone! + Herzlichen Glückwunsch! Apropos, in der Standalone-Version ist noch vieles mehr geplant! settings: title: Einstellungen @@ -662,22 +667,57 @@ settings: Ändere die Sprache. Alle Übersetzungen werden von Nutzern erstellt und sind möglicherweise unvollständig! movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Bewegungsgeschwindigkeit + description: Ändert die Geschwindigkeit, mit der der Bildschirm durch die Pfeiltasten bewegt wird. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Sehr langsam + slow: Langsam + regular: Normal + fast: Schnell + super_fast: Sehr schnell + extremely_fast: Extrem schnell + enableTunnelSmartplace: + title: Intelligente Tunnel + description: >- + Aktiviert das automatische Entfernen von überflüssigen Förderbändern bei der Platzierung von Tunneln. + Außerdem funktioniert das Ziehen von Tunneln und überschüssige werden ebenfalls entfernt. + vignette: + title: Vignette + description: >- + Aktiviert den Vignetteneffekt, der den Rand des Bildschirms zunehmend verdunkelt + und das Lesen der Textfelder vereinfacht. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: - title: Tastenkürzel + title: Tastenbelegung hint: >- - Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen! + Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen. - resetKeybindings: Tastenkürzel zurücksetzen. + resetKeybindings: Tastenbelegung zurücksetzen. categoryLabels: general: Applikation @@ -685,27 +725,27 @@ keybindings: navigation: Navigation placement: Platzierung massSelect: Bereichsauswahl - buildings: Gebäude-Kürzel - placementModifiers: Platzierungs-Modifikatoren + buildings: Gebäude + placementModifiers: Platzierungsmodifikatoren mappings: confirm: Bestätigen back: Zurück - mapMoveUp: Move Up - mapMoveRight: Move Right - mapMoveDown: Move Down - mapMoveLeft: Move Left - centerMap: Center Map + mapMoveUp: Nach oben bewegen + mapMoveRight: Nach rechts bewegen + mapMoveDown: Nach unten bewegen + mapMoveLeft: Nach links bewegen + centerMap: Karte zentrieren - mapZoomIn: Zoom in - mapZoomOut: Zoom out - createMarker: Create Marker + mapZoomIn: Hineinzoomen + mapZoomOut: Herauszoomen + createMarker: Markeirung erstellen menuOpenShop: Upgrades - menuOpenStats: Statistics + menuOpenStats: Statistiken - toggleHud: Toggle HUD - toggleFPSInfo: Toggle FPS and Debug Info + toggleHud: HUD an/aus + toggleFPSInfo: FPS und Debug-Info an/aus belt: *belt splitter: *splitter underground_belt: *underground_belt @@ -717,24 +757,27 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement - rotateWhilePlacing: Rotate + rotateWhilePlacing: Rotieren rotateInverseModifier: >- - Modifier: Rotate CCW instead - cycleBuildingVariants: Cycle Variants - confirmMassDelete: Confirm Mass Delete - cycleBuildings: Cycle Buildings + Modifier: stattdessen gegen UZS rotieren + cycleBuildingVariants: Variante wählen + confirmMassDelete: Massenlöschung bestätigen + cycleBuildings: Gebäude rotieren - massSelectStart: Hold and drag to start - massSelectSelectMultiple: Select multiple areas - massSelectCopy: Copy area + massSelectStart: Halten und ziehen zum Beginnen + massSelectSelectMultiple: Mehrere Areale markieren + massSelectCopy: Areal kopieren - placementDisableAutoOrientation: Disable automatic orientation - placeMultiple: Stay in placement mode - placeInverse: Invert automatic belt orientation - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + placementDisableAutoOrientation: Automatische Orientierung deaktivieren + placeMultiple: Im Platziermodus bleiben + placeInverse: Automatische Förderbandorientierung invertieren + pasteLastBlueprint: Letzte Blaupause einfügen + massSelectCut: Areal ausschneiden + exportScreenshot: Ganze Fabrik als Foto exportieren + mapMoveFaster: Schneller bewegen + lockBeltDirection: Bandplaner aktivieren + switchDirectionLockSide: "Planer: Seite wechseln" + pipette: Pipette about: title: Über dieses Spiel @@ -764,7 +807,7 @@ demo: restoringGames: Spiele wiederherstellen importingGames: Spiele importieren oneGameLimit: Beschränkt auf einen Spielstand - customizeKeybindings: Tastenkürzel anpassen - exportingBase: Exporting whole Base as Image + customizeKeybindings: Tastenbelegung anpassen + exportingBase: Ganze Fabrik als Foto exportieren settingNotAvailable: Nicht verfügbar in der Demo. diff --git a/translations/base-el.yaml b/translations/base-el.yaml index 3eb04db4..d35810b2 100644 --- a/translations/base-el.yaml +++ b/translations/base-el.yaml @@ -153,6 +153,9 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -250,7 +253,7 @@ dialogs: createMarker: title: New Marker - desc: Give it a meaningful name + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! @@ -282,6 +285,12 @@ ingame: createMarker: Create Marker delete: Destroy pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -317,11 +326,6 @@ ingame: newUpgrade: A new upgrade is available! gameSaved: Your game has been saved. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Upgrades @@ -475,13 +479,16 @@ buildings: painter: default: name: &painter Painter - description: Colors the whole shape on the left input with the color from the right input. + description: &painter_desc Colors the whole shape on the left input with the color from the right input. double: name: Painter (Double) description: Colors the shapes on the left inputs with the color from the top input. quad: name: Painter (Quad) description: Allows to color each quadrant of the shape with a different color. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -669,6 +676,41 @@ settings: fast: Fast super_fast: Super Fast extremely_fast: Extremely Fast + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. + This also enables to drag tunnels and excess tunnels will get removed. + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Keybindings @@ -715,7 +757,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement rotateWhilePlacing: Rotate rotateInverseModifier: >- Modifier: Rotate CCW instead @@ -733,6 +774,10 @@ keybindings: pasteLastBlueprint: Paste last blueprint massSelectCut: Cut area exportScreenshot: Export whole Base as Image + mapMoveFaster: Move Faster + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: About this Game diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 7e6781c2..a3d73ddf 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -118,11 +118,14 @@ demoBanners: mainMenu: play: Play + continue: Continue + newGame: New Game changelog: Changelog importSavegame: Import openSourceHint: This game is open source! discordLink: Official Discord Server helpTranslate: Help translate! + madeBy: Made by # This is shown when using firefox and other browsers which are not supported. browserWarning: >- @@ -255,7 +258,7 @@ dialogs: createMarker: title: New Marker - desc: Give it a meaningful name + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! @@ -278,8 +281,14 @@ ingame: toggleHud: Toggle HUD placeBuilding: Place building createMarker: Create Marker - delete: Destroy + delete: Delete pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -315,11 +324,6 @@ ingame: newUpgrade: A new upgrade is available! gameSaved: Your game has been saved. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Upgrades @@ -478,7 +482,12 @@ buildings: painter: default: name: &painter Painter - description: Colors the whole shape on the left input with the color from the top input. + description: &painter_desc Colors the whole shape on the left input with the color from the top input. + + mirrored: + name: *painter + description: *painter_desc + double: name: Painter (Double) description: Colors the shapes on the left inputs with the color from the top input. @@ -602,6 +611,19 @@ settings: large: Large huge: Huge + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it entirely here. + + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + scrollWheelSensitivity: title: Zoom sensitivity description: >- @@ -668,6 +690,26 @@ settings: description: >- Whether to offer hints and tutorials while playing. Also hides certain UI elements onto a given level to make it easier to get into the game. + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. This also enables to drag tunnels and excess tunnels will get removed. + + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier to read. + + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a description and image is shown. + + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 entities. + keybindings: title: Keybindings hint: >- @@ -691,6 +733,7 @@ keybindings: mapMoveRight: Move Right mapMoveDown: Move Down mapMoveLeft: Move Left + mapMoveFaster: Move Faster centerMap: Center Map mapZoomIn: Zoom in @@ -714,14 +757,17 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement + pipette: Pipette rotateWhilePlacing: Rotate rotateInverseModifier: >- Modifier: Rotate CCW instead cycleBuildingVariants: Cycle Variants - confirmMassDelete: Confirm Mass Delete + confirmMassDelete: Delete area pasteLastBlueprint: Paste last blueprint cycleBuildings: Cycle Buildings + lockBeltDirection: Enable belt planner + switchDirectionLockSide: >- + Planner: Switch side massSelectStart: Hold and drag to start massSelectSelectMultiple: Select multiple areas diff --git a/translations/base-es.yaml b/translations/base-es.yaml index 78ba8b53..8b5566a6 100644 --- a/translations/base-es.yaml +++ b/translations/base-es.yaml @@ -32,11 +32,11 @@ steamPage: shapez.io es un juego sobre construir fábricas para automatizar la creación y combinación de figuras. Entrega las cada vez más complejas figuras requeridas para progresar y desbloquea mejoras para aumentar la velocidad de tu fábrica. - Al aumentar la demanda, necesitaras escalar tu fábrica para ajustarte a las necesidades - No te olvides de los recursos, necesitarás expandirte en el [b]mapa infinito[/b]! + Al aumentar la demanda, necesitaras escalar tu fábrica para ajustarte a las necesidades - ¡No te olvides de los recursos, necesitarás expandirte en el [b]mapa infinito[/b]! Ya que las figuras puedes ser aburridas necesitarás mezclar colores para pintar las figuras - Combina recursos de colores rojo, verde y azul para producir diferentes colores y pintar figuras para satisfacer la demanda. - Este juego cuenta con 18 niveles (Que te mantendrán ocupado durante horas!) pero estoy constantemente añadiendo nuevo contenido - Hay mucho planeado! + Este juego cuenta con 18 niveles (¡Que te mantendrán ocupado durante horas!) pero estoy constantemente añadiendo nuevo contenido - ¡Hay mucho planeado! [b]Ventajas del juego completo[/b] @@ -71,7 +71,7 @@ global: error: Error # How big numbers are rendered, e.g. "10,000" - thousandsDivider: "," + thousandsDivider: "." # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: @@ -113,19 +113,22 @@ demoBanners: # This is the "advertisement" shown in the main menu and other various places title: Versión de Prueba intro: >- - Obtén el juego completo para conseguir todas las características! + ¡Obtén el juego completo para conseguir todas las características! mainMenu: play: Jugar + continue: Continuar + newGame: Nuevo Juego changelog: Registro de cambios importSavegame: Importar - openSourceHint: Este juego es de código abierto! + openSourceHint: ¡Este juego es de código abierto! discordLink: Servidor de Discord Oficial - helpTranslate: Ayuda a traducirlo! + helpTranslate: ¡Ayuda a traducirlo! + madeBy: Desarrollado por # This is shown when using firefox and other browsers which are not supported. browserWarning: >- - Lo siento, pero el juego funcionará despacio en tu navegador! Obtén el juego completo o descarga Chrome para la experiencia completa. + ¡Lo siento, pero el juego funcionará despacio en tu navegador! Obtén el juego completo o descarga Chrome para la experiencia completa. savegameLevel: Nivel savegameLevelUnknown: Nivel desconocido @@ -133,11 +136,11 @@ mainMenu: contests: contest_01_03062020: title: "Concurso #01" - desc: Gana 25$ por la base más impresionante! + desc: ¡Gana 25$ por la base más impresionante! longDesc: >- - Para devolveros algo a vosotros he pensado que molaría hacer consursos semanales! + ¡Para devolveros algo a vosotros he pensado que molaría hacer consursos semanales! - El tema de esta semana: Construye la base más chula! + ¡El tema de esta semana: Construye la base más chula! Este es el trato: @@ -180,7 +183,7 @@ dialogs: gameLoadFailure: title: El juego está roto text: >- - No se pueod cargar la partida guardada: + No se ha podido cargar la partida guardada: confirmSavegameDelete: title: Confirmar borrado @@ -207,60 +210,62 @@ dialogs: keybindingsResetOk: title: Reseteo de los atajos de teclado - desc: Los atajos de taclado han sito reseteados a los valores por defecto! + desc: ¡Los atajos de taclado han sito reseteados a los valores por defecto! featureRestriction: title: Versión de Prueba - desc: Has intentado acceder a una característica () que no está disponible en la demo. Considera obtener el juego completo para la experiencia completa! + desc: Has intentado acceder a una característica () que no está disponible en la demo. ¡Considera obtener el juego completo para la experiencia completa! oneSavegameLimit: title: partidas guardadas limitadas - desc: Solo puedes tener una partida guardada a la vez en la versión de prueba. Por favor elimina la ya existente o obtén el juego completo! + desc: Solo puedes tener una partida guardada a la vez en la versión de prueba. ¡Por favor elimina la ya existente o obtén el juego completo! updateSummary: - title: Nueva actualización! + title: ¡Nueva actualización! desc: >- Estos son los cambios desde la última vez que jugaste: upgradesIntroduction: title: Desbloquear Mejoras desc: >- - Todas las figuras puedes ser usadas para desbloquear mejoras - No destruyas tus fábricas anteriores! + Todas las figuras puedes ser usadas para desbloquear mejoras - ¡No destruyas tus fábricas anteriores! La pestaña de mejoras está en la esquina superior derecha de la pantalla. massDeleteConfirm: title: Confirmar borrado desc: >- - Estás borrando muchos edificios ( para ser exactos)! ¿Estás seguro de querer hacer esto? + ¡Estás borrando muchos edificios ( para ser exactos)! ¿Estás seguro de querer hacer esto? + + massCutConfirm: + title: Confirmar corte + desc: >- + ¡Estas cortando muchos edificios ( para ser exactos)! ¿Estas seguro de + que quieres hacer esto? + blueprintsNotUnlocked: title: No desbloqueado todavía desc: >- - Los planos no han sido desbloqueados todavía! Completa más niveles para desbloquearlos. + ¡Los planos no han sido desbloqueados todavía! Completa más niveles para desbloquearlos. keybindingsIntroduction: title: Atajos de teclado útiles desc: >- El juego tiene muchos atajos de teclado que facilitan la tarea de construir grandes fábricas. - Aquí hay algunos, pero asegúrate de comprobar los atajos de teclado! + ¡Aquí hay algunos, pero asegúrate de comprobar los atajos de teclado! CTRL + Arrastrar: Selecciona un área para copiarla / borrarla. SHIFT: Mánten pulsado para colocar varias veces el mismo edificio. ALT: Invierte la orientación de las cintas transportadoras colocadas. createMarker: - title: Nueva marca - desc: Dale un nombre representativo + title: Nuevo marcador + desc: Dale un nombre significativo, tambien puedes agregarle la clave de una forma (La cual puedes generar aquí) markerDemoLimit: - desc: solo puedes crear dos marcas en la versión de prueba. Obtén el juego completo para marcas ilimitadas! - massCutConfirm: - title: Confirm cut - desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + desc: Sólo puedes crear dos marcadores en la versión de prueba. ¡Obtén el juego completo para marcas ilimitadas! exportScreenshotWarning: - title: Export screenshot + title: Exportar captura de pantalla desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + Has pedido una captura de pantalla. Por favor ten en cuenta de que + puede tardar bastante en las bases grandes ¡He incluso crashear tu juego! ingame: # This is shown in the top left corner and displays useful keybindings in @@ -278,6 +283,12 @@ ingame: createMarker: Crear marca delete: Destruir pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -305,19 +316,14 @@ ingame: # is replaced by the actual level, so this gets 'Level 03' for example. levelTitle: Nivel completed: Completado - unlockText: Desbloqueado ! + unlockText: ¡Has desbloqueado ! buttonNextLevel: Siguiente Nivel # Notifications on the lower right notifications: - newUpgrade: Una nueva mejora está disponible! + newUpgrade: ¡Una nueva mejora está disponible! gameSaved: Tu partida ha sido guardada. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Mejoras @@ -375,18 +381,18 @@ ingame: waypoints: waypoints: Marcadores hub: Edificio Central - description: Click izquierdo sbre un marcador para ir ahí, click derecho para borrarlo. Pulsa para crear un marcador de la vista actual o click derecho para crear una marca en la posición seleccionada. - creationSuccessNotification: La marca ha sido creada. + description: Click izquierdo sobre un marcador para ir ahí, click derecho para borrarlo. Pulsa para crear un marcador de la vista actual o click derecho para crear un marcador en la posición seleccionada. + creationSuccessNotification: El marcador ha sido creado. # Interactive tutorial interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Coloca un extractor encima de un círculo para extraerlo! + 1_1_extractor: ¡Coloca un extractor encima de un círculo para extraerlo! 1_2_conveyor: >- - Conecta el extractor con una cinta transportadora a tu edificio central! Pista: Pulsa y arrastra la cinta transportadora con el ratón! + ¡Conecta el extractor con una cinta transportadora a tu edificio central! Pista: Pulsa y arrastra la cinta transportadora con el ratón! 1_3_expand: >- - Esto NO es un "idle game"! Construye más extractores y cintas transportadoras para completar el objetivo más rápido. Pista: Mantén pulsado SHIFT para colocar varios extractores y usa R para rotarlos. + ¡Esto NO es un "juego de esperar"! Construye más extractores y cintas transportadoras para completar el objetivo más rápido. Pista: Mantén pulsado SHIFT para colocar varios extractores y usa R para rotarlos. # All shop upgrades shopUpgrades: belt: @@ -443,10 +449,10 @@ buildings: cutter: default: name: &cutter Cortador - description: Corta las figuras de arriba a abajo y saca ambas mitades. Si solo usas una parte, asegúrate de destruir la otra parte o se parará! + description: Corta las figuras de arriba a abajo y saca ambas mitades. ¡Si solo usas una parte, asegúrate de destruir la otra parte o se parará! quad: name: Cortador (Cuádruple) - description: Corta figuras en cuatro partes. Si solo usas una parte, asegúrate de destruir las otras partes o se parará! + description: Corta figuras en cuatro partes. ¡Si solo usas una parte, asegúrate de destruir las otras partes o se parará! rotater: default: @@ -469,7 +475,10 @@ buildings: painter: default: name: &painter Pintor - description: Colorea la figura entera con el color que entra por la izquierda. + description: &painter_desc Colorea la figura entera con el color que entra por la izquierda. + mirrored: + name: *painter + description: *painter_desc double: name: Pintor (Doble) description: Colorea las figuras que entran por la izquierda con el color que entrapor arriba. @@ -479,7 +488,7 @@ buildings: trash: default: - name: &trash Basura + name: &trash Basurero description: Acepta entradas desde todos los lados y los destruye. Para Siempre. storage: @@ -487,89 +496,89 @@ buildings: description: Guarda el exceso de elementos, hasta cierta cantidad. Puede ser usado para contolar el desborde de elementos. hub: - deliver: Deliver - toUnlock: to unlock + deliver: Envía + toUnlock: para desbloquear levelShortcut: LVL storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: - title: Cortando Figuras - desc: Acabas de desbloquear el cortador - corta las figuras por la mitad de arriba abajo sin importar su orientación!Estate seguro de deshacerte de lo que no vayas a usar o se parará - Para ese propósito te he dado una basura, que destruye todo lo que le pongas! + title: Cortador de Figuras + desc: Acabas de desbloquear el cortador - corta las figuras por la mitad de arriba abajo ¡Sin importar su orientación!Estate seguro de deshacerte de lo que no vayas a usar o se parará - Para ese propósito te he dado una basura, que destruye todo lo que le pongas! reward_rotater: - title: Rotando - desc: El rotador ha sido desbloqueado! Rota figuras en el sentido de las agujas del reloj, 90 grados. + title: Rotador + desc: ¡El rotador ha sido desbloqueado! Rota figuras en el sentido de las agujas del reloj, 90 grados. reward_painter: - title: Pintando + title: Pintor desc: >- - El pintor ha sido desbloqueado - Extrae color de las betas (al igual que haces con las figuras) y combínalo con una figura para pintarla de ese color! PS: Si eres daltónico, estoy trabajando en una solución! + El pintor ha sido desbloqueado - ¡Extrae color de las betas (al igual que haces con las figuras) y combínalo con una figura para pintarla de ese color! PS: Si eres daltónico, estoy trabajando en una solución! reward_mixer: - title: Mezclando Color - desc: El mezclador ha sido desbloqueado - Combina dos colores usando mezcla aditiva con este edificio! + title: Mezclador de Color + desc: El mezclador ha sido desbloqueado - ¡Combina dos colores usando mezcla aditiva con este edificio! reward_stacker: title: Apilador - desc: Ahora puedes combinar figuras con el apilador! Ambas entradas son combinadas, y si pueden ser colocadas una junto a la otra serán fusionadas. Si no, la entrada derecha será apilada encima de la entrada izquierda! + desc: ¡Ahora puedes combinar figuras con el apilador! Ambas entradas son combinadas, y si pueden ser colocadas una junto a la otra serán fusionadas. ¡Si no, la entrada derecha será apilada encima de la entrada izquierda! reward_splitter: title: Separador/Fusión - desc: El balanceador multiusos ha sido desbloqueado - Puede ser usado para construir fábricas más grandes separando y uniendo elementos en varias cintas transportadoras! + desc: El balanceador multiusos ha sido desbloqueado - ¡Puede ser usado para construir fábricas más grandes separando y uniendo elementos en varias cintas transportadoras! reward_tunnel: - title: Tunel - desc: El tunel ha sido desbloqueado - Ahora puedes transportar elementos por debajo de edificios u otras cintas! + title: Túnel + desc: El tunel ha sido desbloqueado - ¡Ahora puedes transportar elementos por debajo de edificios u otras cintas! reward_rotater_ccw: - title: Rotando Inversamente - desc: Has desbloqueado unavariante del rotador - Te permite rotar en sentido antihorario! Para construirlo selecciona el rotador y pulsa 'T' para ciclar por sus variantes! + title: Rotador Inverso + desc: Has desbloqueado una variante del rotador - ¡Te permite rotar en sentido antihorario! Para construirlo selecciona el rotador y pulsa 'T' para ciclar por sus variantes reward_miner_chainable: title: Extractor en Cadena - desc: Has desbloqueado el extractor en cadena! Puede enviar los recursos a otros extractores, así puedes extraer recursos más eficientemente! + desc: ¡Has desbloqueado el extractor en cadena! Puede enviar los recursos a otros extractores, así puedes extraer recursos más eficientemente reward_underground_belt_tier_2: title: Tunel de Nivel II - desc: Has desbloqueado una nueva variante del tunel - Tiene un mayor rango, ahora puedes mezclar los distintos tipos de túneles! + desc: Has desbloqueado una nueva variante del tunel - ¡Tiene un mayor rango, ahora puedes mezclar los distintos tipos de túneles! reward_splitter_compact: title: Balanceador Compacto desc: >- - Has desbloqueado una variante compacta del balanceador - Acepta dos entradas y las junta en una salida! + Has desbloqueado una variante compacta del balanceador - ¡Acepta dos entradas y las junta en una salida! reward_cutter_quad: - title: Cortador Cuñadruple - desc: Has desbloqueado una variante del cortador - Permite cortar figuras en cuatro partes en vez de solo dos! + title: Cortador Cuádruple + desc: Has desbloqueado una variante del cortador - ¡Permite cortar figuras en cuatro partes en vez de solo dos! reward_painter_double: - title: Doble Pintado - desc: Has desbloqueado una variante del pintor - Funciona como un pintor regular pero procesa dos formas a la vez consumiendo solo un color en vez de dos! + title: Doble Pintor + desc: Has desbloqueado una variante del pintor - ¡Funciona como un pintor regular pero procesa dos formas a la vez consumiendo solo un color en vez de dos! reward_painter_quad: - title: Cuadruple Pintado - desc: Has desbloqueado una variante del pintor - Permite pintar cada parte de una figura individualmente! + title: Cuádruple Pintor + desc: Has desbloqueado una variante del pintor - ¡Permite pintar cada parte de una figura individualmente! reward_storage: title: Almacenamiento Intermedio - desc: Has desbloqueado una variante de la basura - Permite almacenar elementos hasta una cierta capacidad! + desc: Has desbloqueado una variante de la basura - ¡Permite almacenar elementos hasta una cierta capacidad! reward_freeplay: title: Juego libre - desc: Lo has conseguido! Has desbloqueado el Juego Libre! Esto significa que las figuras son ahora generadas aleatoriamente! (No te preocupes, más contenido está planeado para el juego completo!) + desc: ¡Lo has conseguido! ¡Has desbloqueado el Juego Libre! ¡Esto significa que las figuras son ahora generadas aleatoriamente! (¡No te preocupes, más contenido está planeado para el juego completo!) reward_blueprints: title: Planos - desc: Ahora puedes copiar y pegar partes de tu fábrica! Selecciona un área (Mantén pulsado CTRL, después arrastra con el ratón), y pulsa 'C' para copiarlo.Pegarlo no es gratis, necesitas producir figuras de planos para poder permitírtelo! (Esas que acabas de entregar). + desc: ¡Ahora puedes copiar y pegar partes de tu fábrica! Selecciona un área (Mantén pulsado CTRL, después arrastra con el ratón), y pulsa 'C' para copiarlo.Pegarlo no es gratis, necesitas producir figuras de planos para poder permitírtelo (Esas que acabas de entregar). # Special reward, which is shown when there is no reward actually no_reward: title: Siguiente Nivel desc: >- - Este nivel no da recompensa, pero el siguiente si! PS: Mejor no destruyas la fábrica que tienes - Necesitarás todas esas figuras más adelante para desbloquear mejoras! + Este nivel no da recompensa, pero el siguiente si! PS: Mejor no destruyas la fábrica que tienes - ¡Necesitarás todas esas figuras más adelante para desbloquear mejoras! no_reward_freeplay: title: Siguiente Nivel desc: >- - Felicidades! Por cierto, más contenido está planeado para el juego completo! + ¡Felicidades! ¡Por cierto, más contenido está planeado para el juego completo! settings: title: Opciones @@ -581,7 +590,7 @@ settings: dev: Desarrollo staging: Staging prod: Producción - buildDate: Built + buildDate: Generado labels: uiScale: @@ -606,6 +615,17 @@ settings: fast: Rápido super_fast: Muy Rápido + movementSpeed: + title: Velocidad de movimiento + description: Cambia que tan rapido se mueve la camara al usar el teclado. + speeds: + super_slow: Super lento + slow: Lento + regular: Regular + fast: Rápido + super_fast: Super rápido + extremely_fast: Extremadamente rápido + language: title: Idioma description: >- @@ -630,13 +650,13 @@ settings: Elije el tema del juego (claro/oscuro). themes: - dark: Dark - light: Light + dark: Oscuro + light: Claro refreshRate: title: Objetivo de Simulación description: >- - Si tienes un monitor de 144hz, cambia la tasa de refresco asñi que el juego se ejecutará correctamente a una mayor tasa de refresco. Esto puede disminuir los FPS si tu ordenador no es lo suficientemente rápido. + Si tienes un monitor de 144hz, cambia la tasa de refresco asi el juego se ejecutará correctamente a una mayor tasa de refresco. Esto puede disminuir los FPS si tu ordenador no es lo suficientemente rápido. alwaysMultiplace: title: Colocar Múltiples @@ -648,22 +668,45 @@ settings: description: >- Activa si recibir pistas y tutoriales mientras juegas. También oculta algunos elementos de la interfaz hasta cierto nivel para hacer más fácil la introducción al juego. - movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. - speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + enableTunnelSmartplace: + title: Túneles Inteligentes + description: >- + Si está activado, colocar túneles automáticamente removerá las cintas transportadoras innecesarias. Esto también permite arrastrar con el ratón y los túneles excedentes serán removidos. + + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Atajos de Teclado hint: >- Pista: Asegúrate de usar CTRL, SHIFT y ALT! Habilitan distintas opciones de colocación. - resetKeybindings: Resetear Atajos de Teclado + resetKeybindings: Reestablecer Atajos de Teclado categoryLabels: general: Aplicación @@ -703,13 +746,13 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Cancelar Colocación rotateWhilePlacing: Rotar rotateInverseModifier: >- Modificador: Rotar inversamente en su lugar cycleBuildingVariants: Ciclar variantes confirmMassDelete: Confirmar Borrado Masivo cycleBuildings: Ciclar Edificios + lockBeltDirection: Colocar en línea recta massSelectStart: Mantén pulsado y arrastra para empezar massSelectSelectMultiple: Seleccionar múltiples áreas @@ -718,29 +761,32 @@ keybindings: placementDisableAutoOrientation: Desactivar orientación automática placeMultiple: Permanecer en modo de construcción placeInverse: Invierte automáticamente la orientación de las cintas transportadoras - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + pasteLastBlueprint: Pegar último plano + massSelectCut: Cortar área + exportScreenshot: Exportar toda la base como imagen + mapMoveFaster: Mover más rápido + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: Sobre el Juego body: >- - This game is open source and developed by Tobias Springer (this is me). + Este juego es de código abierto y ha sido desarrollado por Tobias Springer (Ese soy yo). - If you want to contribute, check out shapez.io on github. + Si quieres contribuir revisa shapez.io en github. - This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server! + Este juego no habria sido posible si no fuera por la gran comunidad de Discord + sobre mis juegos - ¡Deberías unirte al servidor de discord! - The soundtrack was made by Peppsen - He's awesome. + La banda sonora ha sido creada por Peppsen - El es genial. - Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Finalmente muchísimas gracias a mi amigo Niklas - Sin nuestras sesiones + de Factorio este juego nunca existiria. changelog: title: Registro de Cambios @@ -751,6 +797,6 @@ demo: importingGames: Importando partidas guardadas oneGameLimit: Limitado a una partida guardada customizeKeybindings: Personalizando Atajos de Teclado - exportingBase: Exporting whole Base as Image + exportingBase: Exportando base entera como captura de pantalla settingNotAvailable: No disponible en la versión de prueba. diff --git a/translations/base-fr.yaml b/translations/base-fr.yaml index 4074e565..e9e37720 100644 --- a/translations/base-fr.yaml +++ b/translations/base-fr.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io est un jeu qui consiste à construire des usines pour automatiser la création et la combinaison de formes de plus en plus complexes dans une carte infinie. + shortText: shapez.io est un jeu qui consiste à construire des usines pour automatiser la création et la combinaison de formes de plus en plus complexes sur une carte infinie. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # NOTICE: @@ -30,11 +30,11 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io est un jeu ayant pour objectif d'automatiser la création et la fusion de formes à l'aide d'une usine. Livrez les formes de plus en plus complexes requises pour progresser dans le jeu et débloquez des améliorations qui accéléreront votre chaîne de production. + shapez.io est un jeu ayant pour objectif d'automatiser la création et la fusion de formes à l'aide d'une usine. Livrez des formes de plus en plus complexes requises pour progresser dans le jeu et débloquez des améliorations qui accéléreront votre chaîne de production. La demande allant croissant, vous aurez à adapter l'échelle de votre usine afin de suivre la demande - Ne négligez pas les resources cependant, vous aurez à vous étendre sur une [b]carte infinie[/b] ! - Les formes seules pouvant devenir ennuyeuses à la longue vous aurez à mélanger des couleurs et les utiliser pour peindre vos formes - Combinez des pigments rouges, verts ou bleus pour produire différentes couleurs et enduisez-en vos formes afin de satisfaire les demandes. + Traiter seulement des formes pouvant devenir monotone à la longue, vous aurez aussi à mélanger des couleurs et à les utiliser pour peindre vos formes - Combinez des pigments rouges, verts ou bleus pour produire différentes couleurs et enduisez-en vos formes afin de satisfaire les demandes. Ce jeu propose 18 niveaux (qui devraient d'ores et déjà vous occuper pour de nombreuses heures !) mais j'ajoute régulièrement de nouveaux contenus - Beaucoup de nouveautés sont prévues ! @@ -61,7 +61,7 @@ steamPage: [*] Création configurable de carte (éditer le nombre et la taille des gisements de resources, édition de la graine générant la carte, et plus encore) [*] Davantage de types de formes [*] Performance améliorée (bien que le jeu tourne déjà de manière tout à fait décente !) - [*] Adaptation de l'affichage des couleurs à différente forme de daltonisme + [*] Adaptation de l'affichage des couleurs à différentes formes de daltonisme [*] Et bien plus encore ! [/list] @@ -115,14 +115,15 @@ demoBanners: # This is the "advertisement" shown in the main menu and other various places title: Version démo intro: >- - Achetez la version complète pour débloquer toutes les fonctionnalités! + Achetez la version complète pour débloquer toutes les fonctionnalités ! mainMenu: play: Jouer changelog: Historique importSavegame: Importer - openSourceHint: Ce jeu est open source! + openSourceHint: Ce jeu est open source ! discordLink: Serveur Discord officiel + helpTranslate: Contribuez à la traduction ! # This is shown when using firefox and other browsers which are not supported. browserWarning: >- @@ -134,26 +135,28 @@ mainMenu: contests: contest_01_03062020: title: "Concours #01" - desc: Gagnez $25 pour l'usine la plus cool! + desc: Gagnez $25 pour l'usine la plus cool ! longDesc: >- - Pour vous remercier, j'ai pensé qu'il serait bien de faire un concours hebdomadaire! + Pour vous remercier, j'ai pensé qu'il serait bien de faire un concours hebdomadaire ! - Le sujet de cette semaine: Construire l'usine la plus cool! + Le sujet de cette semaine: Construire l'usine la plus cool ! Voici comment faire: Envoyez une capture d'écran de votre usine à contest@shapez.io - Vous aurez des points bonus si vous la partagez sur les réseaux sociaux! + Vous aurez des points bonus si vous la partagez sur les réseaux sociaux ! Je choisirai 5 images et les soumettrai au vote à la communauté discord. Le gagnant empoche $25 (Paypal, carte cadeau Amazon, ce que vous préférez) Limite: 07.06.2020 AM 12:00 CEST - J'attends avec impatience de voir vos superbes créations! + J'attends avec impatience de voir vos superbes créations ! showInfo: Voir contestOver: Ce concours est terminé - Rejoignez le serveur discord pour être tenu au courant des prochains concours ! - helpTranslate: Help translate! + continue: Continuer + newGame: Nouvelle partie + madeBy: Créé par dialogs: buttons: @@ -187,7 +190,7 @@ dialogs: confirmSavegameDelete: title: Confirmez la suppression text: >- - Êtes-vous certains de vouloir supprimer votre partie? + Êtes-vous certains de vouloir supprimer votre partie ? savegameDeletionError: title: Impossible de supprimer @@ -209,31 +212,37 @@ dialogs: keybindingsResetOk: title: Réinitialisation des contrôles - desc: Les contrôles ont été réinitialisés par leur état par défaut respectifs! + desc: Les contrôles ont été réinitialisés par leur état par défaut respectifs ! featureRestriction: title: Version démo - desc: Vous avez essayé d'accéder à la fonction () qui n'est pas disponible dans la démo. Considérez l'achat de la version complète pour une expérience optimale! + desc: Vous avez essayé d'accéder à la fonction () qui n'est pas disponible dans la démo. Considérez l'achat de la version complète pour une expérience optimale ! oneSavegameLimit: title: Sauvegardes limitées - desc: Vous ne pouvez avoir qu'une seule sauvegarde en même temps dans la version démo. Merci de soit effacer l'actuelle ou de vous procurer la version complète! + desc: Vous ne pouvez avoir qu'une seule sauvegarde en même temps dans la version démo. Merci d'effacer celle en cours ou alternativement de vous procurer la version complète ! updateSummary: - title: Nouvel mise-à-jour! + title: Nouvel mise-à-jour ! desc: >- Voici les modifications depuis votre dernière session: upgradesIntroduction: title: Débloquer les améliorations desc: >- - Toutes les formes que vous produisez peuvent être utilisées pour débloquer des améliorations - Ne détruisez pas vos anciennes usines! + Toutes les formes que vous produisez peuvent être utilisées pour débloquer des améliorations - Ne détruisez pas vos anciennes usines ! L'onglet des améliorations se trouve dans le coin supérieur droit de l'écran. massDeleteConfirm: title: Confirmation de suppression desc: >- - Vous allez supprimer pas mal de bâtiments ( pour être exact)! Etes vous certains de vouloir faire ça ? + Vous allez supprimer pas mal de bâtiments ( pour être exact) ! Etes vous certains de vouloir faire cela ? + + massCutConfirm: + title: Confirmer la coupure + desc: >- + Vous vous apprêtez à couper beaucoup de bâtiments ( pour être précis) ! Êtes-vous + certains de vouloir faire cela ? blueprintsNotUnlocked: title: Pas encore débloqué @@ -244,52 +253,52 @@ dialogs: title: Raccourcis utiles desc: >- Le jeu a plein de raccourcis facilitant la construction de grandes usines. - En voici quelques uns, n'hésitez pas à aller découvrir les raccourcis! + En voici quelques uns, n'hésitez pas à aller découvrir les raccourcis ! CTRL + Glisser: Sélectionne une zone à copier / effacer. SHIFT: Laissez appuyé pour placer plusieurs fois le même bâtiment. ALT: Inverse l'orientation des convoyeurs placés. createMarker: title: Nouvelle balise - desc: Donnez-lui un nom approprié + desc: Donnez-lui un nom, vous pouvez aussi inclure le raccourci d'une forme (Que vous pouvez générer ici) markerDemoLimit: desc: Vous ne pouvez créer que deux balises dans la démo. Achetez la version complète pour en faire tant que vous voulez ! - massCutConfirm: - title: Confirm cut - desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? exportScreenshotWarning: - title: Export screenshot + title: Exporter une capture d'écran desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + Vous avez demandé à exporter votre base sous la forme d'une capture d'écran. Soyez conscient que cela peut s'avérer passablement lent pour une grande base, voire même planter votre jeu ! ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: moveMap: Déplacer - selectBuildings: Sélection de la zone + selectBuildings: Sélection d'une zone stopPlacement: Arrêter le placement rotateBuilding: Tourner le bâtiment placeMultiple: Placement multiple reverseOrientation: Changer l'orientation disableAutoOrientation: Désactiver l'orientation automatique - toggleHud: Basculer l'ATH + toggleHud: Basculer l'affichage tête haute (ATH) placeBuilding: Placer un bâtiment createMarker: Créer une balise delete: Supprimer - pasteLastBlueprint: Paste last blueprint + pasteLastBlueprint: Copier le dernier patron + lockBeltDirection: Utiliser le plannificateur de convoyeurs + plannerSwitchSide: Échanger la direction du plannificateur + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: # Buildings can have different variants which are unlocked at later levels, # and this is the hint shown when there are multiple variants available. - cycleBuildingVariants: Appuyez sur pour changer de variante. + cycleBuildingVariants: Appuyez sur pour alterner entre les variantes. # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- @@ -299,7 +308,7 @@ ingame: speed: Vitesse range: Portée storage: Espace de stockage - oneItemPerSecond: 1 forme / seconde + oneItemPerSecond: 1 forme / s itemsPerSecond: formes / s itemsPerSecondDouble: (x2) @@ -310,7 +319,7 @@ ingame: # is replaced by the actual level, so this gets 'Level 03' for example. levelTitle: Niveau completed: Terminé - unlockText: débloqué! + unlockText: débloqué ! buttonNextLevel: Niveau suivant # Notifications on the lower right @@ -318,11 +327,6 @@ ingame: newUpgrade: Une nouvelle amélioration est disponible ! gameSaved: Votre partie a été sauvegardée. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Améliorations @@ -333,7 +337,7 @@ ingame: # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMUM LEVEL (Speed x) + maximumLevel: NIVEAU MAXIMAL (Vitesse x) # The "Statistics" window statistics: @@ -397,19 +401,19 @@ ingame: shopUpgrades: belt: name: Convoyeurs, Distributeurs et Tunnels - description: Speed x → x + description: Vitesse x → x miner: name: Extraction - description: Speed x → x + description: Vitesse x → x processors: name: Découpage, Rotation et Empilage - description: Speed x → x + description: Vitesse x → x painting: name: Mélange et Peinture - description: Speed x → x + description: Vitesse x → x # Buildings and their name / description buildings: @@ -433,7 +437,7 @@ buildings: description: Permet de faire passer des ressources en dessous de bâtiment et de convoyeurs. tier2: - name: Tunnel Echelon II + name: Tunnel Niveau II description: Permet de faire passer des ressources en dessous de bâtiment et de convoyeurs. splitter: # Internal name for the Balancer @@ -455,7 +459,7 @@ buildings: description: Coupe une forme de haut en bas et sort les deux parties. Si vous n'utilisez qu'une seule partie, assurez-vous de détruite l'autre ou sinon, gare au blocage ! quad: name: Découpeur (Quatre) - description: Coupe une forme en 4 parties. Si vous n'utilisez pas toutes les parties, assurez-vous de détruite les autres ou sinon, gare au blocage ! + description: Coupe une forme en quatre parties. Si vous n'utilisez pas toutes les parties, assurez-vous de détruite les autres ou sinon, gare au blocage ! rotater: default: @@ -478,13 +482,16 @@ buildings: painter: default: name: &painter Peintre - description: Colorie entièrement la forme de gauche avec la couleur de droite. + description: &painter_desc Colorie entièrement la forme de gauche avec la couleur de droite. double: name: Peintre (Double) description: Colorie les deux formes de gauche avec la couleur de droite. quad: - name: Peintre (Quatre) + name: Peintre (Quadruple) description: Permet de colorier chaque quadrant d'une forme avec une couleur différente. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -495,15 +502,15 @@ buildings: name: Stockage description: Stocke les formes en trop jusqu'à une certaine capacité. Peut être utilisé comme tampon. hub: - deliver: Deliver - toUnlock: to unlock - levelShortcut: LVL + deliver: Délivrez + toUnlock: pour débloquer + levelShortcut: NV storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: title: Découper des formes - desc: Vous venez de débloquer le découpeur - il coupe des formes en deux de haut en bas quel que soit son orientation!Assurez-vous de vous débarasser des déchets, sinon gare au blocage - À cet effet, je mets à votre disposition la poubelle, qui détruit tout ce que vous y mettez ! + desc: Vous venez de débloquer le découpeur - il coupe des formes en deux de haut en bas quel que soit son orientation !Assurez-vous de vous débarasser des déchets, sinon gare au blocage - À cet effet, je mets à votre disposition la poubelle, qui détruit tout ce que vous y mettez ! reward_rotater: title: Rotation @@ -522,11 +529,9 @@ storyRewards: title: Combineur desc: Vous pouvez maintenant combiner deux formes avec le combineur ! Les deux entrées sont combinée et si elles ne peuvent êtres mises l'une à côté de l'autre, elles sont fusionnées. Sinon, la forme de droite est placée au dessus de la forme de gauche après avoir été légèrement réduite. - # Suggestion from the translator: "après avoir été légèrement réduite" = "after having been slightly scaled down": I think this part of the explanation is missing in the original text, and I struggled a lot at the beginning to understand this important fact of mixing shapes. - reward_splitter: title: Distributeur/Rassembleur - desc: Le répartiteur multifonctionnel a été débloqué - Il peut être utilisé pour construire de plus grandes usines en distribuant équitablement et rassemblant les formes entre plusieurs convoyeurs! + desc: Le répartiteur multifonctionnel a été débloqué - Il peut être utilisé pour construire de plus grandes usines en distribuant équitablement et rassemblant les formes entre plusieurs convoyeurs ! reward_tunnel: title: Tunnel @@ -579,9 +584,7 @@ storyRewards: no_reward: title: Niveau suivant desc: >- - Ce niveau n'a pas de récompense mais le prochain, oui ! PS: Vous ne devriez pas détruires votre usine actuelle - Vous aurez besoin de toutes ces formes plus tard pour débloquer des améliorations - - # Question from the translator: Is the "desc: >-" syntaxically correct ? + Ce niveau n'a pas de récompense mais le prochain, oui ! PS: Vous ne devriez pas détruire votre usine actuelle - Vous aurez besoin de toutes ces formes plus tard pour débloquer des améliorations no_reward_freeplay: title: Niveau suivant @@ -595,7 +598,7 @@ settings: app: Application versionBadges: - dev: Developpement + dev: Développement staging: Test prod: Production buildDate: Créé le @@ -644,13 +647,13 @@ settings: Choisissez votre thème (clair / sombre). themes: - dark: Dark - light: Light + dark: Sombre + light: Clair refreshRate: title: Fréquence de simulation description: >- - Si vous avez un moniteur à 144hz, changez le taux de rafraichissement pour que le jeu fonctionne correctement à cette haute fréquence. Ceci pourrait cependant diminuer vos IPS (itérations par seconde) si votre ordinateur est trop lent. + Si vous avez un moniteur à fréquence élevée, changez le taux de rafraichissement pour que le jeu fonctionne correctement à cette haute fréquence. Ceci pourrait cependant diminuer vos IPS (itérations par seconde) si votre ordinateur est trop lent. alwaysMultiplace: title: Placement multiple @@ -663,21 +666,52 @@ settings: Affiche ou non le bouton 'Afficher un indice' dans le coin inférieur gauche. language: - title: Language + title: Langage description: >- - Change the language. All translations are user contributed and might be - incomplete! + Change le langage. Toutes les traductions sont des contributions des utilisateurs et pourraient être partiellement incomplètes ! movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Vitesse de déplacement + description: Change la vitesse à laquelle l'écran se déplace lors de l'utilisation du clavier. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Super lent + slow: Lent + regular: Normal + fast: Rapide + super_fast: Très rapide + extremely_fast: Extrêmement rapide + enableTunnelSmartplace: + title: Tunnels intelligents + description: >- + Si cette option est sélectionnée, placer des tunnels effacera automatiquement les convoyeurs inutiles. + Cela permet aussi d'étirer les tunnels et les tunnels en surnombre seront effacés. + vignette: + title: Effet de vignette + description: >- + Permet l'affichage de l'effet de vignette qui assombrit les coins de l'écran afin de rendre le texte plus facile à lire. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Contrôles @@ -711,8 +745,8 @@ keybindings: menuOpenShop: Améliorations menuOpenStats: Statistiques - toggleHud: Basculer l'ATH (affichage tête haute) - toggleFPSInfo: Basculer IPS (itérations par seconde) et informations de débogage + toggleHud: Basculer l'affichage tête haute (ATH) + toggleFPSInfo: Basculer l'affichage des IPS (itérations par seconde) et des informations de débogage belt: *belt splitter: *splitter underground_belt: *underground_belt @@ -724,44 +758,46 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Annuler le placement rotateWhilePlacing: Pivoter rotateInverseModifier: >- Variante: Pivote à gauche - cycleBuildingVariants: Faire défiler les variantes - confirmMassDelete: Confirmer la suppression de zone - cycleBuildings: Faire défiler les bâtiments + cycleBuildingVariants: Alterner entre les variantes + confirmMassDelete: Confirmer la suppression de la sélection + cycleBuildings: Alterner entre les bâtiments massSelectStart: Cliquez et maintenez pour commencer massSelectSelectMultiple: Sélectionner plusieurs zones - massSelectCopy: Copier la zone + massSelectCopy: Copier la sélection placementDisableAutoOrientation: Désactiver l'orientation automatique placeMultiple: Rester en mode placement placeInverse: Inverser le mode d'orientation automatique - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + pasteLastBlueprint: Copier le dernier patron + massSelectCut: Couper la sélection + exportScreenshot: Exporter toute la base en tant qu'image. + mapMoveFaster: Se déplacer plus vite + lockBeltDirection: Utiliser le plannificateur de convoyeurs + switchDirectionLockSide: "Plannificateur: changer de côté" + pipette: Pipette about: title: À propos de ce jeu body: >- - This game is open source and developed by Tobias Springer (this is me). + Ce jeu est open source et développé par Tobias Springer (c'est moi). - If you want to contribute, check out shapez.io on github. + Si vous souhaitez contribuer, allez voir shapez.io sur github. - This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server! + Ce jeu n'aurait pu être réalisé sans la précieuse communauté discord autour de + mes jeux - Vous devriez vraiment envisager de joindre le serveur discord ! - The soundtrack was made by Peppsen - He's awesome. + La bande son a été créée par Peppsen - Il est impressionnant ! - Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Pour terminer, un immense merci à mon meilleur amis Niklas - Sans nos sessions sur factorio, ce jeu n'aurait jamais existé. changelog: title: Historique @@ -772,11 +808,11 @@ demo: importingGames: Importer des sauvegardes oneGameLimit: Limité à une sauvegarde customizeKeybindings: Personnalisation des contrôles - exportingBase: Exporting whole Base as Image + exportingBase: Exporter toute la base en tant qu'image settingNotAvailable: Indisponible dans la démo. # # French translation version v0.5 based on english v1.1.8 by Didier WEERTS 'The Corsaire' # -# French translation completed (and corrected) by Pascal Grossé. +# French translation completed (and corrected) by Pascal Grossé and Withers001 diff --git a/translations/base-hr.yaml b/translations/base-hr.yaml new file mode 100644 index 00000000..2e510a82 --- /dev/null +++ b/translations/base-hr.yaml @@ -0,0 +1,805 @@ +# +# GAME TRANSLATIONS +# +# Contributing: +# +# If you want to contribute, please make a pull request on this respository +# and I will have a look. +# +# Placeholders: +# +# Do *not* replace placeholders! Placeholders have a special syntax like +# `Hotkey: `. They are encapsulated within angle brackets. The correct +# translation for this one in German for example would be: `Taste: ` (notice +# how the placeholder stayed '' and was not replaced!) +# +# Adding a new language: +# +# If you want to add a new language, ask me in the discord and I will setup +# the basic structure so the game also detects it. +# + +steamPage: + # This is the short text appearing on the steam page + shortText: shapez.io is a game about building factories to automate the creation and combination of increasingly complex shapes within an infinite map. + + # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. + # NOTICE: + # - Do not translate the first line (This is the gif image at the start of the store) + # - Please keep the markup (Stuff like [b], [list] etc) in the same format + longText: >- + [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] + + shapez.io is a game about building factories to automate the creation and combination of shapes. Deliver the requested, increasingly complex shapes to progress within the game and unlock upgrades to speed up your factory. + + Since the demand raises you will have to scale up your factory to fit the needs - Don't forget about resources though, you will have to expand in the [b]infinite map[/b]! + + Since shapes can get boring soon you need to mix colors and paint your shapes with it - Combine red, green and blue color resources to produce different colors and paint shapes with it to satisfy the demand. + + This game features 18 levels (Which should keep you busy for hours already!) but I'm constantly adding new content - There is a lot planned! + + + [b]Standalone Advantages[/b] + + [list] + [*] Waypoints + [*] Unlimited Savegames + [*] Dark Mode + [*] More settings + [*] Allow me to further develop shapez.io ❤️ + [*] More features in the future! + [/list] + + [b]Planned features & Community suggestions[/b] + + This game is open source - Anybody can contribute! Besides of that, I listen [b]a lot[/b] to the community! I try to read all suggestions and take as much feedback into account as possible. + + [list] + [*] Story mode where buildings cost shapes + [*] More levels & buildings (standalone exclusive) + [*] Different maps, and maybe map obstacles + [*] Configurable map creation (Edit number and size of patches, seed, and more) + [*] More types of shapes + [*] More performance improvements (Although the game already runs pretty good!) + [*] Color blind mode + [*] And much more! + [/list] + + Be sure to check out my trello board for the full roadmap! https://trello.com/b/ISQncpJP/shapezio + +global: + loading: Loading + error: Error + + # How big numbers are rendered, e.g. "10,000" + thousandsDivider: "," + + # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. + suffix: + thousands: k + millions: M + billions: B + trillions: T + + # Shown for infinitely big numbers + infinite: inf + + time: + # Used for formatting past time dates + oneSecondAgo: one second ago + xSecondsAgo: seconds ago + oneMinuteAgo: one minute ago + xMinutesAgo: minutes ago + oneHourAgo: one hour ago + xHoursAgo: hours ago + oneDayAgo: one day ago + xDaysAgo: days ago + + # Short formats for times, e.g. '5h 23m' + secondsShort: s + minutesAndSecondsShort: m s + hoursAndMinutesShort: h m + + xMinutes: minutes + + keys: + tab: TAB + control: CTRL + alt: ALT + escape: ESC + shift: SHIFT + space: SPACE + +demoBanners: + # This is the "advertisement" shown in the main menu and other various places + title: Demo Version + intro: >- + Get the standalone to unlock all features! + +mainMenu: + play: Play + continue: Continue + newGame: New Game + changelog: Changelog + importSavegame: Import + openSourceHint: This game is open source! + discordLink: Official Discord Server + helpTranslate: Help translate! + madeBy: Made by + + # This is shown when using firefox and other browsers which are not supported. + browserWarning: >- + Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience. + + savegameLevel: Level + savegameLevelUnknown: Unknown Level + + contests: + contest_01_03062020: + title: "Contest #01" + desc: Win $25 for the coolest base! + longDesc: >- + To give something back to you, I thought it would be cool to make weekly contests! + + This weeks topic: Build the coolest base! + + Here's the deal: + + Submit a screenshot of your base to contest@shapez.io + Bonus points if you share it on social media! + I will choose 5 screenshots and propose it to the discord community to vote. + The winner gets $25 (Paypal, Amazon Gift Card, whatever you prefer) + Deadline: 07.06.2020 12:00 AM CEST + + + I'm looking forward to seeing your awesome creations! + + showInfo: View + contestOver: This contest has ended - Join the discord to get noticed about new contests! + +dialogs: + buttons: + ok: OK + delete: Delete + cancel: Cancel + later: Later + restart: Restart + reset: Reset + getStandalone: Get Standalone + deleteGame: I know what I do + viewUpdate: View Update + showUpgrades: Show Upgrades + showKeybindings: Show Keybindings + + importSavegameError: + title: Import Error + text: >- + Failed to import your savegame: + + importSavegameSuccess: + title: Savegame Imported + text: >- + Your savegame has been successfully imported. + + gameLoadFailure: + title: Game is broken + text: >- + Failed to load your savegame: + + confirmSavegameDelete: + title: Confirm deletion + text: >- + Are you sure you want to delete the game? + + savegameDeletionError: + title: Failed to delete + text: >- + Failed to delete the savegame: + + restartRequired: + title: Restart required + text: >- + You need to restart the game to apply the settings. + + editKeybinding: + title: Change Keybinding + desc: Press the key or mouse button you want to assign, or escape to cancel. + + resetKeybindingsConfirmation: + title: Reset keybindings + desc: This will reset all keybindings to their default values. Please confirm. + + keybindingsResetOk: + title: Keybindings reset + desc: The keybindings have been reset to their respective defaults! + + featureRestriction: + title: Demo Version + desc: You tried to access a feature () which is not available in the demo. Consider to get the standalone for the full experience! + + oneSavegameLimit: + title: Limited savegames + desc: You can only have one savegame at a time in the demo version. Please remove the existing one or get the standalone! + + updateSummary: + title: New update! + desc: >- + Here are the changes since you last played: + + upgradesIntroduction: + title: Unlock Upgrades + desc: >- + All shapes you produce can be used to unlock upgrades - Don't destroy your old factories! + The upgrades tab can be found on the top right corner of the screen. + + massDeleteConfirm: + title: Confirm delete + desc: >- + You are deleting a lot of buildings ( to be exact)! Are you sure you want to do this? + + massCutConfirm: + title: Confirm cut + desc: >- + You are cutting a lot of buildings ( to be exact)! Are you sure you want to do this? + + blueprintsNotUnlocked: + title: Not unlocked yet + desc: >- + Complete level 12 to unlock Blueprints! + + keybindingsIntroduction: + title: Useful keybindings + desc: >- + This game has a lot of keybindings which make it easier to build big factories. + Here are a few, but be sure to check out the keybindings! + CTRL + Drag: Select an area. + SHIFT: Hold to place multiple of one building. + ALT: Invert orientation of placed belts. + + createMarker: + title: New Marker + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) + + markerDemoLimit: + desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! + + exportScreenshotWarning: + title: Export screenshot + desc: You requested to export your base as a screenshot. Please note that this can be quite slow for a big base and even crash your game! + +ingame: + # This is shown in the top left corner and displays useful keybindings in + # every situation + keybindingsOverlay: + moveMap: Move + selectBuildings: Select area + stopPlacement: Stop placement + rotateBuilding: Rotate building + placeMultiple: Place multiple + reverseOrientation: Reverse orientation + disableAutoOrientation: Disable auto orientation + toggleHud: Toggle HUD + placeBuilding: Place building + createMarker: Create Marker + delete: Destroy + pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette + + # Everything related to placing buildings (I.e. as soon as you selected a building + # from the toolbar) + buildingPlacement: + # Buildings can have different variants which are unlocked at later levels, + # and this is the hint shown when there are multiple variants available. + cycleBuildingVariants: Press to cycle variants. + + # Shows the hotkey in the ui, e.g. "Hotkey: Q" + hotkeyLabel: >- + Hotkey: + + infoTexts: + speed: Speed + range: Range + storage: Storage + oneItemPerSecond: 1 item / second + itemsPerSecond: items / s + itemsPerSecondDouble: (x2) + + tiles: tiles + + # The notification when completing a level + levelCompleteNotification: + # is replaced by the actual level, so this gets 'Level 03' for example. + levelTitle: Level + completed: Completed + unlockText: Unlocked ! + buttonNextLevel: Next Level + + # Notifications on the lower right + notifications: + newUpgrade: A new upgrade is available! + gameSaved: Your game has been saved. + + # The "Upgrades" window + shop: + title: Upgrades + buttonUnlock: Upgrade + + # Gets replaced to e.g. "Tier IX" + tier: Tier + + # The roman number for each tier + tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] + + maximumLevel: MAXIMUM LEVEL (Speed x) + + # The "Statistics" window + statistics: + title: Statistics + dataSources: + stored: + title: Stored + description: Displaying amount of stored shapes in your central building. + produced: + title: Produced + description: Displaying all shapes your whole factory produces, including intermediate products. + delivered: + title: Delivered + description: Displaying shapes which are delivered to your central building. + noShapesProduced: No shapes have been produced so far. + + # Displays the shapes per minute, e.g. '523 / m' + shapesPerMinute: / m + + # Settings menu, when you press "ESC" + settingsMenu: + playtime: Playtime + + buildingsPlaced: Buildings + beltsPlaced: Belts + + buttons: + continue: Continue + settings: Settings + menu: Return to menu + + # Bottom left tutorial hints + tutorialHints: + title: Need help? + showHint: Show hint + hideHint: Close + + # When placing a blueprint + blueprintPlacer: + cost: Cost + + # Map markers + waypoints: + waypoints: Markers + hub: HUB + description: Left-click a marker to jump to it, right-click to delete it.Press to create a marker from the current view, or right-click to create a marker at the selected location. + creationSuccessNotification: Marker has been created. + + # Interactive tutorial + interactiveTutorial: + title: Tutorial + hints: + 1_1_extractor: Place an extractor on top of a circle shape to extract it! + 1_2_conveyor: >- + Connect the extractor with a conveyor belt to your hub!Tip: Click and drag the belt with your mouse! + + 1_3_expand: >- + This is NOT an idle game! Build more extractors and belts to finish the goal quicker.Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + +# All shop upgrades +shopUpgrades: + belt: + name: Belts, Distributor & Tunnels + description: Speed x → x + miner: + name: Extraction + description: Speed x → x + processors: + name: Cutting, Rotating & Stacking + description: Speed x → x + painting: + name: Mixing & Painting + description: Speed x → x + +# Buildings and their name / description +buildings: + hub: + deliver: Deliver + toUnlock: to unlock + levelShortcut: LVL + + belt: + default: + name: &belt Conveyor Belt + description: Transports items, hold and drag to place multiple. + + miner: # Internal name for the Extractor + default: + name: &miner Extractor + description: Place over a shape or color to extract it. + + chainable: + name: Extractor (Chain) + description: Place over a shape or color to extract it. Can be chained. + + underground_belt: # Internal name for the Tunnel + default: + name: &underground_belt Tunnel + description: Allows to tunnel resources under buildings and belts. + + tier2: + name: Tunnel Tier II + description: Allows to tunnel resources under buildings and belts. + + splitter: # Internal name for the Balancer + default: + name: &splitter Balancer + description: Multifunctional - Evenly distributes all inputs onto all outputs. + + compact: + name: Merger (compact) + description: Merges two conveyor belts into one. + + compact-inverse: + name: Merger (compact) + description: Merges two conveyor belts into one. + + cutter: + default: + name: &cutter Cutter + description: Cuts shapes from top to bottom and outputs both halfs. If you use only one part, be sure to destroy the other part or it will stall! + quad: + name: Cutter (Quad) + description: Cuts shapes into four parts. If you use only one part, be sure to destroy the other parts or it will stall! + + rotater: + default: + name: &rotater Rotate + description: Rotates shapes clockwise by 90 degrees. + ccw: + name: Rotate (CCW) + description: Rotates shapes counter clockwise by 90 degrees. + + stacker: + default: + name: &stacker Stacker + description: Stacks both items. If they can not be merged, the right item is placed above the left item. + + mixer: + default: + name: &mixer Color Mixer + description: Mixes two colors using additive blending. + + painter: + default: + name: &painter Painter + description: &painter_desc Colors the whole shape on the left input with the color from the top input. + + mirrored: + name: *painter + description: *painter_desc + + double: + name: Painter (Double) + description: Colors the shapes on the left inputs with the color from the top input. + quad: + name: Painter (Quad) + description: Allows to color each quadrant of the shape with a different color. + + trash: + default: + name: &trash Trash + description: Accepts inputs from all sides and destroys them. Forever. + + storage: + name: Storage + description: Stores excess items, up to a given capacity. Can be used as an overflow gate. + +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 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 gave you a trash, which destroys everything you put into it! + + reward_rotater: + title: Rotating + desc: The rotater has been unlocked! It rotates shapes clockwise by 90 degrees. + + reward_painter: + title: Painting + desc: >- + The painter has been unlocked - Extract some color veins (just as you do with shapes) and combine it with a shape in the painter to color them!PS: If you are colorblind, I'm working on a solution already! + + reward_mixer: + title: Color Mixing + desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + + reward_stacker: + title: Combiner + desc: You can now combine shapes with the combiner! Both inputs are combined, and if they can be put next to each other, they will be fused. If not, the right input is stacked on top of the left input! + + reward_splitter: + title: Splitter/Merger + desc: The multifunctional balancer has been unlocked - It can be used to build bigger factories by splitting and merging items onto multiple belts! + + reward_tunnel: + title: Tunnel + desc: The tunnel has been unlocked - You can now tunnel items through belts and buildings with it! + + reward_rotater_ccw: + title: CCW Rotating + desc: You have unlocked a variant of the rotater - It allows to rotate counter clockwise! To build it, select the rotater and press 'T' to cycle its variants! + + reward_miner_chainable: + title: Chaining Extractor + desc: You have unlocked the chaining extractor! It can forward its resources to other extractors so you can more efficiently extract resources! + + reward_underground_belt_tier_2: + title: Tunnel Tier II + desc: You have unlocked a new variant of the tunnel - It has a bigger range, and you can also mix-n-match those tunnels now! + + reward_splitter_compact: + title: Compact Balancer + desc: >- + You have unlocked a compact variant of the balancer - It accepts two inputs and merges them into one! + + reward_cutter_quad: + title: Quad Cutting + desc: You have unlocked a variant of the cutter - It allows you to cut shapes in four parts instead of just two! + + 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! + + reward_painter_quad: + title: Quad Painting + desc: You have unlocked a variant of the painter - It allows to paint each part of the shape individually! + + reward_storage: + title: Storage Buffer + desc: You have unlocked a variant of the trash - It allows to store items up to a given capacity! + + reward_freeplay: + title: Freeplay + desc: You did it! You unlocked the free-play mode! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!) + + reward_blueprints: + title: Blueprints + desc: You can now copy and paste parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.Pasting it is not free, you need to produce blueprint shapes to afford it! (Those you just delivered). + + # Special reward, which is shown when there is no reward actually + no_reward: + title: Next level + desc: >- + This level gave you no reward, but the next one will! PS: Better don't destroy your existing factory - You need all those shapes later again to unlock upgrades! + + no_reward_freeplay: + title: Next level + desc: >- + Congratulations! By the way, more content is planned for the standalone! + +settings: + title: Settings + categories: + game: Game + app: Application + + versionBadges: + dev: Development + staging: Staging + prod: Production + buildDate: Built + + labels: + uiScale: + title: Interface scale + description: >- + Changes the size of the user interface. The interface will still scale based on your device resolution, but this setting controls the amount of scale. + scales: + super_small: Super small + small: Small + regular: Regular + large: Large + huge: Huge + + scrollWheelSensitivity: + title: Zoom sensitivity + description: >- + Changes how sensitive the zoom is (Either mouse wheel or trackpad). + sensitivity: + super_slow: Super slow + slow: Slow + regular: Regular + fast: Fast + super_fast: Super fast + + movementSpeed: + title: Movement speed + description: >- + Changes how fast the view moves when using the keyboard. + speeds: + super_slow: Super slow + slow: Slow + regular: Regular + fast: Fast + super_fast: Super Fast + extremely_fast: Extremely Fast + + language: + title: Language + description: >- + Change the language. All translations are user contributed and might be incomplete! + + fullscreen: + title: Fullscreen + description: >- + It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone. + + soundsMuted: + title: Mute Sounds + description: >- + If enabled, mutes all sound effects. + + musicMuted: + title: Mute Music + description: >- + If enabled, mutes all music. + + theme: + title: Game theme + description: >- + Choose the game theme (light / dark). + themes: + dark: Dark + light: Light + + refreshRate: + title: Simulation Target + description: >- + If you have a 144hz monitor, change the refresh rate here so the game will properly simulate at higher refresh rates. This might actually decrease the FPS if your computer is too slow. + + alwaysMultiplace: + title: Multiplace + description: >- + If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. + + offerHints: + title: Hints & Tutorials + description: >- + Whether to offer hints and tutorials while playing. Also hides certain UI elements onto a given level to make it easier to get into the game. + + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. This also enables to drag tunnels and excess tunnels will get removed. + + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. + +keybindings: + title: Keybindings + hint: >- + Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options. + + resetKeybindings: Reset Keybindings + + categoryLabels: + general: Application + ingame: Game + navigation: Navigating + placement: Placement + massSelect: Mass Select + buildings: Building Shortcuts + placementModifiers: Placement Modifiers + + mappings: + confirm: Confirm + back: Back + mapMoveUp: Move Up + mapMoveRight: Move Right + mapMoveDown: Move Down + mapMoveLeft: Move Left + mapMoveFaster: Move Faster + centerMap: Center Map + + mapZoomIn: Zoom in + mapZoomOut: Zoom out + createMarker: Create Marker + + menuOpenShop: Upgrades + menuOpenStats: Statistics + + toggleHud: Toggle HUD + toggleFPSInfo: Toggle FPS and Debug Info + exportScreenshot: Export whole Base as Image + belt: *belt + splitter: *splitter + underground_belt: *underground_belt + miner: *miner + cutter: *cutter + rotater: *rotater + stacker: *stacker + mixer: *mixer + painter: *painter + trash: *trash + + rotateWhilePlacing: Rotate + rotateInverseModifier: >- + Modifier: Rotate CCW instead + cycleBuildingVariants: Cycle Variants + confirmMassDelete: Confirm Mass Delete + pasteLastBlueprint: Paste last blueprint + cycleBuildings: Cycle Buildings + lockBeltDirection: Enable belt planner + switchDirectionLockSide: >- + Planner: Switch side + + massSelectStart: Hold and drag to start + massSelectSelectMultiple: Select multiple areas + massSelectCopy: Copy area + massSelectCut: Cut area + + placementDisableAutoOrientation: Disable automatic orientation + placeMultiple: Stay in placement mode + placeInverse: Invert automatic belt orientation + pipette: Pipette + +about: + title: About this Game + body: >- + This game is open source and developed by Tobias Springer (this is me). + + If you want to contribute, check out shapez.io on github. + + This game wouldn't have been possible without the great discord community around my games - You should really join the discord server! + + The soundtrack was made by Peppsen - He's awesome. + + Finally, huge thanks to my best friend Niklas - Without our factorio sessions this game would never have existed. + +changelog: + title: Changelog + +demo: + features: + restoringGames: Restoring savegames + importingGames: Importing savegames + oneGameLimit: Limited to one savegame + customizeKeybindings: Customizing Keybindings + exportingBase: Exporting whole Base as Image + + settingNotAvailable: Not available in the demo. diff --git a/translations/base-hu.yaml b/translations/base-hu.yaml index 5395506c..f2cd8013 100644 --- a/translations/base-hu.yaml +++ b/translations/base-hu.yaml @@ -153,6 +153,9 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -250,7 +253,7 @@ dialogs: createMarker: title: New Marker - desc: Adj neki egy értelmes nevet + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! @@ -282,6 +285,12 @@ ingame: createMarker: Create Marker delete: Destroy pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -317,11 +326,6 @@ ingame: newUpgrade: Egy új fejlesztés elérhető! gameSaved: A játékod el lett mentve. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Fejlesztések @@ -475,13 +479,16 @@ buildings: painter: default: name: &painter Painter - description: Colors the whole shape on the left input with the color from the right input. + description: &painter_desc Colors the whole shape on the left input with the color from the right input. double: name: Painter (Double) description: Colors the shapes on the left inputs with the color from the top input. quad: name: Painter (Quad) description: Allows to color each quadrant of the shape with a different color. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -668,6 +675,39 @@ settings: fast: Fast super_fast: Super Fast extremely_fast: Extremely Fast + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. + This also enables to drag tunnels and excess tunnels will get removed. + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Keybindings @@ -714,7 +754,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement rotateWhilePlacing: Rotate rotateInverseModifier: >- Modifier: Rotate CCW instead @@ -732,6 +771,10 @@ keybindings: pasteLastBlueprint: Paste last blueprint massSelectCut: Cut area exportScreenshot: Export whole Base as Image + mapMoveFaster: Move Faster + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: A játékról diff --git a/translations/base-it.yaml b/translations/base-it.yaml index 3eb04db4..8f3573e2 100644 --- a/translations/base-it.yaml +++ b/translations/base-it.yaml @@ -153,6 +153,9 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -250,7 +253,7 @@ dialogs: createMarker: title: New Marker - desc: Give it a meaningful name + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! @@ -282,6 +285,12 @@ ingame: createMarker: Create Marker delete: Destroy pasteLastBlueprint: Paste last blueprint + lockBeltDirection: Enable belt planner + plannerSwitchSide: Flip planner side + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -317,11 +326,6 @@ ingame: newUpgrade: A new upgrade is available! gameSaved: Your game has been saved. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. - # The "Upgrades" window shop: title: Upgrades @@ -475,13 +479,16 @@ buildings: painter: default: name: &painter Painter - description: Colors the whole shape on the left input with the color from the right input. + description: &painter_desc Colors the whole shape on the left input with the color from the right input. double: name: Painter (Double) description: Colors the shapes on the left inputs with the color from the top input. quad: name: Painter (Quad) description: Allows to color each quadrant of the shape with a different color. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -669,6 +676,39 @@ settings: fast: Fast super_fast: Super Fast extremely_fast: Extremely Fast + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + When enabled, placing tunnels will automatically remove unnecessary belts. + This also enables to drag tunnels and excess tunnels will get removed. + vignette: + title: Vignette + description: >- + Enables the vignette which darkens the screen corners and makes text easier + to read. + + autosaveInterval: + title: Autosave Interval + description: >- + Controls how often the game saves automatically. You can also disable it + entirely here. + intervals: + one_minute: 1 Minute + two_minutes: 2 Minutes + five_minutes: 5 Minutes + ten_minutes: 10 Minutes + twenty_minutes: 20 Minutes + disabled: Disabled + compactBuildingInfo: + title: Compact Building Infos + description: >- + Shortens info boxes for buildings by only showing their ratios. Otherwise a + description and image is shown. + disableCutDeleteWarnings: + title: Disable Cut/Delete Warnings + description: >- + Disable the warning dialogs brought up when cutting/deleting more than 100 + entities. keybindings: title: Keybindings @@ -715,7 +755,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement rotateWhilePlacing: Rotate rotateInverseModifier: >- Modifier: Rotate CCW instead @@ -733,6 +772,10 @@ keybindings: pasteLastBlueprint: Paste last blueprint massSelectCut: Cut area exportScreenshot: Export whole Base as Image + mapMoveFaster: Move Faster + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: About this Game diff --git a/translations/base-ja.yaml b/translations/base-ja.yaml index dfd97ed3..0e685752 100644 --- a/translations/base-ja.yaml +++ b/translations/base-ja.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io is a game about building factories to automate the creation and combination of increasingly complex shapes within an infinite map. + shortText: shapez.ioは無限のマップ内で様々な"形"を資源とし、段々と複雑になっていく形の作成や合成の自動化を目指して工場を構築するゲームです。 # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # NOTICE: @@ -30,46 +30,46 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io is a game about building factories to automate the creation and combination of shapes. Deliver the requested, increasingly complex shapes to progress within the game and unlock upgrades to speed up your factory. + shapez.ioは形の作成と合成を自動化するために工場を構築するゲームです。段々と複雑になる要件を納品していくことでゲームをすすめ、工場を高速化するためのアップグレードを解除していきます。 - Since the demand raises you will have to scale up your factory to fit the needs - Don't forget about resources though, you will have to expand in the [b]infinite map[/b]! + 要件が増えてくると、ニーズに合わせて工場をスケールアップしていく必要があるでしょう。もちろん、[b]無限のマップ[/b]に展開する資源採取の拡張もお忘れなく! - Since shapes can get boring soon you need to mix colors and paint your shapes with it - Combine red, green and blue color resources to produce different colors and paint shapes with it to satisfy the demand. + 形状だけではすぐに飽きがきますが、色素を混ぜて形を塗る工程もあります。赤、緑、青の色素の資源を組み合わせて、要件を満たす色と形状を作り出しましょう。 - This game features 18 levels (Which should keep you busy for hours already!) but I'm constantly adding new content - There is a lot planned! + このゲームは現在18レベルまでが実装されていますが(これだけでもかなりのボリュームです)、今後も継続的に新しい要素が追加で実装されていく予定です。 - すでに沢山計画されています! - [b]Standalone Advantages[/b] + [b]Web版にはないスタンドアローン版のメリット[/b] [list] - [*] Waypoints - [*] Unlimited Savegames - [*] Dark Mode - [*] More settings - [*] Allow me to further develop shapez.io ❤️ - [*] More features in the future! + [*] マップのマーク設置とマークへの移動 + [*] 無制限のセーブデータ + [*] ダークモード + [*] 多彩な設定 + [*] shapez.ioのさらなる開発ができます ❤️ + [*] 将来の追加内容実装 [/list] - [b]Planned features & Community suggestions[/b] + [b]今後の実装予定とコミュニティの提案[/b] - This game is open source - Anybody can contribute! Besides of that, I listen [b]a lot[/b] to the community! I try to read all suggestions and take as much feedback into account as possible. + このゲームはオープンソースです。誰でも開発に参加できます! それ以外にも、私はコミュニティの意見を[b]とても[/b]よく聞いており、なるべくすべての提案を読み、できるだけ多くのフィードバックを考慮に入れるようにしています。 [list] - [*] Story mode where buildings cost shapes - [*] More levels & buildings (standalone exclusive) - [*] Different maps, and maybe map obstacles - [*] Configurable map creation (Edit number and size of patches, seed, and more) - [*] More types of shapes - [*] More performance improvements (Although the game already runs pretty good!) - [*] Color blind mode - [*] And much more! + [*] 建造物にコストがかかるストーリーモード + [*] 追加のレベル、及び建造物(スタンドアローン版限定) + [*] 別マップ、もしかすると障害物 + [*] 設定可能なマップ生成(数やサイズの設定、ランダム生成シード値、その他) + [*] 追加の形 + [*] パフォーマンス向上(このゲームは現状でもかなり軽いです) + [*] 色覚異常モード + [*] 他にも沢山! [/list] - Be sure to check out my trello board for the full roadmap! https://trello.com/b/ISQncpJP/shapezio + 完全なロードマップは私のTrelloボードをチェックしてみてください! https://trello.com/b/ISQncpJP/shapezio global: - loading: Loading - error: Error + loading: ロード中 + error: エラー # How big numbers are rendered, e.g. "10,000" thousandsDivider: "," @@ -82,25 +82,25 @@ global: trillions: T # Shown for infinitely big numbers - infinite: inf + infinite: 無限 time: # Used for formatting past time dates - oneSecondAgo: one second ago - xSecondsAgo: seconds ago - oneMinuteAgo: one minute ago - xMinutesAgo: minutes ago - oneHourAgo: one hour ago - xHoursAgo: hours ago - oneDayAgo: one day ago - xDaysAgo: days ago + oneSecondAgo: 1 秒前 + xSecondsAgo: 秒前 + oneMinuteAgo: 1 分前 + xMinutesAgo: 分前 + oneHourAgo: 1 時間前 + xHoursAgo: 時間前 + oneDayAgo: 1 日前 + xDaysAgo: 日前 # Short formats for times, e.g. '5h 23m' - secondsShort: s - minutesAndSecondsShort: m s - hoursAndMinutesShort: h m + secondsShort: 秒 + minutesAndSecondsShort: 分 秒 + hoursAndMinutesShort: 時間 分 - xMinutes: minutes + xMinutes: 分 keys: tab: TAB @@ -112,24 +112,24 @@ global: demoBanners: # This is the "advertisement" shown in the main menu and other various places - title: Demo Version + title: デモ版 intro: >- - Get the standalone to unlock all features! + スタンドアローン版を手に入れ、すべての要素をアンロックしましょう! mainMenu: - play: Play - changelog: Changelog - importSavegame: Import - openSourceHint: This game is open source! - discordLink: Official Discord Server - helpTranslate: Help translate! + play: プレイ + changelog: 更新履歴 + importSavegame: インポート + openSourceHint: このゲームはオープンソースです + discordLink: 公式Discordサーバ + helpTranslate: 翻訳に参加 # This is shown when using firefox and other browsers which are not supported. browserWarning: >- - Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience. + このゲームはお使いのブラウザでは速度が落ちることがあります。スタンドアローン版を入手するか、Chromeでプレイすることでこの問題は避けられます。 - savegameLevel: Level - savegameLevelUnknown: Unknown Level + savegameLevel: レベル + savegameLevelUnknown: 不明なレベル contests: contest_01_03062020: @@ -153,438 +153,444 @@ mainMenu: showInfo: View contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: 続きから + newGame: 新規ゲーム + madeBy: Made by dialogs: buttons: ok: OK - delete: Delete - cancel: Cancel - later: Later - restart: Restart - reset: Reset - getStandalone: Get Standalone - deleteGame: I know what I do - viewUpdate: View Update - showUpgrades: Show Upgrades - showKeybindings: Show Keybindings + delete: 削除 + cancel: キャンセル + later: 後で + restart: 再起動 + reset: リセット + getStandalone: スタンドアローン版を入手 + deleteGame: 何が起きるか理解しています + viewUpdate: アップデートを見る + showUpgrades: アップグレード表示 + showKeybindings: キー設定表示 importSavegameError: - title: Import Error + title: インポートエラー text: >- - Failed to import your savegame: + セーブデータのインポートに失敗しました: importSavegameSuccess: - title: Savegame Imported + title: セーブデータのインポートに成功 text: >- - Your savegame has been successfully imported. + セーブデータをインポートしました gameLoadFailure: - title: Game is broken + title: ゲームが壊れています text: >- - Failed to load your savegame: + セーブデータのロードに失敗しました: confirmSavegameDelete: - title: Confirm deletion + title: 削除確認 text: >- - Are you sure you want to delete the game? + 本当に削除しますか? savegameDeletionError: - title: Failed to delete + title: 削除に失敗 text: >- - Failed to delete the savegame: + セーブデータの削除に失敗しました: restartRequired: - title: Restart required + title: 再起動が必要 text: >- - You need to restart the game to apply the settings. + 設定を反映するには再起動が必要です editKeybinding: - title: Change Keybinding - desc: Press the key or mouse button you want to assign, or escape to cancel. + title: キー設定の変更 + desc: 割当てるキーかマウスボタンを押してください。ESCでキャンセルします。 resetKeybindingsConfirmation: - title: Reset keybindings - desc: This will reset all keybindings to their default values. Please confirm. + title: キー設定のリセット + desc: すべてのキー設定を初期値に戻します。実行する前によく確認してください。 keybindingsResetOk: - title: Keybindings reset - desc: The keybindings have been reset to their respective defaults! + title: キー設定のリセット + desc: キー設定を初期値に設定しました! featureRestriction: - title: Demo Version - desc: You tried to access a feature () which is not available in the demo. Consider to get the standalone for the full experience! + title: デモ版 + desc: アクセスした要素 () はデモ版では利用できません。スタンドアローン版の入手をご検討ください! oneSavegameLimit: - title: Limited savegames - desc: You can only have one savegame at a time in the demo version. Please remove the existing one or get the standalone! + title: セーブデータ制限 + desc: デモ版ではひとつのセーブデータのみ保持できます。既存のデータを削除するか、スタンドアローン版の入手をご検討ください! updateSummary: - title: New update! + title: 新アップデート! desc: >- - Here are the changes since you last played: + 前回からの変更点: upgradesIntroduction: - title: Unlock Upgrades + title: アップグレード解除 desc: >- - All shapes you produce can be used to unlock upgrades - Don't destroy your old factories! - The upgrades tab can be found on the top right corner of the screen. + すべての納品された形はアップグレードの解除のためにカウントされています。作った生産ラインを削除しないようにしてください! アップグレードタブは画面の右上から確認できます。 massDeleteConfirm: - title: Confirm delete + title: 削除確認 desc: >- - You are deleting a lot of buildings ( to be exact)! Are you sure you want to do this? + 多数の建造物を削除しようとしています! ( 個の選択) 続行しますか? blueprintsNotUnlocked: - title: Not unlocked yet + title: 未解除 desc: >- - Complete level 12 to unlock Blueprints! + レベル12をクリアしてブループリント機能を解除してください! keybindingsIntroduction: - title: Useful keybindings + title: 便利なキー設定 desc: >- - This game has a lot of keybindings which make it easier to build big factories. - Here are a few, but be sure to check out the keybindings! - CTRL + Drag: Select area to delete. - SHIFT: Hold to place multiple of one building. - ALT: Invert orientation of placed belts. + このゲームには大規模な工場の構築をスムーズにするため、沢山のキー設定があります。 + 以下に数例を示します。詳細はキー設定を確認してください! + CTRL + ドラッグ: 削除範囲を指定 + SHIFT: 押し続けると1種の建造物を連続配置 + ALT: 設置されたベルトの方向を逆転させる createMarker: - title: New Marker - desc: Give it a meaningful name + title: マーカーを設置 + desc: わかりやすい名前をつけてください。形を表す短いキーを含めることもできます。(ここから生成できます) markerDemoLimit: - desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! + desc: デモ版ではマーカー設置は2つまでに制限されています。スタンドアローン版は無制限です! + massCutConfirm: - title: Confirm cut + title: カット確認 desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + 多数の建造物をカットしようとしています! ( 個の選択) 続行しますか? exportScreenshotWarning: - title: Export screenshot + title: スクリーンショット出力 desc: >- - You requested to export your base as a screenshot. Please note that this can - be quite slow for a big base and even crash your game! + スクリーンショット出力を実行します。この処理は工場の全体像があまりに大きいと、 + ゲームが遅くなったりクラッシュしてしまう可能性があります! ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: - moveMap: Move - selectBuildings: Select area - stopPlacement: Stop placement - rotateBuilding: Rotate building - placeMultiple: Place multiple - reverseOrientation: Reverse orientation - disableAutoOrientation: Disable auto orientation - toggleHud: Toggle HUD - placeBuilding: Place building - createMarker: Create Marker - delete: Destroy - pasteLastBlueprint: Paste last blueprint + moveMap: マップ移動 + selectBuildings: 範囲選択 + stopPlacement: 配置の中止 + rotateBuilding: 建造物の回転 + placeMultiple: 複数配置 + reverseOrientation: 向きの逆転 + disableAutoOrientation: 自動向き合わせの停止 + toggleHud: HUD表示切り替え + placeBuilding: 建造物配置 + createMarker: マーカー設置 + delete: 削除 + pasteLastBlueprint: ブループリントの内容を設置 + lockBeltDirection: ベルトプランナーを有効化 + plannerSwitchSide: プランナーが通る側を反転 + cutSelection: Cut + copySelection: Copy + clearSelection: Clear Selection + pipette: Pipette # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) buildingPlacement: # Buildings can have different variants which are unlocked at later levels, # and this is the hint shown when there are multiple variants available. - cycleBuildingVariants: Press to cycle variants. + cycleBuildingVariants: キーを押して変更 # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- - Hotkey: + ホットキー: infoTexts: - speed: Speed - range: Range - storage: Storage - oneItemPerSecond: 1 item / second - itemsPerSecond: items / s + speed: スピード + range: レンジ + storage: ストレージ + oneItemPerSecond: 1 アイテム / 秒 + itemsPerSecond: アイテム / 秒 itemsPerSecondDouble: (x2) - tiles: tiles + tiles: タイル # The notification when completing a level levelCompleteNotification: # is replaced by the actual level, so this gets 'Level 03' for example. - levelTitle: Level - completed: Completed - unlockText: Unlocked ! - buttonNextLevel: Next Level + levelTitle: レベル + completed: 完了 + unlockText: を解除! + buttonNextLevel: 次のレベル # Notifications on the lower right notifications: - newUpgrade: A new upgrade is available! - gameSaved: Your game has been saved. - - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Press to cut, to copy, to remove and to cancel. + newUpgrade: 新しいアップグレードが利用可能です! + gameSaved: ゲームをセーブしました。 # The "Upgrades" window shop: - title: Upgrades - buttonUnlock: Upgrade + title: アップグレード + buttonUnlock: アップグレード # Gets replaced to e.g. "Tier IX" - tier: Tier + tier: 第 段階 # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMUM LEVEL (Speed x) + maximumLevel: 最大レベル (スピード x) # The "Statistics" window statistics: - title: Statistics + title: 統計情報 dataSources: stored: - title: Stored - description: Displaying amount of stored shapes in your central building. + title: 格納済 + description: 中央の建造物に格納された形の総数です。 produced: - title: Produced - description: Displaying all shapes your whole factory produces, including intermediate products. + title: 生産済 + description: 中間生成物を含む、工場全体で生産された形の総数です。 delivered: - title: Delivered - description: Displaying shapes which are delivered to your central building. - noShapesProduced: No shapes have been produced so far. + title: 納品済 + description: 中央の建造物に納品された形の総数です。 + noShapesProduced: まだ形が生産されていません。 # Displays the shapes per minute, e.g. '523 / m' - shapesPerMinute: / m + shapesPerMinute: / 分 # Settings menu, when you press "ESC" settingsMenu: - playtime: Playtime + playtime: プレイ時間 - buildingsPlaced: Buildings - beltsPlaced: Belts + buildingsPlaced: 建造物 + beltsPlaced: ベルト buttons: - continue: Continue - settings: Settings - menu: Return to menu + continue: コンティニュー + settings: 設定 + menu: メニューに戻る # Bottom left tutorial hints tutorialHints: - title: Need help? - showHint: Show hint - hideHint: Close + title: ヒントが必要ですか? + showHint: ヒントを見る + hideHint: 閉じる # When placing a blueprint blueprintPlacer: - cost: Cost + cost: コスト # Map markers waypoints: - waypoints: Markers + waypoints: マーカー hub: HUB - description: Left-click a marker to jump to it, right-click to delete it.Press to create a marker from the current view, or right-click to create a marker at the selected location. - creationSuccessNotification: Marker has been created. + description: マーカーを左クリックでその場所にジャンプ、右クリックで削除します。 キーを押すことで現在地にマーカーを設置します。選択した位置で右クリックすることでもマーカー設置できます。 + creationSuccessNotification: マーカーを設置しました # Interactive tutorial interactiveTutorial: - title: Tutorial + title: チュートリアル hints: - 1_1_extractor: Place an extractor on top of a circle shape to extract it! + 1_1_extractor: 抽出機 を 円の形 の上において抽出しましょう! 1_2_conveyor: >- - Connect the extractor with a conveyor belt to your hub!Tip: Click and drag the belt with your mouse! + 抽出機を コンベアベルト でHUBまで繋げましょう! Tip: マウスのドラッグ でベルトを引けます。 1_3_expand: >- - This is NOT an idle game! Build more extractors and belts to finish the goal quicker.Tip: Hold SHIFT to place multiple extractors, and use R to rotate them. + このゲームは放置系のゲームではありません! もっと早く要件を満たせるように、追加の抽出機とベルトを設置しましょう。Tip: SHIFT キーを押し続けると抽出機を連続配置できます。Rキーで設置方向を回転できます。 # All shop upgrades shopUpgrades: belt: - name: Belts, Distributor & Tunnels - description: Speed x → x + name: ベルト、ディストリビュータ & トンネル + description: スピード x → x miner: - name: Extraction - description: Speed x → x + name: 抽出機 + description: スピード x
${getKeycode(KEYMAPPINGS.navigation.mapMoveUp)}
${getKeycode(KEYMAPPINGS.navigation.mapMoveLeft)}
${getKeycode(KEYMAPPINGS.navigation.mapMoveDown)}
${getKeycode(KEYMAPPINGS.navigation.mapMoveRight)}
${getKeycode( - KEYMAPPINGS.massSelect.massSelectStart - )}
${getKeycode(KEYMAPPINGS.placement.abortBuildingPlacement)}
${getKeycode(KEYMAPPINGS.placement.rotateWhilePlacing)}
${getKeycode( - KEYMAPPINGS.placementModifiers.placeMultiple - )}
${getStringForKeyCode( + mapper.getBinding(/** @type {KeyCode} */ (key)).keyCode + )}
${removalKeybinding}
${cutKeybinding}
${copyKeybinding}
${abortKeybinding}
${T.demoBanners.intro}
STRG
UMSCH
ALT
CTRL
SHIFT