From ef574c0bfeb009d7dfd2e3d1022db5b2ed909643 Mon Sep 17 00:00:00 2001 From: hexagonhexagon Date: Sun, 26 Jul 2020 17:09:50 -0400 Subject: [PATCH 1/9] Redo stacking algorithm (#138) * Change stacking algorithm to keep shapes whole rather than splitting by layer. * Ensure that layerToMergeAt is not less than 0. --- src/js/game/shape_definition.js | 93 ++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index cb58b05d..d94f335a 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -513,57 +513,68 @@ export class ShapeDefinition extends BasicSerializableObject { * @param {ShapeDefinition} definition */ cloneAndStackWith(definition) { - const newLayers = this.internalCloneLayers(); - if (this.isEntirelyEmpty() || definition.isEntirelyEmpty()) { assert(false, "Can not stack entirely empty definition"); } - // Put layer for layer on top - for (let i = 0; i < definition.layers.length; ++i) { - const layerToAdd = definition.layers[i]; + const bottomShapeLayers = this.layers; + const bottomShapeHighestLayerByQuad = [-1, -1, -1, -1]; - // On which layer we can merge this upper layer - let mergeOnLayerIndex = null; - - // Go from top to bottom and check if there is anything intercepting it - for (let k = newLayers.length - 1; k >= 0; --k) { - const lowerLayer = newLayers[k]; - - let canMerge = true; - for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { - const upperItem = layerToAdd[quadrantIndex]; - const lowerItem = lowerLayer[quadrantIndex]; - - if (upperItem && lowerItem) { - // so, we can't merge it because two items conflict - canMerge = false; - break; - } + for (let layer = bottomShapeLayers.length - 1; layer >= 0; --layer) { + const shapeLayer = bottomShapeLayers[layer]; + for (let quad = 0; quad < 4; ++quad) { + const shapeQuad = shapeLayer[quad]; + if (shapeQuad !== null && bottomShapeHighestLayerByQuad[quad] < layer) { + bottomShapeHighestLayerByQuad[quad] = layer; } - - // If we can merge it, store it - since we go from top to bottom - // we can simply override it - if (canMerge) { - mergeOnLayerIndex = k; - } - } - - if (mergeOnLayerIndex !== null) { - // Simply merge using an OR mask - for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { - newLayers[mergeOnLayerIndex][quadrantIndex] = - newLayers[mergeOnLayerIndex][quadrantIndex] || layerToAdd[quadrantIndex]; - } - } else { - // Add new layer - newLayers.push(layerToAdd); } } - newLayers.splice(4); + const topShapeLayers = definition.layers; + const topShapeLowestLayerByQuad = [4, 4, 4, 4]; - return new ShapeDefinition({ layers: newLayers }); + for (let layer = 0; layer < topShapeLayers.length; ++layer) { + const shapeLayer = topShapeLayers[layer]; + for (let quad = 0; quad < 4; ++quad) { + const shapeQuad = shapeLayer[quad]; + if (shapeQuad !== null && topShapeLowestLayerByQuad[quad] > layer) { + topShapeLowestLayerByQuad[quad] = layer; + } + } + } + + /** + * We want to find the number `layerToMergeAt` such that when the top shape is placed at that + * layer, the smallest gap between shapes is only 1. Instead of doing a guess-and-check method to + * find the appropriate layer, we just calculate all the gaps assuming a merge at layer 0, even + * though they go negative, and calculating the number to add to it so the minimum gap is 1 (ends + * up being 1 - minimum). + */ + const gapsBetweenShapes = []; + for (let quad = 0; quad < 4; ++quad) { + gapsBetweenShapes.push(topShapeLowestLayerByQuad[quad] - bottomShapeHighestLayerByQuad[quad]); + } + const smallestGapBetweenShapes = Math.min(...gapsBetweenShapes); + // Can't merge at a layer lower than 0 + const layerToMergeAt = Math.max(1 - smallestGapBetweenShapes, 0); + + const mergedLayers = this.internalCloneLayers(); + for (let layer = mergedLayers.length; layer < layerToMergeAt + topShapeLayers.length; ++layer) { + mergedLayers.push([null, null, null, null]); + } + + for (let layer = 0; layer < topShapeLayers.length; ++layer) { + const layerMergingAt = layerToMergeAt + layer; + const bottomShapeLayer = mergedLayers[layerMergingAt]; + const topShapeLayer = topShapeLayers[layer]; + for (let quad = 0; quad < 4; quad++) { + bottomShapeLayer[quad] = bottomShapeLayer[quad] || topShapeLayer[quad]; + } + } + + mergedLayers.splice(4); + + return new ShapeDefinition({ layers: mergedLayers }); } /** From 97870da0480ffad534cafd6267c108aef78254e7 Mon Sep 17 00:00:00 2001 From: cyantree Date: Sun, 26 Jul 2020 23:11:06 +0200 Subject: [PATCH 2/9] Fix layer handling in cutter (#352) * Fix layer handling in cutter * Remove unused variable in `cloneFilteredByquadrants()` * Rework check in `isValidShortKeyInternal()` to being an early return * Support empty layers in `isValidShortKeyInternal()` which aren't the topmost layer --- src/js/game/shape_definition.js | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index d94f335a..3a777f6f 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -183,6 +183,11 @@ export class ShapeDefinition extends BasicSerializableObject { */ static isValidShortKeyInternal(key) { const sourceLayers = key.split(":"); + + if (sourceLayers.length === 0 || sourceLayers.length > 4) { + return false; + } + let layers = []; for (let i = 0; i < sourceLayers.length; ++i) { const text = sourceLayers[i]; @@ -221,15 +226,12 @@ export class ShapeDefinition extends BasicSerializableObject { } } - if (!anyFilled) { - // Empty layer + if (!anyFilled && i === sourceLayers.length - 1) { + // Topmost layer isn't allowed being empty return false; } - layers.push(quads); - } - if (layers.length === 0 || layers.length > 4) { - return false; + layers.push(quads); } return true; @@ -447,23 +449,23 @@ export class ShapeDefinition extends BasicSerializableObject { */ cloneFilteredByQuadrants(includeQuadrants) { const newLayers = this.internalCloneLayers(); + let lastNonEmptyLayer = -1; for (let layerIndex = 0; layerIndex < newLayers.length; ++layerIndex) { const quadrants = newLayers[layerIndex]; - let anyContents = false; for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) { if (includeQuadrants.indexOf(quadrantIndex) < 0) { quadrants[quadrantIndex] = null; } else if (quadrants[quadrantIndex]) { - anyContents = true; + lastNonEmptyLayer = layerIndex; } } - - // Check if the layer is entirely empty - if (!anyContents) { - newLayers.splice(layerIndex, 1); - layerIndex -= 1; - } } + + // Remove top most empty layers which aren't needed anymore + if (lastNonEmptyLayer !== newLayers.length - 1) { + newLayers.splice(lastNonEmptyLayer + 1); + } + return new ShapeDefinition({ layers: newLayers }); } From 3bae1c8ec36b409323caa46c48ea4b9339d28495 Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Mon, 27 Jul 2020 18:07:25 +0900 Subject: [PATCH 3/9] Remove sloc, it appears to be unused. (#503) --- gulp/package.json | 1 - gulp/yarn.lock | 37 +++---------------------------------- package.json | 1 - yarn.lock | 40 ++-------------------------------------- 4 files changed, 5 insertions(+), 74 deletions(-) diff --git a/gulp/package.json b/gulp/package.json index bf088e21..6279afc8 100644 --- a/gulp/package.json +++ b/gulp/package.json @@ -47,7 +47,6 @@ "query-string": "^6.8.1", "rusha": "^0.8.13", "serialize-error": "^3.0.0", - "sloc": "^0.2.1", "strictdom": "^1.0.1", "string-replace-webpack-plugin": "^0.1.3", "terser-webpack-plugin": "^1.1.0", diff --git a/gulp/yarn.lock b/gulp/yarn.lock index 757bace4..37fbfbb0 100644 --- a/gulp/yarn.lock +++ b/gulp/yarn.lock @@ -1904,13 +1904,6 @@ async@~1.0.0: resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= -async@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" - integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw= - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2948,13 +2941,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" - cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -3119,7 +3105,7 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colors@1.0.3, colors@1.0.x: +colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= @@ -3163,13 +3149,6 @@ commander@~2.8.1: dependencies: graceful-readlink ">= 1.0.0" -commander@~2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -8345,7 +8324,7 @@ lodash@^3.0.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -11203,7 +11182,7 @@ readable-stream@^3.0.2, readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.1.0, readdirp@^2.2.1: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -12027,16 +12006,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sloc@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e" - integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A== - dependencies: - async "~2.1.4" - cli-table "^0.3.1" - commander "~2.9.0" - readdirp "^2.1.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" diff --git a/package.json b/package.json index 4592ba04..11a88f04 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "query-string": "^6.8.1", "rusha": "^0.8.13", "serialize-error": "^3.0.0", - "sloc": "^0.2.1", "strictdom": "^1.0.1", "string-replace-webpack-plugin": "^0.1.3", "terser-webpack-plugin": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index 36163525..f88a9206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1564,13 +1564,6 @@ async@~0.2.10: resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= -async@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" - integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw= - dependencies: - lodash "^4.14.0" - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2314,13 +2307,6 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" - cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -2413,11 +2399,6 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - colors@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2450,13 +2431,6 @@ commander@~2.8.1: dependencies: graceful-readlink ">= 1.0.0" -commander@~2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -5190,7 +5164,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0: +lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -7273,7 +7247,7 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.1.0, readdirp@^2.2.1: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -7772,16 +7746,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sloc@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e" - integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A== - dependencies: - async "~2.1.4" - cli-table "^0.3.1" - commander "~2.9.0" - readdirp "^2.1.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" From 52baa773db71a05ea1d32da04f31b7d050e33275 Mon Sep 17 00:00:00 2001 From: Rodrigo Neves <56725240+r-neves@users.noreply.github.com> Date: Mon, 27 Jul 2020 10:12:36 +0100 Subject: [PATCH 4/9] Readme small typo :) (#500) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d4b357e..89cb9bbb 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ If you want to add a new feature or in generally contribute I recommend to get i ### Code -The game is based on a custom engine which itself is based on the YORG.io 3 game egine (Actually it shares almost the same core). +The game is based on a custom engine which itself is based on the YORG.io 3 game engine (Actually it shares almost the same core). The code within the engine is relatively clean with some code for the actual game on top being hacky. This project is based on ES5. Some ES2015 features are used but most of them are too slow, especially when polyfilled. For example, `Array.prototype.forEach` is only used within non-critical loops since its slower than a plain for loop. From 2be3eae2aab35ececfeae58b1f4fe0a8d70c7995 Mon Sep 17 00:00:00 2001 From: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com> Date: Mon, 27 Jul 2020 12:14:08 +0300 Subject: [PATCH 5/9] [WIP] Update base-uk.yaml (#418) * Update base-uk.yaml * Updating * Update base-uk.yaml * Update base-uk.yaml * Update base-uk.yaml * Update base-uk.yaml * Update base-uk.yaml * Update base-uk.yaml * Update base-uk.yaml --- translations/base-uk.yaml | 556 +++++++++++++++++++------------------- 1 file changed, 281 insertions(+), 275 deletions(-) diff --git a/translations/base-uk.yaml b/translations/base-uk.yaml index d86cd374..fb83bb58 100644 --- a/translations/base-uk.yaml +++ b/translations/base-uk.yaml @@ -17,14 +17,20 @@ # # 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. -# +# Ґлосарій: +# map мапа +# keybinds гарячі клавіши +# upgrade поліпшення +# marker позначка +# area ділянка +# hub 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 processing of increasingly complex shapes across an infinitely expanding map. + shortText: shapez.io — це гра про будування фабрик для автоматизації створення та обробки все більш складних форм на нескінченно розширюваній мапі. # This is the text shown above the Discord link - discordLink: Official Discord - Chat with me! + discordLink: Офіційний Discord сервер — поговори зі мною! # 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: @@ -42,86 +48,86 @@ steamPage: This game features 18 progressive levels (Which should keep you busy for hours already!) but I'm constantly adding new content - There is a lot planned! - Purchasing the game gives you access to the standalone version which has additional features and you'll also receive access to newly developed features. + Купуючи гру, ви отримуєте доступ до окремої версії, яка має додаткові функції, а також ви отримаєте доступ до нещодавно розроблених функцій. [img]{STEAM_APP_IMAGE}/extras/header_standalone_advantages.png[/img] [list] - [*] Dark Mode - [*] Unlimited Waypoints - [*] Unlimited Savegames - [*] Additional settings - [*] Coming soon: Wires & Energy! Aiming for (roughly) end of July 2020. - [*] Coming soon: More Levels + [*] Темний режим + [*] Необмежені позначки + [*] Необмежені збереження + [*] Додаткові налаштування + [*] Незабаром: дроти й енергія! Гадаю, оновлення вийде у кінці липня 2020 року. + [*] Незабаром: більше рівнів. [*] Allows me to further develop shapez.io ❤️ [/list] [img]{STEAM_APP_IMAGE}/extras/header_future_updates.png[/img] - I am updating the game very often and trying to push an update at least every week! + Я оновлюю гру надпрочуд часто і намагаюся випускати оновлення щотижня! [list] - [*] Different maps and challenges (e.g. maps with obstacles) - [*] Puzzles (Deliver the requested shape with a restricted area / set of buildings) - [*] A story mode where buildings have a cost - [*] Configurable map generator (Configure resource/shape size/density, seed and more) - [*] Additional types of shapes - [*] Performance improvements (The game already runs pretty well!) - [*] And much more! + [*] Різноманітні мапи та випробування (наприклад, мапи з перешкодами) + [*] Пазли (Надайте потрібну форму з обмеженою площею/набором будівель) + [*] Режим історії, де будівлі матимуть вартість + [*] Генератор мап, який можна налаштувати (ресурс/розмір/щільність форми, зерно та багато іншого) + [*] Додаткові типи форм + [*] Поліпшення продуктивності (Гра вже працює досить добре!) + [*] Та багато чого іншого! [/list] [img]{STEAM_APP_IMAGE}/extras/header_open_source.png[/img] - Anybody can contribute, I'm actively involved in the community and attempt to review all suggestions and take feedback into consideration where possible. - Be sure to check out my trello board for the full roadmap! + Будь-хто може зробити внесок, я активно беру участь у спільноті і намагаюся оцінити всі пропозиції і відгуки, та взяти до уваги, де це можливо. + Не забудьте перевірити мою дошку Trello заради повної дорожньої карти! [img]{STEAM_APP_IMAGE}/extras/header_links.png[/img] [list] - [*] [url=https://discord.com/invite/HN7EVzV]Official Discord[/url] - [*] [url=https://trello.com/b/ISQncpJP/shapezio]Roadmap[/url] - [*] [url=https://www.reddit.com/r/shapezio]Subreddit[/url] - [*] [url=https://github.com/tobspr/shapez.io]Source code (GitHub)[/url] - [*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Help translate[/url] + [*] [url=https://discord.com/invite/HN7EVzV]Офіційний Discord[/url] + [*] [url=https://trello.com/b/ISQncpJP/shapezio]Дорожня карта[/url] + [*] [url=https://www.reddit.com/r/shapezio]Спільнота на Reddit[/url] + [*] [url=https://github.com/tobspr/shapez.io]Вихідний код на GitHub[/url] + [*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Допоможіть з перекладом[/url] [/list] global: - loading: Loading - error: Error + loading: Завантаження + error: Помилка # How big numbers are rendered, e.g. "10,000" - thousandsDivider: "," + thousandsDivider: " " # What symbol to use to seperate the integer part from the fractional part of a number, e.g. "0.4" - decimalSeparator: "." + decimalSeparator: "," # The suffix for large numbers, e.g. 1.3k, 400.2M, etc. suffix: - thousands: k - millions: M - billions: B - trillions: T + thousands: тис. + millions: млн + billions: млрд + trillions: трлн # 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: одну секунду тому + xSecondsAgo: секунд тому + oneMinuteAgo: 1 хвилину тому + xMinutesAgo: хвилин тому + oneHourAgo: одну годину тому + xHoursAgo: годин тому + oneDayAgo: один день тому + 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 @@ -133,180 +139,180 @@ 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 - continue: Continue - newGame: New Game - changelog: Changelog + play: Грати + continue: Продовжити + newGame: Нова гра + changelog: Змінопис subreddit: Reddit - importSavegame: Import - openSourceHint: This game is open source! - discordLink: Official Discord Server - helpTranslate: Help translate! - madeBy: Made by + importSavegame: Імпортувати + openSourceHint: Ця гра з відкритим вихідним кодом! + discordLink: Офіційний Discord сервер + helpTranslate: Допоможіть перекласти! + madeBy: Зробив # 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 + savegameLevel: Рівень + savegameLevelUnknown: Невідомий рівень dialogs: buttons: - ok: OK - delete: Delete - cancel: Cancel - later: Later - restart: Restart - reset: Reset - getStandalone: Get Standalone - deleteGame: I know what I am doing - viewUpdate: View Update - showUpgrades: Show Upgrades - showKeybindings: Show Keybindings + ok: Гаразд + 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: Натисніть клавішу, яку ви хочете призначити, або escape для скасування. 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 getting the standalone version 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 version! + 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? + Ви видаляєте багато будівль (, якщо бути точним)! Ви справді хочете зробити це? massCutConfirm: - title: Confirm cut + title: Підтвердження вирізання desc: >- - You are cutting a lot of buildings ( to be exact)! Are you sure you want to do this? + Ви вирізаєте багато будівль(, якщо бути точним)! Ви справді хочете зробити це? massCutInsufficientConfirm: - title: Confirm cut + title: Підтвердити вирізання desc: >- - You can not afford to paste this area! Are you sure you want to cut it? + Ви не можете дозволити собі вставити цю область! Ви справді хочете вирізати це? blueprintsNotUnlocked: - title: Not unlocked yet + title: Ще не розблоковано desc: >- - Complete level 12 to unlock Blueprints! + Досягніть 13-го рівня, щоб розблокувати Blueprints! 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 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) - titleEdit: Edit Marker + title: Нова позначка + desc: Дайте йому змістовну назву, you can also include a short key of a shape (Which you can generate here) + titleEdit: Редагувати позначку markerDemoLimit: - desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers! + desc: Ви можете створити тільки 2 позначки в демоверсії. Отримайте окрему версії для створення необмеженної кількості позначок. 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! + title: Експортувати зняток + desc: Ви просили експортувати свою базу як знімок екрана. Зверніть увагу, що для великої бази це може бути досить повільним процесом і може навіть зруйнувати вашу гру! ingame: # This is shown in the top left corner and displays useful keybindings in # every situation keybindingsOverlay: - moveMap: Move - selectBuildings: Select area + moveMap: Рухатися + selectBuildings: Виділити будівлі stopPlacement: Stop placement - rotateBuilding: Rotate building + rotateBuilding: Повернути будівлю placeMultiple: Place multiple reverseOrientation: Reverse orientation disableAutoOrientation: Disable auto-orientation toggleHud: Toggle HUD placeBuilding: Place building - createMarker: Create marker - delete: Delete + createMarker: Створити позначку + delete: Видалити pasteLastBlueprint: Paste last blueprint lockBeltDirection: Enable belt planner plannerSwitchSide: Flip planner side - cutSelection: Cut - copySelection: Copy + cutSelection: Вирізати + copySelection: Скопіювати clearSelection: Clear selection - pipette: Pipette - switchLayers: Switch layers + pipette: Піпетка + switchLayers: Змінити шари # Names of the colors, used for the color blind mode colors: - red: Red - green: Green - blue: Blue - yellow: Yellow - purple: Purple - cyan: Cyan - white: White - black: Black - uncolored: No color + red: Червоний + green: Зелений + blue: Синій + yellow: Жовтий + purple: Фіолетовий + cyan: Блакитний + white: Білий + black: Чорний + uncolored: Без кольору # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -320,126 +326,126 @@ ingame: Hotkey: infoTexts: - speed: Speed + speed: Швидкість range: Range - storage: Storage - oneItemPerSecond: 1 item / second - itemsPerSecond: items / s + 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. + 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: МАКСИМАЛЬНИЙ РІВЕНЬ (Швидкість х) # The "Statistics" window statistics: - title: Statistics + title: Статистика dataSources: stored: - title: Stored + title: Зберігається description: Displaying amount of stored shapes in your central building. produced: - title: Produced + title: Виробляється description: Displaying all shapes your whole factory produces, including intermediate products. delivered: - title: Delivered + title: Доставлено 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 + 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. # Shape viewer shapeViewer: - title: Layers - empty: Empty + title: Шари + empty: Пустий copyKey: Copy Key # 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: Швидкість 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: @@ -563,8 +569,8 @@ buildings: 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 @@ -585,7 +591,7 @@ storyRewards: 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!

+ desc: Багатофункціональний балансир було розблоковано. Його можна використовувати для створення великих заводів, розділяючи та об’єднуючи предмети на кілька стрічок!

reward_tunnel: title: Tunnel @@ -634,21 +640,21 @@ storyRewards: # 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! + Цей рівень не дав нагороди, але в наступному... щось буде.

До речі, краще не руйнуйте свій поточний завод. Вам знадобляться всі ті форми пізніше, щоб розблокувати поліпшення! no_reward_freeplay: - title: Next level + title: Наступний рівень desc: >- - Congratulations! By the way, more content is planned for the standalone! + Вітаємо! До речі, більше контенту планується в окремій версії! settings: - title: Settings + title: Налаштування categories: - general: General - userInterface: User Interface - advanced: Advanced + general: Загальне + userInterface: Користувацький інтерфейс + advanced: Передове versionBadges: dev: Development @@ -658,102 +664,102 @@ settings: labels: uiScale: - title: Interface scale + title: Масштаб інтерфейсу description: >- - Changes the size of the user interface. The interface will still scale based on your device's resolution, but this setting controls the amount of scaling. + Змінює розмір користувацього інтерфейсу. Інтерфейс усе ще буде масштабуватися залежно від роздільної здатності вашого пристрою, але цей параметр контролює масштаб масштабування. scales: - super_small: Super small - small: Small - regular: Regular - large: Large - huge: Huge + super_small: Надзвичайно малий + small: Малий + regular: Звичайний + large: Великий + huge: Величезний autosaveInterval: - title: Autosave Interval + title: Проміжок між автозбереженнями 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 + one_minute: 1 хвилина + two_minutes: 2 хвилини + five_minutes: 5 хвилин + ten_minutes: 10 хвилин + twenty_minutes: 20 хвилин + disabled: Вимкнено 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: Надзвичайно швидка movementSpeed: - title: Movement speed + title: Швидкість руху 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 + super_slow: Надзвичайно повільна + slow: Повільна + regular: Звичайна + fast: Швидка + super_fast: Надзвичайно швидка + extremely_fast: Екстремально швидка language: - title: Language + title: Мова description: >- - Change the language. All translations are user-contributed and might be incomplete! + Змініть мову. Усі переклади зроблені користувачами і можуть бути незавершеними! enableColorBlindHelper: - title: Color Blind Mode + title: Режим високої контрастності description: >- - Enables various tools which allow you to play the game if you are color blind. + Дозволяє використовувати різні інструменти, які дозволяють грати в гру, якщо ви є дальтоніком. 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. + Якщо ви маєте 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 up to a given level to make it easier to get into the game. + Якщо увімкнено, то пропонує підказки та посібники під час гри. Також приховує певні елементи інтерфейсу до заданого рівня, щоб полегшити потрапляння в гру. enableTunnelSmartplace: - title: Smart Tunnels + title: Розумні Tunnels description: >- When enabled, placing tunnels will automatically remove unnecessary belts. This also enables you to drag tunnels and excess tunnels will get removed. @@ -778,15 +784,15 @@ settings: Disables 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. - resetKeybindings: Reset Keybindings + resetKeybindings: Скинути гарячі клавіші categoryLabels: - general: Application - ingame: Game + general: Застосунок + ingame: Гра navigation: Navigating placement: Placement massSelect: Mass Select @@ -794,8 +800,8 @@ keybindings: placementModifiers: Placement Modifiers mappings: - confirm: Confirm - back: Back + confirm: Підтвердити + back: Назад mapMoveUp: Move Up mapMoveRight: Move Right mapMoveDown: Move Down @@ -803,13 +809,13 @@ keybindings: mapMoveFaster: Move Faster centerMap: Center Map - mapZoomIn: Zoom in - mapZoomOut: Zoom out - createMarker: Create Marker + mapZoomIn: Приблизити + mapZoomOut: Віддалити + createMarker: Створити позначку - menuOpenShop: Upgrades - menuOpenStats: Statistics - menuClose: Close Menu + menuOpenShop: Поліпшення + menuOpenStats: Статистика + menuClose: Закрити меню toggleHud: Toggle HUD toggleFPSInfo: Toggle FPS and Debug Info @@ -829,12 +835,12 @@ keybindings: trash: *trash wire: *wire - pipette: Pipette - rotateWhilePlacing: Rotate + pipette: Pipetteї + rotateWhilePlacing: Повернути rotateInverseModifier: >- Modifier: Rotate CCW instead cycleBuildingVariants: Cycle Variants - confirmMassDelete: Delete area + confirmMassDelete: Видалити ділянку pasteLastBlueprint: Paste last blueprint cycleBuildings: Cycle Buildings lockBeltDirection: Enable belt planner @@ -842,36 +848,36 @@ keybindings: Planner: Switch side massSelectStart: Hold and drag to start - massSelectSelectMultiple: Select multiple areas - massSelectCopy: Copy area - massSelectCut: Cut area + massSelectSelectMultiple: + massSelectCopy: Копіювати ділянку + massSelectCut: Вирізати ділянку - placementDisableAutoOrientation: Disable automatic orientation + placementDisableAutoOrientation: Вимкнути автоматичну орієнтацію placeMultiple: Stay in placement mode placeInverse: Invert automatic belt orientation 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.

+ Якщо ви хочете зробити внесок, то йдіть на github shapez.io.

- 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.

+ Звуковий трек був зроблений гравцем Peppsen — він просто приголомшливий.

- Finally, huge thanks to my best friend Niklas - Without our factorio sessions, this game would never have existed. + І нарешті, величезна подяка моєму найкращому другу Niklas, бо без наших сеансів у факторіо ця гра ніколи б не існувала. 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: Обмежено одним збереженням + customizeKeybindings: Налаштування гарячих клавіш + exportingBase: Експортування цілої бази у вигляді зображення - settingNotAvailable: Not available in the demo. + settingNotAvailable: Недоступно в демоверсії. From 6d01c482d8ccb9f526836274066d9c604ae0a62f Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Mon, 27 Jul 2020 18:15:59 +0900 Subject: [PATCH 6/9] [Perf] Avoid iterating over keys to generate assert message (#486) * Avoid iterating over keys to generate assert message * Move assertion call behind guard * Shorten line by using string template --- src/js/core/sprites.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/core/sprites.js b/src/js/core/sprites.js index 26cd65b2..8427f2ef 100644 --- a/src/js/core/sprites.js +++ b/src/js/core/sprites.js @@ -158,7 +158,9 @@ export class AtlasSprite extends BaseSprite { const scale = parameters.desiredAtlasScale; const link = this.linksByResolution[scale]; - assert(link, "Link not known: " + scale + " (having " + Object.keys(this.linksByResolution) + ")"); + if (!link) { + assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`); + } const scaleW = w / link.w; const scaleH = h / link.h; From c47c7e0329f7ff077078cc3445ad4fd9389b943c Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Mon, 27 Jul 2020 18:16:16 +0900 Subject: [PATCH 7/9] Let's explicitly list yarn as a devDependency (#487) --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 11a88f04..bca0eac3 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ "sass-unused": "^0.3.0", "speed-measure-webpack-plugin": "^1.3.1", "strip-json-comments": "^3.0.1", - "trim": "^0.0.1" + "trim": "^0.0.1", + "yarn": "^1.22.4" } } diff --git a/yarn.lock b/yarn.lock index f88a9206..dff261d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9046,6 +9046,11 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.1" +yarn@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e" + integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA== + yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 1509d4994bb0e016e1e28eb1b52c757e1e13ef16 Mon Sep 17 00:00:00 2001 From: nukuuu <39561939+nukuuu@users.noreply.github.com> Date: Mon, 27 Jul 2020 10:16:30 +0100 Subject: [PATCH 8/9] Updated PT-PT translation to the latest version (#488) --- translations/base-pt-PT.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translations/base-pt-PT.yaml b/translations/base-pt-PT.yaml index 0e0c228d..9095f2d2 100644 --- a/translations/base-pt-PT.yaml +++ b/translations/base-pt-PT.yaml @@ -632,9 +632,9 @@ storyRewards: settings: title: Definições categories: - general: General - userInterface: User Interface - advanced: Advanced + general: Geral + userInterface: Interface + advanced: Avançado versionBadges: dev: Desenvolvimento From c4f6c8285f8d0210867746a822a233ba32f67add Mon Sep 17 00:00:00 2001 From: chaow108 <68765275+chaow108@users.noreply.github.com> Date: Mon, 27 Jul 2020 02:16:49 -0700 Subject: [PATCH 9/9] Update simplified Chinese translation (#493) * Simplified Chinese translation Cover some missed text that I already played. * Minor fix --- translations/base-zh-CN.yaml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/translations/base-zh-CN.yaml b/translations/base-zh-CN.yaml index deb0b7ae..3aad1244 100644 --- a/translations/base-zh-CN.yaml +++ b/translations/base-zh-CN.yaml @@ -300,8 +300,8 @@ dialogs: 你将要导出你的工厂的截图。如果你的基地很大,截图过程将会很慢,且有可能导致游戏崩溃! massCutInsufficientConfirm: - title: Confirm cut - desc: You can not afford to paste this area! Are you sure you want to cut it? + title: 确认剪切 + desc: 你没有足够的图形来粘贴这个区域!你确定要剪切吗? ingame: # This is shown in the top left corner and displays useful keybindings in @@ -443,11 +443,11 @@ ingame: cyan: 青色 white: 白色 uncolored: 无色 - black: Black + black: 黑色 shapeViewer: title: 层 # TODO: find better translation empty: 空 - copyKey: Copy Key + copyKey: 复制短代码 # All shop upgrades shopUpgrades: @@ -529,7 +529,7 @@ buildings: mixer: default: name: &mixer 混色机 - description: 将两个颜色混合在一起。(加法混合) + description: 用加法混色将两个颜色混合起来 painter: default: @@ -592,11 +592,11 @@ storyRewards: reward_painter: 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, there is a color blind mode in the settings! + 恭喜!你解锁了上色机。 开采一些颜色 (就像你开采图形一样) 将其在上色机中与图形结合来将图形上色!

PS: 如果你患有色盲,可以在设置中启用色盲模式! reward_mixer: title: 混合颜色 - desc: The mixer has been unlocked - Combine two colors using additive blending with this building! + desc: 恭喜!你解锁了混色机。这个建筑使用加法混色将两种颜色混合起来。 reward_stacker: title: 堆叠 @@ -616,7 +616,7 @@ storyRewards: 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: 二级隧道 @@ -624,7 +624,7 @@ storyRewards: reward_splitter_compact: title: 小型合流机 - desc: You have unlocked a compact variant of the balancer - It accepts two inputs and merges them into one! + desc: 恭喜!你解锁了平衡机的变体。它能够接受两个输入,合并成一个输出! reward_cutter_quad: title: 四向切割机 @@ -640,7 +640,7 @@ storyRewards: reward_storage: title: 仓库 - desc: You have unlocked a variant of the trash - It allows to store items up to a given capacity! + desc: 恭喜!你解锁了垃圾桶的变体。他可以存储一定数量的物品! reward_freeplay: title: 自由模式 @@ -664,9 +664,9 @@ storyRewards: settings: title: 设置 categories: - general: General - userInterface: User Interface - advanced: Advanced + general: 通用 + userInterface: 用户界面 + advanced: 高级 versionBadges: dev: 开发版本 # Development @@ -792,11 +792,9 @@ settings: title: 色盲模式 description: 提供一些分辨颜色的工具。目前当鼠标移至颜色资源上方时,屏幕上方会显示颜色名称。 rotationByBuilding: - title: Rotation by building type + title: 记忆建筑方向 description: >- - Each building type remembers the rotation you last set it to individually. - This may be more comfortable if you frequently switch between placing - different building types. + 每一类建筑都会记住各自上一次的旋转方向。如果你经常在不同建筑类型之间切换,这个设置会让游戏更加舒适。 keybindings: title: 按键设置