1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-06-13 13:04:03 +00:00
This commit is contained in:
Pascal Grossé 2020-08-04 11:28:13 +02:00
commit 36f3e21d61
116 changed files with 2963 additions and 2581 deletions

View File

@ -44,3 +44,10 @@ jobs:
uses: ibiqlik/action-yamllint@v1.0.0 uses: ibiqlik/action-yamllint@v1.0.0
with: with:
file_or_dir: translations/*.yaml file_or_dir: translations/*.yaml
- name: TSLint
run: |
cd gulp
yarn gulp translations.fullBuild
cd ..
yarn tslint

View File

@ -50,7 +50,7 @@ If you want to add a new feature or in generally contribute I recommend to get i
### Code ### Code
The game is based on a custom engine which itself is based on the YORG.io 3 game egine (Actually it shares almost the same core). The game is based on a custom engine which itself is based on the YORG.io 3 game engine (Actually it shares almost the same core).
The code within the engine is relatively clean with some code for the actual game on top being hacky. The code within the engine is relatively clean with some code for the actual game on top being hacky.
This project is based on ES5. Some ES2015 features are used but most of them are too slow, especially when polyfilled. For example, `Array.prototype.forEach` is only used within non-critical loops since its slower than a plain for loop. This project is based on ES5. Some ES2015 features are used but most of them are too slow, especially when polyfilled. For example, `Array.prototype.forEach` is only used within non-critical loops since its slower than a plain for loop.

View File

@ -47,14 +47,13 @@
"query-string": "^6.8.1", "query-string": "^6.8.1",
"rusha": "^0.8.13", "rusha": "^0.8.13",
"serialize-error": "^3.0.0", "serialize-error": "^3.0.0",
"sloc": "^0.2.1",
"strictdom": "^1.0.1", "strictdom": "^1.0.1",
"string-replace-webpack-plugin": "^0.1.3", "string-replace-webpack-plugin": "^0.1.3",
"terser-webpack-plugin": "^1.1.0", "terser-webpack-plugin": "^1.1.0",
"through2": "^3.0.1", "through2": "^3.0.1",
"uglify-template-string-loader": "^1.1.0", "uglify-template-string-loader": "^1.1.0",
"unused-files-webpack-plugin": "^3.4.0", "unused-files-webpack-plugin": "^3.4.0",
"webpack": "^4.31.0", "webpack": "^4.43.0",
"webpack-bundle-analyzer": "^3.0.3", "webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "^3.1.0", "webpack-cli": "^3.1.0",
"webpack-deep-scope-plugin": "^1.6.0", "webpack-deep-scope-plugin": "^1.6.0",
@ -114,7 +113,7 @@
"speed-measure-webpack-plugin": "^1.3.1", "speed-measure-webpack-plugin": "^1.3.1",
"strip-json-comments": "^3.0.1", "strip-json-comments": "^3.0.1",
"trim": "^0.0.1", "trim": "^0.0.1",
"webpack-stream": "^5.1.0", "webpack-stream": "^5.2.1",
"yaml-loader": "^0.6.0" "yaml-loader": "^0.6.0"
} }
} }

View File

@ -94,16 +94,6 @@ module.exports = ({ watch = false, standalone = false }) => {
}, },
], ],
}, },
{
test: /\.worker\.js$/,
use: {
loader: "worker-loader",
options: {
fallback: false,
inline: true,
},
},
},
{ {
test: /\.ya?ml$/, test: /\.ya?ml$/,
type: "json", // Required by Webpack v4 type: "json", // Required by Webpack v4

View File

@ -1163,150 +1163,149 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
"@webassemblyjs/ast@1.8.5": "@webassemblyjs/ast@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
dependencies: dependencies:
"@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/helper-module-context" "1.9.0"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5" "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
"@webassemblyjs/wast-parser" "1.8.5" "@webassemblyjs/wast-parser" "1.9.0"
"@webassemblyjs/floating-point-hex-parser@1.8.5": "@webassemblyjs/floating-point-hex-parser@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
"@webassemblyjs/helper-api-error@1.8.5": "@webassemblyjs/helper-api-error@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
"@webassemblyjs/helper-buffer@1.8.5": "@webassemblyjs/helper-buffer@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
"@webassemblyjs/helper-code-frame@1.8.5": "@webassemblyjs/helper-code-frame@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
dependencies: dependencies:
"@webassemblyjs/wast-printer" "1.8.5" "@webassemblyjs/wast-printer" "1.9.0"
"@webassemblyjs/helper-fsm@1.8.5": "@webassemblyjs/helper-fsm@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
"@webassemblyjs/helper-module-context@1.8.5": "@webassemblyjs/helper-module-context@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
mamacro "^0.0.3"
"@webassemblyjs/helper-wasm-bytecode@1.8.5": "@webassemblyjs/helper-wasm-bytecode@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
"@webassemblyjs/helper-wasm-section@1.8.5": "@webassemblyjs/helper-wasm-section@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-buffer" "1.8.5" "@webassemblyjs/helper-buffer" "1.9.0"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5" "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
"@webassemblyjs/wasm-gen" "1.8.5" "@webassemblyjs/wasm-gen" "1.9.0"
"@webassemblyjs/ieee754@1.8.5": "@webassemblyjs/ieee754@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
dependencies: dependencies:
"@xtuc/ieee754" "^1.2.0" "@xtuc/ieee754" "^1.2.0"
"@webassemblyjs/leb128@1.8.5": "@webassemblyjs/leb128@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
dependencies: dependencies:
"@xtuc/long" "4.2.2" "@xtuc/long" "4.2.2"
"@webassemblyjs/utf8@1.8.5": "@webassemblyjs/utf8@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
"@webassemblyjs/wasm-edit@1.8.5": "@webassemblyjs/wasm-edit@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-buffer" "1.8.5" "@webassemblyjs/helper-buffer" "1.9.0"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5" "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
"@webassemblyjs/helper-wasm-section" "1.8.5" "@webassemblyjs/helper-wasm-section" "1.9.0"
"@webassemblyjs/wasm-gen" "1.8.5" "@webassemblyjs/wasm-gen" "1.9.0"
"@webassemblyjs/wasm-opt" "1.8.5" "@webassemblyjs/wasm-opt" "1.9.0"
"@webassemblyjs/wasm-parser" "1.8.5" "@webassemblyjs/wasm-parser" "1.9.0"
"@webassemblyjs/wast-printer" "1.8.5" "@webassemblyjs/wast-printer" "1.9.0"
"@webassemblyjs/wasm-gen@1.8.5": "@webassemblyjs/wasm-gen@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5" "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
"@webassemblyjs/ieee754" "1.8.5" "@webassemblyjs/ieee754" "1.9.0"
"@webassemblyjs/leb128" "1.8.5" "@webassemblyjs/leb128" "1.9.0"
"@webassemblyjs/utf8" "1.8.5" "@webassemblyjs/utf8" "1.9.0"
"@webassemblyjs/wasm-opt@1.8.5": "@webassemblyjs/wasm-opt@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-buffer" "1.8.5" "@webassemblyjs/helper-buffer" "1.9.0"
"@webassemblyjs/wasm-gen" "1.8.5" "@webassemblyjs/wasm-gen" "1.9.0"
"@webassemblyjs/wasm-parser" "1.8.5" "@webassemblyjs/wasm-parser" "1.9.0"
"@webassemblyjs/wasm-parser@1.8.5": "@webassemblyjs/wasm-parser@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-api-error" "1.8.5" "@webassemblyjs/helper-api-error" "1.9.0"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5" "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
"@webassemblyjs/ieee754" "1.8.5" "@webassemblyjs/ieee754" "1.9.0"
"@webassemblyjs/leb128" "1.8.5" "@webassemblyjs/leb128" "1.9.0"
"@webassemblyjs/utf8" "1.8.5" "@webassemblyjs/utf8" "1.9.0"
"@webassemblyjs/wast-parser@1.8.5": "@webassemblyjs/wast-parser@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/floating-point-hex-parser" "1.8.5" "@webassemblyjs/floating-point-hex-parser" "1.9.0"
"@webassemblyjs/helper-api-error" "1.8.5" "@webassemblyjs/helper-api-error" "1.9.0"
"@webassemblyjs/helper-code-frame" "1.8.5" "@webassemblyjs/helper-code-frame" "1.9.0"
"@webassemblyjs/helper-fsm" "1.8.5" "@webassemblyjs/helper-fsm" "1.9.0"
"@xtuc/long" "4.2.2" "@xtuc/long" "4.2.2"
"@webassemblyjs/wast-printer@1.8.5": "@webassemblyjs/wast-printer@1.9.0":
version "1.8.5" version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/wast-parser" "1.8.5" "@webassemblyjs/wast-parser" "1.9.0"
"@xtuc/long" "4.2.2" "@xtuc/long" "4.2.2"
"@xtuc/ieee754@^1.2.0": "@xtuc/ieee754@^1.2.0":
@ -1379,11 +1378,16 @@ acorn@^5.0.3, acorn@^5.5.0, acorn@^5.6.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7, acorn@^6.2.1: acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
acorn@^6.4.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
after@0.8.2: after@0.8.2:
version "0.8.2" version "0.8.2"
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
@ -1900,13 +1904,6 @@ async@~1.0.0:
resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
async@~2.1.4:
version "2.1.5"
resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=
dependencies:
lodash "^4.14.0"
asynckit@^0.4.0: asynckit@^0.4.0:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -2824,7 +2821,7 @@ check-types@^8.0.3:
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
chokidar@^2.0.0, chokidar@^2.0.2: chokidar@^2.0.0, chokidar@^2.1.8:
version "2.1.8" version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
@ -2843,7 +2840,7 @@ chokidar@^2.0.0, chokidar@^2.0.2:
optionalDependencies: optionalDependencies:
fsevents "^1.2.7" fsevents "^1.2.7"
chokidar@^3.4.1: chokidar@^3.4.0, chokidar@^3.4.1:
version "3.4.1" version "3.4.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
@ -2944,13 +2941,6 @@ cli-cursor@^2.1.0:
dependencies: dependencies:
restore-cursor "^2.0.0" restore-cursor "^2.0.0"
cli-table@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM=
dependencies:
colors "1.0.3"
cli-width@^2.0.0: cli-width@^2.0.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
@ -3115,7 +3105,7 @@ color@^3.0.0:
color-convert "^1.9.1" color-convert "^1.9.1"
color-string "^1.5.2" color-string "^1.5.2"
colors@1.0.3, colors@1.0.x: colors@1.0.x:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
@ -3159,13 +3149,6 @@ commander@~2.8.1:
dependencies: dependencies:
graceful-readlink ">= 1.0.0" graceful-readlink ">= 1.0.0"
commander@~2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
dependencies:
graceful-readlink ">= 1.0.0"
commondir@^1.0.1: commondir@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@ -7978,7 +7961,7 @@ loader-runner@^2.4.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
loader-utils@1.2.3, loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3: loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3:
version "1.2.3" version "1.2.3"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
@ -7997,7 +7980,7 @@ loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2
json5 "^0.5.0" json5 "^0.5.0"
object-assign "^4.0.1" object-assign "^4.0.1"
loader-utils@^1.4.0: loader-utils@^1.0.0, loader-utils@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@ -8341,7 +8324,7 @@ lodash@^3.0.1:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10: lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10:
version "4.17.15" version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -8468,11 +8451,6 @@ make-iterator@^1.0.0:
dependencies: dependencies:
kind-of "^6.0.2" kind-of "^6.0.2"
mamacro@^0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
map-age-cleaner@^0.1.1: map-age-cleaner@^0.1.1:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
@ -11024,7 +11002,7 @@ querystring@0.2.0:
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@ -11204,7 +11182,7 @@ readable-stream@^3.0.2, readable-stream@^3.1.1:
string_decoder "^1.1.1" string_decoder "^1.1.1"
util-deprecate "^1.0.1" util-deprecate "^1.0.1"
readdirp@^2.1.0, readdirp@^2.2.1: readdirp@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
@ -11880,6 +11858,13 @@ serialize-javascript@^1.7.0:
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
serialize-javascript@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
dependencies:
randombytes "^2.1.0"
serve-index@1.9.1, serve-index@^1.1.4: serve-index@1.9.1, serve-index@^1.1.4:
version "1.9.1" version "1.9.1"
resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
@ -12021,16 +12006,6 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0" astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0" is-fullwidth-code-point "^2.0.0"
sloc@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e"
integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A==
dependencies:
async "~2.1.4"
cli-table "^0.3.1"
commander "~2.9.0"
readdirp "^2.1.0"
snapdragon-node@^2.0.1: snapdragon-node@^2.0.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@ -12839,7 +12814,7 @@ ternary-stream@^3.0.0:
merge-stream "^2.0.0" merge-stream "^2.0.0"
through2 "^3.0.1" through2 "^3.0.1"
terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1: terser-webpack-plugin@^1.1.0:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
@ -12854,6 +12829,21 @@ terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1:
webpack-sources "^1.4.0" webpack-sources "^1.4.0"
worker-farm "^1.7.0" worker-farm "^1.7.0"
terser-webpack-plugin@^1.4.3:
version "1.4.4"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
dependencies:
cacache "^12.0.2"
find-cache-dir "^2.1.0"
is-wsl "^1.1.0"
schema-utils "^1.0.0"
serialize-javascript "^3.1.0"
source-map "^0.6.1"
terser "^4.1.2"
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
terser@^4.0.0, terser@^4.1.2: terser@^4.0.0, terser@^4.1.2:
version "4.3.1" version "4.3.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65" resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65"
@ -13715,14 +13705,23 @@ watch@^0.11.0:
resolved "https://registry.yarnpkg.com/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406" resolved "https://registry.yarnpkg.com/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406"
integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY= integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=
watchpack@^1.6.0: watchpack-chokidar2@^2.0.0:
version "1.6.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
dependencies:
chokidar "^2.1.8"
watchpack@^1.6.1:
version "1.7.2"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
dependencies: dependencies:
chokidar "^2.0.2"
graceful-fs "^4.1.2" graceful-fs "^4.1.2"
neo-async "^2.5.0" neo-async "^2.5.0"
optionalDependencies:
chokidar "^3.4.0"
watchpack-chokidar2 "^2.0.0"
webidl-conversions@^4.0.2: webidl-conversions@^4.0.2:
version "4.0.2" version "4.0.2"
@ -13785,7 +13784,7 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1:
source-list-map "^2.0.0" source-list-map "^2.0.0"
source-map "~0.6.1" source-map "~0.6.1"
webpack-stream@^5.1.0: webpack-stream@^5.2.1:
version "5.2.1" version "5.2.1"
resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39" resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39"
integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A== integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A==
@ -13807,16 +13806,16 @@ webpack-strip-block@^0.2.0:
dependencies: dependencies:
loader-utils "^1.1.0" loader-utils "^1.1.0"
webpack@^4.26.1, webpack@^4.31.0: webpack@^4.26.1, webpack@^4.43.0:
version "4.40.2" version "4.43.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.40.2.tgz#d21433d250f900bf0facbabe8f50d585b2dc30a7" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
integrity sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A== integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.9.0"
"@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/helper-module-context" "1.9.0"
"@webassemblyjs/wasm-edit" "1.8.5" "@webassemblyjs/wasm-edit" "1.9.0"
"@webassemblyjs/wasm-parser" "1.8.5" "@webassemblyjs/wasm-parser" "1.9.0"
acorn "^6.2.1" acorn "^6.4.1"
ajv "^6.10.2" ajv "^6.10.2"
ajv-keywords "^3.4.1" ajv-keywords "^3.4.1"
chrome-trace-event "^1.0.2" chrome-trace-event "^1.0.2"
@ -13827,13 +13826,13 @@ webpack@^4.26.1, webpack@^4.31.0:
loader-utils "^1.2.3" loader-utils "^1.2.3"
memory-fs "^0.4.1" memory-fs "^0.4.1"
micromatch "^3.1.10" micromatch "^3.1.10"
mkdirp "^0.5.1" mkdirp "^0.5.3"
neo-async "^2.6.1" neo-async "^2.6.1"
node-libs-browser "^2.2.1" node-libs-browser "^2.2.1"
schema-utils "^1.0.0" schema-utils "^1.0.0"
tapable "^1.1.3" tapable "^1.1.3"
terser-webpack-plugin "^1.4.1" terser-webpack-plugin "^1.4.3"
watchpack "^1.6.0" watchpack "^1.6.1"
webpack-sources "^1.4.1" webpack-sources "^1.4.1"
websocket-driver@>=0.3.6: websocket-driver@>=0.3.6:

View File

@ -52,14 +52,13 @@
"query-string": "^6.8.1", "query-string": "^6.8.1",
"rusha": "^0.8.13", "rusha": "^0.8.13",
"serialize-error": "^3.0.0", "serialize-error": "^3.0.0",
"sloc": "^0.2.1",
"strictdom": "^1.0.1", "strictdom": "^1.0.1",
"string-replace-webpack-plugin": "^0.1.3", "string-replace-webpack-plugin": "^0.1.3",
"terser-webpack-plugin": "^1.1.0", "terser-webpack-plugin": "^1.1.0",
"typescript": "3.9.3", "typescript": "3.9.3",
"uglify-template-string-loader": "^1.1.0", "uglify-template-string-loader": "^1.1.0",
"unused-files-webpack-plugin": "^3.4.0", "unused-files-webpack-plugin": "^3.4.0",
"webpack": "^4.31.0", "webpack": "^4.43.0",
"webpack-bundle-analyzer": "^3.0.3", "webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "^3.1.0", "webpack-cli": "^3.1.0",
"webpack-deep-scope-plugin": "^1.6.0", "webpack-deep-scope-plugin": "^1.6.0",
@ -97,6 +96,6 @@
"speed-measure-webpack-plugin": "^1.3.1", "speed-measure-webpack-plugin": "^1.3.1",
"strip-json-comments": "^3.0.1", "strip-json-comments": "^3.0.1",
"trim": "^0.0.1", "trim": "^0.0.1",
"webpack-stream": "^5.1.0" "yarn": "^1.22.4"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 KiB

After

Width:  |  Height:  |  Size: 523 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -449,6 +449,7 @@
<key type="filename">sprites/blueprints/miner-chainable.png</key> <key type="filename">sprites/blueprints/miner-chainable.png</key>
<key type="filename">sprites/blueprints/miner.png</key> <key type="filename">sprites/blueprints/miner.png</key>
<key type="filename">sprites/blueprints/rotater-ccw.png</key> <key type="filename">sprites/blueprints/rotater-ccw.png</key>
<key type="filename">sprites/blueprints/rotater-fl.png</key>
<key type="filename">sprites/blueprints/rotater.png</key> <key type="filename">sprites/blueprints/rotater.png</key>
<key type="filename">sprites/blueprints/splitter-compact-inverse.png</key> <key type="filename">sprites/blueprints/splitter-compact-inverse.png</key>
<key type="filename">sprites/blueprints/splitter-compact.png</key> <key type="filename">sprites/blueprints/splitter-compact.png</key>
@ -459,6 +460,7 @@
<key type="filename">sprites/blueprints/underground_belt_exit.png</key> <key type="filename">sprites/blueprints/underground_belt_exit.png</key>
<key type="filename">sprites/buildings/miner-chainable.png</key> <key type="filename">sprites/buildings/miner-chainable.png</key>
<key type="filename">sprites/buildings/rotater-ccw.png</key> <key type="filename">sprites/buildings/rotater-ccw.png</key>
<key type="filename">sprites/buildings/rotater-fl.png</key>
<key type="filename">sprites/buildings/splitter-compact-inverse.png</key> <key type="filename">sprites/buildings/splitter-compact-inverse.png</key>
<key type="filename">sprites/buildings/splitter-compact.png</key> <key type="filename">sprites/buildings/splitter-compact.png</key>
<key type="filename">sprites/buildings/underground_belt_entry-tier2.png</key> <key type="filename">sprites/buildings/underground_belt_entry-tier2.png</key>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -73,6 +73,9 @@ body {
scrollbar-face-color: #888; scrollbar-face-color: #888;
scrollbar-track-color: rgba(255, 255, 255, 0.1); scrollbar-track-color: rgba(255, 255, 255, 0.1);
// Firefox
scrollbar-color: #cdd0d4 rgba(#000, 0.05);
overflow: hidden; overflow: hidden;
@include Text; @include Text;
@ -369,7 +372,7 @@ canvas {
} }
.pressed { .pressed {
transform: scale(0.95) !important; transform: scale(0.98) !important;
animation: none !important; animation: none !important;
} }

View File

@ -29,7 +29,6 @@
.buildings { .buildings {
display: grid; display: grid;
grid-auto-flow: column; grid-auto-flow: column;
@include S(margin-bottom, 2px);
.building { .building {
color: $accentColorDark; color: $accentColorDark;
@ -43,7 +42,7 @@
@include S(width, 35px); @include S(width, 35px);
@include S(height, 40px); @include S(height, 40px);
background: center center / 70% no-repeat; background: center center / 65% no-repeat;
&:not(.unlocked) { &:not(.unlocked) {
@include S(width, 20px); @include S(width, 20px);

View File

@ -55,6 +55,7 @@
.dialogInner { .dialogInner {
opacity: 1; opacity: 1;
} }
backdrop-filter: blur(D(3px));
} }
.dialogInner { .dialogInner {

View File

@ -1,6 +1,23 @@
#state_AboutState { #state_AboutState {
> .container .content { > .container .content {
@include S(max-width, 600px);
@include PlainText; @include PlainText;
padding: 0;
background: transparent;
}
.head {
@include S(padding, 20px);
img {
display: block;
margin: 0 auto;
@include S(max-width, 200px);
}
}
.text {
@include S(margin, 10px);
} }
a { a {

View File

@ -1,5 +1,6 @@
#state_ChangelogState { #state_ChangelogState {
.content { .content {
@include S(max-width, 800px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }

View File

@ -55,7 +55,7 @@
opacity: 0; opacity: 0;
display: none; display: none;
transform: translate(50%, 50%); transform: translate(50%, 50%);
filter: blur(10px); filter: blur(D(3px));
$opacity: 0.2; $opacity: 0.2;
&.loaded { &.loaded {
@ -178,6 +178,10 @@
transform: translateX(50%) rotate(-7deg) scale(1.1); transform: translateX(50%) rotate(-7deg) scale(1.1);
} }
} }
@include DarkThemeOverride {
color: $colorBlueBright;
}
} }
} }
@ -201,33 +205,6 @@
flex-grow: 1; flex-grow: 1;
@include S(margin-bottom, 10px); @include S(margin-bottom, 10px);
} }
.contest {
flex-grow: 1;
background: rgb(32, 187, 166);
@include S(padding, 15px);
h3 {
@include Heading;
color: #fff;
font-weight: bold;
text-transform: uppercase;
@include S(margin-bottom, 5px);
}
p {
color: #fff;
@include Text;
strong {
font-weight: bold;
}
@include S(margin-bottom, 5px);
}
button {
background: #fff;
color: #333538;
}
}
} }
.mainContainer { .mainContainer {

View File

@ -1,113 +1,188 @@
#state_SettingsState { #state_SettingsState {
.content { $colorCategoryButton: #eee;
.versionbar { $colorCategoryButtonSelected: #5f748b;
@include S(margin-top, 20px);
@include SuperSmallText; .container .content {
display: grid; display: flex;
align-items: center; overflow-y: scroll;
grid-template-columns: 1fr auto;
.buildVersion { .categoryContainer {
display: flex; width: 100%;
flex-direction: column;
color: #aaadaf; .category {
display: none;
&.active {
display: block;
}
.setting {
@include S(padding, 10px);
background: #eeeff5;
@include S(border-radius, $globalBorderRadius);
@include S(margin-bottom, 5px);
label {
text-transform: uppercase;
@include Text;
}
.desc {
@include S(margin-top, 5px);
@include SuperSmallText;
color: #aaadb2;
}
> .row {
display: grid;
align-items: center;
grid-template-columns: 1fr auto;
}
&.disabled {
// opacity: 0.3;
pointer-events: none;
* {
pointer-events: none !important;
cursor: default !important;
}
position: relative;
.standaloneOnlyHint {
@include PlainText;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: all;
display: flex;
align-items: center;
justify-content: center;
background: rgba(#fff, 0.5);
text-transform: uppercase;
color: $colorRedBright;
}
}
.value.enum {
background: #fff;
@include PlainText;
display: flex;
align-items: flex-start;
pointer-events: all;
cursor: pointer;
justify-content: center;
@include S(min-width, 100px);
@include S(border-radius, $globalBorderRadius);
@include S(padding, 4px);
@include S(padding-right, 15px);
background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
transition: background-color 0.12s ease-in-out;
&:hover {
background-color: #fafafa;
}
}
}
} }
} }
button.about { .sidebar {
background-color: $colorGreenBright; display: flex;
} flex-direction: column;
@include S(min-width, 210px);
@include S(max-width, 320px);
width: 30%;
height: 100%;
position: sticky;
top: 0;
@include S(margin-left, 20px);
@include S(margin-right, 32px);
.setting { .other {
@include S(padding, 10px); margin-top: auto;
background: #eeeff5;
@include S(border-radius, $globalBorderRadius);
@include S(margin-bottom, 5px);
label {
text-transform: uppercase;
@include Text;
} }
.desc { button {
@include S(margin-top, 5px); @include S(margin-top, 4px);
width: calc(100% - #{D(20px)});
text-align: start;
&::after {
content: unset;
}
}
button.categoryButton,
button.about {
background-color: $colorCategoryButton;
color: #777a7f;
&.active {
background-color: $colorCategoryButtonSelected;
color: #fff;
&:hover {
opacity: 1;
}
}
&.pressed {
transform: none !important;
}
}
.versionbar {
@include S(margin-top, 20px);
@include SuperSmallText; @include SuperSmallText;
color: #aaadb2;
}
> .row {
display: grid; display: grid;
align-items: center; align-items: center;
grid-template-columns: 1fr auto; grid-template-columns: 1fr auto;
} .buildVersion {
&.disabled {
// opacity: 0.3;
pointer-events: none;
* {
pointer-events: none !important;
cursor: default !important;
}
position: relative;
.standaloneOnlyHint {
@include PlainText;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: all;
display: flex; display: flex;
align-items: center; flex-direction: column;
justify-content: center; color: #aaadaf;
background: rgba(#fff, 0.5);
text-transform: uppercase;
color: $colorRedBright;
}
}
.value.enum {
background: #fff;
@include PlainText;
display: flex;
align-items: flex-start;
pointer-events: all;
cursor: pointer;
justify-content: center;
@include S(min-width, 100px);
@include S(border-radius, $globalBorderRadius);
@include S(padding, 4px);
@include S(padding-right, 15px);
background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
transition: background-color 0.12s ease-in-out;
&:hover {
background-color: #fafafa;
} }
} }
} }
} }
@include DarkThemeOverride { @include DarkThemeOverride {
.content { .container .content {
.setting { .sidebar {
background: darken($darkModeGameBackground, 10); button.categoryButton,
button.about {
background-color: #3f3f47;
.value.enum { &.active {
// dirty but works
filter: invert(0.85);
color: #222;
}
.value.checkbox {
background-color: #74767b;
&.checked {
background-color: $colorBlueBright; background-color: $colorBlueBright;
} }
} }
} }
.categoryContainer {
.category {
.setting {
background: darken($darkModeGameBackground, 10);
.value.enum {
// dirty but works
filter: invert(0.78) sepia(40%) hue-rotate(190deg);
color: #222;
}
.value.checkbox {
background-color: #74767b;
&.checked {
background-color: $colorBlueBright;
}
}
}
}
}
} }
} }
} }

View File

@ -1,24 +1,18 @@
.gameState.textualState { .gameState.textualState {
display: flex; display: grid;
flex-direction: column; grid-template-rows: auto 1fr;
justify-content: center; box-sizing: border-box;
align-items: center; @include S(padding, 32px);
$padding: 15px; height: 100vh;
.headerBar,
> .container .content {
@include S(width, 500px);
}
.headerBar { .headerBar {
display: flex; display: flex;
align-items: center;
justify-content: flex-start;
h1 { h1 {
display: flex; display: grid;
pointer-events: all; grid-template-columns: auto 1fr;
align-items: center; align-items: center;
pointer-events: all;
cursor: pointer; cursor: pointer;
@include SuperHeading; @include SuperHeading;
text-transform: uppercase; text-transform: uppercase;
@ -39,11 +33,17 @@
} }
> .container { > .container {
display: flex;
justify-content: center;
width: 100%;
overflow-y: auto;
> .content { > .content {
width: 100%;
background: #fff; background: #fff;
@include S(border-radius, $globalBorderRadius); @include S(border-radius, $globalBorderRadius);
@include S(padding, 10px); @include S(padding, 10px);
height: calc(80vh - #{D(60px)}); height: 100%;
overflow-y: auto; overflow-y: auto;
box-sizing: border-box; box-sizing: border-box;
pointer-events: all; pointer-events: all;

View File

@ -385,7 +385,7 @@ export class Application {
} }
const scale = this.getEffectiveUiScale(); const scale = this.getEffectiveUiScale();
waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", scale)); waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", `${scale}`));
window.focus(); window.focus();
} }
} }

View File

@ -4,8 +4,10 @@ export const CHANGELOG = [
date: "unreleased", date: "unreleased",
entries: [ entries: [
"WIRES", "WIRES",
"Reworked menu UI design (by dengr1605)",
"Allow holding ALT in belt planner to reverse direction (by jakobhellermann)", "Allow holding ALT in belt planner to reverse direction (by jakobhellermann)",
"Clear cursor when trying to pipette the same building twice (by hexy)", "Clear cursor when trying to pipette the same building twice (by hexy)",
"Fixed level 18 stacker bug: If you experienced it already, you know it, if not, I don't want to spoiler (by hexy)",
"Added keybinding to close menus (by isaisstillalive / Sandwichs-del)", "Added keybinding to close menus (by isaisstillalive / Sandwichs-del)",
"Fix rare crash regarding the buildings toolbar (by isaisstillalive)", "Fix rare crash regarding the buildings toolbar (by isaisstillalive)",
"Fixed some phrases (by EnderDoom77)", "Fixed some phrases (by EnderDoom77)",
@ -24,7 +26,7 @@ export const CHANGELOG = [
version: "1.1.19", version: "1.1.19",
date: "02.07.2020", date: "02.07.2020",
entries: [ entries: [
"There are now notifications every 15 minutes in the demo version to buy the full version (For further details and the reason, check the #surveys channel in the discord)", "There are now notifications every 15 minutes in the demo version to buy the full version (For further details and the reason, check the #surveys channel in the Discord)",
"I'm still working on the wires update, I hope to release it mid july!", "I'm still working on the wires update, I hope to release it mid july!",
], ],
}, },
@ -151,7 +153,7 @@ export const CHANGELOG = [
version: "1.1.10", version: "1.1.10",
date: "12.06.2020", date: "12.06.2020",
entries: [ entries: [
"There are now linux builds on steam! Please report any issues in the discord!", "There are now linux builds on steam! Please report any issues in the Discord!",
"Steam cloud saves are now available!", "Steam cloud saves are now available!",
"Added and update more translations (Big thank you to all translators!)", "Added and update more translations (Big thank you to all translators!)",
"Prevent invalid connection if existing underground tunnel entrance exists (by jaysc)", "Prevent invalid connection if existing underground tunnel entrance exists (by jaysc)",
@ -221,7 +223,7 @@ export const CHANGELOG = [
entries: [ entries: [
"The official trailer is now ready! Check it out <a href='https://www.youtube.com/watch?v=KyorY1uIqiQ' target='_blank'>here</a>!", "The official trailer is now ready! Check it out <a href='https://www.youtube.com/watch?v=KyorY1uIqiQ' target='_blank'>here</a>!",
"The <a href='https://steam.shapez.io' target='_blank'>steam page</a> is now live!", "The <a href='https://steam.shapez.io' target='_blank'>steam page</a> is now live!",
"Experimental linux builds are now available! Please give me feedback on them in the discord", "Experimental linux builds are now available! Please give me feedback on them in the Discord",
"Allow hovering pinned shapes to enlarge them", "Allow hovering pinned shapes to enlarge them",
"Allow deselecting blueprints with right click and 'Q'", "Allow deselecting blueprints with right click and 'Q'",
"Move default key for deleting from 'X' to 'DEL'", "Move default key for deleting from 'X' to 'DEL'",

View File

@ -1,7 +1,6 @@
import { Signal } from "./signal"; import { Signal } from "./signal";
// @ts-ignore import BackgroundAnimationFrameEmitterWorker from "worker-loader?inline=true&fallback=false!../webworkers/background_animation_frame_emittter.worker";
import BackgroundAnimationFrameEmitterWorker from "../webworkers/background_animation_frame_emittter.worker";
import { createLogger } from "./logging"; import { createLogger } from "./logging";
const logger = createLogger("animation_frame"); const logger = createLogger("animation_frame");
@ -14,12 +13,11 @@ export class AnimationFrame {
this.frameEmitted = new Signal(); this.frameEmitted = new Signal();
this.bgFrameEmitted = new Signal(); this.bgFrameEmitted = new Signal();
this.lastTime = null; this.lastTime = performance.now();
this.bgLastTime = null; this.bgLastTime = performance.now();
this.boundMethod = this.handleAnimationFrame.bind(this); this.boundMethod = this.handleAnimationFrame.bind(this);
/** @type {Worker} */
this.backgroundWorker = new BackgroundAnimationFrameEmitterWorker(); this.backgroundWorker = new BackgroundAnimationFrameEmitterWorker();
this.backgroundWorker.addEventListener("error", err => { this.backgroundWorker.addEventListener("error", err => {
logger.error("Error in background fps worker:", err); logger.error("Error in background fps worker:", err);
@ -27,22 +25,16 @@ export class AnimationFrame {
this.backgroundWorker.addEventListener("message", this.handleBackgroundTick.bind(this)); this.backgroundWorker.addEventListener("message", this.handleBackgroundTick.bind(this));
} }
/** handleBackgroundTick() {
*
* @param {MessageEvent} event
*/
handleBackgroundTick(event) {
const time = performance.now(); const time = performance.now();
if (!this.bgLastTime) {
// First update, first delta is always 16ms let dt = time - this.bgLastTime;
this.bgFrameEmitted.dispatch(1000 / 60);
} else { if (dt > maxDtMs) {
let dt = time - this.bgLastTime; dt = resetDtMs;
if (dt > maxDtMs) {
dt = resetDtMs;
}
this.bgFrameEmitted.dispatch(dt);
} }
this.bgFrameEmitted.dispatch(dt);
this.bgLastTime = time; this.bgLastTime = time;
} }
@ -52,18 +44,15 @@ export class AnimationFrame {
} }
handleAnimationFrame(time) { handleAnimationFrame(time) {
if (!this.lastTime) { let dt = time - this.lastTime;
// First update, first delta is always 16ms
this.frameEmitted.dispatch(1000 / 60); if (dt > maxDtMs) {
} else { dt = resetDtMs;
let dt = time - this.lastTime;
if (dt > maxDtMs) {
// warn(this, "Clamping", dt, "to", resetDtMs);
dt = resetDtMs;
}
this.frameEmitted.dispatch(dt);
} }
this.frameEmitted.dispatch(dt);
this.lastTime = time; this.lastTime = time;
window.requestAnimationFrame(this.boundMethod); window.requestAnimationFrame(this.boundMethod);
} }
} }

