Merge branch 'master' of https://github.com/tobspr/shapez.io
7
.github/workflows/ci.yml
vendored
@ -44,3 +44,10 @@ jobs:
|
||||
uses: ibiqlik/action-yamllint@v1.0.0
|
||||
with:
|
||||
file_or_dir: translations/*.yaml
|
||||
|
||||
- name: TSLint
|
||||
run: |
|
||||
cd gulp
|
||||
yarn gulp translations.fullBuild
|
||||
cd ..
|
||||
yarn tslint
|
||||
|
@ -50,7 +50,7 @@ If you want to add a new feature or in generally contribute I recommend to get i
|
||||
|
||||
### Code
|
||||
|
||||
The game is based on a custom engine which itself is based on the YORG.io 3 game egine (Actually it shares almost the same core).
|
||||
The game is based on a custom engine which itself is based on the YORG.io 3 game engine (Actually it shares almost the same core).
|
||||
The code within the engine is relatively clean with some code for the actual game on top being hacky.
|
||||
|
||||
This project is based on ES5. Some ES2015 features are used but most of them are too slow, especially when polyfilled. For example, `Array.prototype.forEach` is only used within non-critical loops since its slower than a plain for loop.
|
||||
|
@ -47,14 +47,13 @@
|
||||
"query-string": "^6.8.1",
|
||||
"rusha": "^0.8.13",
|
||||
"serialize-error": "^3.0.0",
|
||||
"sloc": "^0.2.1",
|
||||
"strictdom": "^1.0.1",
|
||||
"string-replace-webpack-plugin": "^0.1.3",
|
||||
"terser-webpack-plugin": "^1.1.0",
|
||||
"through2": "^3.0.1",
|
||||
"uglify-template-string-loader": "^1.1.0",
|
||||
"unused-files-webpack-plugin": "^3.4.0",
|
||||
"webpack": "^4.31.0",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-bundle-analyzer": "^3.0.3",
|
||||
"webpack-cli": "^3.1.0",
|
||||
"webpack-deep-scope-plugin": "^1.6.0",
|
||||
@ -114,7 +113,7 @@
|
||||
"speed-measure-webpack-plugin": "^1.3.1",
|
||||
"strip-json-comments": "^3.0.1",
|
||||
"trim": "^0.0.1",
|
||||
"webpack-stream": "^5.1.0",
|
||||
"webpack-stream": "^5.2.1",
|
||||
"yaml-loader": "^0.6.0"
|
||||
}
|
||||
}
|
||||
|
@ -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$/,
|
||||
type: "json", // Required by Webpack v4
|
||||
|
351
gulp/yarn.lock
@ -1163,150 +1163,149 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
|
||||
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
|
||||
|
||||
"@webassemblyjs/ast@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
|
||||
integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==
|
||||
"@webassemblyjs/ast@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
|
||||
integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
|
||||
dependencies:
|
||||
"@webassemblyjs/helper-module-context" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
|
||||
"@webassemblyjs/wast-parser" "1.8.5"
|
||||
"@webassemblyjs/helper-module-context" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.9.0"
|
||||
"@webassemblyjs/wast-parser" "1.9.0"
|
||||
|
||||
"@webassemblyjs/floating-point-hex-parser@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
|
||||
integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==
|
||||
"@webassemblyjs/floating-point-hex-parser@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
|
||||
integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
|
||||
|
||||
"@webassemblyjs/helper-api-error@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
|
||||
integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==
|
||||
"@webassemblyjs/helper-api-error@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
|
||||
integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
|
||||
|
||||
"@webassemblyjs/helper-buffer@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
|
||||
integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==
|
||||
"@webassemblyjs/helper-buffer@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
|
||||
integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
|
||||
|
||||
"@webassemblyjs/helper-code-frame@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
|
||||
integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==
|
||||
"@webassemblyjs/helper-code-frame@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
|
||||
integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
|
||||
dependencies:
|
||||
"@webassemblyjs/wast-printer" "1.8.5"
|
||||
"@webassemblyjs/wast-printer" "1.9.0"
|
||||
|
||||
"@webassemblyjs/helper-fsm@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
|
||||
integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==
|
||||
"@webassemblyjs/helper-fsm@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
|
||||
integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
|
||||
|
||||
"@webassemblyjs/helper-module-context@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
|
||||
integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==
|
||||
"@webassemblyjs/helper-module-context@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
|
||||
integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
mamacro "^0.0.3"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
|
||||
"@webassemblyjs/helper-wasm-bytecode@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
|
||||
integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==
|
||||
"@webassemblyjs/helper-wasm-bytecode@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
|
||||
integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
|
||||
|
||||
"@webassemblyjs/helper-wasm-section@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
|
||||
integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==
|
||||
"@webassemblyjs/helper-wasm-section@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
|
||||
integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-buffer" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
|
||||
"@webassemblyjs/wasm-gen" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-buffer" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.9.0"
|
||||
"@webassemblyjs/wasm-gen" "1.9.0"
|
||||
|
||||
"@webassemblyjs/ieee754@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
|
||||
integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==
|
||||
"@webassemblyjs/ieee754@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
|
||||
integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
|
||||
dependencies:
|
||||
"@xtuc/ieee754" "^1.2.0"
|
||||
|
||||
"@webassemblyjs/leb128@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
|
||||
integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==
|
||||
"@webassemblyjs/leb128@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
|
||||
integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
|
||||
dependencies:
|
||||
"@xtuc/long" "4.2.2"
|
||||
|
||||
"@webassemblyjs/utf8@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
|
||||
integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==
|
||||
"@webassemblyjs/utf8@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
|
||||
integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
|
||||
|
||||
"@webassemblyjs/wasm-edit@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
|
||||
integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==
|
||||
"@webassemblyjs/wasm-edit@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
|
||||
integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-buffer" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-section" "1.8.5"
|
||||
"@webassemblyjs/wasm-gen" "1.8.5"
|
||||
"@webassemblyjs/wasm-opt" "1.8.5"
|
||||
"@webassemblyjs/wasm-parser" "1.8.5"
|
||||
"@webassemblyjs/wast-printer" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-buffer" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-section" "1.9.0"
|
||||
"@webassemblyjs/wasm-gen" "1.9.0"
|
||||
"@webassemblyjs/wasm-opt" "1.9.0"
|
||||
"@webassemblyjs/wasm-parser" "1.9.0"
|
||||
"@webassemblyjs/wast-printer" "1.9.0"
|
||||
|
||||
"@webassemblyjs/wasm-gen@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
|
||||
integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==
|
||||
"@webassemblyjs/wasm-gen@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
|
||||
integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
|
||||
"@webassemblyjs/ieee754" "1.8.5"
|
||||
"@webassemblyjs/leb128" "1.8.5"
|
||||
"@webassemblyjs/utf8" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.9.0"
|
||||
"@webassemblyjs/ieee754" "1.9.0"
|
||||
"@webassemblyjs/leb128" "1.9.0"
|
||||
"@webassemblyjs/utf8" "1.9.0"
|
||||
|
||||
"@webassemblyjs/wasm-opt@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
|
||||
integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==
|
||||
"@webassemblyjs/wasm-opt@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
|
||||
integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-buffer" "1.8.5"
|
||||
"@webassemblyjs/wasm-gen" "1.8.5"
|
||||
"@webassemblyjs/wasm-parser" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-buffer" "1.9.0"
|
||||
"@webassemblyjs/wasm-gen" "1.9.0"
|
||||
"@webassemblyjs/wasm-parser" "1.9.0"
|
||||
|
||||
"@webassemblyjs/wasm-parser@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
|
||||
integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==
|
||||
"@webassemblyjs/wasm-parser@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
|
||||
integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-api-error" "1.8.5"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
|
||||
"@webassemblyjs/ieee754" "1.8.5"
|
||||
"@webassemblyjs/leb128" "1.8.5"
|
||||
"@webassemblyjs/utf8" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-api-error" "1.9.0"
|
||||
"@webassemblyjs/helper-wasm-bytecode" "1.9.0"
|
||||
"@webassemblyjs/ieee754" "1.9.0"
|
||||
"@webassemblyjs/leb128" "1.9.0"
|
||||
"@webassemblyjs/utf8" "1.9.0"
|
||||
|
||||
"@webassemblyjs/wast-parser@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
|
||||
integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==
|
||||
"@webassemblyjs/wast-parser@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
|
||||
integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/floating-point-hex-parser" "1.8.5"
|
||||
"@webassemblyjs/helper-api-error" "1.8.5"
|
||||
"@webassemblyjs/helper-code-frame" "1.8.5"
|
||||
"@webassemblyjs/helper-fsm" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/floating-point-hex-parser" "1.9.0"
|
||||
"@webassemblyjs/helper-api-error" "1.9.0"
|
||||
"@webassemblyjs/helper-code-frame" "1.9.0"
|
||||
"@webassemblyjs/helper-fsm" "1.9.0"
|
||||
"@xtuc/long" "4.2.2"
|
||||
|
||||
"@webassemblyjs/wast-printer@1.8.5":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
|
||||
integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==
|
||||
"@webassemblyjs/wast-printer@1.9.0":
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
|
||||
integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/wast-parser" "1.8.5"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/wast-parser" "1.9.0"
|
||||
"@xtuc/long" "4.2.2"
|
||||
|
||||
"@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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
|
||||
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:
|
||||
version "0.8.2"
|
||||
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"
|
||||
integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
|
||||
|
||||
async@~2.1.4:
|
||||
version "2.1.5"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
|
||||
integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=
|
||||
dependencies:
|
||||
lodash "^4.14.0"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
@ -2824,7 +2821,7 @@ check-types@^8.0.3:
|
||||
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
|
||||
integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
|
||||
|
||||
chokidar@^2.0.0, chokidar@^2.0.2:
|
||||
chokidar@^2.0.0, chokidar@^2.1.8:
|
||||
version "2.1.8"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
|
||||
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
|
||||
@ -2843,7 +2840,7 @@ chokidar@^2.0.0, chokidar@^2.0.2:
|
||||
optionalDependencies:
|
||||
fsevents "^1.2.7"
|
||||
|
||||
chokidar@^3.4.1:
|
||||
chokidar@^3.4.0, chokidar@^3.4.1:
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
|
||||
integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
|
||||
@ -2944,13 +2941,6 @@ cli-cursor@^2.1.0:
|
||||
dependencies:
|
||||
restore-cursor "^2.0.0"
|
||||
|
||||
cli-table@^0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
|
||||
integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM=
|
||||
dependencies:
|
||||
colors "1.0.3"
|
||||
|
||||
cli-width@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
|
||||
@ -3115,7 +3105,7 @@ color@^3.0.0:
|
||||
color-convert "^1.9.1"
|
||||
color-string "^1.5.2"
|
||||
|
||||
colors@1.0.3, colors@1.0.x:
|
||||
colors@1.0.x:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
||||
integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
|
||||
@ -3159,13 +3149,6 @@ commander@~2.8.1:
|
||||
dependencies:
|
||||
graceful-readlink ">= 1.0.0"
|
||||
|
||||
commander@~2.9.0:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
|
||||
integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
|
||||
dependencies:
|
||||
graceful-readlink ">= 1.0.0"
|
||||
|
||||
commondir@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
|
||||
@ -7978,7 +7961,7 @@ loader-runner@^2.4.0:
|
||||
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
|
||||
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"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
loader-utils@^1.4.0:
|
||||
loader-utils@^1.0.0, loader-utils@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
|
||||
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"
|
||||
integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
|
||||
|
||||
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10:
|
||||
lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0, lodash@~4.17.10:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
@ -8468,11 +8451,6 @@ make-iterator@^1.0.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "0.1.3"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
|
||||
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
|
||||
@ -11204,7 +11182,7 @@ readable-stream@^3.0.2, readable-stream@^3.1.1:
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
readdirp@^2.1.0, readdirp@^2.2.1:
|
||||
readdirp@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
|
||||
integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
|
||||
@ -11880,6 +11858,13 @@ serialize-javascript@^1.7.0:
|
||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
|
||||
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:
|
||||
version "1.9.1"
|
||||
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"
|
||||
is-fullwidth-code-point "^2.0.0"
|
||||
|
||||
sloc@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/sloc/-/sloc-0.2.1.tgz#42ad891e76838c1a22bbd8483468e9d74c7f531e"
|
||||
integrity sha512-8XJnwCFR4DatLz1s0nGFe6IJPJ+5pjRFhoBuBKq8SLgFI40eD7ak6jOXpzeG0tmIpyOc1zCs9bjKAxMFm1451A==
|
||||
dependencies:
|
||||
async "~2.1.4"
|
||||
cli-table "^0.3.1"
|
||||
commander "~2.9.0"
|
||||
readdirp "^2.1.0"
|
||||
|
||||
snapdragon-node@^2.0.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
|
||||
@ -12839,7 +12814,7 @@ ternary-stream@^3.0.0:
|
||||
merge-stream "^2.0.0"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
|
||||
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"
|
||||
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:
|
||||
version "4.3.1"
|
||||
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"
|
||||
integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=
|
||||
|
||||
watchpack@^1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
|
||||
integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
|
||||
watchpack-chokidar2@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
|
||||
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:
|
||||
chokidar "^2.0.2"
|
||||
graceful-fs "^4.1.2"
|
||||
neo-async "^2.5.0"
|
||||
optionalDependencies:
|
||||
chokidar "^3.4.0"
|
||||
watchpack-chokidar2 "^2.0.0"
|
||||
|
||||
webidl-conversions@^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-map "~0.6.1"
|
||||
|
||||
webpack-stream@^5.1.0:
|
||||
webpack-stream@^5.2.1:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39"
|
||||
integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A==
|
||||
@ -13807,16 +13806,16 @@ webpack-strip-block@^0.2.0:
|
||||
dependencies:
|
||||
loader-utils "^1.1.0"
|
||||
|
||||
webpack@^4.26.1, webpack@^4.31.0:
|
||||
version "4.40.2"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.40.2.tgz#d21433d250f900bf0facbabe8f50d585b2dc30a7"
|
||||
integrity sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A==
|
||||
webpack@^4.26.1, webpack@^4.43.0:
|
||||
version "4.43.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
|
||||
integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
|
||||
dependencies:
|
||||
"@webassemblyjs/ast" "1.8.5"
|
||||
"@webassemblyjs/helper-module-context" "1.8.5"
|
||||
"@webassemblyjs/wasm-edit" "1.8.5"
|
||||
"@webassemblyjs/wasm-parser" "1.8.5"
|
||||
acorn "^6.2.1"
|
||||
"@webassemblyjs/ast" "1.9.0"
|
||||
"@webassemblyjs/helper-module-context" "1.9.0"
|
||||
"@webassemblyjs/wasm-edit" "1.9.0"
|
||||
"@webassemblyjs/wasm-parser" "1.9.0"
|
||||
acorn "^6.4.1"
|
||||
ajv "^6.10.2"
|
||||
ajv-keywords "^3.4.1"
|
||||
chrome-trace-event "^1.0.2"
|
||||
@ -13827,13 +13826,13 @@ webpack@^4.26.1, webpack@^4.31.0:
|
||||
loader-utils "^1.2.3"
|
||||
memory-fs "^0.4.1"
|
||||
micromatch "^3.1.10"
|
||||
mkdirp "^0.5.1"
|
||||
mkdirp "^0.5.3"
|
||||
neo-async "^2.6.1"
|
||||
node-libs-browser "^2.2.1"
|
||||
schema-utils "^1.0.0"
|
||||
tapable "^1.1.3"
|
||||
terser-webpack-plugin "^1.4.1"
|
||||
watchpack "^1.6.0"
|
||||
terser-webpack-plugin "^1.4.3"
|
||||
watchpack "^1.6.1"
|
||||
webpack-sources "^1.4.1"
|
||||
|
||||
websocket-driver@>=0.3.6:
|
||||
|
@ -52,14 +52,13 @@
|
||||
"query-string": "^6.8.1",
|
||||
"rusha": "^0.8.13",
|
||||
"serialize-error": "^3.0.0",
|
||||
"sloc": "^0.2.1",
|
||||
"strictdom": "^1.0.1",
|
||||
"string-replace-webpack-plugin": "^0.1.3",
|
||||
"terser-webpack-plugin": "^1.1.0",
|
||||
"typescript": "3.9.3",
|
||||
"uglify-template-string-loader": "^1.1.0",
|
||||
"unused-files-webpack-plugin": "^3.4.0",
|
||||
"webpack": "^4.31.0",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-bundle-analyzer": "^3.0.3",
|
||||
"webpack-cli": "^3.1.0",
|
||||
"webpack-deep-scope-plugin": "^1.6.0",
|
||||
@ -97,6 +96,6 @@
|
||||
"speed-measure-webpack-plugin": "^1.3.1",
|
||||
"strip-json-comments": "^3.0.1",
|
||||
"trim": "^0.0.1",
|
||||
"webpack-stream": "^5.1.0"
|
||||
"yarn": "^1.22.4"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 226 KiB |
Before Width: | Height: | Size: 527 KiB After Width: | Height: | Size: 523 KiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 1.0 MiB |
@ -449,6 +449,7 @@
|
||||
<key type="filename">sprites/blueprints/miner-chainable.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-fl.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.png</key>
|
||||
@ -459,6 +460,7 @@
|
||||
<key type="filename">sprites/blueprints/underground_belt_exit.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-fl.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/underground_belt_entry-tier2.png</key>
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 2.0 KiB |
@ -73,6 +73,9 @@ body {
|
||||
scrollbar-face-color: #888;
|
||||
scrollbar-track-color: rgba(255, 255, 255, 0.1);
|
||||
|
||||
// Firefox
|
||||
scrollbar-color: #cdd0d4 rgba(#000, 0.05);
|
||||
|
||||
overflow: hidden;
|
||||
@include Text;
|
||||
|
||||
@ -369,7 +372,7 @@ canvas {
|
||||
}
|
||||
|
||||
.pressed {
|
||||
transform: scale(0.95) !important;
|
||||
transform: scale(0.98) !important;
|
||||
animation: none !important;
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,6 @@
|
||||
.buildings {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
@include S(margin-bottom, 2px);
|
||||
|
||||
.building {
|
||||
color: $accentColorDark;
|
||||
@ -43,7 +42,7 @@
|
||||
@include S(width, 35px);
|
||||
@include S(height, 40px);
|
||||
|
||||
background: center center / 70% no-repeat;
|
||||
background: center center / 65% no-repeat;
|
||||
|
||||
&:not(.unlocked) {
|
||||
@include S(width, 20px);
|
||||
|
@ -55,6 +55,7 @@
|
||||
.dialogInner {
|
||||
opacity: 1;
|
||||
}
|
||||
backdrop-filter: blur(D(3px));
|
||||
}
|
||||
|
||||
.dialogInner {
|
||||
|
@ -1,6 +1,23 @@
|
||||
#state_AboutState {
|
||||
> .container .content {
|
||||
@include S(max-width, 600px);
|
||||
@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 {
|
||||
|
@ -1,5 +1,6 @@
|
||||
#state_ChangelogState {
|
||||
.content {
|
||||
@include S(max-width, 800px);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@
|
||||
opacity: 0;
|
||||
display: none;
|
||||
transform: translate(50%, 50%);
|
||||
filter: blur(10px);
|
||||
filter: blur(D(3px));
|
||||
|
||||
$opacity: 0.2;
|
||||
&.loaded {
|
||||
@ -178,6 +178,10 @@
|
||||
transform: translateX(50%) rotate(-7deg) scale(1.1);
|
||||
}
|
||||
}
|
||||
|
||||
@include DarkThemeOverride {
|
||||
color: $colorBlueBright;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,33 +205,6 @@
|
||||
flex-grow: 1;
|
||||
@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 {
|
||||
|
@ -1,113 +1,188 @@
|
||||
#state_SettingsState {
|
||||
.content {
|
||||
.versionbar {
|
||||
@include S(margin-top, 20px);
|
||||
@include SuperSmallText;
|
||||
display: grid;
|
||||
align-items: center;
|
||||
grid-template-columns: 1fr auto;
|
||||
.buildVersion {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: #aaadaf;
|
||||
$colorCategoryButton: #eee;
|
||||
$colorCategoryButtonSelected: #5f748b;
|
||||
|
||||
.container .content {
|
||||
display: flex;
|
||||
overflow-y: scroll;
|
||||
|
||||
.categoryContainer {
|
||||
width: 100%;
|
||||
|
||||
.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 {
|
||||
background-color: $colorGreenBright;
|
||||
}
|
||||
.sidebar {
|
||||
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 {
|
||||
@include S(padding, 10px);
|
||||
background: #eeeff5;
|
||||
@include S(border-radius, $globalBorderRadius);
|
||||
@include S(margin-bottom, 5px);
|
||||
|
||||
label {
|
||||
text-transform: uppercase;
|
||||
@include Text;
|
||||
.other {
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
.desc {
|
||||
@include S(margin-top, 5px);
|
||||
button {
|
||||
@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;
|
||||
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;
|
||||
.buildVersion {
|
||||
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;
|
||||
flex-direction: column;
|
||||
color: #aaadaf;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include DarkThemeOverride {
|
||||
.content {
|
||||
.setting {
|
||||
background: darken($darkModeGameBackground, 10);
|
||||
.container .content {
|
||||
.sidebar {
|
||||
button.categoryButton,
|
||||
button.about {
|
||||
background-color: #3f3f47;
|
||||
|
||||
.value.enum {
|
||||
// dirty but works
|
||||
filter: invert(0.85);
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.value.checkbox {
|
||||
background-color: #74767b;
|
||||
|
||||
&.checked {
|
||||
&.active {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,24 +1,18 @@
|
||||
.gameState.textualState {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
$padding: 15px;
|
||||
|
||||
.headerBar,
|
||||
> .container .content {
|
||||
@include S(width, 500px);
|
||||
}
|
||||
display: grid;
|
||||
grid-template-rows: auto 1fr;
|
||||
box-sizing: border-box;
|
||||
@include S(padding, 32px);
|
||||
height: 100vh;
|
||||
|
||||
.headerBar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
|
||||
h1 {
|
||||
display: flex;
|
||||
pointer-events: all;
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
align-items: center;
|
||||
pointer-events: all;
|
||||
cursor: pointer;
|
||||
@include SuperHeading;
|
||||
text-transform: uppercase;
|
||||
@ -39,11 +33,17 @@
|
||||
}
|
||||
|
||||
> .container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
overflow-y: auto;
|
||||
|
||||
> .content {
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
@include S(border-radius, $globalBorderRadius);
|
||||
@include S(padding, 10px);
|
||||
height: calc(80vh - #{D(60px)});
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
box-sizing: border-box;
|
||||
pointer-events: all;
|
||||
|
@ -385,7 +385,7 @@ export class Application {
|
||||
}
|
||||
|
||||
const scale = this.getEffectiveUiScale();
|
||||
waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", scale));
|
||||
waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", `${scale}`));
|
||||
window.focus();
|
||||
}
|
||||
}
|
||||
|
@ -4,8 +4,10 @@ export const CHANGELOG = [
|
||||
date: "unreleased",
|
||||
entries: [
|
||||
"WIRES",
|
||||
"Reworked menu UI design (by dengr1605)",
|
||||
"Allow holding ALT in belt planner to reverse direction (by jakobhellermann)",
|
||||
"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)",
|
||||
"Fix rare crash regarding the buildings toolbar (by isaisstillalive)",
|
||||
"Fixed some phrases (by EnderDoom77)",
|
||||
@ -24,7 +26,7 @@ export const CHANGELOG = [
|
||||
version: "1.1.19",
|
||||
date: "02.07.2020",
|
||||
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!",
|
||||
],
|
||||
},
|
||||
@ -151,7 +153,7 @@ export const CHANGELOG = [
|
||||
version: "1.1.10",
|
||||
date: "12.06.2020",
|
||||
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!",
|
||||
"Added and update more translations (Big thank you to all translators!)",
|
||||
"Prevent invalid connection if existing underground tunnel entrance exists (by jaysc)",
|
||||
@ -221,7 +223,7 @@ export const CHANGELOG = [
|
||||
entries: [
|
||||
"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!",
|
||||
"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 deselecting blueprints with right click and 'Q'",
|
||||
"Move default key for deleting from 'X' to 'DEL'",
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { Signal } from "./signal";
|
||||
|
||||
// @ts-ignore
|
||||
import BackgroundAnimationFrameEmitterWorker from "../webworkers/background_animation_frame_emittter.worker";
|
||||
import BackgroundAnimationFrameEmitterWorker from "worker-loader?inline=true&fallback=false!../webworkers/background_animation_frame_emittter.worker";
|
||||
|
||||
import { createLogger } from "./logging";
|
||||
const logger = createLogger("animation_frame");
|
||||
@ -14,12 +13,11 @@ export class AnimationFrame {
|
||||
this.frameEmitted = new Signal();
|
||||
this.bgFrameEmitted = new Signal();
|
||||
|
||||
this.lastTime = null;
|
||||
this.bgLastTime = null;
|
||||
this.lastTime = performance.now();
|
||||
this.bgLastTime = performance.now();
|
||||
|
||||
this.boundMethod = this.handleAnimationFrame.bind(this);
|
||||
|
||||
/** @type {Worker} */
|
||||
this.backgroundWorker = new BackgroundAnimationFrameEmitterWorker();
|
||||
this.backgroundWorker.addEventListener("error", err => {
|
||||
logger.error("Error in background fps worker:", err);
|
||||
@ -27,22 +25,16 @@ export class AnimationFrame {
|
||||
this.backgroundWorker.addEventListener("message", this.handleBackgroundTick.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {MessageEvent} event
|
||||
*/
|
||||
handleBackgroundTick(event) {
|
||||
handleBackgroundTick() {
|
||||
const time = performance.now();
|
||||
if (!this.bgLastTime) {
|
||||
// First update, first delta is always 16ms
|
||||
this.bgFrameEmitted.dispatch(1000 / 60);
|
||||
} else {
|
||||
let dt = time - this.bgLastTime;
|
||||
if (dt > maxDtMs) {
|
||||
dt = resetDtMs;
|
||||
}
|
||||
this.bgFrameEmitted.dispatch(dt);
|
||||
|
||||
let dt = time - this.bgLastTime;
|
||||
|
||||
if (dt > maxDtMs) {
|
||||
dt = resetDtMs;
|
||||
}
|
||||
|
||||
this.bgFrameEmitted.dispatch(dt);
|
||||
this.bgLastTime = time;
|
||||
}
|
||||
|
||||
@ -52,18 +44,15 @@ export class AnimationFrame {
|
||||
}
|
||||
|
||||
handleAnimationFrame(time) {
|
||||
if (!this.lastTime) {
|
||||
// First update, first delta is always 16ms
|
||||
this.frameEmitted.dispatch(1000 / 60);
|
||||
} else {
|
||||
let dt = time - this.lastTime;
|
||||
if (dt > maxDtMs) {
|
||||
// warn(this, "Clamping", dt, "to", resetDtMs);
|
||||
dt = resetDtMs;
|
||||
}
|
||||
this.frameEmitted.dispatch(dt);
|
||||
let dt = time - this.lastTime;
|
||||
|
||||
if (dt > maxDtMs) {
|
||||
dt = resetDtMs;
|
||||
}
|
||||
|
||||
this.frameEmitted.dispatch(dt);
|
||||
this.lastTime = time;
|
||||
|
||||
window.requestAnimationFrame(this.boundMethod);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
// @ts-ignore
|
||||
import CompressionWorker from "../webworkers/compression.worker";
|
||||
import CompressionWorker from "worker-loader?inline=true&fallback=false!../webworkers/compression.worker";
|
||||
import { createLogger } from "./logging";
|
||||
import { compressX64 } from "./lzstring";
|
||||
|
||||
const logger = createLogger("async_compression");
|
||||
|
||||
export let compressionPrefix = String.fromCodePoint(1);
|
||||
@ -35,7 +34,6 @@ if (!checkCryptPrefix(compressionPrefix)) {
|
||||
|
||||
class AsynCompression {
|
||||
constructor() {
|
||||
/** @type {Worker} */
|
||||
this.worker = new CompressionWorker();
|
||||
|
||||
this.currentJobId = 1000;
|
||||
|
@ -7,6 +7,7 @@ import { createLogger } from "./logging";
|
||||
import { Signal } from "./signal";
|
||||
import { SOUNDS, MUSIC } from "../platform/sound";
|
||||
import { AtlasDefinition, atlasFiles } from "./atlas_definitions";
|
||||
import { initBuildingCodesAfterResourcesLoaded } from "../game/meta_building_registry";
|
||||
|
||||
const logger = createLogger("background_loader");
|
||||
|
||||
@ -116,6 +117,7 @@ export class BackgroundResourcesLoader {
|
||||
logger.log("⏰ Finish load: bare game");
|
||||
Loader.createAtlasLinks();
|
||||
this.bareGameReady = true;
|
||||
initBuildingCodesAfterResourcesLoaded();
|
||||
this.signalBareGameLoaded.dispatch();
|
||||
this.internalStartLoadingAdditionalGameAssets();
|
||||
});
|
||||
|
@ -8,7 +8,7 @@ import { FILE_NOT_FOUND } from "../platform/storage";
|
||||
import { accessNestedPropertyReverse } from "./utils";
|
||||
import { IS_DEBUG, globalConfig } from "./config";
|
||||
import { ExplainedResult } from "./explained_result";
|
||||
import { decompressX64, compressX64 } from ".//lzstring";
|
||||
import { decompressX64, compressX64 } from "./lzstring";
|
||||
import { asyncCompressor, compressionPrefix } from "./async_compression";
|
||||
import { compressObject, decompressObject } from "../savegame/savegame_compressor";
|
||||
|
||||
|
@ -1,19 +1,12 @@
|
||||
import { globalConfig } from "./config";
|
||||
import { decompressX64, compressX64 } from "./lzstring";
|
||||
import { createHash } from "rusha";
|
||||
|
||||
const Rusha = require("rusha");
|
||||
|
||||
const encryptKey = globalConfig.info.sgSalt;
|
||||
|
||||
export function decodeHashedString(s) {
|
||||
return decompressX64(s);
|
||||
}
|
||||
import { decompressX64 } from "./lzstring";
|
||||
|
||||
export function sha1(str) {
|
||||
return Rusha.createHash().update(str).digest("hex");
|
||||
return createHash().update(str).digest("hex");
|
||||
}
|
||||
|
||||
// Window.location.host
|
||||
export function getNameOfProvider() {
|
||||
return window[decodeHashedString("DYewxghgLgliB2Q")][decodeHashedString("BYewzgLgdghgtgUyA")];
|
||||
return window[decompressX64("DYewxghgLgliB2Q")][decompressX64("BYewzgLgdghgtgUyA")];
|
||||
}
|
||||
|
@ -158,7 +158,9 @@ export class AtlasSprite extends BaseSprite {
|
||||
const scale = parameters.desiredAtlasScale;
|
||||
const link = this.linksByResolution[scale];
|
||||
|
||||
assert(link, "Link not known: " + scale + " (having " + Object.keys(this.linksByResolution) + ")");
|
||||
if (!link) {
|
||||
assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`);
|
||||
}
|
||||
|
||||
const scaleW = w / link.w;
|
||||
const scaleH = h / link.h;
|
||||
|
@ -81,10 +81,6 @@ export class Blueprint {
|
||||
for (let i = 0; i < this.entities.length; ++i) {
|
||||
const entity = this.entities[i];
|
||||
const staticComp = entity.components.StaticMapEntity;
|
||||
if (!staticComp.blueprintSpriteKey) {
|
||||
logger.warn("Blueprint entity without sprite!");
|
||||
return;
|
||||
}
|
||||
const newPos = staticComp.origin.add(tile);
|
||||
|
||||
const rect = staticComp.getTileSpaceBounds();
|
||||
@ -98,7 +94,7 @@ export class Blueprint {
|
||||
|
||||
staticComp.drawSpriteOnFullEntityBounds(
|
||||
parameters,
|
||||
Loader.getSprite(staticComp.blueprintSpriteKey),
|
||||
staticComp.getBlueprintSprite(),
|
||||
0,
|
||||
true,
|
||||
newPos
|
||||
|
72
src/js/game/building_codes.js
Normal 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;
|
||||
}
|
@ -1,4 +1,3 @@
|
||||
import { Loader } from "../../core/loader";
|
||||
import { formatItemsPerSecond } from "../../core/utils";
|
||||
import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector";
|
||||
import { SOUNDS } from "../../platform/sound";
|
||||
@ -40,6 +39,10 @@ export class MetaBeltBaseBuilding extends MetaBuilding {
|
||||
return SOUNDS.placeBelt;
|
||||
}
|
||||
|
||||
getSprite() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the entity at the given location
|
||||
* @param {Entity} entity
|
||||
@ -88,7 +91,6 @@ export class MetaBeltBaseBuilding extends MetaBuilding {
|
||||
updateVariants(entity, rotationVariant) {
|
||||
entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant];
|
||||
entity.components.ItemEjector.slots[0].direction = arrayBeltVariantToRotation[rotationVariant];
|
||||
entity.components.StaticMapEntity.spriteKey = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -28,6 +28,11 @@ export class MetaHubBuilding extends MetaBuilding {
|
||||
return null;
|
||||
}
|
||||
|
||||
getSprite() {
|
||||
// We render it ourself
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the entity at the given location
|
||||
* @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 ItemAcceptorComponent({
|
||||
|
@ -71,6 +71,10 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
|
||||
return super.getAvailableVariants(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} rotationVariant
|
||||
* @param {string} variant
|
||||
*/
|
||||
getPreviewSprite(rotationVariant, variant) {
|
||||
let suffix = "";
|
||||
if (variant !== defaultBuildingVariant) {
|
||||
@ -87,6 +91,10 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} rotationVariant
|
||||
* @param {string} variant
|
||||
*/
|
||||
getBlueprintSprite(rotationVariant, variant) {
|
||||
let suffix = "";
|
||||
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
|
||||
*/
|
||||
@ -201,10 +217,6 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
|
||||
*/
|
||||
updateVariants(entity, rotationVariant, variant) {
|
||||
entity.components.UndergroundBelt.tier = enumUndergroundBeltVariantToTier[variant];
|
||||
entity.components.StaticMapEntity.spriteKey = this.getPreviewSprite(
|
||||
rotationVariant,
|
||||
variant
|
||||
).spriteName;
|
||||
|
||||
switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
|
||||
case enumUndergroundBeltMode.sender: {
|
||||
|
@ -88,7 +88,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
|
||||
]);
|
||||
|
||||
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 },
|
||||
]);
|
||||
|
||||
@ -98,7 +98,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
|
||||
entity.components.ItemAcceptor.setSlots([
|
||||
{
|
||||
pos: new Vector(0, 0),
|
||||
directions: [enumDirection.left],
|
||||
directions: [enumDirection.top],
|
||||
layer: enumLayer.wires,
|
||||
},
|
||||
{
|
||||
@ -109,7 +109,7 @@ export class MetaWireCrossingsBuilding extends MetaBuilding {
|
||||
]);
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import { AtlasSprite } from "../../core/sprites";
|
||||
import { enumDirection, Vector } from "../../core/vector";
|
||||
import { types } from "../../savegame/serialization";
|
||||
import { Component } from "../component";
|
||||
import { getBuildingDataFromCode } from "../building_codes";
|
||||
|
||||
export class StaticMapEntityComponent extends Component {
|
||||
static getId() {
|
||||
@ -17,21 +18,43 @@ export class StaticMapEntityComponent extends Component {
|
||||
tileSize: types.tileVector,
|
||||
rotation: types.float,
|
||||
originalRotation: types.float,
|
||||
spriteKey: types.nullable(types.string),
|
||||
blueprintSpriteKey: types.string,
|
||||
silhouetteColor: types.nullable(types.string),
|
||||
|
||||
// See building_codes.js
|
||||
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() {
|
||||
return new StaticMapEntityComponent({
|
||||
origin: this.origin.copy(),
|
||||
tileSize: this.tileSize.copy(),
|
||||
rotation: this.rotation,
|
||||
originalRotation: this.originalRotation,
|
||||
spriteKey: this.spriteKey,
|
||||
silhouetteColor: this.silhouetteColor,
|
||||
blueprintSpriteKey: this.blueprintSpriteKey,
|
||||
code: this.code,
|
||||
});
|
||||
}
|
||||
|
||||
@ -42,18 +65,14 @@ export class StaticMapEntityComponent extends Component {
|
||||
* @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.originalRotation Original Rotation in degrees. Must be multiple of 90
|
||||
* @param {string=} param0.spriteKey Optional sprite
|
||||
* @param {string} param0.blueprintSpriteKey Blueprint sprite, required
|
||||
* @param {string=} param0.silhouetteColor Optional silhouette color override
|
||||
* @param {number=} param0.code Building code
|
||||
*/
|
||||
constructor({
|
||||
origin = new Vector(),
|
||||
tileSize = new Vector(1, 1),
|
||||
rotation = 0,
|
||||
originalRotation = 0,
|
||||
spriteKey = null,
|
||||
silhouetteColor = null,
|
||||
blueprintSpriteKey = null,
|
||||
code = 0,
|
||||
}) {
|
||||
super();
|
||||
assert(
|
||||
@ -63,11 +82,9 @@ export class StaticMapEntityComponent extends Component {
|
||||
|
||||
this.origin = origin;
|
||||
this.tileSize = tileSize;
|
||||
this.spriteKey = spriteKey;
|
||||
this.rotation = rotation;
|
||||
this.code = code;
|
||||
this.originalRotation = originalRotation;
|
||||
this.silhouetteColor = silhouetteColor;
|
||||
this.blueprintSpriteKey = blueprintSpriteKey;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -18,6 +18,7 @@ import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
import { HUDBuildingPlacerLogic } from "./building_placer_logic";
|
||||
import { makeOffscreenBuffer } from "../../../core/buffer_utils";
|
||||
import { enumLayer } from "../../root";
|
||||
import { getCodeFromBuildingData } from "../../building_codes";
|
||||
|
||||
export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
|
||||
/**
|
||||
@ -84,9 +85,8 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
|
||||
label: "lock-direction-indicator",
|
||||
});
|
||||
|
||||
// Loader.getSprite("sprites/misc/lock_direction_indicator.png").draw(context, 0, 0, 48, 48);
|
||||
context.fillStyle = THEME.map.directionLock[enumLayer.wires].color;
|
||||
context.strokeStyle = THEME.map.directionLock[enumLayer.wires].color;
|
||||
context.fillStyle = THEME.map.directionLock[layer].color;
|
||||
context.strokeStyle = THEME.map.directionLock[layer].color;
|
||||
context.lineWidth = 2;
|
||||
|
||||
const padding = 5;
|
||||
@ -313,6 +313,11 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
|
||||
staticComp.rotation = rotation;
|
||||
staticComp.tileSize = metaBuilding.getDimensions(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);
|
||||
|
||||
|
@ -13,6 +13,7 @@ import { SOUNDS } from "../../../platform/sound";
|
||||
import { MetaMinerBuilding, enumMinerVariants } from "../../buildings/miner";
|
||||
import { enumHubGoalRewards } from "../../tutorial_goals";
|
||||
import { enumLayer } from "../../root";
|
||||
import { getBuildingDataFromCode, getCodeFromBuildingData } from "../../building_codes";
|
||||
|
||||
/**
|
||||
* 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
|
||||
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 (
|
||||
!extracted ||
|
||||
(extracted.metaBuilding === this.currentMetaBuilding.get() &&
|
||||
extracted.variant === this.currentVariant.get())
|
||||
this.currentMetaBuilding.get() &&
|
||||
extracted.metaInstance.getId() === this.currentMetaBuilding.get().getId() &&
|
||||
extracted.variant === this.currentVariant.get()
|
||||
) {
|
||||
this.currentMetaBuilding.set(null);
|
||||
return;
|
||||
}
|
||||
|
||||
this.currentMetaBuilding.set(extracted.metaBuilding);
|
||||
this.currentMetaBuilding.set(extracted.metaInstance);
|
||||
this.currentVariant.set(extracted.variant);
|
||||
this.currentBaseRotation = contents.components.StaticMapEntity.rotation;
|
||||
}
|
||||
|
||||
/**
|
||||
* HACK!
|
||||
*
|
||||
* This attempts to reconstruct the meta building and its variant from a given entity
|
||||
* @param {Entity} entity
|
||||
* @returns {{ metaBuilding: MetaBuilding, variant: string }}
|
||||
* Switches the side for the direction lock manually
|
||||
*/
|
||||
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() {
|
||||
this.currentDirectionLockSide = 1 - this.currentDirectionLockSide;
|
||||
}
|
||||
@ -673,7 +592,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
|
||||
origin: new Vector(0, 0),
|
||||
rotation: 0,
|
||||
tileSize: metaBuilding.getDimensions(this.currentVariant.get()).copy(),
|
||||
blueprintSpriteKey: "",
|
||||
code: getCodeFromBuildingData(metaBuilding, variant, 0),
|
||||
})
|
||||
);
|
||||
metaBuilding.updateVariants(this.fakeEntity, 0, this.currentVariant.get());
|
||||
|
@ -88,8 +88,8 @@ export class HUDDebugInfo extends BaseHUDPart {
|
||||
const mouseTile = this.root.camera.screenToWorld(mousePos).toTileSpace();
|
||||
const cameraTile = this.root.camera.center.toTileSpace();
|
||||
|
||||
this.trackedMousePosition.set(`Pos: <code>${mouseTile.x}</code> / <code>${mouseTile.y}</code>`);
|
||||
this.trackedCameraPosition.set(`Center: <code>${cameraTile.x}</code> / <code>${cameraTile.y}</code>`);
|
||||
this.trackedMousePosition.set(`Mouse: <code>${mouseTile.x}</code> / <code>${mouseTile.y}</code>`);
|
||||
this.trackedCameraPosition.set(`Camera: <code>${cameraTile.x}</code> / <code>${cameraTile.y}</code>`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -15,7 +15,9 @@ export class HUDEntityDebugger extends BaseHUDPart {
|
||||
`
|
||||
);
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
this.mousePosElem = this.element.querySelector(".mousePos");
|
||||
/** @type {HTMLElement} */
|
||||
this.chunkPosElem = this.element.querySelector(".chunkPos");
|
||||
this.entityInfoElem = this.element.querySelector(".entityInfo");
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ export class HUDSettingsMenu extends BaseHUDPart {
|
||||
<strong>${T.ingame.settingsMenu.beltsPlaced}</strong><span class="beltsPlaced"></span>
|
||||
<strong>${T.ingame.settingsMenu.buildingsPlaced}</strong><span class="buildingsPlaced"></span>
|
||||
<strong>${T.ingame.settingsMenu.playtime}</strong><span class="playtime"></span>
|
||||
|
||||
|
||||
`
|
||||
);
|
||||
|
||||
@ -106,16 +106,22 @@ export class HUDSettingsMenu extends BaseHUDPart {
|
||||
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
|
||||
|
||||
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(BeltComponent).length
|
||||
);
|
||||
this.statsElement.querySelector(".beltsPlaced").innerText = formatBigNumberFull(
|
||||
|
||||
beltsPlacedElement.innerText = formatBigNumberFull(
|
||||
this.root.entityMgr.getAllWithComponent(BeltComponent).length
|
||||
);
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import { SOUNDS } from "../platform/sound";
|
||||
import { StaticMapEntityComponent } from "./components/static_map_entity";
|
||||
import { Entity } from "./entity";
|
||||
import { enumLayer, GameRoot } from "./root";
|
||||
import { getCodeFromBuildingData } from "./building_codes";
|
||||
|
||||
export const defaultBuildingVariant = "default";
|
||||
|
||||
@ -157,20 +158,13 @@ export class MetaBuilding {
|
||||
createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
|
||||
const entity = new Entity(root);
|
||||
entity.layer = this.getLayer();
|
||||
const blueprintSprite = this.getBlueprintSprite(rotationVariant, variant);
|
||||
entity.addComponent(
|
||||
new StaticMapEntityComponent({
|
||||
spriteKey:
|
||||
"sprites/buildings/" +
|
||||
this.id +
|
||||
(variant === defaultBuildingVariant ? "" : "-" + variant) +
|
||||
".png",
|
||||
origin: new Vector(origin.x, origin.y),
|
||||
rotation,
|
||||
originalRotation,
|
||||
tileSize: this.getDimensions(variant).copy(),
|
||||
silhouetteColor: this.getSilhouetteColor(),
|
||||
blueprintSpriteKey: blueprintSprite ? blueprintSprite.spriteName : "",
|
||||
code: getCodeFromBuildingData(this, variant, rotationVariant),
|
||||
})
|
||||
);
|
||||
this.setupEntityComponents(entity, root);
|
||||
@ -178,6 +172,21 @@ export class MetaBuilding {
|
||||
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
|
||||
* @param {object} param0
|
||||
|
@ -1,20 +1,25 @@
|
||||
import { gMetaBuildingRegistry } from "../core/global_registries";
|
||||
import { MetaBeltBaseBuilding } from "./buildings/belt_base";
|
||||
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 { createLogger } from "../core/logging";
|
||||
import { MetaAdvancedProcessorBuilding } from "./buildings/advanced_processor";
|
||||
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() {
|
||||
gMetaBuildingRegistry.register(MetaSplitterBuilding);
|
||||
@ -32,4 +37,106 @@ export function initMetaBuildingRegistry() {
|
||||
gMetaBuildingRegistry.register(MetaWireBaseBuilding);
|
||||
gMetaBuildingRegistry.register(MetaAdvancedProcessorBuilding);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -513,57 +513,70 @@ export class ShapeDefinition extends BasicSerializableObject {
|
||||
* @param {ShapeDefinition} definition
|
||||
*/
|
||||
cloneAndStackWith(definition) {
|
||||
const newLayers = this.internalCloneLayers();
|
||||
|
||||
if (this.isEntirelyEmpty() || definition.isEntirelyEmpty()) {
|
||||
assert(false, "Can not stack entirely empty definition");
|
||||
}
|
||||
|
||||
// Put layer for layer on top
|
||||
for (let i = 0; i < definition.layers.length; ++i) {
|
||||
const layerToAdd = definition.layers[i];
|
||||
const bottomShapeLayers = this.layers;
|
||||
const bottomShapeHighestLayerByQuad = [-1, -1, -1, -1];
|
||||
|
||||
// On which layer we can merge this upper layer
|
||||
let mergeOnLayerIndex = null;
|
||||
|
||||
// Go from top to bottom and check if there is anything intercepting it
|
||||
for (let k = newLayers.length - 1; k >= 0; --k) {
|
||||
const lowerLayer = newLayers[k];
|
||||
|
||||
let canMerge = true;
|
||||
for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) {
|
||||
const upperItem = layerToAdd[quadrantIndex];
|
||||
const lowerItem = lowerLayer[quadrantIndex];
|
||||
|
||||
if (upperItem && lowerItem) {
|
||||
// so, we can't merge it because two items conflict
|
||||
canMerge = false;
|
||||
break;
|
||||
}
|
||||
for (let layer = bottomShapeLayers.length - 1; layer >= 0; --layer) {
|
||||
const shapeLayer = bottomShapeLayers[layer];
|
||||
for (let quad = 0; quad < 4; ++quad) {
|
||||
const shapeQuad = shapeLayer[quad];
|
||||
if (shapeQuad !== null && bottomShapeHighestLayerByQuad[quad] < layer) {
|
||||
bottomShapeHighestLayerByQuad[quad] = layer;
|
||||
}
|
||||
|
||||
// If we can merge it, store it - since we go from top to bottom
|
||||
// we can simply override it
|
||||
if (canMerge) {
|
||||
mergeOnLayerIndex = k;
|
||||
}
|
||||
}
|
||||
|
||||
if (mergeOnLayerIndex !== null) {
|
||||
// Simply merge using an OR mask
|
||||
for (let quadrantIndex = 0; quadrantIndex < 4; ++quadrantIndex) {
|
||||
newLayers[mergeOnLayerIndex][quadrantIndex] =
|
||||
newLayers[mergeOnLayerIndex][quadrantIndex] || layerToAdd[quadrantIndex];
|
||||
}
|
||||
} else {
|
||||
// Add new layer
|
||||
newLayers.push(layerToAdd);
|
||||
}
|
||||
}
|
||||
|
||||
newLayers.splice(4);
|
||||
const topShapeLayers = definition.layers;
|
||||
const topShapeLowestLayerByQuad = [4, 4, 4, 4];
|
||||
|
||||
return new ShapeDefinition({ layers: newLayers });
|
||||
for (let layer = 0; layer < topShapeLayers.length; ++layer) {
|
||||
const shapeLayer = topShapeLayers[layer];
|
||||
for (let quad = 0; quad < 4; ++quad) {
|
||||
const shapeQuad = shapeLayer[quad];
|
||||
if (shapeQuad !== null && topShapeLowestLayerByQuad[quad] > layer) {
|
||||
topShapeLowestLayerByQuad[quad] = layer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We want to find the number `layerToMergeAt` such that when the top shape is placed at that
|
||||
* layer, the smallest gap between shapes is only 1. Instead of doing a guess-and-check method to
|
||||
* find the appropriate layer, we just calculate all the gaps assuming a merge at layer 0, even
|
||||
* though they go negative, and calculating the number to add to it so the minimum gap is 1 (ends
|
||||
* up being 1 - minimum).
|
||||
*/
|
||||
const gapsBetweenShapes = [];
|
||||
for (let quad = 0; quad < 4; ++quad) {
|
||||
gapsBetweenShapes.push(topShapeLowestLayerByQuad[quad] - bottomShapeHighestLayerByQuad[quad]);
|
||||
}
|
||||
const smallestGapBetweenShapes = Math.min(...gapsBetweenShapes);
|
||||
// Can't merge at a layer lower than 0
|
||||
const layerToMergeAt = Math.max(1 - smallestGapBetweenShapes, 0);
|
||||
|
||||
const mergedLayers = this.internalCloneLayers();
|
||||
for (let layer = mergedLayers.length; layer < layerToMergeAt + topShapeLayers.length; ++layer) {
|
||||
mergedLayers.push([null, null, null, null]);
|
||||
}
|
||||
|
||||
for (let layer = 0; layer < topShapeLayers.length; ++layer) {
|
||||
const layerMergingAt = layerToMergeAt + layer;
|
||||
const bottomShapeLayer = mergedLayers[layerMergingAt];
|
||||
const topShapeLayer = topShapeLayers[layer];
|
||||
for (let quad = 0; quad < 4; quad++) {
|
||||
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 });
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -44,7 +44,7 @@ export class StaticMapEntitySystem extends GameSystem {
|
||||
const staticComp = entity.components.StaticMapEntity;
|
||||
if (drawOutlinesOnly) {
|
||||
const rect = staticComp.getTileSpaceBounds();
|
||||
parameters.context.fillStyle = staticComp.silhouetteColor || "#aaa";
|
||||
parameters.context.fillStyle = staticComp.getSilhouetteColor() || "#aaa";
|
||||
const beltComp = entity.components.Belt;
|
||||
if (beltComp) {
|
||||
const sprite = this.beltOverviewSprites[beltComp.direction];
|
||||
@ -58,9 +58,8 @@ export class StaticMapEntitySystem extends GameSystem {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
const spriteKey = staticComp.spriteKey;
|
||||
if (spriteKey) {
|
||||
const sprite = Loader.getSprite(spriteKey);
|
||||
const sprite = staticComp.getSprite();
|
||||
if (sprite) {
|
||||
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false);
|
||||
}
|
||||
}
|
||||
@ -91,9 +90,8 @@ export class StaticMapEntitySystem extends GameSystem {
|
||||
drawnUids.add(entity.uid);
|
||||
const staticComp = entity.components.StaticMapEntity;
|
||||
|
||||
const spriteKey = staticComp.spriteKey;
|
||||
if (spriteKey) {
|
||||
const sprite = Loader.getSprite(spriteKey);
|
||||
const sprite = staticComp.getSprite();
|
||||
if (sprite) {
|
||||
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 2, false);
|
||||
}
|
||||
}
|
||||
|
20
src/js/globals.d.ts
vendored
@ -36,11 +36,6 @@ declare interface CanvasRenderingContext2D {
|
||||
webkitImageSmoothingEnabled: boolean;
|
||||
}
|
||||
|
||||
declare interface HTMLCanvasElement {
|
||||
opaque: boolean;
|
||||
webkitOpaque: boolean;
|
||||
}
|
||||
|
||||
// Just for compatibility with the shared code
|
||||
declare interface Logger {
|
||||
log(...args);
|
||||
@ -127,13 +122,6 @@ declare interface NodeRequire {
|
||||
context(src: string, flag: boolean, regexp: RegExp): WebpackContext;
|
||||
}
|
||||
|
||||
// HTML Element
|
||||
declare interface Element {
|
||||
style: any;
|
||||
innerText: string;
|
||||
innerHTML: string;
|
||||
}
|
||||
|
||||
declare interface Object {
|
||||
entries(obj: object): Array<[string, any]>;
|
||||
}
|
||||
@ -202,3 +190,11 @@ declare interface TypedSignal<T extends Array<any>> {
|
||||
|
||||
removeAll();
|
||||
}
|
||||
|
||||
declare module "worker-loader?inline=true&fallback=false!*" {
|
||||
class WebpackWorker extends Worker {
|
||||
constructor();
|
||||
}
|
||||
|
||||
export default WebpackWorker;
|
||||
}
|
||||
|
@ -81,6 +81,13 @@ export const LANGUAGES = {
|
||||
region: "",
|
||||
},
|
||||
|
||||
"tr": {
|
||||
name: "Türkçe",
|
||||
data: require("./built-temp/base-tr.json"),
|
||||
code: "tr",
|
||||
region: "",
|
||||
},
|
||||
|
||||
"zh-CN": {
|
||||
// simplified
|
||||
name: "中文简体",
|
||||
|
@ -102,7 +102,10 @@ export class AdinplayAdProvider extends AdProviderInterface {
|
||||
|
||||
// Add the player
|
||||
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;
|
||||
window.aiptag.cmd.player.push(function () {
|
||||
|
@ -13,8 +13,14 @@ import { LANGUAGES } from "../languages";
|
||||
|
||||
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 = [
|
||||
{
|
||||
@ -122,7 +128,7 @@ export const allApplicationSettings = [
|
||||
options: Object.keys(LANGUAGES),
|
||||
valueGetter: key => key,
|
||||
textGetter: key => LANGUAGES[key].name,
|
||||
category: categoryApp,
|
||||
category: enumCategories.general,
|
||||
restartRequired: true,
|
||||
changeCb: (app, id) => null,
|
||||
magicValue: "auto-detect",
|
||||
@ -132,7 +138,7 @@ export const allApplicationSettings = [
|
||||
options: uiScales.sort((a, b) => a.size - b.size),
|
||||
valueGetter: scale => scale.id,
|
||||
textGetter: scale => T.settings.labels.uiScale.scales[scale.id],
|
||||
category: categoryApp,
|
||||
category: enumCategories.userInterface,
|
||||
restartRequired: false,
|
||||
changeCb:
|
||||
/**
|
||||
@ -143,7 +149,7 @@ export const allApplicationSettings = [
|
||||
|
||||
new BoolSetting(
|
||||
"fullscreen",
|
||||
categoryApp,
|
||||
enumCategories.general,
|
||||
/**
|
||||
* @param {Application} app
|
||||
*/
|
||||
@ -157,7 +163,7 @@ export const allApplicationSettings = [
|
||||
|
||||
new BoolSetting(
|
||||
"soundsMuted",
|
||||
categoryApp,
|
||||
enumCategories.general,
|
||||
/**
|
||||
* @param {Application} app
|
||||
*/
|
||||
@ -165,7 +171,7 @@ export const allApplicationSettings = [
|
||||
),
|
||||
new BoolSetting(
|
||||
"musicMuted",
|
||||
categoryApp,
|
||||
enumCategories.general,
|
||||
/**
|
||||
* @param {Application} app
|
||||
*/
|
||||
@ -174,7 +180,7 @@ export const allApplicationSettings = [
|
||||
|
||||
new BoolSetting(
|
||||
"enableColorBlindHelper",
|
||||
categoryApp,
|
||||
enumCategories.general,
|
||||
/**
|
||||
* @param {Application} app
|
||||
*/
|
||||
@ -182,13 +188,13 @@ export const allApplicationSettings = [
|
||||
),
|
||||
|
||||
// GAME
|
||||
new BoolSetting("offerHints", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("offerHints", enumCategories.userInterface, (app, value) => {}),
|
||||
|
||||
new EnumSetting("theme", {
|
||||
options: Object.keys(THEMES),
|
||||
valueGetter: theme => theme,
|
||||
textGetter: theme => T.settings.labels.theme.themes[theme],
|
||||
category: categoryGame,
|
||||
category: enumCategories.userInterface,
|
||||
restartRequired: false,
|
||||
changeCb:
|
||||
/**
|
||||
@ -205,7 +211,7 @@ export const allApplicationSettings = [
|
||||
options: autosaveIntervals,
|
||||
valueGetter: interval => interval.id,
|
||||
textGetter: interval => T.settings.labels.autosaveInterval.intervals[interval.id],
|
||||
category: categoryGame,
|
||||
category: enumCategories.advanced,
|
||||
restartRequired: false,
|
||||
changeCb:
|
||||
/**
|
||||
@ -218,7 +224,7 @@ export const allApplicationSettings = [
|
||||
options: ["60", "100", "120", "144", "165", "250", G_IS_DEV ? "10" : "500"],
|
||||
valueGetter: rate => rate,
|
||||
textGetter: rate => rate + " Hz",
|
||||
category: categoryGame,
|
||||
category: enumCategories.advanced,
|
||||
restartRequired: false,
|
||||
changeCb: (app, id) => {},
|
||||
enabled: !IS_DEMO,
|
||||
@ -228,7 +234,7 @@ export const allApplicationSettings = [
|
||||
options: scrollWheelSensitivities.sort((a, b) => a.scale - b.scale),
|
||||
valueGetter: scale => scale.id,
|
||||
textGetter: scale => T.settings.labels.scrollWheelSensitivity.sensitivity[scale.id],
|
||||
category: categoryGame,
|
||||
category: enumCategories.advanced,
|
||||
restartRequired: false,
|
||||
changeCb:
|
||||
/**
|
||||
@ -241,17 +247,17 @@ export const allApplicationSettings = [
|
||||
options: movementSpeeds.sort((a, b) => a.multiplier - b.multiplier),
|
||||
valueGetter: multiplier => multiplier.id,
|
||||
textGetter: multiplier => T.settings.labels.movementSpeed.speeds[multiplier.id],
|
||||
category: categoryGame,
|
||||
category: enumCategories.advanced,
|
||||
restartRequired: false,
|
||||
changeCb: (app, id) => {},
|
||||
}),
|
||||
|
||||
new BoolSetting("alwaysMultiplace", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("enableTunnelSmartplace", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("vignette", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("compactBuildingInfo", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("disableCutDeleteWarnings", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("rotationByBuilding", categoryGame, (app, value) => {}),
|
||||
new BoolSetting("alwaysMultiplace", enumCategories.advanced, (app, value) => {}),
|
||||
new BoolSetting("enableTunnelSmartplace", enumCategories.advanced, (app, value) => {}),
|
||||
new BoolSetting("vignette", enumCategories.userInterface, (app, value) => {}),
|
||||
new BoolSetting("compactBuildingInfo", enumCategories.userInterface, (app, value) => {}),
|
||||
new BoolSetting("disableCutDeleteWarnings", enumCategories.advanced, (app, value) => {}),
|
||||
new BoolSetting("rotationByBuilding", enumCategories.advanced, (app, value) => {}),
|
||||
];
|
||||
|
||||
export function getApplicationSettingById(id) {
|
||||
|
@ -40,7 +40,7 @@ export class BaseSetting {
|
||||
|
||||
/**
|
||||
* @param {Application} app
|
||||
* @param {Element} element
|
||||
* @param {HTMLElement} element
|
||||
* @param {any} dialogs
|
||||
*/
|
||||
bind(app, element, dialogs) {
|
||||
@ -188,7 +188,7 @@ export class BoolSetting extends BaseSetting {
|
||||
return `
|
||||
<div class="setting cardbox ${this.enabled ? "enabled" : "disabled"}">
|
||||
${this.enabled ? "" : `<span class="standaloneOnlyHint">${T.demo.settingNotAvailable}</span>`}
|
||||
|
||||
|
||||
<div class="row">
|
||||
<label>${T.settings.labels[this.id].title}</label>
|
||||
<div class="value checkbox checked" data-setting="${this.id}">
|
||||
|
@ -44,16 +44,18 @@ function decompressInt(s) {
|
||||
}
|
||||
|
||||
// Sanity
|
||||
for (let i = 0; i < 10000; ++i) {
|
||||
if (decompressInt(compressInt(i)) !== i) {
|
||||
throw new Error(
|
||||
"Bad compression for: " +
|
||||
i +
|
||||
" compressed: " +
|
||||
compressInt(i) +
|
||||
" decompressed: " +
|
||||
decompressInt(compressInt(i))
|
||||
);
|
||||
if (G_IS_DEV) {
|
||||
for (let i = 0; i < 10000; ++i) {
|
||||
if (decompressInt(compressInt(i)) !== i) {
|
||||
throw new Error(
|
||||
"Bad compression for: " +
|
||||
i +
|
||||
" compressed: " +
|
||||
compressInt(i) +
|
||||
" decompressed: " +
|
||||
decompressInt(compressInt(i))
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,7 @@
|
||||
import { TextualGameState } from "../core/textual_game_state";
|
||||
import { SOUNDS } from "../platform/sound";
|
||||
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 { cachebust } from "../core/cachebust";
|
||||
|
||||
export class AboutState extends TextualGameState {
|
||||
constructor() {
|
||||
@ -15,9 +13,16 @@ export class AboutState extends TextualGameState {
|
||||
}
|
||||
|
||||
getMainContentHTML() {
|
||||
return T.about.body
|
||||
.replace("<githublink>", THIRDPARTY_URLS.github)
|
||||
.replace("<discordlink>", THIRDPARTY_URLS.discord);
|
||||
return `
|
||||
<div class="head">
|
||||
<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() {
|
||||
|
@ -46,7 +46,7 @@ export class MainMenuState extends GameState {
|
||||
: ""
|
||||
}
|
||||
</div>
|
||||
|
||||
|
||||
<video autoplay muted loop class="fullscreenBackgroundVideo">
|
||||
<source src="${cachebust("res/bg_render.webm")}" type="video/webm">
|
||||
</video>
|
||||
@ -92,10 +92,10 @@ export class MainMenuState extends GameState {
|
||||
<a class="redditLink">${T.mainMenu.subreddit}</a>
|
||||
|
||||
<a class="changelog">${T.changelog.title}</a>
|
||||
|
||||
|
||||
<a class="helpTranslate">${T.mainMenu.helpTranslate}</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="author">${T.mainMenu.madeBy.replace(
|
||||
"<author-link>",
|
||||
'<a class="producerLink" target="_blank">Tobias Springer</a>'
|
||||
@ -218,11 +218,6 @@ export class MainMenuState extends GameState {
|
||||
this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked);
|
||||
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked);
|
||||
|
||||
const contestButton = qs(".participateContest");
|
||||
if (contestButton) {
|
||||
this.trackClicks(contestButton, this.onContestClicked);
|
||||
}
|
||||
|
||||
if (G_IS_STANDALONE) {
|
||||
this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked);
|
||||
}
|
||||
@ -312,15 +307,6 @@ export class MainMenuState extends GameState {
|
||||
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() {
|
||||
this.app.analytics.trackUiClick("choose_language");
|
||||
const setting = /** @type {EnumSetting} */ (getApplicationSettingById("language"));
|
||||
|
@ -37,7 +37,7 @@ export class PreloadState extends GameState {
|
||||
return false;
|
||||
}
|
||||
|
||||
onEnter(payload) {
|
||||
onEnter() {
|
||||
this.htmlElement.classList.add("prefab_LoadingState");
|
||||
|
||||
const elementsToRemove = ["#loadingPreload", "#fontPreload"];
|
||||
@ -52,9 +52,13 @@ export class PreloadState extends GameState {
|
||||
const dialogsElement = document.body.querySelector(".modalDialogParent");
|
||||
this.dialogs.initializeToElement(dialogsElement);
|
||||
|
||||
/** @type {HTMLElement} */
|
||||
this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc");
|
||||
/** @type {HTMLElement} */
|
||||
this.statusBar = this.htmlElement.querySelector(".loadingStatus > .bar > .inner");
|
||||
/** @type {HTMLElement} */
|
||||
this.statusBarText = this.htmlElement.querySelector(".loadingStatus > .bar > .status");
|
||||
|
||||
this.currentStatus = "booting";
|
||||
this.currentIndex = 0;
|
||||
|
||||
@ -251,12 +255,12 @@ export class PreloadState extends GameState {
|
||||
${this.currentStatus} failed:<br/>
|
||||
${text}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="supportHelp">
|
||||
Please send me an email with steps to reproduce and what you did before this happened:
|
||||
<br /><a class="email" href="mailto:${email}?subject=App%20does%20not%20launch">${email}</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="lower">
|
||||
<button class="resetApp styledButton">Reset App</button>
|
||||
<i>Build ${G_BUILD_VERSION} @ ${G_BUILD_COMMIT_HASH}</i>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { TextualGameState } from "../core/textual_game_state";
|
||||
import { formatSecondsToTimeAgo } from "../core/utils";
|
||||
import { allApplicationSettings } from "../profile/application_settings";
|
||||
import { allApplicationSettings, enumCategories } from "../profile/application_settings";
|
||||
import { T } from "../translations";
|
||||
|
||||
export class SettingsState extends TextualGameState {
|
||||
@ -15,50 +15,65 @@ export class SettingsState extends TextualGameState {
|
||||
getMainContentHTML() {
|
||||
return `
|
||||
|
||||
<div class="upperLinks">
|
||||
<div class="sidebar">
|
||||
${this.getCategoryButtonsHtml()}
|
||||
|
||||
${
|
||||
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>
|
||||
|
||||
|
||||
${this.getSettingsHtml()}
|
||||
<div class="versionbar">
|
||||
<div class="buildVersion">${T.global.loading} ...</div>
|
||||
<div class="versionbar">
|
||||
<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() {
|
||||
let lastCategory = null;
|
||||
let html = "";
|
||||
const categoriesHTML = {};
|
||||
|
||||
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) {
|
||||
const setting = allApplicationSettings[i];
|
||||
|
||||
if (setting.categoryId !== lastCategory) {
|
||||
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>";
|
||||
categoriesHTML[setting.categoryId] += setting.getHtml();
|
||||
}
|
||||
|
||||
return html;
|
||||
return Object.keys(categoriesHTML)
|
||||
.map(k => categoriesHTML[k] + "</div>")
|
||||
.join("");
|
||||
}
|
||||
|
||||
renderBuildText() {
|
||||
@ -90,10 +105,33 @@ export class SettingsState extends TextualGameState {
|
||||
}
|
||||
|
||||
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() {
|
||||
allApplicationSettings.forEach(setting => {
|
||||
/** @type {HTMLElement} */
|
||||
const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
|
||||
setting.bind(this.app, element, this.dialogs);
|
||||
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() {
|
||||
this.moveToStateAddGoBack("AboutState");
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
/* Basic Options */
|
||||
"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'. */,
|
||||
// "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. */,
|
||||
"checkJs": true /* Report errors in .js files. */,
|
||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||
@ -54,5 +54,6 @@
|
||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||
"resolveJsonModule": true
|
||||
}
|
||||
},
|
||||
"exclude": ["webworkers"]
|
||||
}
|
||||
|
@ -1,15 +1,14 @@
|
||||
// We clamp high deltas so 30 fps is fairly ok
|
||||
var bgFps = 30;
|
||||
var desiredMsDelay = 1000 / bgFps;
|
||||
const bgFps = 30;
|
||||
const desiredMsDelay = 1000 / bgFps;
|
||||
|
||||
let lastTick = 0;
|
||||
let lastTick = performance.now();
|
||||
|
||||
function tick() {
|
||||
var now = performance.now();
|
||||
var delta = now - lastTick;
|
||||
const now = performance.now();
|
||||
const delta = now - lastTick;
|
||||
lastTick = now;
|
||||
|
||||
// @ts-ignore
|
||||
postMessage({ delta });
|
||||
}
|
||||
|
||||
|
@ -12,15 +12,9 @@ function accessNestedPropertyReverse(obj, keys) {
|
||||
|
||||
const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]);
|
||||
|
||||
onmessage = function (event) {
|
||||
const { jobId, job, data } = event.data;
|
||||
onmessage = function ({ data: { jobId, job, data } }) {
|
||||
const result = performJob(job, data);
|
||||
|
||||
// @ts-ignore
|
||||
postMessage({
|
||||
jobId,
|
||||
result,
|
||||
});
|
||||
postMessage({ jobId, result });
|
||||
};
|
||||
|
||||
function performJob(job, data) {
|
||||
|
8
src/js/webworkers/tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": ["ES2018","WebWorker"]
|
||||
},
|
||||
"exclude": [],
|
||||
"extends": "../tsconfig",
|
||||
"include": ["*.worker.js"]
|
||||
}
|
@ -59,7 +59,7 @@ If you want to edit an existing translation (Fixing typos, Updating it to a newe
|
||||
|
||||
## 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:
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -490,6 +490,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -631,8 +634,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Settings
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Development
|
||||
@ -843,9 +847,9 @@ about:
|
||||
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
|
||||
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>
|
||||
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>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -496,6 +496,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotador (Antihorari)
|
||||
description: Rota formes en sentit antihorari 90 graus.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -634,8 +637,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Opcions
|
||||
categories:
|
||||
game: Joc
|
||||
app: Aplicació
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Desenvolupament
|
||||
@ -826,7 +830,7 @@ about:
|
||||
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>
|
||||
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>
|
||||
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:
|
||||
|
@ -471,6 +471,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotor (opačný)
|
||||
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:
|
||||
default:
|
||||
@ -612,8 +615,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Nastavení
|
||||
categories:
|
||||
game: Hra
|
||||
app: Aplikace
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Vývojová verze
|
||||
@ -823,9 +827,9 @@ about:
|
||||
Pokud se chceš na hře podílet, podívej se na <a href="<githublink>"
|
||||
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>"
|
||||
target="_blank">discord server</a>!<br><br>
|
||||
target="_blank">Discord server</a>!<br><br>
|
||||
|
||||
Soundtrack udělal <a href="https://soundcloud.com/pettersumelius"
|
||||
target="_blank">Peppsen</a> - Je úžasnej.<br><br>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -489,6 +489,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -634,8 +637,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Settings
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -23,7 +23,7 @@ steamPage:
|
||||
# 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.
|
||||
|
||||
# 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!
|
||||
|
||||
# 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:
|
||||
name: Rotierer (CCW)
|
||||
description: Rotiert Formen gegen den Uhrzeigersinn um 90 Grad.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -633,8 +636,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Einstellungen
|
||||
categories:
|
||||
game: Spiel
|
||||
app: Applikation
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Entwicklung
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -485,6 +485,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -631,8 +634,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Settings
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
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>
|
||||
|
||||
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>"
|
||||
target="_blank">discord server</a>!<br><br>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -23,7 +23,7 @@ steamPage:
|
||||
# This is the short text appearing on the steam page
|
||||
shortText: shapez.io is a game about building factories to automate the creation and 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!
|
||||
|
||||
# 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:
|
||||
title: Settings
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Development
|
||||
@ -855,13 +856,13 @@ about:
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
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:
|
||||
title: Changelog
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -23,7 +23,7 @@ steamPage:
|
||||
# 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.
|
||||
|
||||
# This is the text shown above the discord link
|
||||
# This is the text shown above the Discord link
|
||||
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.
|
||||
@ -502,6 +502,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotador (Inverso)
|
||||
description: Rota las figuras en sentido antihorario 90 grados.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -642,8 +645,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Opciones
|
||||
categories:
|
||||
game: Juego
|
||||
app: Aplicación
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Desarrollo
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -499,6 +499,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (Vastapäivään)
|
||||
description: Kääntää muotoja 90 astetta vastapäivään.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -638,8 +641,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Asetukset
|
||||
categories:
|
||||
game: Peli
|
||||
app: Sovellus
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Kehitys
|
||||
@ -848,7 +852,7 @@ about:
|
||||
|
||||
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>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -486,6 +486,9 @@ buildings:
|
||||
ccw:
|
||||
name: Pivoteur inversé
|
||||
description: Fait pivoter une forme de 90 degrés vers la gauche.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -631,8 +634,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Options
|
||||
categories:
|
||||
game: Jeu
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Développement
|
||||
@ -837,9 +841,9 @@ about:
|
||||
Si vous souhaitez contribuer, allez voir <a href="<githublink>"
|
||||
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>"
|
||||
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"
|
||||
target="_blank">Peppsen</a> - Il est impressionnant !<br><br>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -533,6 +533,9 @@ buildings:
|
||||
ccw:
|
||||
name: Obrtač (↺)
|
||||
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:
|
||||
default:
|
||||
@ -672,8 +675,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Postavke
|
||||
categories:
|
||||
game: Igra
|
||||
app: Aplikacija
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -485,6 +485,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -630,8 +633,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Beállítások
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Development
|
||||
@ -841,9 +845,9 @@ about:
|
||||
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
|
||||
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>
|
||||
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>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -23,7 +23,7 @@ steamPage:
|
||||
# This is the short text appearing on the steam page
|
||||
shortText: shapez.io is a game about building factories to automate the creation and 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!
|
||||
|
||||
# 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:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter-clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -644,8 +647,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Settings
|
||||
categories:
|
||||
game: Game
|
||||
app: Application
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -485,6 +485,9 @@ buildings:
|
||||
ccw:
|
||||
name: Rotate (CCW)
|
||||
description: Rotates shapes counter clockwise by 90 degrees.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -631,8 +634,9 @@ storyRewards:
|
||||
settings:
|
||||
title: Impostazioni
|
||||
categories:
|
||||
game: Gioco
|
||||
app: Applicazione
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Sviluppo
|
||||
@ -842,9 +846,9 @@ about:
|
||||
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
|
||||
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>
|
||||
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>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -490,6 +490,9 @@ buildings:
|
||||
ccw:
|
||||
name: 回転機 (逆)
|
||||
description: 形を反時計回り方向に90度回転します。
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -631,8 +634,9 @@ storyRewards:
|
||||
settings:
|
||||
title: 設定
|
||||
categories:
|
||||
game: ゲーム
|
||||
app: アプリケーション
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: Development
|
||||
@ -836,7 +840,7 @@ about:
|
||||
|
||||
開発に参加したい場合は以下をチェックしてみてください。<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>
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
@ -489,6 +489,9 @@ buildings:
|
||||
ccw:
|
||||
name: 회전기 (반시계방향)
|
||||
description: 도형을 반시계방향으로 90도 회전시킨다.
|
||||
fl:
|
||||
name: Rotate (180)
|
||||
description: Rotates shapes by 180 degrees.
|
||||
|
||||
stacker:
|
||||
default:
|
||||
@ -630,8 +633,9 @@ storyRewards:
|
||||
settings:
|
||||
title: 설정
|
||||
categories:
|
||||
game: 게임
|
||||
app: 앱
|
||||
general: General
|
||||
userInterface: User Interface
|
||||
advanced: Advanced
|
||||
|
||||
versionBadges:
|
||||
dev: 개발
|
||||
|