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)} - -
+ { + // [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, + }, -
- - -
+ { + // Delete with right click + label: T.ingame.keybindingsOverlay.delete, + keys: [KEYCODE_RMB], + condition: () => + !this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap, + }, -
- - -
+ { + // 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 - )}+ - - -
+ { + // Rotate + label: T.ingame.keybindingsOverlay.rotateBuilding, + keys: [k.placement.rotateWhilePlacing], + condition: () => this.anyPlacementActive && !this.beltPlannerActive, + }, -
- - -
+ { + // [BELT PLANNER] Flip Side + label: T.ingame.keybindingsOverlay.plannerSwitchSide, + keys: [k.placement.switchDirectionLockSide], + condition: () => this.beltPlannerActive, + }, -
- - ${getKeycode(KEYMAPPINGS.placement.abortBuildingPlacement)} - -
+ { + // Place last blueprint + label: T.ingame.keybindingsOverlay.pasteLastBlueprint, + keys: [k.massSelect.pasteLastBlueprint], + condition: () => !this.blueprintPlacementActive && this.lastBlueprintAvailable, + }, -
- ${getKeycode(KEYMAPPINGS.placement.rotateWhilePlacing)} - -
+ { + // 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 - )} - -
`) + - ` - ` - ); - } + { + // [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.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}`}
@@ -189,7 +187,7 @@ export class BoolSetting extends BaseSetting { getHtml() { return `
- ${this.enabled ? "" : standaloneOnlySettingHtml} + ${this.enabled ? "" : `${T.demo.settingNotAvailable}`}
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}
` } - -
- - + +
`; @@ -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 → x processors: - name: Cutting, Rotating & Stacking - description: Speed x → x + name: 切断、回転 & 積み重ね + description: スピード x → x painting: - name: Mixing & Painting - description: Speed x → x + name: 混合 & 着色 + description: スピード x → x # Buildings and their name / description buildings: hub: - deliver: Deliver - toUnlock: to unlock - levelShortcut: LVL + deliver: 納品 + toUnlock: 解除 + levelShortcut: レベル belt: default: - name: &belt Conveyor Belt - description: Transports items, hold and drag to place multiple. + name: &belt コンベアベルト + description: アイテムを輸送します。マウスドラッグで連続配置できます。 miner: # Internal name for the Extractor default: - name: &miner Extractor - description: Place over a shape or color to extract it. + name: &miner 抽出機 + description: 形や色の上に設置することで抽出できます。 chainable: - name: Extractor (Chain) - description: Place over a shape or color to extract it. Can be chained. + name: 連鎖抽出機 + description: 形や色の上に設置することで抽出できます。連鎖設置可能です。 underground_belt: # Internal name for the Tunnel default: - name: &underground_belt Tunnel - description: Allows to tunnel resources under buildings and belts. + name: &underground_belt トンネル + description: 建造物や他のベルトの地下を通してベルトを配置できます。 tier2: - name: Tunnel Tier II - description: Allows to tunnel resources under buildings and belts. + name: トンネル レベルII + description: 建造物や他のベルトの地下を通してベルトを配置できます。 splitter: # Internal name for the Balancer default: - name: &splitter Balancer - description: Multifunctional - Evenly distributes all inputs onto all outputs. + name: &splitter 分配機 + description: 多機能 - すべての入力をすべての出力に均等に分配します。 compact: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: 合流機 (コンパクト) + description: 2本のベルトの内容を1本のベルトに合流します。 compact-inverse: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: 合流機 (コンパクト) + description: 2本のベルトの内容を1本のベルトに合流します。 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! + name: &cutter 切断機 + description: 形を上下の直線で切断し、双方を出力します。もしひとつの出力しか使わない場合、他の出力を破棄しないと出力が詰まって停止することに注意してください! quad: - name: Cutter (Quad) - description: Cuts shapes into four parts. If you use only one part, be sure to destroy the other part or it will stall! + name: 切断機 (四分割) + description: 形を四分割します。もしひとつの出力しか使わない場合、他の出力を破棄しないと出力が詰まって停止することに注意してください! rotater: default: - name: &rotater Rotate - description: Rotates shapes clockwise by 90 degrees. + name: &rotater 回転機 + description: 形を時計回り方向に90度回転します。 ccw: - name: Rotate (CCW) - description: Rotates shapes counter clockwise by 90 degrees. + name: 回転機 (逆) + description: 形を反時計回り方向に90度回転します。 stacker: default: - name: &stacker Stacker - description: Stacks both items. If they can not be merged, the right item is placed above the left item. + name: &stacker 積層機 + description: 入力アイテムを積み重ねます。もしうまく統合できなかった場合は、右の入力アイテムを左の入力アイテムの上に重ねます。 mixer: default: - name: &mixer Color Mixer - description: Mixes two colors using additive blending. + name: &mixer 混合機 + description: 2つの色を加算混合で混ぜ合わせます。 painter: default: - name: &painter Painter - description: Colors the whole shape on the left input with the color from the right input. + name: &painter 着色機 + description: &painter_desc 左から入力された形の全体を、右から入力された色で着色します。 double: - name: Painter (Double) - description: Colors the shapes on the left inputs with the color from the top input. + name: 着色機 (ダブル) + description: 左から入力された形を、上から入力された色で着色します。 quad: - name: Painter (Quad) - description: Allows to color each quadrant of the shape with a different color. + name: 着色機 (四分割) + description: 入力された形を四分割づつ別の色で塗り分けられます。 + mirrored: + name: *painter + description: *painter_desc trash: default: - name: &trash Trash - description: Accepts inputs from all sides and destroys them. Forever. + name: &trash ゴミ箱 + description: すべての辺からの入力を破棄します。永遠に。 storage: - name: Storage - description: Stores excess items, up to a given capacity. Can be used as an overflow gate. + name: 格納庫 + description: 余ったアイテムを指定の上限まで格納します。余剰の受け口としても使用可能です。 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! + title: 形の切断 + desc: 切断機が利用可能になりました。これは入力された形を、向きを考慮せず上下の直線で半分に切断します。

    利用しない側の出力に注意しましょう。破棄するなどをしない限り詰まって停止してしまいます - このためにゴミ箱も用意しました。入力アイテムをすべて破棄できます。 reward_rotater: - title: Rotating - desc: The rotater has been unlocked! It rotates shapes clockwise by 90 degrees. + title: 回転 + desc: 回転機が利用可能になりました。形を時計回り方向に90度回転させます。 reward_painter: - title: Painting + title: 着色 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! + 着色機が利用可能になりました。 - 色の鉱脈から形の手順と同様に色を抽出し、着色機で形と組み合わせることで着色できます。

    PS:もしあなたが色の認識に問題があっても安心してください。我々はすでにその解決に着手しています! reward_mixer: - title: Color Mixing - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + title: 色の混合 + desc: 混合機が利用可能になりました。 - この建造物は2つの色を加算混合で混ぜ合わせます。 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! + title: 積層機 + desc: 積層機で形を組み合わせ可能になりました。双方の入力を組み合わせ、もし連続した形になっていればそれらは融合してひとつになります! もしできなかった場合は、左の入力の上に右の入力が重なります。 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!

    + title: 分配機/合流機 + desc: 多機能な分配機/合流機が利用可能になりました。 - より大規模な工場を構築するため、複数のベルト間でアイテムを合流、分配できます!

    reward_tunnel: - title: Tunnel - desc: The tunnel has been unlocked - You can now pipe items through belts and buildings with it! + title: トンネル + desc: トンネルが利用可能になりました。 - 他のベルトや建造物の地下を通してベルトが配置可能です! 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! + title: 反時計回りの回転 + desc: 回転機のバリエーションが利用可能になりました。 - 反時計回りの回転ができるようになります! 回転機を選択し、'T'キーを押すことで方向の切り替えができます 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: 連鎖抽出機 + desc: 連鎖抽出機が利用可能になりました。他の抽出機に出力を渡すことができるので、資源の抽出がより効率的になります! 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: トンネル レベルII + desc: トンネルのバリエーションが利用可能になりました。 - 距離拡張版が追加され、以前のものと組み合わせて目的に応じて利用することができます! reward_splitter_compact: - title: Compact Balancer + title: 合流機 (コンパクト) desc: >- - You have unlocked a compact variant of the balancer - It accepts two inputs and merges them into one! + 合流機のコンパクト版が利用可能になりました。 - 2つの入力をひとつに合流できます! 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: 四分割 + desc: 切断機のバリエーションが利用可能になりました。 - 上下の二分割ではなく、四分割に切断できます! 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: 着色機 (ダブル) + desc: 着色機のバリエーションが利用可能になりました。 - 通常の着色機と同様に機能しますが、ひとつの色の消費で一度に2つの形を着色処理できます! 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: 四分割着色 + desc: 着色機のバリエーションが利用可能になりました。 - 形のすべてのパーツを別の色で塗り分けることができます! 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: 余剰の貯蓄 + desc: ゴミ箱のバリエーションが利用可能になりました。 - 容量上限までアイテムを格納することができます! 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: フリープレイ + desc: やりましたね! フリープレイモードが利用可能になりました。 - これからは形はランダムに生成されます! (ご心配なく。スタンドアローン版はさらなる追加コンテンツが計画されています) 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: ブループリント + desc: 工場の建造物のコピー&ペーストが利用可能になりました! 範囲選択(CTRLキーを押したままマウスドラッグ)した状態で、'C'キーを押すことでコピーができます。

    ペーストはタダではありません。ブループリントの形を生産することで可能になります!(たった今納品したものです) # Special reward, which is shown when there is no reward actually no_reward: - title: Next level + title: 次のレベル 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! + このレベルには報酬はありません。次にはあるでしょう!

    PS: すでに作った生産ラインは削除しないようにしましょう。 - 生産された形はすべて、後にアップグレードの解除のために必要になります! no_reward_freeplay: - title: Next level + title: 次のレベル desc: >- - Congratulations! By the way, more content is planned for the standalone! + おめでとうございます! スタンドアローン版ではさらなる追加要素が計画されています! settings: - title: Settings + title: 設定 categories: - game: Game - app: Application + game: ゲーム + app: アプリケーション versionBadges: dev: Development @@ -594,116 +600,148 @@ settings: labels: uiScale: - title: Interface scale + title: 画面表示サイズ 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 + super_small: 極小 + small: 小 + regular: 普通 + large: 大 + huge: 極大 scrollWheelSensitivity: - title: Zoom sensitivity + title: ズーム感度 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 + super_slow: 極遅 + slow: 遅 + regular: 普通 + fast: 速 + super_fast: 超速 language: - title: Language + title: 言語 description: >- - Change the language. All translations are user contributed and might be incomplete! + 言語を変更します。すべての翻訳はユーザーからの協力で成り立っており、まだ完全には完了していない可能性があります! fullscreen: - title: Fullscreen + title: フルスクリーン description: >- - It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone. + フルスクリーンでのプレイが推奨です。スタンドアローン版のみ変更可能です。 soundsMuted: - title: Mute Sounds + title: 効果音ミュート description: >- - If enabled, mutes all sound effects. + 有効に設定するとすべての効果音をミュートします。 musicMuted: - title: Mute Music + title: BGMミュート description: >- - If enabled, mutes all music. + 有効に設定するとすべてのBGMをミュートします。 theme: - title: Game theme + title: ゲームテーマ description: >- - Choose the game theme (light / dark). + ゲームテーマを選択します。 (ライト / ダーク). themes: - dark: Dark - light: Light + dark: ダーク + light: ライト refreshRate: - title: Simulation Target + title: シミュレーション対象 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. + もし144hzのモニターを利用しているなら、この設定でリフレッシュレートを変更することで、ゲームが高リフレッシュレートを正しくシミュレーションします。利用しているPCが非力な場合、この設定により実効FPSが遅くなる可能性があります。 alwaysMultiplace: - title: Multiplace + title: 連続配置 description: >- - If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. + この設定を有効にすると、建造物を選択後に意図的にキャンセルするまで選択された状態を維持します。これはSHIFTキーを押し続けている状態と同等です。 offerHints: - title: Hints & Tutorials + title: ヒントとチュートリアル 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. + ゲーム中、ヒントとチュートリアルを表示します。レベルごとに不要なUI要素も非表示になり、ゲームに集中しやすくなります。 movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: 移動速度 + description: キーボードを使用した際の画面の移動速度を変更します。 speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: 極遅 + slow: 遅 + regular: 普通 + fast: 速 + super_fast: 超速 + extremely_fast: 超々速 + enableTunnelSmartplace: + title: スマートトンネル + description: >- + 有効にすると、トンネルを設置した際に不要なベルトを自動的に除去します。 + また、トンネルをドラッグできるようになり、不要なトンネルは除去されます。 + vignette: + title: ビネット + description: >- + 画面の隅を暗くして文字を読みやすくするビネットを有効化します。 + + 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 + title: キー設定 hint: >- - Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options. + Tip: CTRL, SHIFT, ALTを利用するようにしてください。これらはそれぞれ建造物配置の際の機能があります。 - resetKeybindings: Reset Keyinbindings + resetKeybindings: キー設定をリセット categoryLabels: - general: Application - ingame: Game - navigation: Navigating - placement: Placement - massSelect: Mass Select - buildings: Building Shortcuts - placementModifiers: Placement Modifiers + general: アプリケーション + ingame: ゲーム + navigation: ナビゲーション + placement: 配置 + massSelect: 複数選択 + buildings: 建造物ショートカット + placementModifiers: 配置時バリエーション mappings: - confirm: Confirm - back: Back - mapMoveUp: Move Up - mapMoveRight: Move Right - mapMoveDown: Move Down - mapMoveLeft: Move Left - centerMap: Center Map + confirm: 確認 + back: 戻る + mapMoveUp: 上移動 + mapMoveRight: 右移動 + mapMoveDown: 下移動 + mapMoveLeft: 左移動 + centerMap: マップ中央移動 - mapZoomIn: Zoom in - mapZoomOut: Zoom out - createMarker: Create Marker + mapZoomIn: ズームイン + mapZoomOut: ズームアウト + createMarker: マーカー設置 - menuOpenShop: Upgrades - menuOpenStats: Statistics + menuOpenShop: アップグレード + menuOpenStats: 統計情報 - toggleHud: Toggle HUD - toggleFPSInfo: Toggle FPS and Debug Info + toggleHud: HUD切り替え + toggleFPSInfo: FPS、デバッグ情報表示切り替え belt: *belt splitter: *splitter underground_belt: *underground_belt @@ -715,54 +753,50 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement - rotateWhilePlacing: Rotate + rotateWhilePlacing: 回転 rotateInverseModifier: >- - Modifier: Rotate CCW instead - cycleBuildingVariants: Cycle Variants - confirmMassDelete: Confirm Mass Delete - cycleBuildings: Cycle Buildings + Modifier: 逆時計回りにする + cycleBuildingVariants: バリエーション変更 + confirmMassDelete: 複数選択削除の確認 + cycleBuildings: 建造物の選択 - massSelectStart: Hold and drag to start - massSelectSelectMultiple: Select multiple areas - massSelectCopy: Copy area + massSelectStart: マウスドラッグで開始 + massSelectSelectMultiple: 複数範囲選択 + massSelectCopy: 範囲コピー - 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: 自動向き合わせ無効 + placeMultiple: 配置モードの維持 + placeInverse: ベルトの自動向き合わせを逆転 + pasteLastBlueprint: 直前のブループリントをペーストする + massSelectCut: 範囲カット + exportScreenshot: 工場の全体像を画像出力 + mapMoveFaster: より速く移動 + lockBeltDirection: ベルトプランナーを有効化 + switchDirectionLockSide: "プランナー: 通る側を切り替え" + pipette: Pipette about: - title: About this Game + title: このゲームについて body: >- - This game is open source and developed by Tobias Springer (this is me).

    + このゲームはオープンソースであり、Tobias Springer (私)によって開発されています。

    - If you want to contribute, check out shapez.io on github.

    + 開発に参加したい場合は以下をチェックしてみてください。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!

    + このゲームはdiscordでの素晴らしいコミュニティなしには実現しませんでした。 - このサーバにも是非参加してください! discord server!

    - The soundtrack was made by Peppsen - He's awesome.

    + サウンドトラックはPeppsenにより製作されました。 - 彼は素晴らしいです

    - Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + 最後に、私の最高の友人Niklasに大きな感謝を。 - 彼とのFactorioのゲーム体験がなければ、このゲームは存在しませんでした。 changelog: - title: Changelog + title: 更新履歴 demo: features: - restoringGames: Restoring savegames - importingGames: Importing savegames - oneGameLimit: Limited to one savegame - customizeKeybindings: Customizing Keybindings - exportingBase: Exporting whole Base as Image + restoringGames: セーブデータのリストア + importingGames: セーブデータのインポート + oneGameLimit: セーブデータの1個制限 + customizeKeybindings: キー設定のカスタマイズ + exportingBase: 工場の全体像の画像出力 - settingNotAvailable: Not available in the demo. + settingNotAvailable: デモ版では利用できません。 diff --git a/translations/base-kor.yaml b/translations/base-kor.yaml index aca2187f..be220a41 100644 --- a/translations/base-kor.yaml +++ b/translations/base-kor.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io는 도형을 만들어 조합하는 공장을 짓는 게임입니다. 플레이 할수록 점점 더 어려운 도형을 만들어야 됩니다. + 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: @@ -29,32 +29,44 @@ steamPage: # - 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는 도형을 만들어 조합하는 공장을 짓는 게임입니다. 점점 더 복잡해지는 도형들을 제작해서 공장의 속도를 올리시기 바랍니다 - 수요가 늘수록 공장을 더 넓혀야 합니다. 자원을 늘리는 것도 잊으면 안됩니다. 무한한 크기의 맵에서 확장을 해 나가야 합니다.! - 도형은 금방 지루해 지기 때문에 색을 조합하여 색칠하십시오. 빨강, 초록, 파랑 색을 섞어서 만든 다양한 색으로 수요를 만족시키세요. - 이 게임에는 18개의 레벨이 있습니다 (이것 만으로도 여러분들은 이미 몇시간이 걸렸을 거예요!) 하지만 저는 항상 새로운 컨텐츠를 추가하고 있습니다 - 계획해 놓은 것들이 많습니다! + + shapez.io는 다양한 도형의 생산과 조합을 자동화하는 공장들을 짓는 게임입니다. 점점 복잡해지는 요구사항을 충족하고 업그레이드를 잠금 해제해서 공장의 성능을 높일 수 있습니다. + + 점점 증가하는 수요를 충족하기 위해 공장의 규모를 키워야 합니다. [b]무한한 공간[/b]으로 확장하여 도형 재료를 구하는 것도 잊지 마세요. + + 단순한 도형은 금방 싫증이 나므로, 색을 조합하여 도형을 색칠하세요. 빨강, 초록, 파랑을 조합하여 다양한 색을 만들고 도형을 색칠하여 요구사항을 충족하세요. + + 이 게임에는 18개의 레벨이 있습니다. (이것만으로도 이미 몇시간이 걸렸을 거예요!) 하지만 저는 항상 새로운 컨텐츠를 추가하고 있습니다. 계획해 놓은 것들도 많구요! + + [b]유료 버전의 장점[/b] + [list] [*] 마커 - [*] 저장파일 무한정 + [*] 제한 없는 저장 [*] 다크 모드 - [*] 다양한 설정 가능 - [*] 제가 shapez. Io를 더 개발하는데 도움이 됨 ❤️ + [*] 더 다양한 설정 + [*] 제가 shapez.io를 개발하는 데 도움이 됨 ❤️ [*] 향후 더 많은 컨텐츠 [/list] + [b] 예정된 컨탠츠 및 커뮤니티 제안[/b] - 이 게임은 오픈 소스입니다. 따라서 누구나 기여할 수 있습니다. 또한, 커뮤니티의 제안을 [b]많이[/b] 듣고 있습니다! 가능한 많이 읽고 많이 반영하도록 노력하겠습니다. + + 이 게임은 오픈 소스입니다. 따라서 누구나 기여할 수 있습니다! 또한, 커뮤니티의 제안을 [b]많이[/b] 듣고 있습니다! 가능한 많이 읽고 많이 반영하도록 노력하겠습니다. + [list] [*] 건물을 도형으로 구매해야 돼는 스토리 모드 [*] 더 많은 레벨과 건물 (유료 버전 한정) [*] 다양한 월드와 맵 장애물 [*] 당신만의 맵 제작 [*] 더 많은 종류의 도형 - [*] 속도 업그레이드 (지금도 게임이 잘 되긴 합니다!) + [*] 성능 향상 (지금도 게임이 잘 되긴 합니다!) [*] 색맹자용 모드 - [*] 등등 + [*] 그 외 다수! [/list] + 저의 트렐로 보드를 확인해서 로드맵을 확인해보세요! https://trello.com/b/ISQncpJP/shapezio + global: loading: 로딩중 error: 에러 @@ -65,22 +77,22 @@ global: # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: thousands: k - millions: m - billions: b - trillions: t + millions: M + billions: B + trillions: T # Shown for infinitely big numbers - infinite: inf + infinite: 무한 time: # Used for formatting past time dates - oneSecondAgo: 일초 전 + oneSecondAgo: 1초 전 xSecondsAgo: 초 전 - oneMinuteAgo: 일분 전 - xMinutesAgo: 분전 - oneHourAgo: 한 시간 전 - xHoursAgo: 시간 전 - oneDayAgo: 일일 전 + oneMinuteAgo: 1분 전 + xMinutesAgo: 분 전 + oneHourAgo: 1시간 전 + xHoursAgo: 시간 전 + oneDayAgo: 1일 전 xDaysAgo: 일 전 # Short formats for times, e.g. '5h 23m' @@ -103,6 +115,7 @@ demoBanners: title: 무료 버전 intro: >- 유료 버전을 구매해서 모든 컨탠츠를 사용해 보세요! + mainMenu: play: 시작 changelog: 버전 기록 @@ -119,10 +132,11 @@ mainMenu: contests: contest_01_03062020: - title: "#1번 콘테스트" - + title: "콘테스트 #01" + desc: Win $25 for the coolest base! longDesc: >- 여러분들에게 무언가를 나눠드리고 싶어서 주간 콘테스트를 개최합니다! +

    이번주 토픽: 가장 멋있는 공장을 만드세요!

    @@ -136,10 +150,12 @@ mainMenu:

당신들의 멋진 공장을 보고 싶습니다! - desc: Win $25 for the coolest base! showInfo: 보기 contestOver: 이 콘테스트는 끝났습니다. 디스코드에서 새로운 콘테스트 관련 알림을 받으세요! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -152,33 +168,39 @@ dialogs: getStandalone: 유료 버전 구매하기 deleteGame: 확실합니다 viewUpdate: 업데이트 보기 - showUpgrades: 업그래이드 보기 + showUpgrades: 업그레이드 보기 showKeybindings: 조작법 보기 importSavegameError: title: 불러오기 오류 text: >- 저장 파일을 불러오지 못했습니다: + importSavegameSuccess: title: 저장 파일 불러오기 성공 text: >- 저장 파일이 성공적으로 불러와졌습니다. + gameLoadFailure: - title: 게임이 깨졌습니다.(???) + title: 저장 파일 에러 text: >- 저장 파일을 불러오지 못했습니다: + confirmSavegameDelete: title: 삭제 확인 text: >- 이 게임 파일을 정말로 삭제하겠습니까? + savegameDeletionError: title: 삭제 실패 text: >- 저장 파일을 삭제하지 못했습니다. + restartRequired: title: 다시 시작 필요 text: >- 설정을 적용하려면 게임을 다시 시작해야 됩니다. + editKeybinding: title: 키바인딩 바꾸기 desc: 당신이 원하는 키나 마우스 버튼을 눌러서 바꾸거나 ESC를 눌러 취소하세요. @@ -203,38 +225,43 @@ dialogs: title: 신규 버전! desc: >- 지난번 플레이 이후 변경사항은 다음과 같습니다. + upgradesIntroduction: - title: 업그래이드 하기 + title: 업그레이드 하기 desc: >- 여러분이 만든 모든 도형은 업그레이드에 사용 될 수 있습니다! - 만들어 놓은 공장을 허물지 마세요! - 업그래이드 버튼은 화면의 오른쪽 위에 있습니다. + 업그레이드 버튼은 화면의 오른쪽 위에 있습니다. + massDeleteConfirm: title: 삭제 확인 desc: >- 당신은 많은 건물을 삭제하려고 하고있습니다! (정확히는 개) 삭제하시겠습니까? + + 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: 아직 사용 불가 desc: >- 복사 기능은 아직 열리지 않았습니다! 레벨을 올려서 잠금을 해제하세요. + keybindingsIntroduction: title: 유용한 키바인딩 desc: >- 큰 공장을 지을 때 유용한 키바인딩이 많습니다! 아래를 확인하세요.나머지 키바인딩도 확인해보세요!!

- CTRL + Drag: 지역을 선택해서 복사/삭제하세요.
+ CTRL + Drag: 영역을 선택해서 복사/삭제하세요.
SHIFT: 한꺼번에 여러 개의 건물을 배치하세요.
ALT: 설치된 컨베이어 벨트의 방향을 바꾸세요.
+ createMarker: title: 새로운 마커 - desc: 의미 있는 이름을 지어주세요 + desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here) markerDemoLimit: desc: 데모 버전에서는 마커를 2개 까지만 놓을 수 있습니다. 유료 버전을 구입하면 마커를 무제한으로 놓을 수 있습니다! - 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 @@ -246,8 +273,8 @@ ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: - moveMap: 움지기기 - selectBuildings: 지역 선택 + moveMap: 움직이기 + selectBuildings: 영역 선택 stopPlacement: 건물 놓기 중지 rotateBuilding: 건물 회전 placeMultiple: 여러 개 놓기 @@ -258,6 +285,12 @@ ingame: createMarker: 마커 놓기 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) @@ -269,6 +302,7 @@ ingame: # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- Hotkey: + infoTexts: speed: 속도 range: 최대 거리 @@ -289,14 +323,9 @@ ingame: # Notifications on the lower right notifications: - newUpgrade: 새로운 업그래이드를 할 수 있습니다! + newUpgrade: 새로운 업그레이드를 할 수 있습니다! gameSaved: 게임이 저장되었습니다. - # 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: 업그레이드 @@ -364,25 +393,32 @@ ingame: 1_1_extractor: 추출기원 모양의 도형에 놓아서 추출하세요! 1_2_conveyor: >- 추출기를 컨베이어 벨트로 당신의 중앙 건물에 연결하세요!

팁: 마우스로 벨트를 클릭해서 드래그하세요! + 1_3_expand: >- - 이것은 아이들 게임이 아닙니다! 추출기를 더 놓아 목표를 빨리 달성하세요.

팁: SHIFT 를 눌러 여러 개의 추출기를 놓고 R로 회전 시키세요. + 이것은 방치형 게임이 아닙니다! 추출기를 더 놓아 목표를 빨리 달성하세요.

팁: SHIFT를 눌러 여러 개의 추출기를 놓고 R로 회전 시키세요. + # All shop upgrades shopUpgrades: belt: name: 컨베이어 벨트, 배분기, 터널 description: 속도 x → x miner: - name: 추출 + name: 추출기 description: 속도 x → x processors: - name: 자르기, 회전, 쌓기 - description: Speed x → x + name: 절단기, 회전기, 결합기 + description: 속도 x → x painting: - name: 색 섞기, 색칠하기 - description: Speed x → x + name: 색 혼합기, 도형 색칠기 + description: 속도 x → x # Buildings and their name / description buildings: + hub: + deliver: 목표 + toUnlock: 보상 + levelShortcut: 레벨 + belt: default: name: &belt 컨베이어 벨트 @@ -448,13 +484,16 @@ buildings: painter: default: name: &painter 도형 색칠기 - description: 도형을 색소로 색칠한다. + description: &painter_desc 도형을 색소로 색칠한다. double: name: 2단 도형 색칠기 description: 왼쪽에 입력되는 도형을 위에서 입력되는 색소로 색칠한다. quad: name: 4단 도형 색칠기 description: 도형의 4가지 분단을 각각 다른 색으로 색칠할 수 있다. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -464,71 +503,49 @@ buildings: storage: name: 저장소 description: 할당된 용량만큼 초과되는 도형을 저장한다. - hub: - deliver: Deliver - toUnlock: to unlock - levelShortcut: LVL storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: - title: 도형 자르기 - 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! + title: 절단기 + desc: 절단기가 잠금 해제되었습니다! 절단기는 도형을 세로로 잘라 반으로 나눕니다.

사용하지 않는 도형은 휴지통에 버려주세요. 그렇지 않으면 절단기가 멈출 것입니다. reward_rotater: - title: 도형 회전기 - desc: 도형 회전기가 잠금 해제되었습니다! 이것은 도형을 시계방향으로 90도 회전 시킵니다. + title: 회전기 + desc: 회전기가 잠금 해제되었습니다! 이것은 도형을 시계방향으로 90도 회전 시킵니다. reward_painter: - title: 도형 색칠기 + title: 색칠기 desc: >- - 도형 색칠기가 잠금 해제 되었습니다! 색소 광물을 추출해서 이 기계로 도형을 색칠하세요.

PS: 당신이 색맹이라면, 해결책을 찾고 있으니 잠시만 기다려주세요! + 색칠기가 잠금 해제 되었습니다! 색소 광물을 추출해서 이 기계로 도형을 색칠하세요.

PS: 당신이 색맹이라면, 해결책을 찾고 있으니 잠시만 기다려주세요! reward_mixer: - title: 색 혼합기 - desc: >- - The mixer has been unlocked - Combine two colors using - additive blending with this building! + title: 혼합기 + desc: 혼합기가 잠금 해제 되었습니다! 이 건물로 두 색소를 혼합하세요! reward_stacker: - title: 스태커 - 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! + title: 결합기 + desc: 결합기가 잠금 해제 되었습니다! 두 도형이 서로 옆에 놓을 수 있는 경우, 두 도형이 결합됩니다. 그렇지 않은 경우, 오른쪽 도형이 왼쪽 도형 위에 쌓이게됩니다. reward_splitter: title: 배분기 - desc: >- - The multifunctional balancer has been unlocked - It can be - used to build bigger factories by splitting and merging items - onto multiple belts!

+ desc: 다양한 용도로 쓰이는 배분기가 잠금 해제되었습니다! 배분기로 도형들을 여러 개의 벨트에 합하거나 나누어서 큰 공장을 지을 수 있습니다.

reward_tunnel: title: 터널 desc: 터널이 잠금 해제되었습니다! 자원을 건물과 벨트 밑으로 운송 할 수 있습니다. reward_rotater_ccw: - title: 도형 회전기 (반시게방향) + title: 회전기 (반시게방향) desc: 반시게방향 회전기가 잠금 해제되었습니다! 이것을 배치하려면 회전기를 선택하고 T를 눌러서 변형된 버전을 사용하세요! reward_miner_chainable: title: 체인 추출기 - desc: >- - You have unlocked the chaining extractor! It can - forward its resources to other extractors so you can more - efficiently extract resources! + desc: 체인 추출기가 잠금 해제되었습니다! 체인 추출기는 자원을 다른 추출기로 전달하여 효율적으로 추출할 수 있게 합니다. reward_underground_belt_tier_2: title: 터널 티어 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! + desc: 새로운 종류의 터널이 잠금 해제되었습니다! 새 터널은 보다 넓은 범위를 가졌으며, 터널들은 같은 종류끼리만 연결됩니다. reward_splitter_compact: title: 컴팩트 연결기 @@ -537,19 +554,14 @@ storyRewards: reward_cutter_quad: title: 절단기 (4단) - desc: >- - You have unlocked a variant of the cutter - It allows you to - cut shapes in four parts instead of just two! + desc: 새로운 종류의 절단기가 잠금 해제되었습니다! 새 절단기는 도형을 2조각이 아니라 4조각으로 자릅니다. reward_painter_double: - title: 도형 색칠기 (2단) - 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: 색칠기 (2단) + desc: 새로운 종류의 색칠기가 잠금 해제되었습니다! 새 색칠기는 색소 하나로 2개의 도형을 색칠할 수 있습니다. reward_painter_quad: - title: 도형 색칠기 (4단) + title: 색칠기 (4단) desc: 4단 도형 색칠기가 잠금 해제되었습니다! 도형의 4분단을 각각 다른 색으로 색칠할 수 있습니다! reward_storage: @@ -558,26 +570,23 @@ storyRewards: reward_freeplay: title: 프리플레이 모드 - 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!) + desc: 해내셨군요! 프리플레이 모드가 잠금 해제되었습니다! 이제 도형이 랜덤으로 생성됩니다! (걱정 마세요, 유료버전에는 더 많은 컨텐츠가 계획되어 있습니다!) reward_blueprints: title: 블루프린트 - desc: 이제부터는 공장의 일부 지역을 복사하여 붙여넣기 할 수 있습니다! CTRL을 누르면서 드래그해서 먼저 지역을 선택하세요.

그 다음에는 C, DEL, ESC 로 복사하거나, 지우거나, 취소 하세요.

복사는 무료가 이닙니다. 특별한 "화폐" 도형으로 돈을 지불하고 복사가 됩니다. + desc: 이제부터는 공장의 일부 영역을 복사하여 붙여넣기 할 수 있습니다! CTRL을 누르면서 드래그해서 먼저 영역을 선택하세요.

그 다음에는 C, DEL, ESC 로 복사하거나, 지우거나, 취소 하세요.

복사는 무료가 이닙니다. 특별한 "화폐" 도형으로 돈을 지불하고 복사가 됩니다. # Special reward, which is shown when there is no reward actually no_reward: title: 다음 레벨 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! + 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: 다음 레벨 desc: >- 축하드립니다! 유료 버전을 위한 더 많은 컨텐츠를 만들고 있습니다. + settings: title: 설정 categories: @@ -613,47 +622,10 @@ settings: fast: 빠르게 super_fast: 매우 빠르게 - language: - title: 언어 - description: >- - 언어 바꾸기 - 모든 언어팩은 사용자들이 만든 것이므로 완성되지 않았을 수 있습니다.. - fullscreen: - title: Fullscreen - description: >- - 이 게임은 풀 스크린으로 하는 것이 가장 좋습니다. 풀 스크린 모드는 유료 버전에서만 가능합니다. - soundsMuted: - title: 소리 끄기 - description: >- - 모든 효과음을 끕니다. - musicMuted: - title: 음악 끄기 - description: >- - 모든 배경 음악을 끕니다. - theme: - title: 게임 테마 - description: >- - 게임 테마를 고르세요. (밝음/어두움). - - themes: - dark: Dark - light: Light - - refreshRate: - title: 모니터 리프레쉬 속도 - description: >- - 당신의 모니터의 리프세쉬 속도가 144hz 보다 높으면 이 설정을 바꾸어서 게임이 더 빨리 리프레시 되게 하세요. 만약에 컴퓨터가 느리다면 FPS에 영양을 미칠 수 있습니다. - alwaysMultiplace: - title: 항상 여러 개 배치 - description: >- - 배치 이후에도 모든 빌딩이 선택되어 있습니다. SHIFT를 계속 누르고 있는 것과 같은 효과입니다. - offerHints: - title: 힌트와 튜토리얼 - description: >- - 이것을 끄면 힌트와 튜토리얼이 나오지 않습니다. 또한 게임에 쉽게 들어가기 위해서 주어진 레벨에서 특정 UI 요소를 숨길 수도 있습니다. - movementSpeed: title: Movement speed - description: Changes how fast the view moves when using the keyboard. + description: >- + Changes how fast the view moves when using the keyboard. speeds: super_slow: Super slow slow: Slow @@ -662,10 +634,88 @@ settings: super_fast: Super Fast extremely_fast: Extremely Fast + language: + title: 언어 + description: >- + 언어 바꾸기 - 모든 언어팩은 사용자들이 만든 것이므로 완성되지 않았을 수 있습니다.. + + fullscreen: + title: Fullscreen + description: >- + 이 게임은 풀 스크린으로 하는 것이 가장 좋습니다. 풀 스크린 모드는 유료 버전에서만 가능합니다. + + soundsMuted: + title: 소리 끄기 + description: >- + 모든 효과음을 끕니다. + + musicMuted: + title: 음악 끄기 + description: >- + 모든 배경 음악을 끕니다. + + theme: + title: 게임 테마 + description: >- + 게임 테마를 고르세요. (밝음/어두움). + themes: + dark: Dark + light: Light + + refreshRate: + title: 모니터 리프레쉬 속도 + description: >- + 당신의 모니터의 리프세쉬 속도가 144hz 보다 높으면 이 설정을 바꾸어서 게임이 더 빨리 리프레시 되게 하세요. 만약에 컴퓨터가 느리다면 FPS에 영양을 미칠 수 있습니다. + + alwaysMultiplace: + title: 항상 여러 개 배치 + description: >- + 배치 이후에도 모든 빌딩이 선택되어 있습니다. SHIFT를 계속 누르고 있는 것과 같은 효과입니다. + + offerHints: + title: 힌트와 튜토리얼 + description: >- + 이것을 끄면 힌트와 튜토리얼이 나오지 않습니다. 또한 게임에 쉽게 들어가기 위해서 주어진 레벨에서 특정 UI 요소를 숨길 수도 있습니다. + + 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: 키바인딩 hint: >- 팁: CTRL, SHIFT, ALT를 활용하세요. 건물을 배치할 때 유용합니다. + resetKeybindings: 키바인딩 리셋 categoryLabels: @@ -690,7 +740,7 @@ keybindings: mapZoomOut: 축소 createMarker: 마커 놓기 - menuOpenShop: 업그래이드 + menuOpenShop: 업그레이드 menuOpenStats: 통계 toggleHud: UI보기/숨기기 @@ -706,24 +756,27 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: 건물 배치 취소 rotateWhilePlacing: 회전 rotateInverseModifier: >- Modifier: 대신 반시계방향으로 회전 cycleBuildingVariants: 변형종 사용 confirmMassDelete: 대량 삭제 확인 + pasteLastBlueprint: Paste last blueprint cycleBuildings: 건물 사이클 massSelectStart: 누르고 드래그해서 시작 massSelectSelectMultiple: 여러 곳 선택 - massSelectCopy: 지역 복사 + massSelectCopy: 영역 복사 + massSelectCut: Cut area placementDisableAutoOrientation: 자동 회전 끄기 placeMultiple: 배치 모드에 있기 placeInverse: 자동 벨트 회전 뒤집기 - 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: 이 게임의 정보 diff --git a/translations/base-lt.yaml b/translations/base-lt.yaml index 7164fe34..f5686b97 100644 --- a/translations/base-lt.yaml +++ b/translations/base-lt.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,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: About this Game diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index 979110d8..ffec9737 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -32,7 +32,7 @@ steamPage: shapez.io is een spel dat draait om het bouwen van fabrieken om steeds complexere vormen te produceren en deze productie te automatiseren. Lever de gevraagde, steeds complexere vormen, om verder te komen in het spel en om upgrades voor je fabrieken te ontgrendelen. - De vraag naar vormen wordt steeds hoger, wat betekent dat je fabriek moet blijven uitbreiden om dit tegemoet te komen. Om de juiste grondstoffen te delven zul je steeds verder in het [b]oneindig grote speelveld[/b] moeten gaan werken! + De vraag naar vormen wordt steeds groter, wat betekent dat je fabriek moet blijven uitbreiden om dit tegemoet te komen. Om de juiste grondstoffen te delven zul je steeds verder in het [b]oneindig grote speelveld[/b] moeten gaan werken! Omdat simpele vormen snel saai worden, moet je kleuren mengen om de vormen te verven - combineer rode, groene en blauwe grondstoffen om verschillende kleuren te produceren en gebruik deze om de vormen te verven, zodat je de vraag hiernaar tegemoet kan komen. @@ -108,7 +108,7 @@ global: alt: ALT escape: ESC shift: SHIFT - space: SPACE + space: SPATIE demoBanners: # This is the "advertisement" shown in the main menu and other various places @@ -153,12 +153,15 @@ mainMenu: showInfo: Laat zien contestOver: Deze competitie is voorbij - word lid van de discord (engelstalig) om berichten te krijgen van nieuwe competities! + continue: Verder + newGame: Nieuw Spel + madeBy: Gemaakt door dialogs: buttons: ok: OK - delete: Delete - cancel: Cancel + delete: Verwijder + cancel: Annuleer later: Later restart: Herstarten reset: Reset @@ -246,11 +249,11 @@ dialogs: Hier zijn er een aantal, maar zorg dat je kijkt naar de sneltoetsen!

CTRL + slepen: selecteer een gebied om te kopiëren / verwijderen.
SHIFT: Houd ingedrukt om meerdere van het zelfde gebouw te plaatsen.
- ALT: Draai de richting van geplaatste lopende banden om.
+ ALT: Houd ingedrukt om de richting van lopende banden om te draaien wanneer je ze plaatst.
createMarker: title: Nieuwe markering - desc: Geef het een betekenisvolle naam + desc: Geef het een betekenisvolle naam. Je kunt ook een icoontje van een vorm toevoegen (die je hier kunt maken) markerDemoLimit: desc: Je kunt maar twee markeringen plaatsen in de demo. Koop de standalone voor een ongelimiteerde hoeveelheid markeringen! @@ -260,10 +263,9 @@ dialogs: Je bent veel gebouwen aan het knippen ( om precies te zijn)! Weet je zeker dat je dit wil doen? exportScreenshotWarning: - title: Export screenshot + title: Exporteer 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! + Je hebt aangegeven dat je jouw basis wil exporteren als screenshot. Als je een grote basis hebt kan dit proces langzaam zijn en er zelfs voor zorgen dat je spel crasht! ingame: # This is shown in the top left corner and displays useful keybindings in @@ -272,7 +274,7 @@ ingame: moveMap: Beweeg speelveld selectBuildings: Selecteer gebied stopPlacement: Stop met plaatsen - rotateBuilding: Draai een gebouw + rotateBuilding: Draai gebouw placeMultiple: Plaats meerdere reverseOrientation: Omgekeerde oriëntatie disableAutoOrientation: Schakel auto-oriëntatie uit @@ -281,6 +283,12 @@ ingame: createMarker: Plaats markering delete: Vernietig pasteLastBlueprint: Plak de laatst gekopiëerde blauwdruk + 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) @@ -297,8 +305,8 @@ ingame: speed: Snelheid range: Bereik storage: Opslag - oneItemPerSecond: 1 item / seconde - itemsPerSecond: items / s + oneItemPerSecond: 1 voorwerp / s + itemsPerSecond: voorwerpen / s itemsPerSecondDouble: (x2) tiles: tegels @@ -316,11 +324,6 @@ ingame: newUpgrade: Er is een nieuwe upgrade beschikbaar! gameSaved: Je spel is opgeslagen. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Druk op om te knippen, om te kopiëren, om te verwijderen en om de selectie te annuleren. - # The "Upgrades" window shop: title: Upgrades @@ -332,7 +335,7 @@ ingame: # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMUM LEVEL (Snelheid x) + maximumLevel: MAXIMAAL NIVEAU (Snelheid x) # The "Statistics" window statistics: @@ -340,13 +343,13 @@ ingame: dataSources: stored: title: In opslag - description: Geeft weer hoe veel vormen er zijn opgeslagen in je centrale gebouw. + description: Geeft weer hoe veel vormen er zijn opgeslagen in de HUB. produced: title: Geproduceerd description: Geeft alle vormen weer die op dit moment geproduceerd worden, inclusief tussenproducten. delivered: title: Geleverd - description: Geeft alle vormen weer die in het centrale gebouw worden bezorgd. + description: Geeft alle vormen weer die in de HUB worden bezorgd. noShapesProduced: Er zijn nog geen vormen geproduceerd. # Displays the shapes per minute, e.g. '523 / m' @@ -372,7 +375,7 @@ ingame: # When placing a blueprint blueprintPlacer: - cost: Kost + cost: Prijs # Map markers waypoints: @@ -385,20 +388,20 @@ ingame: interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Plaats een extractor op een cirkelvorm om deze te onttrekken! + 1_1_extractor: Plaats een ontginner op een cirkelvorm om deze te onttrekken! 1_2_conveyor: >- - Verbind de extractor met een lopende band aan je hub!

Tip: Klik en sleep de lopende band met je muis! + Verbind de ontginner met een lopende band aan je hub!

Tip: Klik en sleep de lopende band met je muis! 1_3_expand: >- - Dit is GEEN nietsdoen-spel! bouw meer extractors en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere extractors te plaatsen en gebruik R om ze te draaien. + Dit is GEEN nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.

Tip: Houd SHIFT ingedrukt om meerdere ontginners te plaatsen en gebruik R om ze te draaien. # All shop upgrades shopUpgrades: belt: - name: Lopende banden, Verdeler & Tunnels + name: Banden, Verdeler & Tunnels description: Snelheid x → x miner: - name: Extractor + name: Ontginner description: Snelheid x → x processors: name: Knippen, draaien & stapelen @@ -416,12 +419,12 @@ buildings: miner: # Internal name for the Extractor default: - name: &miner Extractor + name: &miner Ontginner description: Plaats op een vorm of kleur om deze te onttrekken. chainable: - name: Extractor (Ketting) - description: Plaats op een vorm of kleur om deze te onttrekken. Kan in serie worden geplaatst. + name: Ontginner (Ketting) + description: Plaats op een vorm of kleur om deze te onttrekken. Kan achter elkaar worden geplaatst. underground_belt: # Internal name for the Tunnel default: @@ -474,13 +477,16 @@ buildings: painter: default: name: &painter Verver - description: Verft de volledige vorm in de linker input met de kleur van de rechter input. + description: &painter_desc Verft de volledige vorm in de linker input met de kleur van de rechter input. double: name: Verver (Dubbel) description: Verft de vormen in de linker inputs met de kleur van de rechter input. quad: name: Verver (Quad) description: Verft elke kwart van de vorm een andere kleur. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -504,12 +510,12 @@ storyRewards: reward_rotater: title: Roteren - desc: De roteerder is ontgrendeld - ! Het draait vormen 90 graden met de klok mee. + desc: De roteerder is ontgrendeld - Het draait vormen 90 graden met de klok mee. reward_painter: title: Verven desc: >- - De verver is ontgrendeld - Onttrek wat kleurstoffen (net als met vormen) en combineer deze met een vorm in de verver om ze een kleur te geven!

PS: Ik werk aan een oplossing voor kleurenblinden! + De verver is ontgrendeld - Onttrek wat kleurstoffen (net als met vormen) en combineer deze met een vorm in de verver om de vorm een kleur te geven!

PS: Ik werk aan een oplossing voor kleurenblinden! reward_mixer: title: Kleuren mengen @@ -529,11 +535,11 @@ storyRewards: reward_rotater_ccw: title: Roteren (andersom) - desc: Je hebt een variant van de rotater ontgrendeld - Het roteert voorwerpen tegen de klok in! Om het te bouwen selecteer je de roteerder en druk je op 'T' om tussen varianten te wisselen! + desc: Je hebt een variant van de roteerder ontgrendeld - Het roteert voorwerpen tegen de klok in! Om het te bouwen selecteer je de roteerder en druk je op 'T' om tussen varianten te wisselen! reward_miner_chainable: - title: Ketting Extractor - desc: Je hebt de Ketting extractor ontgrendeld! Deze kan grondstoffen doorsturen naar andere extractors, waardoor je efficiënter grondstoffen kan onttrekken! + title: Ketting-ontginner + desc: Je hebt de Ketting-ontginner ontgrendeld! Deze kan grondstoffen doorsturen naar andere ontginners, waardoor je efficiënter grondstoffen kan onttrekken! reward_underground_belt_tier_2: title: Tunnel Niveau II @@ -577,7 +583,7 @@ storyRewards: no_reward_freeplay: title: Volgende level desc: >- - Gefeliciteerd! By the way, het spel wordt in de toekomst nog verder uitgebereid in de standalone! + Gefeliciteerd! Even tussendoor, het spel wordt in de toekomst nog verder uitgebereid in de standalone! settings: title: Opties @@ -668,6 +674,38 @@ settings: fast: Snel super_fast: Super snel extremely_fast: Extreem snel + enableTunnelSmartplace: + title: Slimme Tunnels + description: >- + Wanneer dit aan staat zullen tunnels automatisch onnodige lopende banden verwijderen. + Ook kun je dan tunnels slepen en onnodige tunnels worden ook verwijderd. + vignette: + title: Vignette + description: >- + Schakelt de vignet in, wat de hoeken van het scherm donkerder maakt zodat de tekst makkelijker te lezen is. + + 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: Sneltoetsen @@ -714,7 +752,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Cancel plaatsen rotateWhilePlacing: Roteren rotateInverseModifier: >- Aanpassing: Roteer tegen de klok in @@ -731,27 +768,31 @@ keybindings: placeInverse: Omkeren richting lopende band pasteLastBlueprint: Plak laatst gekopiëerde blauwdruk massSelectCut: Knip geselecteerd gebied - exportScreenshot: Export whole Base as Image + exportScreenshot: Exporteer volledige basis als afbeelding + mapMoveFaster: Beweeg sneller + lockBeltDirection: Schakel lopende band-planner in + switchDirectionLockSide: "Planner: Wissel van kant" + pipette: Pipette about: title: Over dit spel body: >- - This game is open source and developed by Tobias Springer (this is me).

+ Dit spel is open source en ontwikkeld door Tobias Springer (dit ben ik).

- If you want to contribute, check out shapez.io on github.

+ Als je ook bij wil dragen, ga dan naar shapez.io op github.

- This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server!

+ Dit spel was niet mogelijk geweest zonder de geweldige discord community + rondom mijn spellen - Je zou eens lid moeten worden van de discord server (engelstalig)!

- The soundtrack was made by Peppsen - He's awesome.

+ De muziek is gemaakt door Peppsen - Hij is geweldig.

- Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Tot slot wil ik mijn beste vriend Niklas bedanken - Zonder onze + factorio-sessies zou dit spel nooit bestaan hebben. changelog: title: Changelog @@ -762,6 +803,6 @@ demo: importingGames: Savegames importeren oneGameLimit: Gelimiteerd tot één savegame customizeKeybindings: Custom sneltoetsen - exportingBase: Exporting whole Base as Image + exportingBase: Exporteer volledige basis als afbeelding settingNotAvailable: Niet beschikbaar in de demo. diff --git a/translations/base-no.yaml b/translations/base-no.yaml new file mode 100644 index 00000000..cc12dc52 --- /dev/null +++ b/translations/base-no.yaml @@ -0,0 +1,803 @@ +# +# 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 er et spill som handler om å bygge fabrikker for å automatisere produksjon og kombinering av former med økende kompleksitet på et ubegrenset brett. + + # 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 er et spill som handler om å bygge fabrikker for å automatisere byggeprosessen og kombinere forskjellige former og fasonger. Lever objektene som øker i kompleskitet og fasonger for å progressere i spillet og åpne opp nye oppgraderinger til din fabrikk. + + Siden forespørselen øker, må du skalere opp fabrikken din for å tilpasse deg til behovet - Men ikke glem tilgangen du har til ressurser, du må utvide på det [b]uendelige brettet[/b]! + + Siden figurer i seg selv kan bli kjedelig, må du snart mikse farger og fargelegge dine figurer - Kombiner rød, grønn og blå farge-ressurser for å produsere forskjellige farger, og fargelegg figurene for å tilfredsstille behovet. + + Spillet har 18 nivåer (Som bør holde deg opptatt i mange timer!) men jeg legger konstant til nytt innhold - Det er mye som er planlagt! + + + [b]Frittstående Fordeler[/b] + + [list] + [*] Kartmarkering + [*] Uendelige lagringsfiler + [*] Mørk Modus + [*] Flere instillinger + [*] Tillater meg å videreutvikle shapez.io ❤️ + [*] Flere funksjoner i fremtiden! + [/list] + + [b]Planlagte funksjoner & Forslag fra samfunnet[/b] + + Spillet er åpen kildekode - Alle kan bidra! Utenom det, så lytter jeg [b]veldig[/b] til samfunnet! Jeg prøver å lese alle forslag og ta imot så mye tilbakemeldinger som mulig. + + [list] + [*] Kampanje + [*] Flere nivåer & bygninger (Frittstående eksklusivt) + [*] Forskjellige brett, og kanskje hinder på brettet + [*] Konfigurerbart brett-generasjon (Endre antall og størrelse på ressursfelt, seed, med mer) + [*] Flere forskjellige type former + [*] Mer forbedring av ytelse (Selv om spillet allerede kjører ganske bra!) + [*] Fargeblind modus + [*] Og mye mer! + [/list] + + Sjekk ut min trello tavle for hele planen! https://trello.com/b/ISQncpJP/shapezio + +global: + loading: Laster + error: Feil + + # 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: ett sekund siden + xSecondsAgo: sekunder siden + oneMinuteAgo: ett minutt siden + xMinutesAgo: minutter siden + oneHourAgo: en time siden + xHoursAgo: timer siden + oneDayAgo: en dag siden + xDaysAgo: dager siden + + # Short formats for times, e.g. '5h 23m' + secondsShort: s + minutesAndSecondsShort: m s + hoursAndMinutesShort: t m + + xMinutes: minutter + + keys: + tab: TAB + control: CTRL + alt: ALT + escape: ESC + shift: SHIFT + space: MELLOMROM + +demoBanners: + # This is the "advertisement" shown in the main menu and other various places + title: Demo Versjon + intro: >- + Skaff deg frittstående versjon for å åpne alle funksjoner! + +mainMenu: + play: Spill + changelog: Endringshistorikk + importSavegame: Importer + openSourceHint: Dette spillet er åpen kildekode! + discordLink: Offisiel Discord Server + helpTranslate: Hjelp oversetting! + + # This is shown when using firefox and other browsers which are not supported. + browserWarning: >- + Beklager, men spillet er kjent for å kjøre sakte på din nettleser! Skaff deg frittstående versjon, eller last ned Chrome for den fulle opplevelsen. + + savegameLevel: Nivå + savegameLevelUnknown: Ukjent Nivå + + contests: + contest_01_03062020: + title: "Konkurranse #01" + desc: Vinn $25 for den kuleste basen! + longDesc: >- + For å gi noe tilbake til deg, tenkte jeg det ville vært kult med ukentlige konkurranser! +

+ Denne ukens tema: Bygg den kuleste basen! +

+ Her er tingen:
+
    +
  • Send et skjermbilde av basen din til contest@shapez.io
  • +
  • Bonus poeng om du deler på sosiale medier!
  • +
  • Jeg velger 5 skjermbilder og foreslår de på discord for samfunnet til å stemme.
  • +
  • Vinneren får $25 (Paypal, Amazon Gift Card, eller hva du foretrekker)
  • +
  • Frist: 07.06.2020 00:00 Sentraleuropeisk sommertid
  • +
+
+ Jeg ser fram til å se dine kule skapninger! + + showInfo: Vis + contestOver: Denne konkurransen er ferdig - Bli med på discord for å få varsel om nye konkurranser! + continue: Fortsett + newGame: Nytt Spill + madeBy: Laget av + +dialogs: + buttons: + ok: OK + delete: Slett + cancel: Avbryt + later: Senere + restart: Omstart + reset: Nullstill + getStandalone: Få frittstående + deleteGame: Jeg vet hva jeg gjør + viewUpdate: Vis Oppdatering + showUpgrades: Vis Oppgraderinger + showKeybindings: Se Hurtigtaster + + importSavegameError: + title: Importerings feil + text: >- + Kunne ikke importere lagringsfilen: + + importSavegameSuccess: + title: Lagringsfil importert + text: >- + Din Lagringsfil ble vellykket importert. + + gameLoadFailure: + title: Lagringsfilen er ødelagt + text: >- + Kunne ikke laste inn lagringsfilen: + + confirmSavegameDelete: + title: Bekreft sletting + text: >- + Er du sikker på at du ønsker å slette lagringsfilen? + + savegameDeletionError: + title: Kunne ikke slette + text: >- + Kunne ikke slette lagringsfilen: + + restartRequired: + title: Omstart nødvendig + text: >- + Du må starte spillet på nytt for å ta i bruk instillingene. + + editKeybinding: + title: Endre Hurtigtast + desc: Trykk på knappen eller museknappen du vil tildele, eller escape for å avbryte. + + resetKeybindingsConfirmation: + title: Nullstill Hurtigtaster + desc: Dette vil nullstille alle hurtigtaster tilbake til standard. Vennligst bekreft. + + keybindingsResetOk: + title: Hurtigtaster nullstilt + desc: Hurtigtastene har blitt nullstilt tilbake til standard! + + featureRestriction: + title: Demo Versjon + desc: Du prøvde å benytte deg av en funksjon () som ikke er tilgjengelig i demoen. Vurder å skaffe frittstående versjon for den fulle opplevelsen! + + oneSavegameLimit: + title: Begrenset Lagringsfiler + desc: Du kan du ha en lagringsfil om gangen i demo versjonen. Vennligst slett den eksisterende, eller skaff frittstående versjon! + + updateSummary: + title: Ny oppdatering!! + desc: >- + Her er endringene siden sist du spilte: + + upgradesIntroduction: + title: Åpne Oppgradering + desc: >- + Alle objektene du produserer kan bli brukt til å åpne oppgraderinger - Ikke ødelegg dine gamle fabrikker! + Oppgraderingsfanen er plassert øverst til høyre på skjermen. + + massDeleteConfirm: + title: Bekreft sletting + desc: >- + Du skal til å slette mange bygninger ( for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette? + + massCutConfirm: + title: Bekreft Klipping + desc: >- + Du klipper ut mange bygninger ( for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette? + + blueprintsNotUnlocked: + title: Ikke åpnet enda + desc: >- + Fullfør nivå 12 for å åpne blåkopier! + + keybindingsIntroduction: + title: Nyttige hurtigtaster + desc: >- + Spillet har mange hurtigtaster som gjør det enklere å bygge store fabrikker. + Her er noen få, men sørg for å sjekke ut hurtigtaster!

+ CTRL + Dra: Velg et område.
+ SHIFT: Hold trykket for å plassere flere av en bygning.
+ ALT: Inverter orientasjon av plasserte belter.
+ + createMarker: + title: Ny Markør + desc: Gi markøren et meningsfullt navn, du kan også inkludere "short key" av et objekt (Som du kan generere her) + + markerDemoLimit: + desc: Du kan kun ha to markører i demo verjsonen. Skaff deg frittstående versjon for ubegrensede markører! + + exportScreenshotWarning: + title: Eksporter skjermbilde + desc: Du forespurte å eksportere bilde av basen din som et skjermbilde. Vær obs på at dette kan ta lang tid for en stor base, og i verste fall kræsje spillet ditt (Husk å lagre først)! + +ingame: + # This is shown in the top left corner and displays useful keybindings in + # every situation + keybindingsOverlay: + moveMap: Beveg + selectBuildings: Velg område + stopPlacement: Stopp plassering + rotateBuilding: Roter bygning + placeMultiple: Plasser flere + reverseOrientation: Omvent orientering + disableAutoOrientation: Deaktiver automatisk orientering + toggleHud: Veksle Grensesnitt + placeBuilding: Plasser bygning + createMarker: Lag Markør + delete: Ødelegg + pasteLastBlueprint: Lim inn forrige blåkopi + lockBeltDirection: Aktiver båndplanleggeren + plannerSwitchSide: Flipp båndplanleggeren + 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: Trykk for å veksle mellom variantene. + + # Shows the hotkey in the ui, e.g. "Hotkey: Q" + hotkeyLabel: >- + Hotkey: + + infoTexts: + speed: Hastighet + range: Lengde + storage: Lagring + oneItemPerSecond: 1 objekt / sekund + itemsPerSecond: objekter / s + itemsPerSecondDouble: (x2) + + tiles: ruter + + # The notification when completing a level + levelCompleteNotification: + # is replaced by the actual level, so this gets 'Level 03' for example. + levelTitle: Nivå + completed: Fullført + unlockText: Åpnet ! + buttonNextLevel: Neste Nivå + + # Notifications on the lower right + notifications: + newUpgrade: En ny oppgradering er tilgjengelig! + gameSaved: Spillet ditt er lagret. + + # The "Upgrades" window + shop: + title: Oppgraderinger + buttonUnlock: Oppgrader + + # Gets replaced to e.g. "Tier IX" + tier: Nivå + + # The roman number for each tier + tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] + + maximumLevel: MAKS NIVÅ (Hastighet x) + + # The "Statistics" window + statistics: + title: Statistikk + dataSources: + stored: + title: Lagret + description: Viser hva som er lagret i hovedbygningen. + produced: + title: Produsert + description: Viser alle objektene hele fabrikken produserer, inkluderer avanserte objekter. + delivered: + title: Levert + description: Viser objekter som er levert til hovedbygningen. + noShapesProduced: Ingen objekter har blitt produsert så langt. + + # Displays the shapes per minute, e.g. '523 / m' + shapesPerMinute: / m + + # Settings menu, when you press "ESC" + settingsMenu: + playtime: Spilletid + + buildingsPlaced: Bygninger + beltsPlaced: Belter + + buttons: + continue: Fortsett + settings: Innstillinger + menu: Tilbake til hovedmeny + + # Bottom left tutorial hints + tutorialHints: + title: Trenger du hjelp? + showHint: Vis hint + hideHint: Lukk + + # When placing a blueprint + blueprintPlacer: + cost: Kostnad + + # Map markers + waypoints: + waypoints: Markør + hub: Hovedbygning + description: Venstreklikk en markør for å gå dit, høyreklikk for å slette markøren.

Trykk for å lage en markør fra nåværende sted, eller høyreklikk for å lage en markør på valgt område. + creationSuccessNotification: Markren ble laget. + + # Interactive tutorial + interactiveTutorial: + title: Opplæring + hints: + 1_1_extractor: Plasser en utdrager på toppen av en sirkel form for å samle den! + 1_2_conveyor: >- + Koble utdrageren med et transportbånd til hovedbygningen!

Tips: Trykk og dra beltet med musa! + + 1_3_expand: >- + Dette er IKKE et idle-spill! Bygg flere utdragere og belter for å nå målet raskere.

Tips: Hold SHIFT for å plassere flere utdragere, og bruk R for å rotere dem. + +# All shop upgrades +shopUpgrades: + belt: + name: Belter, Distributører & Tuneller + description: Hastighet x → x + miner: + name: Utdrager + description: Hastighet x → x + processors: + name: Kutting, Rotering & Stabling + description: Hastighet x → x + painting: + name: Miksing & Maling + description: Hastighet x → x + +# Buildings and their name / description +buildings: + hub: + deliver: Lever + toUnlock: for å låse opp + levelShortcut: nivå + + belt: + default: + name: &belt Transportbånd + description: Transporterer objekter, hold og dra for å plassere flere. + + miner: # Internal name for the Extractor + default: + name: &miner Utdrager + description: Plasser over en form eller farge for å trekke ut. + + chainable: + name: Utdrager (Kjede) + description: Plasser over en form eller farge for å trekke ut. Kan kobles i kjede. + + underground_belt: # Internal name for the Tunnel + default: + name: &underground_belt Tunell + description: Lar deg bruke tuneller for å transportere objekter under bygninger og belter. + + tier2: + name: Tunell Nivå II + description: Lar deg bruke tuneller for å transportere objekter under bygninger og belter. + + splitter: # Internal name for the Balancer + default: + name: &splitter Utjevner + description: Multifunksjonell - Sprer alt jevnt utover. + + compact: + name: Sammenslå (kompakt) + description: Slår sammen to belter til ett. + + compact-inverse: + name: Sammenslå (kompakt) + description: Slår sammen to belter til ett. + + cutter: + default: + name: &cutter Kutter + description: Kutter objekter fra top til bunn og spytter ut begge halvdeler. Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det låse seg! + quad: + name: Kutter (4-Veis) + description: Kutter objekter til 4 biter. Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det låse seg! + + rotater: + default: + name: &rotater Roter + description: Roter objekter med klokken, 90 grader. + ccw: + name: Roter (Mot klokken) + description: Roter objekter mot klokken, 90 grader. + + stacker: + default: + name: &stacker Stabler + description: Stabler begge objekter. Hvis de ikke kan bli stablet sidelengs, vil høyre stables over den andre. + + mixer: + default: + name: &mixer Fargemikser + description: Mikser to farger sammen ved å blande de. + + painter: + default: + name: &painter Maler + description: &painter_desc Maler hele objektet på venstre inngang med fargen fra øverste inngang. + double: + name: Maler (Dobbel) + description: Maler hele objektet på venstre inngang med fargen fra øverste inngang. + quad: + name: Maler (Fireganger) + description: Farger enhver kvadrant av objektet med forskjellige farger. + mirrored: + name: *painter + description: *painter_desc + + trash: + default: + name: &trash Søppelkasse + description: Tar imot objekter fra alle sider og ødelegger de. For alltid. + + storage: + name: Lagringsboks + description: Lagrer overflødige objekter, opp til en viss kapasitet. Kan bli brukt som mellomlagring for overflyt. + +storyRewards: + # Those are the rewards gained from completing the store + reward_cutter_and_trash: + title: Kutt Objekter + desc: Du åpnet nettop kutter - den kutter objekter i to fra topp til bunn uavhengig av rotasjon!

Husk å kvitt deg med alt søppel, ellers kiler det seg fast - For dette formålet har du søplekassen, som ødelegger alt du putter i den! + + reward_rotater: + title: Rotering + desc: Rotereren har blitt tilgjengelig! Den roterer objekter med klokken 90 grader. + + reward_painter: + title: Maling + desc: >- + Maleren har blitt tilgjengelig - Hent ut fargeressurser (på samme måte som du gjør med objekter) og kombiner det med et objekt i maleren for å male de!

PS: Hvis du er fargeblind, så jobber jeg med en løsning alt! + + reward_mixer: + title: Fargemikser + desc: Fargemikseren har blitt tilgjengelig - Kombiner to farger og bland de sammen med denne bygningen! + + reward_stacker: + title: Sammenslåer + desc: Du kan nå slå sammen forskjellige former med sammenslåeren! Begge inngangene blir slått sammen, og hvis det er mulig blir de plassert ved siden av hverandre, de vil bil til en. Hvis ikke, blir høyre inngang plassert over venstre inngang! + + reward_splitter: + title: Fordeler/Sammenslåer + desc: Den multifunksjonelle fordeleren har blitt tilgjengelig - Den kan brukes til å bygge større fabrikker ved å fordele og slå sammen objekter til flere transportbånd!

+ + reward_tunnel: + title: Tunell + desc: Tunellen har blitt tilgjengelig - Du kan nå transportere objekter under transportbelter og bygninger med den! + + reward_rotater_ccw: + title: Mot klokken rotering + desc: Du har åpnte en variant av rotereren - Den tillater rotasjoner mot klokken! For å bygge den, velg rotereren og trykk 'T' for å veksle mellom variantene! + + reward_miner_chainable: + title: Kjede Utdrager + desc: Du har åpnet kjede utdrageren! Den sender videre sine resurser til andre utdragere så de kan mer effektivt hente ut resurser! + + reward_underground_belt_tier_2: + title: Tunell Nivå II + desc: Du har åpnet en ny variant av tunellen - Den har lengre rekkevidde, og du kan også blande de forskjellige tunellene nå! + + reward_splitter_compact: + title: Kompakt Utjevning + desc: >- + Du har åpnet en variant av utjevneren - Den godtar to innganger og slår de sammen til en! + + reward_cutter_quad: + title: 4-Veis Kutting + desc: Du har åpnet en variant av kutteren - Den lar deg dele objekter inn i fire deler istedenfor bare to! + + reward_painter_double: + title: Dobbel Maling + desc: Du har åpnet en variant av maleren - Den fungerer som vanlig maler, men prosesserer to objekter om gangen, konsumerer bare en farge istedenfor to! + + reward_painter_quad: + title: Firegangers Maling + desc: Du har åpnet en variant av maleren - Den lar deg male hver del av objektet individuelt! + + reward_storage: + title: Lagrings Buffer + desc: Du har åpnet en variant av søplekassen - Den lar deg lagre objekter opp til en viss mengde! + + reward_freeplay: + title: Frispill + desc: Du klarte det! Du åpnet frispill modus! Dette betyr at formene er nå tilfeldig generert! (Frykt ikke, mer innhold er planlagt for frittstående versjon!) + + reward_blueprints: + title: Blåkopier + desc: Du kan nå kopiere og lime inn deler av fabrikken din! Velg et område (Hold inne CTRL, så dra med musa), trykk så 'C' for å kopiere det.

Lime det inn er ikke graits, du må produsere blåkopi objekter for å få råd til det! (Det du nettop leverte). + + # Special reward, which is shown when there is no reward actually + no_reward: + title: Neste nivå + desc: >- + Dette nivået ga deg ingen belønning, men neste gjør det!

PS: Burde ikke ødelegge din nåværende fabrikk - Du trenger alle de objektene senere for å åpne nye ting! + + no_reward_freeplay: + title: Neste nivå + desc: >- + Gratulerer!! Forresten, mer innhold er planlagt for frittstående versjon! + +settings: + title: Instillinger + categories: + game: Spill + app: Applikasjon + + versionBadges: + dev: Utvikling + staging: Icenesettelse + prod: Produksjon + buildDate: Bygget + + labels: + uiScale: + title: Grensesnitt skala + description: >- + Endrer størrelsen på brukergrensesnitt. Grensesnittet vil fortsatt skaleres basert på din enhets oppløsning, men denne instillingen styrer mengden den skalerer. + scales: + super_small: Veldig liten + small: Liten + regular: Vanlig + large: Stor + huge: Gigantisk + + scrollWheelSensitivity: + title: Forstørrelses sensitivitet + description: >- + Endrer hvor sensitiv forstørringen er (Enten musehjulet eller trackpad). + sensitivity: + super_slow: Veldig Sakte + slow: Sakte + regular: Vanlig + fast: Raskt + super_fast: Veldig Raskt + + movementSpeed: + title: Bevegelses hastighet + description: >- + Endrer hvor raskt bildet beveger seg når man bruker tastaturet. + speeds: + super_slow: Veldig Sakte slow + slow: Sakte + regular: Vanlig + fast: Raskt + super_fast: Veldig Raskt + extremely_fast: Ekstremt Raskt + + language: + title: Språk + description: >- + Endre språket. Alle oversettelser er bidrag ifra andre brukere og kan være ufullstendig! + + fullscreen: + title: Fullskjerm + description: >- + Det er anbefalt å spille spillet i fullskjerm for best mulig opplevelse. Kun tilgjengelig i frittstående versjon. + + soundsMuted: + title: Skru av lyder + description: >- + Hvis aktivert, skrur av alle lydeffekter. + + musicMuted: + title: Skru av Musikk + description: >- + Hvis aktivert, skrur av all musikk. + + theme: + title: Spilltema + description: >- + Velg spilltema (lys / mørk). + themes: + dark: Mørk + light: Lys + + refreshRate: + title: Simulerings Mål + description: >- + Hvis du har en 144hz skjerm, endre oppdateringsfrekvensen her så vil spillet simuleres mer korrekt på høyere oppdateringsfrekvenser. Dette kan redusere FPS om din PC er for treg. + + alwaysMultiplace: + title: Plasser flere + description: >- + Hvis aktivert, alle bygg vil forbli valgt etter plassering inntil du avbryter det. Dette tilsvarer å holde SHIFT nede permanent. + + offerHints: + title: Hint & Opplæring + description: >- + Om du ønsker hint og opplæring mens du spiller. Skjuler også enkelte elementer i brukergrensesnittet inntil spesifike nivå for å enklere komme i gang med spillet. + + enableTunnelSmartplace: + title: Smarte Tuneller + description: >- + Når aktivert, plassering av tuneller vil automatisk fjerne unødvendige bånd. + Dette lar deg også dra og slippe tuneller, og overflødige tuneller blir fjernet. + vignette: + title: Vignett + description: >- + Aktiverer vignett som gjør hjørnene på skjermen mørkere og teksten lettere + å lese. + + 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: Hurtigtaster + hint: >- + Tips: Husk å bruke CTRL, SHIFT and ALT! De gir deg flere plasseringsmuligheter. + + resetKeybindings: Nullstill Hurtigtaster + + categoryLabels: + general: Applikasjon + ingame: Spill + navigation: Navigering + placement: Plassering + massSelect: Velg Masse + buildings: Bygnings Snarvei + placementModifiers: Plasserings Alternativer + + mappings: + confirm: Bekreft + back: Tilbake + mapMoveUp: Flytt Opp + mapMoveRight: Flytt Høyre + mapMoveDown: Flytt Ned + mapMoveLeft: Flytt Venstre + mapMoveFaster: Beveg Raskere + centerMap: Midstill Brettet + + mapZoomIn: Zoom inn + mapZoomOut: Zoom ut + createMarker: Lag Markør + + menuOpenShop: Oppgraderinger + menuOpenStats: Statistikk + + toggleHud: Veksle Grensesnitt + toggleFPSInfo: Veksle FPS og debug informasjon + exportScreenshot: Eksporter hele basen som et bilde + belt: *belt + splitter: *splitter + underground_belt: *underground_belt + miner: *miner + cutter: *cutter + rotater: *rotater + stacker: *stacker + mixer: *mixer + painter: *painter + trash: *trash + + rotateWhilePlacing: Roter + rotateInverseModifier: >- + Alternativ: Roter mot klokken isteden + cycleBuildingVariants: Endre Varianter + confirmMassDelete: Bekreft Massesletting + pasteLastBlueprint: Lim inn forrige blåkopi + cycleBuildings: Endre Bygninger + + massSelectStart: Hold og dra for å starte + massSelectSelectMultiple: Velg flere områder + massSelectCopy: Kopier Område + massSelectCut: Kutt ut Område + + placementDisableAutoOrientation: Deaktiver automatisk orientering + placeMultiple: Forbli i plasseringsmodus + placeInverse: Inverter automatisk transportbånd orientering + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette + +about: + title: Om dette spillet + body: >- + Dette spillet er åpen kildekode og utviklet av Tobias Springer (dette er meg).

+ + Hvis du ønsker å bidra, sjekk ut shapez.io på github.

+ + Spillet ville ikke vært mulig uten det fantastidke discord samfunnet rundt spillet mitt - Du burde virkelig bli med på discord serveren!

+ + Lydsporet er laget av Peppsen - Han er rå.

+ + Til slutt, stor takk til min beste venn Niklas - Uten våre factorio økter ville ikke dette spillet ha eksistert. + +changelog: + title: Endringshistorikk + +demo: + features: + restoringGames: Gjenopprette lagringsfiler + importingGames: Importer lagringsfiler + oneGameLimit: Begrenset til en lagringsfil + customizeKeybindings: Forandre Hurtigtaster + exportingBase: Eksporter hele basen som bile + + settingNotAvailable: Ikke tilgjengelig i demoversjonen. diff --git a/translations/base-pl.yaml b/translations/base-pl.yaml index 8fec1dea..cce4ec57 100644 --- a/translations/base-pl.yaml +++ b/translations/base-pl.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io to gra polegająca na budowaniu automatycznej fabryki różnych, z każdym poziomem bardziej skomplikowanych kształtów, na mapie która nie ma końca. + shortText: shapez.io to gra polegająca na budowaniu fabryki automatyzującej tworzenie i łączenie ze sobą coraz bardziej skomplikowanych kształtów na mapie, która nie ma końca. # 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,13 +30,13 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io jest grą o budowaniu i automatyzacji fabryki różnych kształtów. Dostarczaj coraz bardziej skomplikowane kształty, żeby odblokować nowe ulepszenia żeby przyspieszyć produkcję w twojej fabryce. + shapez.io jest grą o budowaniu i automatyzacji fabryki różnych kształtów. Dostarczaj coraz bardziej skomplikowane kształty, żeby odblokować nowe ulepszenia i przyspieszyć produkcję w twojej fabryce. - Będziesz potrzebował produkować coraz więcej elementów, więc potrzebujesz również sporo miejsca na powiększanie fabryki. [b]Nieskończona mapa[/b] to coś co ułatwi Ci ten proces! + Będziesz potrzebował coraz więcej elementów, więc również sporo miejsca na powiększanie fabryki. [b]Nieskończona mapa[/b] to coś co ułatwi Ci ten proces! - Same kształty mogą z czasem być nudne, dlatego gra będzie wymagała od Ciebie malowania kształtów różnymi kolorami - Połącz czerwoną, zieloną i niebieską farbę, a powstanie farba o innym kolorze. Korzystaj z farb by postępować z kolejnymi poziomami. + Same kształty mogą z czasem być nudne, dlatego gra będzie wymagała od Ciebie malowania ich różnymi kolorami - połącz czerwoną, zieloną i niebieską farbę, a powstanie nowa o innym kolorze. Korzystaj z farb, by móc ukończyć kolejne poziomy. - Na tą chwilę gra oferuje 18 poziomów (które powinny zagwarantować rozrywkę na conajmniej kilka godzin!) ale bez przerwy dodaję nowe - Jest naprawdę wiele do dodania! + Na tę chwilę gra oferuje 18 poziomów (które powinny zagwarantować rozrywkę na co najmniej kilka godzin!), ale bez przerwy dodaję nowe - jest naprawdę wiele do dodania! [b]Zalety pełnej wersji[/b] @@ -46,21 +46,21 @@ steamPage: [*] Nielimitowana ilość zapisanych gier [*] Ciemny motyw gry [*] Więcej ustawień - [*] Pomóż mi w dalszym rozwijaniu shapez.io ❤️ + [*] Pomożesz mi w dalszym rozwijaniu shapez.io ❤️ [*] Więcej zawartości niedługo! [/list] [b]Zaplanowana zawartość & Sugestie społeczności[/b] - Ta gra jest open-source - Kaźdy może pomóc w rozwoju! Poza tym, słucham tego co społeczność ma do powiedenia w kwestii gry! Staram się czytać wszystkie sugestie i odbierać jak najwięcej informacji zwrotnych na temat gry. + Ta gra jest open-source - Każdy może pomóc w rozwoju! Poza tym słucham tego, co społeczność ma do powiedzenia w kwestii gry! Staram się czytać wszystkie sugestie i odbierać jak najwięcej informacji zwrotnych na temat gry. [list] [*] Kampania, gdzie do budowy potrzeba kształtów [*] Więcej poziomów i budynków (tylko w pełnej wersji) [*] Inne mapy, może z przeszkodami - [*] Możliwość modyfikowania parametrów generowanjej mapy (Ilość i rozmiar surowców, ziarno świata, itd.) + [*] Możliwość modyfikowania parametrów generowanej mapy (ilość i rozmiar surowców, ziarno świata, itd.) [*] Więcej rodzajów kształtów - [*] Optymalizacja (Mimo wszystko gra już działa dośc płynnie!) + [*] Optymalizacja (mimo wszystko gra już działa dość płynnie!) [*] Tryb dla ślepoty barw [*] I wiele więcej! [/list] @@ -117,10 +117,12 @@ demoBanners: # This is the "advertisement" shown in the main menu and other various places title: Wersja demo intro: >- - Kup pełną wersję gry, by odblokować więcej funckji! + Kup pełną wersję gry, by odblokować więcej funkcji! mainMenu: play: Rozpocznij + continue: Kontynuuj + newGame: Nowa gra changelog: Dziennik Zmian importSavegame: Importuj openSourceHint: Gra z otwartym kodem źródłowym! @@ -157,6 +159,7 @@ mainMenu: showInfo: Wyświetl contestOver: Ten konkurs już się skończył - Dołącz do serwera Discord by nie przegapić kolejnych! + madeBy: Made by dialogs: buttons: @@ -204,11 +207,11 @@ dialogs: editKeybinding: title: Zmień klawiszologię - desc: Naciśnij klawisz bądź przycisk myszy który chcesz przypisać, lub wciśnij Escape aby anulować. + desc: Naciśnij klawisz bądź przycisk myszy, który chcesz przypisać lub wciśnij Escape, aby anulować. resetKeybindingsConfirmation: title: Zresetuj klawiszologię - desc: Ta akcja zresetuje wszystkie ustawienia klawiszologii do domyśnych wartości. Proszę potwierdzić. + desc: Ta akcja zresetuje wszystkie ustawienia klawiszologii do domyślnych wartości. Proszę potwierdzić. keybindingsResetOk: title: Reset Klawiszologii @@ -230,7 +233,7 @@ dialogs: upgradesIntroduction: title: Ulepszenia desc: >- - Wszystkie kształty które produkujesz mogą zostać użyte do ulepszeń - Nie niszcz starych fabryk! + Wszystkie kształty, które produkujesz, mogą zostać użyte do ulepszeń - Nie niszcz starych fabryk! Zakładka "Ulepszenia" dostępna jest w prawym górnym rogu. massDeleteConfirm: @@ -250,11 +253,11 @@ dialogs: Oto kilka z nich, lecz nie zmienia to faktu iż warto sprawdzić dostępne kombinacje!

CTRL + Przeciąganie: Zaznacz obszar do kopiowania/usuwania.
SHIFT: Przytrzymaj, by wstawić więcej niż jeden budynek.
- ALT: Odwróć orientacje stawianych taśmociągów.
+ ALT: Odwróć orientację stawianych taśmociągów.
createMarker: title: Nowy Znacznik - desc: Nadaj nazwę + desc: Podaj nazwę znacznika. Możesz w niej zawrzeć kod kształtu, który możesz wygenerować tutaj. markerDemoLimit: desc: Możesz stworzyć tylko dwa własne znaczniki w wersji demo. Zakup pełną wersję gry dla nielimitowanych znaczników! @@ -265,10 +268,11 @@ dialogs: Wycinasz sporą ilość maszyn ( gwoli ścisłości)! Czy na pewno chcesz kontynuować? exportScreenshotWarning: - title: Export screenshot + title: Tworzenie zrzutu fabryki 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! + Zamierzasz wyeksportować swoją fabrykę jako zrzut ekranu. W przypadku dużej + fabryki ta akcja może być bardzo wolna, a nawet może spowodować zawieszenie się lub awarię gry! + Czy na pewno chcesz kontynuować? ingame: # This is shown in the top left corner and displays useful keybindings in @@ -279,13 +283,19 @@ ingame: stopPlacement: Przestań stawiać rotateBuilding: Obróć budynek placeMultiple: Postaw więcej - reverseOrientation: Odwróć orientacje - disableAutoOrientation: Wyłącz orientacje automatyczną + reverseOrientation: Odwróć orientację + disableAutoOrientation: Wyłącz orientację automatyczną toggleHud: Przełącz widoczność interfejsu placeBuilding: Postaw budynek createMarker: Stwórz znacznik delete: Usuń pasteLastBlueprint: Wklej ostatnio skopiowany obszar + lockBeltDirection: Tryb planowania taśmociągu + plannerSwitchSide: Obróć planowany taśmociąg + 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) @@ -321,11 +331,6 @@ ingame: newUpgrade: Nowe ulepszenie dostępne! gameSaved: Postęp gry został zapisany. - # Mass select information, this is when you hold CTRL and then drag with your mouse - # to select multiple buildings - massSelect: - infoText: Naciśnij by wyciąć, by skopiować, by usunąć lub by anulować. - # The "Upgrades" window shop: title: Ulepszenia @@ -386,18 +391,18 @@ ingame: waypoints: waypoints: Znaczniki hub: Budynek Główny - description: Kliknij znacznik lewym przyciskiem myszy, by się do niego przenieść lub prawym, by go usunąć.

Naciśnij by stworzyć marker na środku widoku lub prawy przycisk myszy by stworzyć na wskazanej lokacji. + description: Kliknij znacznik lewym przyciskiem myszy, by się do niego przenieść lub prawym, by go usunąć.

Naciśnij , by stworzyć marker na środku widoku lub prawy przycisk myszy, by stworzyć na wskazanej lokacji. creationSuccessNotification: Utworzono znacznik. # Interactive tutorial interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Postaw ekstraktor na źródle kształtu koła aby go wydobyć! + 1_1_extractor: Postaw ekstraktor na źródle kształtu koła, aby go wydobyć! 1_2_conveyor: >- Połącz ekstraktor taśmociągiem do głównego budynku!

Porada: Kliknij i przeciągnij taśmociąg myszką! 1_3_expand: >- - To NIE JEST gra "do poczekania"! Buduj więcej taśmociągów i ekstraktorów by wydobywać szybciej.

Porada: Przytrzymaj SHIFT by postawić wiele ekstratkorów. Naciśnij R, by je obracać. + To NIE JEST gra "do poczekania"! Buduj więcej taśmociągów i ekstraktorów, by wydobywać szybciej.

Porada: Przytrzymaj SHIFT, by postawić wiele ekstraktorów. Naciśnij R, by je obracać. # All shop upgrades shopUpgrades: belt: @@ -423,7 +428,7 @@ buildings: belt: default: name: &belt Taśmociąg - description: Transportuje obiekty, przytrzymaj by postawić kilka. + description: Transportuje obiekty, przytrzymaj i przeciągnij, by postawić kilka. miner: # Internal name for the Extractor default: @@ -488,13 +493,16 @@ buildings: # 2nd translator's note: All those buildings had different descriptions in english. Don't change them all to the same description. default: name: &painter Malarz - description: Koloruje kształt za pomocą koloru dostarczonego od boku. + description: &painter_desc Koloruje kształt za pomocą koloru dostarczonego od boku. double: name: Malarz (Podwójny) - description: Koloruje kształt za pomocą koloru dostarczonych od boku. Koloruje 2 kształty używając 1 barwnika. + description: Koloruje kształt za pomocą koloru dostarczonego od boku. Koloruje 2 kształty używając 1 barwnika. quad: name: Malarz (Poczwórny) - description: Koloruje każdą ćwiarkę kształtu na inny kolor, używając dostarczonych kolorów. + description: Koloruje każdą ćwiartkę kształtu na inny kolor, używając dostarczonych kolorów. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -510,18 +518,18 @@ storyRewards: reward_cutter_and_trash: title: Przecinanie Kształtów desc: >- - Odblokowano nową maszynę: przecinak - tnie kształt na pół pionowo - od góry do dołu, niezależnie od orientacji!

Upewnij się że zniszczysz nichciane kawałki, ponieważ może się zatkać - Na potrzeby tego otrzymujesz też kosz - niszczy wszystko co do niego przekierujesz! + Odblokowano nową maszynę: Przecinak - tnie kształt na pół pionowo - od góry do dołu, niezależnie od orientacji!

Upewnij się, że zniszczysz niechciane kawałki, ponieważ może się zatkać - Na potrzeby tego otrzymujesz też kosz - niszczy wszystko co do niego przekierujesz! reward_rotater: title: Obracanie desc: >- - Odblokowano nową maszynę: Obracacz! Obraca wejście o 90 stopni zgodnie z wskazówkami zegara. + Odblokowano nową maszynę: Obracacz! Obraca wejście o 90 stopni zgodnie ze wskazówkami zegara. #2nd translator's note: "Color objects" should be translated as "dye" reward_painter: title: Malowanie desc: >- - Odblokowano nową maszynę: Malarz - Wydobądź barwniki (tak jak w przypadku kształtów) i połącz z kształtem by go pomalować!

PS: Jeśli cierpisz na ślepotę barw, pracuje nad tym! + Odblokowano nową maszynę: Malarz - Wydobądź barwniki (tak jak w przypadku kształtów) i połącz z kształtem, by go pomalować!

PS: Jeśli cierpisz na ślepotę barw, pracuję nad tym! reward_mixer: title: Mieszanie @@ -535,7 +543,7 @@ storyRewards: reward_splitter: title: Rozdzielacz/Łącznik - desc: Wielofunkcyjne urządzenie balansujące zostało odblokowane - Może zostać wykorzystane do tworzenia większych fabryk poprzez rozdzielanie i łaczenie taśmociągów!

+ desc: Wielofunkcyjne urządzenie balansujące zostało odblokowane - Może zostać wykorzystane do tworzenia większych fabryk poprzez rozdzielanie i łączenie taśmociągów!

reward_tunnel: title: Tunel @@ -543,11 +551,11 @@ storyRewards: reward_rotater_ccw: title: Obracanie odwrotne - desc: Odblokowano nowy wariant Obracacza - Pozwala odwracać przeciwnie do wskazówek zegara! Aby zbudować, zaznacz Obracacz i naciśnij 'T' by zmieniać warianty! + desc: Odblokowano nowy wariant Obracacza - Pozwala odwracać przeciwnie do wskazówek zegara! Aby zbudować, zaznacz Obracacz i naciśnij 'T', by zmieniać warianty! reward_miner_chainable: title: Wydobycie Łańcuchowe - desc: Odblokowano nowy wariant ekstraktora! Może przekierować obiekty do ekstraktorów przed nim zwiększając efektywność wydbobycia! + desc: Odblokowano nowy wariant ekstraktora! Może przekierować obiekty do ekstraktorów przed nim, zwiększając efektywność wydobycia! reward_underground_belt_tier_2: title: Tunel Poziomu II @@ -565,11 +573,11 @@ storyRewards: reward_painter_double: title: Podwójne Malowanie - desc: Odblokowano nowy wariant Malarza - Działa jak zwykły malarz, z tą różnicą że maluje dwa kształty na raz pobierając wyłącznie jeden barwnik! + desc: Odblokowano nowy wariant Malarza - Działa jak zwykły malarz, z tą różnicą, że maluje dwa kształty na raz, pobierając wyłącznie jeden barwnik! reward_painter_quad: title: Poczwórne malowanie - desc: Odblokowano nowy wariant Malarza - Pozwala malować każdą ćwiarkę kształtu na inny kolor! + desc: Odblokowano nowy wariant Malarza - Pozwala malować każdą ćwiartkę kształtu na inny kolor! reward_storage: title: Magazyn @@ -592,7 +600,7 @@ storyRewards: no_reward: title: Następny Poziom desc: >- - Ten poziom nie daje nagrody, lecz kolejny już tak!

PS: Lepiej nie niszczyć istniejących fabryk - Potrzebujesz wszystkich kształtów w późniejszych etapach by odblokować ulepszenia! + Ten poziom nie daje nagrody, lecz kolejny już tak!

PS: Lepiej nie niszczyć istniejących fabryk - Potrzebujesz wszystkich kształtów w późniejszych etapach, by odblokować ulepszenia! no_reward_freeplay: title: Następny Poziom @@ -677,7 +685,7 @@ settings: refreshRate: title: Częstość Odświeżania description: >- - Jeśli posiadasz monitor z częstotliwością odświeżania 144hz, zmień tę opcje na poprawną częstotliwość odświeżania ekranu. To może wpłynąć na FPS jeśli masz za wolny komputer. + Jeśli posiadasz monitor z częstotliwością odświeżania 144hz, zmień tę opcje na poprawną częstotliwość odświeżania ekranu. Może to wpłynąć na FPS jeśli masz za wolny komputer. alwaysMultiplace: title: Wielokrotne budowanie @@ -687,7 +695,40 @@ settings: offerHints: title: Porady i Tutoriale description: >- - Oferuje porady i tutoriale podczas gry. Dodatkowo, chowa pewne elementy interfejsu by ułatwić poznanie gry. + Oferuje porady i tutoriale podczas gry. Dodatkowo chowa pewne elementy interfejsu, by ułatwić poznanie gry. + + enableTunnelSmartplace: + title: Smart Tunnels + description: >- + Gdy włączone, umieszczenie tunelu automatycznie usuwa zbędny taśmociąg. + Pozwala również budować tunele przez przeciąganie i nadmiarowe tunele zostają usunięte. + vignette: + title: Vignette + description: >- + Włącza winietowanie, które przyciemnia rogi ekranu i poprawia czytelność tekstu. + + 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: Klawiszologia @@ -710,7 +751,8 @@ keybindings: mapMoveUp: Ruch w górę mapMoveRight: Ruch w prawo mapMoveDown: Ruch w dół - mapMoveLeft: Move Left + mapMoveLeft: Ruch w lewo + mapMoveFaster: Przyspiesz ruch centerMap: Wyśrodkuj Mapę mapZoomIn: Przybliżenie @@ -721,7 +763,7 @@ keybindings: menuOpenStats: Statystyki toggleHud: Przełącz widoczność interfejsu - toggleFPSInfo: Pokaż Licznik FPS i infomacje do debugowania + toggleFPSInfo: Pokaż Licznik FPS i informacje do debugowania belt: *belt splitter: *splitter underground_belt: *underground_belt @@ -733,24 +775,26 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Anuluj Stawianie rotateWhilePlacing: Obróć rotateInverseModifier: >- - Modyfikator: Obróć Odrwotnie + Modyfikator: Obróć Odwrotnie cycleBuildingVariants: Zmień Wariant - confirmMassDelete: Potwierdź Usuwanie + confirmMassDelete: Potwierdź usuwanie cycleBuildings: Zmień Budynek - massSelectStart: Przytrzymaj i przeciągnij by zaznaczyć - massSelectSelectMultiple: Zaznacz kilka obszar + massSelectStart: Przytrzymaj i przeciągnij, by zaznaczyć + massSelectSelectMultiple: Zaznacz kilka obszarów massSelectCopy: Skopiuj obszar - placementDisableAutoOrientation: Wyłącz automatyczną orientacje + placementDisableAutoOrientation: Wyłącz automatyczną orientację placeMultiple: Pozostań w trybie stawiania - placeInverse: Odwróć automatyczną orientacje pasów + placeInverse: Odwróć automatyczną orientację pasów pasteLastBlueprint: Wklej ostatnio skopiowany obszar massSelectCut: Wytnij obszar - exportScreenshot: Export whole Base as Image + exportScreenshot: Wyeksportuj całą fabrykę jako zrzut ekranu + lockBeltDirection: Tryb planowania taśmociągu + switchDirectionLockSide: "Planowanie taśmociągu: Zmień stronę" + pipette: Pipette about: title: O Grze @@ -759,7 +803,7 @@ about: Jeżeli chcesz pomóc w rozwoju gry, sprawdź repozytorium shapez.io na Githubie.

Ta gra nie byłaby możliwa bez wspaniałej społeczności Discord skupionej na moich grach - Naprawdę powinieneś dołączyć do mojego serwera Discord!

Ścieżka dźwiękowa tej gry została stworzona przez Peppsena - Jest niesamowity.

- Na koniec, wielkie dzięki mojemu najlepszemu przyjacielowi: Niklas - Bez naszego wspólnego grania w Factorio, ta gra nigdy by nie powstała. + Na koniec, wielkie dzięki mojemu najlepszemu przyjacielowi: Niklas - Bez naszego wspólnego grania w Factorio ta gra nigdy by nie powstała. changelog: title: Dziennik zmian @@ -770,6 +814,6 @@ demo: importingGames: Importowanie zapisów gry oneGameLimit: Limit jednego zapisu gry customizeKeybindings: Personalizowanie Klawiszologii - exportingBase: Exporting whole Base as Image + exportingBase: Eksportowanie całej fabryki jako zrzut ekranu settingNotAvailable: Niedostępne w wersji demo. diff --git a/translations/base-pt-BR.yaml b/translations/base-pt-BR.yaml index ca58d79e..86d29a07 100644 --- a/translations/base-pt-BR.yaml +++ b/translations/base-pt-BR.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 é um jogo sobre construir fábricas, automatizando a criação e combinação de formas cada vez mais complexas num mapa infinito. # 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,42 +30,42 @@ 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 é um jogo sobre construir fábricas para automatizar a criação e combinação de formas. Entregue formas cada vez mais complexas pedidas pelo jogo para progredir e desbloquear melhorias que aceleram sua fábrica. - 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]! + Como a demanda é crescente, será necessário dimensionar uma fábrica que atenda a necessidade - Não se esqueça dos recursos à sua disposição, você poderá expandir em um [b]mapa infinito[/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. + Formas podem ficar entediantes por si só, logo você terá que misturar cores e pintá-las - Combine os recursos vermelho, verde e azul para produzir cores diferentes e pintar as formas com elas pra atender a demanda. - 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! + Esse jogo apresenta 18 níveis (que já devem mantê-lo ocupado por horas!) mas estou constantemente adicionado conteúdo novo - Muito já está planejado! - [b]Standalone Advantages[/b] + [b]Vantagens da Versão Standalone[/b] [list] - [*] Waypoints - [*] Unlimited Savegames - [*] Dark Mode - [*] More settings - [*] Allow me to further develop shapez.io ❤️ - [*] More features in the future! + [*] Marcações no mapa + [*] Jogos salvos ilimitados + [*] Modo escuro + [*] Mais opções no menu + [*] Me ajuda a desenvolver mais o shapez.io ❤️ + [*] Ainda mais recursos no futuro! [/list] - [b]Planned features & Community suggestions[/b] + [b]Melhoras Planejadas & Sugestões da Comunidade[/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. + Esse jogo tem código aberto - Qualquer um pode contribuir! Além disso, eu ouço [b]muito[/a] a comunidade! Tento ler todas as sugestões e levar o máximo possível de comentários sobre o jogo em consideração. [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! + [*] Modo história, onde construir custará formas + [*] Mais níves & construções (exclusivo da versão standalone) + [*] Mapas diferentes, e talvez obstáculos no mapa + [*] Criação de mapa configurável (Número e tamanho de recursos, seed, e mais) + [*] Mais tipos de formas + [*] Mais melhoras no desempenho (Mesmo que o jogo já esteja rodando bem rápido!) + [*] Acessibilidade para daltonismo + [*] E muito mais! [/list] - Be sure to check out my trello board for the full roadmap! https://trello.com/b/ISQncpJP/shapezio + Não deixe de conferir na minha página no trello o planejamento completo! (em inglês) https://trello.com/b/ISQncpJP/shapezio global: loading: Carregando @@ -127,32 +127,35 @@ mainMenu: browserWarning: >- Desculpe, o jogo fica lento em seu navegador! Compre a versão completa ou baixe o Chrome para obter uma experiência completa. - savegameLevel: Level - savegameLevelUnknown: Level desconhecido + savegameLevel: Nível + savegameLevelUnknown: Nível desconhecido contests: contest_01_03062020: title: "Concurso #01" - desc: Ganhe $ 25 pela melhor base! + desc: Ganhe $25 pela melhor base! longDesc: >- Para retribuir, pensei que seria legal fazer concursos semanais!

- Tópico dessa semana: Cronstua a base mais legal! + Tópico dessa semana: Construa a base mais legal!

- Here's the deal:
+ Esse é o plano:
  • Envie uma captura de tela da sua base para contest@shapez.io
  • Pontos bônus se você o compartilhar nas mídias sociais!
  • Vou escolher 5 capturas de tela e propor à votação a comunidade discord.
  • -
  • o vencedor recebe $ 25 (Paypal, Amazon Gift Card, o que você preferir)
  • +
  • o vencedor recebe $25 (Paypal, Amazon Gift Card, o que você preferir)
  • Até 07.06.2020 12:00 CEST

Estou ansioso para ver suas criações incríveis! - showInfo: Participate - contestOver: This contest has ended - Join the discord to get noticed about new contests! - helpTranslate: Help translate! + showInfo: Participar + contestOver: Esse concurso está encerrado - Entre no discord para ser informado sobre novos concursos! + helpTranslate: Ajude a traduzir! + continue: Continue + newGame: New Game + madeBy: Made by dialogs: buttons: @@ -163,60 +166,60 @@ dialogs: restart: Reiniciar reset: Reset getStandalone: Obter versão completa - deleteGame: Eu sei o que eu faço + deleteGame: Sei o que faço viewUpdate: Atualizações - showUpgrades: Mostrar atualizações + showUpgrades: Ver melhorias showKeybindings: Controles importSavegameError: - title: Erro importante + title: Erro de importação text: >- - Falha ao carregar seu savegame: + Houve uma falha ao importar seu jogo salvo: importSavegameSuccess: - title: Sucesso + title: Jogo salvo importado text: >- - Seu savegame foi importado. + Seu jogo salvo foi importado com sucesso. gameLoadFailure: - title: Jogo esta quebrado + title: Jogo salvo quebrado text: >- - Falha ao carregar seu savegame + Houve uma falha ao carregar seu jogo salvo: confirmSavegameDelete: title: Confirmar exclusão text: >- - Tem certeza que quer excluir esse jogo? + Tem certeza que quer excluir esse jogo salvo? savegameDeletionError: - title: Falha para deletar + title: Falha ao deletar text: >- - Falha ao deletar seu savegame: + Houve uma falha ao deletar seu jogo salvo: restartRequired: - title: Reiniciar + title: Ação necessária text: >- Voce precisa reiniciar o jogo para aplicar as mudanças. editKeybinding: - title: Change Keybinding - desc: Press the key you want to assign, or escape to cancel. + title: Alterar tecla + desc: Pressiona a tecla que deseja vincular, ou ESC para cancelar. resetKeybindingsConfirmation: title: Resetar controles - desc: Essa opção deixa os controles no modo padrão. + desc: Essa opção deixa os controles nas definições padrão. keybindingsResetOk: title: Resetar controles - desc: Os controles foram resetados para o modo padrão. + desc: Os controles foram resetados para as definições padrão. featureRestriction: title: Versão Demo desc: Você tentou acessar um recurso () que não está disponível na demo. Considere obter a versão completa para a proceder! oneSavegameLimit: - title: Save limitado - desc: Você pode ter apenas um savegame por vez na versão demo. Remova o existente ou obtenha a versão completa! + title: Jogo salvo limitado + desc: Você pode ter apenas um jogo salvo por vez na versão demo. Remova o existente ou obtenha a versão completa! updateSummary: title: Nova Atualização! @@ -224,15 +227,15 @@ dialogs: Aqui estão as alterações desde a última vez que você jogou: upgradesIntroduction: - title: Desbloquear updates + title: Desbloquear melhorias desc: >- - Todas as formas que você produz podem ser usadas para desbloquear atualizações - Não destrua suas antigas fábricas!! - O guia de atualizações pode ser encontrada no canto superior direito da tela. + Todas as formas que você produz podem ser usadas para desbloquear melhorias - Não destrua suas antigas fábricas!! + O guia de melhorias pode ser encontrado no canto superior direito da tela. massDeleteConfirm: title: Deletar desc: >- - Voce esta deletando vários itens ( para ser exato)! Voce quer continuar? + Você está deletando vários objetos ( para ser exato)! Você quer continuar? blueprintsNotUnlocked: title: Não desbloqueado ainda @@ -243,30 +246,27 @@ dialogs: title: Teclas úteis desc: >- Este jogo possui muitas combinações de teclas que facilitam a construção de grandes fábricas - Aqui estão alguns mas certifique-se de verificar as combinações de teclas !

- CTRL + Drag: Selecione a área para copiar / delete.
- SHIFT: Mantenha pressionado para colocar vários.
- ALT: Inverter as posições.
+ Aqui estão algumas, certifique-se de verificar as combinações de teclas !

+ CTRL + Arrastar: Seleciona área para copiar / delete.
+ SHIFT: Mantenha pressionado para colocar vária construções.
+ ALT: Inverte as posições.
createMarker: title: Nova Marcação - desc: De um nome + 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! + Você só pode criar dois marcadores na versão demo. Adquira a versão completa para marcadores ilimitados! massCutConfirm: title: Confirm cut desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + Você está cortando vários objetos ( para ser exato)! Você quer continuar? exportScreenshotWarning: - title: Export screenshot + title: Exportar captura de tela 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! + Você está prestes a exportar uma captura de tela da sua base. Note que isso pode ser bastante lento para uma base grande, e até mesmo pode travar o jogo! ingame: # This is shown in the top left corner and displays useful keybindings in @@ -277,14 +277,20 @@ ingame: stopPlacement: Parar rotateBuilding: Rotação placeMultiple: Colocar vários - reverseOrientation: reverso - disableAutoOrientation: desligar orientações - toggleHud: Base - placeBuilding: Colocar construção + reverseOrientation: Inverter orientação + disableAutoOrientation: Desligar orientação automática + toggleHud: Ocultar interface + placeBuilding: Construir objeto createMarker: Criar marcador delete: Destruir - selectBuildings: Select area - pasteLastBlueprint: Paste last blueprint + selectBuildings: Selecionar área + pasteLastBlueprint: Colar último projeto + 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,8 +304,8 @@ ingame: Hotkey: infoTexts: - speed: velocidade - range: distancia + speed: Velocidade + range: Distância storage: Estoque oneItemPerSecond: 1 item / segundo itemsPerSecond: itens / s @@ -310,32 +316,27 @@ ingame: # The notification when completing a level levelCompleteNotification: # is replaced by the actual level, so this gets 'Level 03' for example. - levelTitle: Level + levelTitle: Nível completed: Completado unlockText: Desbloqueado ! - buttonNextLevel: Próximo Level + buttonNextLevel: Próximo Nível # Notifications on the lower right notifications: - newUpgrade: Nova Atualização disponível! - gameSaved: Seu jogo foi Salvo. - - # 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: Nova melhoria disponível! + gameSaved: Seu jogo foi salvo. # The "Upgrades" window shop: - title: Atualizações - buttonUnlock: Atualizações + title: Melhorias + buttonUnlock: Comprar # Gets replaced to e.g. "Tier IX" tier: Nível # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: MAXIMUM LEVEL (Speed x) + maximumLevel: NÍVEL MÁXIMO (Velocidade x) # The "Statistics" window statistics: @@ -353,23 +354,23 @@ ingame: noShapesProduced: Nenhuma forma foi produzida até o momento. # Displays the shapes per minute, e.g. '523 / m' - shapesPerMinute: / m + shapesPerMinute: / m # Settings menu, when you press "ESC" settingsMenu: playtime: Tempo de Jogo buildingsPlaced: Construções - beltsPlaced: Belts + beltsPlaced: Esteiras buttons: - continue: Continue + continue: Continuar settings: Definições menu: Voltar ao menu # Bottom left tutorial hints tutorialHints: - title: Precisa de ajuda? + title: Quer ajuda? showHint: Mostrar dica hideHint: Fechar @@ -399,193 +400,192 @@ ingame: shopUpgrades: belt: name: Esteiras, Distribuidores e Túneis - description: Speed x → x + description: Velocidade x → x miner: name: Extração - description: Speed x → x + description: Velocidade x → x processors: - name: Cortar, Rotacionar e Empilhamento - description: Speed x → x + name: Corte, Rotação e Empilhamento + description: Velocidade x → x painting: - name: Misturador e pintura - description: Speed x → x + name: Mistura de cores e pintura + description: Velocidade x → x # Buildings and their name / description buildings: belt: default: - name: &belt Conveyor Belt - description: Transporta itens, mantenha pressionado e arraste para colocar vários. + name: &belt Esteira Transportadora + description: Transporta itens; mantenha pressionado e arraste para colocar vários. miner: # Internal name for the Extractor default: - name: &miner Extractor + name: &miner Extrator description: Coloque sobre uma forma ou cor para extraí-la. chainable: - name: Extractor (Chain) - description: Coloque sobre uma forma ou cor para extraí-la. Pode ser acorrentado. + name: Extrator em Cadeia + description: Coloque sobre uma forma ou cor para extraí-la. Pode ser ligado a outros extratores. underground_belt: # Internal name for the Tunnel default: - name: &underground_belt Tunnel + name: &underground_belt Túnel description: Permite transportar recursos sob construções. tier2: - name: Tunnel Tier II + name: Túnel Classe II description: Permite transportar recursos sob construções. splitter: # Internal name for the Balancer default: - name: &splitter Balancer - description: Multifunctional - Distribui uniformemente todas as entradas em todas as saídas. + name: &splitter Balanceador + description: Multifuncional - Distribui uniformemente todas as entradas em todas as saídas. compact: - name: Merger (compact) - description: Mescla duas correias transportadoras em uma. + name: Balanceador (compacto) + description: Mescla duas esteiras transportadoras em uma. compact-inverse: - name: Merger (compact) - description: Mescla duas correias transportadoras em uma. + name: Balanceador (compacto) + description: Mescla duas esteiras transportadoras em uma. cutter: default: - name: &cutter Cutter - description: Corta as formas de cima para baixo e produz as duas metades. Se você usar apenas uma parte, não se esqueça de destruir a outra parte, ou ela irá parar a produção! + name: &cutter Cortador + description: Corta as formas verticalmente e produz as duas metades. Se você usar apenas uma parte, não se esqueça de destruir a outra parte, ou ela irá parar a produção! quad: - name: Cutter (Quad) + name: Cortador (Quádruplo) description: Corta as formas em quatro partes. Se você usar apenas uma parte, não se esqueça de destruir as outras, ou ela irá parar a produção! rotater: default: - name: &rotater Rotate + name: &rotater Rotacionador description: Gira as formas no sentido horário em 90 graus. ccw: - name: Rotate (CCW) - description: RGira as formas no sentido anti-horário em 90 graus. + name: Rotacionador (Anti-horário) + description: Gira as formas no sentido anti-horário em 90 graus. stacker: default: - name: &stacker Stacker - description: Empilha os dois itens. Se eles não puderem ser mesclados, o item certo será colocado acima do item esquerdo. + name: &stacker Empilhador + description: Empilha os dois itens. Se eles não puderem ser mesclados, o item direito será colocado acima do item esquerdo. mixer: default: - name: &mixer Color Mixer + name: &mixer Misturador de Cores description: Mistura duas cores usando mistura aditiva. painter: default: - name: &painter Painter - description: Colore a forma inteira na entrada esquerda com a cor da entrada direita. + name: &painter Pintor + description: &painter_desc Colore a forma inteira na entrada esquerda com a cor da entrada direita. double: - name: Painter (Double) + name: Pintor (Duplo) description: Colore as duas formas na entrada esquerda com a cor da entrada direita. quad: - name: Painter (Quad) + name: Pintor (Quádruplo) description: Permite colorir cada quadrante da forma com uma cor diferente. + mirrored: + name: *painter + description: *painter_desc trash: default: name: &trash Lixo - description: Aceita qualquer item e os destrói. PARA SEMPRE + description: Aceita qualquer item e os destrói. PARA SEMPRE. storage: name: Estoque description: Armazena itens em excesso, até uma determinada capacidade. Pode ser usado como uma porta de transbordamento. hub: - deliver: Deliver - toUnlock: to unlock + deliver: Entregue + toUnlock: para desbloquear levelShortcut: LVL storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: - title: Formas de corte - desc: Voce desbloqueou cutter - corte de formas pela metade de cima para baixo independentemente de sua orientação!

Certifique-se de se livrar do lixo, ou então ele irá parar a produção - Para esse propósito, eu lhe dei uma lixo, que destrói tudo o que você coloca nele + title: Cortando formas + desc: Voce desbloqueou cortador - corte de formas pela metade verticalmente independentemente de sua orientação!

Certifique-se de se livrar do lixo, ou então ele irá parar a produção - Para esse propósito, eu lhe dei um lixo, que destrói tudo o que você coloca nele. reward_rotater: - title: Rodando - desc: O rotator foi desbloqueado! Gira as formas no sentido horário em 90 graus + title: Rotação + desc: O rotacionador foi desbloqueado! Gira as formas no sentido horário em 90 graus. reward_painter: - title: Pintando + title: Pintura desc: >- - O pintor foi desbloqueado - Extraia algumas veias coloridas (como você faz com formas) e combine-as com uma forma no pintor para colori-las!

PS: Se você é daltônico , Já estou trabalhando em uma solução! + O pintor foi desbloqueado - Extraia algumas fontes coloridas (como você faz com formas) e combine-as com uma forma no pintor para colorí-las!

PS: Se você é daltônico, já estou trabalhando em uma solução! reward_mixer: - title: Mistura de cores - desc: O misturador foi desbloqueado - combine duas cores usando mistura aditiva com esta construção! + title: Misturando cores + desc: O misturador foi desbloqueado - combine duas cores usando mistura aditiva com esta construção! reward_stacker: - title: Combinador - desc: Agora você pode combinar formas com o combinador ! Ambas as entradas são combinadas e, se puderem ser colocadas próximas uma da outra, serão fundidas . Caso contrário, a entrada direita é empilhada em cima da entrada esquerda! + title: Empilhador + desc: Agora você pode combinar formas com o empilhador! Ambas as entradas são combinadas e, se puderem ser colocadas próximas uma da outra, serão fundidas . Caso contrário, a entrada direita é empilhada em cima da entrada esquerda! reward_splitter: - title: Divisor/fusão - desc: >- - The multifunctional balancer has been unlocked - It can be - used to build bigger factories by splitting and merging items - onto multiple belts!

+ title: Balanceador + desc: O balanceador multifuncional foi desbloqueado - pode ser usado para construir fábricas maiores dividindo e unindo itens em múltiplas esteiras!

reward_tunnel: title: Túnel - desc: O túnel foi desbloqueado - Agora você pode canalizar itens através de construções! + desc: O túnel foi desbloqueado - Agora você pode canalizar itens sob construções! reward_rotater_ccw: - title: CCW Rotação - desc: Você desbloqueou uma variante do rotater - permite girar no sentido anti-horário! Para construí-lo, selecione o rotador e pressione 'T' para alternar suas variantes ! + title: Rotação anti-horária + desc: Você desbloqueou uma variante do rotacionador - permite girar no sentido anti-horário! Para construí-lo, selecione o rotacionador e pressione 'T' para alternar suas variantes! reward_miner_chainable: - title: Extrator de encadeamento - desc: Você desbloqueou o extrator de correntes ! Ele pode encaminhar seus recursos para outros extratores, para que você possa extrair recursos com mais eficiência! + title: Extrator em Cadeia + desc: Você desbloqueou o extrator em cadeia! Ele pode encaminhar seus recursos para outros extratores, para que você possa extrair recursos com mais eficiência! reward_underground_belt_tier_2: - title: Túnel Tier II - desc: Você desbloqueou uma nova variante do túnel - ele tem um maior alcance , e também pode misturar e combinar esses túneis agora! + title: Túnel Classe II + desc: Você desbloqueou uma nova variante do túnel - ele tem um maior alcance, e também pode atravessar outros túneis na mesma linha! reward_splitter_compact: title: Balanceador compacto - desc: >- - Você desbloqueou uma variante compacta do balanceador - ele aceita duas entradas e as mescla em uma! + desc: Você desbloqueou uma variante compacta do balanceador - ele aceita duas entradas e as mescla em uma! reward_cutter_quad: title: Cortador quádruplo - desc: Você desbloqueou uma variante do cortador - permite cortar formas em quatro partes em vez de apenas duas! + desc: Você desbloqueou uma variante do cortador - permite cortar formas em quatro partes em vez de apenas duas! reward_painter_double: title: Pintura dupla - desc: Você desbloqueou uma variante do pintor - funciona como o pintor regular, mas processa duas formas ao mesmo tempo , consumindo apenas uma cor em vez de duas! + desc: Você desbloqueou uma variante do pintor - funciona como o pintor regular, mas processa duas formas ao mesmo tempo , consumindo apenas uma cor em vez de duas! reward_painter_quad: - title: Pintura quádupla - desc: Você desbloqueou uma variante do pintor - permite pintar cada parte da forma individualmente! + title: Pintura quádrupla + desc: Você desbloqueou uma variante do pintor - permite pintar cada parte da forma individualmente! reward_storage: - title: buffer de armazenamento - desc: Você desbloqueou uma variante do lixo - Permite armazenar itens até uma determinada capacidade! + title: Acúmulo de excesso + desc: Você desbloqueou uma variante do lixo - Permite armazenar itens até uma determinada capacidade! reward_freeplay: title: Modo Livre - desc: Você fez isso! Você desbloqueou o modo de jogo livre ! Isso significa que as formas agora são geradas aleatoriamente! (Não se preocupe, mais conteúdo está planejado para o jogo completo!) + desc: Você conseguiu! Você desbloqueou o modo de jogo livre! Isso significa que as formas agora são geradas aleatoriamente! (Não se preocupe, mais conteúdo está planejado para o jogo completo!) reward_blueprints: title: Projetos - desc: Agora você pode copiar e colar partes de sua fábrica! Selecione uma área (mantenha pressionada a tecla CTRL e arraste com o mouse) e pressione 'C' para copiá-la.

Colar não é de graça , é necessário produzir projetos e formas para pagar! (Aqueles que você acabou de entregar). + desc: Agora você pode copiar e colar partes de sua fábrica! Selecione uma área (mantenha pressionada a tecla CTRL e arraste com o mouse) e pressione 'C' para copiá-la.

Colar não é de graça, é necessário produzir formas de projeto para pagar! (Aquelas que você acabou de entregar). # Special reward, which is shown when there is no reward actually no_reward: - title: Próximo level + title: Próximo nível desc: >- - Este nível não lhe deu nenhuma recompensa, mas em breve?!

PS: Melhor não destruir sua fábrica existente - Você precisa de todas todas essas formas posteriormente mais tarde para desbloquear atualizações ! + Este nível não lhe deu nenhuma recompensa, mas em breve?!

PS: Melhor não destruir sua fábrica existente - Você precisa de todas essas formas posteriormente mais tarde para desbloquear atualizações! no_reward_freeplay: - title: Next level + title: Próximo nível desc: >- - Parabens, não se esqueça existe muita coisa planejada para essa versão. + Parabéns! Não se esqueça, existe muita coisa planejada para a versão completa. settings: title: opções @@ -603,7 +603,7 @@ settings: uiScale: title: Fonte description: >- - Altera o tamanho da fonte do usuário. A interface ainda será dimensionada com base na resolução do dispositivo, mas essa configuração controla a quantidade de escala. + Altera o tamanho da fonte do usuário. A interface ainda será dimensionada com base na resolução do dispositivo, mas essa configuração controla a escala do texto. scales: super_small: Super pequeno small: Pequeno @@ -614,7 +614,7 @@ settings: scrollWheelSensitivity: title: Sensibilidade do zoom description: >- - Altera a sensibilidade do zoom (scrol do mouse ou touchpad). + Altera a sensibilidade do zoom (roda do mouse ou touchpad). sensitivity: super_slow: Super lento slow: Lento @@ -623,33 +623,33 @@ settings: super_fast: Super Rápido fullscreen: - title: Tecla Cheia + title: Tela Cheia description: >- - É recomendável jogar o jogo em tela cheia para obter a melhor experiência. Disponível apenas na versão completa. + É recomendado jogar o jogo em tela cheia para obter a melhor experiência. Disponível apenas na versão completa. soundsMuted: title: Som description: >- - Se ligado o jogo fica Mudo. + Se ligado o jogo fica mudo musicMuted: title: Musica description: >- - Se ligado a musica é desligada. + Se ligado, a musica fica muda. theme: title: Tema description: >- - Escolha o tema entre (Branco / Preto). + Escolha o tema entre (Claro / Escuro). themes: - dark: Dark - light: Light + dark: Escuro + light: Claro refreshRate: - title: Frequencia + title: Frequência description: >- - Se você possui um monitor de 144 hz, altere a taxa de atualização aqui para que o jogo seja simulado corretamente com taxas de atualização mais altas. Isso pode realmente diminuir o FPS se o computador estiver muito lento. + Se você possui um monitor de 144 hz, altere a taxa de atualização aqui para que o jogo seja simulado corretamente com taxas de atualização mais altas. Isso diminuir o FPS consideravelmente se o computador for muito lento. alwaysMultiplace: title: Multiplicidade @@ -659,40 +659,72 @@ settings: offerHints: title: Dicas e tutoriais description: >- - Se deve oferecer dicas e tutoriais enquanto estiver jogando.v. + Se serão oferecidas dicas e tutoriais enquanto estiver jogando. language: - title: Language + title: Idioma description: >- - Change the language. All translations are user contributed and might be - incomplete! + Altera o idioma. Todas as traduções são contribuições de usuários e podem estar incompletas! movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Velocidade da câmera + description: Altera a velocidade com que a câmera se move com o teclado. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Super Lento + slow: Lento + regular: Normal + fast: Rápido + super_fast: Super Rápido + extremely_fast: Extremamente Rápido + 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: Comandos + title: Controles hint: >- - Tip: Certifique-se de usar CTRL, SHIFT e ALT! Eles permitem diferentes opções de veiculação. + Tip: Certifique-se de usar CTRL, SHIFT e ALT! Eles permitem diferentes opções de construção. - resetKeybindings: Reset Keyinbindings + resetKeybindings: Resetar Controles categoryLabels: general: Geral ingame: Jogo navigation: Navegação - placement: Posicionamento + placement: Construção massSelect: Seleção - buildings: Construções - placementModifiers: Modificações + buildings: Atalhos de objetos + placementModifiers: Modificadores mappings: confirm: Confirmar @@ -701,16 +733,16 @@ keybindings: mapMoveRight: Mover para direita mapMoveDown: Mover para baixo mapMoveLeft: Mover para a esquerda - centerMap: Centralizar + centerMap: Centralizar mapa mapZoomIn: Aproximar mapZoomOut: Distanciar createMarker: Criar marcação - menuOpenShop: Atualizações + menuOpenShop: Melhorias menuOpenStats: Estatísticas - toggleHud: Ocultar Menu + toggleHud: Ocultar Interface toggleFPSInfo: Mostar FPS belt: *belt splitter: *splitter @@ -723,54 +755,57 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Cancelar rotateWhilePlacing: Rotacionar rotateInverseModifier: >- - Modifier: Rotação instantanea + Modifier: Rotação anti-horária cycleBuildingVariants: Variações confirmMassDelete: Confirmar exclusão em massa cycleBuildings: Trocar de construção massSelectStart: Segure e arraste para começar - massSelectSelectMultiple: Selecionar área + massSelectSelectMultiple: Selecionar mais áreas massSelectCopy: Copiar área - placementDisableAutoOrientation: Desligar orientações automaticas - placeMultiple: Permanecer no modo de produção + placementDisableAutoOrientation: Desligar orientação automática + placeMultiple: Permanecer no modo de construção placeInverse: Inverter orientação de esteira - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + pasteLastBlueprint: Colar último projeto + massSelectCut: Cortar área + exportScreenshot: Exportar base inteira como imagem + mapMoveFaster: Move Faster + lockBeltDirection: Enable belt planner + switchDirectionLockSide: "Planner: Switch side" + pipette: Pipette about: title: Sobre o jogo body: >- - This game is open source and developed by Tobias Springer (this is me).

+ Esse jogo tem código aberto e é desenvolvido por Tobias Springer (esse sou eu).

- If you want to contribute, check out shapez.io on github.

+ Se quiser contribuir, confira shapez.io no github.

- This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server!

+ O jogo não seria possível sem a comunidade incrível do discord sobre + os meus jogos - Junte-se à comunidade no servidor do discord!

- The soundtrack was made by Peppsen - He's awesome.

+ A trilha sonora foi feita por Peppsen - Ele é demais.

- Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Finalmente, agradeço muito ao meu melhor amigo + Niklas - Sem nossas sessões de Factorio, + esse jogo nunca teria existido. changelog: title: Changelog demo: features: - restoringGames: Restaurando jogos salvos - importingGames: Carregando jogos salvos - oneGameLimit: Limitado para um savegamne - customizeKeybindings: Modificando Teclas - exportingBase: Exporting whole Base as Image + restoringGames: Restaurar jogos salvos + importingGames: Carregar jogos salvos + oneGameLimit: Limitado para um jogo salvo + customizeKeybindings: Modificar Teclas + exportingBase: Exportar base inteira como imagem settingNotAvailable: Não disponível na versão demo. diff --git a/translations/base-pt-PT.yaml b/translations/base-pt-PT.yaml index 71c44a20..b11e1bf2 100644 --- a/translations/base-pt-PT.yaml +++ b/translations/base-pt-PT.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io é um jogo cujo objetivo é construir fábricas para automatizar a criação e combinação de formas geométricas cada vez mais complexas num mapa infinito. + shortText: shapez.io é um jogo cujo objetivo é construir fábricas para automatizar a criação e fusão de formas geométricas cada vez mais complexas num mapa infinito. # 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,9 +30,9 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io é um jogo cujo objetivo é construir fábricas para automatizar a criação e combinação de formas geométricas. Entrega as formas cada vez mais complexas que são pedidas de forma a progredir no jogo e desbloquear melhorias para acelerar a produção da tua fábrica + shapez.io é um jogo cujo objetivo é construir fábricas para automatizar a criação e fusão de formas geométricas. Entrega as formas pedidas, que são cada vez mais complexas, de modo a progredir no jogo e desbloquear melhorias para acelerar a produção da tua fábrica - Uma vez que a procura aumenta a cada nível, terás de aumentar a tua fábrica para fazer face às necessidades - Para isso, terás de expandir no [b]mapa infinito[/b] para explorar todos os recursos! + Uma vez que a procura aumenta a cada nível, terás de aumentar a tua fábrica para fazer face às necessidades - Para isso, terás de te expandir no [b]mapa infinito[/b] para explorar todos os recursos! Como produzir formas se tornará aborrecido rapidamente, não tardará até precisares de misturar cores e pintá-las com elas - Combina os recursos de cores vermelha, verde e azul para produzir diferentes cores e usá-las para pintar as formas geométricas com o intuito de satisfazer a procura. @@ -47,7 +47,7 @@ steamPage: [*] Modo escuro [*] Mais definições [*] Possibilita-me desenvolver ainda mais o shapez.io ❤️ - [*] Mais conteúdo no futuro + [*] Mais conteúdo no futuro! [/list] [b]Conteúdo planeado & Sugestões da comunidade[/b] @@ -98,7 +98,7 @@ global: # Short formats for times, e.g. '5h 23m' secondsShort: s minutesAndSecondsShort: m s - hoursAndMinutesShort: h s + hoursAndMinutesShort: h m xMinutes: minutos @@ -126,7 +126,7 @@ mainMenu: # This is shown when using firefox and other browsers which are not supported. browserWarning: >- - Desculpa, mas este jogo parece correr mais lentamente no teu navegador! Compra o jogo completo ou baixa o chrome para a melhor experiência. + Desculpa, mas este jogo parece correr mais lentamente no teu navegador! Compra o jogo completo ou baixa o chrome para a melhorares a tua experiência. savegameLevel: Nível savegameLevelUnknown: Nível desconhecido @@ -142,9 +142,9 @@ mainMenu:

Como fazer:
    -
  • Envia um screenshot da tua base para contest@shapez.io
  • +
  • Envia uma captura de ecrã da tua base para contest@shapez.io
  • Bónus se o partilhares nas redes sociais!
  • -
  • Eu escolherei 5 screenshots e propô-los-ei à comunidade do discord para votar.
  • +
  • Eu irei escolher 5 capturas de ecrã e propô-las-ei à comunidade do discord para votar.
  • O vencedor ganha $25 (Paypal, Amazon Gift Card, ou o que preferires)
  • Prazo: 07.06.2020 12:00 AM CEST
@@ -153,6 +153,9 @@ mainMenu: showInfo: Ver contestOver: Este concurso terminou - Entra no discord para seres notificado quando abrirem novos concursos! + continue: Continuar + newGame: Novo Jogo + madeBy: Criado por dialogs: buttons: @@ -166,7 +169,7 @@ dialogs: deleteGame: Eu sei o que faço viewUpdate: Ver Update showUpgrades: Mostrar Upgrades - showKeybindings: Mostrar Controlos + showKeybindings: Mostrar Atalhos importSavegameError: title: Erro de importação @@ -196,27 +199,27 @@ dialogs: restartRequired: title: Necessário reiniciar text: >- - Deves reiniciar o jogo para aplicar as mudanças. + Precisas de reiniciar o jogo para aplicar as mudanças. editKeybinding: - title: Mudar Keybinding + title: Mudar Atalhos desc: Pressiona a tecla ou botão do rato que pretendes definir, ou Escape para cancelar. resetKeybindingsConfirmation: - title: Resetar Keybindings - desc: Isto resetará todos os keybindings para os seus valores pré-definidos. Confirma por favor. + title: Resetar Atalhos + desc: Isto irá resetar todos os Atalhos para os seus valores pré-definidos. Confirma por favor. keybindingsResetOk: - title: Keybindings resetados - desc: Os keybindings foram resetados para os respetivos valores pré-definidos! + title: Atalhos resetados + desc: Os Atalhos foram resetados para os respetivos valores pré-definidos! featureRestriction: title: Versão Demo - desc: Tentaste aceder a uma funcionalidade () que não está disponivel no Demo. Considera adquirir o jogo completo para a melhor experiência! + desc: Tentaste aceder a uma funcionalidade () que não está disponivel no Demo. Considera adquirir o jogo completo para a melhor experiência do jogo! oneSavegameLimit: title: Savegames limitados - desc: Podes ter apenas um savegame de cada vez na versão Demo. Por favor remove o savegame existente ou adquire a versão completa! + desc: Apenas podes ter um savegame de cada vez na versão Demo. Por favor remove o savegame existente ou adquire a versão completa! updateSummary: title: Nova atualização! @@ -235,36 +238,35 @@ dialogs: Estás a apagar muitas construções ( para ser exato)! Tens a certeza? blueprintsNotUnlocked: - title: Não desbloqueado ainda + title: Ainda não está desbloqueado desc: >- Os Projetos ainda não foram desbloqueados! Completa mais níveis para os desbloquear. keybindingsIntroduction: - title: Keybindings úteis + title: Atalhos úteis desc: >- - Este jogo tem vários keybindings que tornarão mais fácil a construção de grandes fábricas. - Aqui estão alguns, mas verifica as restantes keybindings!

+ Este jogo tem vários Atalhos que tornarão mais fácil a construção de grandes fábricas. + Aqui estão alguns, mas verifica os restantes Atalhos!

CTRL + Drag: Seleciona a área para copiar / eliminar.
SHIFT: Mantém pressionado para colocar várias construções.
ALT: Inverte as posições.
createMarker: title: Novo marco - desc: Dá-lhe um nome com significado + desc: Dá-lhe um nome com significado, também poderás adicionar um pequeno código de uma forma. (Pode ser gerado aqui) markerDemoLimit: desc: Apenas podes criar dois marcos na versão Demo. Adquire o jogo completo para colocar marcos infinitos! massCutConfirm: - title: Confirm cut + title: Confirmar corte desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you - want to do this? + Estás a cortar muitas construções ( para ser exato)! Tens a certeza? exportScreenshotWarning: - title: Export screenshot + title: Exportar captura de ecrã 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! + Tu estás a pedir pra exportar a tua base como uma captura de ecrã. Por favor tem em atenção que isto pode + ser um pouco lento para uma base muito grande até mesmo bloquear o teu jogo! ingame: # This is shown in the top left corner and displays useful keybindings in @@ -272,8 +274,8 @@ ingame: keybindingsOverlay: moveMap: Mover selectBuildings: Selecionar área - stopPlacement: Parar - rotateBuilding: Rodar + stopPlacement: Cancelar + rotateBuilding: Rodar construção placeMultiple: Colocar vários reverseOrientation: Reverter orientação disableAutoOrientation: Desligar orientação automática @@ -281,7 +283,13 @@ ingame: placeBuilding: Colocar construção createMarker: Criar marco delete: Destruir - pasteLastBlueprint: Paste last blueprint + pasteLastBlueprint: Colar o último blueprint + lockBeltDirection: Ativa o planeamento de tapetes + plannerSwitchSide: Lado de rotação do planeamento + 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) @@ -292,14 +300,14 @@ ingame: # Shows the hotkey in the ui, e.g. "Hotkey: Q" hotkeyLabel: >- - Hotkey: + Atalho: infoTexts: speed: Velocidade range: Alcance storage: Armazenamento oneItemPerSecond: 1 item / segundo - itemsPerSecond: items / s + itemsPerSecond: itens / s itemsPerSecondDouble: (x2) tiles: telas @@ -317,11 +325,6 @@ ingame: newUpgrade: Está disponível um novo upgrade! gameSaved: O teu jogo foi gravado. - # 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 @@ -391,7 +394,7 @@ ingame: Liga o extrator a um tapete rolante em direção ao Edifício Central!

Dica: Clica e arrasta o tapete com o rato! 1_3_expand: >- - Isto NÃO é um idle game! Constrói mais extratores e tapetes para atingir o objetivo mais rapidamente.

Dica: Pressiona SHIFT para colocar vários extratores, e usa R para os rodar. + Isto NÃO é um jogo idle! Constrói mais extratores e tapetes para atingir o objetivo mais rapidamente.

Dica: Pressiona SHIFT para colocar vários extratores, e usa R para os rodar. # All shop upgrades shopUpgrades: @@ -413,7 +416,7 @@ buildings: belt: default: name: &belt Tapete Rolante - description: Transporta items, mantém pressionado e arrasta para colocar vários. + description: Transporta items. Mantém pressionado e arrasta para colocar vários. miner: # Internal name for the Extractor default: @@ -436,23 +439,23 @@ buildings: splitter: # Internal name for the Balancer default: name: &splitter Distribuidor - description: Multifunções - Distribui igualmente todos os inputs por todos os outputs. + description: Multifunções - Distribui igualmente todas as entradas por todas as saídas. compact: - name: Misturador (compacto) - description: Junta dois tapetes rolantes num só. + name: Misturador (Comp.) + description: O Misturador Compacto é uma variante do distibruidor. Junta dois tapetes rolantes num só. compact-inverse: - name: Misturador (compacto) - description: Junta dois tapetes rolantes num só. + name: Misturador (Comp.) + description: O Misturador Compacto é uma variante do distibruidor. Junta dois tapetes rolantes num só. cutter: default: name: &cutter Cortador - description: Corta formas geométricas de cima para baixo e produz duas metades. Se apenas usares uma parte, certifica-te de que destrois a outra parte de forma a não encravar a produção! + description: Corta as formas geométricas de cima para baixo e produz duas metades. Se apenas usares uma parte, certifica-te de que destrois a outra parte de forma a não encravar a produção! quad: name: Cortador (Quádruplo) - description: Corta formas geométricas de cima para baixo e produz duas metades. Se apenas usares uma parte, certifica-te de que destrois a outra parte de forma a não encravar a produção! + description: Corta as formas geométricas em quatro partes. Se apenas usares uma parte, certifica-te de que destrois as outras partes de forma a não encravar a produção! rotater: default: @@ -465,32 +468,35 @@ buildings: stacker: default: name: &stacker Empilhador - description: Empilha os dois inputs. Se não podem ser empilhados, o item da direita será colocado em cima do item da esquerda. + description: Empilha dois itens. Se não podem ser empilhados, o item da direita será colocado em cima do item da esquerda. mixer: default: - name: &mixer Misturador de cores + name: &mixer Misturador de cor description: Mistura duas cores através de mistura aditiva. painter: default: name: &painter Pintor - description: Pinta a forma geométrica do input esquerdo com a cor do input direito. + description: &painter_desc Pinta a forma geométrica da entrada esquerda com a cor da entrada superior. double: name: Pintor (Duplo) - description: Pinta as formas geométricas dos inputs esquerdos com a cor do input superior. + description: Pinta as formas geométricas das entradas esquerdas com a cor da entrada superior. quad: name: Pintor (Quádruplo) description: Pinta cada quadrante da forma geométrica com uma cor diferente. + mirrored: + name: *painter + description: *painter_desc trash: default: name: &trash Lixo - description: Aceita inputs de todos os lados e destrói-os. Para sempre. + description: Aceita entradas de todos os lados e destrói-os. Para sempre. storage: name: Armazém - description: Armazena items em excesso até uma determinada capacidade. Pode ser usado como uma porta de transbordamento. + description: Armazena items em excesso até uma determinada capacidade. Pode ser usado como uma porta de transbordo. hub: deliver: Entrega toUnlock: para desbloquear @@ -500,7 +506,7 @@ storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: title: Corte de formas - desc: Acabaste de desbloquear o Cortador - ele corta as formas geométricas ao meio de cima para baixo independentemente da orientação!

Certifica-te de que te livras do desperdício, caso contrário empancará - Para isso, dou-te um lixo, que destruirá tudo o que lá colocares! + desc: Acabaste de desbloquear o Cortador - ele corta as formas geométricas ao meio de cima para baixo independentemente da orientação!

Certifica-te de que te livras do desperdício, caso contrário encravará - Para isso, dou-te um lixo, que destruirá tudo o que lá colocares! reward_rotater: title: Rotação @@ -509,15 +515,15 @@ storyRewards: reward_painter: title: Pintura desc: >- - O Pintor foi desbloqueado - Extrai alguns veios coloridos (tal como fazes com as formas) e combina-os com uma forma no pintor para a colorir!

PS: Se fores daltónico, já estou a trabalhar para encontrar uma solução! + O Pintor foi desbloqueado - Extrai alguns pigmentos coloridos (tal como fazes com as formas) e combina-os com uma forma no pintor para a colorir!

PS: Se fores daltónico, já estou a trabalhar para encontrar uma solução! reward_mixer: title: Mistura de Cores desc: O Misturador foi desbloqueado - Combina duas cores através de mistura aditiva com esta construção! reward_stacker: - title: Empilhar - desc: Agora podes combinar formas geométricas com o Combinador! Ambos os inputs são combinados e, se puderem ser colocados lado-a-lado, serão fundidos. Caso contrário, o input da direita é empilhado em cima do da esquerda! + title: Combinador + desc: Agora podes combinar formas geométricas com o Combinador! Ambas as entradas são combinados e, se puderem ser colocados lado-a-lado, serão fundidas. Caso contrário, a entrada da direita é empilhada em cima da da esquerda! reward_splitter: title: Distribuidor/Misturador @@ -525,7 +531,7 @@ storyRewards: reward_tunnel: title: Túnel - desc: O Túnel foi desbloqueado - Com ele podes passar items através de tapetes e construções! + desc: O Túnel foi desbloqueado - Com ele podes passar itens através de tapetes e construções! reward_rotater_ccw: title: Rotação CCW @@ -540,9 +546,9 @@ storyRewards: desc: Desbloqueaste uma nova variante do Túnel - Tem um maior alcance, e podes interlaçar as duas variantes entre si! reward_splitter_compact: - title: Distribuição + title: Distribuidor compacto desc: >- - Desbloqueaste uma variante compacta do Distribuidor - Aceita dois inputs e junta-os num só! + Desbloqueaste uma variante compacta do Distribuidor - Aceita duas entradas e junta-as numa só! reward_cutter_quad: title: Corte quádruplo @@ -566,7 +572,7 @@ storyRewards: reward_blueprints: title: Projetos - desc: Agora podes copiar e colar partes da tua fábrica! Seleciona uma área (Prime CTRL e arrasta com o rato), e prime 'C' para copiar.

Colar não é gratuito, precisas de produzir formas projeto para o pagares! (Aquelas que acabaste de entregar). + desc: Agora podes copiar e colar partes da tua fábrica! Seleciona uma área (Mantém pressionado CTRL e arrasta com o rato), e pressiona 'C' para copiar.

Colar não é gratuito, precisas de produzir formas projeto para o pagares! (Aquelas que acabaste de entregar). # Special reward, which is shown when there is no reward actually no_reward: @@ -625,12 +631,12 @@ settings: É recomendado jogar o jogo em ecrã inteiro para a melhor experiência. Apenas disponível no jogo completo. soundsMuted: - title: Mutar sons + title: Desativar sons description: >- Se ativado, desativa todos os sons. musicMuted: - title: Mutar música + title: Desativar música description: >- Se ativado, desativa todas as músicas. @@ -659,31 +665,64 @@ settings: Se ativado, dá dicas e tutoriais de apoio ao jogo. Adicionalmente, esconde certos elementos da interface do utilizador até ao nível em que são desbloqueados de forma a simplificar o início do jogo. movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Velociade de movimentação + description: Define quão rápida é a movimentação usando o teclado. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Muito lenta + slow: Lenta + regular: Média + fast: Rápiada + super_fast: Muito rádida + extremely_fast: Extremamente rápida + enableTunnelSmartplace: + title: Túneis inteligentes + description: >- + Quando ativo, a colocação de túneis removerá tapetes desnecessários automaticamente. + Isto também permite arrastar túneis e túneis supérfluos serão removidos. + vignette: + title: Vinheta + description: >- + Ativa a vinheta, que escurece os cantos do ecrã e torna a leitura do texto + mais fácil. + + 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 + title: Atalhos hint: >- - Tip: Utiliza o CTRL, o SHIFT e o ALT! Eles permitem diferentes opções de colocação. + Tip: Utiliza o CTRL, o SHIFT e o ALT! Eles permitem diferentes opções de posicionamento. - resetKeybindings: Resetar Keybindings + resetKeybindings: Resetar Atalhos categoryLabels: general: Aplicação ingame: Jogo navigation: Navegação - placement: Colocação + placement: Posicionamento massSelect: Seleção em massa buildings: Atalhos de construções - placementModifiers: Modificadores de colocação + placementModifiers: Modificadores de posicionamento mappings: confirm: Confirmar @@ -714,7 +753,6 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Cancelar rotateWhilePlacing: Rotação rotateInverseModifier: >- Modifier: Rotação CCW @@ -729,28 +767,32 @@ keybindings: placementDisableAutoOrientation: Desativa orientação automática placeMultiple: Continuar no modo de colocação placeInverse: Inverter orientação automática do tapete - pasteLastBlueprint: Paste last blueprint - massSelectCut: Cut area - exportScreenshot: Export whole Base as Image + pasteLastBlueprint: Colar o último blueprint + massSelectCut: Cortar área + exportScreenshot: Exportar a base como uma imagem + mapMoveFaster: Mover rapidamente + lockBeltDirection: Ativa o planeamento de tapetes + switchDirectionLockSide: "Planeador: Troca o lado" + pipette: Pipette about: title: Sobre o jogo body: >- - This game is open source and developed by Tobias Springer (this is me).

+ Este jogo é código aberto e desenvolvido por Tobias Springer (este sou eu).

- If you want to contribute, check out shapez.io on github.

+ Se quiseres contribuir, dá uma olhadela em shapez.io no github.

- This game wouldn't have been possible without the great discord community - around my games - You should really join the discord server!

+ Este Jogo não seria possível sem a excelente comunidade do discord + em torno dos meus jogos - Devias mesmo juntar-te ao servidor no discord!

- The soundtrack was made by Peppsen - He's awesome.

+ A banda sonora foi feita por Peppsen - Ele é Fantástico.

- Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Finalmente, um grande agradecimento ao meu melhor amigo Niklas - Sem as nossas + sessões de factorio este jogo nunca teria existido. changelog: title: Changelog @@ -760,7 +802,7 @@ demo: restoringGames: Restauro de savegames importingGames: Importação de savegames oneGameLimit: Limitado a um savegame - customizeKeybindings: Costumizar Keybindings - exportingBase: Exporting whole Base as Image + customizeKeybindings: Costumizar Atalhos + exportingBase: Exportar base como uma imagem settingNotAvailable: Não disponível no Demo. diff --git a/translations/base-ro.yaml b/translations/base-ro.yaml index 1eeadd47..e383ce2c 100644 --- a/translations/base-ro.yaml +++ b/translations/base-ro.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: @@ -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: About this Game diff --git a/translations/base-ru.yaml b/translations/base-ru.yaml index 78cf8574..53c83519 100644 --- a/translations/base-ru.yaml +++ b/translations/base-ru.yaml @@ -21,7 +21,7 @@ steamPage: # This is the short text appearing on the steam page - shortText: shapez.io это игра о строительстве фабрик для автоматизации создания и объединения все более сложных фигур на бесконечной карте. + 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,13 +30,13 @@ steamPage: longText: >- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img] - shapez.io это игра о строительстве фабрик для автоматизации создания и объединения фигур. Доставляйте запрошенные, все более сложные фигуры, чтобы развиваться в игре и разблокировать улучшения, чтобы ускорить работу вашей фабрики. + shapez.io — это игра о строительстве фабрик для автоматизации создания и объединения фигур. Доставляйте запрошенные, все более сложные фигуры, чтобы развиваться в игре и разблокировать улучшения, чтобы ускорить работу вашей фабрики. Поскольку спрос растет, вам придется увеличивать свою фабрику, чтобы соответствовать потребностям. Однако, не забывайте о ресурсах, несмотря на то что вы будете расширятся на [b]бесконечной карте[/b]! - Поскольку фигуры вскоре могут наскучить, вам потребуется смешивать цвета и рискрашивать свои фигуры ими. Комбинируйте красный, зеленый и синий цветовые ресурсы для получения разных цветов и красте ими фигуры, чтобы удовлетворить спрос. + Поскольку фигуры вскоре могут наскучить, вам потребуется смешивать цвета и раскрашивать свои фигуры ими. Комбинируйте красный, зеленый и синий красители для получения разных цветов и красте ими фигуры, чтобы удовлетворить спрос. - Эта игра имеет 18 уровней (но и они займут вас на часы!), но я постоянно добавляю новый контент - там много чего запланировано! + Эта игра имеет 18 уровней (но и они займут вас на часы!). Я постоянно добавляю новый контент - там много чего запланировано! [b]Преимущества полной версии[/b] @@ -52,7 +52,7 @@ steamPage: [b]Планируемые функции & Предложения сообщества[/b] - Это игра с открытым исходным кодом - Любой может внести свой вклад! Кроме того, я во [b]многом[/b] прислушиваюсь к сообществу! Я стараюсь прочитать все предложения и учту как можно больше отзывов. + Это игра с открытым исходным кодом - любой может внести свой вклад! Кроме того, я во [b]многом[/b] прислушиваюсь к сообществу! Я стараюсь прочитать все предложения и учту как можно больше отзывов. [list] [*] Режим истории, где здания стоят фигур @@ -76,13 +76,13 @@ global: # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: - thousands: тыс. - millions: млн - billions: млрд - trillions: трлн + thousands: k + millions: M + billions: B + trillions: T # Shown for infinitely big numbers - infinite: inf + infinite: ∞ time: # Used for formatting past time dates @@ -98,9 +98,9 @@ global: # Short formats for times, e.g. '5h 23m' secondsShort: с minutesAndSecondsShort: м с - hoursAndMinutesShort: м с + hoursAndMinutesShort: ч м - xMinutes: minutes + xMinutes: мин. keys: tab: TAB @@ -112,14 +112,15 @@ global: demoBanners: # This is the "advertisement" shown in the main menu and other various places - title: Демо версия + title: Демо-версия intro: >- - Приобретите полную версию чтобы разблокировать все возможности! + Приобретите полную версию, чтобы + разблокировать все возможности! mainMenu: play: Играть changelog: Список изменений - importSavegame: Импортировать сохраненную игру + importSavegame: Импорт openSourceHint: Это игра с открытым исходным кодом! discordLink: Оффициальный Дискорд Сервер helpTranslate: Помоги с переводом! @@ -133,26 +134,29 @@ mainMenu: contests: contest_01_03062020: - title: "Contest #01" - desc: Win $25 for the coolest base! + title: "Конкурс №01" + desc: Выиграй $25 за лучшую базу! 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
  • +
  • Отправить скриншот вашей базы сюда: contest@shapez.io
  • +
  • Бонусные баллы, если вы поделитесь этим в социальных сетях!
  • +
  • Я выберу 5 скриншотов и предложу сообществу в дискорде проголосовать.
  • +
  • Победитель получит $25 (Paypal, Amazon Gift Card, что вы предпочитаете)
  • +
  • Крайний срок: 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! + showInfo: Посмотреть + contestOver: Этот конкурс закончился - присоединяйтесь в дискорде, чтобы получать уведомления о новых конкурсах! + continue: Продолжить + newGame: Новая Игра + madeBy: Создал dialogs: buttons: @@ -171,27 +175,27 @@ dialogs: importSavegameError: title: Ошибка импортирования text: >- - Не удалось импортировать ваше сохранение игры: + Не удалось импортировать сохранение игры. importSavegameSuccess: - title: Сохраненная игра импортированна + title: Сохранение игры импортировано text: >- - Ваша сохраненная игра успешно импортированна. + Сохранение игры успешно импортировано. gameLoadFailure: title: Ошибка загрузки text: >- - Не удалось загрузить ваше сохранение игры: + Не удалось загрузить сохранение игры. confirmSavegameDelete: title: Подтвердите удаление. text: >- - Вы действительно хотите удалить игру? + Вы действительно хотите удалить сохранение игры? savegameDeletionError: title: Ошибка удаления text: >- - Не удалось удалить сохранение игры: + Не удалось удалить сохранение игры. restartRequired: title: Необходим перезапуск @@ -211,8 +215,8 @@ dialogs: desc: Настройки управления сброшены до соответствующих значений по умолчанию! featureRestriction: - title: Демо версия - desc: Вы попытались получить доступ к функции (), которая недоступна в демоверсии. Вы можете приобрести полную версию чтобы пользоваться всеми функциями! + title: Демо-версия + desc: Вы попытались получить доступ к функции (), которая недоступна в демо-версии. Вы можете приобрести полную версию чтобы пользоваться всеми функциями! oneSavegameLimit: title: Лимит сохранений @@ -224,15 +228,15 @@ dialogs: Здесь изменения с тех пор, когда вы в последний раз играли: upgradesIntroduction: - title: Открыть улучшения + 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: Подтвердить удаление desc: >- - Вы удаляете много построек ()! Вы действительно хотите сделать это? + Вы удаляете много построек (точнее: )! Вы действительно хотите сделать это? blueprintsNotUnlocked: title: Еще не открыто @@ -250,21 +254,22 @@ dialogs: createMarker: title: Новый маркер - desc: Напишите содержательное имя. + desc: Дайте ему содержательное имя, также можно добавить сокращение в виде фигуры (Которое можно сгенерировать здесь) markerDemoLimit: - desc: Вы можете создать только 2 своих маркера в демо версии. Приобретите полную версию для безлимитных маркеров. + 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 @@ -280,8 +285,14 @@ ingame: toggleHud: Переключить HUD placeBuilding: Разместить постройку createMarker: Создать маркер - delete: Уничтожить - pasteLastBlueprint: Paste last blueprint + 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) @@ -297,9 +308,9 @@ ingame: infoTexts: speed: Скорость range: Расстояние - storage: Storage - oneItemPerSecond: 1 предмет / сек - itemsPerSecond: предметов / сек + storage: Хранилище + oneItemPerSecond: 1 пред. / сек. + itemsPerSecond: пред. / сек. itemsPerSecondDouble: (x2) tiles: клеток @@ -315,12 +326,7 @@ ingame: # Notifications on the lower right notifications: newUpgrade: Новое улучшение доступно! - gameSaved: Ваша игра была сохранена. - - # 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. + gameSaved: Игра сохранена. # The "Upgrades" window shop: @@ -333,7 +339,7 @@ ingame: # The roman number for each tier tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X] - maximumLevel: МАКСИМАЛЬНЫЙ УРОВЕНЬ (Скорость x) + maximumLevel: Скорость x (макс.) # The "Statistics" window statistics: @@ -341,17 +347,17 @@ ingame: dataSources: stored: title: Хранится - description: Показывает количество хранящихся фигур в вашем центральном здании. + description: Показывает количество хранящихся фигур в хабе. produced: title: Производится description: Показывает производящиеся фигуры, включая промежуточное производство. delivered: title: Доставлено - description: Показывает фигуры, которые доставляются в ваше центральное здание. + description: Показывает фигуры, которые доставляются в хаб. noShapesProduced: Фигуры еще не произведены. # Displays the shapes per minute, e.g. '523 / m' - shapesPerMinute: / мин + shapesPerMinute: / мин. # Settings menu, when you press "ESC" settingsMenu: @@ -363,7 +369,7 @@ ingame: buttons: continue: Продолжить settings: Настройки - menu: Вернутся в меню + menu: Вернуться в меню # Bottom left tutorial hints tutorialHints: @@ -388,21 +394,21 @@ ingame: hints: 1_1_extractor: Поместите экстрактор на фигуру в форме круга чтобы добыть ее! 1_2_conveyor: >- - Соедините экстрактор конвейерной лентой с вашим хабом!

Подсказка: Необходимо выбрать конвейерную ленту и нажать и перетащить мышку! + Соедините экстрактор конвейером с хабом!

Подсказка: Необходимо выбрать конвейер и нажать и потащить мышку! 1_3_expand: >- - Это НЕ idle-игра! Постройте больше экстракторов и конвейерных лент, чтобы достичь цели быстрее.

Подсказка: Удерживайте SHIFT чтобы разместить несколько экстракторов, а R чтобы вращать их. + Это НЕ idle-игра! Постройте больше экстракторов и конвейеров, чтобы достичь цели быстрее.

Подсказка: Удерживайте SHIFT чтобы разместить несколько экстракторов, а R чтобы вращать их. # All shop upgrades shopUpgrades: belt: - name: Конвейерные ленты, Распределители & Туннели + name: Конвейеры, Разделители & Туннели description: Скорость x → x miner: name: Добыча description: Скорость x → x processors: - name: Нарезка, Вращение & Склейка + name: Нарезка, Вращение & Объединение description: Скорость x → x painting: name: Смешивание & Покраска @@ -413,25 +419,25 @@ buildings: belt: default: name: &belt Конвейер - description: Транспортриует передметы, держите и тащите, чтобы разместить несколько. + description: Транспортирует предметы, держите и тащите, чтобы разместить несколько. miner: # Internal name for the Extractor default: name: &miner Экстрактор - description: Поместите над фигурным или цветовым ресурсом, чтобы добыть его. + description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс. chainable: - name: Экстрактор (Цепной) - description: Поместите над фигурным или цветовым ресурсом, чтобы добыть его. Может последовательно соединяться. + name: Экстрактор(Цеп.) + description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс. Может последовательно соединяться в цепь. underground_belt: # Internal name for the Tunnel default: name: &underground_belt Туннель - description: Позволяет перевозить ресурсы под зданиями и конвейерными лентами. + description: Позволяет перевозить ресурсы под зданиями и конвейерами. tier2: name: Туннель II - description: Позволяет перевозить ресурсы под зданиями и конвейерными лентами. + description: Позволяет перевозить ресурсы под зданиями и конвейерами. splitter: # Internal name for the Balancer default: @@ -439,49 +445,52 @@ buildings: description: Многофункциональный - равномерно распределяет все входы на все выходы. compact: - name: Соединитель (компактный) - description: Объединяет две конвейерные ленты в одну. + name: Соединитель + description: Компактный - занимает всего одну клетку! Объединяет два конвейера в один. compact-inverse: - name: Соединитель (компактный) - description: Объединяет две конвейерные ленты в одну. + name: Соединитель + description: Компактный - занимает всего одну клетку! Объединяет два конвейера в один. cutter: default: name: &cutter Резчик - description: Разрезает фигуры сверху вниз и выводит обе половины. Если вы используете только одну часть, обязательно уничтожьте другую, иначе производство остановится! + description: Разрезает фигуры сверху вниз и выводит обе половины. Используя только одну часть - уничтожьте другую, иначе производство остановится! quad: - name: Резчик (Четырехпоточный) - description: Разрезает фигуры на четыре части. Если вы используете только одну часть, обязательно уничтожьте другие, иначе производство остановится! + name: Резчик (4Вых.) + description: Разрезает фигуры на четыре части. Используя не все части - уничтожьте оставшиеся, иначе производство остановится! rotater: default: name: &rotater Вращатель description: Поворачивает фигуры по часовой стрелке на 90 градусов. ccw: - name: Вращатель (обратный) + name: Вращатель (Обр.) description: Поворачивает фигуры против часовой стрелки на 90 градусов. stacker: default: - name: &stacker Склеиватель - description: Склеивает оба предмета. Если они не могут быть объединены, правый элемент помещается над левым элементом. + name: &stacker Объединитель + description: Объединяет два предмета. Если они не могут быть соединены, правый элемент помещается над левым. mixer: default: - name: &mixer Смешиватель цветов - description: Смешивает два цвета с помощью аддитивного смешивания. + name: &mixer Смешиватель + description: Аддитивно смешивает цвета двух красителей. painter: default: name: &painter Покрасчик - description: Красит всю фигуру из левого входа краской из верхнего. + description: &painter_desc Красит всю фигуру из левого входа красителем из перпендикулярного. double: - name: Покрасчик (Двойной) - description: Красит фигуру из левых входов краской из верхнего. + name: Покрасчик (2Вх.) + description: Красит фигуру из левых входов красителем из перпендикулярного. quad: - name: Покрасчик (Четырехпоточный) + name: Покрасчик (4Вх.) description: Позволяет раскрасить каждую четверть фигуры разными цветами. + mirrored: + name: *painter + description: *painter_desc trash: default: @@ -492,110 +501,110 @@ buildings: name: Хранилище description: Хранит лишние предметы, до заданной вместимости. Может использоваться в качестве ворот для пропускания излишков. hub: - deliver: Deliver - toUnlock: to unlock - levelShortcut: LVL + deliver: Доставить + toUnlock: чтобы открыть + levelShortcut: Ур. 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! + title: Разрезание Фигур + desc: Вы только что открыли резчик - он разрезает фигуры пополам сверху вниз независимо от их ориентации!

Обязательно избавьтесь от отходов, иначе он остановится - для этого я дал вам мусорку, которая уничтожит все, что в нее поместить! reward_rotater: - title: Rotating - desc: The rotater has been unlocked! It rotates shapes clockwise by 90 degrees. + title: Вращение + desc: Разблокирован вращатель! Он поворачивает фигуры по часовой стрелке на 90 градусов. reward_painter: - title: Painting + title: Покраска 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! + Разблокирован покрасчик! Добудьте краситель из жилы (так же как и фигуры) и объедините его с фигурой в покрасчике, чтобы раскрасить ее!

PS: Если вы дальтоник, я уже работаю над решением! reward_mixer: - title: Color Mixing - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + title: Смешивание Цветов + desc: Разблокирован смешиватель! Объедините два цвета в этом здании, используя аддитивное смешивание! 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! + title: Объединитель + desc: Теперь вы можете объединять фигуры объединителем! Фигуры из обеих входов объединяются. Если они могут быть расположены рядом друг с другом, они будут соединены, иначе фигура из правого входа наложится на фигуру из левого! reward_splitter: - title: Разделитель/соеденитель - desc: Был открыт многофункциональный balancer.It can be used to build bigger factories by splitting and merging items onto multiple belts!

+ title: Разделитель / Соединитель + desc: Разблокирован многофункциональный разделитель! Его можно использовать для создания больших фабрик путем разделения и соединения конвейеров!

reward_tunnel: title: Туннель - desc: Был открыт Туннель. You can now pipe items through belts and buildings with it! + desc: Разблокирован туннель! Теперь вы можете транспортировать предметы сквозь конвейеры и здания! 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! + title: Вращатель (обратный) + desc: Разблокирован вариант вращателя, он позволяет вращать фигуры против часовой стрелки! Чтобы построить его, выберите вращатель и нажмите 'T' чтобы переключаться между вариантами! 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: Цепной Экстрактор + desc: Разблокирован цепной экстрактор! Он может передавать свои ресурсы другим экстракторам, чтобы вы могли эффективнее извлекать ресурсы! 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: Туннель II + desc: Разблокирован новый вариант туннеля с большей дальностью, а также вы можете совмещать эти туннели! reward_splitter_compact: - title: Compact Balancer + title: Компактный Соединитель 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! + title: Резчик (4 Выхода) + desc: Разблокирован вариант резчика - он позволяет разрезать фигуры на четыре части вместо, всего лишь двух! 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: Двойной Покрасчик + desc: Разблокирован вариант покрасчика - он работает как обычный покрасчик, но обрабатывает две фигуры одновременно, потребляя только один краситель вместо двух! 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: Покрасчик (4 Входа) + desc: Разблокирован вариант покрасчика - он позволяет отдельно раскрашивать каждую часть фигуры! 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: Буферное Хранилище + desc: Разблокирован вариант мусорки - он позволяет хранить предметы до заданной вместимости! reward_freeplay: title: Свободная игра - 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!) + desc: У вас получилось! Разблокирован режим свободной игры! Это означает, что фигуры теперь генерируются случайным образом! (Не беспокойтесь, больше контента планируется в полной версии!) 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: Чертежи + desc: Теперь вы можете копировать и вставлять части вашей фабрики! Выберите область (Удерживая CTRL, перетащите мышь) и нажмите 'C' чтобы скопировать ее.

Вставка не бесплатна, чтобы позволить себе это вам необходимо произвести фигуры для чертежей! (Которые вы только что доставили). # Special reward, which is shown when there is no reward actually no_reward: title: Следующий уровень 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! + Этот уровень не дал вам награды, но следующий даст!

PS: Лучше не разрушайте вашу существующую фабрику - Вам понадобятся все эти фигуры позже, чтобы разблокировать улучшения! no_reward_freeplay: title: Следующий уровень desc: >- - Congratulations! By the way, more content is planned for the standalone! + Поздравляем! Кстати, больше контента планируется для полной версии! settings: title: Настройки categories: - game: Game - app: Application + game: Игровые + app: Основные versionBadges: - dev: Development - staging: Staging - prod: Production - buildDate: Built + dev: Разработчик + staging: Постановка + prod: Произведена + buildDate: Сборка labels: uiScale: title: Размер интерфейса description: >- - Выберите размер пользовательского интерфейса. The interface will still scale based on your device resolution, but this setting controls the amount of scale. + Выберите размер пользовательского интерфейса. Интерфейс будет по-прежнему масштабироваться в зависимости от разрешения вашего устройства, но этот параметр управляет величиной масштабирования. scales: super_small: Очень маленький small: Маленький @@ -604,9 +613,9 @@ settings: huge: Огромный scrollWheelSensitivity: - title: Zoom sensitivity + title: Чувствительность зума description: >- - Changes how sensitive the zoom is (Either mouse wheel or trackpad). + Изменяет чувствительность зума (колесико мыши или сенсорная панель). sensitivity: super_slow: Очень медленно slow: Медленно @@ -617,7 +626,7 @@ settings: language: title: Язык description: >- - Выберите язык. Все переводы сделаны пользователями и могут быть незакончены! + Выберите язык. Все переводы сделаны пользователями и могут быть не законченными! fullscreen: title: Полный экран @@ -627,12 +636,12 @@ settings: soundsMuted: title: Выключить звуки description: >- - Если включено, выключает все звуковые эффекты + Если включено, выключает все звуковые эффекты. musicMuted: title: Выключить музыку description: >- - Если включено, выключает музыку + Если включено, выключает музыку. theme: title: Тема игры @@ -640,68 +649,100 @@ settings: Выберите тему игры (светлая / темная). themes: - dark: Dark - light: Light + dark: Темная + light: Светлая refreshRate: - title: Simulation Target + title: Частота обновления 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. + Если у вас монитор 144 Гц, измените частоту обновления здесь, чтобы игра правильно выглядела при более высоких частотах обновления. Это может уменьшить FPS, если ваш компьютер работает слишком медленно. alwaysMultiplace: - title: Multiplace + title: Многократное размещение description: >- - If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. + Если включено, все здания останутся выбранными после размещения, пока вы не отмените выбор. Это эквивалентно постоянному удержанию SHIFT. offerHints: - title: Hints & Tutorials + title: Подсказки & Обучение 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. + Стоит ли предлагать подсказки и обучающий материал во время игры. Также скрывает определенные элементы пользовательского интерфейса для данного уровня, предназначенные для облегчения "входа" в игру. movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: Скорость движения + description: Изменяет скорость перемещения изображения при использовании клавиатуры. speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: Очень медленно + slow: Медленно + regular: Средне + fast: Быстро + super_fast: Очень быстро + extremely_fast: Чрезвычайно быстро + enableTunnelSmartplace: + title: Умные Туннели + description: >- + Если включено, то при размещении туннелей автоматически удаляются ненужные конвейеры. + Это также позволяет протягивать туннели, причем лишние туннели будут удалены. + vignette: + title: Виньетирование + description: >- + Включает виньетирование, которое затемняет углы экрана и облегчает чтение текста. + + 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: Настройки управления hint: >- - Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options. + Подсказка: Обязательно используйте CTRL, SHIFT и ALT! Они дают разные варианты размещения. - resetKeybindings: Настройки по умолчанию + resetKeybindings: Сброс настроек управления categoryLabels: - general: Application - ingame: Game - navigation: Navigating - placement: Placement - massSelect: Mass Select - buildings: Building Shortcuts - placementModifiers: Placement Modifiers + general: Основные + ingame: Игровые + navigation: Навигация + placement: Размещение + massSelect: Множественный Выбор + buildings: Постройки + placementModifiers: Модификаторы Размещения mappings: confirm: Подтвердить back: Назад - mapMoveUp: Move Up - mapMoveRight: Move Right - mapMoveDown: Move Down - mapMoveLeft: Move Left - centerMap: Center Map + mapMoveUp: Вверх + mapMoveRight: Вправо + mapMoveDown: Вниз + mapMoveLeft: Влево + centerMap: Центрировать карту - mapZoomIn: Zoom in - mapZoomOut: Zoom out - createMarker: Create Marker + mapZoomIn: Приблизить + mapZoomOut: Отдалить + createMarker: Создать Маркер - menuOpenShop: Upgrades - menuOpenStats: Statistics + menuOpenShop: Улучшения + menuOpenStats: Статистика - toggleHud: Toggle HUD + toggleHud: Переключить HUD toggleFPSInfo: Включить/выключить FPS и информацию отладки belt: *belt splitter: *splitter @@ -714,54 +755,57 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement - rotateWhilePlacing: Rotate + rotateWhilePlacing: Вращать rotateInverseModifier: >- - Modifier: Rotate CCW instead - cycleBuildingVariants: Cycle Variants - confirmMassDelete: Confirm Mass Delete - cycleBuildings: Cycle Buildings + Модификатор: Вращать против часовой стрелки + cycleBuildingVariants: Переключение Вариантов + confirmMassDelete: Подтверждение Массового Удаления + cycleBuildings: Переключение Построек - massSelectStart: Hold and drag to start - massSelectSelectMultiple: Select multiple areas - massSelectCopy: Copy area + massSelectStart: Модификатор для выделения области + massSelectSelectMultiple: Выбрать несколько областей + massSelectCopy: Копировать область - 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: Отключить авто-определение направления + placeMultiple: Оставаться в режиме размещения + placeInverse: Инвертировать авто-определение направления конвейеров + pasteLastBlueprint: Вставить последний чертеж + massSelectCut: Вырезать область + exportScreenshot: Экспорт всей Базы в виде Изображения + mapMoveFaster: Ускорение передвижения + lockBeltDirection: Включает конвейерный планировщик + switchDirectionLockSide: "Планировщик: Переключение сторон" + pipette: Pipette about: - title: О игре + title: Об игре 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.

+ Если вы хотите внести свой вклад то вам сюда - shapez.io в 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.

+ Саундтрек сделал Peppsen - Он потрясающий.

- Finally, huge thanks to my best friend Niklas - Without our - factorio sessions this game would never have existed. + Наконец, огромное спасибо моему лучшему другу Niklas - Без наших + игровых сессий в factorio эта игра никогда не существовала бы. changelog: - title: Список измений + title: Список изменений demo: features: - restoringGames: Restoring savegames - importingGames: Importing savegames - oneGameLimit: Limited to one savegame - customizeKeybindings: Customizing Keybindings - exportingBase: Exporting whole Base as Image + restoringGames: Восстановить сохранения игр + importingGames: Импортировать сохранения игр + oneGameLimit: Ограниченность одним сохранением игры + customizeKeybindings: Пользовательская настройка Управления + exportingBase: Экспорт всей Базы в виде Изображения settingNotAvailable: Не доступно в демо-версии. diff --git a/translations/base-sv.yaml b/translations/base-sv.yaml index 1eeadd47..e383ce2c 100644 --- a/translations/base-sv.yaml +++ b/translations/base-sv.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: @@ -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: About this Game diff --git a/translations/base-tr.yaml b/translations/base-tr.yaml index dfd97ed3..0880ce04 100644 --- a/translations/base-tr.yaml +++ b/translations/base-tr.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 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-zh-CN.yaml b/translations/base-zh-CN.yaml index 1eeadd47..bd3f50bb 100644 --- a/translations/base-zh-CN.yaml +++ b/translations/base-zh-CN.yaml @@ -19,9 +19,36 @@ # the basic structure so the game also detects it. # +# Chinese translation dictionary. TODO: better names for the buildings. +# Standalone:独立版 +# Demo:演示版 +# Level:关/关卡 +# Shape:图形 +# tile:格子/格 +# Keybind:按键设置 +# Menu:主界面 +# Center/Hub:基地 +# Upgrade:建筑升级/升级 +# Efficiency:效率 +# Building:建筑 +# Variant:建筑变体 +# Belt: 传送带 +# Balancer:平衡机 +# Compact Balancer:小型合流机 +# Merger:合并机 +# Tunnel:隧道 +# Extractor:开采机 +# Cutter:切割机 +# Rotate:旋转机 +# Stacker:堆叠机 +# Color Mixer:混色机 +# Painter:上色机 +# Trash:垃圾桶 + 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 是一款在无边际的地图上建造工厂、自动化生产与组合愈加复杂的图形的游戏。 + # 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: @@ -30,77 +57,80 @@ 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]独立版优势[/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] - 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] + + 本游戏已开源,所有人都能参与游戏内容的开发!除此以外,我[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: 错误 + # Chinese translation: There is typically no divider used for numbers. # How big numbers are rendered, e.g. "10,000" - thousandsDivider: "," + thousandsDivider: "" + # TODO: Chinese translation: suffix changes every 10000 in Chinese numbering system. # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: - thousands: k + thousands: K millions: M billions: B 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 s + secondsShort: 秒 + minutesAndSecondsShort: 秒 + hoursAndMinutesShort: 小时 秒 - xMinutes: minutes + xMinutes: 分钟 keys: tab: TAB @@ -108,33 +138,33 @@ global: alt: ALT escape: ESC shift: SHIFT - space: SPACE + space: 空格 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: - title: "Contest #01" - desc: Win $25 for the coolest base! + title: "竞赛 #01" + desc: 最6的工厂将能赢得25美元的奖金! longDesc: >- To give something back to you, I thought it would be cool to make weekly contests!

@@ -151,558 +181,622 @@ mainMenu:
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! + showInfo: 详细信息 + contestOver: 本次竞赛已结束。加入官方Discord以收到关于新竞赛的提醒! + # contestOver: This contest has ended - Join the discord to get noticed about new contests! + continue: 继续游戏 + newGame: 新游戏 + madeBy: 作者: 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 + ok: 确认 # 好 完成 + delete: 删除 # Delete + cancel: 取消 # Cancel + later: 以后 # 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. + 不要销毁你之前建造的工厂!你生产过的所有图形都会被用来升级建筑。 + 升级菜单在屏幕右上角。 + # 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: >- - Blueprints have not been unlocked yet! Complete more levels to unlock them. + 你还没有解锁蓝图功能!完成更多的关卡来解锁蓝图。 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 copy / delete.
- SHIFT: Hold to place multiple of one building.
- ALT: Invert orientation of placed belts.
+ 这个游戏有很多能帮助搭建工厂的使用按键。 + 以下是其中的一些,记得在按键设置中查看其他的!

+ CTRL + 拖动:选择区域以复制或删除。
+ SHIFT: 按住以放置多个。
+ ALT: 反向放置传送带。
+ # 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 copy / delete.
+ # SHIFT: Hold to place multiple of one building.
+ # ALT: Invert orientation of placed belts.
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: 在演示版中你只能创建两个地图标记。请获取独立版以创建更多标记。 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 - itemsPerSecondDouble: (x2) + speed: 效率 + range: 范围 + storage: 容量 + oneItemPerSecond: 1个/秒 + itemsPerSecond: 个/秒 + itemsPerSecondDouble: (2倍) - 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] + # Chinese translation: Chinese characters for each tier + tierLabels: [一, 二, 三, 四, 五, 六, 七, 八, 九, 十] - maximumLevel: MAXIMUM LEVEL (Speed x) + maximumLevel: 最高级(倍效率) # 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 - hub: HUB + waypoints: 地图标记 + 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. + 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! + 用传送带将你的开采机连接到基地上!

提示:用你的鼠标按下并拖动传送带! 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. + 这不是一个挂机游戏!建造更多的开采机和传送带来更快地完成目标。

+ 提示:按住SHIFT键来放置多个开采机,用R键旋转它们。 # All shop upgrades shopUpgrades: belt: - name: Belts, Distributor & Tunnels - description: Speed x → x + name: 传送带、平衡机、隧道 + description: 效率 倍 → 倍 miner: - name: Extraction - description: Speed x → x + name: 开采 + description: 效率 倍 → 倍 processors: - name: Cutting, Rotating & Stacking - description: Speed x → x + name: 切割、旋转、堆叠 + description: 效率 倍 → 倍 painting: - name: Mixing & Painting - description: Speed x → x + name: 混色、上色 + description: 效率 倍 → 倍 # Buildings and their name / description buildings: belt: default: - name: &belt Conveyor Belt - description: Transports items, hold and drag to place multiple. + name: &belt 传送带 + description: 运送物品,按住并拖动来放置多个传送带。 miner: # Internal name for the Extractor default: - name: &miner Extractor - description: Place over a shape or color to extract it. + name: &miner 开采机 + description: 在图形或者颜色上放置来开采他们。 chainable: - name: Extractor (Chain) - description: Place over a shape or color to extract it. Can be chained. + name: 链式开采机 + description: 在图形或者颜色上放置来开采他们。可以被链接在一起。 underground_belt: # Internal name for the Tunnel default: - name: &underground_belt Tunnel - description: Allows to tunnel resources under buildings and belts. + name: &underground_belt 隧道 + description: 可以从其他传送带或建筑底下方运送物品。 tier2: - name: Tunnel Tier II - description: Allows to tunnel resources under buildings and belts. + name: 二级隧道 + description: 可以从其他传送带或建筑底下方运送物品。 splitter: # Internal name for the Balancer default: - name: &splitter Balancer - description: Multifunctional - Evenly distributes all inputs onto all outputs. + name: &splitter 平衡机 + description: 多功能——将所有输入平均分配到所有输出。 compact: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: 小型合流机 + description: 把两个输入合并到一个输出上。 compact-inverse: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: 小型合流机 + description: 把两个输入合并到一个输出上。 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! + name: &cutter 切割机 + description: 将图形从上到下切开并输出。 如果你只需要其中一半,记得把另一半销毁掉,否则切割机会停止工作! quad: - name: Cutter (Quad) - description: Cuts shapes into four parts. If you use only one part, be sure to destroy the other part or it will stall! + name: 切割机(四分) + description: 将输入的图形切成四块。 如果你只需要其中一块,记得把其他的销毁掉,否则切割机会停止工作! rotater: default: - name: &rotater Rotate - description: Rotates shapes clockwise by 90 degrees. + name: &rotater 旋转机 + description: 将图形顺时针旋转90度。 ccw: - name: Rotate (CCW) - description: Rotates shapes counter clockwise by 90 degrees. + name: 旋转机(逆时针) + description: 将图形逆时针旋转90度。 stacker: default: - name: &stacker Stacker - description: Stacks both items. If they can not be merged, the right item is placed above the left item. + name: &stacker 堆叠机 + description: 将输入的图形拼贴在一起。如果不能被直接拼贴,右边的图形会被堆叠在左边的图形上面. mixer: default: - name: &mixer Color Mixer - description: Mixes two colors using additive blending. + name: &mixer 混色机 + description: 将两个颜色混合在一起。(加法混合) painter: default: - name: &painter Painter - description: Colors the whole shape on the left input with the color from the right input. + name: &painter 上色机 + description: &painter_desc 将整个图形涂上输入的颜色。 double: - name: Painter (Double) - description: Colors the shapes on the left inputs with the color from the top input. + name: 上色机(双倍) + description: 同时为两个输入的图形上色,每次上色只消耗一份颜色。 quad: - name: Painter (Quad) - description: Allows to color each quadrant of the shape with a different color. + name: 上色机(四向) + description: 为图形的四个角涂上不同的颜色。 + mirrored: + name: *painter + description: *painter_desc trash: default: - name: &trash Trash - description: Accepts inputs from all sides and destroys them. Forever. + name: &trash 垃圾桶 + description: 从所有四个方向上输入物品并销毁它们。永远。 storage: - name: Storage - description: Stores excess items, up to a given capacity. Can be used as an overflow gate. + name: 仓库 + description: 储存多余的物品,有一定储存上限。可以被用来作为溢流门。 hub: - deliver: Deliver - toUnlock: to unlock + deliver: 交付 + toUnlock: 来解锁 levelShortcut: LVL 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! + title: 切割图形 + desc: 切割机已解锁。不论切割机的方向,它都会把图形从上到下切成两半。

记得把不需要的部分处理掉,否则这个这个建筑会停止工作。为此我给你准备了垃圾桶,它会把所有放进去的物品销毁掉。 reward_rotater: - title: Rotating - desc: The rotater has been unlocked! It rotates shapes clockwise by 90 degrees. + title: 顺时针旋转 + desc: 旋转机已解锁。它会顺时针旋转输入的图形90度。 reward_painter: - title: Painting + title: 上色 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! + 上色机已解锁。和图形一样,从颜色矿脉中开采颜色,然后将在上色机中将颜色涂在图形上。

PS:我们正在开发色盲模式! reward_mixer: - title: Color Mixing + title: 混合颜色 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! + title: 堆叠 + desc: 堆叠机已解锁。堆叠机会尝试把两个输入的图形拼贴在一起。如果有重叠的部分,右边的输入会被堆叠在左边的输入上方! 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!

+ title: 分离与合并 + desc: 平衡机已解锁。在大型工厂中,平衡机负责合并或分离多个传送带上的物品。

reward_tunnel: - title: Tunnel - desc: The tunnel has been unlocked - You can now pipe items through belts and buildings with it! + title: 隧道 + desc: 隧道已解锁。你现在可以从其他传送带或建筑底下运送物品了! reward_rotater_ccw: - title: CCW Rotating + title: 逆时针旋转 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! + title: 链式开采机 + desc: 链式开采机变体已解锁。它是开采机的一个变体。它可以将开采出来的资源传递给其他的开采机,使得资源提取更加高效! 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: 二级隧道 + desc: 二级隧道变体已解锁。这个隧道有更长的传输距离。你还可以混用不同的隧道变体! reward_splitter_compact: - title: Compact Balancer + title: 小型合流机 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 + title: 四分切割机 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 + title: 双倍上色机 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! + title: 四向上色机 + desc: 上色机四向变体已解锁。它可以在一个图形的四个角上涂不同的颜色! 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: 仓库 + desc: 仓库变体已解锁。它可以暂时储存一些材料,有容量上限。 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: 自由模式 + desc: 恭喜你!你解锁了自由模式!现在图形将会是随机生成的!(不用担心,我计划在独立版本中加入更多内容!) reward_blueprints: - title: Blueprints + title: 蓝图 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 + title: 下一关 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! + 这一关没有奖励,但是下一关有!

PS: 你生产过的所有图形都会被用来升级建筑。 no_reward_freeplay: - title: Next level + title: 下一关 desc: >- - Congratulations! By the way, more content is planned for the standalone! + 恭喜你!另外,我们已经计划在独立版中加入更多内容! settings: - title: Settings + title: 设置 categories: - game: Game - app: Application + game: 游戏内容 + app: 应用 versionBadges: - dev: Development - staging: Staging - prod: Production - buildDate: Built + dev: 开发版本 # Development + staging: 预览版本 # Staging + prod: 正式版本 # Production + buildDate: 于编译 labels: uiScale: - title: Interface scale + title: 用户界面大小 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 + super_small: 最小 + small: 较小 + regular: 正常 + large: 较大 + huge: 最大 scrollWheelSensitivity: - title: Zoom sensitivity + title: 缩放灵敏度 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 + super_slow: 最低 + slow: 较低 + regular: 正常 + fast: 较高 + super_fast: 最高 language: - title: Language + title: 语言 description: >- - Change the language. All translations are user contributed and might be incomplete! + 改变语言。所有的翻译皆由玩家提供,且有可能正在施工中! fullscreen: - title: Fullscreen + title: 全屏 description: >- - It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone. + 全屏以获得更好的游戏体验。仅在独立版中可用。 soundsMuted: - title: Mute Sounds + title: 关闭音效 description: >- - If enabled, mutes all sound effects. + 关闭所有音效。 musicMuted: - title: Mute Music + title: 关闭音乐 description: >- - If enabled, mutes all music. + 关闭所有音乐。 theme: - title: Game theme + title: 界面主题 description: >- - Choose the game theme (light / dark). + 选择界面主题(深色或浅色)。 themes: - dark: Dark - light: Light + dark: 深色 + light: 浅色 refreshRate: - title: Simulation Target + title: 模拟频率、刷新频率 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. + 如果你的显示器是144hz的,请在这里更改刷新频率,这样游戏可以正确地根据你的屏幕进行模拟。但是如果你的电脑性能不佳,提高刷新频率可能降低帧数。 + # 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 + title: 多重放置 description: >- - If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. + 开启这个选项之后放下建筑将不会取消建筑选择。等同于一直按下SHIFT键。 + # 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 + title: 提示与教程 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. + 是否显示提示、教程以及一些其他的帮助理解游戏的UI元素。 + # 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. movementSpeed: - title: Movement speed - description: Changes how fast the view moves when using the keyboard. + title: 移动速度 + description: 改变摄像头移动速度 speeds: - super_slow: Super slow - slow: Slow - regular: Regular - fast: Fast - super_fast: Super Fast - extremely_fast: Extremely Fast + super_slow: 最慢 + slow: 较慢 + regular: 正常 + fast: 较快 + super_fast: 非常快 + extremely_fast: 最快 + + enableTunnelSmartplace: + title: 智能隧道放置 + description: >- + 启用后,放置隧道时会将多余的传送带移除。 + 此外,拖动隧道可以快速铺设隧道,以及移除不必要的隧道。 + vignette: + title: 晕映 + description: >- + 启用晕映,将屏幕角落里的颜色变深,更容易阅读文本。 + + 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 + title: 按键设置 hint: >- - Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options. + 提示:使用CTRL、SHIFT、ALT! 这些建在放置建筑时有不同的效果。 + # hint: >- + # Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options. - resetKeybindings: Reset Keyinbindings + resetKeybindings: 重置按键设置 categoryLabels: - general: Application - ingame: Game - navigation: Navigating - placement: Placement - massSelect: Mass Select - buildings: Building Shortcuts - placementModifiers: Placement Modifiers + general: 通用 + ingame: 游戏 + navigation: 视角 + placement: 放置 + massSelect: 批量选择 + buildings: 建筑快捷键 + placementModifiers: 放置建筑修饰键 mappings: - confirm: Confirm - back: Back - mapMoveUp: Move Up - mapMoveRight: Move Right - mapMoveDown: Move Down - mapMoveLeft: Move Left - centerMap: Center Map + confirm: 确认 + back: 返回 + mapMoveUp: 上 + mapMoveRight: 右 + mapMoveDown: 下 + mapMoveLeft: 左 + centerMap: 回到基地 + # confirm: Confirm + # back: Back + # mapMoveUp: Move Up + # mapMoveRight: Move Right + # mapMoveDown: Move Down + # mapMoveLeft: Move Left + # centerMap: Center Map - mapZoomIn: Zoom in - mapZoomOut: Zoom out - createMarker: Create Marker + mapZoomIn: 放大 + mapZoomOut: 缩小 + createMarker: 创建地图标记 - menuOpenShop: Upgrades - menuOpenStats: Statistics + menuOpenShop: 升级菜单 + menuOpenStats: 统计菜单 - toggleHud: Toggle HUD - toggleFPSInfo: Toggle FPS and Debug Info + toggleHud: 开关HUD + toggleFPSInfo: 开关帧数与调试信息 belt: *belt splitter: *splitter underground_belt: *underground_belt @@ -714,54 +808,57 @@ keybindings: painter: *painter trash: *trash - abortBuildingPlacement: Abort Placement - rotateWhilePlacing: Rotate + rotateWhilePlacing: 顺时针旋转 rotateInverseModifier: >- - Modifier: Rotate CCW instead - cycleBuildingVariants: Cycle Variants - confirmMassDelete: Confirm Mass Delete - cycleBuildings: Cycle Buildings + 修饰键: 改为逆时针旋转 + cycleBuildingVariants: 选择建筑变体 + # cycleBuildingVariants: Cycle Variants + confirmMassDelete: 确认批量删除 + cycleBuildings: 选择建筑 + # cycleBuildings: Cycle Buildings + massSelectStart: 开始批量选择 + massSelectSelectMultiple: 选择多个区域 + massSelectCopy: 复制 - massSelectStart: Hold and drag to start - massSelectSelectMultiple: Select multiple areas - massSelectCopy: Copy area + placementDisableAutoOrientation: 取消自动定向 + placeMultiple: 继续放置 + placeInverse: 反向放置传送带 + pasteLastBlueprint: 粘贴上一张蓝图 + massSelectCut: 剪切 + exportScreenshot: 导出截图 + mapMoveFaster: 快速移动 - 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 + lockBeltDirection: 启用传送带规划 + switchDirectionLockSide: "规划器:换边" + pipette: Pipette about: - title: About this Game + title: 关于游戏 + # title: About this Game body: >- - This game is open source and developed by Tobias Springer (this is me).

+ 本游戏由Tobias Springer(我)开发,并且已经开源。

- If you want to contribute, check out shapez.io on github.

+ 如果你想参与开发,请查看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!

+ 这个游戏的开发少不了热情的Discord社区。请加入我们的Discord 服务器

- 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. + 本游戏的音乐由Peppsen制作——他是个很棒的伙伴。

+ 最后,我想感谢我最好的朋友Niklas——如果没有与他的异星工厂(factorio)的游戏体验,shapez.io将不会存在。 changelog: - title: Changelog + title: 版本日志 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. + restoringGames: 恢复存档 #中? + importingGames: 倒入存档 #中? + oneGameLimit: 最多一个存档 + customizeKeybindings: 按键设置 + # customizeKeybindings: Customizing Keybindings + exportingBase: 导出工厂截图 + settingNotAvailable: 在演示版中不可用。 diff --git a/translations/base-zh-TW.yaml b/translations/base-zh-TW.yaml index 1eeadd47..e383ce2c 100644 --- a/translations/base-zh-TW.yaml +++ b/translations/base-zh-TW.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: @@ -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: About this Game diff --git a/version b/version index 51653031..95ce23d4 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.1.11 \ No newline at end of file +1.1.17 \ No newline at end of file