mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-13 13:04:03 +00:00
Merge branch 'master' into fix-typos
This commit is contained in:
commit
b8bce86634
199
package.json
199
package.json
@ -1,99 +1,100 @@
|
|||||||
{
|
{
|
||||||
"name": "shapez.io",
|
"name": "shapez.io",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"repository": "https://github.com/tobspr/shapez.io",
|
"repository": "https://github.com/tobspr/shapez.io",
|
||||||
"author": "Tobias Springer <tobias.springer1@gmail.com>",
|
"author": "Tobias Springer <tobias.springer1@gmail.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "cd gulp && yarn gulp main.serveDev",
|
"dev": "cd gulp && yarn gulp main.serveDev",
|
||||||
"tslint": "cd src/js && tsc",
|
"tslint": "cd src/js && tsc",
|
||||||
"lint": "eslint src/js",
|
"lint": "eslint src/js",
|
||||||
"prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*",
|
"prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*",
|
||||||
"publishOnItchWindows": "butler push tmp_standalone_files/shapez.io-standalone-win32-x64 tobspr/shapezio:windows --userversion-file version",
|
"publishOnItchWindows": "butler push tmp_standalone_files/shapez.io-standalone-win32-x64 tobspr/shapezio:windows --userversion-file version",
|
||||||
"publishOnItchLinux": "butler push tmp_standalone_files/shapez.io-standalone-linux-x64 tobspr/shapezio:linux --userversion-file version",
|
"publishOnItchLinux": "butler push tmp_standalone_files/shapez.io-standalone-linux-x64 tobspr/shapezio:linux --userversion-file version",
|
||||||
"publishOnItch": "yarn publishOnItchWindows && yarn publishOnItchLinux",
|
"publishOnItch": "yarn publishOnItchWindows && yarn publishOnItchLinux",
|
||||||
"publishOnSteam": "cd gulp/steampipe && ./upload.bat",
|
"publishOnSteam": "cd gulp/steampipe && ./upload.bat",
|
||||||
"publishStandalone": "yarn publishOnItch && yarn publishOnSteam",
|
"publishStandalone": "yarn publishOnItch && yarn publishOnSteam",
|
||||||
"publishWeb": "cd gulp && yarn main.deploy.prod",
|
"publishWeb": "cd gulp && yarn main.deploy.prod",
|
||||||
"publish": "yarn publishStandalone && yarn publishWeb",
|
"publish": "yarn publishStandalone && yarn publishWeb",
|
||||||
"syncTranslations": "node sync-translations.js"
|
"syncTranslations": "node sync-translations.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.5.4",
|
"@babel/core": "^7.5.4",
|
||||||
"@babel/plugin-transform-block-scoping": "^7.4.4",
|
"@babel/plugin-transform-block-scoping": "^7.4.4",
|
||||||
"@babel/plugin-transform-classes": "^7.5.5",
|
"@babel/plugin-transform-classes": "^7.5.5",
|
||||||
"@babel/preset-env": "^7.5.4",
|
"@babel/preset-env": "^7.5.4",
|
||||||
"@types/cordova": "^0.0.34",
|
"@types/cordova": "^0.0.34",
|
||||||
"@types/filesystem": "^0.0.29",
|
"@types/filesystem": "^0.0.29",
|
||||||
"ajv": "^6.10.2",
|
"ajv": "^6.10.2",
|
||||||
"babel-loader": "^8.0.4",
|
"babel-loader": "^8.0.4",
|
||||||
"circular-dependency-plugin": "^5.0.2",
|
"circular-dependency-plugin": "^5.0.2",
|
||||||
"circular-json": "^0.5.9",
|
"circular-json": "^0.5.9",
|
||||||
"clipboard-copy": "^3.1.0",
|
"clipboard-copy": "^3.1.0",
|
||||||
"colors": "^1.3.3",
|
"colors": "^1.3.3",
|
||||||
"core-js": "3",
|
"core-js": "3",
|
||||||
"crc": "^3.8.0",
|
"crc": "^3.8.0",
|
||||||
"cssnano-preset-advanced": "^4.0.7",
|
"cssnano-preset-advanced": "^4.0.7",
|
||||||
"email-validator": "^2.0.4",
|
"debounce-promise": "^3.1.2",
|
||||||
"eslint": "7.1.0",
|
"email-validator": "^2.0.4",
|
||||||
"fastdom": "^1.0.8",
|
"eslint": "7.1.0",
|
||||||
"flatted": "^2.0.1",
|
"fastdom": "^1.0.8",
|
||||||
"howler": "^2.1.2",
|
"flatted": "^2.0.1",
|
||||||
"html-loader": "^0.5.5",
|
"howler": "^2.1.2",
|
||||||
"ignore-loader": "^0.1.2",
|
"html-loader": "^0.5.5",
|
||||||
"logrocket": "^1.0.7",
|
"ignore-loader": "^0.1.2",
|
||||||
"lz-string": "^1.4.4",
|
"logrocket": "^1.0.7",
|
||||||
"markdown-loader": "^4.0.0",
|
"lz-string": "^1.4.4",
|
||||||
"match-all": "^1.2.5",
|
"markdown-loader": "^4.0.0",
|
||||||
"phonegap-plugin-mobile-accessibility": "^1.0.5",
|
"match-all": "^1.2.5",
|
||||||
"promise-polyfill": "^8.1.0",
|
"phonegap-plugin-mobile-accessibility": "^1.0.5",
|
||||||
"query-string": "^6.8.1",
|
"promise-polyfill": "^8.1.0",
|
||||||
"rusha": "^0.8.13",
|
"query-string": "^6.8.1",
|
||||||
"serialize-error": "^3.0.0",
|
"rusha": "^0.8.13",
|
||||||
"strictdom": "^1.0.1",
|
"serialize-error": "^3.0.0",
|
||||||
"string-replace-webpack-plugin": "^0.1.3",
|
"strictdom": "^1.0.1",
|
||||||
"terser-webpack-plugin": "^1.1.0",
|
"string-replace-webpack-plugin": "^0.1.3",
|
||||||
"typescript": "3.9.3",
|
"terser-webpack-plugin": "^1.1.0",
|
||||||
"uglify-template-string-loader": "^1.1.0",
|
"typescript": "3.9.3",
|
||||||
"unused-files-webpack-plugin": "^3.4.0",
|
"uglify-template-string-loader": "^1.1.0",
|
||||||
"webpack": "^4.43.0",
|
"unused-files-webpack-plugin": "^3.4.0",
|
||||||
"webpack-bundle-analyzer": "^3.0.3",
|
"webpack": "^4.43.0",
|
||||||
"webpack-cli": "^3.1.0",
|
"webpack-bundle-analyzer": "^3.0.3",
|
||||||
"webpack-deep-scope-plugin": "^1.6.0",
|
"webpack-cli": "^3.1.0",
|
||||||
"webpack-plugin-replace": "^1.1.1",
|
"webpack-deep-scope-plugin": "^1.6.0",
|
||||||
"webpack-strip-block": "^0.2.0",
|
"webpack-plugin-replace": "^1.1.1",
|
||||||
"whatwg-fetch": "^3.0.0",
|
"webpack-strip-block": "^0.2.0",
|
||||||
"worker-loader": "^2.0.0",
|
"whatwg-fetch": "^3.0.0",
|
||||||
"yaml": "^1.10.0",
|
"worker-loader": "^2.0.0",
|
||||||
"yawn-yaml": "^1.5.0"
|
"yaml": "^1.10.0",
|
||||||
},
|
"yawn-yaml": "^1.5.0"
|
||||||
"devDependencies": {
|
},
|
||||||
"@typescript-eslint/eslint-plugin": "3.0.1",
|
"devDependencies": {
|
||||||
"@typescript-eslint/parser": "3.0.1",
|
"@typescript-eslint/eslint-plugin": "3.0.1",
|
||||||
"autoprefixer": "^9.4.3",
|
"@typescript-eslint/parser": "3.0.1",
|
||||||
"babel-plugin-closure-elimination": "^1.3.0",
|
"autoprefixer": "^9.4.3",
|
||||||
"babel-plugin-console-source": "^2.0.2",
|
"babel-plugin-closure-elimination": "^1.3.0",
|
||||||
"babel-plugin-danger-remove-unused-import": "^1.1.2",
|
"babel-plugin-console-source": "^2.0.2",
|
||||||
"css-mqpacker": "^7.0.0",
|
"babel-plugin-danger-remove-unused-import": "^1.1.2",
|
||||||
"cssnano": "^4.1.10",
|
"css-mqpacker": "^7.0.0",
|
||||||
"eslint-config-prettier": "6.11.0",
|
"cssnano": "^4.1.10",
|
||||||
"eslint-plugin-prettier": "3.1.3",
|
"eslint-config-prettier": "6.11.0",
|
||||||
"faster.js": "^1.1.0",
|
"eslint-plugin-prettier": "3.1.3",
|
||||||
"glob": "^7.1.3",
|
"faster.js": "^1.1.0",
|
||||||
"imagemin-mozjpeg": "^8.0.0",
|
"glob": "^7.1.3",
|
||||||
"imagemin-pngquant": "^8.0.0",
|
"imagemin-mozjpeg": "^8.0.0",
|
||||||
"jimp": "^0.6.1",
|
"imagemin-pngquant": "^8.0.0",
|
||||||
"js-yaml": "^3.13.1",
|
"jimp": "^0.6.1",
|
||||||
"postcss-assets": "^5.0.0",
|
"js-yaml": "^3.13.1",
|
||||||
"postcss-preset-env": "^6.5.0",
|
"postcss-assets": "^5.0.0",
|
||||||
"postcss-round-subpixels": "^1.2.0",
|
"postcss-preset-env": "^6.5.0",
|
||||||
"postcss-unprefix": "^2.1.3",
|
"postcss-round-subpixels": "^1.2.0",
|
||||||
"prettier": "^2.0.4",
|
"postcss-unprefix": "^2.1.3",
|
||||||
"sass-unused": "^0.3.0",
|
"prettier": "^2.0.4",
|
||||||
"strip-json-comments": "^3.0.1",
|
"sass-unused": "^0.3.0",
|
||||||
"trim": "^0.0.1",
|
"strip-json-comments": "^3.0.1",
|
||||||
"yarn": "^1.22.4"
|
"trim": "^0.0.1",
|
||||||
}
|
"yarn": "^1.22.4"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:a4f810fcfbfcea08cfb48a8d58f9b65d1fd14cd20ff3cabf94a03c39b5250547
|
oid sha256:3207e92c0fa5e71030d04c739647032be2697bf910eb7b7d9548bf04e95803b1
|
||||||
size 1765124
|
size 1223220
|
||||||
|
@ -351,12 +351,12 @@ canvas {
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pressed {
|
.pressed:not(.noPressEffect) {
|
||||||
transform: scale(0.98) !important;
|
transform: scale(0.98) !important;
|
||||||
animation: none !important;
|
animation: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pressedSmallElement {
|
.pressedSmallElement:not(.noPressEffect) {
|
||||||
transform: scale(0.88) !important;
|
transform: scale(0.88) !important;
|
||||||
animation: none !important;
|
animation: none !important;
|
||||||
}
|
}
|
||||||
@ -570,36 +570,46 @@ canvas {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.range {
|
.rangeInputContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
|
label {
|
||||||
|
@include S(margin-right, 5px);
|
||||||
|
&,
|
||||||
|
& * {
|
||||||
|
@include PlainText;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.range-input {
|
input.rangeInput {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
width: 100px;
|
@include S(width, 100px);
|
||||||
height: 10px;
|
@include S(height, 16px);
|
||||||
transform: translate(7px, 2px);
|
|
||||||
&::-webkit-slider-runnable-track {
|
&::-webkit-slider-runnable-track {
|
||||||
background-color: darken($mainBgColor, 3);
|
background-color: darken($mainBgColor, 3);
|
||||||
color: darken($mainBgColor, 3);
|
color: darken($mainBgColor, 3);
|
||||||
height: 16px;
|
// @include S(height, 16px);
|
||||||
border-radius: 8px;
|
@include S(border-radius, 8px);
|
||||||
}
|
}
|
||||||
|
|
||||||
&::-webkit-slider-thumb {
|
&::-webkit-slider-thumb {
|
||||||
appearance: none;
|
appearance: none;
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
box-shadow: inset 0 0 0 10px $themeColor;
|
box-shadow: inset 0 0 0 D(10px) $themeColor;
|
||||||
background-color: transparent;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
transition: 0.3s;
|
|
||||||
|
transition: box-shadow 0.3s;
|
||||||
}
|
}
|
||||||
&:hover::-webkit-slider-thumb {
|
|
||||||
box-shadow: inset 0 0 0 10px lighten($themeColor, 15);
|
&:hover {
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
box-shadow: inset 0 0 0 D(10px) lighten($themeColor, 15);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
background-color: #55585a;
|
background-color: #55585a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transition: opacity 0.1s ease-out;
|
||||||
|
&.hovered {
|
||||||
|
opacity: 0.1;
|
||||||
|
.buildingImage {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.buildingLabel {
|
.buildingLabel {
|
||||||
@include PlainText;
|
@include PlainText;
|
||||||
@include S(margin-bottom, 2px);
|
@include S(margin-bottom, 2px);
|
||||||
@ -70,6 +78,7 @@
|
|||||||
@include S(height, 100px);
|
@include S(height, 100px);
|
||||||
background: top left / 100% 100% no-repeat;
|
background: top left / 100% 100% no-repeat;
|
||||||
@include S(border-radius, $globalBorderRadius);
|
@include S(border-radius, $globalBorderRadius);
|
||||||
|
transition: opacity 0.1s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@include StyleBelowWidth(700px) {
|
@include StyleBelowWidth(700px) {
|
||||||
|
@ -1,160 +1,147 @@
|
|||||||
#ingame_HUD_GameMenu {
|
#ingame_HUD_GameMenu {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
grid-auto-flow: column;
|
grid-auto-flow: column;
|
||||||
|
|
||||||
> .menuButtons {
|
> .menuButtons {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
@include S(padding, 5px, 4px);
|
@include S(padding, 5px, 4px);
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
@include S(margin-left, 20px);
|
@include S(margin-left, 20px);
|
||||||
|
|
||||||
> .button {
|
> .button {
|
||||||
@include S(width, 30px);
|
@include S(width, 30px);
|
||||||
@include S(height, 30px);
|
@include S(height, 30px);
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background: center center / 60% no-repeat;
|
background: center center / 60% no-repeat;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.12s ease-in-out;
|
transition: all 0.12s ease-in-out;
|
||||||
transition-property: opacity, transform;
|
transition-property: opacity, transform;
|
||||||
will-change: opacity;
|
will-change: opacity;
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
@include S(margin-left, 5px);
|
@include S(margin-left, 5px);
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
@include IncreasedClickArea(0px);
|
@include IncreasedClickArea(0px);
|
||||||
|
|
||||||
@include DarkThemeInvert;
|
@include DarkThemeInvert;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
&.music {
|
|
||||||
background-image: uiResource("icons/music_on.png");
|
&.save {
|
||||||
&.muted {
|
background-image: uiResource("icons/save.png");
|
||||||
background-image: uiResource("icons/music_off.png");
|
@include MakeAnimationWrappedEvenOdd(0.5s ease-in-out) {
|
||||||
}
|
0% {
|
||||||
}
|
transform: scale(1, 1);
|
||||||
|
}
|
||||||
&.sfx {
|
|
||||||
background-image: uiResource("icons/sound_on.png");
|
70% {
|
||||||
&.muted {
|
transform: scale(1.5, 1.5) rotate(20deg);
|
||||||
background-image: uiResource("icons/sound_off.png");
|
opacity: 0.2;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
85% {
|
||||||
&.save {
|
transform: scale(0.9, 0.9);
|
||||||
background-image: uiResource("icons/save.png");
|
opacity: 1;
|
||||||
@include MakeAnimationWrappedEvenOdd(0.5s ease-in-out) {
|
}
|
||||||
0% {
|
|
||||||
transform: scale(1, 1);
|
90% {
|
||||||
}
|
transform: scale(1.1, 1.1);
|
||||||
|
}
|
||||||
70% {
|
}
|
||||||
transform: scale(1.5, 1.5) rotate(20deg);
|
}
|
||||||
opacity: 0.2;
|
|
||||||
}
|
&.settings {
|
||||||
|
background-image: uiResource("icons/settings.png");
|
||||||
85% {
|
}
|
||||||
transform: scale(0.9, 0.9);
|
}
|
||||||
opacity: 1;
|
}
|
||||||
}
|
|
||||||
|
.buttonContainer button {
|
||||||
90% {
|
@include PlainText;
|
||||||
transform: scale(1.1, 1.1);
|
color: #fff;
|
||||||
}
|
border-color: rgba(0, 0, 0, 0.1);
|
||||||
}
|
@include S(padding, 5px, 5px, 5px);
|
||||||
}
|
|
||||||
|
@include S(padding-left, 30px);
|
||||||
&.settings {
|
@include S(margin-right, 3px);
|
||||||
background-image: uiResource("icons/settings.png");
|
@include IncreasedClickArea(0px);
|
||||||
}
|
@include ButtonText;
|
||||||
}
|
@include S(min-height, 40px);
|
||||||
}
|
transition: all 0.12s ease-in-out;
|
||||||
|
transition-property: opacity, transform;
|
||||||
.buttonContainer button {
|
display: inline-flex;
|
||||||
@include PlainText;
|
background: center #{D(13px)} / #{D(20px)} no-repeat;
|
||||||
color: #fff;
|
background-color: $colorGreenBright;
|
||||||
border-color: rgba(0, 0, 0, 0.1);
|
|
||||||
@include S(padding, 5px, 5px, 5px);
|
&[data-button-id="shop"] {
|
||||||
|
background-color: rgb(93, 103, 250);
|
||||||
@include S(padding-left, 30px);
|
background-image: uiResource("icons/shop.png");
|
||||||
@include S(margin-right, 3px);
|
background-size: #{D(18px)};
|
||||||
@include IncreasedClickArea(0px);
|
}
|
||||||
@include ButtonText;
|
&[data-button-id="stats"] {
|
||||||
@include S(min-height, 40px);
|
background-color: rgb(85, 199, 138);
|
||||||
transition: all 0.12s ease-in-out;
|
background-image: uiResource("icons/statistics.png");
|
||||||
transition-property: opacity, transform;
|
}
|
||||||
display: inline-flex;
|
|
||||||
background: center #{D(13px)} / #{D(20px)} no-repeat;
|
&:hover {
|
||||||
background-color: $colorGreenBright;
|
opacity: 0.9;
|
||||||
|
}
|
||||||
&[data-button-id="shop"] {
|
|
||||||
background-color: rgb(93, 103, 250);
|
.keybinding {
|
||||||
background-image: uiResource("icons/shop.png");
|
border: 0;
|
||||||
background-size: #{D(18px)};
|
color: #fff;
|
||||||
}
|
border-top-left-radius: 0;
|
||||||
&[data-button-id="stats"] {
|
border-top-right-radius: 0;
|
||||||
background-color: rgb(85, 199, 138);
|
bottom: unset;
|
||||||
background-image: uiResource("icons/statistics.png");
|
background: transparent;
|
||||||
}
|
@include S(top, 0px);
|
||||||
|
right: unset;
|
||||||
&:hover {
|
left: 50%;
|
||||||
opacity: 0.9;
|
transform: translateX(-50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.keybinding {
|
&:not(.hasBadge) .badge {
|
||||||
border: 0;
|
display: none;
|
||||||
color: #fff;
|
}
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
&.hasBadge {
|
||||||
bottom: unset;
|
transform-origin: 50% 0%;
|
||||||
background: transparent;
|
@include InlineAnimation(1s ease-in-out infinite) {
|
||||||
@include S(top, 0px);
|
50% {
|
||||||
right: unset;
|
transform: scale(1.02);
|
||||||
left: 50%;
|
}
|
||||||
transform: translateX(-50%);
|
}
|
||||||
}
|
|
||||||
|
.badge {
|
||||||
&:not(.hasBadge) .badge {
|
position: absolute;
|
||||||
display: none;
|
@include S(bottom, -8px);
|
||||||
}
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
&.hasBadge {
|
|
||||||
transform-origin: 50% 0%;
|
background: #333;
|
||||||
@include InlineAnimation(1s ease-in-out infinite) {
|
@include PlainText;
|
||||||
50% {
|
display: flex;
|
||||||
transform: scale(1.02);
|
justify-content: center;
|
||||||
}
|
align-items: center;
|
||||||
}
|
@include S(min-width, 5px);
|
||||||
|
@include S(height, 10px);
|
||||||
.badge {
|
@include S(padding, 1px, 3px, 2px);
|
||||||
position: absolute;
|
@include S(border-radius, $globalBorderRadius);
|
||||||
@include S(bottom, -8px);
|
border: #{D(1px)} solid #fff;
|
||||||
left: 50%;
|
@include InlineAnimation(1s ease-in-out infinite) {
|
||||||
transform: translateX(-50%);
|
50% {
|
||||||
|
transform: translateX(-50%) scale(1.05);
|
||||||
background: #333;
|
}
|
||||||
@include PlainText;
|
}
|
||||||
display: flex;
|
}
|
||||||
justify-content: center;
|
}
|
||||||
align-items: center;
|
}
|
||||||
@include S(min-width, 5px);
|
}
|
||||||
@include S(height, 10px);
|
|
||||||
@include S(padding, 1px, 3px, 2px);
|
|
||||||
@include S(border-radius, $globalBorderRadius);
|
|
||||||
border: #{D(1px)} solid #fff;
|
|
||||||
@include InlineAnimation(1s ease-in-out infinite) {
|
|
||||||
50% {
|
|
||||||
transform: translateX(-50%) scale(1.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -29,6 +29,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pointer-events: all;
|
||||||
|
|
||||||
|
transition: opacity 0.1s ease-out;
|
||||||
|
&.hovered {
|
||||||
|
opacity: 10%;
|
||||||
|
.helperGif {
|
||||||
|
opacity: 0%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
@ -48,5 +58,6 @@
|
|||||||
@include S(margin-top, 5px);
|
@include S(margin-top, 5px);
|
||||||
@include S(height, 150px);
|
@include S(height, 150px);
|
||||||
background: center center / contain no-repeat;
|
background: center center / contain no-repeat;
|
||||||
|
transition: opacity 0.1s ease-out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,69 +1,74 @@
|
|||||||
#ingame_HUD_KeybindingOverlay {
|
#ingame_HUD_KeybindingOverlay {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@include S(top, 10px);
|
@include S(top, 10px);
|
||||||
@include S(left, 10px);
|
@include S(left, 10px);
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
color: #333438;
|
color: #333438;
|
||||||
backdrop-filter: blur(D(2px));
|
backdrop-filter: blur(D(2px));
|
||||||
padding: D(3px);
|
padding: D(3px);
|
||||||
|
|
||||||
@include DarkThemeOverride {
|
@include DarkThemeOverride {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
> .binding {
|
transition: opacity 0.1s ease-out;
|
||||||
&:not(.visible) {
|
&.hovered {
|
||||||
display: none !important;
|
opacity: 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
display: inline-grid;
|
> .binding {
|
||||||
@include PlainText;
|
&:not(.visible) {
|
||||||
align-items: center;
|
display: none !important;
|
||||||
@include S(margin-bottom, 3px);
|
}
|
||||||
grid-auto-flow: column;
|
|
||||||
@include S(grid-gap, 2px);
|
display: inline-grid;
|
||||||
|
@include PlainText;
|
||||||
i {
|
align-items: center;
|
||||||
display: inline-block;
|
@include S(margin-bottom, 3px);
|
||||||
@include S(height, 10px);
|
grid-auto-flow: column;
|
||||||
width: 1px;
|
@include S(grid-gap, 2px);
|
||||||
@include S(margin, 0, 3px);
|
|
||||||
background-color: #fff;
|
i {
|
||||||
transform: rotate(10deg);
|
display: inline-block;
|
||||||
// @include S(margin, 0, 3px);
|
@include S(height, 10px);
|
||||||
}
|
width: 1px;
|
||||||
|
@include S(margin, 0, 3px);
|
||||||
code {
|
background-color: #fff;
|
||||||
position: relative;
|
transform: rotate(10deg);
|
||||||
top: unset;
|
// @include S(margin, 0, 3px);
|
||||||
left: unset;
|
}
|
||||||
margin: 0;
|
|
||||||
&.rightMouse {
|
code {
|
||||||
background: #fff uiResource("icons/mouse_right.png") center center / 85% no-repeat;
|
position: relative;
|
||||||
}
|
top: unset;
|
||||||
|
left: unset;
|
||||||
&.leftMouse {
|
margin: 0;
|
||||||
background: #fff uiResource("icons/mouse_left.png") center center / 85% no-repeat;
|
&.rightMouse {
|
||||||
}
|
background: #fff uiResource("icons/mouse_right.png") center center / 85% no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
label {
|
&.leftMouse {
|
||||||
color: #333438;
|
background: #fff uiResource("icons/mouse_left.png") center center / 85% no-repeat;
|
||||||
@include SuperSmallText;
|
}
|
||||||
text-transform: uppercase;
|
}
|
||||||
// color: #fff;
|
|
||||||
@include DarkThemeOverride {
|
label {
|
||||||
color: #fff;
|
color: #333438;
|
||||||
}
|
@include SuperSmallText;
|
||||||
|
text-transform: uppercase;
|
||||||
@include S(margin-left, 5px);
|
// color: #fff;
|
||||||
}
|
@include DarkThemeOverride {
|
||||||
}
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.uiHidden #ingame_HUD_KeybindingOverlay .binding:not(.hudToggle) {
|
@include S(margin-left, 5px);
|
||||||
display: none;
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.uiHidden #ingame_HUD_KeybindingOverlay .binding:not(.hudToggle) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@ -1,95 +1,107 @@
|
|||||||
#ingame_HUD_Waypoints_Hint {
|
#ingame_HUD_Waypoints_Hint {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@include S(right, 10px);
|
@include S(right, 10px);
|
||||||
@include S(bottom, 10px);
|
@include S(bottom, 10px);
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
@include PlainText;
|
@include PlainText;
|
||||||
@include S(width, 150px);
|
@include S(width, 150px);
|
||||||
background: rgba(0, 10, 20, 0.5);
|
background: rgba(0, 10, 20, 0.5);
|
||||||
@include S(padding, 5px);
|
@include S(padding, 5px);
|
||||||
|
|
||||||
color: #eee;
|
color: #eee;
|
||||||
|
|
||||||
.desc {
|
.desc {
|
||||||
@include SuperSmallText;
|
@include SuperSmallText;
|
||||||
color: #babcbf;
|
color: #babcbf;
|
||||||
.keybinding {
|
.keybinding {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ingame_HUD_Waypoints {
|
#ingame_HUD_Waypoints {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@include S(right, 10px);
|
@include S(right, 10px);
|
||||||
@include S(top, 45px);
|
@include S(top, 45px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@include DarkThemeInvert();
|
@include DarkThemeInvert();
|
||||||
|
|
||||||
.waypoint {
|
max-height: 50vh;
|
||||||
@include SuperSmallText;
|
overflow-x: hidden;
|
||||||
pointer-events: all;
|
overflow-y: auto;
|
||||||
cursor: pointer;
|
pointer-events: all;
|
||||||
color: #333438;
|
@include S(padding-right, 5px);
|
||||||
@include S(padding-left, 11px);
|
|
||||||
display: grid;
|
// Scrollbar
|
||||||
grid-template-columns: 1fr auto;
|
&::-webkit-scrollbar {
|
||||||
align-items: center;
|
@include S(width, 2px);
|
||||||
background: uiResource("icons/waypoint.png") left 50% / #{D(8px)} no-repeat;
|
@include S(height, 6px);
|
||||||
opacity: 0.7;
|
}
|
||||||
@include S(margin-bottom, 1px);
|
|
||||||
font-weight: bold;
|
.waypoint {
|
||||||
|
@include SuperSmallText;
|
||||||
&:hover {
|
pointer-events: all;
|
||||||
opacity: 0.8;
|
cursor: pointer;
|
||||||
}
|
color: #333438;
|
||||||
|
@include S(padding-left, 11px);
|
||||||
.editButton {
|
display: grid;
|
||||||
@include S(width, 10px);
|
grid-template-columns: 1fr auto;
|
||||||
@include S(height, 10px);
|
align-items: center;
|
||||||
@include S(margin-left, 4px);
|
background: uiResource("icons/waypoint.png") left 50% / #{D(8px)} no-repeat;
|
||||||
background: uiResource("icons/edit_key.png") center center / 70% no-repeat;
|
opacity: 0.7;
|
||||||
pointer-events: all;
|
@include S(margin-bottom, 1px);
|
||||||
cursor: pointer;
|
font-weight: bold;
|
||||||
position: relative;
|
|
||||||
@include IncreasedClickArea(2px);
|
&:hover {
|
||||||
transition: transform 0.04s ease-in-out;
|
opacity: 0.8;
|
||||||
|
}
|
||||||
&:hover {
|
|
||||||
transform: scale(1.5);
|
.editButton {
|
||||||
}
|
@include S(width, 10px);
|
||||||
}
|
@include S(height, 10px);
|
||||||
|
@include S(margin-left, 4px);
|
||||||
&.hub {
|
background: uiResource("icons/edit_key.png") center center / 70% no-repeat;
|
||||||
// Transform because there is a canvas before
|
pointer-events: all;
|
||||||
@include S(margin-left, -2px);
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
grid-template-columns: auto 1fr;
|
@include IncreasedClickArea(2px);
|
||||||
background: none !important;
|
transition: transform 0.04s ease-in-out;
|
||||||
@include S(padding-left, 0);
|
|
||||||
canvas {
|
&:hover {
|
||||||
@include S(width, 12px);
|
transform: scale(1.5);
|
||||||
@include S(height, 12px);
|
}
|
||||||
@include S(margin-right, 1px);
|
}
|
||||||
}
|
|
||||||
}
|
&.hub {
|
||||||
|
// Transform because there is a canvas before
|
||||||
&.shapeIcon {
|
@include S(margin-left, -2px);
|
||||||
canvas {
|
|
||||||
@include S(width, 15px);
|
grid-template-columns: auto 1fr;
|
||||||
@include S(height, 15px);
|
background: none !important;
|
||||||
pointer-events: none;
|
@include S(padding-left, 0);
|
||||||
// Double invert, to make sure it has the right color
|
canvas {
|
||||||
@include DarkThemeInvert();
|
@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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,188 +1,188 @@
|
|||||||
#state_SettingsState {
|
#state_SettingsState {
|
||||||
$colorCategoryButton: #eee;
|
$colorCategoryButton: #eee;
|
||||||
$colorCategoryButtonSelected: #5f748b;
|
$colorCategoryButtonSelected: #5f748b;
|
||||||
|
|
||||||
.container .content {
|
.container .content {
|
||||||
display: flex;
|
display: flex;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
|
|
||||||
.categoryContainer {
|
.categoryContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.category {
|
.category {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting {
|
.setting {
|
||||||
@include S(padding, 10px);
|
@include S(padding, 10px);
|
||||||
background: #eeeff5;
|
background: #eeeff5;
|
||||||
@include S(border-radius, $globalBorderRadius);
|
@include S(border-radius, $globalBorderRadius);
|
||||||
@include S(margin-bottom, 5px);
|
@include S(margin-bottom, 5px);
|
||||||
|
|
||||||
label {
|
.desc {
|
||||||
text-transform: uppercase;
|
@include S(margin-top, 5px);
|
||||||
@include Text;
|
@include SuperSmallText;
|
||||||
}
|
color: #aaadb2;
|
||||||
|
}
|
||||||
.desc {
|
|
||||||
@include S(margin-top, 5px);
|
> .row {
|
||||||
@include SuperSmallText;
|
display: grid;
|
||||||
color: #aaadb2;
|
align-items: center;
|
||||||
}
|
grid-template-columns: 1fr auto;
|
||||||
|
|
||||||
> .row {
|
> label {
|
||||||
display: grid;
|
text-transform: uppercase;
|
||||||
align-items: center;
|
@include Text;
|
||||||
grid-template-columns: 1fr auto;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.disabled {
|
&.disabled {
|
||||||
// opacity: 0.3;
|
// opacity: 0.3;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
* {
|
* {
|
||||||
pointer-events: none !important;
|
pointer-events: none !important;
|
||||||
cursor: default !important;
|
cursor: default !important;
|
||||||
}
|
}
|
||||||
position: relative;
|
position: relative;
|
||||||
.standaloneOnlyHint {
|
.standaloneOnlyHint {
|
||||||
@include PlainText;
|
@include PlainText;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background: rgba(#fff, 0.5);
|
background: rgba(#fff, 0.5);
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
color: $colorRedBright;
|
color: $colorRedBright;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.value.enum {
|
.value.enum {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
@include PlainText;
|
@include PlainText;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@include S(min-width, 100px);
|
@include S(min-width, 100px);
|
||||||
@include S(border-radius, $globalBorderRadius);
|
@include S(border-radius, $globalBorderRadius);
|
||||||
@include S(padding, 4px);
|
@include S(padding, 4px);
|
||||||
@include S(padding-right, 15px);
|
@include S(padding-right, 15px);
|
||||||
|
|
||||||
background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
|
background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
|
||||||
calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
|
calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
|
||||||
|
|
||||||
transition: background-color 0.12s ease-in-out;
|
transition: background-color 0.12s ease-in-out;
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #fafafa;
|
background-color: #fafafa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar {
|
.sidebar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@include S(min-width, 210px);
|
@include S(min-width, 210px);
|
||||||
@include S(max-width, 320px);
|
@include S(max-width, 320px);
|
||||||
width: 30%;
|
width: 30%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
@include S(margin-left, 20px);
|
@include S(margin-left, 20px);
|
||||||
@include S(margin-right, 32px);
|
@include S(margin-right, 32px);
|
||||||
|
|
||||||
.other {
|
.other {
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
@include S(margin-top, 4px);
|
@include S(margin-top, 4px);
|
||||||
width: calc(100% - #{D(20px)});
|
width: calc(100% - #{D(20px)});
|
||||||
text-align: start;
|
text-align: start;
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
content: unset;
|
content: unset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
button.categoryButton,
|
button.categoryButton,
|
||||||
button.about {
|
button.about {
|
||||||
background-color: $colorCategoryButton;
|
background-color: $colorCategoryButton;
|
||||||
color: #777a7f;
|
color: #777a7f;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background-color: $colorCategoryButtonSelected;
|
background-color: $colorCategoryButtonSelected;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.pressed {
|
&.pressed {
|
||||||
transform: none !important;
|
transform: none !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.versionbar {
|
.versionbar {
|
||||||
@include S(margin-top, 20px);
|
@include S(margin-top, 20px);
|
||||||
@include SuperSmallText;
|
@include SuperSmallText;
|
||||||
display: grid;
|
display: grid;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
grid-template-columns: 1fr auto;
|
grid-template-columns: 1fr auto;
|
||||||
.buildVersion {
|
.buildVersion {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
color: #aaadaf;
|
color: #aaadaf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@include DarkThemeOverride {
|
@include DarkThemeOverride {
|
||||||
.container .content {
|
.container .content {
|
||||||
.sidebar {
|
.sidebar {
|
||||||
button.categoryButton,
|
button.categoryButton,
|
||||||
button.about {
|
button.about {
|
||||||
background-color: #3f3f47;
|
background-color: #3f3f47;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background-color: $colorBlueBright;
|
background-color: $colorBlueBright;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.categoryContainer {
|
.categoryContainer {
|
||||||
.category {
|
.category {
|
||||||
.setting {
|
.setting {
|
||||||
background: darken($darkModeGameBackground, 10);
|
background: darken($darkModeGameBackground, 10);
|
||||||
|
|
||||||
.value.enum {
|
.value.enum {
|
||||||
// dirty but works
|
// dirty but works
|
||||||
filter: invert(0.78) sepia(40%) hue-rotate(190deg);
|
filter: invert(0.78) sepia(40%) hue-rotate(190deg);
|
||||||
color: #222;
|
color: #222;
|
||||||
}
|
}
|
||||||
|
|
||||||
.value.checkbox {
|
.value.checkbox {
|
||||||
background-color: #74767b;
|
background-color: #74767b;
|
||||||
|
|
||||||
&.checked {
|
&.checked {
|
||||||
background-color: $colorBlueBright;
|
background-color: $colorBlueBright;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,14 +18,18 @@ export const CHANGELOG = [
|
|||||||
"Tier 2 tunnels are now 9 tiles wide, so the gap between is 8 tiles (double the tier 1 range)",
|
"Tier 2 tunnels are now 9 tiles wide, so the gap between is 8 tiles (double the tier 1 range)",
|
||||||
"Updated and added new translations (Thanks to all contributors!)",
|
"Updated and added new translations (Thanks to all contributors!)",
|
||||||
"Added setting to be able to delete buildings while placing (inspired by hexy)",
|
"Added setting to be able to delete buildings while placing (inspired by hexy)",
|
||||||
|
"You can now adjust the sound and music volumes! (inspired by Yoshie2000)",
|
||||||
|
"Some hud elements now have reduced opacity when hovering, so you can see through (inspired by mvb005)",
|
||||||
"Mark pinned shapes in statistics dialog and show them first (inspired by davidburhans)",
|
"Mark pinned shapes in statistics dialog and show them first (inspired by davidburhans)",
|
||||||
"Added setting to show chunk borders",
|
"Added setting to show chunk borders",
|
||||||
"Quad painters have been reworked! They now are integrated with the wires, and only paint the shape when the value is 1 (inspired by dengr1605)",
|
"Quad painters have been reworked! They now are integrated with the wires, and only paint the shape when the value is 1 (inspired by dengr1605)",
|
||||||
"There are now compact 1x1 splitters available to be unlocked!",
|
"There are now compact 1x1 splitters available to be unlocked!",
|
||||||
|
"Replaced level completion sound to be less distracting",
|
||||||
"Allow editing waypoints (by isaisstillalive)",
|
"Allow editing waypoints (by isaisstillalive)",
|
||||||
"Show confirmation when cutting area which is too expensive to get pasted again (by isaisstillalive)",
|
"Show confirmation when cutting area which is too expensive to get pasted again (by isaisstillalive)",
|
||||||
"Show mouse and camera tile on debug overlay (F4) (by dengr)",
|
"Show mouse and camera tile on debug overlay (F4) (by dengr)",
|
||||||
"Fix tunnels entrances connecting to exits sometimes when they shouldn't",
|
"Fixed tunnels entrances connecting to exits sometimes when they shouldn't",
|
||||||
|
"Added setting to auto select the extractor when pipetting a resource patch (by Exund)",
|
||||||
"The initial belt planner direction is now based on the cursor movement (by MizardX)",
|
"The initial belt planner direction is now based on the cursor movement (by MizardX)",
|
||||||
"Fix preferred variant not getting saved when clicking on the hud (by Danacus)",
|
"Fix preferred variant not getting saved when clicking on the hud (by Danacus)",
|
||||||
],
|
],
|
||||||
|
@ -1,331 +1,347 @@
|
|||||||
/* typehints:start */
|
/* typehints:start */
|
||||||
import { Application } from "../application";
|
import { Application } from "../application";
|
||||||
/* typehints:end */
|
/* typehints:end */
|
||||||
|
|
||||||
import { sha1, CRC_PREFIX, computeCrc } from "./sensitive_utils.encrypt";
|
import { sha1, CRC_PREFIX, computeCrc } from "./sensitive_utils.encrypt";
|
||||||
import { createLogger } from "./logging";
|
import { createLogger } from "./logging";
|
||||||
import { FILE_NOT_FOUND } from "../platform/storage";
|
import { FILE_NOT_FOUND } from "../platform/storage";
|
||||||
import { accessNestedPropertyReverse } from "./utils";
|
import { accessNestedPropertyReverse } from "./utils";
|
||||||
import { IS_DEBUG, globalConfig } from "./config";
|
import { IS_DEBUG, globalConfig } from "./config";
|
||||||
import { ExplainedResult } from "./explained_result";
|
import { ExplainedResult } from "./explained_result";
|
||||||
import { decompressX64, compressX64 } from "./lzstring";
|
import { decompressX64, compressX64 } from "./lzstring";
|
||||||
import { asyncCompressor, compressionPrefix } from "./async_compression";
|
import { asyncCompressor, compressionPrefix } from "./async_compression";
|
||||||
import { compressObject, decompressObject } from "../savegame/savegame_compressor";
|
import { compressObject, decompressObject } from "../savegame/savegame_compressor";
|
||||||
|
|
||||||
const logger = createLogger("read_write_proxy");
|
const debounce = require("debounce-promise");
|
||||||
|
|
||||||
const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]);
|
const logger = createLogger("read_write_proxy");
|
||||||
|
|
||||||
// Helper which only writes / reads if verify() works. Also performs migration
|
const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]);
|
||||||
export class ReadWriteProxy {
|
|
||||||
constructor(app, filename) {
|
// Helper which only writes / reads if verify() works. Also performs migration
|
||||||
/** @type {Application} */
|
export class ReadWriteProxy {
|
||||||
this.app = app;
|
constructor(app, filename) {
|
||||||
|
/** @type {Application} */
|
||||||
this.filename = filename;
|
this.app = app;
|
||||||
|
|
||||||
/** @type {object} */
|
this.filename = filename;
|
||||||
this.currentData = null;
|
|
||||||
|
/** @type {object} */
|
||||||
// TODO: EXTREMELY HACKY! To verify we need to do this a step later
|
this.currentData = null;
|
||||||
if (G_IS_DEV && IS_DEBUG) {
|
|
||||||
setTimeout(() => {
|
// TODO: EXTREMELY HACKY! To verify we need to do this a step later
|
||||||
assert(
|
if (G_IS_DEV && IS_DEBUG) {
|
||||||
this.verify(this.getDefaultData()).result,
|
setTimeout(() => {
|
||||||
"Verify() failed for default data: " + this.verify(this.getDefaultData()).reason
|
assert(
|
||||||
);
|
this.verify(this.getDefaultData()).result,
|
||||||
});
|
"Verify() failed for default data: " + this.verify(this.getDefaultData()).reason
|
||||||
}
|
);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
// -- Methods to override
|
|
||||||
|
/**
|
||||||
/** @returns {ExplainedResult} */
|
* Store a debounced handler to prevent double writes
|
||||||
verify(data) {
|
*/
|
||||||
abstract;
|
this.debouncedWrite = debounce(this.doWriteAsync.bind(this), 50);
|
||||||
return ExplainedResult.bad();
|
}
|
||||||
}
|
|
||||||
|
// -- Methods to override
|
||||||
// Should return the default data
|
|
||||||
getDefaultData() {
|
/** @returns {ExplainedResult} */
|
||||||
abstract;
|
verify(data) {
|
||||||
return {};
|
abstract;
|
||||||
}
|
return ExplainedResult.bad();
|
||||||
|
}
|
||||||
// Should return the current version as an integer
|
|
||||||
getCurrentVersion() {
|
// Should return the default data
|
||||||
abstract;
|
getDefaultData() {
|
||||||
return 0;
|
abstract;
|
||||||
}
|
return {};
|
||||||
|
}
|
||||||
// Should migrate the data (Modify in place)
|
|
||||||
/** @returns {ExplainedResult} */
|
// Should return the current version as an integer
|
||||||
migrate(data) {
|
getCurrentVersion() {
|
||||||
abstract;
|
abstract;
|
||||||
return ExplainedResult.bad();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- / Methods
|
// Should migrate the data (Modify in place)
|
||||||
|
/** @returns {ExplainedResult} */
|
||||||
// Resets whole data, returns promise
|
migrate(data) {
|
||||||
resetEverythingAsync() {
|
abstract;
|
||||||
logger.warn("Reset data to default");
|
return ExplainedResult.bad();
|
||||||
this.currentData = this.getDefaultData();
|
}
|
||||||
return this.writeAsync();
|
|
||||||
}
|
// -- / Methods
|
||||||
|
|
||||||
getCurrentData() {
|
// Resets whole data, returns promise
|
||||||
return this.currentData;
|
resetEverythingAsync() {
|
||||||
}
|
logger.warn("Reset data to default");
|
||||||
|
this.currentData = this.getDefaultData();
|
||||||
/**
|
return this.writeAsync();
|
||||||
*
|
}
|
||||||
* @param {object} obj
|
|
||||||
*/
|
getCurrentData() {
|
||||||
static serializeObject(obj) {
|
return this.currentData;
|
||||||
const jsonString = JSON.stringify(compressObject(obj));
|
}
|
||||||
const checksum = computeCrc(jsonString + salt);
|
|
||||||
return compressionPrefix + compressX64(checksum + jsonString);
|
/**
|
||||||
}
|
*
|
||||||
|
* @param {object} obj
|
||||||
/**
|
*/
|
||||||
*
|
static serializeObject(obj) {
|
||||||
* @param {object} text
|
const jsonString = JSON.stringify(compressObject(obj));
|
||||||
*/
|
const checksum = computeCrc(jsonString + salt);
|
||||||
static deserializeObject(text) {
|
return compressionPrefix + compressX64(checksum + jsonString);
|
||||||
const decompressed = decompressX64(text.substr(compressionPrefix.length));
|
}
|
||||||
if (!decompressed) {
|
|
||||||
// LZ string decompression failure
|
/**
|
||||||
throw new Error("bad-content / decompression-failed");
|
*
|
||||||
}
|
* @param {object} text
|
||||||
if (decompressed.length < 40) {
|
*/
|
||||||
// String too short
|
static deserializeObject(text) {
|
||||||
throw new Error("bad-content / payload-too-small");
|
const decompressed = decompressX64(text.substr(compressionPrefix.length));
|
||||||
}
|
if (!decompressed) {
|
||||||
|
// LZ string decompression failure
|
||||||
// Compare stored checksum with actual checksum
|
throw new Error("bad-content / decompression-failed");
|
||||||
const checksum = decompressed.substring(0, 40);
|
}
|
||||||
const jsonString = decompressed.substr(40);
|
if (decompressed.length < 40) {
|
||||||
|
// String too short
|
||||||
const desiredChecksum = checksum.startsWith(CRC_PREFIX)
|
throw new Error("bad-content / payload-too-small");
|
||||||
? computeCrc(jsonString + salt)
|
}
|
||||||
: sha1(jsonString + salt);
|
|
||||||
|
// Compare stored checksum with actual checksum
|
||||||
if (desiredChecksum !== checksum) {
|
const checksum = decompressed.substring(0, 40);
|
||||||
// Checksum mismatch
|
const jsonString = decompressed.substr(40);
|
||||||
throw new Error("bad-content / checksum-mismatch");
|
|
||||||
}
|
const desiredChecksum = checksum.startsWith(CRC_PREFIX)
|
||||||
|
? computeCrc(jsonString + salt)
|
||||||
const parsed = JSON.parse(jsonString);
|
: sha1(jsonString + salt);
|
||||||
const decoded = decompressObject(parsed);
|
|
||||||
return decoded;
|
if (desiredChecksum !== checksum) {
|
||||||
}
|
// Checksum mismatch
|
||||||
|
throw new Error("bad-content / checksum-mismatch");
|
||||||
/**
|
}
|
||||||
* Writes the data asychronously, fails if verify() fails
|
|
||||||
* @returns {Promise<void>}
|
const parsed = JSON.parse(jsonString);
|
||||||
*/
|
const decoded = decompressObject(parsed);
|
||||||
writeAsync() {
|
return decoded;
|
||||||
const verifyResult = this.internalVerifyEntry(this.currentData);
|
}
|
||||||
|
|
||||||
if (!verifyResult.result) {
|
/**
|
||||||
logger.error("Tried to write invalid data to", this.filename, "reason:", verifyResult.reason);
|
* Writes the data asychronously, fails if verify() fails.
|
||||||
return Promise.reject(verifyResult.reason);
|
* Debounces the operation by up to 50ms
|
||||||
}
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
return asyncCompressor
|
writeAsync() {
|
||||||
.compressObjectAsync(this.currentData)
|
const verifyResult = this.internalVerifyEntry(this.currentData);
|
||||||
.then(compressed => {
|
|
||||||
return this.app.storage.writeFileAsync(this.filename, compressed);
|
if (!verifyResult.result) {
|
||||||
})
|
logger.error("Tried to write invalid data to", this.filename, "reason:", verifyResult.reason);
|
||||||
.then(() => {
|
return Promise.reject(verifyResult.reason);
|
||||||
logger.log("📄 Wrote", this.filename);
|
}
|
||||||
})
|
|
||||||
.catch(err => {
|
return this.debouncedWrite();
|
||||||
logger.error("Failed to write", this.filename, ":", err);
|
}
|
||||||
throw err;
|
|
||||||
});
|
/**
|
||||||
}
|
* Actually writes the data asychronously
|
||||||
|
* @returns {Promise<void>}
|
||||||
// Reads the data asynchronously, fails if verify() fails
|
*/
|
||||||
readAsync() {
|
doWriteAsync() {
|
||||||
// Start read request
|
return asyncCompressor
|
||||||
return (
|
.compressObjectAsync(this.currentData)
|
||||||
this.app.storage
|
.then(compressed => {
|
||||||
.readFileAsync(this.filename)
|
return this.app.storage.writeFileAsync(this.filename, compressed);
|
||||||
|
})
|
||||||
// Check for errors during read
|
.then(() => {
|
||||||
.catch(err => {
|
logger.log("📄 Wrote", this.filename);
|
||||||
if (err === FILE_NOT_FOUND) {
|
})
|
||||||
logger.log("File not found, using default data");
|
.catch(err => {
|
||||||
|
logger.error("Failed to write", this.filename, ":", err);
|
||||||
// File not found or unreadable, assume default file
|
throw err;
|
||||||
return Promise.resolve(null);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.reject("file-error: " + err);
|
// Reads the data asynchronously, fails if verify() fails
|
||||||
})
|
readAsync() {
|
||||||
|
// Start read request
|
||||||
// Decrypt data (if its encrypted)
|
return (
|
||||||
// @ts-ignore
|
this.app.storage
|
||||||
.then(rawData => {
|
.readFileAsync(this.filename)
|
||||||
if (rawData == null) {
|
|
||||||
// So, the file has not been found, use default data
|
// Check for errors during read
|
||||||
return JSON.stringify(compressObject(this.getDefaultData()));
|
.catch(err => {
|
||||||
}
|
if (err === FILE_NOT_FOUND) {
|
||||||
|
logger.log("File not found, using default data");
|
||||||
if (rawData.startsWith(compressionPrefix)) {
|
|
||||||
const decompressed = decompressX64(rawData.substr(compressionPrefix.length));
|
// File not found or unreadable, assume default file
|
||||||
if (!decompressed) {
|
return Promise.resolve(null);
|
||||||
// LZ string decompression failure
|
}
|
||||||
return Promise.reject("bad-content / decompression-failed");
|
|
||||||
}
|
return Promise.reject("file-error: " + err);
|
||||||
if (decompressed.length < 40) {
|
})
|
||||||
// String too short
|
|
||||||
return Promise.reject("bad-content / payload-too-small");
|
// Decrypt data (if its encrypted)
|
||||||
}
|
// @ts-ignore
|
||||||
|
.then(rawData => {
|
||||||
// Compare stored checksum with actual checksum
|
if (rawData == null) {
|
||||||
const checksum = decompressed.substring(0, 40);
|
// So, the file has not been found, use default data
|
||||||
const jsonString = decompressed.substr(40);
|
return JSON.stringify(compressObject(this.getDefaultData()));
|
||||||
|
}
|
||||||
const desiredChecksum = checksum.startsWith(CRC_PREFIX)
|
|
||||||
? computeCrc(jsonString + salt)
|
if (rawData.startsWith(compressionPrefix)) {
|
||||||
: sha1(jsonString + salt);
|
const decompressed = decompressX64(rawData.substr(compressionPrefix.length));
|
||||||
|
if (!decompressed) {
|
||||||
if (desiredChecksum !== checksum) {
|
// LZ string decompression failure
|
||||||
// Checksum mismatch
|
return Promise.reject("bad-content / decompression-failed");
|
||||||
return Promise.reject(
|
}
|
||||||
"bad-content / checksum-mismatch: " + desiredChecksum + " vs " + checksum
|
if (decompressed.length < 40) {
|
||||||
);
|
// String too short
|
||||||
}
|
return Promise.reject("bad-content / payload-too-small");
|
||||||
return jsonString;
|
}
|
||||||
} else {
|
|
||||||
if (!G_IS_DEV) {
|
// Compare stored checksum with actual checksum
|
||||||
return Promise.reject("bad-content / missing-compression");
|
const checksum = decompressed.substring(0, 40);
|
||||||
}
|
const jsonString = decompressed.substr(40);
|
||||||
}
|
|
||||||
return rawData;
|
const desiredChecksum = checksum.startsWith(CRC_PREFIX)
|
||||||
})
|
? computeCrc(jsonString + salt)
|
||||||
|
: sha1(jsonString + salt);
|
||||||
// Parse JSON, this could throw but thats fine
|
|
||||||
.then(res => {
|
if (desiredChecksum !== checksum) {
|
||||||
try {
|
// Checksum mismatch
|
||||||
return JSON.parse(res);
|
return Promise.reject(
|
||||||
} catch (ex) {
|
"bad-content / checksum-mismatch: " + desiredChecksum + " vs " + checksum
|
||||||
logger.error(
|
);
|
||||||
"Failed to parse file content of",
|
}
|
||||||
this.filename,
|
return jsonString;
|
||||||
":",
|
} else {
|
||||||
ex,
|
if (!G_IS_DEV) {
|
||||||
"(content was:",
|
return Promise.reject("bad-content / missing-compression");
|
||||||
res,
|
}
|
||||||
")"
|
}
|
||||||
);
|
return rawData;
|
||||||
throw new Error("invalid-serialized-data");
|
})
|
||||||
}
|
|
||||||
})
|
// Parse JSON, this could throw but thats fine
|
||||||
|
.then(res => {
|
||||||
// Decompress
|
try {
|
||||||
.then(compressed => decompressObject(compressed))
|
return JSON.parse(res);
|
||||||
|
} catch (ex) {
|
||||||
// Verify basic structure
|
logger.error(
|
||||||
.then(contents => {
|
"Failed to parse file content of",
|
||||||
const result = this.internalVerifyBasicStructure(contents);
|
this.filename,
|
||||||
if (!result.isGood()) {
|
":",
|
||||||
return Promise.reject("verify-failed: " + result.reason);
|
ex,
|
||||||
}
|
"(content was:",
|
||||||
return contents;
|
res,
|
||||||
})
|
")"
|
||||||
|
);
|
||||||
// Check version and migrate if required
|
throw new Error("invalid-serialized-data");
|
||||||
.then(contents => {
|
}
|
||||||
if (contents.version > this.getCurrentVersion()) {
|
})
|
||||||
return Promise.reject("stored-data-is-newer");
|
|
||||||
}
|
// Decompress
|
||||||
|
.then(compressed => decompressObject(compressed))
|
||||||
if (contents.version < this.getCurrentVersion()) {
|
|
||||||
logger.log(
|
// Verify basic structure
|
||||||
"Trying to migrate data object from version",
|
.then(contents => {
|
||||||
contents.version,
|
const result = this.internalVerifyBasicStructure(contents);
|
||||||
"to",
|
if (!result.isGood()) {
|
||||||
this.getCurrentVersion()
|
return Promise.reject("verify-failed: " + result.reason);
|
||||||
);
|
}
|
||||||
const migrationResult = this.migrate(contents); // modify in place
|
return contents;
|
||||||
if (migrationResult.isBad()) {
|
})
|
||||||
return Promise.reject("migration-failed: " + migrationResult.reason);
|
|
||||||
}
|
// Check version and migrate if required
|
||||||
}
|
.then(contents => {
|
||||||
return contents;
|
if (contents.version > this.getCurrentVersion()) {
|
||||||
})
|
return Promise.reject("stored-data-is-newer");
|
||||||
|
}
|
||||||
// Verify
|
|
||||||
.then(contents => {
|
if (contents.version < this.getCurrentVersion()) {
|
||||||
const verifyResult = this.internalVerifyEntry(contents);
|
logger.log(
|
||||||
if (!verifyResult.result) {
|
"Trying to migrate data object from version",
|
||||||
logger.error(
|
contents.version,
|
||||||
"Read invalid data from",
|
"to",
|
||||||
this.filename,
|
this.getCurrentVersion()
|
||||||
"reason:",
|
);
|
||||||
verifyResult.reason,
|
const migrationResult = this.migrate(contents); // modify in place
|
||||||
"contents:",
|
if (migrationResult.isBad()) {
|
||||||
contents
|
return Promise.reject("migration-failed: " + migrationResult.reason);
|
||||||
);
|
}
|
||||||
return Promise.reject("invalid-data: " + verifyResult.reason);
|
}
|
||||||
}
|
return contents;
|
||||||
return contents;
|
})
|
||||||
})
|
|
||||||
|
// Verify
|
||||||
// Store
|
.then(contents => {
|
||||||
.then(contents => {
|
const verifyResult = this.internalVerifyEntry(contents);
|
||||||
this.currentData = contents;
|
if (!verifyResult.result) {
|
||||||
logger.log("📄 Read data with version", this.currentData.version, "from", this.filename);
|
logger.error(
|
||||||
return contents;
|
"Read invalid data from",
|
||||||
})
|
this.filename,
|
||||||
|
"reason:",
|
||||||
// Catchall
|
verifyResult.reason,
|
||||||
.catch(err => {
|
"contents:",
|
||||||
return Promise.reject("Failed to read " + this.filename + ": " + err);
|
contents
|
||||||
})
|
);
|
||||||
);
|
return Promise.reject("invalid-data: " + verifyResult.reason);
|
||||||
}
|
}
|
||||||
|
return contents;
|
||||||
/**
|
})
|
||||||
* Deletes the file
|
|
||||||
* @returns {Promise<void>}
|
// Store
|
||||||
*/
|
.then(contents => {
|
||||||
deleteAsync() {
|
this.currentData = contents;
|
||||||
return this.app.storage.deleteFileAsync(this.filename);
|
logger.log("📄 Read data with version", this.currentData.version, "from", this.filename);
|
||||||
}
|
return contents;
|
||||||
|
})
|
||||||
// Internal
|
|
||||||
|
// Catchall
|
||||||
/** @returns {ExplainedResult} */
|
.catch(err => {
|
||||||
internalVerifyBasicStructure(data) {
|
return Promise.reject("Failed to read " + this.filename + ": " + err);
|
||||||
if (!data) {
|
})
|
||||||
return ExplainedResult.bad("Data is empty");
|
);
|
||||||
}
|
}
|
||||||
if (!Number.isInteger(data.version) || data.version < 0) {
|
|
||||||
return ExplainedResult.bad(
|
/**
|
||||||
`Data has invalid version: ${data.version} (expected ${this.getCurrentVersion()})`
|
* Deletes the file
|
||||||
);
|
* @returns {Promise<void>}
|
||||||
}
|
*/
|
||||||
|
deleteAsync() {
|
||||||
return ExplainedResult.good();
|
return this.app.storage.deleteFileAsync(this.filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @returns {ExplainedResult} */
|
// Internal
|
||||||
internalVerifyEntry(data) {
|
|
||||||
if (data.version !== this.getCurrentVersion()) {
|
/** @returns {ExplainedResult} */
|
||||||
return ExplainedResult.bad(
|
internalVerifyBasicStructure(data) {
|
||||||
"Version mismatch, got " + data.version + " and expected " + this.getCurrentVersion()
|
if (!data) {
|
||||||
);
|
return ExplainedResult.bad("Data is empty");
|
||||||
}
|
}
|
||||||
|
if (!Number.isInteger(data.version) || data.version < 0) {
|
||||||
const verifyStructureError = this.internalVerifyBasicStructure(data);
|
return ExplainedResult.bad(
|
||||||
if (!verifyStructureError.isGood()) {
|
`Data has invalid version: ${data.version} (expected ${this.getCurrentVersion()})`
|
||||||
return verifyStructureError;
|
);
|
||||||
}
|
}
|
||||||
return this.verify(data);
|
|
||||||
}
|
return ExplainedResult.good();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @returns {ExplainedResult} */
|
||||||
|
internalVerifyEntry(data) {
|
||||||
|
if (data.version !== this.getCurrentVersion()) {
|
||||||
|
return ExplainedResult.bad(
|
||||||
|
"Version mismatch, got " + data.version + " and expected " + this.getCurrentVersion()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const verifyStructureError = this.internalVerifyBasicStructure(data);
|
||||||
|
if (!verifyStructureError.isGood()) {
|
||||||
|
return verifyStructureError;
|
||||||
|
}
|
||||||
|
return this.verify(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { TrackedState } from "../../core/tracked_state";
|
||||||
import { GameRoot } from "../root";
|
import { GameRoot } from "../root";
|
||||||
|
|
||||||
// Automatically attaches and detaches elements from the dom
|
// Automatically attaches and detaches elements from the dom
|
||||||
@ -7,15 +8,28 @@ import { GameRoot } from "../root";
|
|||||||
// Also attaches a class name if desired
|
// Also attaches a class name if desired
|
||||||
|
|
||||||
export class DynamicDomAttach {
|
export class DynamicDomAttach {
|
||||||
constructor(root, element, { timeToKeepSeconds = 0, attachClass = null } = {}) {
|
/**
|
||||||
|
*
|
||||||
|
* @param {GameRoot} root
|
||||||
|
* @param {HTMLElement} element
|
||||||
|
* @param {object} param2
|
||||||
|
* @param {number=} param2.timeToKeepSeconds How long to keep the element visible (in ms) after it should be hidden.
|
||||||
|
* Useful for fade-out effects
|
||||||
|
* @param {string=} param2.attachClass If set, attaches a class while the element is visible
|
||||||
|
* @param {boolean=} param2.trackHover If set, attaches the 'hovered' class if the cursor is above the element. Useful
|
||||||
|
* for fading out the element if its below the cursor for example.
|
||||||
|
*/
|
||||||
|
constructor(root, element, { timeToKeepSeconds = 0, attachClass = null, trackHover = false } = {}) {
|
||||||
/** @type {GameRoot} */
|
/** @type {GameRoot} */
|
||||||
this.root = root;
|
this.root = root;
|
||||||
|
|
||||||
/** @type {HTMLElement} */
|
/** @type {HTMLElement} */
|
||||||
this.element = element;
|
this.element = element;
|
||||||
this.parent = this.element.parentElement;
|
this.parent = this.element.parentElement;
|
||||||
|
assert(this.parent, "Dom attach created without parent");
|
||||||
|
|
||||||
this.attachClass = attachClass;
|
this.attachClass = attachClass;
|
||||||
|
this.trackHover = trackHover;
|
||||||
|
|
||||||
this.timeToKeepSeconds = timeToKeepSeconds;
|
this.timeToKeepSeconds = timeToKeepSeconds;
|
||||||
this.lastVisibleTime = 0;
|
this.lastVisibleTime = 0;
|
||||||
@ -26,8 +40,19 @@ export class DynamicDomAttach {
|
|||||||
|
|
||||||
this.internalIsClassAttached = false;
|
this.internalIsClassAttached = false;
|
||||||
this.classAttachTimeout = null;
|
this.classAttachTimeout = null;
|
||||||
|
|
||||||
|
// Store the last bounds we computed
|
||||||
|
/** @type {DOMRect} */
|
||||||
|
this.lastComputedBounds = null;
|
||||||
|
this.lastComputedBoundsTime = -1;
|
||||||
|
|
||||||
|
// Track the 'hovered' class
|
||||||
|
this.trackedIsHovered = new TrackedState(this.setIsHoveredClass, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method to attach the element
|
||||||
|
*/
|
||||||
internalAttach() {
|
internalAttach() {
|
||||||
if (!this.attached) {
|
if (!this.attached) {
|
||||||
this.parent.appendChild(this.element);
|
this.parent.appendChild(this.element);
|
||||||
@ -36,6 +61,9 @@ export class DynamicDomAttach {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method to detach the element
|
||||||
|
*/
|
||||||
internalDetach() {
|
internalDetach() {
|
||||||
if (this.attached) {
|
if (this.attached) {
|
||||||
assert(this.element.parentElement === this.parent, "Invalid parent #2");
|
assert(this.element.parentElement === this.parent, "Invalid parent #2");
|
||||||
@ -44,14 +72,50 @@ export class DynamicDomAttach {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the element is currently attached
|
||||||
|
*/
|
||||||
isAttached() {
|
isAttached() {
|
||||||
return this.attached;
|
return this.attached;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actually sets the 'hovered' class
|
||||||
|
* @param {boolean} isHovered
|
||||||
|
*/
|
||||||
|
setIsHoveredClass(isHovered) {
|
||||||
|
this.element.classList.toggle("hovered", isHovered);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this every frame, and the dom attach class will take care of
|
||||||
|
* everything else
|
||||||
|
* @param {boolean} isVisible Whether the element should currently be visible or not
|
||||||
|
*/
|
||||||
update(isVisible) {
|
update(isVisible) {
|
||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
this.lastVisibleTime = this.root ? this.root.time.realtimeNow() : 0;
|
this.lastVisibleTime = this.root ? this.root.time.realtimeNow() : 0;
|
||||||
this.internalAttach();
|
this.internalAttach();
|
||||||
|
|
||||||
|
if (this.trackHover && this.root) {
|
||||||
|
let bounds = this.lastComputedBounds;
|
||||||
|
|
||||||
|
// Recompute bounds only once in a while
|
||||||
|
if (!bounds || this.root.time.realtimeNow() - this.lastComputedBoundsTime > 1.0) {
|
||||||
|
bounds = this.lastComputedBounds = this.element.getBoundingClientRect();
|
||||||
|
this.lastComputedBoundsTime = this.root.time.realtimeNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
const mousePos = this.root.app.mousePosition;
|
||||||
|
if (mousePos) {
|
||||||
|
this.trackedIsHovered.set(
|
||||||
|
mousePos.x > bounds.left &&
|
||||||
|
mousePos.x < bounds.right &&
|
||||||
|
mousePos.y > bounds.top &&
|
||||||
|
mousePos.y < bounds.bottom
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!this.root || this.root.time.realtimeNow() - this.lastVisibleTime >= this.timeToKeepSeconds) {
|
if (!this.root || this.root.time.realtimeNow() - this.lastVisibleTime >= this.timeToKeepSeconds) {
|
||||||
this.internalDetach();
|
this.internalDetach();
|
||||||
|
@ -55,7 +55,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
|
|||||||
this.signals.variantChanged.add(this.rerenderVariants, this);
|
this.signals.variantChanged.add(this.rerenderVariants, this);
|
||||||
this.root.hud.signals.buildingSelectedForPlacement.add(this.startSelection, this);
|
this.root.hud.signals.buildingSelectedForPlacement.add(this.startSelection, this);
|
||||||
|
|
||||||
this.domAttach = new DynamicDomAttach(this.root, this.element, {});
|
this.domAttach = new DynamicDomAttach(this.root, this.element, { trackHover: true });
|
||||||
this.variantsAttach = new DynamicDomAttach(this.root, this.variantsElement, {});
|
this.variantsAttach = new DynamicDomAttach(this.root, this.variantsElement, {});
|
||||||
|
|
||||||
this.currentInterpolatedCornerTile = new Vector();
|
this.currentInterpolatedCornerTile = new Vector();
|
||||||
|
@ -327,7 +327,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
|
|||||||
const tileBelow = this.root.map.getLowerLayerContentXY(tile.x, tile.y);
|
const tileBelow = this.root.map.getLowerLayerContentXY(tile.x, tile.y);
|
||||||
|
|
||||||
// Check if there's a shape or color item below, if so select the miner
|
// Check if there's a shape or color item below, if so select the miner
|
||||||
if (tileBelow) {
|
if (tileBelow && this.root.app.settings.getAllSettings().pickMinerOnPatch) {
|
||||||
this.currentMetaBuilding.set(gMetaBuildingRegistry.findByClass(MetaMinerBuilding));
|
this.currentMetaBuilding.set(gMetaBuildingRegistry.findByClass(MetaMinerBuilding));
|
||||||
|
|
||||||
// Select chained miner if available, since thats always desired once unlocked
|
// Select chained miner if available, since thats always desired once unlocked
|
||||||
|
@ -1,188 +1,169 @@
|
|||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
import { makeDiv } from "../../../core/utils";
|
import { makeDiv } from "../../../core/utils";
|
||||||
import { SOUNDS } from "../../../platform/sound";
|
import { SOUNDS } from "../../../platform/sound";
|
||||||
import { enumNotificationType } from "./notifications";
|
import { enumNotificationType } from "./notifications";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import { KEYMAPPINGS } from "../../key_action_mapper";
|
import { KEYMAPPINGS } from "../../key_action_mapper";
|
||||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||||
|
|
||||||
export class HUDGameMenu extends BaseHUDPart {
|
export class HUDGameMenu extends BaseHUDPart {
|
||||||
createElements(parent) {
|
createElements(parent) {
|
||||||
this.element = makeDiv(parent, "ingame_HUD_GameMenu");
|
this.element = makeDiv(parent, "ingame_HUD_GameMenu");
|
||||||
|
|
||||||
const buttons = [
|
const buttons = [
|
||||||
{
|
{
|
||||||
id: "shop",
|
id: "shop",
|
||||||
label: "Upgrades",
|
label: "Upgrades",
|
||||||
handler: () => this.root.hud.parts.shop.show(),
|
handler: () => this.root.hud.parts.shop.show(),
|
||||||
keybinding: KEYMAPPINGS.ingame.menuOpenShop,
|
keybinding: KEYMAPPINGS.ingame.menuOpenShop,
|
||||||
badge: () => this.root.hubGoals.getAvailableUpgradeCount(),
|
badge: () => this.root.hubGoals.getAvailableUpgradeCount(),
|
||||||
notification: /** @type {[string, enumNotificationType]} */ ([
|
notification: /** @type {[string, enumNotificationType]} */ ([
|
||||||
T.ingame.notifications.newUpgrade,
|
T.ingame.notifications.newUpgrade,
|
||||||
enumNotificationType.upgrade,
|
enumNotificationType.upgrade,
|
||||||
]),
|
]),
|
||||||
visible: () =>
|
visible: () =>
|
||||||
!this.root.app.settings.getAllSettings().offerHints || this.root.hubGoals.level >= 3,
|
!this.root.app.settings.getAllSettings().offerHints || this.root.hubGoals.level >= 3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "stats",
|
id: "stats",
|
||||||
label: "Stats",
|
label: "Stats",
|
||||||
handler: () => this.root.hud.parts.statistics.show(),
|
handler: () => this.root.hud.parts.statistics.show(),
|
||||||
keybinding: KEYMAPPINGS.ingame.menuOpenStats,
|
keybinding: KEYMAPPINGS.ingame.menuOpenStats,
|
||||||
visible: () =>
|
visible: () =>
|
||||||
!this.root.app.settings.getAllSettings().offerHints || this.root.hubGoals.level >= 3,
|
!this.root.app.settings.getAllSettings().offerHints || this.root.hubGoals.level >= 3,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @type {Array<{
|
/** @type {Array<{
|
||||||
* badge: function,
|
* badge: function,
|
||||||
* button: HTMLElement,
|
* button: HTMLElement,
|
||||||
* badgeElement: HTMLElement,
|
* badgeElement: HTMLElement,
|
||||||
* lastRenderAmount: number,
|
* lastRenderAmount: number,
|
||||||
* condition?: function,
|
* condition?: function,
|
||||||
* notification: [string, enumNotificationType]
|
* notification: [string, enumNotificationType]
|
||||||
* }>} */
|
* }>} */
|
||||||
this.badgesToUpdate = [];
|
this.badgesToUpdate = [];
|
||||||
|
|
||||||
/** @type {Array<{
|
/** @type {Array<{
|
||||||
* button: HTMLElement,
|
* button: HTMLElement,
|
||||||
* condition: function,
|
* condition: function,
|
||||||
* domAttach: DynamicDomAttach
|
* domAttach: DynamicDomAttach
|
||||||
* }>} */
|
* }>} */
|
||||||
this.visibilityToUpdate = [];
|
this.visibilityToUpdate = [];
|
||||||
|
|
||||||
this.buttonsElement = makeDiv(this.element, null, ["buttonContainer"]);
|
this.buttonsElement = makeDiv(this.element, null, ["buttonContainer"]);
|
||||||
|
|
||||||
buttons.forEach(({ id, label, handler, keybinding, badge, notification, visible }) => {
|
buttons.forEach(({ id, label, handler, keybinding, badge, notification, visible }) => {
|
||||||
const button = document.createElement("button");
|
const button = document.createElement("button");
|
||||||
button.setAttribute("data-button-id", id);
|
button.setAttribute("data-button-id", id);
|
||||||
this.buttonsElement.appendChild(button);
|
this.buttonsElement.appendChild(button);
|
||||||
this.trackClicks(button, handler);
|
this.trackClicks(button, handler);
|
||||||
|
|
||||||
if (keybinding) {
|
if (keybinding) {
|
||||||
const binding = this.root.keyMapper.getBinding(keybinding);
|
const binding = this.root.keyMapper.getBinding(keybinding);
|
||||||
binding.add(handler);
|
binding.add(handler);
|
||||||
binding.appendLabelToElement(button);
|
binding.appendLabelToElement(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (visible) {
|
if (visible) {
|
||||||
this.visibilityToUpdate.push({
|
this.visibilityToUpdate.push({
|
||||||
button,
|
button,
|
||||||
condition: visible,
|
condition: visible,
|
||||||
domAttach: new DynamicDomAttach(this.root, button),
|
domAttach: new DynamicDomAttach(this.root, button),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (badge) {
|
if (badge) {
|
||||||
const badgeElement = makeDiv(button, null, ["badge"]);
|
const badgeElement = makeDiv(button, null, ["badge"]);
|
||||||
this.badgesToUpdate.push({
|
this.badgesToUpdate.push({
|
||||||
badge,
|
badge,
|
||||||
lastRenderAmount: 0,
|
lastRenderAmount: 0,
|
||||||
button,
|
button,
|
||||||
badgeElement,
|
badgeElement,
|
||||||
notification,
|
notification,
|
||||||
condition: visible,
|
condition: visible,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const menuButtons = makeDiv(this.element, null, ["menuButtons"]);
|
const menuButtons = makeDiv(this.element, null, ["menuButtons"]);
|
||||||
|
|
||||||
this.musicButton = makeDiv(menuButtons, null, ["button", "music"]);
|
this.saveButton = makeDiv(menuButtons, null, ["button", "save", "animEven"]);
|
||||||
this.sfxButton = makeDiv(menuButtons, null, ["button", "sfx"]);
|
this.settingsButton = makeDiv(menuButtons, null, ["button", "settings"]);
|
||||||
this.saveButton = makeDiv(menuButtons, null, ["button", "save", "animEven"]);
|
|
||||||
this.settingsButton = makeDiv(menuButtons, null, ["button", "settings"]);
|
this.trackClicks(this.saveButton, this.startSave);
|
||||||
|
this.trackClicks(this.settingsButton, this.openSettings);
|
||||||
this.trackClicks(this.musicButton, this.toggleMusic);
|
}
|
||||||
this.trackClicks(this.sfxButton, this.toggleSfx);
|
|
||||||
this.trackClicks(this.saveButton, this.startSave);
|
initialize() {
|
||||||
this.trackClicks(this.settingsButton, this.openSettings);
|
this.root.signals.gameSaved.add(this.onGameSaved, this);
|
||||||
|
}
|
||||||
this.musicButton.classList.toggle("muted", this.root.app.settings.getAllSettings().musicMuted);
|
|
||||||
this.sfxButton.classList.toggle("muted", this.root.app.settings.getAllSettings().soundsMuted);
|
update() {
|
||||||
}
|
let playSound = false;
|
||||||
initialize() {
|
let notifications = new Set();
|
||||||
this.root.signals.gameSaved.add(this.onGameSaved, this);
|
|
||||||
}
|
// Update visibility of buttons
|
||||||
|
for (let i = 0; i < this.visibilityToUpdate.length; ++i) {
|
||||||
update() {
|
const { condition, domAttach } = this.visibilityToUpdate[i];
|
||||||
let playSound = false;
|
domAttach.update(condition());
|
||||||
let notifications = new Set();
|
}
|
||||||
|
|
||||||
// Update visibility of buttons
|
// Check for notifications and badges
|
||||||
for (let i = 0; i < this.visibilityToUpdate.length; ++i) {
|
for (let i = 0; i < this.badgesToUpdate.length; ++i) {
|
||||||
const { button, condition, domAttach } = this.visibilityToUpdate[i];
|
const {
|
||||||
domAttach.update(condition());
|
badge,
|
||||||
}
|
button,
|
||||||
|
badgeElement,
|
||||||
// Check for notifications and badges
|
lastRenderAmount,
|
||||||
for (let i = 0; i < this.badgesToUpdate.length; ++i) {
|
notification,
|
||||||
const {
|
condition,
|
||||||
badge,
|
} = this.badgesToUpdate[i];
|
||||||
button,
|
|
||||||
badgeElement,
|
if (condition && !condition()) {
|
||||||
lastRenderAmount,
|
// Do not show notifications for invisible buttons
|
||||||
notification,
|
continue;
|
||||||
condition,
|
}
|
||||||
} = this.badgesToUpdate[i];
|
|
||||||
|
// Check if the amount shown differs from the one shown last frame
|
||||||
if (condition && !condition()) {
|
const amount = badge();
|
||||||
// Do not show notifications for invisible buttons
|
if (lastRenderAmount !== amount) {
|
||||||
continue;
|
if (amount > 0) {
|
||||||
}
|
badgeElement.innerText = amount;
|
||||||
|
}
|
||||||
// Check if the amount shown differs from the one shown last frame
|
// Check if the badge increased, if so play a notification
|
||||||
const amount = badge();
|
if (amount > lastRenderAmount) {
|
||||||
if (lastRenderAmount !== amount) {
|
playSound = true;
|
||||||
if (amount > 0) {
|
if (notification) {
|
||||||
badgeElement.innerText = amount;
|
notifications.add(notification);
|
||||||
}
|
}
|
||||||
// Check if the badge increased, if so play a notification
|
}
|
||||||
if (amount > lastRenderAmount) {
|
|
||||||
playSound = true;
|
// Rerender notifications
|
||||||
if (notification) {
|
this.badgesToUpdate[i].lastRenderAmount = amount;
|
||||||
notifications.add(notification);
|
button.classList.toggle("hasBadge", amount > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rerender notifications
|
if (playSound) {
|
||||||
this.badgesToUpdate[i].lastRenderAmount = amount;
|
this.root.soundProxy.playUi(SOUNDS.badgeNotification);
|
||||||
button.classList.toggle("hasBadge", amount > 0);
|
}
|
||||||
}
|
|
||||||
}
|
notifications.forEach(([notification, type]) => {
|
||||||
|
this.root.hud.signals.notification.dispatch(notification, type);
|
||||||
if (playSound) {
|
});
|
||||||
this.root.soundProxy.playUi(SOUNDS.badgeNotification);
|
}
|
||||||
}
|
|
||||||
|
onGameSaved() {
|
||||||
notifications.forEach(([notification, type]) => {
|
this.saveButton.classList.toggle("animEven");
|
||||||
this.root.hud.signals.notification.dispatch(notification, type);
|
this.saveButton.classList.toggle("animOdd");
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
startSave() {
|
||||||
onGameSaved() {
|
this.root.gameState.doSave();
|
||||||
this.saveButton.classList.toggle("animEven");
|
}
|
||||||
this.saveButton.classList.toggle("animOdd");
|
|
||||||
}
|
openSettings() {
|
||||||
|
this.root.hud.parts.settingsMenu.show();
|
||||||
startSave() {
|
}
|
||||||
this.root.gameState.doSave();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
openSettings() {
|
|
||||||
this.root.hud.parts.settingsMenu.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleMusic() {
|
|
||||||
const newValue = !this.root.app.settings.getAllSettings().musicMuted;
|
|
||||||
this.root.app.settings.updateSetting("musicMuted", newValue);
|
|
||||||
|
|
||||||
this.musicButton.classList.toggle("muted", newValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleSfx() {
|
|
||||||
const newValue = !this.root.app.settings.getAllSettings().soundsMuted;
|
|
||||||
this.root.app.settings.updateSetting("soundsMuted", newValue);
|
|
||||||
this.sfxButton.classList.toggle("muted", newValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,81 +1,81 @@
|
|||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
import { makeDiv } from "../../../core/utils";
|
import { makeDiv } from "../../../core/utils";
|
||||||
import { GameRoot } from "../../root";
|
import { GameRoot } from "../../root";
|
||||||
import { MinerComponent } from "../../components/miner";
|
import { MinerComponent } from "../../components/miner";
|
||||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||||
import { TrackedState } from "../../../core/tracked_state";
|
import { TrackedState } from "../../../core/tracked_state";
|
||||||
import { cachebust } from "../../../core/cachebust";
|
import { cachebust } from "../../../core/cachebust";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
|
|
||||||
const tutorialsByLevel = [
|
const tutorialsByLevel = [
|
||||||
// Level 1
|
// Level 1
|
||||||
[
|
[
|
||||||
// 1.1. place an extractor
|
// 1.1. place an extractor
|
||||||
{
|
{
|
||||||
id: "1_1_extractor",
|
id: "1_1_extractor",
|
||||||
condition: /** @param {GameRoot} root */ root => {
|
condition: /** @param {GameRoot} root */ root => {
|
||||||
return root.entityMgr.getAllWithComponent(MinerComponent).length === 0;
|
return root.entityMgr.getAllWithComponent(MinerComponent).length === 0;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// 1.2. connect to hub
|
// 1.2. connect to hub
|
||||||
{
|
{
|
||||||
id: "1_2_conveyor",
|
id: "1_2_conveyor",
|
||||||
condition: /** @param {GameRoot} root */ root => {
|
condition: /** @param {GameRoot} root */ root => {
|
||||||
return root.hubGoals.getCurrentGoalDelivered() === 0;
|
return root.hubGoals.getCurrentGoalDelivered() === 0;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// 1.3 wait for completion
|
// 1.3 wait for completion
|
||||||
{
|
{
|
||||||
id: "1_3_expand",
|
id: "1_3_expand",
|
||||||
condition: () => true,
|
condition: () => true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
export class HUDInteractiveTutorial extends BaseHUDPart {
|
export class HUDInteractiveTutorial extends BaseHUDPart {
|
||||||
createElements(parent) {
|
createElements(parent) {
|
||||||
this.element = makeDiv(
|
this.element = makeDiv(
|
||||||
parent,
|
parent,
|
||||||
"ingame_HUD_InteractiveTutorial",
|
"ingame_HUD_InteractiveTutorial",
|
||||||
["animEven"],
|
["animEven"],
|
||||||
`
|
`
|
||||||
<strong class="title">${T.ingame.interactiveTutorial.title}</strong>
|
<strong class="title">${T.ingame.interactiveTutorial.title}</strong>
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
this.elementDescription = makeDiv(this.element, null, ["desc"]);
|
this.elementDescription = makeDiv(this.element, null, ["desc"]);
|
||||||
this.elementGif = makeDiv(this.element, null, ["helperGif"]);
|
this.elementGif = makeDiv(this.element, null, ["helperGif"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
this.domAttach = new DynamicDomAttach(this.root, this.element);
|
this.domAttach = new DynamicDomAttach(this.root, this.element, { trackHover: true });
|
||||||
this.currentHintId = new TrackedState(this.onHintChanged, this);
|
this.currentHintId = new TrackedState(this.onHintChanged, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
onHintChanged(hintId) {
|
onHintChanged(hintId) {
|
||||||
this.elementDescription.innerHTML = T.ingame.interactiveTutorial.hints[hintId];
|
this.elementDescription.innerHTML = T.ingame.interactiveTutorial.hints[hintId];
|
||||||
this.elementGif.style.backgroundImage =
|
this.elementGif.style.backgroundImage =
|
||||||
"url('" + cachebust("res/ui/interactive_tutorial.noinline/" + hintId + ".gif") + "')";
|
"url('" + cachebust("res/ui/interactive_tutorial.noinline/" + hintId + ".gif") + "')";
|
||||||
this.element.classList.toggle("animEven");
|
this.element.classList.toggle("animEven");
|
||||||
this.element.classList.toggle("animOdd");
|
this.element.classList.toggle("animOdd");
|
||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
// Compute current hint
|
// Compute current hint
|
||||||
const thisLevelHints = tutorialsByLevel[this.root.hubGoals.level - 1];
|
const thisLevelHints = tutorialsByLevel[this.root.hubGoals.level - 1];
|
||||||
let targetHintId = null;
|
let targetHintId = null;
|
||||||
|
|
||||||
if (thisLevelHints) {
|
if (thisLevelHints) {
|
||||||
for (let i = 0; i < thisLevelHints.length; ++i) {
|
for (let i = 0; i < thisLevelHints.length; ++i) {
|
||||||
const hint = thisLevelHints[i];
|
const hint = thisLevelHints[i];
|
||||||
if (hint.condition(this.root)) {
|
if (hint.condition(this.root)) {
|
||||||
targetHintId = hint.id;
|
targetHintId = hint.id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentHintId.set(targetHintId);
|
this.currentHintId.set(targetHintId);
|
||||||
this.domAttach.update(!!targetHintId);
|
this.domAttach.update(!!targetHintId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,323 +1,330 @@
|
|||||||
import { makeDiv } from "../../../core/utils";
|
import { makeDiv } from "../../../core/utils";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import {
|
import {
|
||||||
getStringForKeyCode,
|
getStringForKeyCode,
|
||||||
KEYCODE_LMB,
|
KEYCODE_LMB,
|
||||||
KEYCODE_MMB,
|
KEYCODE_MMB,
|
||||||
KEYCODE_RMB,
|
KEYCODE_RMB,
|
||||||
KEYMAPPINGS,
|
KEYMAPPINGS,
|
||||||
} from "../../key_action_mapper";
|
} from "../../key_action_mapper";
|
||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||||
|
|
||||||
const DIVIDER_TOKEN = "/";
|
const DIVIDER_TOKEN = "/";
|
||||||
const ADDER_TOKEN = "+";
|
const ADDER_TOKEN = "+";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {{ keyCode: number }} KeyCode
|
* @typedef {{ keyCode: number }} KeyCode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
* condition: () => boolean,
|
* condition: () => boolean,
|
||||||
* keys: Array<KeyCode|number|string>,
|
* keys: Array<KeyCode|number|string>,
|
||||||
* label: string,
|
* label: string,
|
||||||
* cachedElement?: HTMLElement,
|
* cachedElement?: HTMLElement,
|
||||||
* cachedVisibility?: boolean
|
* cachedVisibility?: boolean
|
||||||
* }} KeyBinding
|
* }} KeyBinding
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export class HUDKeybindingOverlay extends BaseHUDPart {
|
export class HUDKeybindingOverlay extends BaseHUDPart {
|
||||||
initialize() {}
|
/**
|
||||||
|
* HELPER / Returns if there is a building selected for placement
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if there is a building selected for placement
|
*/
|
||||||
* @returns {boolean}
|
get buildingPlacementActive() {
|
||||||
*/
|
const placer = this.root.hud.parts.buildingPlacer;
|
||||||
get buildingPlacementActive() {
|
return !this.mapOverviewActive && placer && !!placer.currentMetaBuilding.get();
|
||||||
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
|
||||||
* HELPER / Returns if there is a building selected for placement and
|
* @returns {boolean}
|
||||||
* it supports the belt planner
|
*/
|
||||||
* @returns {boolean}
|
get buildingPlacementSupportsBeltPlanner() {
|
||||||
*/
|
const placer = this.root.hud.parts.buildingPlacer;
|
||||||
get buildingPlacementSupportsBeltPlanner() {
|
return (
|
||||||
const placer = this.root.hud.parts.buildingPlacer;
|
!this.mapOverviewActive &&
|
||||||
return (
|
placer &&
|
||||||
!this.mapOverviewActive &&
|
placer.currentMetaBuilding.get() &&
|
||||||
placer &&
|
placer.currentMetaBuilding.get().getHasDirectionLockAvailable()
|
||||||
placer.currentMetaBuilding.get() &&
|
);
|
||||||
placer.currentMetaBuilding.get().getHasDirectionLockAvailable()
|
}
|
||||||
);
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if there is a building selected for placement and
|
||||||
/**
|
* it has multiplace enabled by default
|
||||||
* HELPER / Returns if there is a building selected for placement and
|
* @returns {boolean}
|
||||||
* it has multiplace enabled by default
|
*/
|
||||||
* @returns {boolean}
|
get buildingPlacementStaysInPlacement() {
|
||||||
*/
|
const placer = this.root.hud.parts.buildingPlacer;
|
||||||
get buildingPlacementStaysInPlacement() {
|
return (
|
||||||
const placer = this.root.hud.parts.buildingPlacer;
|
!this.mapOverviewActive &&
|
||||||
return (
|
placer &&
|
||||||
!this.mapOverviewActive &&
|
placer.currentMetaBuilding.get() &&
|
||||||
placer &&
|
placer.currentMetaBuilding.get().getStayInPlacementMode()
|
||||||
placer.currentMetaBuilding.get() &&
|
);
|
||||||
placer.currentMetaBuilding.get().getStayInPlacementMode()
|
}
|
||||||
);
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if there is a blueprint selected for placement
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if there is a blueprint selected for placement
|
*/
|
||||||
* @returns {boolean}
|
get blueprintPlacementActive() {
|
||||||
*/
|
const placer = this.root.hud.parts.blueprintPlacer;
|
||||||
get blueprintPlacementActive() {
|
return placer && !!placer.currentBlueprint.get();
|
||||||
const placer = this.root.hud.parts.blueprintPlacer;
|
}
|
||||||
return placer && !!placer.currentBlueprint.get();
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if the belt planner is currently active
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if the belt planner is currently active
|
*/
|
||||||
* @returns {boolean}
|
get beltPlannerActive() {
|
||||||
*/
|
const placer = this.root.hud.parts.buildingPlacer;
|
||||||
get beltPlannerActive() {
|
return !this.mapOverviewActive && placer && placer.isDirectionLockActive;
|
||||||
const placer = this.root.hud.parts.buildingPlacer;
|
}
|
||||||
return !this.mapOverviewActive && placer && placer.isDirectionLockActive;
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if there is a last blueprint available
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if there is a last blueprint available
|
*/
|
||||||
* @returns {boolean}
|
get lastBlueprintAvailable() {
|
||||||
*/
|
const placer = this.root.hud.parts.blueprintPlacer;
|
||||||
get lastBlueprintAvailable() {
|
return placer && !!placer.lastBlueprintUsed;
|
||||||
const placer = this.root.hud.parts.blueprintPlacer;
|
}
|
||||||
return placer && !!placer.lastBlueprintUsed;
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if there is anything selected on the map
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if there is anything selected on the map
|
*/
|
||||||
* @returns {boolean}
|
get anythingSelectedOnMap() {
|
||||||
*/
|
const selector = this.root.hud.parts.massSelector;
|
||||||
get anythingSelectedOnMap() {
|
return selector && selector.selectedUids.size > 0;
|
||||||
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}
|
||||||
* HELPER / Returns if there is a building or blueprint selected for placement
|
*/
|
||||||
* @returns {boolean}
|
get anyPlacementActive() {
|
||||||
*/
|
return this.buildingPlacementActive || this.blueprintPlacementActive;
|
||||||
get anyPlacementActive() {
|
}
|
||||||
return this.buildingPlacementActive || this.blueprintPlacementActive;
|
|
||||||
}
|
/**
|
||||||
|
* HELPER / Returns if the map overview is active
|
||||||
/**
|
* @returns {boolean}
|
||||||
* HELPER / Returns if the map overview is active
|
*/
|
||||||
* @returns {boolean}
|
get mapOverviewActive() {
|
||||||
*/
|
return this.root.camera.getIsMapOverlayActive();
|
||||||
get mapOverviewActive() {
|
}
|
||||||
return this.root.camera.getIsMapOverlayActive();
|
|
||||||
}
|
/**
|
||||||
|
* Initializes the element
|
||||||
/**
|
* @param {HTMLElement} parent
|
||||||
* Initializes the element
|
*/
|
||||||
* @param {HTMLElement} parent
|
createElements(parent) {
|
||||||
*/
|
const mapper = this.root.keyMapper;
|
||||||
createElements(parent) {
|
const k = KEYMAPPINGS;
|
||||||
const mapper = this.root.keyMapper;
|
|
||||||
const k = KEYMAPPINGS;
|
/** @type {Array<KeyBinding>} */
|
||||||
|
this.keybindings = [
|
||||||
/** @type {Array<KeyBinding>} */
|
{
|
||||||
this.keybindings = [
|
// Move map - Including mouse
|
||||||
{
|
label: T.ingame.keybindingsOverlay.moveMap,
|
||||||
// Move map - Including mouse
|
keys: [
|
||||||
label: T.ingame.keybindingsOverlay.moveMap,
|
KEYCODE_LMB,
|
||||||
keys: [
|
DIVIDER_TOKEN,
|
||||||
KEYCODE_LMB,
|
k.navigation.mapMoveUp,
|
||||||
DIVIDER_TOKEN,
|
k.navigation.mapMoveLeft,
|
||||||
k.navigation.mapMoveUp,
|
k.navigation.mapMoveDown,
|
||||||
k.navigation.mapMoveLeft,
|
k.navigation.mapMoveRight,
|
||||||
k.navigation.mapMoveDown,
|
],
|
||||||
k.navigation.mapMoveRight,
|
condition: () => !this.anyPlacementActive,
|
||||||
],
|
},
|
||||||
condition: () => !this.anyPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// Move map - No mouse
|
||||||
{
|
label: T.ingame.keybindingsOverlay.moveMap,
|
||||||
// Move map - No mouse
|
keys: [
|
||||||
label: T.ingame.keybindingsOverlay.moveMap,
|
k.navigation.mapMoveUp,
|
||||||
keys: [
|
k.navigation.mapMoveLeft,
|
||||||
k.navigation.mapMoveUp,
|
k.navigation.mapMoveDown,
|
||||||
k.navigation.mapMoveLeft,
|
k.navigation.mapMoveRight,
|
||||||
k.navigation.mapMoveDown,
|
],
|
||||||
k.navigation.mapMoveRight,
|
condition: () => this.anyPlacementActive,
|
||||||
],
|
},
|
||||||
condition: () => this.anyPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// [OVERVIEW] Create marker with right click
|
||||||
{
|
label: T.ingame.keybindingsOverlay.createMarker,
|
||||||
// [OVERVIEW] Create marker with right click
|
keys: [KEYCODE_RMB],
|
||||||
label: T.ingame.keybindingsOverlay.createMarker,
|
condition: () => this.mapOverviewActive && !this.blueprintPlacementActive,
|
||||||
keys: [KEYCODE_RMB],
|
},
|
||||||
condition: () => this.mapOverviewActive && !this.blueprintPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// Pipette
|
||||||
{
|
label: T.ingame.keybindingsOverlay.pipette,
|
||||||
// Pipette
|
keys: [k.placement.pipette],
|
||||||
label: T.ingame.keybindingsOverlay.pipette,
|
condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive,
|
||||||
keys: [k.placement.pipette],
|
},
|
||||||
condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// Cancel placement
|
||||||
{
|
label: T.ingame.keybindingsOverlay.stopPlacement,
|
||||||
// Cancel placement
|
keys: [KEYCODE_RMB],
|
||||||
label: T.ingame.keybindingsOverlay.stopPlacement,
|
condition: () => this.anyPlacementActive,
|
||||||
keys: [KEYCODE_RMB],
|
},
|
||||||
condition: () => this.anyPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// Delete with right click
|
||||||
{
|
label: T.ingame.keybindingsOverlay.delete,
|
||||||
// Delete with right click
|
keys: [KEYCODE_RMB],
|
||||||
label: T.ingame.keybindingsOverlay.delete,
|
condition: () =>
|
||||||
keys: [KEYCODE_RMB],
|
!this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap,
|
||||||
condition: () =>
|
},
|
||||||
!this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap,
|
|
||||||
},
|
{
|
||||||
|
// Area select
|
||||||
{
|
label: T.ingame.keybindingsOverlay.selectBuildings,
|
||||||
// Area select
|
keys: [k.massSelect.massSelectStart, ADDER_TOKEN, KEYCODE_LMB],
|
||||||
label: T.ingame.keybindingsOverlay.selectBuildings,
|
condition: () => !this.anyPlacementActive && !this.anythingSelectedOnMap,
|
||||||
keys: [k.massSelect.massSelectStart, ADDER_TOKEN, KEYCODE_LMB],
|
},
|
||||||
condition: () => !this.anyPlacementActive && !this.anythingSelectedOnMap,
|
|
||||||
},
|
{
|
||||||
|
// Place building
|
||||||
{
|
label: T.ingame.keybindingsOverlay.placeBuilding,
|
||||||
// Place building
|
keys: [KEYCODE_LMB],
|
||||||
label: T.ingame.keybindingsOverlay.placeBuilding,
|
condition: () => this.anyPlacementActive,
|
||||||
keys: [KEYCODE_LMB],
|
},
|
||||||
condition: () => this.anyPlacementActive,
|
|
||||||
},
|
{
|
||||||
|
// Rotate
|
||||||
{
|
label: T.ingame.keybindingsOverlay.rotateBuilding,
|
||||||
// Rotate
|
keys: [k.placement.rotateWhilePlacing],
|
||||||
label: T.ingame.keybindingsOverlay.rotateBuilding,
|
condition: () => this.anyPlacementActive && !this.beltPlannerActive,
|
||||||
keys: [k.placement.rotateWhilePlacing],
|
},
|
||||||
condition: () => this.anyPlacementActive && !this.beltPlannerActive,
|
|
||||||
},
|
{
|
||||||
|
// [BELT PLANNER] Flip Side
|
||||||
{
|
label: T.ingame.keybindingsOverlay.plannerSwitchSide,
|
||||||
// [BELT PLANNER] Flip Side
|
keys: [k.placement.switchDirectionLockSide],
|
||||||
label: T.ingame.keybindingsOverlay.plannerSwitchSide,
|
condition: () => this.beltPlannerActive,
|
||||||
keys: [k.placement.switchDirectionLockSide],
|
},
|
||||||
condition: () => this.beltPlannerActive,
|
|
||||||
},
|
{
|
||||||
|
// Place last blueprint
|
||||||
{
|
label: T.ingame.keybindingsOverlay.pasteLastBlueprint,
|
||||||
// Place last blueprint
|
keys: [k.massSelect.pasteLastBlueprint],
|
||||||
label: T.ingame.keybindingsOverlay.pasteLastBlueprint,
|
condition: () => !this.blueprintPlacementActive && this.lastBlueprintAvailable,
|
||||||
keys: [k.massSelect.pasteLastBlueprint],
|
},
|
||||||
condition: () => !this.blueprintPlacementActive && this.lastBlueprintAvailable,
|
|
||||||
},
|
{
|
||||||
|
// Belt planner
|
||||||
{
|
label: T.ingame.keybindingsOverlay.lockBeltDirection,
|
||||||
// Belt planner
|
keys: [k.placementModifiers.lockBeltDirection],
|
||||||
label: T.ingame.keybindingsOverlay.lockBeltDirection,
|
condition: () => this.buildingPlacementSupportsBeltPlanner && !this.beltPlannerActive,
|
||||||
keys: [k.placementModifiers.lockBeltDirection],
|
},
|
||||||
condition: () => this.buildingPlacementSupportsBeltPlanner && !this.beltPlannerActive,
|
|
||||||
},
|
{
|
||||||
|
// [SELECTION] Destroy
|
||||||
{
|
label: T.ingame.keybindingsOverlay.delete,
|
||||||
// [SELECTION] Destroy
|
keys: [k.massSelect.confirmMassDelete],
|
||||||
label: T.ingame.keybindingsOverlay.delete,
|
condition: () => this.anythingSelectedOnMap,
|
||||||
keys: [k.massSelect.confirmMassDelete],
|
},
|
||||||
condition: () => this.anythingSelectedOnMap,
|
|
||||||
},
|
{
|
||||||
|
// [SELECTION] Cancel
|
||||||
{
|
label: T.ingame.keybindingsOverlay.clearSelection,
|
||||||
// [SELECTION] Cancel
|
keys: [k.general.back],
|
||||||
label: T.ingame.keybindingsOverlay.clearSelection,
|
condition: () => this.anythingSelectedOnMap,
|
||||||
keys: [k.general.back],
|
},
|
||||||
condition: () => this.anythingSelectedOnMap,
|
{
|
||||||
},
|
// [SELECTION] Cut
|
||||||
{
|
label: T.ingame.keybindingsOverlay.cutSelection,
|
||||||
// [SELECTION] Cut
|
keys: [k.massSelect.massSelectCut],
|
||||||
label: T.ingame.keybindingsOverlay.cutSelection,
|
condition: () => this.anythingSelectedOnMap,
|
||||||
keys: [k.massSelect.massSelectCut],
|
},
|
||||||
condition: () => this.anythingSelectedOnMap,
|
|
||||||
},
|
{
|
||||||
|
// [SELECTION] Copy
|
||||||
{
|
label: T.ingame.keybindingsOverlay.copySelection,
|
||||||
// [SELECTION] Copy
|
keys: [k.massSelect.massSelectCopy],
|
||||||
label: T.ingame.keybindingsOverlay.copySelection,
|
condition: () => this.anythingSelectedOnMap,
|
||||||
keys: [k.massSelect.massSelectCopy],
|
},
|
||||||
condition: () => this.anythingSelectedOnMap,
|
|
||||||
},
|
{
|
||||||
|
// Switch layers
|
||||||
{
|
label: T.ingame.keybindingsOverlay.switchLayers,
|
||||||
// Switch layers
|
keys: [k.ingame.switchLayers],
|
||||||
label: T.ingame.keybindingsOverlay.switchLayers,
|
condition: () => true,
|
||||||
keys: [k.ingame.switchLayers],
|
},
|
||||||
condition: () => true,
|
];
|
||||||
},
|
|
||||||
];
|
if (!this.root.app.settings.getAllSettings().alwaysMultiplace) {
|
||||||
|
this.keybindings.push({
|
||||||
if (!this.root.app.settings.getAllSettings().alwaysMultiplace) {
|
// Multiplace
|
||||||
this.keybindings.push({
|
label: T.ingame.keybindingsOverlay.placeMultiple,
|
||||||
// Multiplace
|
keys: [k.placementModifiers.placeMultiple],
|
||||||
label: T.ingame.keybindingsOverlay.placeMultiple,
|
condition: () => this.anyPlacementActive && !this.buildingPlacementStaysInPlacement,
|
||||||
keys: [k.placementModifiers.placeMultiple],
|
});
|
||||||
condition: () => this.anyPlacementActive && !this.buildingPlacementStaysInPlacement,
|
}
|
||||||
});
|
|
||||||
}
|
this.element = makeDiv(parent, "ingame_HUD_KeybindingOverlay", []);
|
||||||
|
|
||||||
this.element = makeDiv(parent, "ingame_HUD_KeybindingOverlay", []);
|
for (let i = 0; i < this.keybindings.length; ++i) {
|
||||||
|
let html = "";
|
||||||
for (let i = 0; i < this.keybindings.length; ++i) {
|
const handle = this.keybindings[i];
|
||||||
let html = "";
|
|
||||||
const handle = this.keybindings[i];
|
for (let k = 0; k < handle.keys.length; ++k) {
|
||||||
|
const key = handle.keys[k];
|
||||||
for (let k = 0; k < handle.keys.length; ++k) {
|
|
||||||
const key = handle.keys[k];
|
switch (key) {
|
||||||
|
case KEYCODE_LMB:
|
||||||
switch (key) {
|
html += `<code class="keybinding leftMouse"></code>`;
|
||||||
case KEYCODE_LMB:
|
break;
|
||||||
html += `<code class="keybinding leftMouse"></code>`;
|
case KEYCODE_RMB:
|
||||||
break;
|
html += `<code class="keybinding rightMouse"></code>`;
|
||||||
case KEYCODE_RMB:
|
break;
|
||||||
html += `<code class="keybinding rightMouse"></code>`;
|
case KEYCODE_MMB:
|
||||||
break;
|
html += `<code class="keybinding middleMouse"></code>`;
|
||||||
case KEYCODE_MMB:
|
break;
|
||||||
html += `<code class="keybinding middleMouse"></code>`;
|
case DIVIDER_TOKEN:
|
||||||
break;
|
html += `<i></i>`;
|
||||||
case DIVIDER_TOKEN:
|
break;
|
||||||
html += `<i></i>`;
|
case ADDER_TOKEN:
|
||||||
break;
|
html += `+`;
|
||||||
case ADDER_TOKEN:
|
break;
|
||||||
html += `+`;
|
default:
|
||||||
break;
|
html += `<code class="keybinding">${getStringForKeyCode(
|
||||||
default:
|
mapper.getBinding(/** @type {KeyCode} */ (key)).keyCode
|
||||||
html += `<code class="keybinding">${getStringForKeyCode(
|
)}</code>`;
|
||||||
mapper.getBinding(/** @type {KeyCode} */ (key)).keyCode
|
}
|
||||||
)}</code>`;
|
}
|
||||||
}
|
html += `<label>${handle.label}</label>`;
|
||||||
}
|
|
||||||
html += `<label>${handle.label}</label>`;
|
handle.cachedElement = makeDiv(this.element, null, ["binding"], html);
|
||||||
|
handle.cachedVisibility = false;
|
||||||
handle.cachedElement = makeDiv(this.element, null, ["binding"], html);
|
}
|
||||||
handle.cachedVisibility = false;
|
}
|
||||||
}
|
|
||||||
}
|
initialize() {
|
||||||
|
this.domAttach = new DynamicDomAttach(this.root, this.element, {
|
||||||
update() {
|
trackHover: true,
|
||||||
for (let i = 0; i < this.keybindings.length; ++i) {
|
});
|
||||||
const handle = this.keybindings[i];
|
}
|
||||||
const visibility = handle.condition();
|
|
||||||
if (visibility !== handle.cachedVisibility) {
|
update() {
|
||||||
handle.cachedVisibility = visibility;
|
for (let i = 0; i < this.keybindings.length; ++i) {
|
||||||
handle.cachedElement.classList.toggle("visible", visibility);
|
const handle = this.keybindings[i];
|
||||||
}
|
const visibility = handle.condition();
|
||||||
}
|
if (visibility !== handle.cachedVisibility) {
|
||||||
}
|
handle.cachedVisibility = visibility;
|
||||||
}
|
handle.cachedElement.classList.toggle("visible", visibility);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required for hover
|
||||||
|
this.domAttach.update(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -185,6 +185,9 @@ export class SoundImplBrowser extends SoundInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
|
// NOTICE: We override the initialize() method here with custom logic because
|
||||||
|
// we have a sound sprites instance
|
||||||
|
|
||||||
this.sfxHandle = new SoundSpritesContainer();
|
this.sfxHandle = new SoundSpritesContainer();
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@ -198,11 +201,11 @@ export class SoundImplBrowser extends SoundInterface {
|
|||||||
this.music[musicPath] = music;
|
this.music[musicPath] = music;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.musicMuted = this.app.settings.getAllSettings().musicMuted;
|
this.musicVolume = this.app.settings.getAllSettings().musicVolume;
|
||||||
this.soundsMuted = this.app.settings.getAllSettings().soundsMuted;
|
this.soundVolume = this.app.settings.getAllSettings().soundVolume;
|
||||||
|
|
||||||
if (G_IS_DEV && globalConfig.debug.disableMusic) {
|
if (G_IS_DEV && globalConfig.debug.disableMusic) {
|
||||||
this.musicMuted = true;
|
this.musicVolume = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
|
@ -103,9 +103,6 @@ export class SoundInterface {
|
|||||||
|
|
||||||
this.pageIsVisible = true;
|
this.pageIsVisible = true;
|
||||||
|
|
||||||
this.musicMuted = false;
|
|
||||||
this.soundsMuted = false;
|
|
||||||
|
|
||||||
this.musicVolume = 1.0;
|
this.musicVolume = 1.0;
|
||||||
this.soundVolume = 1.0;
|
this.soundVolume = 1.0;
|
||||||
}
|
}
|
||||||
@ -127,13 +124,11 @@ export class SoundInterface {
|
|||||||
this.music[musicPath] = music;
|
this.music[musicPath] = music;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.musicMuted = this.app.settings.getAllSettings().musicMuted;
|
|
||||||
this.soundsMuted = this.app.settings.getAllSettings().soundsMuted;
|
|
||||||
this.musicVolume = this.app.settings.getAllSettings().musicVolume;
|
this.musicVolume = this.app.settings.getAllSettings().musicVolume;
|
||||||
this.soundVolume = this.app.settings.getAllSettings().soundVolume;
|
this.soundVolume = this.app.settings.getAllSettings().soundVolume;
|
||||||
|
|
||||||
if (G_IS_DEV && globalConfig.debug.disableMusic) {
|
if (G_IS_DEV && globalConfig.debug.disableMusic) {
|
||||||
this.musicMuted = true;
|
this.musicVolume = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
@ -170,47 +165,6 @@ export class SoundInterface {
|
|||||||
return Promise.all(...promises);
|
return Promise.all(...promises);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns if the music is muted
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
getMusicMuted() {
|
|
||||||
return this.musicMuted;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns if sounds are muted
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
getSoundsMuted() {
|
|
||||||
return this.soundsMuted;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets if the music is muted
|
|
||||||
* @param {boolean} muted
|
|
||||||
*/
|
|
||||||
setMusicMuted(muted) {
|
|
||||||
this.musicMuted = muted;
|
|
||||||
if (this.musicMuted) {
|
|
||||||
if (this.currentMusic) {
|
|
||||||
this.currentMusic.stop();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (this.currentMusic) {
|
|
||||||
this.currentMusic.play(this.musicVolume);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets if the sounds are muted
|
|
||||||
* @param {boolean} muted
|
|
||||||
*/
|
|
||||||
setSoundsMuted(muted) {
|
|
||||||
this.soundsMuted = muted;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the music volume
|
* Returns the music volume
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
@ -254,7 +208,7 @@ export class SoundInterface {
|
|||||||
this.pageIsVisible = pageIsVisible;
|
this.pageIsVisible = pageIsVisible;
|
||||||
if (this.currentMusic) {
|
if (this.currentMusic) {
|
||||||
if (pageIsVisible) {
|
if (pageIsVisible) {
|
||||||
if (!this.currentMusic.isPlaying() && !this.musicMuted) {
|
if (!this.currentMusic.isPlaying()) {
|
||||||
this.currentMusic.play(this.musicVolume);
|
this.currentMusic.play(this.musicVolume);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -267,9 +221,6 @@ export class SoundInterface {
|
|||||||
* @param {string} key
|
* @param {string} key
|
||||||
*/
|
*/
|
||||||
playUiSound(key) {
|
playUiSound(key) {
|
||||||
if (this.soundsMuted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!this.sounds[key]) {
|
if (!this.sounds[key]) {
|
||||||
logger.warn("Sound", key, "not found, probably not loaded yet");
|
logger.warn("Sound", key, "not found, probably not loaded yet");
|
||||||
return;
|
return;
|
||||||
@ -288,7 +239,7 @@ export class SoundInterface {
|
|||||||
logger.warn("Music", key, "not found, probably not loaded yet");
|
logger.warn("Music", key, "not found, probably not loaded yet");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!this.pageIsVisible || this.soundsMuted) {
|
if (!this.pageIsVisible) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,7 +270,7 @@ export class SoundInterface {
|
|||||||
this.currentMusic.stop();
|
this.currentMusic.stop();
|
||||||
}
|
}
|
||||||
this.currentMusic = music;
|
this.currentMusic = music;
|
||||||
if (music && this.pageIsVisible && !this.musicMuted) {
|
if (music && this.pageIsVisible) {
|
||||||
logger.log("Starting", this.currentMusic.key);
|
logger.log("Starting", this.currentMusic.key);
|
||||||
music.play(this.musicVolume);
|
music.play(this.musicVolume);
|
||||||
}
|
}
|
||||||
|
@ -159,29 +159,13 @@ export const allApplicationSettings = [
|
|||||||
(app, id) => app.updateAfterUiScaleChanged(),
|
(app, id) => app.updateAfterUiScaleChanged(),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
new BoolSetting(
|
|
||||||
"soundsMuted",
|
|
||||||
enumCategories.general,
|
|
||||||
/**
|
|
||||||
* @param {Application} app
|
|
||||||
*/
|
|
||||||
(app, value) => app.sound.setSoundsMuted(value)
|
|
||||||
),
|
|
||||||
new RangeSetting(
|
new RangeSetting(
|
||||||
"soundVolume",
|
"soundVolume",
|
||||||
enumCategories.general,
|
enumCategories.general,
|
||||||
/**
|
/**
|
||||||
* @param {Application} app
|
* @param {Application} app
|
||||||
*/
|
*/
|
||||||
(app, value) => app.sound.setSoundVolume(value / 100.0)
|
(app, value) => app.sound.setSoundVolume(value)
|
||||||
),
|
|
||||||
new BoolSetting(
|
|
||||||
"musicMuted",
|
|
||||||
enumCategories.general,
|
|
||||||
/**
|
|
||||||
* @param {Application} app
|
|
||||||
*/
|
|
||||||
(app, value) => app.sound.setMusicMuted(value)
|
|
||||||
),
|
),
|
||||||
new RangeSetting(
|
new RangeSetting(
|
||||||
"musicVolume",
|
"musicVolume",
|
||||||
@ -189,7 +173,7 @@ export const allApplicationSettings = [
|
|||||||
/**
|
/**
|
||||||
* @param {Application} app
|
* @param {Application} app
|
||||||
*/
|
*/
|
||||||
(app, value) => app.sound.setMusicVolume(value / 100.0)
|
(app, value) => app.sound.setMusicVolume(value)
|
||||||
),
|
),
|
||||||
|
|
||||||
new BoolSetting(
|
new BoolSetting(
|
||||||
@ -277,6 +261,7 @@ export const allApplicationSettings = [
|
|||||||
new BoolSetting("disableCutDeleteWarnings", enumCategories.advanced, (app, value) => {}),
|
new BoolSetting("disableCutDeleteWarnings", enumCategories.advanced, (app, value) => {}),
|
||||||
new BoolSetting("rotationByBuilding", enumCategories.advanced, (app, value) => {}),
|
new BoolSetting("rotationByBuilding", enumCategories.advanced, (app, value) => {}),
|
||||||
new BoolSetting("displayChunkBorders", enumCategories.advanced, (app, value) => {}),
|
new BoolSetting("displayChunkBorders", enumCategories.advanced, (app, value) => {}),
|
||||||
|
new BoolSetting("pickMinerOnPatch", enumCategories.advanced, (app, value) => {}),
|
||||||
|
|
||||||
new EnumSetting("refreshRate", {
|
new EnumSetting("refreshRate", {
|
||||||
options: refreshRateOptions,
|
options: refreshRateOptions,
|
||||||
@ -302,8 +287,6 @@ class SettingsStorage {
|
|||||||
this.uiScale = "regular";
|
this.uiScale = "regular";
|
||||||
this.fullscreen = G_IS_STANDALONE;
|
this.fullscreen = G_IS_STANDALONE;
|
||||||
|
|
||||||
this.soundsMuted = false;
|
|
||||||
this.musicMuted = false;
|
|
||||||
this.soundVolume = 1.0;
|
this.soundVolume = 1.0;
|
||||||
this.musicVolume = 1.0;
|
this.musicVolume = 1.0;
|
||||||
|
|
||||||
@ -323,6 +306,7 @@ class SettingsStorage {
|
|||||||
this.rotationByBuilding = true;
|
this.rotationByBuilding = true;
|
||||||
this.clearCursorOnDeleteWhilePlacing = true;
|
this.clearCursorOnDeleteWhilePlacing = true;
|
||||||
this.displayChunkBorders = false;
|
this.displayChunkBorders = false;
|
||||||
|
this.pickMinerOnPatch = true;
|
||||||
|
|
||||||
this.enableColorBlindHelper = false;
|
this.enableColorBlindHelper = false;
|
||||||
|
|
||||||
@ -515,7 +499,17 @@ export class ApplicationSettings extends ReadWriteProxy {
|
|||||||
const setting = allApplicationSettings[i];
|
const setting = allApplicationSettings[i];
|
||||||
const storedValue = settings[setting.id];
|
const storedValue = settings[setting.id];
|
||||||
if (!setting.validate(storedValue)) {
|
if (!setting.validate(storedValue)) {
|
||||||
return ExplainedResult.bad("Bad setting value for " + setting.id + ": " + storedValue);
|
return ExplainedResult.bad(
|
||||||
|
"Bad setting value for " +
|
||||||
|
setting.id +
|
||||||
|
": " +
|
||||||
|
storedValue +
|
||||||
|
" @ settings version " +
|
||||||
|
data.version +
|
||||||
|
" (latest is " +
|
||||||
|
this.getCurrentVersion() +
|
||||||
|
")"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ExplainedResult.good();
|
return ExplainedResult.good();
|
||||||
@ -529,7 +523,7 @@ export class ApplicationSettings extends ReadWriteProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getCurrentVersion() {
|
getCurrentVersion() {
|
||||||
return 24;
|
return 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {{settings: SettingsStorage, version: number}} data */
|
/** @param {{settings: SettingsStorage, version: number}} data */
|
||||||
@ -633,10 +627,23 @@ export class ApplicationSettings extends ReadWriteProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data.version < 24) {
|
if (data.version < 24) {
|
||||||
data.settings.musicVolume = 1.0;
|
|
||||||
data.settings.soundVolume = 1.0;
|
|
||||||
data.settings.refreshRate = "60";
|
data.settings.refreshRate = "60";
|
||||||
data.version = 24;
|
}
|
||||||
|
|
||||||
|
if (data.version < 25) {
|
||||||
|
data.settings.musicVolume = 0.5;
|
||||||
|
data.settings.soundVolume = 0.5;
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
delete data.settings.musicMuted;
|
||||||
|
// @ts-ignore
|
||||||
|
delete data.settings.soundsMuted;
|
||||||
|
data.version = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.version < 26) {
|
||||||
|
data.settings.pickMinerOnPatch = true;
|
||||||
|
data.version = 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ExplainedResult.good();
|
return ExplainedResult.good();
|
||||||
|
@ -227,10 +227,10 @@ export class RangeSetting extends BaseSetting {
|
|||||||
category,
|
category,
|
||||||
changeCb = null,
|
changeCb = null,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
defaultValue = 100,
|
defaultValue = 1.0,
|
||||||
minValue = 0,
|
minValue = 0,
|
||||||
maxValue = 100,
|
maxValue = 1.0,
|
||||||
stepSize = 1
|
stepSize = 0.0001
|
||||||
) {
|
) {
|
||||||
super(id, category, changeCb, enabled);
|
super(id, category, changeCb, enabled);
|
||||||
|
|
||||||
@ -247,9 +247,9 @@ export class RangeSetting extends BaseSetting {
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label>${T.settings.labels[this.id].title}</label>
|
<label>${T.settings.labels[this.id].title}</label>
|
||||||
<div class="value range" data-setting="${this.id}">
|
<div class="value rangeInputContainer noPressEffect" data-setting="${this.id}">
|
||||||
<label class="range-label">${this.defaultValue}</label>
|
<label>${this.defaultValue}</label>
|
||||||
<input class="range-input" type="range" value="${this.defaultValue}" min="${
|
<input class="rangeInput" type="range" value="${this.defaultValue}" min="${
|
||||||
this.minValue
|
this.minValue
|
||||||
}" max="${this.maxValue}" step="${this.stepSize}">
|
}" max="${this.maxValue}" step="${this.stepSize}">
|
||||||
</div>
|
</div>
|
||||||
@ -265,33 +265,58 @@ export class RangeSetting extends BaseSetting {
|
|||||||
this.element = element;
|
this.element = element;
|
||||||
this.dialogs = dialogs;
|
this.dialogs = dialogs;
|
||||||
|
|
||||||
this.element.querySelector(".range-input").addEventListener("input", () => {
|
this.getRangeInputElement().addEventListener("input", () => {
|
||||||
|
this.updateLabels();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.getRangeInputElement().addEventListener("change", () => {
|
||||||
this.modify();
|
this.modify();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
syncValueToElement() {
|
syncValueToElement() {
|
||||||
const value = this.app.settings.getSetting(this.id);
|
const value = this.app.settings.getSetting(this.id);
|
||||||
/** @type {HTMLInputElement} */
|
this.setElementValue(value);
|
||||||
const rangeInput = this.element.querySelector(".range-input"),
|
}
|
||||||
rangeLabel = this.element.querySelector(".range-label");
|
|
||||||
rangeInput.value = value;
|
/**
|
||||||
rangeLabel.innerHTML = value;
|
* Sets the elements value to the given value
|
||||||
|
* @param {number} value
|
||||||
|
*/
|
||||||
|
setElementValue(value) {
|
||||||
|
const rangeInput = this.getRangeInputElement();
|
||||||
|
const rangeLabel = this.element.querySelector("label");
|
||||||
|
rangeInput.value = String(value);
|
||||||
|
rangeLabel.innerHTML = T.settings.rangeSliderPercentage.replace(
|
||||||
|
"<amount>",
|
||||||
|
String(Math.round(value * 100.0))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLabels() {
|
||||||
|
const value = Number(this.getRangeInputElement().value);
|
||||||
|
this.setElementValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {HTMLInputElement}
|
||||||
|
*/
|
||||||
|
getRangeInputElement() {
|
||||||
|
return this.element.querySelector("input.rangeInput");
|
||||||
}
|
}
|
||||||
|
|
||||||
modify() {
|
modify() {
|
||||||
/** @type {HTMLInputElement} */
|
const rangeInput = this.getRangeInputElement();
|
||||||
const rangeInput = this.element.querySelector(".range-input");
|
const newValue = Math.round(Number(rangeInput.value) * 100.0) / 100.0;
|
||||||
const newValue = Number(rangeInput.value);
|
|
||||||
this.app.settings.updateSetting(this.id, newValue);
|
this.app.settings.updateSetting(this.id, newValue);
|
||||||
this.syncValueToElement();
|
this.syncValueToElement();
|
||||||
|
console.log("SET", newValue);
|
||||||
if (this.changeCb) {
|
if (this.changeCb) {
|
||||||
this.changeCb(this.app, newValue);
|
this.changeCb(this.app, newValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
validate(value) {
|
validate(value) {
|
||||||
return typeof value === "number";
|
return typeof value === "number" && value >= this.minValue && value <= this.maxValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ steamPage:
|
|||||||
|
|
||||||
Der går ikke lang tid før du må mikse farver og male dine figurer med dem - Kombiner rød, grøn og blå farveresurser for at producere forskellige farver og mal derefter figurer med dem for at møde efterspørgslen.
|
Der går ikke lang tid før du må mikse farver og male dine figurer med dem - Kombiner rød, grøn og blå farveresurser for at producere forskellige farver og mal derefter figurer med dem for at møde efterspørgslen.
|
||||||
|
|
||||||
Dette spil indeholder 18 fremadskridende levels (Som allerede burde holde dig beskæftiget i timevis!) men jeg tilføjer hele tiden nyt - Der er en hel masse planlagt!
|
Dette spil indeholder 18 fremadskridende Niveauers (Som allerede burde holde dig beskæftiget i timevis!) men jeg tilføjer hele tiden nyt - Der er en hel masse planlagt!
|
||||||
|
|
||||||
Hvis du køber spillet, får du adgang til den selvstændige version, der har endnu flere ting, og du får også adgang til nyudviklet indhold.
|
Hvis du køber spillet, får du adgang til den selvstændige version, der har endnu flere ting, og du får også adgang til nyudviklet indhold.
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ steamPage:
|
|||||||
[*] Uendelige Gem
|
[*] Uendelige Gem
|
||||||
[*] Yderligere Indstillinger
|
[*] Yderligere Indstillinger
|
||||||
[*] Kommer snart: Ledninger & Energi! Går efter at udgive (omkring) enden af juli 2020.
|
[*] Kommer snart: Ledninger & Energi! Går efter at udgive (omkring) enden af juli 2020.
|
||||||
[*] Kommer snart: Flere levels
|
[*] Kommer snart: Niveauer
|
||||||
[*] Støtter mig i yderligere at udvikle shapez.io ❤️
|
[*] Støtter mig i yderligere at udvikle shapez.io ❤️
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ global:
|
|||||||
control: CTRL
|
control: CTRL
|
||||||
alt: ALT
|
alt: ALT
|
||||||
escape: ESC
|
escape: ESC
|
||||||
shift: SHIFT
|
shift: SKIFT
|
||||||
space: MELLEMRUM
|
space: MELLEMRUM
|
||||||
|
|
||||||
demoBanners:
|
demoBanners:
|
||||||
@ -145,7 +145,7 @@ mainMenu:
|
|||||||
newGame: Nyt Spil
|
newGame: Nyt Spil
|
||||||
changelog: Changelog
|
changelog: Changelog
|
||||||
subreddit: Reddit
|
subreddit: Reddit
|
||||||
importSavegame: Importer
|
importSavegame: Importér
|
||||||
openSourceHint: Dette spil er open source!
|
openSourceHint: Dette spil er open source!
|
||||||
discordLink: Officiel Discord Server
|
discordLink: Officiel Discord Server
|
||||||
helpTranslate: Hjælp med at oversætte!
|
helpTranslate: Hjælp med at oversætte!
|
||||||
@ -155,8 +155,8 @@ mainMenu:
|
|||||||
browserWarning: >-
|
browserWarning: >-
|
||||||
Undskyld, men spillet er kendt for at køre langsomt på denne browser! Køb spillet eller download chrome for den fulde oplevelse.
|
Undskyld, men spillet er kendt for at køre langsomt på denne browser! Køb spillet eller download chrome for den fulde oplevelse.
|
||||||
|
|
||||||
savegameLevel: Level <x>
|
savegameLevel: Niveau <x>
|
||||||
savegameLevelUnknown: Ukendt Level
|
savegameLevelUnknown: Ukendt Niveau
|
||||||
|
|
||||||
dialogs:
|
dialogs:
|
||||||
buttons:
|
buttons:
|
||||||
@ -175,32 +175,32 @@ dialogs:
|
|||||||
importSavegameError:
|
importSavegameError:
|
||||||
title: Import Fejl
|
title: Import Fejl
|
||||||
text: >-
|
text: >-
|
||||||
Importering af gem fejlede:
|
Importering af gemt spil fejlede:
|
||||||
|
|
||||||
importSavegameSuccess:
|
importSavegameSuccess:
|
||||||
title: Gem Importeret
|
title: Gemt spil Importeret
|
||||||
text: >-
|
text: >-
|
||||||
Dit gem blev importet.
|
Dit gemte spil blev importet.
|
||||||
|
|
||||||
gameLoadFailure:
|
gameLoadFailure:
|
||||||
title: Spillet er i stykker
|
title: Spillet er i stykker
|
||||||
text: >-
|
text: >-
|
||||||
Det lykkedes ikke at åbne dit gem:
|
Det lykkedes ikke at åbne dit gemte spil:
|
||||||
|
|
||||||
confirmSavegameDelete:
|
confirmSavegameDelete:
|
||||||
title: Bekræft sletning
|
title: Bekræft sletning
|
||||||
text: >-
|
text: >-
|
||||||
Er du sikker på du vil slette dit gem?
|
Er du sikker på du vil slette dit gemte spil?
|
||||||
|
|
||||||
savegameDeletionError:
|
savegameDeletionError:
|
||||||
title: Sletning fejlede
|
title: Sletning fejlede
|
||||||
text: >-
|
text: >-
|
||||||
Det lykkedes ikke at slette dit gem:
|
Det lykkedes ikke at slette dit gemte spil:
|
||||||
|
|
||||||
restartRequired:
|
restartRequired:
|
||||||
title: Genstart er nødvendig
|
title: Genstart er nødvendig
|
||||||
text: >-
|
text: >-
|
||||||
You need to restart the game to apply the settings.
|
Du er nødt til at genstarte spillet for at anvende indstillingerne.
|
||||||
|
|
||||||
editKeybinding:
|
editKeybinding:
|
||||||
title: Ændr Keybinding
|
title: Ændr Keybinding
|
||||||
@ -208,7 +208,7 @@ dialogs:
|
|||||||
|
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Nulstil keybindings
|
title: Nulstil keybindings
|
||||||
desc: Dette vil nulstille alle keybindings til deres standarder. Vær sød at bekræfte.
|
desc: Dette vil nulstille alle keybindings til deres standarder. Bekræft venligst.
|
||||||
|
|
||||||
keybindingsResetOk:
|
keybindingsResetOk:
|
||||||
title: Keybindings nulstillet
|
title: Keybindings nulstillet
|
||||||
@ -219,8 +219,8 @@ dialogs:
|
|||||||
desc: Du prøvede at bruge en funktion (<feature>) der ikke er tilgængelig i demoen. Overvej at købe spillet for den fulde oplevelse!
|
desc: Du prøvede at bruge en funktion (<feature>) der ikke er tilgængelig i demoen. Overvej at købe spillet for den fulde oplevelse!
|
||||||
|
|
||||||
oneSavegameLimit:
|
oneSavegameLimit:
|
||||||
title: Begrænset mængde gem
|
title: Begrænset mængde gemte spil
|
||||||
desc: Du kan kun have et gem af gangen in demoversionen. Vær sød at slette det nuværende gem eller at købe spillet!
|
desc: Du kan kun have et gemt spil ad gangen in demoversionen. Vær sød at slette det nuværende gemte spil eller at købe spillet!
|
||||||
|
|
||||||
updateSummary:
|
updateSummary:
|
||||||
title: Ny opdatering!
|
title: Ny opdatering!
|
||||||
@ -230,23 +230,23 @@ dialogs:
|
|||||||
upgradesIntroduction:
|
upgradesIntroduction:
|
||||||
title: Få Opgraderinger
|
title: Få Opgraderinger
|
||||||
desc: >-
|
desc: >-
|
||||||
Alle figurer du producere kan blive brugt til at få opgraderinger - <strong>Ødelæg ikke dine gamle fabrikker!</strong>
|
Alle figurer du producerer kan blive brugt til at få opgraderinger - <strong>Ødelæg ikke dine gamle fabrikker!</strong>
|
||||||
Opgraderingeringsvinduet kan findes i det øverste højre hjørne af skærmen.
|
Opgraderingeringsvinduet kan findes i det øverste højre hjørne af skærmen.
|
||||||
|
|
||||||
massDeleteConfirm:
|
massDeleteConfirm:
|
||||||
title: Bekræft sletning
|
title: Bekræft sletning
|
||||||
desc: >-
|
desc: >-
|
||||||
Du er ved at slette mange bygninger (<count> helt præcis)! Er du sikker på at det er det du vil gøre?
|
Du er ved at slette mange bygninger (<count> helt præcist)! Er du sikker på at det er det du vil gøre?
|
||||||
|
|
||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Bekræft klip
|
title: Bekræft klip
|
||||||
desc: >-
|
desc: >-
|
||||||
Du er ved at klippe mange bygninger (<count> helt præcis)! Er du sikker på at det er det du vil gøre?
|
Du er ved at klippe mange bygninger (<count> helt præcist)! Er du sikker på at det er det du vil gøre?
|
||||||
|
|
||||||
blueprintsNotUnlocked:
|
blueprintsNotUnlocked:
|
||||||
title: Ikke tilgængeligt endnu
|
title: Ikke tilgængeligt endnu
|
||||||
desc: >-
|
desc: >-
|
||||||
Klar level 12 for at bruge arbejdstegninger!
|
Gennemfør Niveau 12 for at bruge arbejdstegninger!
|
||||||
|
|
||||||
keybindingsIntroduction:
|
keybindingsIntroduction:
|
||||||
title: Brugbare keybindings
|
title: Brugbare keybindings
|
||||||
@ -254,8 +254,8 @@ dialogs:
|
|||||||
Dette spil har mange keybindings, som gør det lettere at bygge store fabrikker.
|
Dette spil har mange keybindings, som gør det lettere at bygge store fabrikker.
|
||||||
Her er et par, men husk at <strong>tjekke keybindings</strong>!<br><br>
|
Her er et par, men husk at <strong>tjekke keybindings</strong>!<br><br>
|
||||||
<code class='keybinding'>CTRL</code> + Træk: Vælg et område.<br>
|
<code class='keybinding'>CTRL</code> + Træk: Vælg et område.<br>
|
||||||
<code class='keybinding'>SHIFT</code>: Hold for at sætte flere af en bygning.<br>
|
<code class='keybinding'>SHIFT</code>: Hold for at placere flere af en bygning.<br>
|
||||||
<code class='keybinding'>ALT</code>: Vend retningen af nedsatte transportbånd.<br>
|
<code class='keybinding'>ALT</code>: Vend retningen af placerede transportbånd.<br>
|
||||||
|
|
||||||
createMarker:
|
createMarker:
|
||||||
title: Ny Markør
|
title: Ny Markør
|
||||||
@ -270,7 +270,7 @@ dialogs:
|
|||||||
desc: Du bad om at eksportere din fabrik som et skærmbillede. Bemærk at dette kan være rimelig langsomt for en stor base og kan endda lukke dit spil!
|
desc: Du bad om at eksportere din fabrik som et skærmbillede. Bemærk at dette kan være rimelig langsomt for en stor base og kan endda lukke dit spil!
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: Bekræft klip
|
title: Bekræft klip
|
||||||
desc: Du har ikke råd til at sætte dette område ind igen! Er du sikker på du vil klippe det?
|
desc: Du har ikke råd til at sætte dette område ind igen! Er du sikker på at du vil klippe det?
|
||||||
|
|
||||||
ingame:
|
ingame:
|
||||||
# This is shown in the top left corner and displays useful keybindings in
|
# This is shown in the top left corner and displays useful keybindings in
|
||||||
@ -280,7 +280,7 @@ ingame:
|
|||||||
selectBuildings: Marker område
|
selectBuildings: Marker område
|
||||||
stopPlacement: Stop placering
|
stopPlacement: Stop placering
|
||||||
rotateBuilding: Roter bygning
|
rotateBuilding: Roter bygning
|
||||||
placeMultiple: Sæt flere
|
placeMultiple: Placer flere
|
||||||
reverseOrientation: Omvend retning
|
reverseOrientation: Omvend retning
|
||||||
disableAutoOrientation: Slå automatisk retning fra
|
disableAutoOrientation: Slå automatisk retning fra
|
||||||
toggleHud: Slå HUD til/fra
|
toggleHud: Slå HUD til/fra
|
||||||
@ -289,7 +289,7 @@ ingame:
|
|||||||
delete: Slet
|
delete: Slet
|
||||||
pasteLastBlueprint: Sæt sidste arbejdstegning ind
|
pasteLastBlueprint: Sæt sidste arbejdstegning ind
|
||||||
lockBeltDirection: Aktiver bælteplanlægger
|
lockBeltDirection: Aktiver bælteplanlægger
|
||||||
plannerSwitchSide: Flip planlægsningsside
|
plannerSwitchSide: Vend planlægsningsside
|
||||||
cutSelection: Klip
|
cutSelection: Klip
|
||||||
copySelection: Kopier
|
copySelection: Kopier
|
||||||
clearSelection: Ryd Selektion
|
clearSelection: Ryd Selektion
|
||||||
@ -353,7 +353,7 @@ ingame:
|
|||||||
# The roman number for each tier
|
# The roman number for each tier
|
||||||
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
||||||
|
|
||||||
maximumLevel: STØRSTE NIVEAU (Speed x<currentMult>)
|
maximumLevel: HØJESTE NIVEAU (Speed x<currentMult>)
|
||||||
|
|
||||||
# The "Statistics" window
|
# The "Statistics" window
|
||||||
statistics:
|
statistics:
|
||||||
@ -364,7 +364,7 @@ ingame:
|
|||||||
description: Viser mængden af opbevarede figurer i din centrale bygning.
|
description: Viser mængden af opbevarede figurer i din centrale bygning.
|
||||||
produced:
|
produced:
|
||||||
title: Produceret
|
title: Produceret
|
||||||
description: Viser alle de figurer hele din fabrik producere, inklusiv produkter brugt til videre produktion.
|
description: Viser alle de figurer hele din fabrik producerer, inklusiv produkter brugt til videre produktion.
|
||||||
delivered:
|
delivered:
|
||||||
title: Afleveret
|
title: Afleveret
|
||||||
description: Viser figurer som er afleveret til din centrale bygning.
|
description: Viser figurer som er afleveret til din centrale bygning.
|
||||||
@ -383,7 +383,7 @@ ingame:
|
|||||||
buttons:
|
buttons:
|
||||||
continue: Fortsæt
|
continue: Fortsæt
|
||||||
settings: Indstillinger
|
settings: Indstillinger
|
||||||
menu: Til menu
|
menu: Hovedmenu
|
||||||
|
|
||||||
# Bottom left tutorial hints
|
# Bottom left tutorial hints
|
||||||
tutorialHints:
|
tutorialHints:
|
||||||
@ -399,7 +399,7 @@ ingame:
|
|||||||
waypoints:
|
waypoints:
|
||||||
waypoints: Markører
|
waypoints: Markører
|
||||||
hub: HUB
|
hub: HUB
|
||||||
description: Venstreklik en markør for at hoppe til den, højreklik for at slette den.<br><br>Tryk <keybinding> for at lave en markør på det nuværende sted, eller <strong>højreklik</strong> for at lave en markør på den valgte lokation.
|
description: Venstreklik en markør for at hoppe til den, højreklik for at slette den.<br><br>Tryk <keybinding> for at lave en markør på det nuværende sted, eller <strong>højreklik</strong> for at lave en markør på det valgte sted.
|
||||||
creationSuccessNotification: Markør er sat.
|
creationSuccessNotification: Markør er sat.
|
||||||
|
|
||||||
# Shape viewer
|
# Shape viewer
|
||||||
@ -414,10 +414,10 @@ ingame:
|
|||||||
hints:
|
hints:
|
||||||
1_1_extractor: Sæt en <strong>udvinder</strong> på toppen af en<strong>cirkelfigur</strong> for at begynde produktion af den!
|
1_1_extractor: Sæt en <strong>udvinder</strong> på toppen af en<strong>cirkelfigur</strong> for at begynde produktion af den!
|
||||||
1_2_conveyor: >-
|
1_2_conveyor: >-
|
||||||
Forbind udvinderen med et <strong>transportbælte</strong> til din hub!<br><br>Tip: <strong>Tryk og træk</strong> bæltet med din mus!
|
Forbind udvinderen til din hub med et <strong>transportbælte</strong>!<br><br>Tip: <strong>Tryk og træk</strong> bæltet med din mus!
|
||||||
|
|
||||||
1_3_expand: >-
|
1_3_expand: >-
|
||||||
Dette er <strong>IKKE</strong> et idle game! Byg flere udvindere og bælter for at færdiggøre målet hurtigere.<br><br>Tip: Hold <strong>SHIFT</strong> for at sætte flere udvindere, og tryk <strong>R</strong> for at rotere dem.
|
Dette er <strong>IKKE</strong> et idle game! Byg flere udvindere og bælter for at færdiggøre målet hurtigere.<br><br>Tip: Hold <strong>SKIFT</strong> for at sætte flere udvindere, og tryk <strong>R</strong> for at rotere dem.
|
||||||
|
|
||||||
# All shop upgrades
|
# All shop upgrades
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
@ -439,12 +439,12 @@ buildings:
|
|||||||
hub:
|
hub:
|
||||||
deliver: Aflever
|
deliver: Aflever
|
||||||
toUnlock: for at få adgang til
|
toUnlock: for at få adgang til
|
||||||
levelShortcut: LVL
|
levelShortcut: NIV
|
||||||
|
|
||||||
belt:
|
belt:
|
||||||
default:
|
default:
|
||||||
name: &belt Transportbælte
|
name: &belt Transportbælte
|
||||||
description: Transportere varer, hold og træk for at sætte flere.
|
description: Transporterer figurer, hold og træk for at sætte flere.
|
||||||
|
|
||||||
# Internal name for the Extractor
|
# Internal name for the Extractor
|
||||||
miner:
|
miner:
|
||||||
@ -454,55 +454,55 @@ buildings:
|
|||||||
|
|
||||||
chainable:
|
chainable:
|
||||||
name: Udvinder (Kæde)
|
name: Udvinder (Kæde)
|
||||||
description: Placer over en figur eller farve for at udvinde den. Kan sættes i kæder.
|
description: Placer over en figur eller farve for at udvinde den. Kan kædes.
|
||||||
|
|
||||||
# Internal name for the Tunnel
|
# Internal name for the Tunnel
|
||||||
underground_belt:
|
underground_belt:
|
||||||
default:
|
default:
|
||||||
name: &underground_belt Tunnel
|
name: &underground_belt Tunnel
|
||||||
description: Laver tunneller under bygninger and bælter.
|
description: Laver tunneller under bygninger og bælter.
|
||||||
|
|
||||||
tier2:
|
tier2:
|
||||||
name: Tunnel Trin II
|
name: Tunnel Trin II
|
||||||
description: Laver tunneller under bygninger and bælter.
|
description: Laver tunneller under bygninger og bælter.
|
||||||
|
|
||||||
# Internal name for the Balancer
|
# Internal name for the Balancer
|
||||||
splitter:
|
splitter:
|
||||||
default:
|
default:
|
||||||
name: &splitter Spalter
|
name: &splitter Fordeler
|
||||||
description: Flere funktioner - Fordeler alle modtagne varer jævnt.
|
description: Flere funktioner - Fordeler alle modtagne varer jævnt.
|
||||||
|
|
||||||
compact:
|
compact:
|
||||||
name: Sammenlægger (kompakt)
|
name: Sammenlægger (kompakt)
|
||||||
description: Sammenlægger to bælter til en.
|
description: Lægger to bælter sammen til et.
|
||||||
|
|
||||||
compact-inverse:
|
compact-inverse:
|
||||||
name: Sammenlægger (kompakt)
|
name: Sammenlægger (kompakt)
|
||||||
description: Sammenlægger to bælter til en.
|
description: Lægger to bælter sammen til et.
|
||||||
|
|
||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: &cutter Klipper
|
name: &cutter Klipper
|
||||||
description: Klipper figurer fra top til bund og udsender begge halvdele. <strong>Hvis du kun bruger den ene halvdel så husk at ødelæg den anden del eller maskinen går i stå!</strong>
|
description: Klipper figurer fra top til bund og udsender begge halvdele. <strong>Hvis du kun bruger den ene halvdel så husk at ødelægge den anden del, ellers går maskinen i stå!</strong>
|
||||||
quad:
|
quad:
|
||||||
name: Klipper (firdeler)
|
name: Klipper (firdeler)
|
||||||
description: Klipper figurer om til fire dele. <strong>Hvis du kun bruger nogle af dem så husk at ødelæg de andre dele eller maskinen går i stå!</strong>
|
description: Klipper figurer om til fire dele. <strong>Hvis du kun bruger nogle af dem så husk at ødelægge de andre dele, ellers går maskinen i stå!</strong>
|
||||||
|
|
||||||
rotater:
|
rotater:
|
||||||
default:
|
default:
|
||||||
name: &rotater Drejer
|
name: &rotater Drejer
|
||||||
description: Drejer figurer med uret med 90 grader.
|
description: Drejer figurer 90 grader med uret.
|
||||||
ccw:
|
ccw:
|
||||||
name: Drejer (mod uret)
|
name: Drejer (mod uret)
|
||||||
description: Drejer figurer mod uret med 90 grader.
|
description: Drejer figurer 90 grader mod uret.
|
||||||
fl:
|
fl:
|
||||||
name: Drejer (180)
|
name: Drejer (180)
|
||||||
description: Drejer figurer med 180 grader.
|
description: Drejer figurer 180 grader.
|
||||||
|
|
||||||
stacker:
|
stacker:
|
||||||
default:
|
default:
|
||||||
name: &stacker Stabler
|
name: &stacker Stabler
|
||||||
description: Stabler begge figurer. Hvis de ikke kan sammensmeltes, så er den højre figur sat oven på den venstre.
|
description: Stabler begge figurer. Hvis de ikke kan sammensmeltes, så sættes den højre figur oven på den venstre.
|
||||||
|
|
||||||
mixer:
|
mixer:
|
||||||
default:
|
default:
|
||||||
@ -527,12 +527,12 @@ buildings:
|
|||||||
|
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: &trash Skrald
|
name: &trash Skraldespand
|
||||||
description: Tillader input fra alle sider og ødelææger dem. For evigt.
|
description: Tillader input fra alle sider og ødelægger dem. For evigt.
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Opbevaring
|
name: Opbevaring
|
||||||
description: Opbevarer ekstra varer, til en given kapicitet. Kan bruges til at håndtere overproduktion.
|
description: Opbevarer ekstra figurer, til en given kapicitet. Kan bruges til at håndtere overproduktion.
|
||||||
|
|
||||||
energy_generator:
|
energy_generator:
|
||||||
deliver: Aflever
|
deliver: Aflever
|
||||||
@ -548,14 +548,14 @@ buildings:
|
|||||||
advanced_processor:
|
advanced_processor:
|
||||||
default:
|
default:
|
||||||
name: Farveomvender
|
name: Farveomvender
|
||||||
description: Tager imod en farve giver den modsatte.
|
description: Tager imod en farve, og giver den modsatte.
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: Ledningsspalter
|
name: Ledningsspalter
|
||||||
description: Spalter en energiledning i to.
|
description: Spalter en energiledning i to.
|
||||||
merger:
|
merger:
|
||||||
name: Ledningssammenlægger
|
name: Ledningssammenlægger
|
||||||
description: Sammenlægger to energiledninger til en.
|
description: Lægger to energiledninger sammen til en.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
@ -565,7 +565,7 @@ storyRewards:
|
|||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotation
|
title: Rotation
|
||||||
desc: <strong>Drejeren</strong> er nu tilgængelig! Den drejer figurer med uret med 90 grader.
|
desc: <strong>Drejeren</strong> er nu tilgængelig! Den drejer figurer 90 grader med uret.
|
||||||
|
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Maling
|
title: Maling
|
||||||
@ -578,11 +578,11 @@ storyRewards:
|
|||||||
|
|
||||||
reward_stacker:
|
reward_stacker:
|
||||||
title: Stabler
|
title: Stabler
|
||||||
desc: Du kan du stable figurer med <strong>stableren</strong>! Begge input er stablet, hvis de kan sættes ved siden af hinanden, <strong>sammensmeltes de</strong>. Hvis ikke er det højre input <strong>stablet ovenpå</strong> det venstre!
|
desc: Du kan du stable figurer med <strong>stableren</strong>! Begge inputs stables. Hvis de kan sættes ved siden af hinanden, <strong>sammensmeltes de</strong>. Hvis ikke, bliver det højre input <strong>stablet ovenpå</strong> det venstre!
|
||||||
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Spalter/Sammenlægger
|
title: Fordeler/Sammenlægger
|
||||||
desc: Den flerfunktionelle <strong>spalter</strong> er nu tilgængelig - Den kan blive brugt til at bygge større fabrikker ved at <strong>spalte og sammenlægge varer</strong> på flere bælter!<br><br>
|
desc: Den flerfunktionelle <strong>Fordeler</strong> er nu tilgængelig - Den kan bruges til at bygge større fabrikker ved at <strong>fordele og sammenlægge varer</strong> på flere bælter!<br><br>
|
||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunnel
|
title: Tunnel
|
||||||
@ -601,13 +601,13 @@ storyRewards:
|
|||||||
desc: Du har fået adgang til en variant af <strong>tunnellen</strong> - Den har en <strong>større rækkevidde</strong>, og du kan også bruge begge typer tunneller på den samme strækning!
|
desc: Du har fået adgang til en variant af <strong>tunnellen</strong> - Den har en <strong>større rækkevidde</strong>, og du kan også bruge begge typer tunneller på den samme strækning!
|
||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Kompakt Spalter
|
title: Kompakt Fordeler
|
||||||
desc: >-
|
desc: >-
|
||||||
Du har fået adgang til en kompakt variant af <strong>spalteren</strong> - Den tager to inputs og sammenlægger dem til en!
|
Du har fået adgang til en kompakt variant af <strong>fordeleren</strong> - Den tager to inputs og lægger dem sammen til en!
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Quad Klipining
|
title: Quad Klipining
|
||||||
desc: Du har fået adgang til en variant af <strong>klipperen</strong> - Den lader dig klippe figurer i <strong>fire dele</strong> i stedet for bare to!
|
desc: Du har fået adgang til en variant af <strong>klipperen</strong> - Den lader dig klippe figurer i <strong>fire dele</strong> i stedet for kun to!
|
||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Dobbelt Maling
|
title: Dobbelt Maling
|
||||||
@ -615,37 +615,37 @@ storyRewards:
|
|||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Quad Maling
|
title: Quad Maling
|
||||||
desc: Du har fået adgang til en variant af <strong>maleren</strong> - Den lader dig male hver del af en figur for sig!
|
desc: Du har fået adgang til en variant af <strong>maleren</strong> - Den lader dig male alle dele af en figur hver for sig!
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Opbevaringsbuffer
|
title: Opbevaringsbuffer
|
||||||
desc: Du har fået adgang til en variant af <strong>skraldespanden</strong> - Den lader dig opbevarer varer til en hvis kapacitet!
|
desc: Du har fået adgang til en variant af <strong>skraldespanden</strong> - Den lader dig opbevare varer til en hvis kapacitet!
|
||||||
|
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Frit spil
|
title: Frit spil
|
||||||
desc: Du klarede det! Du har fået adgang til <strong>frit spil</strong>! Dette betyder at figurer nu er tilfældigt genereret! (Vær ikke bekymret, mere indhold er planlagt for den købte version!)
|
desc: Du klarede det! Du har fået adgang til <strong>frit spil</strong>! Dette betyder at figurer nu er tilfældigt genereret! (Vær ikke bekymret, mere indhold er planlagt for den betalte version!)
|
||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Arbejdstegninger
|
title: Arbejdstegninger
|
||||||
desc: Du kan nu <strong>kopiere og indsætte</strong> dele af din fabrik! Vælg et område (Hold CTRL, og træk med musen), og tryk 'C' for at kopiere det.<br><br>At sætte det ind er <strong>ikke gratis</strong>, du skal producere <strong>arbejdstegning figurer</strong> for at have råd til det! (Dem du lige har leveret).
|
desc: Du kan nu <strong>kopiere og indsætte</strong> dele af din fabrik! Vælg et område (Hold CTRL, og træk med musen), og tryk 'C' for at kopiere det.<br><br>At sætte det ind er <strong>ikke gratis</strong>. Du skal producere <strong>arbejdstegning figurer</strong> for at have råd til det! (Dem du lige har leveret).
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Næste level
|
title: Næste niveau
|
||||||
desc: >-
|
desc: >-
|
||||||
Dette level gav dig ingen belønninger, men det vil det næste! <br><br> PS: Du må hellere lade være med at ødelægge din fabrik - Du får brug for <strong>alle</strong> de figurer senere igen for at <strong>få opgraderinger</strong>!
|
Dette niveau gav dig ingen belønninger, men det vil det næste! <br><br> PS: Du må hellere lade være med at ødelægge din fabrik - Du får brug for <strong>alle</strong> de figurer senere igen for at <strong>få opgraderinger</strong>!
|
||||||
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Næste level
|
title: Næste niveau
|
||||||
desc: >-
|
desc: >-
|
||||||
Tillykke! Forresten er mere indhold planlagt for den købte version!
|
Tillykke! Forresten er mere indhold planlagt for den betalte version!
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
title: Indstillinger
|
title: Indstillinger
|
||||||
categories:
|
categories:
|
||||||
general: Generelt
|
general: Generelt
|
||||||
userInterface: Brugerflade
|
userInterface: Brugerflade
|
||||||
advanced: Advanceret
|
advanced: Avanceret
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Udvikling
|
dev: Udvikling
|
||||||
@ -657,7 +657,7 @@ settings:
|
|||||||
uiScale:
|
uiScale:
|
||||||
title: Grænseflade størrelse
|
title: Grænseflade størrelse
|
||||||
description: >-
|
description: >-
|
||||||
Ændrer størrelsen på brugerfladen. Den vil stadig skalere baseret på opløsningen af din skærm, men denne indstilling bestemmer hvor meget den skalere.
|
Ændrer størrelsen på brugerfladen. Den vil stadig skalere baseret på opløsningen af din skærm, men denne indstilling bestemmer hvor meget den skalerer.
|
||||||
scales:
|
scales:
|
||||||
super_small: Meget lille
|
super_small: Meget lille
|
||||||
small: Lille
|
small: Lille
|
||||||
@ -668,20 +668,20 @@ settings:
|
|||||||
autosaveInterval:
|
autosaveInterval:
|
||||||
title: Autogem Interval
|
title: Autogem Interval
|
||||||
description: >-
|
description: >-
|
||||||
Kontrollere hvor ofte spillet gemmer automatisk. Du kan også slå det helt fra her.
|
Ændrer hvor ofte spillet gemmer automatisk. Du kan også slå det helt fra her.
|
||||||
|
|
||||||
intervals:
|
intervals:
|
||||||
one_minute: 1 Minut
|
one_minute: 1 Minut
|
||||||
two_minutes: 2 Minuter
|
two_minutes: 2 Minutter
|
||||||
five_minutes: 5 Minuter
|
five_minutes: 5 Minutter
|
||||||
ten_minutes: 10 Minuter
|
ten_minutes: 10 Minutter
|
||||||
twenty_minutes: 20 Minuter
|
twenty_minutes: 20 Minutter
|
||||||
disabled: Slået fra
|
disabled: Slået fra
|
||||||
|
|
||||||
scrollWheelSensitivity:
|
scrollWheelSensitivity:
|
||||||
title: Zoom følsomhed
|
title: Zoom følsomhed
|
||||||
description: >-
|
description: >-
|
||||||
Ændrer hvor følsomt zoomet er (Enten mussehjulet eller trackpad).
|
Ændrer hvor følsomt zoomet er (Enten musehjulet eller trackpad).
|
||||||
sensitivity:
|
sensitivity:
|
||||||
super_slow: Meget langsom
|
super_slow: Meget langsom
|
||||||
slow: Langsom
|
slow: Langsom
|
||||||
@ -709,12 +709,12 @@ settings:
|
|||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Farveblindstilstand
|
title: Farveblindstilstand
|
||||||
description: >-
|
description: >-
|
||||||
Aktivere forskellige redskaber der lader dig spille, selv hvis du er farveblind.
|
Aktiverer forskellige redskaber der lader dig spille, selv hvis du er farveblind.
|
||||||
|
|
||||||
fullscreen:
|
fullscreen:
|
||||||
title: Fuld skærm
|
title: Fuld skærm
|
||||||
description: >-
|
description: >-
|
||||||
Det er forslået at spille i fuld skærm for den bedste oplevelse. Kun tilgængelig i den købte version.
|
Det er foreslået at spille i fuld skærm for den bedste oplevelse. Kun tilgængelig i den betalte version.
|
||||||
|
|
||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: Slå lydeffekterne fra
|
title: Slå lydeffekterne fra
|
||||||
@ -727,9 +727,9 @@ settings:
|
|||||||
Aktiver for at slå al musik fra.
|
Aktiver for at slå al musik fra.
|
||||||
|
|
||||||
theme:
|
theme:
|
||||||
title: Spiltilstand
|
title: Tema
|
||||||
description: >-
|
description: >-
|
||||||
Vælg spiltilstand (lys / mørk).
|
Vælg tema (lys / mørk).
|
||||||
themes:
|
themes:
|
||||||
dark: Mørk
|
dark: Mørk
|
||||||
light: Lys
|
light: Lys
|
||||||
@ -737,17 +737,17 @@ settings:
|
|||||||
refreshRate:
|
refreshRate:
|
||||||
title: Simulationsmål
|
title: Simulationsmål
|
||||||
description: >-
|
description: >-
|
||||||
Hvis du har en 144hz skærm ændr opdateringshastigheden her så spillet vil simulere den højere opdateringshastighed korrekt. Dette kan faktisk sænke din FPS hvis din computer er for langsom.
|
Hvis du har en 144hz skærm, så ændr opdateringshastigheden her så spillet vil simulere den højere opdateringshastighed korrekt. Dette kan faktisk sænke din FPS hvis din computer er for langsom.
|
||||||
|
|
||||||
alwaysMultiplace:
|
alwaysMultiplace:
|
||||||
title: Multiplacer
|
title: Multiplacér
|
||||||
description: >-
|
description: >-
|
||||||
Aktiver for at alle bygninger fortsætter med at være valgt efter placering, indtil du vælger den fra. Dette svarer til altid at holde SHIFT nede.
|
Aktiver for at alle bygninger fortsætter med at være valgt efter placering, indtil du vælger dem fra. Dette svarer til altid at holde SKIFT nede.
|
||||||
|
|
||||||
offerHints:
|
offerHints:
|
||||||
title: Hints & Vejledning
|
title: Hints & Vejledning
|
||||||
description: >-
|
description: >-
|
||||||
Om spillet skal tilbyde hints og vejledning imens du spiller. Skjuler også visse dele af brugerfladen indtil et givent level for at gøre det nemmere at lære spillet at kende.
|
Om spillet skal tilbyde hints og vejledning imens du spiller. Skjuler også visse dele af brugerfladen indtil et givent niveau for at gøre det nemmere at lære spillet at kende.
|
||||||
|
|
||||||
enableTunnelSmartplace:
|
enableTunnelSmartplace:
|
||||||
title: Smarte Tunneller
|
title: Smarte Tunneller
|
||||||
@ -757,7 +757,7 @@ settings:
|
|||||||
vignette:
|
vignette:
|
||||||
title: Vignette
|
title: Vignette
|
||||||
description: >-
|
description: >-
|
||||||
Aktivere vignette hvilket mørkner kanterne af skærmen og gør teksten nemmere at læse.
|
Aktiverer vignette hvilket mørkner kanterne af skærmen og gør teksten nemmere at læse.
|
||||||
|
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Rotation baseret på bygningstype
|
title: Rotation baseret på bygningstype
|
||||||
@ -767,7 +767,7 @@ settings:
|
|||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Kompakt Bygningsinfo
|
title: Kompakt Bygningsinfo
|
||||||
description: >-
|
description: >-
|
||||||
Forkorter infobokse til bygninger ved kun at vise deres ratioer. Ellers er en beskrivelse og et billede også vist.
|
Forkorter infobokse til bygninger ved kun at vise deres forhold. Ellers er en beskrivelse og et billede også vist.
|
||||||
|
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Slå klip/slet advarsler fra
|
title: Slå klip/slet advarsler fra
|
||||||
@ -777,7 +777,7 @@ settings:
|
|||||||
keybindings:
|
keybindings:
|
||||||
title: Keybindings
|
title: Keybindings
|
||||||
hint: >-
|
hint: >-
|
||||||
Tip: Husk at bruge CTRL, SHIFT og ALT! De byder på forskellige placeringsmuligheder.
|
Tip: Husk at bruge CTRL, SKIFT og ALT! De byder på forskellige placeringsmuligheder.
|
||||||
|
|
||||||
resetKeybindings: Nulstil Keybindings
|
resetKeybindings: Nulstil Keybindings
|
||||||
|
|
||||||
@ -840,7 +840,7 @@ keybindings:
|
|||||||
massSelectCopy: Kopier område
|
massSelectCopy: Kopier område
|
||||||
massSelectCut: Klip område
|
massSelectCut: Klip område
|
||||||
|
|
||||||
placementDisableAutoOrientation: Slå automatisk orientering fra
|
placementDisableAutoOrientation: Slå automatisk rotation fra
|
||||||
placeMultiple: Bliv i placeringstilstand
|
placeMultiple: Bliv i placeringstilstand
|
||||||
placeInverse: Spejlvend automatisk bælteorientering
|
placeInverse: Spejlvend automatisk bælteorientering
|
||||||
menuClose: Luk Menu
|
menuClose: Luk Menu
|
||||||
@ -850,7 +850,7 @@ keybindings:
|
|||||||
about:
|
about:
|
||||||
title: Om dette spil
|
title: Om dette spil
|
||||||
body: >-
|
body: >-
|
||||||
Dette spil er open source og er udviklet af <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (dette er mig).<br><br>
|
Dette spil er open source og er udviklet af <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (det er mig).<br><br>
|
||||||
|
|
||||||
Hvis du vil kontribuere, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
Hvis du vil kontribuere, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
||||||
|
|
||||||
|
@ -303,7 +303,7 @@ ingame:
|
|||||||
green: Grün
|
green: Grün
|
||||||
blue: Blau
|
blue: Blau
|
||||||
yellow: Gelb
|
yellow: Gelb
|
||||||
purple: Violett
|
purple: Magenta
|
||||||
cyan: Cyan
|
cyan: Cyan
|
||||||
white: Weiß
|
white: Weiß
|
||||||
black: Schwarz
|
black: Schwarz
|
||||||
@ -400,7 +400,7 @@ ingame:
|
|||||||
waypoints:
|
waypoints:
|
||||||
waypoints: Markierungen
|
waypoints: Markierungen
|
||||||
hub: Hub
|
hub: Hub
|
||||||
description: Linksklick auf einen Marker, um dort hinzugelangen, Rechtsklick, um ihn zu löschen.<br><br>Drücke <keybinding> um einen Marker aus deinem Blickwinkel, oder <strong>rechtsklicke</strong>, um einen Marker auf der ausgewählten Position zu erschaffen.
|
description: Linksklick auf einen Marker, um dort hinzugelangen. Rechtsklick, um ihn zu löschen.<br><br>Drücke <keybinding>, um einen Marker aus deinem Blickwinkel, oder <strong>rechtsklicke</strong>, um einen Marker auf der ausgewählten Position zu erschaffen.
|
||||||
creationSuccessNotification: Marker wurde erstellt.
|
creationSuccessNotification: Marker wurde erstellt.
|
||||||
|
|
||||||
# Shape viewer
|
# Shape viewer
|
||||||
@ -413,12 +413,12 @@ ingame:
|
|||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
title: Tutorial
|
title: Tutorial
|
||||||
hints:
|
hints:
|
||||||
1_1_extractor: Platziere einen <strong>Extrahierer</strong> auf der <strong>Kreisform</strong> um sie zu extrahieren!
|
1_1_extractor: Platziere einen <strong>Extrahierer</strong> auf der <strong>Kreisform</strong>, um sie zu extrahieren!
|
||||||
1_2_conveyor: >-
|
1_2_conveyor: >-
|
||||||
Verbinde den Extrahierer mit einem <strong>Förderband</strong> und schließe ihn am Hub an!<br><br>Tipp: <strong>Drück und ziehe</strong> das Förderband mit der Maus!
|
Verbinde den Extrahierer mit einem <strong>Förderband</strong> und schließe ihn am Hub an!<br><br>Tipp: <strong>Drücke und ziehe</strong> das Förderband mit der Maus!
|
||||||
|
|
||||||
1_3_expand: >-
|
1_3_expand: >-
|
||||||
Dies ist <strong>KEIN</strong> Idle-Game! Baue mehr Extrahierer und Förderbänder, um das Ziel schneller zu erreichen.<br><br>Tipp: Halte <strong>UMSCH</strong>, um mehrere Gebäude zu platzieren und nutze <strong>R</strong> um sie zu rotieren.
|
Dies ist <strong>KEIN</strong> Idle-Game! Baue mehr Extrahierer und Förderbänder, um das Ziel schneller zu erreichen.<br><br>Tipp: Halte <strong>UMSCH</strong>, um mehrere Gebäude zu platzieren und nutze <strong>R</strong>, um sie zu rotieren.
|
||||||
|
|
||||||
# All shop upgrades
|
# All shop upgrades
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
@ -446,17 +446,17 @@ buildings:
|
|||||||
belt:
|
belt:
|
||||||
default:
|
default:
|
||||||
name: &belt Förderband
|
name: &belt Förderband
|
||||||
description: Transportiert Items. Halte und ziehe um mehrere zu platzieren.
|
description: Transportiert Items. Halte und ziehe, um mehrere zu platzieren.
|
||||||
|
|
||||||
# Internal name for the Extractor
|
# Internal name for the Extractor
|
||||||
miner:
|
miner:
|
||||||
default:
|
default:
|
||||||
name: &miner Extrahierer
|
name: &miner Extrahierer
|
||||||
description: Platziere ihn auf einer Form oder Farbe um sie zu extrahieren.
|
description: Platziere ihn auf einer Form oder Farbe, um sie zu extrahieren.
|
||||||
|
|
||||||
chainable:
|
chainable:
|
||||||
name: Extrahierer (Kette)
|
name: Extrahierer (Kette)
|
||||||
description: Platziere ihn auf einer Form oder Farbe um sie zu extrahieren. Kann verkettet werden.
|
description: Platziere ihn auf einer Form oder Farbe, um sie zu extrahieren. Kann verkettet werden.
|
||||||
|
|
||||||
# Internal name for the Tunnel
|
# Internal name for the Tunnel
|
||||||
underground_belt:
|
underground_belt:
|
||||||
@ -472,15 +472,15 @@ buildings:
|
|||||||
splitter:
|
splitter:
|
||||||
default:
|
default:
|
||||||
name: &splitter Verteiler
|
name: &splitter Verteiler
|
||||||
description: Multifunktional - Verteilt gleichmäßig vom Eingang auf den Ausgang.
|
description: Multifunktional - Verteilt gleichmäßig von den Eingängen auf die Ausgänge.
|
||||||
|
|
||||||
compact:
|
compact:
|
||||||
name: Kombinierer (Kompakt)
|
name: Kombinierer (Kompakt)
|
||||||
description: Vereint zwei Förderbänder zu einem.
|
description: Vereint zwei Eingänge zu einem Ausgang.
|
||||||
|
|
||||||
compact-inverse:
|
compact-inverse:
|
||||||
name: Kombinierer (Kompakt)
|
name: Kombinierer (Kompakt)
|
||||||
description: Vereint zwei Förderbänder zu einem.
|
description: Vereint zwei Eingänge zu einem Ausgang.
|
||||||
|
|
||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
@ -521,12 +521,12 @@ buildings:
|
|||||||
description: *painter_desc
|
description: *painter_desc
|
||||||
|
|
||||||
double:
|
double:
|
||||||
name: Färber (2-Fach)
|
name: Färber (2-fach)
|
||||||
description: Färbt beide 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:
|
quad:
|
||||||
name: Färber (4-Fach)
|
name: Färber (4-fach)
|
||||||
description: Erlaubt jedes einzelne Viertel einer Form beliebig einzufärben.
|
description: Erlaubt es, jedes einzelne Viertel einer Form beliebig einzufärben.
|
||||||
|
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
@ -535,7 +535,7 @@ buildings:
|
|||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Lager
|
name: Lager
|
||||||
description: Lagert den Überschuss bis zu einer gegebenen Kapazität. Kann als Überlauftor agieren.
|
description: Lagert Items bis zu einer gegebenen Kapazität und verwaltet den Überlauf.
|
||||||
|
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
@ -563,24 +563,24 @@ storyRewards:
|
|||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Formen zerschneiden
|
title: Formen zerschneiden
|
||||||
desc: Du hast den <strong>Schneider</strong> freigeschaltet! - Er zerschneidet Formen von <strong>oben nach unten</strong>, unabhängig von ihrer Orientierung!<br><br>Stelle sicher, dass du den Abfall loswirst, sonst <strong>verstopft die Maschine</strong>! - Dafür habe ich dir extra einen Mülleimer freigeschaltet.
|
desc: Du hast den <strong>Schneider</strong> freigeschaltet! Er zerschneidet Formen von <strong>oben nach unten</strong>, unabhängig von ihrer Orientierung.<br><br>Stelle sicher, dass du den Abfall loswirst, sonst <strong>verstopft die Maschine</strong>! Dafür habe ich dir extra einen Mülleimer freigeschaltet.
|
||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotieren
|
title: Rotieren
|
||||||
desc: Der <strong>Rotierer</strong> wurde freigeschaltet! Er rotiert Formen im Uhrzeigersinn um 90 Grad!
|
desc: Der <strong>Rotierer</strong> wurde freigeschaltet! Er rotiert Formen im Uhrzeigersinn um 90 Grad.
|
||||||
|
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Färben
|
title: Färben
|
||||||
desc: >-
|
desc: >-
|
||||||
Der <strong>Färber</strong> wurde freigeschaltet. Extrahiere ein paar Farben (genauso wie bei Formen) und färbe damit eine Form im Färber!<br><br>PS: Falls du Farbenblind bist, es gibt einen <strong>Modus für Farbenblinde</strong> in den Einstellungen!
|
Der <strong>Färber</strong> wurde freigeschaltet. Extrahiere ein paar Farben (genauso wie bei Formen) und färbe damit eine Form im Färber.<br><br>PS: Falls du Farbenblind bist, gibt es einen <strong>Modus für Farbenblinde</strong> in den Einstellungen!
|
||||||
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Farben mischen
|
title: Farben mischen
|
||||||
desc: Der <strong>Farbmischer</strong> wurde freigeschaltet! Kombiniere mit diesem Gebäude zwei Farben getreu der <strong>additiven Farbmischung</strong>!
|
desc: Der <strong>Farbmischer</strong> wurde freigeschaltet! Kombiniere mit diesem Gebäude zwei Farben getreu der <strong>additiven Farbmischung</strong>.
|
||||||
|
|
||||||
reward_stacker:
|
reward_stacker:
|
||||||
title: Stapler
|
title: Stapler
|
||||||
desc: Mit dem <strong>Stapler</strong> kannst du nun Formen kombinieren! Passen sie nebeneinander, werden sie <strong>verschmolzen</strong>. Anderenfalls wird die rechte auf die linke Form <strong>gestapelt</strong>!
|
desc: Mit dem <strong>Stapler</strong> kannst du nun Formen kombinieren! Passen sie nebeneinander, werden sie <strong>verschmolzen</strong>. Anderenfalls wird die rechte auf die linke Form <strong>gestapelt</strong>.
|
||||||
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Verteiler/Kombinierer
|
title: Verteiler/Kombinierer
|
||||||
@ -588,11 +588,11 @@ storyRewards:
|
|||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunnel
|
title: Tunnel
|
||||||
desc: Der <strong>Tunnel</strong> wurde freigeschaltet! Du kannst Items nun unter Gebäuden oder Förderbändern hindurchleiten!
|
desc: Der <strong>Tunnel</strong> wurde freigeschaltet! Du kannst Items nun unter Gebäuden oder Förderbändern hindurchleiten.
|
||||||
|
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: Gegen UZS Rotieren
|
title: Gegen UZS Rotieren
|
||||||
desc: Du hast eine zweite Variante des <strong>Rotierers</strong> freigeschaltet! Damit können Items gegen den Uhrzeigensinn gedreht werden. Wähle den Rotierer aus und <strong>drücke 'T', um auf verschiedene Varianten zuzugreifen</strong>!
|
desc: Du hast eine zweite Variante des <strong>Rotierers</strong> freigeschaltet! Damit können Items gegen den Uhrzeigensinn gedreht werden. Wähle den Rotierer aus und <strong>drücke 'T', um auf verschiedene Varianten zuzugreifen</strong>.
|
||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Extrahierer (Kette)
|
title: Extrahierer (Kette)
|
||||||
@ -600,28 +600,28 @@ storyRewards:
|
|||||||
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunnel Stufe II
|
title: Tunnel Stufe II
|
||||||
desc: Du hast eine neue Variante des <strong>Tunnels</strong> freigeschaltet! Dieser hat eine <strong>höhere Reichweite</strong> und du kannst beide Tunnel miteinander mischen!
|
desc: Du hast eine neue Variante des <strong>Tunnels</strong> freigeschaltet! Dieser hat eine <strong>höhere Reichweite</strong> und du kannst beide Tunnel miteinander mischen.
|
||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Kompakter Kombinierer
|
title: Kompakter Kombinierer
|
||||||
desc: >-
|
desc: >-
|
||||||
Du hast eine kompakte Variante des <strong>Kombinierers</strong> freigeschaltet! Er hat zwei Eingänge und gibt zwei Förderbänder als eines aus!
|
Du hast eine kompakte Variante des <strong>Kombinierers</strong> freigeschaltet! Er hat zwei Eingänge und vereint diese zu einem Ausgang.
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Schneider (4-fach)
|
title: Schneider (4-fach)
|
||||||
desc: Du hast eine neue Variante des <strong>Schneiders</strong> freigeschaltet! Damit kannst du Formen in alle <strong>vier Teile</strong> zerschneiden!
|
desc: Du hast eine neue Variante des <strong>Schneiders</strong> freigeschaltet! Damit kannst du Formen in alle <strong>vier Teile</strong> zerschneiden.
|
||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Färber (2-fach)
|
title: Färber (2-fach)
|
||||||
desc: Du hast eine neue Variante des <strong>Färbers</strong> freigeschaltet! Hiermit kannst du <strong>zwei Formen auf einmal</strong> färben und verbrauchst nur eine Farbe!
|
desc: Du hast eine neue Variante des <strong>Färbers</strong> freigeschaltet! Hiermit kannst du <strong>zwei Formen auf einmal</strong> färben und verbrauchst nur eine Farbe.
|
||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Färber (4-fach)
|
title: Färber (4-fach)
|
||||||
desc: Du hast eine neue Variante des <strong>Färbers</strong> freigeschaltet! Er kann jedes Viertel einer Form einzeln färben, verbraucht aber auch jeweils eine Farbe!
|
desc: Du hast eine neue Variante des <strong>Färbers</strong> freigeschaltet! Er kann jedes Viertel einer Form einzeln färben, verbraucht aber auch jeweils eine Farbe.
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Zwischenlager
|
title: Zwischenlager
|
||||||
desc: Du hast eine neue Variante des <strong>Mülleimers</strong> freigeschaltet! Bis zu einer gewissen Kapazität können hier Items zwischengelagert werden!
|
desc: Du hast eine neue Variante des <strong>Mülleimers</strong> freigeschaltet! Bis zu einer gewissen Kapazität können hier Items zwischengelagert werden.
|
||||||
|
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Freies Spiel
|
title: Freies Spiel
|
||||||
@ -635,7 +635,7 @@ storyRewards:
|
|||||||
no_reward:
|
no_reward:
|
||||||
title: Nächstes Level
|
title: Nächstes Level
|
||||||
desc: >-
|
desc: >-
|
||||||
Dieses Level hat dir keine Belohnung gegeben, aber dafür das Nächste schon! <br><br> PS: Denk daran, deine alten Fabriken nicht zu zerstören - Du wirst sie später <strong>alle</strong> noch brauchen, um <strong>Upgrades freizuschalten</strong>!
|
Dieses Level hat dir keine Belohnung gegeben, aber dafür das Nächste schon! <br><br> PS: Denke daran, deine alten Fabriken nicht zu zerstören - Du wirst sie später <strong>alle</strong> noch brauchen, um <strong>Upgrades freizuschalten</strong>!
|
||||||
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Nächstes Level
|
title: Nächstes Level
|
||||||
@ -721,22 +721,22 @@ settings:
|
|||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: Geräusche stummschalten
|
title: Geräusche stummschalten
|
||||||
description: >-
|
description: >-
|
||||||
Bei der Aktivierung werden alle Geräusche stummgeschaltet.
|
Bei Aktivierung werden alle Geräusche stummgeschaltet.
|
||||||
|
|
||||||
musicMuted:
|
musicMuted:
|
||||||
title: Musik stummschalten
|
title: Musik stummschalten
|
||||||
description: >-
|
description: >-
|
||||||
Bei der Aktivierung wird die Musik stummgeschaltet.
|
Bei Aktivierung wird die Musik stummgeschaltet.
|
||||||
|
|
||||||
soundVolume:
|
soundVolume:
|
||||||
title: Geräuschlautstärke
|
title: Geräuschlautstärke
|
||||||
description: >-
|
description: >-
|
||||||
Ändert die Lautstärke von Geräuschen.
|
Regler für die Lautstärke von Geräuschen.
|
||||||
|
|
||||||
musicVolume:
|
musicVolume:
|
||||||
title: Musiklautstärke
|
title: Musiklautstärke
|
||||||
description: >-
|
description: >-
|
||||||
Ändert die Lautstärke der Musik.
|
Regler für die Lautstärke der Musik.
|
||||||
|
|
||||||
theme:
|
theme:
|
||||||
title: Farbmodus
|
title: Farbmodus
|
||||||
@ -749,12 +749,12 @@ settings:
|
|||||||
refreshRate:
|
refreshRate:
|
||||||
title: Tickrate
|
title: Tickrate
|
||||||
description: >-
|
description: >-
|
||||||
Das Spiel passt die Tickrate automatisch so an, dass sie immer zwischen diesem Wert und der hälfte bleibt. Zum Beispiel bei einer Tickrate von 60 Hz versucht das Spiel, diese zu halten. Falls dies zu viel ist, regelt der Computer diese runter bis zu einer Untergrenze von 30Hz.
|
Das Spiel passt die Tickrate automatisch so an, dass sie immer zwischen diesem Wert und der Hälfte bleibt. Zum Beispiel bei einer Tickrate von 60 Hz versucht das Spiel, diese zu halten. Bei Bedarf regelt der Computer diese bis zu einer Untergrenze von 30 Hz herunter.
|
||||||
|
|
||||||
alwaysMultiplace:
|
alwaysMultiplace:
|
||||||
title: Mehrfachplatzierung
|
title: Mehrfachplatzierung
|
||||||
description: >-
|
description: >-
|
||||||
Bei Aktivierung wird das platzierte Gebäude nicht abgewählt. Das hat den gleichen Effekt wie beim Platzieren UMSCH gedrückt zu halten.
|
Bei Aktivierung wird das platzierte Gebäude nicht abgewählt. Das hat den gleichen Effekt, wie beim Platzieren UMSCH gedrückt zu halten.
|
||||||
|
|
||||||
offerHints:
|
offerHints:
|
||||||
title: Hinweise & Tutorials
|
title: Hinweise & Tutorials
|
||||||
@ -793,7 +793,7 @@ keybindings:
|
|||||||
hint: >-
|
hint: >-
|
||||||
Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen.
|
Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen.
|
||||||
|
|
||||||
resetKeybindings: Tastenbelegung zurücksetzen.
|
resetKeybindings: Tastenbelegung zurücksetzen
|
||||||
|
|
||||||
categoryLabels:
|
categoryLabels:
|
||||||
general: Anwendung
|
general: Anwendung
|
||||||
@ -844,13 +844,13 @@ keybindings:
|
|||||||
rotateWhilePlacing: Rotieren
|
rotateWhilePlacing: Rotieren
|
||||||
rotateInverseModifier: >-
|
rotateInverseModifier: >-
|
||||||
Modifikator: stattdessen gegen den UZS rotieren
|
Modifikator: stattdessen gegen den UZS rotieren
|
||||||
cycleBuildingVariants: Variante wählen
|
cycleBuildingVariants: Nächste Variante auswählen
|
||||||
confirmMassDelete: Massenlöschung bestätigen
|
confirmMassDelete: Massenlöschung bestätigen
|
||||||
pasteLastBlueprint: Letzte Blaupause einfügen
|
pasteLastBlueprint: Letzte Blaupause einfügen
|
||||||
cycleBuildings: Gebäude rotieren
|
cycleBuildings: Nächstes Gebäude auswählen
|
||||||
lockBeltDirection: Bandplaner aktivieren
|
lockBeltDirection: Bandplaner aktivieren
|
||||||
switchDirectionLockSide: >-
|
switchDirectionLockSide: >-
|
||||||
Planer: Seite wechseln
|
Bandplaner: Seite wechseln
|
||||||
|
|
||||||
massSelectStart: Halten und ziehen zum Beginnen
|
massSelectStart: Halten und ziehen zum Beginnen
|
||||||
massSelectSelectMultiple: Mehrere Areale markieren
|
massSelectSelectMultiple: Mehrere Areale markieren
|
||||||
|
@ -596,7 +596,7 @@ buildings:
|
|||||||
default:
|
default:
|
||||||
name: &filter Filter
|
name: &filter Filter
|
||||||
# TEMP
|
# TEMP
|
||||||
description: Only leaves through items who match exactly the provided shape / color. If you put in a boolean 1, it leaves everything through, if you put in a 0 it will leave nothing through.
|
description: Only allows through items which match exactly the provided shape / color. If you put in a boolean 1, it allows everything through, if you put in a 0 it will allow nothing through.
|
||||||
|
|
||||||
display:
|
display:
|
||||||
default:
|
default:
|
||||||
@ -728,6 +728,8 @@ settings:
|
|||||||
prod: Production
|
prod: Production
|
||||||
buildDate: Built <at-date>
|
buildDate: Built <at-date>
|
||||||
|
|
||||||
|
rangeSliderPercentage: <amount> %
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
uiScale:
|
uiScale:
|
||||||
title: Interface scale
|
title: Interface scale
|
||||||
@ -885,6 +887,11 @@ settings:
|
|||||||
description: >-
|
description: >-
|
||||||
The game is divided into chunks of 16x16 tiles, if this setting is enabled the borders of each chunk are displayed.
|
The game is divided into chunks of 16x16 tiles, if this setting is enabled the borders of each chunk are displayed.
|
||||||
|
|
||||||
|
pickMinerOnPatch:
|
||||||
|
title: Pick miner on resource patch
|
||||||
|
description: >-
|
||||||
|
Enabled by default, selects the miner if you use the pipette when hovering a resource patch.
|
||||||
|
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Keybindings
|
title: Keybindings
|
||||||
hint: >-
|
hint: >-
|
||||||
|
@ -638,6 +638,7 @@ settings:
|
|||||||
general: Général
|
general: Général
|
||||||
userInterface: Interface Utilisateur
|
userInterface: Interface Utilisateur
|
||||||
advanced: Avancé
|
advanced: Avancé
|
||||||
|
performance: Performance
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Développement
|
dev: Développement
|
||||||
@ -722,11 +723,13 @@ settings:
|
|||||||
fast: Rapide
|
fast: Rapide
|
||||||
super_fast: Très rapide
|
super_fast: Très rapide
|
||||||
extremely_fast: Extrêmement rapide
|
extremely_fast: Extrêmement rapide
|
||||||
|
|
||||||
enableTunnelSmartplace:
|
enableTunnelSmartplace:
|
||||||
title: Tunnels intelligents
|
title: Tunnels intelligents
|
||||||
description: >-
|
description: >-
|
||||||
Si cette option est sélectionnée, placer des tunnels effacera automatiquement les convoyeurs inutiles.
|
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.
|
Cela permet aussi d'étirer les tunnels et les tunnels en surnombre seront effacés.
|
||||||
|
|
||||||
vignette:
|
vignette:
|
||||||
title: Effet de vignette
|
title: Effet de vignette
|
||||||
description: >-
|
description: >-
|
||||||
@ -743,10 +746,12 @@ settings:
|
|||||||
ten_minutes: 10 Minutes
|
ten_minutes: 10 Minutes
|
||||||
twenty_minutes: 20 Minutes
|
twenty_minutes: 20 Minutes
|
||||||
disabled: Désactivé
|
disabled: Désactivé
|
||||||
|
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Informations réduites sur les bâtiments
|
title: Informations réduites sur les bâtiments
|
||||||
description: >-
|
description: >-
|
||||||
Raccourcit les panneaux d'information sur les bâtiments en n'affichant que les ratios. Dans le cas contraire, une description et une imagine sont présentés.
|
Raccourcit les panneaux d'information sur les bâtiments en n'affichant que les ratios. Dans le cas contraire, une description et une imagine sont présentés.
|
||||||
|
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Désactive les avertissement pour Couper/Effacer
|
title: Désactive les avertissement pour Couper/Effacer
|
||||||
description: >-
|
description: >-
|
||||||
@ -755,12 +760,39 @@ settings:
|
|||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Mode Daltonien
|
title: Mode Daltonien
|
||||||
description: Active divers outils qui permettent de jouer à ce jeu si vous êtes daltonien.
|
description: Active divers outils qui permettent de jouer à ce jeu si vous êtes daltonien.
|
||||||
|
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Rotation par catégorie de bâtiment
|
title: Rotation par catégorie de bâtiment
|
||||||
description: >-
|
description: >-
|
||||||
Chaque catégorie de bâtiment enregistre le sens de rotation que vous lui avez assigné la dernière fois, de manière individuelle.
|
Chaque catégorie de bâtiment enregistre le sens de rotation que vous lui avez assigné la dernière fois, de manière individuelle.
|
||||||
Cela sera sans doute plus confortable si vous alternez fréquemment entre le placement de différents types de bâtiments.
|
Cela sera sans doute plus confortable si vous alternez fréquemment entre le placement de différents types de bâtiments.
|
||||||
|
|
||||||
|
lowQualityMapResources:
|
||||||
|
title: Ressources de la carte de plus basse qualité
|
||||||
|
description: >-
|
||||||
|
Simplifie le rendu des ressources sur la carte lorsqu'elle est zoomée opur améliorer les performances.
|
||||||
|
C'est encore plus clean, n'oubliez pas d'essayer !
|
||||||
|
|
||||||
|
disableTileGrid:
|
||||||
|
title: Desactiver la grille de placement
|
||||||
|
description: >-
|
||||||
|
Desactiver la grille de placement peut aider les performances. Ça rend aussi le jeu encore plus uni!
|
||||||
|
|
||||||
|
clearCursorOnDeleteWhilePlacing:
|
||||||
|
title: Effacer le curseur avec clic droit
|
||||||
|
description: >-
|
||||||
|
Activé par défaut, efface le curseur lorsque vous faites un clic droit en ayant un bâtiment selectioné pour la constructio. Si desactivé, vous pouvez detruire les bâtiments en faisant un clic droit tout en placant un bâtiment.
|
||||||
|
|
||||||
|
lowQualityTextures:
|
||||||
|
title: Textures de basse résolution (Moche)
|
||||||
|
description: >-
|
||||||
|
Utilise des textures de basse qualité pour augmenter les performances. Cela va rendre le jeu moche!
|
||||||
|
|
||||||
|
displayChunkBorders:
|
||||||
|
title: Monter les bordures de chunks
|
||||||
|
description: >-
|
||||||
|
Le jeu est divisé en parties de 16x16 cases, si ce réglage est activé, les bordures de chaque partie sont affichées.
|
||||||
|
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Contrôles
|
title: Contrôles
|
||||||
hint: >-
|
hint: >-
|
||||||
@ -868,6 +900,4 @@ demo:
|
|||||||
# French translation version v0.5 based on english v1.1.8 by Didier WEERTS 'The Corsaire'
|
# French translation version v0.5 based on english v1.1.8 by Didier WEERTS 'The Corsaire'
|
||||||
#
|
#
|
||||||
|
|
||||||
# French translation completed (and corrected) by Pascal Grossé and Withers001
|
# French translation completed (and corrected) by Pascal Grossé, martypiton and Withers001.
|
||||||
|
|
||||||
# French translation entirely completed and corrected by martypiton
|
|
||||||
|
@ -31,75 +31,76 @@ steamPage:
|
|||||||
longText: >-
|
longText: >-
|
||||||
[img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img]
|
[img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img]
|
||||||
|
|
||||||
shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
|
In shapez.io potrai costruire delle fabbriche per automatizzare la creazione e la combinazione di forme sempre più complesse, in una mappa infinita.
|
||||||
Upon delivering the requested shapes you will progress within the game and unlock upgrades to speed up your factory.
|
|
||||||
|
|
||||||
As the demand for shapes increases, you will have to scale up your factory to meet the demand - Don't forget about resources though, you will have to expand across the [b]infinite map[/b]!
|
Una volta che avrai consegnato le forme richieste, progredirai nel gioco e sbloccherai dei miglioramenti per rendere la tua fabbrica più veloce.
|
||||||
|
|
||||||
Soon you will have to mix colors and paint your shapes with them - Combine red, green and blue color resources to produce different colors and paint shapes with it to satisfy the demand.
|
Per rispondere alla crescente richiesta di forme, dovrai ingrandire la tua fabbrica - Non dimenticarti delle risorse, però; dovrai espanderti attraverso la [b]mappa infinita[/b]!
|
||||||
|
|
||||||
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!
|
Presto dovrai mescolare colori e usarli per verniciare le tue forme - Combina le risorse dei colori rosso, verde e blu per produrre colori differenti, verniciare le forme con essi e soddisfare la richiesta.
|
||||||
|
|
||||||
Purchasing the game gives you access to the standalone version which has additional features and you'll also receive access to newly developed features.
|
Nel gioco sono presenti 18 livelli progressivi (Che già dovrebbero tenerti occupato per ore) Ma sto costantemente aggiungendo nuovi contenuti - C'è molto in programma!
|
||||||
|
|
||||||
[b]Standalone Advantages[/b]
|
Acquistare il gioco ti darà accesso alla versione standalone, con caratteristiche aggiuntive e l'accesso ai nuovi contenuti sviluppati.
|
||||||
|
|
||||||
|
[b]Vantaggi della versione completa[/b]
|
||||||
|
|
||||||
[list]
|
[list]
|
||||||
[*] Dark Mode
|
[*] Modalità scura
|
||||||
[*] Unlimited Waypoints
|
[*] Segnapunti illimitati
|
||||||
[*] Unlimited Savegames
|
[*] Salvataggi illimitati
|
||||||
[*] Additional settings
|
[*] Opzioni aggiuntive
|
||||||
[*] Coming soon: Wires & Energy! Aiming for (roughly) end of July 2020.
|
[*] In arrivo: Cavi ed energia! Previsti (approssimativamente) per la fine di Luglio 2020.
|
||||||
[*] Coming soon: More Levels
|
[*] Coming soon: Più livelli
|
||||||
[*] Allows me to further develop shapez.io ❤️
|
[*] Mi consente di svillupare ulteriormente shapez.io ❤️
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
[b]Future Updates[/b]
|
[b]Aggiornamenti futuri[/b]
|
||||||
|
|
||||||
I am updating the game very often and trying to push an update at least every week!
|
Sto aggiornando il gioco molto di frequente e cerco di pubblicare un nuovo aggiornamento almeno una volta a settimana.
|
||||||
|
|
||||||
[list]
|
[list]
|
||||||
[*] Different maps and challenges (e.g. maps with obstacles)
|
[*] Mappe diverse e sfide (ad esempio mappe con ostacoli)
|
||||||
[*] Puzzles (Deliver the requested shape with a restricted area / set of buildings)
|
[*] Rompicapi (Consegna la forma richiesta utilizzando un'area limitata o un insieme ristretto di edifici)
|
||||||
[*] A story mode where buildings have a cost
|
[*] Una modalità storia in cui gli edifici hanno un costo.
|
||||||
[*] Configurable map generator (Configure resource/shape size/density, seed and more)
|
[*] Generatore della mappa configurabile (Configura dimensione e densità delle forme/risorse, seed e altro)
|
||||||
[*] Additional types of shapes
|
[*] Tipi di forma aggiuntivi.
|
||||||
[*] Performance improvements (The game already runs pretty well!)
|
[*] Miglioramenti delle prestazioni (Il gioco funziona già piuttosto bene!)
|
||||||
[*] And much more!
|
[*] E molto altro!
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
[b]This game is open source![/b]
|
[b]Questo gioco è open source![/b]
|
||||||
|
|
||||||
Anybody can contribute, I'm actively involved in the community and attempt to review all suggestions and take feedback into consideration where possible.
|
Chiunque può contribuire, interagisco attivamente con la community, cerco leggere tutti i suggerimenti e tengo in considerazione i feedback quando possibile.
|
||||||
Be sure to check out my trello board for the full roadmap!
|
Visita la mia pagina su trello per la tabella di marcia completa!
|
||||||
|
|
||||||
[b]Links[/b]
|
[b]Links[/b]
|
||||||
|
|
||||||
[list]
|
[list]
|
||||||
[*] [url=https://discord.com/invite/HN7EVzV]Official Discord[/url]
|
[*] [url=https://discord.com/invite/HN7EVzV]Server ufficiale Discord[/url]
|
||||||
[*] [url=https://trello.com/b/ISQncpJP/shapezio]Roadmap[/url]
|
[*] [url=https://trello.com/b/ISQncpJP/shapezio]Tabella di marcia[/url]
|
||||||
[*] [url=https://www.reddit.com/r/shapezio]Subreddit[/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]Codice sorgente(GitHub)[/url]
|
||||||
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Help translate[/url]
|
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Aiuto per le traduzioni[/url]
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
discordLink: Official Discord - Chat with me!
|
discordLink: Server ufficiale Discord - Chatta con me!
|
||||||
|
|
||||||
global:
|
global:
|
||||||
loading: Caricamento
|
loading: Caricamento
|
||||||
error: Errore
|
error: Errore
|
||||||
|
|
||||||
# How big numbers are rendered, e.g. "10,000"
|
# How big numbers are rendered, e.g. "10,000"
|
||||||
thousandsDivider: ","
|
thousandsDivider: "'"
|
||||||
|
|
||||||
# What symbol to use to separate the integer part from the fractional part of a number, e.g. "0.4"
|
# What symbol to use to separate 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.
|
# The suffix for large numbers, e.g. 1.3k, 400.2M, etc.
|
||||||
suffix:
|
suffix:
|
||||||
thousands: k
|
thousands: k
|
||||||
millions: M
|
millions: M
|
||||||
billions: B
|
billions: G
|
||||||
trillions: T
|
trillions: T
|
||||||
|
|
||||||
# Shown for infinitely big numbers
|
# Shown for infinitely big numbers
|
||||||
@ -135,7 +136,7 @@ demoBanners:
|
|||||||
# This is the "advertisement" shown in the main menu and other various places
|
# This is the "advertisement" shown in the main menu and other various places
|
||||||
title: Versione Demo
|
title: Versione Demo
|
||||||
intro: >-
|
intro: >-
|
||||||
Ottieni la versione standalone per sbloccare tutte le funzioni!
|
Ottieni la versione completa per sbloccare tutte le funzioni!
|
||||||
|
|
||||||
mainMenu:
|
mainMenu:
|
||||||
play: Play
|
play: Play
|
||||||
@ -147,7 +148,7 @@ mainMenu:
|
|||||||
|
|
||||||
# This is shown when using firefox and other browsers which are not supported.
|
# This is shown when using firefox and other browsers which are not supported.
|
||||||
browserWarning: >-
|
browserWarning: >-
|
||||||
Ci spiace, ma il gioco è molto lento su questo browser! Ottieni la versione standalone oppure scarica Chrome per provare l'esperienza completa.
|
Ci spiace, ma il gioco è molto lento su questo browser! Ottieni la versione completa oppure scarica Chrome per l'intera esperienza.
|
||||||
|
|
||||||
savegameLevel: Livello <x>
|
savegameLevel: Livello <x>
|
||||||
savegameLevelUnknown: Livello sconosciuto
|
savegameLevelUnknown: Livello sconosciuto
|
||||||
@ -163,12 +164,12 @@ dialogs:
|
|||||||
delete: Elimina
|
delete: Elimina
|
||||||
cancel: Annulla
|
cancel: Annulla
|
||||||
later: Più tardi
|
later: Più tardi
|
||||||
restart: Ricomincia
|
restart: Riavvia
|
||||||
reset: Reset
|
reset: Reset
|
||||||
getStandalone: Ottieni la versione completa
|
getStandalone: Ottieni la versione completa
|
||||||
deleteGame: So cosa sto facendo
|
deleteGame: So cosa sto facendo
|
||||||
viewUpdate: Mostra aggiornamento
|
viewUpdate: Mostra aggiornamento
|
||||||
showUpgrades: Mostra upgrade
|
showUpgrades: Mostra miglioramenti
|
||||||
showKeybindings: Mostra scorciatoie
|
showKeybindings: Mostra scorciatoie
|
||||||
|
|
||||||
importSavegameError:
|
importSavegameError:
|
||||||
@ -199,42 +200,43 @@ dialogs:
|
|||||||
restartRequired:
|
restartRequired:
|
||||||
title: Restart richiesto
|
title: Restart richiesto
|
||||||
text: >-
|
text: >-
|
||||||
Per applicare le nuove impostazioni è necessario il Restart del gioco.
|
Per applicare le nuove impostazioni è necessario riavviare del gioco.
|
||||||
|
|
||||||
editKeybinding:
|
editKeybinding:
|
||||||
title: Cambia comandi
|
title: Cambia comandi
|
||||||
desc: Premi un nuovo tasto o un tasto del mouse a cui vuoi assegnare questo comando, Esc per cancellarlo.
|
desc: Premi un nuovo tasto o un tasto del mouse a cui vuoi assegnare questo comando, Esc per annullare.
|
||||||
|
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Reset comandi assegnati
|
title: Reset comandi assegnati
|
||||||
desc: Così riporterai tutti comandi al loro stato di default. Perfavore conferma.
|
desc: Così riporterai tutti comandi al loro stato predefinto. Per favore conferma.
|
||||||
|
|
||||||
keybindingsResetOk:
|
keybindingsResetOk:
|
||||||
title: Successo nel reset dei comandi
|
title: Successo nel reset dei comandi
|
||||||
desc: I comandi sono stati riassegnati ai loro rispettivi comandi di default!
|
desc: I comandi predefiniti sono stati ripristinati!
|
||||||
|
|
||||||
featureRestriction:
|
featureRestriction:
|
||||||
title: Versione Demo
|
title: Versione Demo
|
||||||
desc: Hai provato ad accedere ad una feature (<feature>) che non è disponibile nella Demo. Considera di prendere la versione standalne per un'esperienza completa!
|
desc: Hai provato ad accedere ad una caratteristica (<feature>) che non è disponibile nella Demo. Considera di prendere la versione completa per l'intera esperienza!
|
||||||
|
|
||||||
oneSavegameLimit:
|
oneSavegameLimit:
|
||||||
title: Salvataggi limitati
|
title: Salvataggi limitati
|
||||||
desc: Puoi avere solo un salvataggio nella versione Demo. Perfavore rimuovi il salvataggio già esistente o prendi la versione standalone!
|
desc: Puoi avere solo un salvataggio nella versione Demo. Perfavore rimuovi il salvataggio già esistente o prendi la versione completa!
|
||||||
|
|
||||||
updateSummary:
|
updateSummary:
|
||||||
title: Nuovo update!
|
title: Nuovo aggiornamento!
|
||||||
desc: >-
|
desc: >-
|
||||||
Qui puoi trovare i cambiamenti dall'ultima volta che hai giocato:
|
Qui puoi trovare i cambiamenti dall'ultima volta che hai giocato:
|
||||||
|
|
||||||
upgradesIntroduction:
|
upgradesIntroduction:
|
||||||
title: Aggiornamenti sbloccati
|
title: Miglioramenti sbloccati
|
||||||
desc: >-
|
desc: >-
|
||||||
Tutte le forme che produci possono essere utilizzate per i miglioramenti - <strong>Non distruggere le tue vecchie fabbriche!</strong>
|
Tutte le forme che produci possono essere utilizzate per i miglioramenti - <strong>Non distruggere le tue vecchie fabbriche!</strong>
|
||||||
Puoi trovare gli aggiornamenti nell'angolo in alto a destra dello schermo.
|
Puoi trovare i miglioramenti nell'angolo in alto a destra dello schermo.
|
||||||
|
|
||||||
massDeleteConfirm:
|
massDeleteConfirm:
|
||||||
title: Conferma la rimozione
|
title: Conferma la rimozione
|
||||||
desc: >-
|
desc: >-
|
||||||
Stai rimuovendo molte strutture (<count> to be exact)!
|
Stai rimuovendo molte strutture (<count> per essere precisi)!
|
||||||
Sei sicuro di volerlo fare?
|
Sei sicuro di volerlo fare?
|
||||||
|
|
||||||
blueprintsNotUnlocked:
|
blueprintsNotUnlocked:
|
||||||
@ -246,33 +248,33 @@ dialogs:
|
|||||||
title: Comandi utili
|
title: Comandi utili
|
||||||
desc: >-
|
desc: >-
|
||||||
Questo gioco ha molti comandi utili che possono rendere più semplice la costruzione delle fabbriche.
|
Questo gioco ha molti comandi utili che possono rendere più semplice la costruzione delle fabbriche.
|
||||||
Qui ce ne sono un paio, ma sii sicuro <strong>controlla i comandi</strong>!<br><br>
|
Qui ce ne sono un paio, ma dovresti <strong>controllare i comandi</strong>!<br><br>
|
||||||
<code class='keybinding'>CTRL</code> + Drag: Seleziona l'area da copiare / cancella.<br>
|
<code class='keybinding'>CTRL</code> + Drag: Seleziona l'area da copiare / cancella.<br>
|
||||||
<code class='keybinding'>SHIFT</code>: Tieni premuto per costruire copie dalla struttura.<br>
|
<code class='keybinding'>SHIFT</code>: Tieni premuto per costruire copie dell'edificio.<br>
|
||||||
<code class='keybinding'>ALT</code>: Invert l'orientamento dei nastri trasportatori.<br>
|
<code class='keybinding'>ALT</code>: Inverti l'orientamento dei nastri trasportatori.<br>
|
||||||
|
|
||||||
createMarker:
|
createMarker:
|
||||||
title: Nuovo Marker
|
title: Nuovo segnapunto
|
||||||
desc: Dagli un magnifico nome, puoi anche includere <strong>short key</strong> di una figura (Che puoi generare <a href="https://viewer.shapez.io" target="_blank">here</a>)
|
desc: Dagli un nome con un significato, puoi anche includere il <strong>codice</strong> di una figura (Che puoi generare <a href="https://viewer.shapez.io" target="_blank">qui</a>)
|
||||||
titleEdit: Edit Marker
|
titleEdit: Modifica segnapunto
|
||||||
|
|
||||||
markerDemoLimit:
|
markerDemoLimit:
|
||||||
desc: Puoi creare solo due Marker personalizzati nella Demo. Prendi la versione standalone per Marker personalizzati illimitati!
|
desc: Puoi creare solo due segnapunti personalizzati nella Demo. Ottieni la versione completa per avere segnapunti personalizzati illimitati!
|
||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Conferma taglio
|
title: Conferma taglio
|
||||||
desc: >-
|
desc: >-
|
||||||
Stai tagliando molte strutture (<count> to be exact)!
|
Stai tagliando molte strutture (<count> per essere precisi)!
|
||||||
Sei sicuro di volerlo fare?
|
Sei sicuro di volerlo fare?
|
||||||
|
|
||||||
exportScreenshotWarning:
|
exportScreenshotWarning:
|
||||||
title: Esportare screenshot
|
title: Esportare screenshot
|
||||||
desc: >-
|
desc: >-
|
||||||
Hai richiesto di esportare la tua base come screenshot. Perfavore tieni conto che potrebbe
|
Hai richiesto di esportare la tua base come screenshot. Perfavore tieni conto che potrebbe
|
||||||
essere lento per una grossa base e che potrebbe crushare il gioco!
|
essere lento per una grossa base e che potrebbe causare il crash del gioco!
|
||||||
|
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: Confirm cut
|
title: Conferma taglia
|
||||||
desc: You can not afford to paste this area! Are you sure you want to cut it?
|
desc: Non puoi permetterti di incollare quest'area! Sei sicuro di volerla tagliare?
|
||||||
|
|
||||||
ingame:
|
ingame:
|
||||||
# This is shown in the top left corner and displays useful keybindings in
|
# This is shown in the top left corner and displays useful keybindings in
|
||||||
@ -281,23 +283,22 @@ ingame:
|
|||||||
moveMap: Sposta
|
moveMap: Sposta
|
||||||
selectBuildings: Seleziona area
|
selectBuildings: Seleziona area
|
||||||
stopPlacement: Concludi posizionamento
|
stopPlacement: Concludi posizionamento
|
||||||
rotateBuilding: Ruota costruzione
|
rotateBuilding: Ruota edificio
|
||||||
placeMultiple: Posiziona multiplo
|
placeMultiple: Posiziona multiplo
|
||||||
reverseOrientation: Inverti orientamento
|
reverseOrientation: Inverti orientamento
|
||||||
disableAutoOrientation: Disabilita orientamento automatico
|
disableAutoOrientation: Disabilita orientamento automatico
|
||||||
toggleHud: Mostra/Nascondi HUD
|
toggleHud: Mostra/Nascondi HUD
|
||||||
placeBuilding: Posiziona costruzione
|
placeBuilding: Posiziona costruzione
|
||||||
createMarker: Crea etichetta
|
createMarker: Crea etichetta
|
||||||
delete: Distruggi
|
delete: Cancella
|
||||||
pasteLastBlueprint: Paste last blueprint
|
pasteLastBlueprint: Incolla l'ultimo progetto
|
||||||
lockBeltDirection: Enable belt planner
|
lockBeltDirection: Attiva pianificatore nastri
|
||||||
plannerSwitchSide: Flip planner side
|
plannerSwitchSide: Cambia direzione pianificatore
|
||||||
cutSelection: Taglia
|
cutSelection: Taglia
|
||||||
copySelection: Copia
|
copySelection: Copia
|
||||||
clearSelection: Annulla selezione
|
clearSelection: Annulla selezione
|
||||||
pipette: Contagocce
|
pipette: Contagocce
|
||||||
switchLayers: Switch layers
|
switchLayers: Cambia livello
|
||||||
|
|
||||||
# Everything related to placing buildings (I.e. as soon as you selected a building
|
# Everything related to placing buildings (I.e. as soon as you selected a building
|
||||||
# from the toolbar)
|
# from the toolbar)
|
||||||
buildingPlacement:
|
buildingPlacement:
|
||||||
@ -317,47 +318,48 @@ ingame:
|
|||||||
itemsPerSecond: <x> oggetti / s
|
itemsPerSecond: <x> oggetti / s
|
||||||
itemsPerSecondDouble: (x2)
|
itemsPerSecondDouble: (x2)
|
||||||
|
|
||||||
tiles: <x> titles
|
tiles: <x> caselle
|
||||||
|
|
||||||
# The notification when completing a level
|
# The notification when completing a level
|
||||||
levelCompleteNotification:
|
levelCompleteNotification:
|
||||||
# <level> is replaced by the actual level, so this gets 'Level 03' for example.
|
# <level> is replaced by the actual level, so this gets 'Level 03' for example.
|
||||||
levelTitle: Livello <level>
|
levelTitle: Livello <level>
|
||||||
completed: Completato
|
completed: Completato
|
||||||
unlockText: Sbloccato <reward>!
|
unlockText: >-
|
||||||
|
Sbloccato: <reward>!
|
||||||
buttonNextLevel: Prossimo livello
|
buttonNextLevel: Prossimo livello
|
||||||
|
|
||||||
# Notifications on the lower right
|
# Notifications on the lower right
|
||||||
notifications:
|
notifications:
|
||||||
newUpgrade: U nuovo aggiornamento è disponibile!
|
newUpgrade: È disponibile un nuovo aggiornamento!
|
||||||
gameSaved: La tua partita è stata salvata.
|
gameSaved: Partita salvata.
|
||||||
|
|
||||||
# The "Upgrades" window
|
# The "Upgrades" window
|
||||||
shop:
|
shop:
|
||||||
title: Aggiornamenti
|
title: Miglioramenti
|
||||||
buttonUnlock: Sblocca
|
buttonUnlock: Sblocca
|
||||||
|
|
||||||
# Gets replaced to e.g. "Tier IX"
|
# Gets replaced to e.g. "Tier IX"
|
||||||
tier: Tier <x>
|
tier: Grado <x>
|
||||||
|
|
||||||
# The roman number for each tier
|
# The roman number for each tier
|
||||||
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
||||||
|
|
||||||
maximumLevel: LIVELLO MASSIMO (Speed x<currentMult>)
|
maximumLevel: GRADO MASSIMO (Velocità x<currentMult>)
|
||||||
|
|
||||||
# The "Statistics" window
|
# The "Statistics" window
|
||||||
statistics:
|
statistics:
|
||||||
title: Statistiche
|
title: Statistiche
|
||||||
dataSources:
|
dataSources:
|
||||||
stored:
|
stored:
|
||||||
title: Immagazzinati
|
title: Immagazzinate
|
||||||
description: Displaying amount of stored shapes in your central building.
|
description: Mostra il numero di forme immagizzinate nell'edificio centrale.
|
||||||
produced:
|
produced:
|
||||||
title: Prodotti
|
title: Prodotte
|
||||||
description: Displaying all shapes your whole factory produces, including intermediate products.
|
description: Mostra tutte le forme prodotte dalla tua fabbrica, inclusi i prodotti intermedi.
|
||||||
delivered:
|
delivered:
|
||||||
title: Delivered
|
title: Consegnate
|
||||||
description: Displaying shapes which are delivered to your central building.
|
description: Mostra le forme che vengono consegnate all'edificio centrale.
|
||||||
noShapesProduced: No shapes have been produced so far.
|
noShapesProduced: No shapes have been produced so far.
|
||||||
|
|
||||||
# Displays the shapes per minute, e.g. '523 / m'
|
# Displays the shapes per minute, e.g. '523 / m'
|
||||||
@ -367,7 +369,7 @@ ingame:
|
|||||||
settingsMenu:
|
settingsMenu:
|
||||||
playtime: Tempo di gioco
|
playtime: Tempo di gioco
|
||||||
|
|
||||||
buildingsPlaced: Buildings
|
buildingsPlaced: Edifici
|
||||||
beltsPlaced: Nastri
|
beltsPlaced: Nastri
|
||||||
|
|
||||||
buttons:
|
buttons:
|
||||||
@ -387,50 +389,50 @@ ingame:
|
|||||||
|
|
||||||
# Map markers
|
# Map markers
|
||||||
waypoints:
|
waypoints:
|
||||||
waypoints: Markers
|
waypoints: Segnapunti
|
||||||
hub: HUB
|
hub: HUB
|
||||||
description: Left-click a marker to jump to it, right-click to delete it.<br><br>Press <keybinding> to create a marker from the current view, or <strong>right-click</strong> to create a marker at the selected location.
|
description: Click sinistro su un segnapunto per raggiungerlo, click destro per cancellarlo. <br><br>Premi <keybinding> per creare un segnapunto dalla visuale corrente, oppure <strong>click destro</strong> per creare un segnapunto nella posizione selezionata.
|
||||||
creationSuccessNotification: Marker has been created.
|
creationSuccessNotification: Il segnapunto è stato creato.
|
||||||
|
|
||||||
# Interactive tutorial
|
# Interactive tutorial
|
||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
title: Tutorial
|
title: Tutorial
|
||||||
hints:
|
hints:
|
||||||
1_1_extractor: Place an <strong>extractor</strong> on top of a <strong>circle shape</strong> to extract it!
|
1_1_extractor: Posiziona un <strong>estrattore</strong> sopra una <strong>forma circolare</strong> per estrarla!
|
||||||
1_2_conveyor: >-
|
1_2_conveyor: >-
|
||||||
Connect the extractor with a <strong>conveyor belt</strong> to your hub!<br><br>Tip: <strong>Click and drag</strong> the belt with your mouse!
|
Connetti l'estrattore all'Hub centrale utilizzando un <strong>nastro trasportatore</strong>!<br><br>Suggerimento: <strong>Clicca e trascina</strong> il nastro con il mouse!
|
||||||
|
|
||||||
1_3_expand: >-
|
1_3_expand: >-
|
||||||
This is <strong>NOT</strong> an idle game! Build more extractors and belts to finish the goal quicker.<br><br>Tip: Hold <strong>SHIFT</strong> to place multiple extractors, and use <strong>R</strong> to rotate them.
|
Questo <strong>NON</strong> è un idle game! Costruisci più estrattori e nastri per raggiungere l'obiettivo più velocemente.<br><br>Suggerimento: Tieni premuto <strong>MAIUSC</strong> per piazzare estrattori multipli, e usa <strong>R</strong> per ruotarli.
|
||||||
|
|
||||||
colors:
|
colors:
|
||||||
red: Rosso
|
red: Rosso
|
||||||
green: Verde
|
green: Verde
|
||||||
blue: Blu
|
blue: Blu
|
||||||
yellow: Giallo
|
yellow: Giallo
|
||||||
purple: Viola
|
purple: Magenta
|
||||||
cyan: Azzurro
|
cyan: Azzurro
|
||||||
white: Bianco
|
white: Bianco
|
||||||
uncolored: No colore
|
uncolored: No colore
|
||||||
black: Black
|
black: Nero
|
||||||
shapeViewer:
|
shapeViewer:
|
||||||
title: Livelli
|
title: Strati
|
||||||
empty: Vuoto
|
empty: Vuoto
|
||||||
copyKey: Copy Key
|
copyKey: Copia codice
|
||||||
|
|
||||||
# All shop upgrades
|
# All shop upgrades
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Belts, Distributor & Tunnels
|
name: Nastri, distribuzione e tunnel
|
||||||
description: Velocità x<currentMult> → x<newMult>
|
description: Velocità x<currentMult> → x<newMult>
|
||||||
miner:
|
miner:
|
||||||
name: Estrazione
|
name: Estrazione
|
||||||
description: Velocità x<currentMult> → x<newMult>
|
description: Velocità x<currentMult> → x<newMult>
|
||||||
processors:
|
processors:
|
||||||
name: Cutting, Rotating & Stacking
|
name: Taglio, rotazione e impilamento
|
||||||
description: Velocità x<currentMult> → x<newMult>
|
description: Velocità x<currentMult> → x<newMult>
|
||||||
painting:
|
painting:
|
||||||
name: Mixing & Painting
|
name: Mix e verniciatura
|
||||||
description: Velocità x<currentMult> → x<newMult>
|
description: Velocità x<currentMult> → x<newMult>
|
||||||
|
|
||||||
# Buildings and their name / description
|
# Buildings and their name / description
|
||||||
@ -473,27 +475,27 @@ buildings:
|
|||||||
|
|
||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: &cutter Cutter
|
name: &cutter Tagliatrice
|
||||||
description: Cuts shapes from top to bottom and outputs both halfs. <strong>If you use only one part, be sure to destroy the other part or it will stall!</strong>
|
description: Taglia le forme verticalmente e restituisce le metà destra e sinistra. <strong>Se usi solo una parte, distruggi l'altra o la macchina si fermerà!</strong>
|
||||||
quad:
|
quad:
|
||||||
name: Cutter (Quad)
|
name: Tagliatrice (4x)
|
||||||
description: Cuts shapes into four parts. <strong>If you use only one part, be sure to destroy the other part or it will stall!</strong>
|
description: Taglia le forme in quattro parti. <strong>Se usi solo una parte, distruggi le altre o la macchina si fermerà!</strong>
|
||||||
|
|
||||||
rotater:
|
rotater:
|
||||||
default:
|
default:
|
||||||
name: &rotater Rotate
|
name: &rotater Ruotatrice
|
||||||
description: Rotates shapes clockwise by 90 degrees.
|
description: Ruota le forme di 90 gradi in senso orario.
|
||||||
ccw:
|
ccw:
|
||||||
name: Rotate (CCW)
|
name: Ruotatrice (Ant.)
|
||||||
description: Rotates shapes counter clockwise by 90 degrees.
|
description: Ruota le forme di 90 gradi in senso antiorario.
|
||||||
fl:
|
fl:
|
||||||
name: Rotate (180)
|
name: Ruotatrice (180)
|
||||||
description: Rotates shapes by 180 degrees.
|
description: Ruota le forme di 180 gradi.
|
||||||
|
|
||||||
stacker:
|
stacker:
|
||||||
default:
|
default:
|
||||||
name: &stacker Stacker
|
name: &stacker Impilatrice
|
||||||
description: Stacks both items. If they can not be merged, the right item is placed above the left item.
|
description: Unisce o impila i due oggetti, se gli oggetti non possono essere uniti, l'oggetto destro è posizionato sopra il sinstro.
|
||||||
|
|
||||||
mixer:
|
mixer:
|
||||||
default:
|
default:
|
||||||
@ -502,14 +504,14 @@ buildings:
|
|||||||
|
|
||||||
painter:
|
painter:
|
||||||
default:
|
default:
|
||||||
name: &painter Verniciatore
|
name: &painter Verniciatrice
|
||||||
description: &painter_desc Colora l'intera forma dell'ingresso sinistro con il colore dell'ingresso destro.
|
description: &painter_desc Colora l'intera forma dall'ingresso sinistro con il colore dall'ingresso destro.
|
||||||
double:
|
double:
|
||||||
name: Verniciatore (Doppio)
|
name: Verniciatrice (2x)
|
||||||
description: Colors the shapes on the left inputs with the color from the top input.
|
description: Colora le forme dagli ingressi sinistri con il colore dall'ingresso destro.
|
||||||
quad:
|
quad:
|
||||||
name: Verniciatore (Quadruplo)
|
name: Verniciatrice (4x)
|
||||||
description: Allows to color each quadrant of the shape with a different color.
|
description: Consente di colorare ogni quadrante della forma con un colore diverso.
|
||||||
mirrored:
|
mirrored:
|
||||||
name: *painter
|
name: *painter
|
||||||
description: *painter_desc
|
description: *painter_desc
|
||||||
@ -517,156 +519,158 @@ buildings:
|
|||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: &trash Cestino
|
name: &trash Cestino
|
||||||
description: Accetta ingressi da tutti i lati e li distrugge. per sempre.
|
description: Accetta oggetti da tutti i lati e li distrugge. Per sempre.
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Storage
|
name: Stoccaggio
|
||||||
description: Stores excess items, up to a given capacity. Can be used as an overflow gate.
|
|
||||||
|
|
||||||
|
#Literal translation, quite ugly, might need rephrasing
|
||||||
|
description: Immagazzina gli oggetti in eccesso, fino ad una certa capacità. Può essere usato come varco per le eccedenze
|
||||||
hub:
|
hub:
|
||||||
deliver: Consegna
|
deliver: Consegna
|
||||||
toUnlock: per sbloccare
|
toUnlock: per sbloccare
|
||||||
levelShortcut: LVL
|
levelShortcut: LVL
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
name: Energy Wire
|
name: Cavo energetico
|
||||||
description: Allows you to transport energy.
|
description: Ti consente di trasportare energia.
|
||||||
advanced_processor:
|
advanced_processor:
|
||||||
default:
|
default:
|
||||||
name: Color Inverter
|
name: Invertitore di colori
|
||||||
description: Accepts a color or shape and inverts it.
|
description: Accetta un colore o una forma e li inverte.
|
||||||
energy_generator:
|
energy_generator:
|
||||||
deliver: Deliver
|
deliver: Consegna
|
||||||
toGenerateEnergy: For
|
toGenerateEnergy: per generare
|
||||||
default:
|
default:
|
||||||
name: Energy Generator
|
name: Generatore di energia
|
||||||
description: Generates energy by consuming shapes.
|
description: Genera energia consumando forme.
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: Wire Splitter
|
name: Separatore cavi
|
||||||
description: Splits a energy wire into two.
|
description: Divide un cavo energetico in due.
|
||||||
merger:
|
merger:
|
||||||
name: Wire Merger
|
name: Giunzione cavi
|
||||||
description: Merges two energy wires into one.
|
description: Unisce due cavi energetici in uno.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Cutting Shapes
|
title: Taglio forme
|
||||||
desc: You just unlocked the <strong>cutter</strong> - it cuts shapes half from <strong>top to bottom</strong> regardless of its orientation!<br><br>Be sure to get rid of the waste, or otherwise <strong>it will stall</strong> - For this purpose I gave you a trash, which destroys everything you put into it!
|
desc: Hai appena sbloccato la <strong>tagliatrice</strong> - taglia le forme <strong>verticalmente</strong> indipendentemente da come è orientata!<br><br>Elimina gli scarti, o altrimenti <strong>si bloccherà</strong> - A questo scopo ti ho dato un cestino, che distrugge qualsiasi cosa tu metta dentro!
|
||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotating
|
title: Rotazione
|
||||||
desc: The <strong>rotater</strong> has been unlocked! It rotates shapes clockwise by 90 degrees.
|
desc: La <strong>ruotatrice</strong> è stata sbloccata! Ruota le forme di 90 gradi in senso orario.
|
||||||
|
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Painting
|
title: Verniciatura
|
||||||
desc: >-
|
desc: >-
|
||||||
The <strong>painter</strong> 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!<br><br>PS: If you are colorblind, there is a <strong>color blind mode</strong> in the settings!
|
La <strong>verniciatrice</strong> è stata sbloccata - Estrai dalle vene colorate (esattamente come fai con le forme) e combina il colore con una forma nella veniciatrice per colorarla!<br><br>PS: Se sei daltonico, c'è la <strong>modalità daltonici </strong> nelle opzioni!
|
||||||
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Color Mixing
|
title: Mix colori
|
||||||
desc: The <strong>mixer</strong> has been unlocked - Combine two colors using <strong>additive blending</strong> with this building!
|
desc: Il <strong>mixer</strong> è stato sbloccato - Con questo edificio, puoi combinare due colori mediante <strong>sintesi additiva</strong>!
|
||||||
|
|
||||||
reward_stacker:
|
rreward_stacker:
|
||||||
title: Combiner
|
title: Impilatrice
|
||||||
desc: You can now combine shapes with the <strong>combiner</strong>! Both inputs are combined, and if they can be put next to each other, they will be <strong>fused</strong>. If not, the right input is <strong>stacked on top</strong> of the left input!
|
desc: >-
|
||||||
|
Ora puoi unire forme con l'<strong>impilatrice</strong>! Le forme in ingresso vengono combinate: se possono essere poste l'una accanto all'altra verranno <strong>fuse</strong>, altrimenti le forme dall'ingresso destro vengono <strong>impilate sopra</strong> quelle dal sinistro!
|
||||||
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Splitter/Merger
|
title: Separatore/Agrregatore
|
||||||
desc: The multifunctional <strong>balancer</strong> has been unlocked - It can be used to build bigger factories by <strong>splitting and merging items</strong> onto multiple belts!<br><br>
|
desc: Il <strong>bilanciatore</strong> multifunzione è stato sbloccato - Può essere usato per costruire fabbriche più grandi <strong>unendo o dividendo gli oggetti</strong> tra diversi nastri!<br><br>
|
||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunnel
|
title: Tunnel
|
||||||
desc: The <strong>tunnel</strong> has been unlocked - You can now pipe items through belts and buildings with it!
|
desc: Il <strong>tunnel</strong> è stato sbloccato - In questo modo puoi trasportare oggetti al di sotto di nastri ed edifici!
|
||||||
|
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: CCW Rotating
|
title: Rotazione antioraria
|
||||||
desc: You have unlocked a variant of the <strong>rotater</strong> - It allows to rotate counter clockwise! To build it, select the rotater and <strong>press 'T' to cycle its variants</strong>!
|
desc: Hai sbloccato una variante della <strong>ruotatrice</strong> - Consente di ruotare in senso antiorario! Per costruirla, seleziona la ruotatrice e <strong>premi 'T' per cambiare variante</strong>!
|
||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Chaining Extractor
|
title: Estrattore a catena
|
||||||
desc: You have unlocked the <strong>chaining extractor</strong>! It can <strong>forward its resources</strong> to other extractors so you can more efficiently extract resources!
|
desc: Hai sbloccato l'<strong>estrattore a catena</strong>! Può <strong>trasferire le sue risorse</strong> ad altri estrattori, così puoi estrarre risorse in modo più efficiente!
|
||||||
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunnel Tier II
|
title: Tunnel grado II
|
||||||
desc: You have unlocked a new variant of the <strong>tunnel</strong> - It has a <strong>bigger range</strong>, and you can also mix-n-match those tunnels now!
|
desc: Hai sbloccato una nuova variante del <strong>tunnel</strong> - Ha un <strong>raggio più ampio</strong> e puoi anche mischiare le due varianti ora!
|
||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Compact Balancer
|
title: Bilanciatore compatto
|
||||||
desc: >-
|
desc: >-
|
||||||
You have unlocked a compact variant of the <strong>balancer</strong> - It accepts two inputs and merges them into one!
|
Hai sbloccato una variante compatta del <strong>bilanciatore</strong> - Accetta due ingressi e li unisce!
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Quad Cutting
|
title: Taglio quadruplo
|
||||||
desc: You have unlocked a variant of the <strong>cutter</strong> - It allows you to cut shapes in <strong>four parts</strong> instead of just two!
|
desc: Hai sbloccato una variante della <strong>tagliatrice</strong> - Cconsente di tagliare le forme in <strong>quattro parti</strong> invece che in due!
|
||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Double Painting
|
title: Verniciatura doppia
|
||||||
desc: You have unlocked a variant of the <strong>painter</strong> - It works as the regular painter but processes <strong>two shapes at once</strong> consuming just one color instead of two!
|
desc: Hai sbloccato una variante della <strong>verniciatrice</strong> - Funziona come una normale verniciatrice, ma processa <strong>due forme alla volta</strong> consumando solo un'unità di colore invece che due!
|
||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Quad Painting
|
title: Verniciatrice
|
||||||
desc: You have unlocked a variant of the <strong>painter</strong> - It allows to paint each part of the shape individually!
|
desc: Hai sbloccato una variante della <strong>verniciatrice</strong> - Consente di verniciare ogni parte della forma indipendentemente!
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Storage Buffer
|
title: Unità di stoccaggio
|
||||||
desc: You have unlocked a variant of the <strong>trash</strong> - It allows to store items up to a given capacity!
|
desc: Hai sbloccato una variante del <strong>cestino</strong> - Consente di immagazzinare oggetti fino ad una certa capacità!
|
||||||
|
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Freeplay
|
title: Modalità libera
|
||||||
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)
|
desc: Ce l'hai fatta! Hai sbloccato la <strong>modalità libera</strong>! Questo significa che adesso le forme sono generate casualmente! (Non preoccuparti, altri contenuti sono in programma per la versione completa!)
|
||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Blueprints
|
title: Progetti
|
||||||
desc: You can now <strong>copy and paste</strong> parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.<br><br>Pasting it is <strong>not free</strong>, you need to produce <strong>blueprint shapes</strong> to afford it! (Those you just delivered).
|
desc: Ora puoi <strong>copiare ed incollare</strong> parti della tua fabbrica! Seleziona un'area (Tieni premuto CTRL e trascina con il mouse) e premi 'C' per copiarla.<br><br>Incollarla <strong>non è gratis</strong>, devi produrre <strong>forme progetto</strong> per potertelo permettere! (Quelle che hai appena consegnato).
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Next level
|
title: Prossimo livello
|
||||||
desc: >-
|
desc: >-
|
||||||
This level gave you no reward, but the next one will! <br><br> PS: Better don't destroy your existing factory - You need <strong>all</strong> those shapes later again to <strong>unlock upgrades</strong>!
|
Questo livello non ti ha dato alcuna ricompensa, ma il prossimo lo farà! <br><br> PS: Meglio non distruggere la fabbrica che hai costruito - Successivamente avrai bisogno di <strong>tutte</strong> quelle forme per <strong>sbloccare i miglioramenti</strong>!
|
||||||
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Next level
|
title: Prossimo livello
|
||||||
desc: >-
|
desc: >-
|
||||||
Congratulations! By the way, more content is planned for the standalone!
|
Congratulazioni! Ci sono altri contenuti in prgramma per la versione completa!
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
title: Impostazioni
|
title: Impostazioni
|
||||||
categories:
|
categories:
|
||||||
general: General
|
general: Generali
|
||||||
userInterface: User Interface
|
userInterface: Interfaccia utente
|
||||||
advanced: Advanced
|
advanced: Avanzate
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Sviluppo
|
dev: Sviluppo
|
||||||
staging: Staging
|
staging: Staging
|
||||||
prod: Produzione
|
prod: Produzione
|
||||||
buildDate: Built <at-date>
|
buildDate: Build del <at-date>
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
uiScale:
|
uiScale:
|
||||||
title: Interface scale
|
title: Dimensione interfaccia
|
||||||
description: >-
|
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.
|
Cambia la dimensione dell'interfaccia utente. L'interfaccia continuerà a cambiare in base alla risoluzione del tuo dispositivo, ma questa impostazione controlla la proporzione.
|
||||||
scales:
|
scales:
|
||||||
super_small: Super small
|
super_small: Minuscola
|
||||||
small: Small
|
small: Piccola
|
||||||
regular: Regular
|
regular: Normale
|
||||||
large: Large
|
large: Grande
|
||||||
huge: Huge
|
huge: Enorme
|
||||||
|
|
||||||
scrollWheelSensitivity:
|
scrollWheelSensitivity:
|
||||||
title: Zoom sensitivity
|
title: Sensibilità zoom
|
||||||
description: >-
|
description: >-
|
||||||
Changes how sensitive the zoom is (Either mouse wheel or trackpad).
|
Determina quanto è sensibile lo zoom (Sia rotella del mouse che trackpad).
|
||||||
sensitivity:
|
sensitivity:
|
||||||
super_slow: Super slow
|
super_slow: Molto lento
|
||||||
slow: Slow
|
slow: Lento
|
||||||
regular: Regular
|
regular: Regolare
|
||||||
fast: Fast
|
fast: Veloce
|
||||||
super_fast: Super fast
|
super_fast: Molto veloce
|
||||||
|
|
||||||
language:
|
language:
|
||||||
title: Lingua
|
title: Lingua
|
||||||
@ -674,9 +678,9 @@ settings:
|
|||||||
Cambia la lingua. Tutte le traduzioni sono realizzate dagli utenti e potrebbero essere incomplete!
|
Cambia la lingua. Tutte le traduzioni sono realizzate dagli utenti e potrebbero essere incomplete!
|
||||||
|
|
||||||
fullscreen:
|
fullscreen:
|
||||||
title: Fullscreen
|
title: Schermo intero
|
||||||
description: >-
|
description: >-
|
||||||
It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone.
|
È consigliabile giocare a schermo intero per la migliore esperienza. Disponibile solo nella versione completa.
|
||||||
|
|
||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: Silenzia Suoni
|
title: Silenzia Suoni
|
||||||
@ -698,23 +702,23 @@ settings:
|
|||||||
light: Chiaro
|
light: Chiaro
|
||||||
|
|
||||||
refreshRate:
|
refreshRate:
|
||||||
title: Simulation Target
|
title: Obiettivo della simulazione
|
||||||
description: >-
|
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.
|
Se hai un monitor a 144Hz, cambia la frequenza di aggiornamento, in modo tale che il gioco possa correttamente simulare alla frequenza di aggiornamento più alta. Questo potrebbe abbasare i frame al secondo se il tuo computer è troppo lento.
|
||||||
|
|
||||||
alwaysMultiplace:
|
alwaysMultiplace:
|
||||||
title: Multiplace
|
title: Posizionamento multiplo
|
||||||
description: >-
|
description: >-
|
||||||
If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently.
|
Se abilitato, tutti gli edifici rimarranno selezionati dopo il posizionamento finchè non lo annullerai. È equivalente a tenere costantemente premuto MAIUSC.
|
||||||
|
|
||||||
offerHints:
|
offerHints:
|
||||||
title: Hints & Tutorials
|
title: Indizi e tutorial
|
||||||
description: >-
|
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.
|
Determina se saranno presenti indizi e tutorial durante il gioco. Inoltre, nasconde alcuni elementi dell'interfaccia in certi livelli per semplificare le prime fasi di gioco.
|
||||||
|
|
||||||
movementSpeed:
|
movementSpeed:
|
||||||
title: Movement speed
|
title: Velocità di movimento
|
||||||
description: Changes how fast the view moves when using the keyboard.
|
description: Determina la velocità di spostamento sulla mappa quando si usa la tastiera.
|
||||||
speeds:
|
speeds:
|
||||||
super_slow: Molto lento
|
super_slow: Molto lento
|
||||||
slow: Lento
|
slow: Lento
|
||||||
@ -723,79 +727,75 @@ settings:
|
|||||||
super_fast: Molto veloce
|
super_fast: Molto veloce
|
||||||
extremely_fast: Velocissimo
|
extremely_fast: Velocissimo
|
||||||
enableTunnelSmartplace:
|
enableTunnelSmartplace:
|
||||||
title: Smart Tunnels
|
title: Tunnel intelligenti
|
||||||
description: >-
|
description: >-
|
||||||
When enabled, placing tunnels will automatically remove unnecessary belts.
|
Se abilitato, piazzare un tunnel rimuoverà anche qualsiasi nastro superfluo.
|
||||||
This also enables to drag tunnels and excess tunnels will get removed.
|
Consente anche di trascinare i tunnel: i tunnel in eccesso verrano rimossi.
|
||||||
vignette:
|
vignette:
|
||||||
title: Vignetta
|
title: Vignettatura
|
||||||
description: >-
|
description: >-
|
||||||
Enables the vignette which darkens the screen corners and makes text easier
|
Abilita la vignettatura che scurisce gli angoli dello schermo e rende i testi più leggibili.
|
||||||
to read.
|
|
||||||
|
|
||||||
autosaveInterval:
|
autosaveInterval:
|
||||||
title: Autosave Interval
|
title: Intervallo salvataggio automatico
|
||||||
description: >-
|
description: >-
|
||||||
Controls how often the game saves automatically. You can also disable it
|
Determina ogni quanto il gioco salva automaticamente.
|
||||||
entirely here.
|
Qui puoi anche disabilitarlo completamente.
|
||||||
intervals:
|
intervals:
|
||||||
one_minute: 1 Minute
|
one_minute: 1 Minuto
|
||||||
two_minutes: 2 Minutes
|
two_minutes: 2 Minuti
|
||||||
five_minutes: 5 Minutes
|
five_minutes: 5 Minuti
|
||||||
ten_minutes: 10 Minutes
|
ten_minutes: 10 Minuti
|
||||||
twenty_minutes: 20 Minutes
|
twenty_minutes: 20 Minuti
|
||||||
disabled: Disabled
|
disabled: Disabilitato
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Compact Building Infos
|
title: Info edifici compatte
|
||||||
description: >-
|
description: >-
|
||||||
Shortens info boxes for buildings by only showing their ratios. Otherwise a
|
Accorcia le informazioni sugli edifici mostrandone solo la velocità. In caso contrario saranno mostrate immagine e descrizione.
|
||||||
description and image is shown.
|
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Disable Cut/Delete Warnings
|
title: Disabilita avvertimenti taglia/cancella
|
||||||
description: >-
|
description: >-
|
||||||
Disable the warning dialogs brought up when cutting/deleting more than 100
|
Disabilita i messaggi d'avvertimento quando tagli o cancelli più di 100 entità.
|
||||||
entities.
|
|
||||||
|
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Color Blind Mode
|
title: Modalità daltonici
|
||||||
description: Enables various tools which allow to play the game if you are color blind.
|
description: Abilita vari strumenti che ti consentono di giocare se sei daltonico.
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Rotation by building type
|
title: Rotazione per tipo di edificio
|
||||||
description: >-
|
description: >-
|
||||||
Each building type remembers the rotation you last set it to individually.
|
Ogni tipo di edificio ricorderà l'ultimo orientamento che hai selezionato indipendentemente dagli altri tipi.
|
||||||
This may be more comfortable if you frequently switch between placing
|
È utile se cambi spesso tipo di edificio.
|
||||||
different building types.
|
|
||||||
|
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Keybindings
|
title: Comandi
|
||||||
hint: >-
|
hint: >-
|
||||||
Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options.
|
Suggerimento: Usa spesso CTRL, MAIUSC e ALT! Abilitano opzioni di posizionamento alternative.
|
||||||
|
|
||||||
resetKeybindings: Reset Keyinbindings
|
resetKeybindings: Reimposta comandi
|
||||||
|
|
||||||
categoryLabels:
|
categoryLabels:
|
||||||
general: Applicazione
|
general: Generale
|
||||||
ingame: Gioco
|
ingame: Gioco
|
||||||
navigation: Navigazione
|
navigation: Navigazione
|
||||||
placement: Posizionamento
|
placement: Posizionamento
|
||||||
massSelect: Mass Select
|
massSelect: Selezione di massa
|
||||||
buildings: Building Shortcuts
|
buildings: Scorciatoie edifici
|
||||||
placementModifiers: Placement Modifiers
|
placementModifiers: Modificatori piazzamento
|
||||||
|
|
||||||
mappings:
|
mappings:
|
||||||
confirm: Conferma
|
confirm: Conferma
|
||||||
back: Indietro
|
back: Indietro
|
||||||
mapMoveUp: Move Up
|
mapMoveUp: Spostati sù
|
||||||
mapMoveRight: Move Right
|
mapMoveRight: Spostati a destra
|
||||||
mapMoveDown: Move Down
|
mapMoveDown: Spostati giù
|
||||||
mapMoveLeft: Move Left
|
mapMoveLeft: Spostati a sinistra
|
||||||
centerMap: Centra mappa
|
centerMap: Centra mappa
|
||||||
|
|
||||||
mapZoomIn: Zoom in
|
mapZoomIn: Aumenta zoom
|
||||||
mapZoomOut: Zoom out
|
mapZoomOut: Riduci zoom
|
||||||
createMarker: Create Marker
|
createMarker: Crea segnapunto
|
||||||
|
|
||||||
menuOpenShop: Upgrade
|
menuOpenShop: Miglioramenti
|
||||||
menuOpenStats: Statistiche
|
menuOpenStats: Statistiche
|
||||||
|
|
||||||
toggleHud: Mostra/Nascondi HUD
|
toggleHud: Mostra/Nascondi HUD
|
||||||
@ -813,50 +813,48 @@ keybindings:
|
|||||||
|
|
||||||
rotateWhilePlacing: Ruota
|
rotateWhilePlacing: Ruota
|
||||||
rotateInverseModifier: >-
|
rotateInverseModifier: >-
|
||||||
Modifier: Rotate CCW instead
|
Modificatore: Ruota in senso antiorario
|
||||||
cycleBuildingVariants: Cicla varianti
|
cycleBuildingVariants: Cicla varianti
|
||||||
confirmMassDelete: Conferma eliminazione di massa
|
confirmMassDelete: Conferma eliminazione di massa
|
||||||
cycleBuildings: Cycle Buildings
|
cycleBuildings: Cicla edifici
|
||||||
|
|
||||||
massSelectStart: Hold and drag to start
|
massSelectStart: Clicca e trascina per cominciare
|
||||||
massSelectSelectMultiple: Seleziona aree multiple
|
massSelectSelectMultiple: Seleziona aree multiple
|
||||||
massSelectCopy: Copia area
|
massSelectCopy: Copia area
|
||||||
|
|
||||||
placementDisableAutoOrientation: Disable automatic orientation
|
placementDisableAutoOrientation: Disabilita orientamento automatico
|
||||||
placeMultiple: Stay in placement mode
|
placeMultiple: Rimani in modalità posizionamento
|
||||||
placeInverse: Invert automatic belt orientation
|
placeInverse: Inverti direzione automatica nastri
|
||||||
pasteLastBlueprint: Paste last blueprint
|
pasteLastBlueprint: Incolla l'ultimo progetto
|
||||||
massSelectCut: Cut area
|
massSelectCut: Taglia area
|
||||||
exportScreenshot: Export whole Base as Image
|
exportScreenshot: Esporta l'intera base come immagine
|
||||||
mapMoveFaster: Move Faster
|
mapMoveFaster: Muoviti più rapidamente
|
||||||
lockBeltDirection: Enable belt planner
|
lockBeltDirection: Abilita pianificatore nastri
|
||||||
switchDirectionLockSide: "Planner: Switch side"
|
switchDirectionLockSide: "Pianificatore: cambia direzione"
|
||||||
pipette: Pipette
|
pipette: Contagocce
|
||||||
menuClose: Close Menu
|
menuClose: Chiudi menù
|
||||||
switchLayers: Switch layers
|
switchLayers: Cambia livello
|
||||||
advanced_processor: Color Inverter
|
advanced_processor: Inversore di colore
|
||||||
energy_generator: Energy Generator
|
energy_generator: Generatore di energia
|
||||||
wire: Energy Wire
|
wire: Cavo energetico
|
||||||
|
|
||||||
about:
|
about:
|
||||||
title: Riguardo questo gioco
|
title: Riguardo questo gioco
|
||||||
body: >-
|
body: >-
|
||||||
This game is open source and developed by <a href="https://github.com/tobspr"
|
Questo gioco è open source e sviluppato da <a href="https://github.com/tobspr"
|
||||||
target="_blank">Tobias Springer</a> (this is me).<br><br>
|
target="_blank">Tobias Springer</a> (me).<br><br>
|
||||||
|
|
||||||
If you want to contribute, check out <a href="<githublink>"
|
Se vuoi contribuire visita la pagina github di <a href="<githublink>"
|
||||||
target="_blank">shapez.io on github</a>.<br><br>
|
target="_blank">shapez.io</a>.<br><br>
|
||||||
|
|
||||||
This game wouldn't have been possible without the great Discord community
|
Realizzare questo gioco non sarebbe stato possibile senza la grande community di Discord per i miei giochi - Unisciti al <a href="<discordlink>"
|
||||||
around my games - You should really join the <a href="<discordlink>"
|
target="_blank">server di Discord</a>!<br><br>
|
||||||
target="_blank">Discord server</a>!<br><br>
|
|
||||||
|
|
||||||
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius"
|
La colonna sonora è stata composta da<a href="https://soundcloud.com/pettersumelius"
|
||||||
target="_blank">Peppsen</a> - He's awesome.<br><br>
|
target="_blank">Peppsen</a> - È un grande.<br><br>
|
||||||
|
|
||||||
Finally, huge thanks to my best friend <a
|
Per finire, grazie di cuore al mio migliore amico <a
|
||||||
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our
|
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Senza le nostre sessioni su factorio questo gioco non sarebbe mai esistito.
|
||||||
factorio sessions this game would never have existed.
|
|
||||||
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Changelog
|
title: Changelog
|
||||||
|
@ -70,7 +70,7 @@ steamPage:
|
|||||||
|
|
||||||
[b]このゲームはオープンソースです![/b]
|
[b]このゲームはオープンソースです![/b]
|
||||||
|
|
||||||
誰でもこのげむの開発を手伝うことができ、私もプレーヤーの意見をできるだけゲームに取り入れようとしています。
|
誰でもこのゲームの開発を手伝うことができ、私もプレーヤーの意見をできるだけゲームに取り入れようとしています。
|
||||||
Trelloで今後の予定が全て確認できます。
|
Trelloで今後の予定が全て確認できます。
|
||||||
|
|
||||||
[b]外部リンク[/b]
|
[b]外部リンク[/b]
|
||||||
|
@ -213,12 +213,12 @@ dialogs:
|
|||||||
desc: 모든 키바인딩이 기본값으로 재설정 되었습니다!
|
desc: 모든 키바인딩이 기본값으로 재설정 되었습니다!
|
||||||
|
|
||||||
featureRestriction:
|
featureRestriction:
|
||||||
title: 데모 버전
|
title: 체험판 버전
|
||||||
desc: 데모 버전에는 없는 콘텐츠(<feature>)로 시도했습니다. 유료 버전을 구입해서 모든 콘텐츠를 사용해보세요!
|
desc: 체험판 버전에는 없는 콘텐츠(<feature>)로 시도했습니다. 유료 버전을 구입해서 모든 콘텐츠를 사용해보세요!
|
||||||
|
|
||||||
oneSavegameLimit:
|
oneSavegameLimit:
|
||||||
title: 저장파일 개수 제한
|
title: 저장파일 개수 제한
|
||||||
desc: 데모 버전에서는 저장 파일을 한 번에 한 개만 사용할 수 있습니다. 이미 있는 저장 파일을 지우거나 유료 버전을 구입 해주새요.
|
desc: 체험판 버전에서는 저장 파일을 한 번에 한 개만 사용할 수 있습니다. 이미 있는 저장 파일을 지우거나 유료 버전을 구입 해주새요.
|
||||||
|
|
||||||
updateSummary:
|
updateSummary:
|
||||||
title: 신규 버전!
|
title: 신규 버전!
|
||||||
@ -261,7 +261,7 @@ dialogs:
|
|||||||
titleEdit: 마커 변경
|
titleEdit: 마커 변경
|
||||||
|
|
||||||
markerDemoLimit:
|
markerDemoLimit:
|
||||||
desc: 데모 버전에서는 마커를 2개 까지만 놓을 수 있습니다. 유료 버전을 구입하면 마커를 무제한으로 놓을 수 있습니다!
|
desc: 체험판 버전에서는 마커를 2개 까지만 놓을 수 있습니다. 유료 버전을 구입하면 마커를 무제한으로 놓을 수 있습니다!
|
||||||
|
|
||||||
exportScreenshotWarning:
|
exportScreenshotWarning:
|
||||||
title: 스크린샷 내보내기
|
title: 스크린샷 내보내기
|
||||||
@ -460,7 +460,7 @@ buildings:
|
|||||||
|
|
||||||
tier2:
|
tier2:
|
||||||
name: 터널 티어 II
|
name: 터널 티어 II
|
||||||
description: 도형을 건물과 벨트 밑으로 통과시킴.
|
description: 도형을 건물과 벨트 밑으로 터널 보다 빨리 통과시킴.
|
||||||
|
|
||||||
splitter: # Internal name for the Balancer
|
splitter: # Internal name for the Balancer
|
||||||
default:
|
default:
|
||||||
@ -543,10 +543,10 @@ buildings:
|
|||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: 전선 분배기
|
name: 전선 분배기
|
||||||
description: Splits a energy wire into two.
|
description: 에너지 와이어를 두 개로 분할합니다.
|
||||||
merger:
|
merger:
|
||||||
name: 전선 병합기
|
name: 전선 병합기
|
||||||
description: Merges two energy wires into one.
|
description: 두 개의 에너지 와이어를 하나로 병합합니다.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
@ -634,9 +634,9 @@ storyRewards:
|
|||||||
settings:
|
settings:
|
||||||
title: 설정
|
title: 설정
|
||||||
categories:
|
categories:
|
||||||
general: General
|
general: 일반
|
||||||
userInterface: User Interface
|
userInterface: 유저 인터페이스
|
||||||
advanced: Advanced
|
advanced: 고급
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: 개발
|
dev: 개발
|
||||||
@ -654,7 +654,7 @@ settings:
|
|||||||
small: 작게
|
small: 작게
|
||||||
regular: 보통
|
regular: 보통
|
||||||
large: 크게
|
large: 크게
|
||||||
huge: 거대하게
|
huge: 매우 크게
|
||||||
|
|
||||||
scrollWheelSensitivity:
|
scrollWheelSensitivity:
|
||||||
title: 확대 민감도
|
title: 확대 민감도
|
||||||
@ -682,7 +682,7 @@ settings:
|
|||||||
language:
|
language:
|
||||||
title: 언어
|
title: 언어
|
||||||
description: >-
|
description: >-
|
||||||
언어 바꾸기 - 모든 언어팩은 사용자들이 만든 것이므로 완성되지 않았을 수 있습니다!
|
언어 바꾸기 - 모든 언어팩은 사용자들이 만든 것이므로 정확하지 않을 수 있습니다!
|
||||||
|
|
||||||
fullscreen:
|
fullscreen:
|
||||||
title: 전체화면
|
title: 전체화면
|
||||||
@ -745,7 +745,7 @@ settings:
|
|||||||
twenty_minutes: 20분
|
twenty_minutes: 20분
|
||||||
disabled: 기능 끄기
|
disabled: 기능 끄기
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: 간결한 건물 정보
|
title: 간단한 건물 정보
|
||||||
description: >-
|
description: >-
|
||||||
건물의 정보창을 해당 건물의 능률만 보이도록 줄입니다.
|
건물의 정보창을 해당 건물의 능률만 보이도록 줄입니다.
|
||||||
아니면, 설명과 이미지가 보입니다.
|
아니면, 설명과 이미지가 보입니다.
|
||||||
@ -862,7 +862,7 @@ demo:
|
|||||||
restoringGames: 게임 자장 파일 리스토어 하기
|
restoringGames: 게임 자장 파일 리스토어 하기
|
||||||
importingGames: 게임 저장 파일 불러오기
|
importingGames: 게임 저장 파일 불러오기
|
||||||
oneGameLimit: 게임 저장 파일 최대 1개
|
oneGameLimit: 게임 저장 파일 최대 1개
|
||||||
customizeKeybindings: 키바인딩 설정하기
|
customizeKeybindings: 키 설정하기
|
||||||
exportingBase: 공장 전체를 이미지로 내보내기
|
exportingBase: 공장 전체를 이미지로 내보내기
|
||||||
|
|
||||||
settingNotAvailable: 데모 버전에서 사용 불가
|
settingNotAvailable: 체험판 버전에서 사용 불가
|
||||||
|
@ -56,10 +56,10 @@ steamPage:
|
|||||||
|
|
||||||
[b]Fremtidige Oppdateringer[/b]
|
[b]Fremtidige Oppdateringer[/b]
|
||||||
|
|
||||||
Jeg oppdaterer spillet veldig ofte og prøver å presse inn en oppdatering i det minste hver uke!
|
Jeg oppdaterer spillet veldig ofte og prøver å presse inn minst en oppdatering hver uke!
|
||||||
|
|
||||||
[list]
|
[list]
|
||||||
[*] Forskjellige baner og utfordringer (f.eks. baner med hindringer)
|
[*] Forskjellige nivåer og utfordringer (f.eks. nivåer med hindringer)
|
||||||
[*] Gåter (lever den forspurte formen med et begrenset område / sett med bygninger)
|
[*] Gåter (lever den forspurte formen med et begrenset område / sett med bygninger)
|
||||||
[*] En historiemodus der bygninger har en pris
|
[*] En historiemodus der bygninger har en pris
|
||||||
[*] Konfigurerbar kartgenerator (Konfigurer ressurser/former, størrelse/tetthet, seed og mer)
|
[*] Konfigurerbar kartgenerator (Konfigurer ressurser/former, størrelse/tetthet, seed og mer)
|
||||||
@ -142,12 +142,12 @@ mainMenu:
|
|||||||
changelog: Endringshistorikk
|
changelog: Endringshistorikk
|
||||||
importSavegame: Importer
|
importSavegame: Importer
|
||||||
openSourceHint: Dette spillet er åpen kildekode!
|
openSourceHint: Dette spillet er åpen kildekode!
|
||||||
discordLink: Offisiel Discord Server
|
discordLink: Offisiel Discord-Server
|
||||||
helpTranslate: Hjelp oversetting!
|
helpTranslate: Hjelp oversetting!
|
||||||
|
|
||||||
# This is shown when using firefox and other browsers which are not supported.
|
# This is shown when using firefox and other browsers which are not supported.
|
||||||
browserWarning: >-
|
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.
|
Beklager, men spillet er kjent for å kjøre sakte i din nettleser! Skaff deg den frittstående versjonen, eller last ned Chrome for den fulle opplevelsen.
|
||||||
|
|
||||||
savegameLevel: Nivå <x>
|
savegameLevel: Nivå <x>
|
||||||
savegameLevelUnknown: Ukjent Nivå
|
savegameLevelUnknown: Ukjent Nivå
|
||||||
@ -172,14 +172,14 @@ dialogs:
|
|||||||
showKeybindings: Se Hurtigtaster
|
showKeybindings: Se Hurtigtaster
|
||||||
|
|
||||||
importSavegameError:
|
importSavegameError:
|
||||||
title: Importerings feil
|
title: Importeringsfeil
|
||||||
text: >-
|
text: >-
|
||||||
Kunne ikke importere lagringsfilen:
|
Kunne ikke importere lagringsfilen:
|
||||||
|
|
||||||
importSavegameSuccess:
|
importSavegameSuccess:
|
||||||
title: Lagringsfil importert
|
title: Lagringsfil importert
|
||||||
text: >-
|
text: >-
|
||||||
Din Lagringsfil ble vellykket importert.
|
Din Lagringsfil ble importert.
|
||||||
|
|
||||||
gameLoadFailure:
|
gameLoadFailure:
|
||||||
title: Lagringsfilen er ødelagt
|
title: Lagringsfilen er ødelagt
|
||||||
@ -206,20 +206,20 @@ dialogs:
|
|||||||
desc: Trykk på knappen eller museknappen du vil tildele, eller escape for å avbryte.
|
desc: Trykk på knappen eller museknappen du vil tildele, eller escape for å avbryte.
|
||||||
|
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Nullstill Hurtigtaster
|
title: Tilbakestill Hurtigtaster
|
||||||
desc: Dette vil nullstille alle hurtigtaster tilbake til standard. Vennligst bekreft.
|
desc: Dette vil tilbakestille alle hurtigtaster. Er du sikker?.
|
||||||
|
|
||||||
keybindingsResetOk:
|
keybindingsResetOk:
|
||||||
title: Hurtigtaster nullstilt
|
title: Hurtigtaster tilbakestillt
|
||||||
desc: Hurtigtastene har blitt nullstilt tilbake til standard!
|
desc: Hurtigtastene har blitt tilbakestillt til standard!
|
||||||
|
|
||||||
featureRestriction:
|
featureRestriction:
|
||||||
title: Demo Versjon
|
title: Demoversjon
|
||||||
desc: Du prøvde å benytte deg av en funksjon (<feature>) som ikke er tilgjengelig i demoen. Vurder å skaffe frittstående versjon for den fulle opplevelsen!
|
desc: Du prøvde å benytte deg av en funksjon (<feature>) som ikke er tilgjengelig i demoen. Vurder å skaffe den frittstående versjonen for den fulle opplevelsen!
|
||||||
|
|
||||||
oneSavegameLimit:
|
oneSavegameLimit:
|
||||||
title: Begrenset Lagringsfiler
|
title: Begrenset antall Lagringsfiler
|
||||||
desc: Du kan du ha en lagringsfil om gangen i demo versjonen. Vennligst slett den eksisterende, eller skaff frittstående versjon!
|
desc: Du kan du ha en lagringsfil om gangen i demoversjonen. Vennligst slett den eksisterende, eller skaff den frittstående versjonen!
|
||||||
|
|
||||||
updateSummary:
|
updateSummary:
|
||||||
title: Ny oppdatering!!
|
title: Ny oppdatering!!
|
||||||
@ -238,7 +238,7 @@ dialogs:
|
|||||||
Du skal til å slette mange bygninger (<count> for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette?
|
Du skal til å slette mange bygninger (<count> for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette?
|
||||||
|
|
||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Bekreft Klipping
|
title: Bekreft Utlipping
|
||||||
desc: >-
|
desc: >-
|
||||||
Du klipper ut mange bygninger (<count> for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette?
|
Du klipper ut mange bygninger (<count> for å være nøyaktig)! Er du sikker på at du ønsker å gjøre dette?
|
||||||
|
|
||||||
@ -253,23 +253,23 @@ dialogs:
|
|||||||
Spillet har mange hurtigtaster som gjør det enklere å bygge store fabrikker.
|
Spillet har mange hurtigtaster som gjør det enklere å bygge store fabrikker.
|
||||||
Her er noen få, men sørg for å <strong>sjekke ut hurtigtaster</strong>!<br><br>
|
Her er noen få, men sørg for å <strong>sjekke ut hurtigtaster</strong>!<br><br>
|
||||||
<code class='keybinding'>CTRL</code> + Dra: Velg et område.<br>
|
<code class='keybinding'>CTRL</code> + Dra: Velg et område.<br>
|
||||||
<code class='keybinding'>SHIFT</code>: Hold trykket for å plassere flere av en bygning.<br>
|
<code class='keybinding'>SHIFT</code>: Hold inne for å plassere flere av en bygning.<br>
|
||||||
<code class='keybinding'>ALT</code>: Inverter orientasjon av plasserte belter.<br>
|
<code class='keybinding'>ALT</code>: Inverter rettning på plasserte samlebånd.<br>
|
||||||
|
|
||||||
createMarker:
|
createMarker:
|
||||||
title: Ny Markør
|
title: Ny Markør
|
||||||
desc: Gi markøren et meningsfullt navn, du kan også inkludere <strong>"short key"</strong> av et objekt (Som du kan generere <a href="https://viewer.shapez.io" target="_blank">her</a>)
|
desc: Gi markøren et meningsfullt navn, du kan også inkludere en <strong>"short key"</strong> av et objekt (Som du kan generere <a href="https://viewer.shapez.io" target="_blank">her</a>)
|
||||||
titleEdit: Edit Marker
|
titleEdit: Rediger markør
|
||||||
|
|
||||||
markerDemoLimit:
|
markerDemoLimit:
|
||||||
desc: Du kan kun ha to markører i demo verjsonen. Skaff deg frittstående versjon for ubegrensede markører!
|
desc: Du kan kun ha to markører i demoverjsonen. Skaff deg den frittstående versjonen for ubegrensede markører!
|
||||||
|
|
||||||
exportScreenshotWarning:
|
exportScreenshotWarning:
|
||||||
title: Eksporter skjermbilde
|
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)!
|
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)!
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: Confirm cut
|
title: Bekreft Utklipping
|
||||||
desc: You can not afford to paste this area! Are you sure you want to cut it?
|
desc: Du har ikke råd til å lime inn dette området! er du sikker på at du vil klippe det ut?
|
||||||
|
|
||||||
ingame:
|
ingame:
|
||||||
# This is shown in the top left corner and displays useful keybindings in
|
# This is shown in the top left corner and displays useful keybindings in
|
||||||
@ -293,7 +293,7 @@ ingame:
|
|||||||
copySelection: Kopier
|
copySelection: Kopier
|
||||||
clearSelection: Fjern Valgte
|
clearSelection: Fjern Valgte
|
||||||
pipette: Pipette
|
pipette: Pipette
|
||||||
switchLayers: Switch layers
|
switchLayers: Bytt lag
|
||||||
|
|
||||||
# Everything related to placing buildings (I.e. as soon as you selected a building
|
# Everything related to placing buildings (I.e. as soon as you selected a building
|
||||||
# from the toolbar)
|
# from the toolbar)
|
||||||
@ -365,7 +365,7 @@ ingame:
|
|||||||
playtime: Spilletid
|
playtime: Spilletid
|
||||||
|
|
||||||
buildingsPlaced: Bygninger
|
buildingsPlaced: Bygninger
|
||||||
beltsPlaced: Belter
|
beltsPlaced: Samlebånd
|
||||||
|
|
||||||
buttons:
|
buttons:
|
||||||
continue: Fortsett
|
continue: Fortsett
|
||||||
@ -393,7 +393,7 @@ ingame:
|
|||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
title: Opplæring
|
title: Opplæring
|
||||||
hints:
|
hints:
|
||||||
1_1_extractor: Plasser en <strong>utdrager</strong> på toppen av en <strong>sirkel form</strong> for å samle den!
|
1_1_extractor: Plasser en <strong>utdrager</strong> på toppen av en <strong>sirkelform</strong> for å samle den!
|
||||||
1_2_conveyor: >-
|
1_2_conveyor: >-
|
||||||
Koble utdrageren med et <strong>transportbånd</strong> til hovedbygningen!<br><br>Tips: <strong>Trykk og dra</strong> beltet med musa!
|
Koble utdrageren med et <strong>transportbånd</strong> til hovedbygningen!<br><br>Tips: <strong>Trykk og dra</strong> beltet med musa!
|
||||||
|
|
||||||
@ -409,7 +409,7 @@ ingame:
|
|||||||
cyan: Cyan
|
cyan: Cyan
|
||||||
white: Hvit
|
white: Hvit
|
||||||
uncolored: Ingen farge
|
uncolored: Ingen farge
|
||||||
black: Black
|
black: Svart
|
||||||
shapeViewer:
|
shapeViewer:
|
||||||
title: Lag
|
title: Lag
|
||||||
empty: Tom
|
empty: Tom
|
||||||
@ -418,7 +418,7 @@ ingame:
|
|||||||
# All shop upgrades
|
# All shop upgrades
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Belter, Distributører & Tuneller
|
name: Belter, Distributører & Tunneler
|
||||||
description: Hastighet x<currentMult> → x<newMult>
|
description: Hastighet x<currentMult> → x<newMult>
|
||||||
miner:
|
miner:
|
||||||
name: Utdrager
|
name: Utdrager
|
||||||
@ -439,7 +439,7 @@ buildings:
|
|||||||
|
|
||||||
belt:
|
belt:
|
||||||
default:
|
default:
|
||||||
name: &belt Transportbånd
|
name: &belt Samlebånd
|
||||||
description: Transporterer objekter, hold og dra for å plassere flere.
|
description: Transporterer objekter, hold og dra for å plassere flere.
|
||||||
|
|
||||||
miner: # Internal name for the Extractor
|
miner: # Internal name for the Extractor
|
||||||
@ -453,7 +453,7 @@ buildings:
|
|||||||
|
|
||||||
underground_belt: # Internal name for the Tunnel
|
underground_belt: # Internal name for the Tunnel
|
||||||
default:
|
default:
|
||||||
name: &underground_belt Tunell
|
name: &underground_belt Tunnel
|
||||||
description: Lar deg bruke tuneller for å transportere objekter under bygninger og belter.
|
description: Lar deg bruke tuneller for å transportere objekter under bygninger og belter.
|
||||||
|
|
||||||
tier2:
|
tier2:
|
||||||
@ -476,26 +476,26 @@ buildings:
|
|||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: &cutter Kutter
|
name: &cutter Kutter
|
||||||
description: Kutter objekter fra top til bunn og spytter ut begge halvdeler. <strong>Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det låse seg!</strong>
|
description: Kutter objekter fra top til bunn og spytter ut begge halvdeler. <strong>Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det stoppe opp!</strong>
|
||||||
quad:
|
quad:
|
||||||
name: Kutter (4-Veis)
|
name: Kutter (4-Veis)
|
||||||
description: Kutter objekter til 4 biter. <strong>Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det låse seg!</strong>
|
description: Kutter objekter til 4 biter. <strong>Hvis du bare skal bruke den ene biten, sørg for å ødelegge den andre biten ellers vil det stoppe opp!</strong>
|
||||||
|
|
||||||
rotater:
|
rotater:
|
||||||
default:
|
default:
|
||||||
name: &rotater Roter
|
name: &rotater Roter
|
||||||
description: Roter objekter med klokken, 90 grader.
|
description: Roter former med klokken, 90 grader.
|
||||||
ccw:
|
ccw:
|
||||||
name: Roter (Mot klokken)
|
name: Roter (Mot klokken)
|
||||||
description: Roter objekter mot klokken, 90 grader.
|
description: Roter former mot klokken, 90 grader.
|
||||||
fl:
|
fl:
|
||||||
name: Rotate (180)
|
name: Rotate (180)
|
||||||
description: Rotates shapes by 180 degrees.
|
description: Roterer former 180 grader.
|
||||||
|
|
||||||
stacker:
|
stacker:
|
||||||
default:
|
default:
|
||||||
name: &stacker Stabler
|
name: &stacker Stabler
|
||||||
description: Stabler begge objekter. Hvis de ikke kan bli stablet sidelengs, vil høyre stables over den andre.
|
description: Stabler begge formene. Hvis de ikke kan bli stablet sidelengs, vil høyre stables over den andre.
|
||||||
|
|
||||||
mixer:
|
mixer:
|
||||||
default:
|
default:
|
||||||
@ -505,13 +505,13 @@ buildings:
|
|||||||
painter:
|
painter:
|
||||||
default:
|
default:
|
||||||
name: &painter Maler
|
name: &painter Maler
|
||||||
description: &painter_desc Maler hele objektet på venstre inngang med fargen fra øverste inngang.
|
description: &painter_desc Maler hele formen på venstre inngang med fargen fra øverste inngang.
|
||||||
double:
|
double:
|
||||||
name: Maler (Dobbel)
|
name: Maler (Dobbel)
|
||||||
description: Maler hele objektet på venstre inngang med fargen fra øverste inngang.
|
description: Maler hele formen på venstre inngang med fargen fra øverste inngang.
|
||||||
quad:
|
quad:
|
||||||
name: Maler (Fireganger)
|
name: Maler (Firedobbel)
|
||||||
description: Farger enhver kvadrant av objektet med forskjellige farger.
|
description: Farger hvert hjørne av formen med forskjellige farger.
|
||||||
mirrored:
|
mirrored:
|
||||||
name: *painter
|
name: *painter
|
||||||
description: *painter_desc
|
description: *painter_desc
|
||||||
@ -519,38 +519,38 @@ buildings:
|
|||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: &trash Søppelkasse
|
name: &trash Søppelkasse
|
||||||
description: Tar imot objekter fra alle sider og ødelegger de. For alltid.
|
description: Tar imot former og farger fra alle sider og ødelegger de. For alltid.
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Lagringsboks
|
name: Lagringsboks
|
||||||
description: Lagrer overflødige objekter, opp til en viss kapasitet. Kan bli brukt som mellomlagring for overflyt.
|
description: Lagrer overflødige former og farger, opp til en viss kapasitet. Kan bli brukt som mellomlagring for overflyt.
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
name: Energy Wire
|
name: Energikabel
|
||||||
description: Allows you to transport energy.
|
description: Lar deg transportere energi.
|
||||||
advanced_processor:
|
advanced_processor:
|
||||||
default:
|
default:
|
||||||
name: Color Inverter
|
name: Fargeinverterer
|
||||||
description: Accepts a color or shape and inverts it.
|
description: Tar imot en farge eller form og inverterer den.
|
||||||
energy_generator:
|
energy_generator:
|
||||||
deliver: Deliver
|
deliver: Lever
|
||||||
toGenerateEnergy: For
|
toGenerateEnergy: For
|
||||||
default:
|
default:
|
||||||
name: Energy Generator
|
name: Energigenerator
|
||||||
description: Generates energy by consuming shapes.
|
description: Genererer energi ved å ta imot former.
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: Wire Splitter
|
name: Kabeldeler
|
||||||
description: Splits a energy wire into two.
|
description: Deler en energikabel i to.
|
||||||
merger:
|
merger:
|
||||||
name: Wire Merger
|
name: Kabelsammenslåer
|
||||||
description: Merges two energy wires into one.
|
description: Slår sammen to energikabler til en.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Kutt Objekter
|
title: Kutt Objekter
|
||||||
desc: Du åpnet nettop <strong>kutter</strong> - den kutter objekter i to fra <strong>topp til bunn</strong> uavhengig av rotasjon!<br><br>Husk å kvitt deg med alt søppel, ellers <strong>kiler det seg fast</strong> - For dette formålet har du søplekassen, som ødelegger alt du putter i den!
|
desc: Du åpnet nettop <strong>kutter</strong> - den kutter former i to fra <strong>topp til bunn</strong> uavhengig av rotasjon!<br><br>Husk å kvitt deg med alt søppel, ellers <strong>kiler det seg fast</strong> - Derfor har jeg gitt deg søplekassen, som ødelegger alt du putter i den!
|
||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotering
|
title: Rotering
|
||||||
@ -559,7 +559,7 @@ storyRewards:
|
|||||||
reward_painter:
|
reward_painter:
|
||||||
title: Maling
|
title: Maling
|
||||||
desc: >-
|
desc: >-
|
||||||
<strong>Maleren</strong> 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!<br><br>PS: Hvis du er fargeblind, så er det en <strong>modus for fargeblinde</strong> i instillinger!
|
<strong>Maleren</strong> 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!<br><br>PS: Hvis du er fargeblind, så er det en <strong>modus for fargeblinde</strong> i instillingene!
|
||||||
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Fargemikser
|
title: Fargemikser
|
||||||
@ -571,23 +571,23 @@ storyRewards:
|
|||||||
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Fordeler/Sammenslåer
|
title: Fordeler/Sammenslåer
|
||||||
desc: Den multifunksjonelle <strong>fordeleren</strong> har blitt tilgjengelig - Den kan brukes til å bygge større fabrikker ved å <strong>fordele og slå sammen objekter</strong> til flere transportbånd!<br><br>
|
desc: Den multifunksjonelle <strong>fordeleren</strong> har blitt tilgjengelig - Den kan brukes til å bygge større fabrikker ved å <strong>fordele og slå sammen objekter</strong> til flere samlebånd!<br><br>
|
||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunell
|
title: Tunnel
|
||||||
desc: <strong>Tunellen</strong> har blitt tilgjengelig - Du kan nå transportere objekter under transportbelter og bygninger med den!
|
desc: <strong>Tunnelen</strong> har blitt tilgjengelig - Du kan nå transportere objekter under samlebånd og bygninger med den!
|
||||||
|
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: Mot klokken rotering
|
title: Rotering mot klokken
|
||||||
desc: Du har åpnte en variant av <strong>rotereren</strong> - Den tillater rotasjoner mot klokken! For å bygge den, velg rotereren og <strong>trykk 'T' for å veksle mellom variantene</strong>!
|
desc: Du har åpnte en variant av <strong>rotereren</strong> - Den tillater rotasjoner mot klokken! For å bygge den, velg rotereren og <strong>trykk 'T' for å veksle mellom variantene</strong>!
|
||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Kjede Utdrager
|
title: Kjedeutdrager
|
||||||
desc: Du har åpnet <strong>kjede utdrageren</strong>! Den sender <strong>videre sine resurser</strong> til andre utdragere så de kan mer effektivt hente ut resurser!
|
desc: Du har åpnet <strong>kjedeutdrageren</strong>! Den sender <strong>sine resurser videre</strong> til andre utdragere så de kan hente ut ressurser mer effektivt!
|
||||||
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunell Nivå II
|
title: Tunnel Nivå II
|
||||||
desc: Du har åpnet en ny variant av <strong>tunellen</strong> - Den har <strong>lengre rekkevidde</strong>, og du kan også blande de forskjellige tunellene nå!
|
desc: Du har åpnet en ny variant av <strong>tunnelen</strong> - Den har <strong>lengre rekkevidde</strong>, og du kan også blande de forskjellige tunnelene nå!
|
||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Kompakt Utjevning
|
title: Kompakt Utjevning
|
||||||
@ -600,51 +600,51 @@ storyRewards:
|
|||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Dobbel Maling
|
title: Dobbel Maling
|
||||||
desc: Du har åpnet en variant av <strong>maleren</strong> - Den fungerer som vanlig maler, men prosesserer <strong>to objekter om gangen</strong>, konsumerer bare en farge istedenfor to!
|
desc: Du har åpnet en variant av <strong>maleren</strong> - Den fungerer som vanlig maler, men maler <strong>to objekter om gangen</strong>, konsumerer bare en farge istedenfor to!
|
||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Firegangers Maling
|
title: 4-Veis Maling
|
||||||
desc: Du har åpnet en variant av <strong>maleren</strong> - Den lar deg male hver del av objektet individuelt!
|
desc: Du har åpnet en variant av <strong>maleren</strong> - Den lar deg male hver del av objektet individuelt!
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Lagrings Buffer
|
title: Lagringsbuffer
|
||||||
desc: Du har åpnet en variant av <strong>søplekassen</strong> - Den lar deg lagre objekter opp til en viss mengde!
|
desc: Du har åpnet en variant av <strong>søpplekassen</strong> - Den lar deg lagre objekter opp til en viss mengde!
|
||||||
|
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Frispill
|
title: Frispill
|
||||||
desc: Du klarte det! Du åpnet <strong>frispill modus</strong>! Dette betyr at formene er nå tilfeldig generert! (Frykt ikke, mer innhold er planlagt for frittstående versjon!)
|
desc: Du klarte det! Du åpnet <strong>frispillmodus</strong>! Dette betyr at formene er nå tilfeldig generert! (Ikke vær redd, mer innhold er planlagt for den frittstående versjonen!)
|
||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Blåkopier
|
title: Blåkopier
|
||||||
desc: Du kan nå <strong>kopiere og lime inn</strong> deler av fabrikken din! Velg et område (Hold inne CTRL, så dra med musa), trykk så 'C' for å kopiere det.<br><br>Lime det inn er <strong>ikke gratis</strong>, du må produsere <strong>blåkopi objekter</strong> for å få råd til det! (Det du nettop leverte).
|
desc: Du kan nå <strong>kopiere og lime inn</strong> deler av fabrikken din! Velg et område (Hold inne CTRL, så dra med musa), trykk så 'C' for å kopiere det.<br><br>Lime det inn er <strong>ikke gratis</strong>, du må produsere <strong>blåkopiobjekter</strong> for å få råd til det! (Det du nettop leverte).
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Neste nivå
|
title: Neste nivå
|
||||||
desc: >-
|
desc: >-
|
||||||
Dette nivået ga deg ingen belønning, men neste gjør det! <br><br> PS: Burde ikke ødelegge din nåværende fabrikk - Du trenger <strong>alle</strong> de objektene senere for å <strong>åpne nye ting</strong>!
|
Dette nivået ga deg ingen belønning, men neste gjør det! <br><br> PS: Du burde ikke ødelegge din nåværende fabrikk - Du trenger <strong>alle</strong> de objektene senere for å <strong>åpne nye ting</strong>!
|
||||||
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Neste nivå
|
title: Neste nivå
|
||||||
desc: >-
|
desc: >-
|
||||||
Gratulerer!! Forresten, mer innhold er planlagt for frittstående versjon!
|
Gratulerer!! Forresten, mer innhold er planlagt for den frittstående versjonen!
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
title: Instillinger
|
title: Instillinger
|
||||||
categories:
|
categories:
|
||||||
general: General
|
general: Generelt
|
||||||
userInterface: User Interface
|
userInterface: Brukergrensesnitt
|
||||||
advanced: Advanced
|
advanced: Avansert
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Utvikling
|
dev: Utvikling
|
||||||
staging: Icenesettelse
|
staging: Iscenesettelse
|
||||||
prod: Produksjon
|
prod: Produksjon
|
||||||
buildDate: Bygget <at-date>
|
buildDate: Bygget <at-date>
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
uiScale:
|
uiScale:
|
||||||
title: Grensesnitt skala
|
title: Grensesnittskala
|
||||||
description: >-
|
description: >-
|
||||||
Endrer størrelsen på brukergrensesnitt. Grensesnittet vil fortsatt skaleres basert på din enhets oppløsning, men denne instillingen styrer mengden den skalerer.
|
Endrer størrelsen på brukergrensesnitt. Grensesnittet vil fortsatt skaleres basert på din enhets oppløsning, men denne instillingen styrer mengden den skalerer.
|
||||||
scales:
|
scales:
|
||||||
@ -655,9 +655,9 @@ settings:
|
|||||||
huge: Gigantisk
|
huge: Gigantisk
|
||||||
|
|
||||||
scrollWheelSensitivity:
|
scrollWheelSensitivity:
|
||||||
title: Forstørrelses sensitivitet
|
title: Forstørrelsessensitivitet
|
||||||
description: >-
|
description: >-
|
||||||
Endrer hvor sensitiv forstørringen er (Enten musehjulet eller trackpad).
|
Endrer hvor sensitiv forstørringen er (Enten musehjulet eller museplate).
|
||||||
sensitivity:
|
sensitivity:
|
||||||
super_slow: Veldig Sakte
|
super_slow: Veldig Sakte
|
||||||
slow: Sakte
|
slow: Sakte
|
||||||
@ -670,7 +670,7 @@ settings:
|
|||||||
description: >-
|
description: >-
|
||||||
Endrer hvor raskt bildet beveger seg når man bruker tastaturet.
|
Endrer hvor raskt bildet beveger seg når man bruker tastaturet.
|
||||||
speeds:
|
speeds:
|
||||||
super_slow: Veldig Sakte slow
|
super_slow: Veldig Sakte
|
||||||
slow: Sakte
|
slow: Sakte
|
||||||
regular: Vanlig
|
regular: Vanlig
|
||||||
fast: Raskt
|
fast: Raskt
|
||||||
@ -690,30 +690,30 @@ settings:
|
|||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: Skru av lyder
|
title: Skru av lyder
|
||||||
description: >-
|
description: >-
|
||||||
Hvis aktivert, skrur av alle lydeffekter.
|
Skrur av alle lydeffekter.
|
||||||
|
|
||||||
musicMuted:
|
musicMuted:
|
||||||
title: Skru av Musikk
|
title: Skru av Musikk
|
||||||
description: >-
|
description: >-
|
||||||
Hvis aktivert, skrur av all musikk.
|
Skrur av all musikk.
|
||||||
|
|
||||||
theme:
|
theme:
|
||||||
title: Spilltema
|
title: Spilltema
|
||||||
description: >-
|
description: >-
|
||||||
Velg spilltema (lys / mørk).
|
Velg spilltema (lyst / mørk).
|
||||||
themes:
|
themes:
|
||||||
dark: Mørk
|
dark: Mørk
|
||||||
light: Lys
|
light: Lyst
|
||||||
|
|
||||||
refreshRate:
|
refreshRate:
|
||||||
title: Simulerings Mål
|
title: Simuleringsmål
|
||||||
description: >-
|
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.
|
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:
|
alwaysMultiplace:
|
||||||
title: Plasser flere
|
title: Plasser flere
|
||||||
description: >-
|
description: >-
|
||||||
Hvis aktivert, alle bygg vil forbli valgt etter plassering inntil du avbryter det. Dette tilsvarer å holde SHIFT nede permanent.
|
Hvis aktivert vil alle bygg forbli valgt etter plassering inntil du avbryter det. Dette tilsvarer å holde SHIFT nede permanent.
|
||||||
|
|
||||||
offerHints:
|
offerHints:
|
||||||
title: Hint & Opplæring
|
title: Hint & Opplæring
|
||||||
@ -723,8 +723,8 @@ settings:
|
|||||||
enableTunnelSmartplace:
|
enableTunnelSmartplace:
|
||||||
title: Smarte Tuneller
|
title: Smarte Tuneller
|
||||||
description: >-
|
description: >-
|
||||||
Når aktivert, plassering av tuneller vil automatisk fjerne unødvendige bånd.
|
Når aktivert vil plassering av tunneler automatisk fjerne unødvendige bånd.
|
||||||
Dette lar deg også dra og slippe tuneller, og overflødige tuneller blir fjernet.
|
Dette lar deg også dra og slippe tunneler, og overflødige tunneler blir fjernet.
|
||||||
vignette:
|
vignette:
|
||||||
title: Vignett
|
title: Vignett
|
||||||
description: >-
|
description: >-
|
||||||
@ -746,21 +746,21 @@ settings:
|
|||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Kompakt Bygningsinformasjon
|
title: Kompakt Bygningsinformasjon
|
||||||
description: >-
|
description: >-
|
||||||
Forkorter informasjonsboksen for bygninger ved å bare vise dems forhold. Ellers
|
Forkorter informasjonsboksen for bygninger ved å bare vise deres forhold. Ellers
|
||||||
vises en beskrivelse og bilde er vist.
|
vises en beskrivelse og et bilde.
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Deaktiverer Kutt/Slette Advarsler
|
title: Deaktiverer Utklipps- og Sletteadvarsler
|
||||||
description: >-
|
description: >-
|
||||||
Deaktiverer advarselsdialogen som kommer frem når du kutter/sletter mer enn 100
|
Deaktiverer advarselsmeldingen som kommer frem når du klipper ut eller sletter mer enn 100
|
||||||
bygninger.
|
bygninger.
|
||||||
|
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Fargeblind Modus
|
title: Fargeblindmodus
|
||||||
description: Aktiverer forskjellige verktøy som lar deg spille spillet om du er fargeblind.
|
description: Aktiverer forskjellige verktøy som lar deg spille spillet om du er fargeblind.
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Roter basert på bygningstype
|
title: Roter basert på bygningstype
|
||||||
description: >-
|
description: >-
|
||||||
Hver bygning type husker rotasjonen du sist brukte individuelt.
|
Hver bygningstype husker rotasjonen du sist brukte på dee.
|
||||||
Dette kan være mer komfortabelt hvis du ofte veksler mellom plassering
|
Dette kan være mer komfortabelt hvis du ofte veksler mellom plassering
|
||||||
av forskjellige bygninger.
|
av forskjellige bygninger.
|
||||||
|
|
||||||
@ -777,8 +777,8 @@ keybindings:
|
|||||||
navigation: Navigering
|
navigation: Navigering
|
||||||
placement: Plassering
|
placement: Plassering
|
||||||
massSelect: Velg Masse
|
massSelect: Velg Masse
|
||||||
buildings: Bygnings Snarvei
|
buildings: Bygningssnarvei
|
||||||
placementModifiers: Plasserings Alternativer
|
placementModifiers: Plasseringsalternativer
|
||||||
|
|
||||||
mappings:
|
mappings:
|
||||||
confirm: Bekreft
|
confirm: Bekreft
|
||||||
@ -798,7 +798,7 @@ keybindings:
|
|||||||
menuOpenStats: Statistikk
|
menuOpenStats: Statistikk
|
||||||
|
|
||||||
toggleHud: Veksle Grensesnitt
|
toggleHud: Veksle Grensesnitt
|
||||||
toggleFPSInfo: Veksle FPS og debug informasjon
|
toggleFPSInfo: Veksle FPS-og debuginformasjon
|
||||||
exportScreenshot: Eksporter hele basen som et bilde
|
exportScreenshot: Eksporter hele basen som et bilde
|
||||||
belt: *belt
|
belt: *belt
|
||||||
splitter: *splitter
|
splitter: *splitter
|
||||||
@ -822,19 +822,19 @@ keybindings:
|
|||||||
massSelectStart: Hold og dra for å starte
|
massSelectStart: Hold og dra for å starte
|
||||||
massSelectSelectMultiple: Velg flere områder
|
massSelectSelectMultiple: Velg flere områder
|
||||||
massSelectCopy: Kopier Område
|
massSelectCopy: Kopier Område
|
||||||
massSelectCut: Kutt ut Område
|
massSelectCut: Klipp ut Område
|
||||||
|
|
||||||
placementDisableAutoOrientation: Deaktiver automatisk orientering
|
placementDisableAutoOrientation: Deaktiver automatisk orientering
|
||||||
placeMultiple: Forbli i plasseringsmodus
|
placeMultiple: Forbli i plasseringsmodus
|
||||||
placeInverse: Inverter automatisk transportbånd orientering
|
placeInverse: Inverter automatisk samlebåndsorientering
|
||||||
lockBeltDirection: Enable belt planner
|
lockBeltDirection: Aktiver samlebåndplanlegger
|
||||||
switchDirectionLockSide: "Planlegger: Bytt side"
|
switchDirectionLockSide: "Planlegger: Bytt side"
|
||||||
pipette: Pipette
|
pipette: Pipette
|
||||||
menuClose: Close Menu
|
menuClose: Lukk meny
|
||||||
switchLayers: Switch layers
|
switchLayers: Bytt lag
|
||||||
advanced_processor: Color Inverter
|
advanced_processor: Fargeinverterer
|
||||||
energy_generator: Energy Generator
|
energy_generator: Energigenerator
|
||||||
wire: Energy Wire
|
wire: Energikabel
|
||||||
|
|
||||||
about:
|
about:
|
||||||
title: Om dette spillet
|
title: Om dette spillet
|
||||||
@ -843,11 +843,11 @@ about:
|
|||||||
|
|
||||||
Hvis du ønsker å bidra, sjekk ut <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
Hvis du ønsker å bidra, sjekk ut <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
||||||
|
|
||||||
Spillet ville ikke vært mulig uten det fantastidke Discord samfunnet rundt spillet mitt - Du burde virkelig bli med på <a href="<discordlink>" target="_blank">Discord serveren</a>!<br><br>
|
Spillet ville ikke vært mulig uten det fantastiske Discord-samfunnet rundt spillet mitt - Du burde virkelig bli med på <a href="<discordlink>" target="_blank">Discord-serveren</a>!<br><br>
|
||||||
|
|
||||||
Lydsporet er laget av <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Han er rå.<br><br>
|
Lydsporet er laget av <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Han er rå.<br><br>
|
||||||
|
|
||||||
Til slutt, stor takk til min beste venn <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Uten våre factorio økter ville ikke dette spillet ha eksistert.
|
Til slutt, en stor takk til min beste venn <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Uten våre factorio-økter ville ikke dette spillet ha eksistert.
|
||||||
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Endringshistorikk
|
title: Endringshistorikk
|
||||||
@ -858,6 +858,6 @@ demo:
|
|||||||
importingGames: Importer lagringsfiler
|
importingGames: Importer lagringsfiler
|
||||||
oneGameLimit: Begrenset til en lagringsfil
|
oneGameLimit: Begrenset til en lagringsfil
|
||||||
customizeKeybindings: Forandre Hurtigtaster
|
customizeKeybindings: Forandre Hurtigtaster
|
||||||
exportingBase: Eksporter hele basen som bile
|
exportingBase: Eksporter hele basen som bilde
|
||||||
|
|
||||||
settingNotAvailable: Ikke tilgjengelig i demoversjonen.
|
settingNotAvailable: Ikke tilgjengelig i demoversjonen.
|
||||||
|
@ -83,7 +83,7 @@ steamPage:
|
|||||||
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Pomóż w tłumaczeniu[/url]
|
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Pomóż w tłumaczeniu[/url]
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
discordLink: Oficjalna Discord - Porozmawiaj ze mną!
|
discordLink: Oficjalny serwer Discord - Porozmawiaj ze mną!
|
||||||
|
|
||||||
global:
|
global:
|
||||||
loading: Ładowanie
|
loading: Ładowanie
|
||||||
@ -274,8 +274,8 @@ dialogs:
|
|||||||
Czy na pewno chcesz kontynuować?
|
Czy na pewno chcesz kontynuować?
|
||||||
|
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: Potwierdź cięcie
|
title: Potwierdź wycinanie
|
||||||
desc: Nie możesz sobie pozwolić na wklejenie tego obszaru! Czy na pewno chcesz to wyciąć?
|
desc: Nie posiadasz wystarczająco kształtów schematów na wklejenie tego obszaru! Czy na pewno chcesz go wyciąć?
|
||||||
|
|
||||||
ingame:
|
ingame:
|
||||||
# This is shown in the top left corner and displays useful keybindings in
|
# This is shown in the top left corner and displays useful keybindings in
|
||||||
@ -299,7 +299,7 @@ ingame:
|
|||||||
copySelection: Skopiuj
|
copySelection: Skopiuj
|
||||||
clearSelection: Wyczyść zaznaczenie
|
clearSelection: Wyczyść zaznaczenie
|
||||||
pipette: Wybierz obiekt z mapy
|
pipette: Wybierz obiekt z mapy
|
||||||
switchLayers: Switch layers
|
switchLayers: Przełącz warstwy
|
||||||
|
|
||||||
# Names of the colors, used for the color blind mode
|
# Names of the colors, used for the color blind mode
|
||||||
colors:
|
colors:
|
||||||
@ -311,7 +311,7 @@ ingame:
|
|||||||
cyan: Cyjanowy
|
cyan: Cyjanowy
|
||||||
white: Biały
|
white: Biały
|
||||||
uncolored: Brak koloru
|
uncolored: Brak koloru
|
||||||
black: Black
|
black: Czarny
|
||||||
|
|
||||||
# Everything related to placing buildings (I.e. as soon as you selected a building
|
# Everything related to placing buildings (I.e. as soon as you selected a building
|
||||||
# from the toolbar)
|
# from the toolbar)
|
||||||
@ -414,7 +414,7 @@ ingame:
|
|||||||
shapeViewer:
|
shapeViewer:
|
||||||
title: Poziomy
|
title: Poziomy
|
||||||
empty: Puste
|
empty: Puste
|
||||||
copyKey: Copy Key
|
copyKey: Skopiuj kod
|
||||||
|
|
||||||
# Interactive tutorial
|
# Interactive tutorial
|
||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
@ -539,25 +539,25 @@ buildings:
|
|||||||
description: Magazynuje obiekty, do określonego limitu. Może zostać użyty jako bramka przepełnienia.
|
description: Magazynuje obiekty, do określonego limitu. Może zostać użyty jako bramka przepełnienia.
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
name: Energy Wire
|
name: Przewód energetyczny
|
||||||
description: Allows you to transport energy.
|
description: Pozwala na transportowanie energii.
|
||||||
advanced_processor:
|
advanced_processor:
|
||||||
default:
|
default:
|
||||||
name: Color Inverter
|
name: Odwracacz kolorów
|
||||||
description: Accepts a color or shape and inverts it.
|
description: Przyjmuje barwnik lub kształt i odwraca jego kolory.
|
||||||
energy_generator:
|
energy_generator:
|
||||||
deliver: Deliver
|
deliver: Dostarcz
|
||||||
toGenerateEnergy: For
|
toGenerateEnergy: Za
|
||||||
default:
|
default:
|
||||||
name: Energy Generator
|
name: Generator energii
|
||||||
description: Generates energy by consuming shapes.
|
description: Generuje energię poprzez zużywanie kształtów.
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: Wire Splitter
|
name: Rozdzielacz przewodów
|
||||||
description: Splits a energy wire into two.
|
description: Rozdziela przewód energetyczny na dwa.
|
||||||
merger:
|
merger:
|
||||||
name: Wire Merger
|
name: Łącznik przewodów
|
||||||
description: Merges two energy wires into one.
|
description: Łączy dwa przewody energetyczne w jeden.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
@ -656,9 +656,9 @@ storyRewards:
|
|||||||
settings:
|
settings:
|
||||||
title: Ustawienia
|
title: Ustawienia
|
||||||
categories:
|
categories:
|
||||||
general: General
|
general: Ogólne
|
||||||
userInterface: User Interface
|
userInterface: Interfejs
|
||||||
advanced: Advanced
|
advanced: Zaawansowane
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Wersja Rozwojowa
|
dev: Wersja Rozwojowa
|
||||||
@ -780,7 +780,7 @@ settings:
|
|||||||
100 budynków.
|
100 budynków.
|
||||||
|
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Tryb ślepy na kolory
|
title: Tryb dla daltonistów
|
||||||
description: Włącza różne narzędzia, które pozwalają ci grać, jeśli jesteś daltonistą.
|
description: Włącza różne narzędzia, które pozwalają ci grać, jeśli jesteś daltonistą.
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Obrót według typu budynku
|
title: Obrót według typu budynku
|
||||||
@ -823,6 +823,7 @@ keybindings:
|
|||||||
|
|
||||||
toggleHud: Przełącz widoczność interfejsu
|
toggleHud: Przełącz widoczność interfejsu
|
||||||
toggleFPSInfo: Pokaż Licznik FPS i informacje do debugowania
|
toggleFPSInfo: Pokaż Licznik FPS i informacje do debugowania
|
||||||
|
|
||||||
belt: *belt
|
belt: *belt
|
||||||
splitter: *splitter
|
splitter: *splitter
|
||||||
underground_belt: *underground_belt
|
underground_belt: *underground_belt
|
||||||
@ -847,7 +848,7 @@ keybindings:
|
|||||||
|
|
||||||
placementDisableAutoOrientation: Wyłącz automatyczną orientację
|
placementDisableAutoOrientation: Wyłącz automatyczną orientację
|
||||||
placeMultiple: Pozostań w trybie stawiania
|
placeMultiple: Pozostań w trybie stawiania
|
||||||
placeInverse: Odwróć automatyczną orientację pasów
|
placeInverse: Odwróć automatyczną orientację taśmociągów
|
||||||
pasteLastBlueprint: Wklej ostatnio skopiowany obszar
|
pasteLastBlueprint: Wklej ostatnio skopiowany obszar
|
||||||
massSelectCut: Wytnij obszar
|
massSelectCut: Wytnij obszar
|
||||||
exportScreenshot: Wyeksportuj całą fabrykę jako zrzut ekranu
|
exportScreenshot: Wyeksportuj całą fabrykę jako zrzut ekranu
|
||||||
@ -856,10 +857,10 @@ keybindings:
|
|||||||
Planowanie taśmociągu: Zmień stronę
|
Planowanie taśmociągu: Zmień stronę
|
||||||
pipette: Wybieranie obiektów z mapy
|
pipette: Wybieranie obiektów z mapy
|
||||||
menuClose: Zamknij Menu
|
menuClose: Zamknij Menu
|
||||||
switchLayers: zamknij menu
|
switchLayers: Przełącz warstwy
|
||||||
advanced_processor: Kolor Falownika
|
advanced_processor: Kolor Falownika
|
||||||
energy_generator: Generator Energii
|
energy_generator: Generator Energii
|
||||||
wire: Drut Energetyczny
|
wire: Przewód Energetyczny
|
||||||
|
|
||||||
about:
|
about:
|
||||||
title: O Grze
|
title: O Grze
|
||||||
|
@ -61,7 +61,7 @@ steamPage:
|
|||||||
[list]
|
[list]
|
||||||
[*] Различные карты и испытания (например, карты с препятствиями)
|
[*] Различные карты и испытания (например, карты с препятствиями)
|
||||||
[*] Пазлы (Доставить запрошенную фигуру с ограничением пространства / набора зданий)
|
[*] Пазлы (Доставить запрошенную фигуру с ограничением пространства / набора зданий)
|
||||||
[*] Режим истории, где здания стоят фигур
|
[*] Режим истории, где здания стоят фигуры
|
||||||
[*] Настраиваемый генератор карт (настройка ресурса / размера фигуры / плотности, семя и т.д.)
|
[*] Настраиваемый генератор карт (настройка ресурса / размера фигуры / плотности, семя и т.д.)
|
||||||
[*] Дополнительные типы фигур
|
[*] Дополнительные типы фигур
|
||||||
[*] Улучшения производительности (игра уже работает довольно хорошо!)
|
[*] Улучшения производительности (игра уже работает довольно хорошо!)
|
||||||
@ -71,7 +71,7 @@ steamPage:
|
|||||||
[b]Это игра с открытым исходным кодом![/b]
|
[b]Это игра с открытым исходным кодом![/b]
|
||||||
|
|
||||||
Любой может внести свой вклад, я активно участвую в жизни сообщества и пытаюсь рассмотреть все предложения и по возможности принять во внимание отзывы.
|
Любой может внести свой вклад, я активно участвую в жизни сообщества и пытаюсь рассмотреть все предложения и по возможности принять во внимание отзывы.
|
||||||
Не забудьте проверить мою доску trello со всеми планами!
|
Не забудьте проверить мою доску Trello со всеми планами!
|
||||||
|
|
||||||
[b]Ссылки[/b]
|
[b]Ссылки[/b]
|
||||||
|
|
||||||
@ -208,7 +208,7 @@ dialogs:
|
|||||||
|
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Сброс управления
|
title: Сброс управления
|
||||||
desc: Это сбросит все настройки управления к их значениям по умолчанию. Пожалуйста подтвердите.
|
desc: Это сбросит все настройки управления к их значениям по умолчанию. Подтвердите это действие.
|
||||||
|
|
||||||
keybindingsResetOk:
|
keybindingsResetOk:
|
||||||
title: Сброс управления
|
title: Сброс управления
|
||||||
@ -236,12 +236,12 @@ dialogs:
|
|||||||
massDeleteConfirm:
|
massDeleteConfirm:
|
||||||
title: Подтвердить удаление
|
title: Подтвердить удаление
|
||||||
desc: >-
|
desc: >-
|
||||||
Вы удаляете много построек (точнее: <count>)! Вы действительно хотите сделать это?
|
Вы собираетесь удалить много построек (точнее: <count>)! Вы действительно хотите сделать это?
|
||||||
|
|
||||||
blueprintsNotUnlocked:
|
blueprintsNotUnlocked:
|
||||||
title: Еще не открыто
|
title: Еще не открыто
|
||||||
desc: >-
|
desc: >-
|
||||||
Чертежи еще не открыты! Завершите больше уровней, что-бы открыть их.
|
Чертежи еще не открыты! Завершите больше уровней, чтобы открыть их.
|
||||||
|
|
||||||
keybindingsIntroduction:
|
keybindingsIntroduction:
|
||||||
title: Полезные горячие клавиши
|
title: Полезные горячие клавиши
|
||||||
@ -262,13 +262,13 @@ dialogs:
|
|||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Подтвердите вырезку
|
title: Подтвердите вырезку
|
||||||
desc: >-
|
desc: >-
|
||||||
Вы вырезаете много зданий (точнее: <count>)! Вы уверены,
|
Вы собираетесь вырезать много зданий (точнее: <count>)! Вы уверены,
|
||||||
что хотите это сделать?
|
что хотите это сделать?
|
||||||
|
|
||||||
exportScreenshotWarning:
|
exportScreenshotWarning:
|
||||||
title: Экспорт скриншота
|
title: Экспорт скриншота
|
||||||
desc: >-
|
desc: >-
|
||||||
Вы запросили экспортировать вашу базу в виде скриншота. Обратите внимание,
|
Вы собираетесь экспортировать вашу базу в виде скриншота. Обратите внимание,
|
||||||
что это может быть довольно медленным процессом для большой базы
|
что это может быть довольно медленным процессом для большой базы
|
||||||
и даже привести к аварийному завершению игры!
|
и даже привести к аварийному завершению игры!
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ ingame:
|
|||||||
title: Производится
|
title: Производится
|
||||||
description: Показывает производящиеся фигуры, включая промежуточное производство.
|
description: Показывает производящиеся фигуры, включая промежуточное производство.
|
||||||
delivered:
|
delivered:
|
||||||
title: Доставлено
|
title: Доставляется
|
||||||
description: Показывает фигуры, которые доставляются в хаб.
|
description: Показывает фигуры, которые доставляются в хаб.
|
||||||
noShapesProduced: Фигуры еще не произведены.
|
noShapesProduced: Фигуры еще не произведены.
|
||||||
|
|
||||||
@ -391,8 +391,8 @@ ingame:
|
|||||||
waypoints:
|
waypoints:
|
||||||
waypoints: Маркеры
|
waypoints: Маркеры
|
||||||
hub: ХАБ
|
hub: ХАБ
|
||||||
description: ЛКМ по маркеру, чтобы переместиться к нему, ПКМ что-бы удалить. <br><br>Нажмите <keybinding> чтобы создать маркер в текущей позиции или <strong>ПКМ</strong> чтобы выбрать другое место для создания маркера.
|
description: ЛКМ по маркеру, чтобы переместиться к нему, ПКМ, чтобы удалить. <br><br>Нажмите <keybinding> чтобы создать маркер в текущей позиции или <strong>ПКМ</strong>, чтобы выбрать другое место для создания маркера.
|
||||||
creationSuccessNotification: Маркер был создан.
|
creationSuccessNotification: Маркер создан.
|
||||||
|
|
||||||
# Interactive tutorial
|
# Interactive tutorial
|
||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
@ -440,7 +440,7 @@ buildings:
|
|||||||
belt:
|
belt:
|
||||||
default:
|
default:
|
||||||
name: &belt Конвейер
|
name: &belt Конвейер
|
||||||
description: Транспортирует предметы, держите и тащите, чтобы разместить несколько.
|
description: Транспортирует предметы. Держите и тащите, чтобы разместить несколько.
|
||||||
|
|
||||||
miner: # Internal name for the Extractor
|
miner: # Internal name for the Extractor
|
||||||
default:
|
default:
|
||||||
@ -448,7 +448,7 @@ buildings:
|
|||||||
description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс.
|
description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс.
|
||||||
|
|
||||||
chainable:
|
chainable:
|
||||||
name: Экстрактор(Цеп.)
|
name: Цеп. экстрактор
|
||||||
description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс. Может последовательно соединяться в цепь.
|
description: Поместите над жилой с фигурами или красителями, чтобы добыть ресурс. Может последовательно соединяться в цепь.
|
||||||
|
|
||||||
underground_belt: # Internal name for the Tunnel
|
underground_belt: # Internal name for the Tunnel
|
||||||
@ -475,11 +475,11 @@ buildings:
|
|||||||
|
|
||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: &cutter Резчик
|
name: &cutter Резак
|
||||||
description: Разрезает фигуры сверху вниз и выводит обе половины. <strong>Используя только одну часть - уничтожьте другую, иначе производство остановится!</strong>
|
description: Разрезает фигуры сверху вниз и выводит обе половины. <strong>Если Вы собираетесь использовать только одну часть, уничтожьте другую, иначе производство остановится!</strong>
|
||||||
quad:
|
quad:
|
||||||
name: Резчик (4Вых.)
|
name: Резак (4Вых.)
|
||||||
description: Разрезает фигуры на четыре части. <strong>Используя не все части - уничтожьте оставшиеся, иначе производство остановится!</strong>
|
description: Разрезает фигуры на четыре части. <strong>Если Вы собираетесь использовать не все части - уничтожьте оставшиеся, иначе производство остановится!</strong>
|
||||||
|
|
||||||
rotater:
|
rotater:
|
||||||
default:
|
default:
|
||||||
@ -519,18 +519,18 @@ buildings:
|
|||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: &trash Мусорка
|
name: &trash Мусорка
|
||||||
description: Имеет входы со всех сторон. Уничтожает все что принимает, навсегда.
|
description: Имеет входы со всех сторон. Уничтожает все принимаемые ресурсы.
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Хранилище
|
name: Хранилище
|
||||||
description: Хранит лишние предметы, до заданной вместимости. Может использоваться в качестве ворот для пропускания излишков.
|
description: Хранит лишние предметы до заданной вместимости. Может использоваться в качестве ворот для пропускания излишков.
|
||||||
hub:
|
hub:
|
||||||
deliver: Доставить
|
deliver: Доставить
|
||||||
toUnlock: чтобы открыть
|
toUnlock: чтобы открыть
|
||||||
levelShortcut: Ур.
|
levelShortcut: Ур.
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
name: Энергетический провод
|
name: Энерг. провод
|
||||||
description: Позволяет транспортировать энергию.
|
description: Позволяет транспортировать энергию.
|
||||||
advanced_processor:
|
advanced_processor:
|
||||||
default:
|
default:
|
||||||
@ -541,7 +541,7 @@ buildings:
|
|||||||
toGenerateEnergy: Для
|
toGenerateEnergy: Для
|
||||||
default:
|
default:
|
||||||
name: Генератор энергии
|
name: Генератор энергии
|
||||||
description: Производит энергию потребляя фигуры.
|
description: Производит энергию из фигур.
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: Разделитель провода
|
name: Разделитель провода
|
||||||
@ -554,7 +554,7 @@ storyRewards:
|
|||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Разрезание Фигур
|
title: Разрезание Фигур
|
||||||
desc: Вы только что открыли <strong>резчик</strong> - он разрезает фигуры пополам <strong>сверху вниз</strong> независимо от их ориентации!<br><br> Обязательно избавьтесь от отходов, иначе <strong>он остановится</strong> - для этого я дал вам мусорку, которая уничтожит все, что в нее поместить!
|
desc: Вы только что открыли <strong>резак</strong> - он разрезает фигуры пополам <strong>сверху вниз</strong> независимо от их ориентации!<br><br> Обязательно избавьтесь от отходов, иначе <strong>он остановится</strong> - для этого я дал вам мусорку, которая уничтожит все, что в нее поместить!
|
||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Вращение
|
title: Вращение
|
||||||
@ -563,7 +563,7 @@ storyRewards:
|
|||||||
reward_painter:
|
reward_painter:
|
||||||
title: Покраска
|
title: Покраска
|
||||||
desc: >-
|
desc: >-
|
||||||
Разблокирован <strong>покрасчик</strong>! Добудьте краситель из жилы (так же как и фигуры) и объедините его с фигурой в покрасчике, чтобы раскрасить ее!<br><br>PS: Если вы дальтоник, то в настройках есть <strong>Режим Дальтоника</strong>!
|
Разблокирован <strong>покрасчик</strong>! Добудьте краситель из жилы (так же, как и фигуры) и объедините его с фигурой в покрасчике, чтобы раскрасить ее!<br><br>PS: Если вы дальтоник, то в настройках есть <strong>Режим Дальтоника</strong>!
|
||||||
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Смешивание Цветов
|
title: Смешивание Цветов
|
||||||
@ -579,11 +579,11 @@ storyRewards:
|
|||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Туннель
|
title: Туннель
|
||||||
desc: Разблокирован <strong>туннель</strong>! Теперь вы можете транспортировать предметы сквозь конвейеры и здания!
|
desc: Разблокирован <strong>туннель</strong>! Теперь вы можете транспортировать предметы под другими конвейерами и зданиями!
|
||||||
|
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: Вращатель (обратный)
|
title: Вращатель (обратный)
|
||||||
desc: Разблокирован вариант <strong>вращателя</strong>, он позволяет вращать фигуры против часовой стрелки! Чтобы построить его, выберите вращатель и <strong>нажмите 'T' чтобы переключаться между вариантами</strong>!
|
desc: Разблокирован вариант <strong>вращателя</strong>, вращающий фигуры против часовой стрелки! Чтобы построить его, выберите вращатель и <strong>нажмите 'T', чтобы переключить вариант</strong>!
|
||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Цепной Экстрактор
|
title: Цепной Экстрактор
|
||||||
@ -595,12 +595,11 @@ storyRewards:
|
|||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Компактный Соединитель
|
title: Компактный Соединитель
|
||||||
desc: >-
|
desc: Разблокирован компактный вариант <strong>разделителя</strong>, объединяющий потоки предметов из двух входов!
|
||||||
Разблокирован компактный вариант <strong>разделителя</strong>, он объединяет воедино потоки предметов из двух входов!
|
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Резчик (4 Выхода)
|
title: Резак (4 Выхода)
|
||||||
desc: Разблокирован вариант <strong>резчика</strong> - он позволяет разрезать фигуры на <strong>четыре части</strong> вместо, всего лишь двух!
|
desc: Разблокирован вариант <strong>резака</strong>, разрезающий фигуры на <strong>четыре части</strong> вместо двух!
|
||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Двойной Покрасчик
|
title: Двойной Покрасчик
|
||||||
@ -620,13 +619,13 @@ storyRewards:
|
|||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Чертежи
|
title: Чертежи
|
||||||
desc: Теперь вы можете <strong>копировать и вставлять</strong> части вашей фабрики! Выберите область (Удерживая CTRL, перетащите мышь) и нажмите 'C' чтобы скопировать ее.<br><br>Вставка <strong>не бесплатна</strong>, чтобы позволить себе это вам необходимо произвести <strong>фигуры для чертежей</strong>! (Которые вы только что доставили).
|
desc: Теперь вы можете <strong>копировать и вставлять</strong> части вашей фабрики! Выберите область (Удерживая CTRL, перетащите мышь) и нажмите 'C', чтобы скопировать ее.<br><br>Вставка <strong>не бесплатна</strong>, для этого необходимо произвести <strong>фигуры для чертежей</strong>! (Которые вы только что доставили).
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Следующий уровень
|
title: Следующий уровень
|
||||||
desc: >-
|
desc: >-
|
||||||
Этот уровень не дал вам награды, но следующий даст! <br><br> PS: Лучше не разрушайте вашу существующую фабрику - Вам понадобятся <strong>все</strong> эти фигуры позже, чтобы <strong>разблокировать улучшения</strong>!
|
Этот уровень не дал вам награды, но следующий даст! <br><br> PS: Лучше не разрушайте вашу существующую фабрику - Вам понадобятся <strong>все</strong> эти фигуры позже, чтобы <strong>разблокировать улучшения</strong>!
|
||||||
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Следующий уровень
|
title: Следующий уровень
|
||||||
@ -737,7 +736,7 @@ settings:
|
|||||||
title: Интервал авто-сохранения
|
title: Интервал авто-сохранения
|
||||||
description: >-
|
description: >-
|
||||||
Управляет тем, как часто игра автоматически сохраняется.
|
Управляет тем, как часто игра автоматически сохраняется.
|
||||||
А также здесь можно полностью отключить авто-сохранение.
|
Также здесь можно полностью отключить авто-сохранение.
|
||||||
intervals:
|
intervals:
|
||||||
one_minute: 1 Минута
|
one_minute: 1 Минута
|
||||||
two_minutes: 2 Минуты
|
two_minutes: 2 Минуты
|
||||||
@ -751,7 +750,7 @@ settings:
|
|||||||
Сокращает отображаемую информацию о зданиях, показывая только их множители.
|
Сокращает отображаемую информацию о зданиях, показывая только их множители.
|
||||||
Иначе информация отображается с описанием и изображением.
|
Иначе информация отображается с описанием и изображением.
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Отключить Предупреждение о Вырезании\Удалении
|
title: Отключить Предупреждение о Вырезании/Удалении
|
||||||
description: >-
|
description: >-
|
||||||
Отключает диалоговые окна с предупреждениями, появляющиеся при
|
Отключает диалоговые окна с предупреждениями, появляющиеся при
|
||||||
вырезании/удалении более 100 объектов.
|
вырезании/удалении более 100 объектов.
|
||||||
@ -844,19 +843,19 @@ about:
|
|||||||
Эта игра с открытым исходным кодом, разработана <a href="https://github.com/tobspr"
|
Эта игра с открытым исходным кодом, разработана <a href="https://github.com/tobspr"
|
||||||
target="_blank">Тобиасом Спрингером</a> (это я).<br><br>
|
target="_blank">Тобиасом Спрингером</a> (это я).<br><br>
|
||||||
|
|
||||||
Если вы хотите внести свой вклад то вам сюда - <a href="<githublink>"
|
Если вы хотите внести свой вклад игре - <a href="<githublink>"
|
||||||
target="_blank">shapez.io в github</a>.<br><br>
|
target="_blank">shapez.io в github</a>.<br><br>
|
||||||
|
|
||||||
Эта игра не была бы возможна без большого сообщества в дискорде, которое собралось
|
Эта игра не была бы возможна без большого сообщества в дискорде, которое собралось
|
||||||
вокруг моих игр - Вы действительно должны присоединиться к <a href="<discordlink>"
|
вокруг моих игр - Вам действительно стоит присоединиться к <a href="<discordlink>"
|
||||||
target="_blank">серверу в дискорде</a>!<br><br>
|
target="_blank">серверу Discord!</a>!<br><br>
|
||||||
|
|
||||||
Саундтрек сделал <a href="https://soundcloud.com/pettersumelius"
|
Саундтрек сделал <a href="https://soundcloud.com/pettersumelius"
|
||||||
target="_blank">Peppsen</a> - Он потрясающий.<br><br>
|
target="_blank">Peppsen</a> - Он потрясающий.<br><br>
|
||||||
|
|
||||||
Наконец, огромное спасибо моему лучшему другу <a
|
Наконец, огромное спасибо моему лучшему другу <a
|
||||||
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Без наших
|
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Без наших
|
||||||
игровых сессий в factorio эта игра никогда не существовала бы.
|
игровых сессий в Factorio эта игра никогда не существовала бы.
|
||||||
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Список изменений
|
title: Список изменений
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
#
|
#
|
||||||
# Prosta4ok_ua 07.07.2020 — 04.08.2020
|
# Prosta4ok_ua 07.07.2020 — 05.09.2020
|
||||||
#
|
#
|
||||||
# Contributing:
|
# Contributing:
|
||||||
#
|
#
|
||||||
@ -31,6 +31,7 @@
|
|||||||
# range дальність
|
# range дальність
|
||||||
# storage сховище
|
# storage сховище
|
||||||
# shape форма
|
# shape форма
|
||||||
|
# layer шар
|
||||||
|
|
||||||
---
|
---
|
||||||
steamPage:
|
steamPage:
|
||||||
@ -272,7 +273,7 @@ dialogs:
|
|||||||
Ось декілька, але обов’язково <strong>ознайомтеся з прив’язками клавіш</strong>!<br><br>
|
Ось декілька, але обов’язково <strong>ознайомтеся з прив’язками клавіш</strong>!<br><br>
|
||||||
<code class='keybinding'>CTRL</code> + тягніть: виділити зону.<br>
|
<code class='keybinding'>CTRL</code> + тягніть: виділити зону.<br>
|
||||||
<code class='keybinding'>SHIFT</code>: тримайте, щоб розмістити декілька одного будинку.<br>
|
<code class='keybinding'>SHIFT</code>: тримайте, щоб розмістити декілька одного будинку.<br>
|
||||||
<code class='keybinding'>ALT</code>: змінити орієнтацію розміщеної конвеєрної стрічки.<br>
|
<code class='keybinding'>ALT</code>: змінити сторону розміщеної конвеєрної стрічки.<br>
|
||||||
|
|
||||||
createMarker:
|
createMarker:
|
||||||
title: Нова позначка
|
title: Нова позначка
|
||||||
@ -367,7 +368,7 @@ ingame:
|
|||||||
# The roman number for each tier
|
# The roman number for each tier
|
||||||
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
|
||||||
|
|
||||||
maximumLevel: МАКСИМАЛЬНИЙ РІВЕНЬ (Швидкість <currentMult>х)
|
maximumLevel: МАКСИМАЛЬНИЙ РІВЕНЬ (Швидкість x<currentMult>)
|
||||||
|
|
||||||
# The "Statistics" window
|
# The "Statistics" window
|
||||||
statistics:
|
statistics:
|
||||||
@ -489,7 +490,7 @@ buildings:
|
|||||||
splitter:
|
splitter:
|
||||||
default:
|
default:
|
||||||
name: &splitter Розподілювач
|
name: &splitter Розподілювач
|
||||||
description: Multifunctional - Evenly distributes all inputs onto all outputs.
|
description: Багатофункціональний. Рівномірно розподіляє все, що входить.
|
||||||
|
|
||||||
compact:
|
compact:
|
||||||
name: З’єднувач
|
name: З’єднувач
|
||||||
@ -526,128 +527,128 @@ buildings:
|
|||||||
stacker:
|
stacker:
|
||||||
default:
|
default:
|
||||||
name: &stacker Укладальник
|
name: &stacker Укладальник
|
||||||
description: Stacks both items. If they can not be merged, the right item is placed above the left item.
|
description: Складає обидва елементи. Якщо їх неможливо об’єднати, правий елемент розміщується над лівим елементом.
|
||||||
|
|
||||||
mixer:
|
mixer:
|
||||||
default:
|
default:
|
||||||
name: &mixer Змішувач кольо8рів
|
name: &mixer Змішувач кольорів
|
||||||
description: Змішує два кольори за допомогою добавки.
|
description: Змішує два кольори за допомогою добавки.
|
||||||
|
|
||||||
painter:
|
painter:
|
||||||
default:
|
default:
|
||||||
name: &painter Painter
|
name: &painter Фарбувач
|
||||||
description: &painter_desc Colors the whole shape on the left input with the color from the top input.
|
description: &painter_desc Забирає форму з лівого входу, а колір з верхнього.
|
||||||
|
|
||||||
mirrored:
|
mirrored:
|
||||||
name: *painter
|
name: *painter
|
||||||
description: *painter_desc
|
description: *painter_desc
|
||||||
|
|
||||||
double:
|
double:
|
||||||
name: Painter (Double)
|
name: Фарбувач (подв.)
|
||||||
description: Colors the shapes on the left inputs with the color from the top input.
|
description: Фарбує фігури, що надійшла з лівого входу, кольором, що надійшов з верхнього.
|
||||||
quad:
|
quad:
|
||||||
name: Painter (Quad)
|
name: Фарбувач (чотири)
|
||||||
description: Allows you to color each quadrant of the shape with a different color.
|
description: Дозволяє вам фарбувати кожну четвертину форми у різний колір.
|
||||||
|
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: &trash Trash
|
name: &trash Смітник
|
||||||
description: Accepts inputs from all sides and destroys them. Forever.
|
description: Приймає форми зі всіх сторін і руйнує їх. Назавжди.
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
name: Storage
|
name: Сховище
|
||||||
description: Stores excess items, up to a given capacity. Can be used as an overflow gate.
|
description: Зберігає зайві предмети до заданої місткості. Може використовуватися для зберігання надлишкових речей.
|
||||||
|
|
||||||
energy_generator:
|
energy_generator:
|
||||||
deliver: Deliver
|
deliver: Доставте
|
||||||
|
|
||||||
# This will be shown before the amount, so for example 'For 123 Energy'
|
# This will be shown before the amount, so for example 'For 123 Energy'
|
||||||
toGenerateEnergy: For
|
toGenerateEnergy: За
|
||||||
|
|
||||||
default:
|
default:
|
||||||
name: &energy_generator Energy Generator
|
name: &energy_generator Енергетичний генератор
|
||||||
description: Generates energy by consuming shapes. Each energy generator requires a different shape.
|
description: Створює енергію споживаючи форми. Кожний енергетичний генератор потрібує свою форму.
|
||||||
|
|
||||||
wire_crossings:
|
wire_crossings:
|
||||||
default:
|
default:
|
||||||
name: &wire_crossings Wire Splitter
|
name: &wire_crossings Дротовий розподілювач
|
||||||
description: Splits a wire into two
|
description: Ділить дріт надвоє.
|
||||||
|
|
||||||
merger:
|
merger:
|
||||||
name: Wire Merger
|
name: Дротовий з’єднувач
|
||||||
description: Merges two wires into one
|
description: Об’єднує два дроти в один.
|
||||||
|
|
||||||
storyRewards:
|
storyRewards:
|
||||||
# Those are the rewards gained from completing the store
|
# Those are the rewards gained from completing the store
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Різання фігур
|
title: Різання фігур
|
||||||
desc: Ви тільки-но розблокували <strong>різця</strong>. Він розрізає фігури наполовину з <strong>вершини до низу</strong> незалежно від його орієнтації!<br><br>Обов’язково позбудьтесь відходів або <strong>він зупиниться</strong>. Для цього є сміттєбак, який знищує все, що входить в нього.
|
desc: Ви тільки-но розблокували <strong>різця</strong>. Він розрізає фігури наполовину з <strong>вершини до низу</strong> незалежно від його орієнтації!<br><br>Обов’язково позбудьтесь відходів або <strong>він зупиниться</strong>. Для цього є смітник, який знищує все, що входить в нього.
|
||||||
|
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotating
|
title: Обертання
|
||||||
desc: The <strong>rotater</strong> has been unlocked! It rotates shapes clockwise by 90 degrees.
|
desc: <strong>Обертач</strong> розблоковано! Він повертає форми за годинниковою стрілкою на 90 градусів.
|
||||||
|
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Painting
|
title: Фарбування
|
||||||
desc: >-
|
desc: >-
|
||||||
The <strong>painter</strong> 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!<br><br>PS: If you are colorblind, there is a <strong>colorblind mode</strong> in the settings!
|
<strong>Фарбувач</strong> розблоковано. Видобудьте трохи кольорів з відповідних жилок (як ви зробили це з формами) і об’єднуйте їх з формами у фарбувачі, щоб розфарбувати форми!<br><br>До речі, якщо ви дальтонік, то в увімкніть <strong>режим високої контрастності</strong> в налаштуваннях!
|
||||||
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Color Mixing
|
title: Змішування кольорів
|
||||||
desc: The <strong>mixer</strong> has been unlocked - Combine two colors using <strong>additive blending</strong> with this building!
|
desc: <strong>Змішування кольорів</strong> розблоковано. Об’єднуйте два кольори у цій будівлі.
|
||||||
|
|
||||||
reward_stacker:
|
reward_stacker:
|
||||||
title: Combiner
|
title: Поєднувач форм
|
||||||
desc: You can now combine shapes with the <strong>combiner</strong>! Both inputs are combined, and if they can be put next to each other, they will be <strong>fused</strong>. If not, the right input is <strong>stacked on top</strong> of the left input!
|
desc: Тепер ви можете поєднувати фігури з <strong>поєднувачем форм</strong>! Форми об’єднуються з двох сторін, і якщо їх можна поставити поруч, вони будуть <strong>з’єднані</strong>. Якщо ні, то форма, що подана з правого входу, <strong>застрягне на горі</strong> лівого входу.
|
||||||
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Splitter/Merger
|
title: Розподілювач (з’єднувач)
|
||||||
desc: Багатофункціональний <strong> балансир </strong> було розблоковано. Його можна використовувати для створення великих фабрик, <strong>розділяючи та об’єднуючи предмети </strong> на кілька стрічок!<br><br>
|
desc: Багатофункціональний <strong>розподілювач</strong> було розблоковано. Його можна використовувати для створення великих фабрик, <strong>розділяючи та об’єднуючи предмети </strong> на кілька стрічок!<br><br>
|
||||||
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunnel
|
title: Тунель
|
||||||
desc: The <strong>tunnel</strong> has been unlocked - You can now tunnel items through belts and buildings with it!
|
desc: <strong>Тунель</strong> розблоковано. Ви можете створювати тунелі для преметів через стрічки і будівлі.
|
||||||
|
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: CCW Rotating
|
title: Обертання проти годинникової стрілки
|
||||||
desc: You have unlocked a variant of the <strong>rotater</strong> - It allows you to rotate shapes counter-clockwise! To build it, select the rotater and <strong>press 'T' to cycle through its variants</strong>!
|
desc: Ви розблокували новий варіант <strong>обертача</strong>. Він дозволяє обертати проти годинникової стрілки! Щоб побудувати його виберіть обертач, <strong>натисніть «T», щоб переглянути всі варіанти, та оберіть потрібний</strong>!
|
||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Chaining Extractor
|
title: Екстрактор (ланцюг.)
|
||||||
desc: You have unlocked the <strong>chaining extractor</strong>! It can <strong>forward its resources</strong> to other extractors so you can more efficiently extract resources!
|
desc: Ви розблокували <strong>ланцюговий екстрактор</strong>! Він може <strong>пересилати свої ресурси</strong> іншим екстракторам, щоб ви могли ефективніше видобувати ресурси!
|
||||||
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunnel Tier II
|
title: Тунель II
|
||||||
desc: You have unlocked a new variant of the <strong>tunnel</strong> - It has a <strong>bigger range</strong>, and you can also mix-n-match those tunnels now!
|
desc: Ви розблокували новий варіант <strong>тунеля</strong>. Він має <strong>більшу дальність</strong>, і ви можете також змішувати і зіставляти ці тунелі!
|
||||||
|
|
||||||
reward_splitter_compact:
|
reward_splitter_compact:
|
||||||
title: Compact Balancer
|
title: Компактний розподілювач
|
||||||
desc: >-
|
desc: >-
|
||||||
You have unlocked a compact variant of the <strong>balancer</strong> - It accepts two inputs and merges them into one belt!
|
Ви розблокували компактний варіант <strong>розподілювача</strong>. Він приймає з двох сторін і об’єднує на одну стрічку!
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Quad Cutting
|
title: Різчик (чотири)
|
||||||
desc: You have unlocked a variant of the <strong>cutter</strong> - It allows you to cut shapes in <strong>four parts</strong> instead of just two!
|
desc: Ви розблокували інший варіант <strong>різчика</strong>. Він може розрізати форми на <strong>чотири частини</strong> замість двох.
|
||||||
|
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Double Painting
|
title: Double Painting
|
||||||
desc: You have unlocked a variant of the <strong>painter</strong> - It works as the regular painter but processes <strong>two shapes at once</strong> consuming just one color instead of two!
|
desc: Ви розблокували інший варіант <strong>фарбувача</strong>. Він працює як звичайний фарбувач, але обробляє <strong>дві фігури одночасно</strong>, споживаючи лише один колір замість двох!
|
||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Quad Painting
|
title: Quad Painting
|
||||||
desc: You have unlocked a variant of the <strong>painter</strong> - It allows you to paint each part of the shape individually!
|
desc: Ви розблокували інший варіант <strong>фарбувача</strong>. Він дозволяє фарбувати кожну частину форми індивідуально!
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Storage Buffer
|
title: Storage Buffer
|
||||||
desc: You have unlocked a variant of the <strong>trash</strong> - It allows you to store items up to a given capacity!
|
desc: Ви розблокували інший варіант <strong>trash</strong> - It allows you to store items up to a given capacity!
|
||||||
|
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Freeplay
|
title: Пісочниця
|
||||||
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)
|
desc: Ви зробили це! Ви розблокували <strong>вільний режим</strong>! Це означає, що форми тут створюватимуться випадкові! Не хвилюйтеся, більше контенту планується для окремого режиму!
|
||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Blueprints
|
title: Креслення
|
||||||
desc: You can now <strong>copy and paste</strong> parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.<br><br>Pasting it is <strong>not free</strong>, you need to produce <strong>blueprint shapes</strong> to afford it! (Those you just delivered).
|
desc: Ви вже можете <strong>копіювати і вставляти</strong> частини вашої фабрики. Виберіть зону (утримуйте CTRL, а тоді тягніть мишою), і натисніть «C», щоб скопіювати.<br><br>Вставляти креслення — <strong>річ не безкоштовна</strong>, спочатку вам потрібно створити <strong>форми креслень</strong>, щоб собі це дозволити! (ті, що ви щойно доставили).
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
@ -668,10 +669,10 @@ settings:
|
|||||||
advanced: Передове
|
advanced: Передове
|
||||||
|
|
||||||
versionBadges:
|
versionBadges:
|
||||||
dev: Development
|
dev: Розробка
|
||||||
staging: Staging
|
staging: Тестування
|
||||||
prod: Production
|
prod: Виробництво
|
||||||
buildDate: Built <at-date>
|
buildDate: Створено <at-date>
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
uiScale:
|
uiScale:
|
||||||
@ -724,7 +725,7 @@ settings:
|
|||||||
language:
|
language:
|
||||||
title: Мова
|
title: Мова
|
||||||
description: >-
|
description: >-
|
||||||
Змініть мову. Усі переклади зроблені користувачами і можуть бути незавершеними!
|
Зміна мови. Усі переклади зроблені користувачами і можуть бути незавершеними!
|
||||||
|
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Режим високої контрастності
|
title: Режим високої контрастності
|
||||||
@ -770,55 +771,55 @@ settings:
|
|||||||
Якщо увімкнено, то пропонує підказки та посібники під час гри. Також приховує певні елементи інтерфейсу до заданого рівня, щоб полегшити потрапляння в гру.
|
Якщо увімкнено, то пропонує підказки та посібники під час гри. Також приховує певні елементи інтерфейсу до заданого рівня, щоб полегшити потрапляння в гру.
|
||||||
|
|
||||||
enableTunnelSmartplace:
|
enableTunnelSmartplace:
|
||||||
title: Розумні Tunnels
|
title: Розумні тунелі
|
||||||
description: >-
|
description: >-
|
||||||
When enabled, placing tunnels will automatically remove unnecessary belts. This also enables you to drag tunnels and excess tunnels will get removed.
|
Якщо увімкнено, то розміщення тунелів видалить непотрібні стрічки. Це також дозволяє вам перетягувати тунелі і видаляти автоматично зайві тунелі.
|
||||||
|
|
||||||
vignette:
|
vignette:
|
||||||
title: Vignette
|
title: Віньєтка
|
||||||
description: >-
|
description: >-
|
||||||
Enables the vignette, which darkens the screen corners and makes text easier to read.
|
Вмикає віньєтку, яка затемнює кути екрану і робить текст легшим для читання.
|
||||||
|
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Rotation by building type
|
title: Обертання за типом будівлі
|
||||||
description: >-
|
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.
|
Кожний тип будівлі запам’ятовує обертання, яке ви встановили. Це може бути зручнішим, якщо ви часто перемикаєтесь між розміщенням різних типів будівель.
|
||||||
|
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Compact Building Infos
|
title: Компактна інформація про будівлі
|
||||||
description: >-
|
description: >-
|
||||||
Shortens info boxes for buildings by only showing their ratios. Otherwise a description and image is shown.
|
Скорочує інформаційні поля для будівель, лише показуючи їх співвідношення. В іншому випадку відображається опис та зображення.
|
||||||
|
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Disable Cut/Delete Warnings
|
title: Вимкнути попердження про вирізання та видалення
|
||||||
description: >-
|
description: >-
|
||||||
Disables the warning dialogs brought up when cutting/deleting more than 100 entities.
|
Вимикає діалогові вікна попередження, що з’являються під час вирізання/видалення більше 100 об’єктів.
|
||||||
|
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Гарячі клавіши
|
title: Гарячі клавіши
|
||||||
hint: >-
|
hint: >-
|
||||||
Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options.
|
Tip: Упевніться, що ви можете використовувати CTRL, SHIFT і ALT! Вони дозволяють різні варіанти розміщення.
|
||||||
|
|
||||||
resetKeybindings: Скинути гарячі клавіші
|
resetKeybindings: Скинути гарячі клавіші
|
||||||
|
|
||||||
categoryLabels:
|
categoryLabels:
|
||||||
general: Застосунок
|
general: Застосунок
|
||||||
ingame: Гра
|
ingame: Гра
|
||||||
navigation: Navigating
|
navigation: Навігація
|
||||||
placement: Placement
|
placement: Розміщення
|
||||||
massSelect: Mass Select
|
massSelect: Масовий вибір
|
||||||
buildings: Building Shortcuts
|
buildings: Гарячі клавіши будівництва
|
||||||
placementModifiers: Placement Modifiers
|
placementModifiers: Модифікатори розміщення
|
||||||
|
|
||||||
mappings:
|
mappings:
|
||||||
confirm: Підтвердити
|
confirm: Підтвердити
|
||||||
back: Назад
|
back: Назад
|
||||||
mapMoveUp: Move Up
|
mapMoveUp: Угору
|
||||||
mapMoveRight: Move Right
|
mapMoveRight: Праворуч
|
||||||
mapMoveDown: Move Down
|
mapMoveDown: Униз
|
||||||
mapMoveLeft: Move Left
|
mapMoveLeft: Ліворуч
|
||||||
mapMoveFaster: Move Faster
|
mapMoveFaster: Пришвидшитися
|
||||||
centerMap: Center Map
|
centerMap: Центрувати мапу
|
||||||
|
|
||||||
mapZoomIn: Приблизити
|
mapZoomIn: Приблизити
|
||||||
mapZoomOut: Віддалити
|
mapZoomOut: Віддалити
|
||||||
@ -828,10 +829,10 @@ keybindings:
|
|||||||
menuOpenStats: Статистика
|
menuOpenStats: Статистика
|
||||||
menuClose: Закрити меню
|
menuClose: Закрити меню
|
||||||
|
|
||||||
toggleHud: Toggle HUD
|
toggleHud: Перемкнути користувацький інтерфейс
|
||||||
toggleFPSInfo: Toggle FPS and Debug Info
|
toggleFPSInfo: Перемкнути інформацію про FPS та зневадження
|
||||||
switchLayers: Switch layers
|
switchLayers: Перемкнути шари
|
||||||
exportScreenshot: Export whole Base as Image
|
exportScreenshot: Експортувати цілу базу у вигляді зображення
|
||||||
belt: *belt
|
belt: *belt
|
||||||
splitter: *splitter
|
splitter: *splitter
|
||||||
underground_belt: *underground_belt
|
underground_belt: *underground_belt
|
||||||
@ -846,26 +847,26 @@ keybindings:
|
|||||||
trash: *trash
|
trash: *trash
|
||||||
wire: *wire
|
wire: *wire
|
||||||
|
|
||||||
pipette: Pipetteї
|
pipette: Піпетка
|
||||||
rotateWhilePlacing: Повернути
|
rotateWhilePlacing: Повернути
|
||||||
rotateInverseModifier: >-
|
rotateInverseModifier: >-
|
||||||
Modifier: Rotate CCW instead
|
Modifier: Повернути проти годинникової стрілки натомість
|
||||||
cycleBuildingVariants: Cycle Variants
|
cycleBuildingVariants: Повторювати варіанти циклічно
|
||||||
confirmMassDelete: Видалити ділянку
|
confirmMassDelete: Видалити ділянку
|
||||||
pasteLastBlueprint: Paste last blueprint
|
pasteLastBlueprint: Вставити останнє креслення
|
||||||
cycleBuildings: Cycle Buildings
|
cycleBuildings: Перемикання будівль
|
||||||
lockBeltDirection: Enable belt planner
|
lockBeltDirection: Увімкнути планувальник конвеєрних стрічок
|
||||||
switchDirectionLockSide: >-
|
switchDirectionLockSide: >-
|
||||||
Planner: Switch side
|
Planner: Змінити сторону
|
||||||
|
|
||||||
massSelectStart: Hold and drag to start
|
massSelectStart: Утримуйте і перетягуйте, щоб розпочати
|
||||||
massSelectSelectMultiple:
|
massSelectSelectMultiple:
|
||||||
massSelectCopy: Копіювати ділянку
|
massSelectCopy: Копіювати ділянку
|
||||||
massSelectCut: Вирізати ділянку
|
massSelectCut: Вирізати ділянку
|
||||||
|
|
||||||
placementDisableAutoOrientation: Вимкнути автоматичну орієнтацію
|
placementDisableAutoOrientation: Вимкнути автоматичну орієнтацію
|
||||||
placeMultiple: Stay in placement mode
|
placeMultiple: Залишатися у режимі розміщення
|
||||||
placeInverse: Invert automatic belt orientation
|
placeInverse: Перевернути автоматичну орієнтацію стрічки
|
||||||
|
|
||||||
about:
|
about:
|
||||||
title: Про гру
|
title: Про гру
|
||||||
|
Loading…
Reference in New Issue
Block a user