View File

@ -1,7 +1,6 @@
// @ts-ignore import CompressionWorker from "worker-loader?inline=true&fallback=false!../webworkers/compression.worker";
import CompressionWorker from "../webworkers/compression.worker";
import { createLogger } from "./logging"; import { createLogger } from "./logging";
import { compressX64 } from "./lzstring";
const logger = createLogger("async_compression"); const logger = createLogger("async_compression");
export let compressionPrefix = String.fromCodePoint(1); export let compressionPrefix = String.fromCodePoint(1);
@ -35,7 +34,6 @@ if (!checkCryptPrefix(compressionPrefix)) {
class AsynCompression { class AsynCompression {
constructor() { constructor() {
/** @type {Worker} */
this.worker = new CompressionWorker(); this.worker = new CompressionWorker();
this.currentJobId = 1000; this.currentJobId = 1000;

View File

@ -7,6 +7,7 @@ import { createLogger } from "./logging";
import { Signal } from "./signal"; import { Signal } from "./signal";
import { SOUNDS, MUSIC } from "../platform/sound"; import { SOUNDS, MUSIC } from "../platform/sound";
import { AtlasDefinition, atlasFiles } from "./atlas_definitions"; import { AtlasDefinition, atlasFiles } from "./atlas_definitions";
import { initBuildingCodesAfterResourcesLoaded } from "../game/meta_building_registry";
const logger = createLogger("background_loader"); const logger = createLogger("background_loader");
@ -116,6 +117,7 @@ export class BackgroundResourcesLoader {
logger.log("⏰ Finish load: bare game"); logger.log("⏰ Finish load: bare game");
Loader.createAtlasLinks(); Loader.createAtlasLinks();
this.bareGameReady = true; this.bareGameReady = true;
initBuildingCodesAfterResourcesLoaded();
this.signalBareGameLoaded.dispatch(); this.signalBareGameLoaded.dispatch();
this.internalStartLoadingAdditionalGameAssets(); this.internalStartLoadingAdditionalGameAssets();
}); });

View File

@ -8,7 +8,7 @@ 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";

View File

@ -1,19 +1,12 @@
import { globalConfig } from "./config"; import { createHash } from "rusha";
import { decompressX64, compressX64 } from "./lzstring";
const Rusha = require("rusha"); import { decompressX64 } from "./lzstring";
const encryptKey = globalConfig.info.sgSalt;
export function decodeHashedString(s) {
return decompressX64(s);
}
export function sha1(str) { export function sha1(str) {
return Rusha.createHash().update(str).digest("hex"); return createHash().update(str).digest("hex");
} }
// Window.location.host // Window.location.host
export function getNameOfProvider() { export function getNameOfProvider() {
return window[decodeHashedString("DYewxghgLgliB2Q")][decodeHashedString("BYewzgLgdghgtgUyA")]; return window[decompressX64("DYewxghgLgliB2Q")][decompressX64("BYewzgLgdghgtgUyA")];
} }

View File

@ -158,7 +158,9 @@ export class AtlasSprite extends BaseSprite {
const scale = parameters.desiredAtlasScale; const scale = parameters.desiredAtlasScale;
const link = this.linksByResolution[scale]; const link = this.linksByResolution[scale];
assert(link, "Link not known: " + scale + " (having " + Object.keys(this.linksByResolution) + ")"); if (!link) {
assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`);
}
const scaleW = w / link.w; const scaleW = w / link.w;
const scaleH = h / link.h; const scaleH = h / link.h;

View File

@ -81,10 +81,6 @@ export class Blueprint {
for (let i = 0; i < this.entities.length; ++i) { for (let i = 0; i < this.entities.length; ++i) {
const entity = this.entities[i]; const entity = this.entities[i];
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
if (!staticComp.blueprintSpriteKey) {
logger.warn("Blueprint entity without sprite!");
return;
}
const newPos = staticComp.origin.add(tile); const newPos = staticComp.origin.add(tile);
const rect = staticComp.getTileSpaceBounds(); const rect = staticComp.getTileSpaceBounds();
@ -98,7 +94,7 @@ export class Blueprint {
staticComp.drawSpriteOnFullEntityBounds( staticComp.drawSpriteOnFullEntityBounds(
parameters, parameters,
Loader.getSprite(staticComp.blueprintSpriteKey), staticComp.getBlueprintSprite(),
0, 0,
true, true,
newPos newPos

View File

@ -0,0 +1,72 @@
import { MetaBuilding, defaultBuildingVariant } from "./meta_building";
import { AtlasSprite } from "../core/sprites";
/**
* @typedef {{
* metaClass: typeof MetaBuilding,
* metaInstance?: MetaBuilding,
* variant?: string,
* rotationVariant?: number,
* sprite?: AtlasSprite,
* blueprintSprite?: AtlasSprite,
* silhouetteColor?: string
* }} BuildingVariantIdentifier
*/
/**
* Stores a lookup table for all building variants (for better performance)
* @type {Object<number, BuildingVariantIdentifier>}
*/
export const gBuildingVariants = {
// Set later
};
/**
*
* @param {*} id
* @param {*} meta
* @param {*} variant
* @param {*} rotationVariant
*/
export function registerBuildingVariant(id, meta, variant = defaultBuildingVariant, rotationVariant = 0) {
assert(!gBuildingVariants[id], "Duplicate id: " + id);
gBuildingVariants[id] = {
metaClass: meta,
variant,
rotationVariant,
};
}
/**
*
* @param {number} code
* @returns {BuildingVariantIdentifier}
*/
export function getBuildingDataFromCode(code) {
assert(gBuildingVariants[code], "Invalid building code: " + code);
return gBuildingVariants[code];
}
/**
* Finds the code for a given variant
* @param {MetaBuilding} metaBuilding
* @param {string} variant
* @param {number} rotationVariant
*/
export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant) {
for (const key in gBuildingVariants) {
const data = gBuildingVariants[key];
if (
data.metaInstance.getId() === metaBuilding.getId() &&
data.variant === variant &&
data.rotationVariant === rotationVariant
) {
return +key;
}
}
assertAlways(
false,
"Building not found by data: " + metaBuilding.getId() + " / " + variant + " / " + rotationVariant
);
return 0;
}

View File

@ -1,4 +1,3 @@
import { Loader } from "../../core/loader";
import { formatItemsPerSecond } from "../../core/utils"; import { formatItemsPerSecond } from "../../core/utils";
import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector"; import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector";
import { SOUNDS } from "../../platform/sound"; import { SOUNDS } from "../../platform/sound";
@ -40,6 +39,10 @@ export class MetaBeltBaseBuilding extends MetaBuilding {
return SOUNDS.placeBelt; return SOUNDS.placeBelt;
} }
getSprite() {
return null;
}
/** /**
* Creates the entity at the given location * Creates the entity at the given location
* @param {Entity} entity * @param {Entity} entity
@ -88,7 +91,6 @@ export class MetaBeltBaseBuilding extends MetaBuilding {
updateVariants(entity, rotationVariant) { updateVariants(entity, rotationVariant) {
entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant]; entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant];
entity.components.ItemEjector.slots[0].direction = arrayBeltVariantToRotation[rotationVariant]; entity.components.ItemEjector.slots[0].direction = arrayBeltVariantToRotation[rotationVariant];
entity.components.StaticMapEntity.spriteKey = null;
} }
/** /**

View File

@ -28,6 +28,11 @@ export class MetaHubBuilding extends MetaBuilding {
return null; return null;
} }
getSprite() {
// We render it ourself
return null;
}
/** /**
* Creates the entity at the given location * Creates the entity at the given location
* @param {Entity} entity * @param {Entity} entity
@ -41,9 +46,6 @@ export class MetaHubBuilding extends MetaBuilding {
}) })
); );
// We render the sprite ourself
entity.components.StaticMapEntity.spriteKey = null;
entity.addComponent(new UnremovableComponent()); entity.addComponent(new UnremovableComponent());
entity.addComponent( entity.addComponent(
new ItemAcceptorComponent({ new ItemAcceptorComponent({

View File

@ -71,6 +71,10 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
return super.getAvailableVariants(root); return super.getAvailableVariants(root);
} }
/**
* @param {number} rotationVariant
* @param {string} variant
*/
getPreviewSprite(rotationVariant, variant) { getPreviewSprite(rotationVariant, variant) {
let suffix = ""; let suffix = "";
if (variant !== defaultBuildingVariant) { if (variant !== defaultBuildingVariant) {
@ -87,6 +91,10 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
} }
} }
/**
* @param {number} rotationVariant
* @param {string} variant
*/
getBlueprintSprite(rotationVariant, variant) { getBlueprintSprite(rotationVariant, variant) {
let suffix = ""; let suffix = "";
if (variant !== defaultBuildingVariant) { if (variant !== defaultBuildingVariant) {
@ -103,6 +111,14 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
} }
} }
/**
* @param {number} rotationVariant
* @param {string} variant
*/
getSprite(rotationVariant, variant) {
return this.getPreviewSprite(rotationVariant, variant);
}
/** /**
* @param {GameRoot} root * @param {GameRoot} root
*/ */
@ -201,10 +217,6 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
*/ */
updateVariants(entity, rotationVariant, variant) { updateVariants(entity, rotationVariant, variant) {
entity.components.UndergroundBelt.tier = enumUndergroundBeltVariantToTier[variant]; entity.components.UndergroundBelt.tier = enumUndergroundBeltVariantToTier[variant];
entity.components.StaticMapEntity.spriteKey = this.getPreviewSprite(
rotationVariant,
variant
).spriteName;
switch (arrayUndergroundRotationVariantToMode[rotationVariant]) { switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
case enumUndergroundBeltMode.sender: { case enumUndergroundBeltMode.sender: {

View File

@ -88,7 +88,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
]); ]);
entity.components.ItemEjector.setSlots([ entity.components.ItemEjector.setSlots([
{ pos: new Vector(0, 0), direction: enumDirection.left, layer: enumLayer.wires }, { pos: new Vector(0, 0), direction: enumDirection.top, layer: enumLayer.wires },
{ pos: new Vector(0, 0), direction: enumDirection.right, layer: enumLayer.wires }, { pos: new Vector(0, 0), direction: enumDirection.right, layer: enumLayer.wires },
]); ]);
@ -98,7 +98,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
entity.components.ItemAcceptor.setSlots([ entity.components.ItemAcceptor.setSlots([
{ {
pos: new Vector(0, 0), pos: new Vector(0, 0),
directions: [enumDirection.left], directions: [enumDirection.top],
layer: enumLayer.wires, layer: enumLayer.wires,
}, },
{ {
@ -109,7 +109,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
]); ]);
entity.components.ItemEjector.setSlots([ entity.components.ItemEjector.setSlots([
{ pos: new Vector(0, 0), direction: enumDirection.top, layer: enumLayer.wires }, { pos: new Vector(0, 0), direction: enumDirection.bottom, layer: enumLayer.wires },
]); ]);
break; break;
} }

View File

@ -5,6 +5,7 @@ import { AtlasSprite } from "../../core/sprites";
import { enumDirection, Vector } from "../../core/vector"; import { enumDirection, Vector } from "../../core/vector";
import { types } from "../../savegame/serialization"; import { types } from "../../savegame/serialization";
import { Component } from "../component"; import { Component } from "../component";
import { getBuildingDataFromCode } from "../building_codes";
export class StaticMapEntityComponent extends Component { export class StaticMapEntityComponent extends Component {
static getId() { static getId() {
@ -17,21 +18,43 @@ export class StaticMapEntityComponent extends Component {
tileSize: types.tileVector, tileSize: types.tileVector,
rotation: types.float, rotation: types.float,
originalRotation: types.float, originalRotation: types.float,
spriteKey: types.nullable(types.string),
blueprintSpriteKey: types.string, // See building_codes.js
silhouetteColor: types.nullable(types.string), code: types.uint,
}; };
} }
/**
* Returns the sprite
* @returns {AtlasSprite}
*/
getSprite() {
return getBuildingDataFromCode(this.code).sprite;
}
/**
* Returns the blueprint sprite
* @returns {AtlasSprite}
*/
getBlueprintSprite() {
return getBuildingDataFromCode(this.code).blueprintSprite;
}
/**
* Returns the silhouette color
* @returns {string}
*/
getSilhouetteColor() {
return getBuildingDataFromCode(this.code).silhouetteColor;
}
duplicateWithoutContents() { duplicateWithoutContents() {
return new StaticMapEntityComponent({ return new StaticMapEntityComponent({
origin: this.origin.copy(), origin: this.origin.copy(),
tileSize: this.tileSize.copy(), tileSize: this.tileSize.copy(),
rotation: this.rotation, rotation: this.rotation,
originalRotation: this.originalRotation, originalRotation: this.originalRotation,
spriteKey: this.spriteKey, code: this.code,
silhouetteColor: this.silhouetteColor,
blueprintSpriteKey: this.blueprintSpriteKey,
}); });
} }
@ -42,18 +65,14 @@ export class StaticMapEntityComponent extends Component {
* @param {Vector=} param0.tileSize Size of the entity in tiles * @param {Vector=} param0.tileSize Size of the entity in tiles
* @param {number=} param0.rotation Rotation in degrees. Must be multiple of 90 * @param {number=} param0.rotation Rotation in degrees. Must be multiple of 90
* @param {number=} param0.originalRotation Original Rotation in degrees. Must be multiple of 90 * @param {number=} param0.originalRotation Original Rotation in degrees. Must be multiple of 90
* @param {string=} param0.spriteKey Optional sprite * @param {number=} param0.code Building code
* @param {string} param0.blueprintSpriteKey Blueprint sprite, required
* @param {string=} param0.silhouetteColor Optional silhouette color override
*/ */
constructor({ constructor({
origin = new Vector(), origin = new Vector(),
tileSize = new Vector(1, 1), tileSize = new Vector(1, 1),
rotation = 0, rotation = 0,
originalRotation = 0, originalRotation = 0,
spriteKey = null, code = 0,
silhouetteColor = null,
blueprintSpriteKey = null,
}) { }) {
super(); super();
assert( assert(
@ -63,11 +82,9 @@ export class StaticMapEntityComponent extends Component {
this.origin = origin; this.origin = origin;
this.tileSize = tileSize; this.tileSize = tileSize;
this.spriteKey = spriteKey;
this.rotation = rotation; this.rotation = rotation;
this.code = code;
this.originalRotation = originalRotation; this.originalRotation = originalRotation;
this.silhouetteColor = silhouetteColor;
this.blueprintSpriteKey = blueprintSpriteKey;
} }
/** /**

View File

@ -18,6 +18,7 @@ import { DynamicDomAttach } from "../dynamic_dom_attach";
import { HUDBuildingPlacerLogic } from "./building_placer_logic"; import { HUDBuildingPlacerLogic } from "./building_placer_logic";
import { makeOffscreenBuffer } from "../../../core/buffer_utils"; import { makeOffscreenBuffer } from "../../../core/buffer_utils";
import { enumLayer } from "../../root"; import { enumLayer } from "../../root";
import { getCodeFromBuildingData } from "../../building_codes";
export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
/** /**
@ -84,9 +85,8 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
label: "lock-direction-indicator", label: "lock-direction-indicator",
}); });
// Loader.getSprite("sprites/misc/lock_direction_indicator.png").draw(context, 0, 0, 48, 48); context.fillStyle = THEME.map.directionLock[layer].color;
context.fillStyle = THEME.map.directionLock[enumLayer.wires].color; context.strokeStyle = THEME.map.directionLock[layer].color;
context.strokeStyle = THEME.map.directionLock[enumLayer.wires].color;
context.lineWidth = 2; context.lineWidth = 2;
const padding = 5; const padding = 5;
@ -313,6 +313,11 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
staticComp.rotation = rotation; staticComp.rotation = rotation;
staticComp.tileSize = metaBuilding.getDimensions(this.currentVariant.get()); staticComp.tileSize = metaBuilding.getDimensions(this.currentVariant.get());
metaBuilding.updateVariants(this.fakeEntity, rotationVariant, this.currentVariant.get()); metaBuilding.updateVariants(this.fakeEntity, rotationVariant, this.currentVariant.get());
staticComp.code = getCodeFromBuildingData(
this.currentMetaBuilding.get(),
this.currentVariant.get(),
rotationVariant
);
const canBuild = this.root.logic.checkCanPlaceEntity(this.fakeEntity); const canBuild = this.root.logic.checkCanPlaceEntity(this.fakeEntity);

View File

@ -13,6 +13,7 @@ import { SOUNDS } from "../../../platform/sound";
import { MetaMinerBuilding, enumMinerVariants } from "../../buildings/miner"; import { MetaMinerBuilding, enumMinerVariants } from "../../buildings/miner";
import { enumHubGoalRewards } from "../../tutorial_goals"; import { enumHubGoalRewards } from "../../tutorial_goals";
import { enumLayer } from "../../root"; import { enumLayer } from "../../root";
import { getBuildingDataFromCode, getCodeFromBuildingData } from "../../building_codes";
/** /**
* Contains all logic for the building placer - this doesn't include the rendering * Contains all logic for the building placer - this doesn't include the rendering
@ -338,109 +339,27 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
} }
// Try to extract the building // Try to extract the building
const extracted = this.hack_reconstructMetaBuildingAndVariantFromBuilding(contents); const buildingCode = contents.components.StaticMapEntity.code;
const extracted = getBuildingDataFromCode(buildingCode);
// If the building we are picking is the same as the one we have, clear the cursor. // If the building we are picking is the same as the one we have, clear the cursor.
if ( if (
!extracted || this.currentMetaBuilding.get() &&
(extracted.metaBuilding === this.currentMetaBuilding.get() && extracted.metaInstance.getId() === this.currentMetaBuilding.get().getId() &&
extracted.variant === this.currentVariant.get()) extracted.variant === this.currentVariant.get()
) { ) {
this.currentMetaBuilding.set(null); this.currentMetaBuilding.set(null);
return; return;
} }
this.currentMetaBuilding.set(extracted.metaBuilding); this.currentMetaBuilding.set(extracted.metaInstance);
this.currentVariant.set(extracted.variant); this.currentVariant.set(extracted.variant);
this.currentBaseRotation = contents.components.StaticMapEntity.rotation; this.currentBaseRotation = contents.components.StaticMapEntity.rotation;
} }
/** /**
* HACK! * Switches the side for the direction lock manually
*
* This attempts to reconstruct the meta building and its variant from a given entity
* @param {Entity} entity
* @returns {{ metaBuilding: MetaBuilding, variant: string }}
*/ */
hack_reconstructMetaBuildingAndVariantFromBuilding(entity) {
if (entity.components.Hub) {
// Hub is not copyable
return null;
}
const matches = [];
const metaBuildings = gMetaBuildingRegistry.entries;
for (let i = 0; i < metaBuildings.length; ++i) {
const metaBuilding = metaBuildings[i];
const availableVariants = metaBuilding.getAvailableVariants(this.root);
checkVariant: for (let k = 0; k < availableVariants.length; ++k) {
const variant = availableVariants[k];
let unplaced = metaBuilding.createEntity({
root: this.root,
variant,
origin: new Vector(0, 0),
rotation: 0,
originalRotation: 0,
rotationVariant: 0,
});
// Compare if both entities share the same components
for (let component in entity.components) {
if ((entity.components[component] == null) !== (unplaced.components[component] == null)) {
continue checkVariant;
}
}
// Check for same item processor
if (
entity.components.ItemProcessor &&
entity.components.ItemProcessor.type != unplaced.components.ItemProcessor.type
) {
continue checkVariant;
}
// Check for underground belt
if (
entity.components.UndergroundBelt &&
entity.components.UndergroundBelt.tier != unplaced.components.UndergroundBelt.tier
) {
continue checkVariant;
}
// Check for same sprite key - except for underground belts
// since the sprite may vary here
if (
!entity.components.UndergroundBelt &&
entity.components.StaticMapEntity.spriteKey !=
unplaced.components.StaticMapEntity.spriteKey
) {
continue checkVariant;
}
if (metaBuilding.id === "wire" && entity.layer !== enumLayer.wires) {
continue checkVariant;
}
if (metaBuilding.id === "belt" && entity.layer !== enumLayer.regular) {
continue checkVariant;
}
matches.push({ metaBuilding, variant });
}
}
if (matches.length == 1) {
const staticEntity = entity.components.StaticMapEntity;
const key = staticEntity.spriteKey || staticEntity.blueprintSpriteKey;
assert(
key &&
key.includes(matches[0].metaBuilding.id) &&
(matches[0].variant === defaultBuildingVariant || key.includes(matches[0].variant))
);
return matches[0];
}
return null;
}
switchDirectionLockSide() { switchDirectionLockSide() {
this.currentDirectionLockSide = 1 - this.currentDirectionLockSide; this.currentDirectionLockSide = 1 - this.currentDirectionLockSide;
} }
@ -673,7 +592,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
origin: new Vector(0, 0), origin: new Vector(0, 0),
rotation: 0, rotation: 0,
tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(), tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(),
blueprintSpriteKey: "", code: getCodeFromBuildingData(metaBuilding, variant, 0),
}) })
); );
metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get()); metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get());

View File

@ -88,8 +88,8 @@ export class HUDDebugInfo extends BaseHUDPart {
const mouseTile = this.root.camera.screenToWorld(mousePos).toTileSpace(); const mouseTile = this.root.camera.screenToWorld(mousePos).toTileSpace();
const cameraTile = this.root.camera.center.toTileSpace(); const cameraTile = this.root.camera.center.toTileSpace();
this.trackedMousePosition.set(`Pos: <code>${mouseTile.x}</code> / <code>${mouseTile.y}</code>`); this.trackedMousePosition.set(`Mouse: <code>${mouseTile.x}</code> / <code>${mouseTile.y}</code>`);
this.trackedCameraPosition.set(`Center: <code>${cameraTile.x}</code> / <code>${cameraTile.y}</code>`); this.trackedCameraPosition.set(`Camera: <code>${cameraTile.x}</code> / <code>${cameraTile.y}</code>`);
} }
/** /**

View File

@ -15,7 +15,9 @@ export class HUDEntityDebugger extends BaseHUDPart {
` `
); );
/** @type {HTMLElement} */
this.mousePosElem = this.element.querySelector(".mousePos"); this.mousePosElem = this.element.querySelector(".mousePos");
/** @type {HTMLElement} */
this.chunkPosElem = this.element.querySelector(".chunkPos"); this.chunkPosElem = this.element.querySelector(".chunkPos");
this.entityInfoElem = this.element.querySelector(".entityInfo"); this.entityInfoElem = this.element.querySelector(".entityInfo");
} }

View File

@ -106,16 +106,22 @@ export class HUDSettingsMenu extends BaseHUDPart {
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever); this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
const totalMinutesPlayed = Math.ceil(this.root.time.now() / 60); const totalMinutesPlayed = Math.ceil(this.root.time.now() / 60);
this.statsElement.querySelector(".playtime").innerText = T.global.time.xMinutes.replace(
"<x>",
"" + totalMinutesPlayed
);
this.statsElement.querySelector(".buildingsPlaced").innerText = formatBigNumberFull( /** @type {HTMLElement} */
const playtimeElement = this.statsElement.querySelector(".playtime");
/** @type {HTMLElement} */
const buildingsPlacedElement = this.statsElement.querySelector(".buildingsPlaced");
/** @type {HTMLElement} */
const beltsPlacedElement = this.statsElement.querySelector(".beltsPlaced");
playtimeElement.innerText = T.global.time.xMinutes.replace("<x>", `${totalMinutesPlayed}`);
buildingsPlacedElement.innerText = formatBigNumberFull(
this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length - this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
this.root.entityMgr.getAllWithComponent(BeltComponent).length this.root.entityMgr.getAllWithComponent(BeltComponent).length
); );
this.statsElement.querySelector(".beltsPlaced").innerText = formatBigNumberFull(
beltsPlacedElement.innerText = formatBigNumberFull(
this.root.entityMgr.getAllWithComponent(BeltComponent).length this.root.entityMgr.getAllWithComponent(BeltComponent).length
); );
} }

View File

@ -5,6 +5,7 @@ import { SOUNDS } from "../platform/sound";
import { StaticMapEntityComponent } from "./components/static_map_entity"; import { StaticMapEntityComponent } from "./components/static_map_entity";
import { Entity } from "./entity"; import { Entity } from "./entity";
import { enumLayer, GameRoot } from "./root"; import { enumLayer, GameRoot } from "./root";
import { getCodeFromBuildingData } from "./building_codes";
export const defaultBuildingVariant = "default"; export const defaultBuildingVariant = "default";
@ -157,20 +158,13 @@ export class MetaBuilding {
createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) { createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
const entity = new Entity(root); const entity = new Entity(root);
entity.layer = this.getLayer(); entity.layer = this.getLayer();
const blueprintSprite = this.getBlueprintSprite(rotationVariant, variant);
entity.addComponent( entity.addComponent(
new StaticMapEntityComponent({ new StaticMapEntityComponent({
spriteKey:
"sprites/buildings/" +
this.id +
(variant === defaultBuildingVariant ? "" : "-" + variant) +
".png",
origin: new Vector(origin.x, origin.y), origin: new Vector(origin.x, origin.y),
rotation, rotation,
originalRotation, originalRotation,
tileSize: this.getDimensions(variant).copy(), tileSize: this.getDimensions(variant).copy(),
silhouetteColor: this.getSilhouetteColor(), code: getCodeFromBuildingData(this, variant, rotationVariant),
blueprintSpriteKey: blueprintSprite ? blueprintSprite.spriteName : "",
}) })
); );
this.setupEntityComponents(entity, root); this.setupEntityComponents(entity, root);
@ -178,6 +172,21 @@ export class MetaBuilding {
return entity; return entity;
} }
/**
* Returns the sprite for a given variant
* @param {number} rotationVariant
* @param {string} variant
* @returns {AtlasSprite}
*/
getSprite(rotationVariant, variant) {
return Loader.getSprite(
"sprites/buildings/" +
this.id +
(variant === defaultBuildingVariant ? "" : "-" + variant) +
".png"
);
}
/** /**
* Should compute the optimal rotation variant on the given tile * Should compute the optimal rotation variant on the given tile
* @param {object} param0 * @param {object} param0

View File

@ -1,20 +1,25 @@
import { gMetaBuildingRegistry } from "../core/global_registries"; import { gMetaBuildingRegistry } from "../core/global_registries";
import { MetaBeltBaseBuilding } from "./buildings/belt_base"; import { createLogger } from "../core/logging";
import { MetaCutterBuilding } from "./buildings/cutter";
import { MetaMinerBuilding } from "./buildings/miner";
import { MetaMixerBuilding } from "./buildings/mixer";
import { MetaPainterBuilding } from "./buildings/painter";
import { MetaRotaterBuilding } from "./buildings/rotater";
import { MetaSplitterBuilding } from "./buildings/splitter";
import { MetaStackerBuilding } from "./buildings/stacker";
import { MetaTrashBuilding } from "./buildings/trash";
import { MetaUndergroundBeltBuilding } from "./buildings/underground_belt";
import { MetaHubBuilding } from "./buildings/hub";
import { MetaEnergyGenerator } from "./buildings/energy_generator";
import { MetaWireBaseBuilding } from "./buildings/wire_base";
import { MetaAdvancedProcessorBuilding } from "./buildings/advanced_processor"; import { MetaAdvancedProcessorBuilding } from "./buildings/advanced_processor";
import { MetaBeltBuilding } from "./buildings/belt"; import { MetaBeltBuilding } from "./buildings/belt";
import { MetaWireCrossingsBuilding } from "./buildings/wire_crossings"; import { MetaBeltBaseBuilding } from "./buildings/belt_base";
import { enumCutterVariants, MetaCutterBuilding } from "./buildings/cutter";
import { MetaEnergyGenerator } from "./buildings/energy_generator";
import { MetaHubBuilding } from "./buildings/hub";
import { enumMinerVariants, MetaMinerBuilding } from "./buildings/miner";
import { MetaMixerBuilding } from "./buildings/mixer";
import { enumPainterVariants, MetaPainterBuilding } from "./buildings/painter";
import { enumRotaterVariants, MetaRotaterBuilding } from "./buildings/rotater";
import { enumSplitterVariants, MetaSplitterBuilding } from "./buildings/splitter";
import { MetaStackerBuilding } from "./buildings/stacker";
import { enumTrashVariants, MetaTrashBuilding } from "./buildings/trash";
import { enumUndergroundBeltVariants, MetaUndergroundBeltBuilding } from "./buildings/underground_belt";
import { MetaWireBaseBuilding } from "./buildings/wire_base";
import { enumWireCrossingVariants, MetaWireCrossingsBuilding } from "./buildings/wire_crossings";
import { gBuildingVariants, registerBuildingVariant } from "./building_codes";
import { defaultBuildingVariant } from "./meta_building";
const logger = createLogger("building_registry");
export function initMetaBuildingRegistry() { export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaSplitterBuilding); gMetaBuildingRegistry.register(MetaSplitterBuilding);
@ -32,4 +37,106 @@ export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaWireBaseBuilding); gMetaBuildingRegistry.register(MetaWireBaseBuilding);
gMetaBuildingRegistry.register(MetaAdvancedProcessorBuilding); gMetaBuildingRegistry.register(MetaAdvancedProcessorBuilding);
gMetaBuildingRegistry.register(MetaWireCrossingsBuilding); gMetaBuildingRegistry.register(MetaWireCrossingsBuilding);
// Belt
registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0);
registerBuildingVariant(2, MetaBeltBaseBuilding, defaultBuildingVariant, 1);
registerBuildingVariant(3, MetaBeltBaseBuilding, defaultBuildingVariant, 2);
// Splitter
registerBuildingVariant(4, MetaSplitterBuilding);
registerBuildingVariant(5, MetaSplitterBuilding, enumSplitterVariants.compact);
registerBuildingVariant(6, MetaSplitterBuilding, enumSplitterVariants.compactInverse);
// Miner
registerBuildingVariant(7, MetaMinerBuilding);
registerBuildingVariant(8, MetaMinerBuilding, enumMinerVariants.chainable);
// Cutter
registerBuildingVariant(9, MetaCutterBuilding);
registerBuildingVariant(10, MetaCutterBuilding, enumCutterVariants.quad);
// Rotater
registerBuildingVariant(11, MetaRotaterBuilding);
registerBuildingVariant(12, MetaRotaterBuilding, enumRotaterVariants.ccw);
registerBuildingVariant(13, MetaRotaterBuilding, enumRotaterVariants.fl);
// Stacker
registerBuildingVariant(14, MetaStackerBuilding);
// Mixer
registerBuildingVariant(15, MetaMixerBuilding);
// Painter
registerBuildingVariant(16, MetaPainterBuilding);
registerBuildingVariant(17, MetaPainterBuilding, enumPainterVariants.mirrored);
registerBuildingVariant(18, MetaPainterBuilding, enumPainterVariants.double);
registerBuildingVariant(19, MetaPainterBuilding, enumPainterVariants.quad);
// Trash
registerBuildingVariant(20, MetaTrashBuilding);
registerBuildingVariant(21, MetaTrashBuilding, enumTrashVariants.storage);
// Underground belt
registerBuildingVariant(22, MetaUndergroundBeltBuilding, defaultBuildingVariant, 0);
registerBuildingVariant(23, MetaUndergroundBeltBuilding, defaultBuildingVariant, 1);
registerBuildingVariant(24, MetaUndergroundBeltBuilding, enumUndergroundBeltVariants.tier2, 0);
registerBuildingVariant(25, MetaUndergroundBeltBuilding, enumUndergroundBeltVariants.tier2, 1);
// Hub
registerBuildingVariant(26, MetaHubBuilding);
// Energy generator
registerBuildingVariant(27, MetaEnergyGenerator);
// Wire
registerBuildingVariant(28, MetaWireBaseBuilding, defaultBuildingVariant, 0);
registerBuildingVariant(29, MetaWireBaseBuilding, defaultBuildingVariant, 1);
registerBuildingVariant(30, MetaWireBaseBuilding, defaultBuildingVariant, 2);
// Advanced processor
registerBuildingVariant(31, MetaAdvancedProcessorBuilding);
// Wire crossing
registerBuildingVariant(32, MetaWireCrossingsBuilding);
registerBuildingVariant(33, MetaWireCrossingsBuilding, enumWireCrossingVariants.merger);
// Propagate instances
for (const key in gBuildingVariants) {
gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass(
gBuildingVariants[key].metaClass
);
}
for (const key in gBuildingVariants) {
const variant = gBuildingVariants[key];
assert(variant.metaClass, "Variant has no meta: " + key);
if (typeof variant.rotationVariant === "undefined") {
variant.rotationVariant = 0;
}
if (typeof variant.variant === "undefined") {
variant.variant = defaultBuildingVariant;
}
}
logger.log("Registered", gMetaBuildingRegistry.getNumEntries(), "buildings");
logger.log("Registered", Object.keys(gBuildingVariants).length, "building codes");
}
/**
* Once all sprites are loaded, propagates the cache
*/
export function initBuildingCodesAfterResourcesLoaded() {
logger.log("Propagating sprite cache");
for (const key in gBuildingVariants) {
const variant = gBuildingVariants[key];
variant.sprite = variant.metaInstance.getSprite(variant.rotationVariant, variant.variant);
variant.blueprintSprite = variant.metaInstance.getBlueprintSprite(
variant.rotationVariant,
variant.variant
);
variant.silhouetteColor = variant.metaInstance.getSilhouetteColor();
}
} }

View File

@ -513,57 +513,70 @@ export class ShapeDefinition extends BasicSerializableObject {
* @param {ShapeDefinition} definition * @param {ShapeDefinition} definition
*/ */
cloneAndStackWith(definition) { cloneAndStackWith(definition) {
const newLayers = this.internalCloneLayers();
if (this.isEntirelyEmpty() || definition.isEntirelyEmpty()) { if (this.isEntirelyEmpty() || definition.isEntirelyEmpty()) {
assert(false, "Can not stack entirely empty definition"); assert(false, "Can not stack entirely empty definition");
} }
// Put layer for layer on top const bottomShapeLayers = this.layers;
for (let i = 0; i < definition.layers.length; ++i) { const bottomShapeHighestLayerByQuad = [-1, -1, -1, -1];
const layerToAdd = definition.layers[i];
// On which layer we can merge this upper layer for (let layer = bottomShapeLayers.length - 1; layer >= 0; --layer) {
let mergeOnLayerIndex = null; const shapeLayer = bottomShapeLayers[layer];
for (let quad = 0; quad < 4; ++quad) {
// Go from top to bottom and check if there is anything intercepting it const shapeQuad = shapeLayer[quad];
for (let k = newLayers.length - 1; k >= 0; --k) { if (shapeQuad !== null && bottomShapeHighestLayerByQuad[quad] < layer) {
const lowerLayer = newLayers[k]; bottomShapeHighestLayerByQuad[quad] = layer;
let canMerge = true;
for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) {
const upperItem = layerToAdd[quadrantIndex];
const lowerItem = lowerLayer[quadrantIndex];
if (upperItem && lowerItem) {
// so, we can't merge it because two items conflict
canMerge = false;
break;
}
} }
// If we can merge it, store it - since we go from top to bottom
// we can simply override it
if (canMerge) {
mergeOnLayerIndex = k;
}
}
if (mergeOnLayerIndex !== null) {
// Simply merge using an OR mask
for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) {
newLayers[mergeOnLayerIndex][quadrantIndex] =
newLayers[mergeOnLayerIndex][quadrantIndex] || layerToAdd[quadrantIndex];
}
} else {
// Add new layer
newLayers.push(layerToAdd);
} }
} }
newLayers.splice(4); const topShapeLayers = definition.layers;
const topShapeLowestLayerByQuad = [4, 4, 4, 4];
return new ShapeDefinition({ layers: newLayers }); for (let layer = 0; layer < topShapeLayers.length; ++layer) {
const shapeLayer = topShapeLayers[layer];
for (let quad = 0; quad < 4; ++quad) {
const shapeQuad = shapeLayer[quad];
if (shapeQuad !== null && topShapeLowestLayerByQuad[quad] > layer) {
topShapeLowestLayerByQuad[quad] = layer;
}
}
}
/**
* We want to find the number `layerToMergeAt` such that when the top shape is placed at that
* layer, the smallest gap between shapes is only 1. Instead of doing a guess-and-check method to
* find the appropriate layer, we just calculate all the gaps assuming a merge at layer 0, even
* though they go negative, and calculating the number to add to it so the minimum gap is 1 (ends
* up being 1 - minimum).
*/
const gapsBetweenShapes = [];
for (let quad = 0; quad < 4; ++quad) {
gapsBetweenShapes.push(topShapeLowestLayerByQuad[quad] - bottomShapeHighestLayerByQuad[quad]);
}
const smallestGapBetweenShapes = Math.min(...gapsBetweenShapes);
// Can't merge at a layer lower than 0
const layerToMergeAt = Math.max(1 - smallestGapBetweenShapes, 0);
const mergedLayers = this.internalCloneLayers();
for (let layer = mergedLayers.length; layer < layerToMergeAt + topShapeLayers.length; ++layer) {
mergedLayers.push([null, null, null, null]);
}
for (let layer = 0; layer < topShapeLayers.length; ++layer) {
const layerMergingAt = layerToMergeAt + layer;
const bottomShapeLayer = mergedLayers[layerMergingAt];
const topShapeLayer = topShapeLayers[layer];
for (let quad = 0; quad < 4; quad++) {
assert(!(bottomShapeLayer[quad] && topShapeLayer[quad]), "Shape merge: Sub shape got lost");
bottomShapeLayer[quad] = bottomShapeLayer[quad] || topShapeLayer[quad];
}
}
// Limit to 4 layers at max
mergedLayers.splice(4);
return new ShapeDefinition({ layers: mergedLayers });
} }
/** /**

View File

@ -44,7 +44,7 @@ export class StaticMapEntitySystem extends GameSystem {
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
if (drawOutlinesOnly) { if (drawOutlinesOnly) {
const rect = staticComp.getTileSpaceBounds(); const rect = staticComp.getTileSpaceBounds();
parameters.context.fillStyle = staticComp.silhouetteColor || "#aaa"; parameters.context.fillStyle = staticComp.getSilhouetteColor() || "#aaa";
const beltComp = entity.components.Belt; const beltComp = entity.components.Belt;
if (beltComp) { if (beltComp) {
const sprite = this.beltOverviewSprites[beltComp.direction]; const sprite = this.beltOverviewSprites[beltComp.direction];
@ -58,9 +58,8 @@ export class StaticMapEntitySystem extends GameSystem {
); );
} }
} else { } else {
const spriteKey = staticComp.spriteKey; const sprite = staticComp.getSprite();
if (spriteKey) { if (sprite) {
const sprite = Loader.getSprite(spriteKey);
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false); staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false);
} }
} }
@ -91,9 +90,8 @@ export class StaticMapEntitySystem extends GameSystem {
drawnUids.add(entity.uid); drawnUids.add(entity.uid);
const staticComp = entity.components.StaticMapEntity; const staticComp = entity.components.StaticMapEntity;
const spriteKey = staticComp.spriteKey; const sprite = staticComp.getSprite();
if (spriteKey) { if (sprite) {
const sprite = Loader.getSprite(spriteKey);
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false); staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false);
} }
} }

20
src/js/globals.d.ts vendored
View File

@ -36,11 +36,6 @@ declare interface CanvasRenderingContext2D {
webkitImageSmoothingEnabled: boolean; webkitImageSmoothingEnabled: boolean;
} }
declare interface HTMLCanvasElement {
opaque: boolean;
webkitOpaque: boolean;
}
// Just for compatibility with the shared code // Just for compatibility with the shared code
declare interface Logger { declare interface Logger {
log(...args); log(...args);
@ -127,13 +122,6 @@ declare interface NodeRequire {
context(src: string, flag: boolean, regexp: RegExp): WebpackContext; context(src: string, flag: boolean, regexp: RegExp): WebpackContext;
} }
// HTML Element
declare interface Element {
style: any;
innerText: string;
innerHTML: string;
}
declare interface Object { declare interface Object {
entries(obj: object): Array<[string, any]>; entries(obj: object): Array<[string, any]>;
} }
@ -202,3 +190,11 @@ declare interface TypedSignal<T extends Array<any>> {
removeAll(); removeAll();
} }
declare module "worker-loader?inline=true&fallback=false!*" {
class WebpackWorker extends Worker {
constructor();
}
export default WebpackWorker;
}

View File

@ -81,6 +81,13 @@ export const LANGUAGES = {
region: "", region: "",
}, },
"tr": {
name: "Türkçe",
data: require("./built-temp/base-tr.json"),
code: "tr",
region: "",
},
"zh-CN": { "zh-CN": {
// simplified // simplified
name: "中文简体", name: "中文简体",

View File

@ -102,7 +102,10 @@ export class AdinplayAdProvider extends AdProviderInterface {
// Add the player // Add the player
const videoElement = this.adContainerMainElement.querySelector(".videoInner"); const videoElement = this.adContainerMainElement.querySelector(".videoInner");
this.adContainerMainElement.querySelector(".adInner").style.maxWidth = w + "px"; /** @type {HTMLElement} */
const adInnerElement = this.adContainerMainElement.querySelector(".adInner");
adInnerElement.style.maxWidth = w + "px";
const self = this; const self = this;
window.aiptag.cmd.player.push(function () { window.aiptag.cmd.player.push(function () {

View File

@ -13,8 +13,14 @@ import { LANGUAGES } from "../languages";
const logger = createLogger("application_settings"); const logger = createLogger("application_settings");
const categoryGame = "game"; /**
const categoryApp = "app"; * @enum {string}
*/
export const enumCategories = {
general: "general",
userInterface: "userInterface",
advanced: "advanced",
};
export const uiScales = [ export const uiScales = [
{ {
@ -122,7 +128,7 @@ export const allApplicationSettings = [
options: Object.keys(LANGUAGES), options: Object.keys(LANGUAGES),
valueGetter: key => key, valueGetter: key => key,
textGetter: key => LANGUAGES[key].name, textGetter: key => LANGUAGES[key].name,
category: categoryApp, category: enumCategories.general,
restartRequired: true, restartRequired: true,
changeCb: (app, id) => null, changeCb: (app, id) => null,
magicValue: "auto-detect", magicValue: "auto-detect",
@ -132,7 +138,7 @@ export const allApplicationSettings = [
options: uiScales.sort((a, b) => a.size - b.size), options: uiScales.sort((a, b) => a.size - b.size),
valueGetter: scale => scale.id, valueGetter: scale => scale.id,
textGetter: scale => T.settings.labels.uiScale.scales[scale.id], textGetter: scale => T.settings.labels.uiScale.scales[scale.id],
category: categoryApp, category: enumCategories.userInterface,
restartRequired: false, restartRequired: false,
changeCb: changeCb:
/** /**
@ -143,7 +149,7 @@ export const allApplicationSettings = [
new BoolSetting( new BoolSetting(
"fullscreen", "fullscreen",
categoryApp, enumCategories.general,
/** /**
* @param {Application} app * @param {Application} app
*/ */
@ -157,7 +163,7 @@ export const allApplicationSettings = [
new BoolSetting( new BoolSetting(
"soundsMuted", "soundsMuted",
categoryApp, enumCategories.general,
/** /**
* @param {Application} app * @param {Application} app
*/ */
@ -165,7 +171,7 @@ export const allApplicationSettings = [
), ),
new BoolSetting( new BoolSetting(
"musicMuted", "musicMuted",
categoryApp, enumCategories.general,
/** /**
* @param {Application} app * @param {Application} app
*/ */
@ -174,7 +180,7 @@ export const allApplicationSettings = [
new BoolSetting( new BoolSetting(
"enableColorBlindHelper", "enableColorBlindHelper",
categoryApp, enumCategories.general,
/** /**
* @param {Application} app * @param {Application} app
*/ */
@ -182,13 +188,13 @@ export const allApplicationSettings = [
), ),
// GAME // GAME
new BoolSetting("offerHints", categoryGame, (app, value) => {}), new BoolSetting("offerHints", enumCategories.userInterface, (app, value) => {}),
new EnumSetting("theme", { new EnumSetting("theme", {
options: Object.keys(THEMES), options: Object.keys(THEMES),
valueGetter: theme => theme, valueGetter: theme => theme,
textGetter: theme => T.settings.labels.theme.themes[theme], textGetter: theme => T.settings.labels.theme.themes[theme],
category: categoryGame, category: enumCategories.userInterface,
restartRequired: false, restartRequired: false,
changeCb: changeCb:
/** /**
@ -205,7 +211,7 @@ export const allApplicationSettings = [
options: autosaveIntervals, options: autosaveIntervals,
valueGetter: interval => interval.id, valueGetter: interval => interval.id,
textGetter: interval => T.settings.labels.autosaveInterval.intervals[interval.id], textGetter: interval => T.settings.labels.autosaveInterval.intervals[interval.id],
category: categoryGame, category: enumCategories.advanced,
restartRequired: false, restartRequired: false,
changeCb: changeCb:
/** /**
@ -218,7 +224,7 @@ export const allApplicationSettings = [
options: ["60", "100", "120", "144", "165", "250", G_IS_DEV ? "10" : "500"], options: ["60", "100", "120", "144", "165", "250", G_IS_DEV ? "10" : "500"],
valueGetter: rate => rate, valueGetter: rate => rate,
textGetter: rate => rate + " Hz", textGetter: rate => rate + " Hz",
category: categoryGame, category: enumCategories.advanced,
restartRequired: false, restartRequired: false,
changeCb: (app, id) => {}, changeCb: (app, id) => {},
enabled: !IS_DEMO, enabled: !IS_DEMO,
@ -228,7 +234,7 @@ export const allApplicationSettings = [
options: scrollWheelSensitivities.sort((a, b) => a.scale - b.scale), options: scrollWheelSensitivities.sort((a, b) => a.scale - b.scale),
valueGetter: scale => scale.id, valueGetter: scale => scale.id,
textGetter: scale => T.settings.labels.scrollWheelSensitivity.sensitivity[scale.id], textGetter: scale => T.settings.labels.scrollWheelSensitivity.sensitivity[scale.id],
category: categoryGame, category: enumCategories.advanced,
restartRequired: false, restartRequired: false,
changeCb: changeCb:
/** /**
@ -241,17 +247,17 @@ export const allApplicationSettings = [
options: movementSpeeds.sort((a, b) => a.multiplier - b.multiplier), options: movementSpeeds.sort((a, b) => a.multiplier - b.multiplier),
valueGetter: multiplier => multiplier.id, valueGetter: multiplier => multiplier.id,
textGetter: multiplier => T.settings.labels.movementSpeed.speeds[multiplier.id], textGetter: multiplier => T.settings.labels.movementSpeed.speeds[multiplier.id],
category: categoryGame, category: enumCategories.advanced,
restartRequired: false, restartRequired: false,
changeCb: (app, id) => {}, changeCb: (app, id) => {},
}), }),
new BoolSetting("alwaysMultiplace", categoryGame, (app, value) => {}), new BoolSetting("alwaysMultiplace", enumCategories.advanced, (app, value) => {}),
new BoolSetting("enableTunnelSmartplace", categoryGame, (app, value) => {}), new BoolSetting("enableTunnelSmartplace", enumCategories.advanced, (app, value) => {}),
new BoolSetting("vignette", categoryGame, (app, value) => {}), new BoolSetting("vignette", enumCategories.userInterface, (app, value) => {}),
new BoolSetting("compactBuildingInfo", categoryGame, (app, value) => {}), new BoolSetting("compactBuildingInfo", enumCategories.userInterface, (app, value) => {}),
new BoolSetting("disableCutDeleteWarnings", categoryGame, (app, value) => {}), new BoolSetting("disableCutDeleteWarnings", enumCategories.advanced, (app, value) => {}),
new BoolSetting("rotationByBuilding", categoryGame, (app, value) => {}), new BoolSetting("rotationByBuilding", enumCategories.advanced, (app, value) => {}),
]; ];
export function getApplicationSettingById(id) { export function getApplicationSettingById(id) {

View File

@ -40,7 +40,7 @@ export class BaseSetting {
/** /**
* @param {Application} app * @param {Application} app
* @param {Element} element * @param {HTMLElement} element
* @param {any} dialogs * @param {any} dialogs
*/ */
bind(app, element, dialogs) { bind(app, element, dialogs) {

View File

@ -44,16 +44,18 @@ function decompressInt(s) {
} }
// Sanity // Sanity
for (let i = 0; i < 10000; ++i) { if (G_IS_DEV) {
if (decompressInt(compressInt(i)) !== i) { for (let i = 0; i < 10000; ++i) {
throw new Error( if (decompressInt(compressInt(i)) !== i) {
"Bad compression for: " + throw new Error(
i + "Bad compression for: " +
" compressed: " + i +
compressInt(i) + " compressed: " +
" decompressed: " + compressInt(i) +
decompressInt(compressInt(i)) " decompressed: " +
); decompressInt(compressInt(i))
);
}
} }
} }

View File

@ -1,9 +1,7 @@
import { TextualGameState } from "../core/textual_game_state"; import { TextualGameState } from "../core/textual_game_state";
import { SOUNDS } from "../platform/sound";
import { T } from "../translations"; import { T } from "../translations";
import { KEYMAPPINGS, getStringForKeyCode } from "../game/key_action_mapper";
import { Dialog } from "../core/modal_dialog_elements";
import { THIRDPARTY_URLS } from "../core/config"; import { THIRDPARTY_URLS } from "../core/config";
import { cachebust } from "../core/cachebust";
export class AboutState extends TextualGameState { export class AboutState extends TextualGameState {
constructor() { constructor() {
@ -15,9 +13,16 @@ export class AboutState extends TextualGameState {
} }
getMainContentHTML() { getMainContentHTML() {
return T.about.body return `
.replace("<githublink>", THIRDPARTY_URLS.github) <div class="head">
.replace("<discordlink>", THIRDPARTY_URLS.discord); <img src="${cachebust("res/logo.png")}" alt="shapez.io Logo">
</div>
<div class="text">
${T.about.body
.replace("<githublink>", THIRDPARTY_URLS.github)
.replace("<discordlink>", THIRDPARTY_URLS.discord)}
</div>
`;
} }
onEnter() { onEnter() {

View File

@ -218,11 +218,6 @@ export class MainMenuState extends GameState {
this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked); this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked);
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked); this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked);
const contestButton = qs(".participateContest");
if (contestButton) {
this.trackClicks(contestButton, this.onContestClicked);
}
if (G_IS_STANDALONE) { if (G_IS_STANDALONE) {
this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked); this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked);
} }
@ -312,15 +307,6 @@ export class MainMenuState extends GameState {
this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.reddit); this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.reddit);
} }
onContestClicked() {
this.app.analytics.trackUiClick("contest_click");
this.dialogs.showInfo(
T.mainMenu.contests.contest_01_03062020.title,
T.mainMenu.contests.contest_01_03062020.longDesc
);
}
onLanguageChooseClicked() { onLanguageChooseClicked() {
this.app.analytics.trackUiClick("choose_language"); this.app.analytics.trackUiClick("choose_language");
const setting = /** @type {EnumSetting} */ (getApplicationSettingById("language")); const setting = /** @type {EnumSetting} */ (getApplicationSettingById("language"));

View File

@ -37,7 +37,7 @@ export class PreloadState extends GameState {
return false; return false;
} }
onEnter(payload) { onEnter() {
this.htmlElement.classList.add("prefab_LoadingState"); this.htmlElement.classList.add("prefab_LoadingState");
const elementsToRemove = ["#loadingPreload", "#fontPreload"]; const elementsToRemove = ["#loadingPreload", "#fontPreload"];
@ -52,9 +52,13 @@ export class PreloadState extends GameState {
const dialogsElement = document.body.querySelector(".modalDialogParent"); const dialogsElement = document.body.querySelector(".modalDialogParent");
this.dialogs.initializeToElement(dialogsElement); this.dialogs.initializeToElement(dialogsElement);
/** @type {HTMLElement} */
this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc"); this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc");
/** @type {HTMLElement} */
this.statusBar = this.htmlElement.querySelector(".loadingStatus > .bar > .inner"); this.statusBar = this.htmlElement.querySelector(".loadingStatus > .bar > .inner");
/** @type {HTMLElement} */
this.statusBarText = this.htmlElement.querySelector(".loadingStatus > .bar > .status"); this.statusBarText = this.htmlElement.querySelector(".loadingStatus > .bar > .status");
this.currentStatus = "booting"; this.currentStatus = "booting";
this.currentIndex = 0; this.currentIndex = 0;

View File

@ -1,6 +1,6 @@
import { TextualGameState } from "../core/textual_game_state"; import { TextualGameState } from "../core/textual_game_state";
import { formatSecondsToTimeAgo } from "../core/utils"; import { formatSecondsToTimeAgo } from "../core/utils";
import { allApplicationSettings } from "../profile/application_settings"; import { allApplicationSettings, enumCategories } from "../profile/application_settings";
import { T } from "../translations"; import { T } from "../translations";
export class SettingsState extends TextualGameState { export class SettingsState extends TextualGameState {
@ -15,50 +15,65 @@ export class SettingsState extends TextualGameState {
getMainContentHTML() { getMainContentHTML() {
return ` return `
<div class="upperLinks"> <div class="sidebar">
${this.getCategoryButtonsHtml()}
${ ${
this.app.platformWrapper.getSupportsKeyboard() this.app.platformWrapper.getSupportsKeyboard()
? ` ? `
<button class="styledButton editKeybindings">${T.keybindings.title}</button> <button class="styledButton categoryButton editKeybindings">
` ${T.keybindings.title}
</button>`
: "" : ""
} }
<button class="styledButton about">${T.about.title}</button>
</div> <div class="other">
<button class="styledButton about">${T.about.title}</button>
<div class="versionbar">
${this.getSettingsHtml()} <div class="buildVersion">${T.global.loading} ...</div>
<div class="versionbar"> </div>
<div class="buildVersion">${T.global.loading} ...</div>
</div> </div>
</div>
<div class="categoryContainer">
${this.getSettingsHtml()}
</div>
`; `;
} }
getCategoryButtonsHtml() {
return Object.keys(enumCategories)
.map(key => enumCategories[key])
.map(
category =>
`
<button class="styledButton categoryButton" data-category-btn="${category}">
${T.settings.categories[category]}
</button>
`
)
.join("");
}
getSettingsHtml() { getSettingsHtml() {
let lastCategory = null; const categoriesHTML = {};
let html = "";
Object.keys(enumCategories).forEach(key => {
const catName = enumCategories[key];
categoriesHTML[catName] = `<div class="category" data-category="${catName}">`;
});
for (let i = 0; i < allApplicationSettings.length; ++i) { for (let i = 0; i < allApplicationSettings.length; ++i) {
const setting = allApplicationSettings[i]; const setting = allApplicationSettings[i];
if (setting.categoryId !== lastCategory) { categoriesHTML[setting.categoryId] += setting.getHtml();
lastCategory = setting.categoryId;
if (i !== 0) {
html += "</div>";
}
html += `<strong class="categoryLabel">${T.settings.categories[lastCategory]}</strong>`;
html += "<div class='settingsContainer'>";
}
html += setting.getHtml();
}
if (lastCategory) {
html += "</div>";
} }
return html; return Object.keys(categoriesHTML)
.map(k => categoriesHTML[k] + "</div>")
.join("");
} }
renderBuildText() { renderBuildText() {
@ -90,10 +105,33 @@ export class SettingsState extends TextualGameState {
} }
this.initSettings(); this.initSettings();
this.initCategoryButtons();
this.htmlElement.querySelector(".category").classList.add("active");
this.htmlElement.querySelector(".categoryButton").classList.add("active");
}
setActiveCategory(category) {
const previousCategory = this.htmlElement.querySelector(".category.active");
const previousCategoryButton = this.htmlElement.querySelector(".categoryButton.active");
if (previousCategory.getAttribute("data-category") == category) {
return;
}
previousCategory.classList.remove("active");
previousCategoryButton.classList.remove("active");
const newCategory = this.htmlElement.querySelector("[data-category='" + category + "']");
const newCategoryButton = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
newCategory.classList.add("active");
newCategoryButton.classList.add("active");
} }
initSettings() { initSettings() {
allApplicationSettings.forEach(setting => { allApplicationSettings.forEach(setting => {
/** @type {HTMLElement} */
const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']"); const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
setting.bind(this.app, element, this.dialogs); setting.bind(this.app, element, this.dialogs);
setting.syncValueToElement(); setting.syncValueToElement();
@ -107,6 +145,20 @@ export class SettingsState extends TextualGameState {
}); });
} }
initCategoryButtons() {
Object.keys(enumCategories).forEach(key => {
const category = enumCategories[key];
const button = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
this.trackClicks(
button,
() => {
this.setActiveCategory(category);
},
{ preventDefault: false }
);
});
}
onAboutClicked() { onAboutClicked() {
this.moveToStateAddGoBack("AboutState"); this.moveToStateAddGoBack("AboutState");
} }

View File

@ -3,7 +3,7 @@
/* Basic Options */ /* Basic Options */
"target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
// "lib": [], /* Specify library files to be included in the compilation. */ "lib": ["DOM","ES2018"], /* Specify library files to be included in the compilation. */
"allowJs": true /* Allow javascript files to be compiled. */, "allowJs": true /* Allow javascript files to be compiled. */,
"checkJs": true /* Report errors in .js files. */, "checkJs": true /* Report errors in .js files. */,
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
@ -54,5 +54,6 @@
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
"resolveJsonModule": true "resolveJsonModule": true
} },
"exclude": ["webworkers"]
} }

View File

@ -1,15 +1,14 @@
// We clamp high deltas so 30 fps is fairly ok // We clamp high deltas so 30 fps is fairly ok
var bgFps = 30; const bgFps = 30;
var desiredMsDelay = 1000 / bgFps; const desiredMsDelay = 1000 / bgFps;
let lastTick = 0; let lastTick = performance.now();
function tick() { function tick() {
var now = performance.now(); const now = performance.now();
var delta = now - lastTick; const delta = now - lastTick;
lastTick = now; lastTick = now;
// @ts-ignore
postMessage({ delta }); postMessage({ delta });
} }

View File

@ -12,15 +12,9 @@ function accessNestedPropertyReverse(obj, keys) {
const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]); const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]);
onmessage = function (event) { onmessage = function ({ data: { jobId, job, data } }) {
const { jobId, job, data } = event.data;
const result = performJob(job, data); const result = performJob(job, data);
postMessage({ jobId, result });
// @ts-ignore
postMessage({
jobId,
result,
});
}; };
function performJob(job, data) { function performJob(job, data) {

View File

@ -0,0 +1,8 @@
{
"compilerOptions": {
"lib": ["ES2018","WebWorker"]
},
"exclude": [],
"extends": "../tsconfig",
"include": ["*.worker.js"]
}

View File

@ -59,7 +59,7 @@ If you want to edit an existing translation (Fixing typos, Updating it to a newe
## Adding a new language ## Adding a new language
Please DM me on discord (tobspr#5407), so I can add the language template for you. Please DM me on Discord (tobspr#5407), so I can add the language template for you.
Please use the following template: Please use the following template:

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -490,6 +490,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees. description: Rotates shapes counter clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -631,8 +634,9 @@ storyRewards:
settings: settings:
title: Settings title: Settings
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -843,9 +847,9 @@ about:
If you want to contribute, check out <a href="<githublink>" If you want to contribute, check out <a href="<githublink>"
target="_blank">shapez.io on github</a>.<br><br> target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community This game wouldn't have been possible without the great Discord community
around my games - You should really join the <a href="<discordlink>" around my games - You should really join the <a href="<discordlink>"
target="_blank">discord server</a>!<br><br> target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" The soundtrack was made by <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - He's awesome.<br><br> target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -496,6 +496,9 @@ buildings:
ccw: ccw:
name: Rotador (Antihorari) name: Rotador (Antihorari)
description: Rota formes en sentit antihorari 90 graus. description: Rota formes en sentit antihorari 90 graus.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -634,8 +637,9 @@ storyRewards:
settings: settings:
title: Opcions title: Opcions
categories: categories:
game: Joc general: General
app: Aplicació userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Desenvolupament dev: Desenvolupament
@ -826,7 +830,7 @@ about:
body: >- body: >-
This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br> This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br>
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br> This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br> The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>
Finally, huge thanks to my best friend <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our factorio sessions this game would never have existed. Finally, huge thanks to my best friend <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our factorio sessions this game would never have existed.
changelog: changelog:

View File

@ -471,6 +471,9 @@ buildings:
ccw: ccw:
name: Rotor (opačný) name: Rotor (opačný)
description: Otáčí tvary o 90 stupňů proti směru hodinových ručiček description: Otáčí tvary o 90 stupňů proti směru hodinových ručiček
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -612,8 +615,9 @@ storyRewards:
settings: settings:
title: Nastavení title: Nastavení
categories: categories:
game: Hra general: General
app: Aplikace userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Vývojová verze dev: Vývojová verze
@ -823,9 +827,9 @@ about:
Pokud se chceš na hře podílet, podívej se na <a href="<githublink>" Pokud se chceš na hře podílet, podívej se na <a href="<githublink>"
target="_blank">shapez.io na githubu</a>.<br><br> target="_blank">shapez.io na githubu</a>.<br><br>
Tato hra by nebyla ani možná bez skvělé discord komunity Tato hra by nebyla ani možná bez skvělé Discord komunity
okolo Tobiasových her - Vážně by ses měl přijít mrknout na <a href="<discordlink>" okolo Tobiasových her - Vážně by ses měl přijít mrknout na <a href="<discordlink>"
target="_blank">discord server</a>!<br><br> target="_blank">Discord server</a>!<br><br>
Soundtrack udělal <a href="https://soundcloud.com/pettersumelius" Soundtrack udělal <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - Je úžasnej.<br><br> target="_blank">Peppsen</a> - Je úžasnej.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -489,6 +489,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees. description: Rotates shapes counter clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -634,8 +637,9 @@ storyRewards:
settings: settings:
title: Settings title: Settings
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -844,7 +848,7 @@ about:
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br> This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br> The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -23,7 +23,7 @@ steamPage:
# This is the short text appearing on the steam page # This is the short text appearing on the steam page
shortText: In shapez.io nutzt du die vorhandenen Ressourcen, um mit deinen Maschinen durch Kombination immer komplexere Formen zu erschaffen. shortText: In shapez.io nutzt du die vorhandenen Ressourcen, um mit deinen Maschinen durch Kombination immer komplexere Formen zu erschaffen.
# This is the text shown above the discord link # This is the text shown above the Discord link
discordLink: Offizieller Discord - Hier kannst du mit mir schreiben! discordLink: Offizieller Discord - Hier kannst du mit mir schreiben!
# This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
@ -484,6 +484,9 @@ buildings:
ccw: ccw:
name: Rotierer (CCW) name: Rotierer (CCW)
description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad. description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -633,8 +636,9 @@ storyRewards:
settings: settings:
title: Einstellungen title: Einstellungen
categories: categories:
game: Spiel general: General
app: Applikation userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Entwicklung dev: Entwicklung

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -485,6 +485,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees. description: Rotates shapes counter clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -631,8 +634,9 @@ storyRewards:
settings: settings:
title: Settings title: Settings
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -844,7 +848,7 @@ about:
If you want to contribute, check out <a href="<githublink>" If you want to contribute, check out <a href="<githublink>"
target="_blank">shapez.io on github</a>.<br><br> target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community This game wouldn't have been possible without the great Discord community
around my games - You should really join the <a href="<discordlink>" around my games - You should really join the <a href="<discordlink>"
target="_blank">discord server</a>!<br><br> target="_blank">discord server</a>!<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -23,7 +23,7 @@ steamPage:
# This is the short text appearing on the steam page # This is the short text appearing on the steam page
shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map. shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
# This is the text shown above the discord link # This is the text shown above the Discord link
discordLink: Official Discord - Chat with me! discordLink: Official Discord - Chat with me!
# This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
@ -647,8 +647,9 @@ storyRewards:
settings: settings:
title: Settings title: Settings
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -855,13 +856,13 @@ about:
body: >- body: >-
This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br> This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br>
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on GitHub</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br> This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br> The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>
Finally, huge thanks to my best friend <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our factorio sessions, this game would never have existed. Finally, huge thanks to my best friend <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our Factorio sessions, this game would never have existed.
changelog: changelog:
title: Changelog title: Changelog

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -23,7 +23,7 @@ steamPage:
# This is the short text appearing on the steam page # This is the short text appearing on the steam page
shortText: shapez.io es un juego sobre construir fábricas para automatizar la creación y combinación de figuras cada vez más complejas en un mapa infinito. shortText: shapez.io es un juego sobre construir fábricas para automatizar la creación y combinación de figuras cada vez más complejas en un mapa infinito.
# This is the text shown above the discord link # This is the text shown above the Discord link
discordLink: Discord oficial - ¡Chatea conmigo! discordLink: Discord oficial - ¡Chatea conmigo!
# This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
@ -502,6 +502,9 @@ buildings:
ccw: ccw:
name: Rotador (Inverso) name: Rotador (Inverso)
description: Rota las figuras en sentido antihorario 90 grados. description: Rota las figuras en sentido antihorario 90 grados.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -642,8 +645,9 @@ storyRewards:
settings: settings:
title: Opciones title: Opciones
categories: categories:
game: Juego general: General
app: Aplicación userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Desarrollo dev: Desarrollo

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -499,6 +499,9 @@ buildings:
ccw: ccw:
name: Rotate (Vastapäivään) name: Rotate (Vastapäivään)
description: Kääntää muotoja 90 astetta vastapäivään. description: Kääntää muotoja 90 astetta vastapäivään.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -638,8 +641,9 @@ storyRewards:
settings: settings:
title: Asetukset title: Asetukset
categories: categories:
game: Peli general: General
app: Sovellus userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Kehitys dev: Kehitys
@ -848,7 +852,7 @@ about:
Jos haluat osallistua, tarkista <a href="<githublink>" target="_blank">shapez.io githubissa</a>.<br><br> Jos haluat osallistua, tarkista <a href="<githublink>" target="_blank">shapez.io githubissa</a>.<br><br>
Tämä peli ei olisi ollut mahdollinen ilman suurta discord yhteisöä pelini ympärillä - Sinun kannattaisi liittyä <a href="<discordlink>" target="_blank">discord palvelimelleni</a>!<br><br> Tämä peli ei olisi ollut mahdollinen ilman suurta Discord yhteisöä pelini ympärillä - Sinun kannattaisi liittyä <a href="<discordlink>" target="_blank">Discord palvelimelleni</a>!<br><br>
Ääniraidan on tehnyt <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Hän on mahtava.<br><br> Ääniraidan on tehnyt <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Hän on mahtava.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -486,6 +486,9 @@ buildings:
ccw: ccw:
name: Pivoteur inversé name: Pivoteur inversé
description: Fait pivoter une forme de 90 degrés vers la gauche. description: Fait pivoter une forme de 90 degrés vers la gauche.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -631,8 +634,9 @@ storyRewards:
settings: settings:
title: Options title: Options
categories: categories:
game: Jeu general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Développement dev: Développement
@ -837,9 +841,9 @@ about:
Si vous souhaitez contribuer, allez voir <a href="<githublink>" Si vous souhaitez contribuer, allez voir <a href="<githublink>"
target="_blank">shapez.io sur github</a>.<br><br> target="_blank">shapez.io sur github</a>.<br><br>
Ce jeu n'aurait pu être réalisé sans la précieuse communauté discord autour de Ce jeu n'aurait pu être réalisé sans la précieuse communauté Discord autour de
mes jeux - Vous devriez vraiment envisager de joindre le <a href="<discordlink>" mes jeux - Vous devriez vraiment envisager de joindre le <a href="<discordlink>"
target="_blank">serveur discord</a> !<br><br> target="_blank">serveur Discord</a> !<br><br>
La bande son a été créée par <a href="https://soundcloud.com/pettersumelius" La bande son a été créée par <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - Il est impressionnant !<br><br> target="_blank">Peppsen</a> - Il est impressionnant !<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -533,6 +533,9 @@ buildings:
ccw: ccw:
name: Obrtač (↺) name: Obrtač (↺)
description: Okreće oblike za 90 stupnjeva u smjeru suprotnom od kazaljke na satu. description: Okreće oblike za 90 stupnjeva u smjeru suprotnom od kazaljke na satu.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -672,8 +675,9 @@ storyRewards:
settings: settings:
title: Postavke title: Postavke
categories: categories:
game: Igra general: General
app: Aplikacija userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -883,7 +887,7 @@ about:
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br> This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br> The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -485,6 +485,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees. description: Rotates shapes counter clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -630,8 +633,9 @@ storyRewards:
settings: settings:
title: Beállítások title: Beállítások
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -841,9 +845,9 @@ about:
If you want to contribute, check out <a href="<githublink>" If you want to contribute, check out <a href="<githublink>"
target="_blank">shapez.io on github</a>.<br><br> target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community This game wouldn't have been possible without the great Discord community
around my games - You should really join the <a href="<discordlink>" around my games - You should really join the <a href="<discordlink>"
target="_blank">discord server</a>!<br><br> target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" The soundtrack was made by <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - He's awesome.<br><br> target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -23,7 +23,7 @@ steamPage:
# This is the short text appearing on the steam page # This is the short text appearing on the steam page
shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map. shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
# This is the text shown above the discord link # This is the text shown above the Discord link
discordLink: Official Discord - Chat with me! discordLink: Official Discord - Chat with me!
# This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page. # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
@ -503,6 +503,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter-clockwise by 90 degrees. description: Rotates shapes counter-clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -644,8 +647,9 @@ storyRewards:
settings: settings:
title: Settings title: Settings
categories: categories:
game: Game general: General
app: Application userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -854,7 +858,7 @@ about:
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br> This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br> The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -485,6 +485,9 @@ buildings:
ccw: ccw:
name: Rotate (CCW) name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees. description: Rotates shapes counter clockwise by 90 degrees.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -631,8 +634,9 @@ storyRewards:
settings: settings:
title: Impostazioni title: Impostazioni
categories: categories:
game: Gioco general: General
app: Applicazione userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Sviluppo dev: Sviluppo
@ -842,9 +846,9 @@ about:
If you want to contribute, check out <a href="<githublink>" If you want to contribute, check out <a href="<githublink>"
target="_blank">shapez.io on github</a>.<br><br> target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community This game wouldn't have been possible without the great Discord community
around my games - You should really join the <a href="<discordlink>" around my games - You should really join the <a href="<discordlink>"
target="_blank">discord server</a>!<br><br> target="_blank">Discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" The soundtrack was made by <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - He's awesome.<br><br> target="_blank">Peppsen</a> - He's awesome.<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -490,6 +490,9 @@ buildings:
ccw: ccw:
name: 回転機 (逆) name: 回転機 (逆)
description: 形を反時計回り方向に90度回転します。 description: 形を反時計回り方向に90度回転します。
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -631,8 +634,9 @@ storyRewards:
settings: settings:
title: 設定 title: 設定
categories: categories:
game: ゲーム general: General
app: アプリケーション userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: Development dev: Development
@ -836,7 +840,7 @@ about:
開発に参加したい場合は以下をチェックしてみてください。<a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br> 開発に参加したい場合は以下をチェックしてみてください。<a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
このゲームはdiscordでの素晴らしいコミュニティなしには実現しませんでした。 - このサーバにも是非参加してください! <a href="<discordlink>" target="_blank">discord server</a>!<br><br> このゲームはdiscordでの素晴らしいコミュニティなしには実現しませんでした。 - このサーバにも是非参加してください! <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
サウンドトラックは<a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a>により製作されました。 - 彼は素晴らしいです<br><br> サウンドトラックは<a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a>により製作されました。 - 彼は素晴らしいです<br><br>

View File

@ -15,7 +15,7 @@
# #
# Adding a new language: # Adding a new language:
# #
# If you want to add a new language, ask me in the discord and I will setup # If you want to add a new language, ask me in the Discord and I will setup
# the basic structure so the game also detects it. # the basic structure so the game also detects it.
# #
@ -489,6 +489,9 @@ buildings:
ccw: ccw:
name: 회전기 (반시계방향) name: 회전기 (반시계방향)
description: 도형을 반시계방향으로 90도 회전시킨다. description: 도형을 반시계방향으로 90도 회전시킨다.
fl:
name: Rotate (180)
description: Rotates shapes by 180 degrees.
stacker: stacker:
default: default:
@ -630,8 +633,9 @@ storyRewards:
settings: settings:
title: 설정 title: 설정
categories: categories:
game: 게임 general: General
app: userInterface: User Interface
advanced: Advanced
versionBadges: versionBadges:
dev: 개발 dev: 개발

Some files were not shown because too many files have changed in this diff Show More