1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-06-13 13:04:03 +00:00

Merge remote-tracking branch 'Shapez.io/master' into achievements-ingame

This commit is contained in:
DJ1TJOO 2021-03-16 18:17:41 +01:00
commit d95ecd7ee2
20 changed files with 407 additions and 414 deletions

View File

@ -1,12 +1,12 @@
/* eslint-disable quotes,no-undef */
const { app, BrowserWindow, Menu, MenuItem, session } = require("electron");
const { app, BrowserWindow, Menu, MenuItem, ipcMain, shell } = require("electron");
const path = require("path");
const url = require("url");
const childProcess = require("child_process");
const { ipcMain, shell } = require("electron");
const fs = require("fs");
const steam = require('./steam');
const steam = require("./steam");
const asyncLock = require("async-lock");
const isDev = process.argv.indexOf("--dev") >= 0;
const isLocal = process.argv.indexOf("--local") >= 0;
@ -153,7 +153,82 @@ ipcMain.on("exit-app", (event, flag) => {
app.quit();
});
function performFsJob(job) {
let renameCounter = 1;
const fileLock = new asyncLock({
timeout: 30000,
maxPending: 1000,
});
function niceFileName(filename) {
return filename.replace(storePath, "@");
}
async function writeFileSafe(filename, contents) {
++renameCounter;
const prefix = "[ " + renameCounter + ":" + niceFileName(filename) + " ] ";
const transactionId = String(new Date().getTime()) + "." + renameCounter;
if (fileLock.isBusy()) {
console.warn(prefix, "Concurrent write process on", filename);
}
fileLock.acquire(filename, async () => {
console.log(prefix, "Starting write on", niceFileName(filename), "in transaction", transactionId);
if (!fs.existsSync(filename)) {
// this one is easy
console.log(prefix, "Writing file instantly because it does not exist:", niceFileName(filename));
await fs.promises.writeFile(filename, contents, { encoding: "utf8" });
return;
}
// first, write a temporary file (.tmp-XXX)
const tempName = filename + ".tmp-" + transactionId;
console.log(prefix, "Writing temporary file", niceFileName(tempName));
await fs.promises.writeFile(tempName, contents, { encoding: "utf8" });
// now, rename the original file to (.backup-XXX)
const oldTemporaryName = filename + ".backup-" + transactionId;
console.log(
prefix,
"Renaming old file",
niceFileName(filename),
"to",
niceFileName(oldTemporaryName)
);
await fs.promises.rename(filename, oldTemporaryName);
// now, rename the temporary file (.tmp-XXX) to the target
console.log(
prefix,
"Renaming the temporary file",
niceFileName(tempName),
"to the original",
niceFileName(filename)
);
await fs.promises.rename(tempName, filename);
// we are done now, try to create a backup, but don't fail if the backup fails
try {
// check if there is an old backup file
const backupFileName = filename + ".backup";
if (fs.existsSync(backupFileName)) {
console.log(prefix, "Deleting old backup file", niceFileName(backupFileName));
// delete the old backup
await fs.promises.unlink(backupFileName);
}
// rename the old file to the new backup file
console.log(prefix, "Moving", niceFileName(oldTemporaryName), "to the backup file location");
await fs.promises.rename(oldTemporaryName, backupFileName);
} catch (ex) {
console.error(prefix, "Failed to switch backup files:", ex);
}
});
}
async function performFsJob(job) {
const fname = path.join(storePath, job.filename);
switch (job.type) {
@ -165,38 +240,35 @@ function performFsJob(job) {
};
}
let contents = "";
try {
contents = fs.readFileSync(fname, { encoding: "utf8" });
const data = await fs.promises.readFile(fname, { encoding: "utf8" });
return {
success: true,
data,
};
} catch (ex) {
return {
error: ex,
};
}
return {
success: true,
data: contents,
};
}
case "write": {
try {
fs.writeFileSync(fname, job.contents);
await writeFileSafe(fname, job.contents);
return {
success: true,
data: job.contents,
};
} catch (ex) {
return {
error: ex,
};
}
return {
success: true,
data: job.contents,
};
}
case "delete": {
try {
fs.unlinkSync(fname);
await fs.promises.unlink(fname);
} catch (ex) {
return {
error: ex,
@ -214,15 +286,7 @@ function performFsJob(job) {
}
}
ipcMain.on("fs-job", (event, arg) => {
const result = performFsJob(arg);
event.reply("fs-response", { id: arg.id, result });
});
ipcMain.on("fs-sync-job", (event, arg) => {
const result = performFsJob(arg);
event.returnValue = result;
});
ipcMain.handle("fs-job", (event, arg) => performFsJob(arg));
steam.init(isDev);
steam.listen();

View File

@ -10,9 +10,12 @@
"start": "electron --disable-direct-composition --in-process-gpu ."
},
"devDependencies": {
"electron": "11.3.0"
"electron": "10.4.0"
},
"optionalDependencies": {
"shapez.io-private-artifacts": "github:tobspr/shapez.io-private-artifacts#abi-v85"
},
"dependencies": {
"async-lock": "^1.2.8"
}
}

View File

@ -4,7 +4,7 @@
"@electron/get@^1.0.1":
version "1.12.4"
resolved "https://registry.npmjs.org/@electron/get/-/get-1.12.4.tgz"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab"
integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg==
dependencies:
debug "^4.1.1"
@ -20,39 +20,44 @@
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
dependencies:
defer-to-connect "^1.0.1"
"@types/node@^12.0.12":
version "12.20.5"
resolved "https://registry.npmjs.org/@types/node/-/node-12.20.5.tgz"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.5.tgz#4ca82a766f05c359fd6c77505007e5a272f4bb9b"
integrity sha512-5Oy7tYZnu3a4pnJ//d4yVvOImExl4Vtwf0D40iKUlU+XlUsyV9iyFWyCFlwy489b72FMAik/EFwRkNLjjOdSPg==
async-lock@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.2.8.tgz#7b02bdfa2de603c0713acecd11184cf97bbc7c4c"
integrity sha512-G+26B2jc0Gw0EG/WN2M6IczuGepBsfR1+DtqLnyFSH4p2C668qkOCtEkGNVEaaNAVlYwEMazy1+/jnLxltBkIQ==
boolean@^3.0.1:
version "3.0.2"
resolved "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570"
integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
dependencies:
clone-response "^1.0.2"
@ -65,14 +70,14 @@ cacheable-request@^6.0.0:
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
dependencies:
mimic-response "^1.0.0"
concat-stream@^1.6.2:
version "1.6.2"
resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
dependencies:
buffer-from "^1.0.0"
@ -82,7 +87,7 @@ concat-stream@^1.6.2:
config-chain@^1.1.11:
version "1.1.12"
resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
dependencies:
ini "^1.3.4"
@ -90,61 +95,61 @@ config-chain@^1.1.11:
core-js@^3.6.5:
version "3.9.1"
resolved "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae"
integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
debug@^2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^4.1.0, debug@^4.1.1:
version "4.3.1"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
ms "2.1.2"
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
dependencies:
object-keys "^1.0.12"
detect-node@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
electron@11.3.0:
version "11.3.0"
resolved "https://registry.npmjs.org/electron/-/electron-11.3.0.tgz"
integrity sha512-MhdS0gok3wZBTscLBbYrOhLaQybCSAfkupazbK1dMP5c+84eVMxJE/QGohiWQkzs0tVFIJsAHyN19YKPbelNrQ==
electron@10.4.0:
version "10.4.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-10.4.0.tgz#018385914474b56110a5a43087a53c114b67c08d"
integrity sha512-qK8OOCWuNvEFWThmjkukkqDwIpBqULlDuMXVC9MC/2P4UaWJEjIYvBmBuTyxtFcKoE3kWvcWyeRDUuvzVxxXjA==
dependencies:
"@electron/get" "^1.0.1"
"@types/node" "^12.0.12"
@ -152,34 +157,34 @@ electron@11.3.0:
encodeurl@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
env-paths@^2.2.0:
version "2.2.1"
resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
es6-error@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz"
resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
extract-zip@^1.0.3:
version "1.7.0"
resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==
dependencies:
concat-stream "^1.6.2"
@ -189,14 +194,14 @@ extract-zip@^1.0.3:
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
dependencies:
pend "~1.2.0"
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
dependencies:
graceful-fs "^4.2.0"
@ -205,21 +210,21 @@ fs-extra@^8.1.0:
get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
dependencies:
pump "^3.0.0"
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
dependencies:
pump "^3.0.0"
global-agent@^2.0.2:
version "2.1.12"
resolved "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz"
resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195"
integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==
dependencies:
boolean "^3.0.1"
@ -232,7 +237,7 @@ global-agent@^2.0.2:
global-tunnel-ng@^2.7.1:
version "2.7.1"
resolved "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz"
resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
dependencies:
encodeurl "^1.0.2"
@ -242,14 +247,14 @@ global-tunnel-ng@^2.7.1:
globalthis@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
dependencies:
define-properties "^1.1.3"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
dependencies:
"@sindresorhus/is" "^0.14.0"
@ -266,117 +271,117 @@ got@^9.6.0:
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.6"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
http-cache-semantics@^4.0.0:
version "4.1.0"
resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
inherits@^2.0.3, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@^1.3.4:
version "1.3.8"
resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
json-buffer@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
json-stringify-safe@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
optionalDependencies:
graceful-fs "^4.1.6"
keyv@^3.0.0:
version "3.1.0"
resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
dependencies:
json-buffer "3.0.0"
lodash@^4.17.10:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
matcher@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
dependencies:
escape-string-regexp "^4.0.0"
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
mkdirp@^0.5.4:
version "0.5.5"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
dependencies:
minimist "^1.2.5"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
normalize-url@^4.1.0:
version "4.5.0"
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
npm-conf@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz"
resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
dependencies:
config-chain "^1.1.11"
@ -384,54 +389,54 @@ npm-conf@^1.1.3:
object-keys@^1.0.12:
version "1.1.1"
resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
progress@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
@ -439,7 +444,7 @@ pump@^3.0.0:
readable-stream@^2.2.2:
version "2.3.7"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
@ -452,14 +457,14 @@ readable-stream@^2.2.2:
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
dependencies:
lowercase-keys "^1.0.0"
roarr@^2.15.3:
version "2.15.4"
resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz"
resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
dependencies:
boolean "^3.0.1"
@ -471,29 +476,29 @@ roarr@^2.15.3:
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
semver@^6.2.0:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.3.2:
version "7.3.4"
resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
dependencies:
lru-cache "^6.0.0"
serialize-error@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz"
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
dependencies:
type-fest "^0.13.1"
@ -504,73 +509,73 @@ serialize-error@^7.0.1:
sprintf-js@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
sumchecker@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz"
resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
dependencies:
debug "^4.1.0"
to-readable-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz"
resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
tunnel@^0.0.6:
version "0.0.6"
resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz"
resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
type-fest@^0.13.1:
version "0.13.1"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
dependencies:
prepend-http "^2.0.0"
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
wrappy@1:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yauzl@^2.10.0:
version "2.10.0"
resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
dependencies:
buffer-crc32 "~0.2.3"

View File

@ -14,7 +14,7 @@ function gulptasksStandalone($, gulp) {
{
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files"),
suffix: "",
taskPrefix: ""
taskPrefix: "",
},
{
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files_china"),
@ -27,8 +27,7 @@ function gulptasksStandalone($, gulp) {
const tempDestBuildDir = path.join(tempDestDir, "built");
gulp.task(taskPrefix + "standalone.prepare.cleanup", () => {
return gulp.src(tempDestDir, { read: false, allowEmpty: true })
.pipe($.clean({ force: true }));
return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
});
gulp.task(taskPrefix + "standalone.prepare.copyPrefab", () => {
@ -42,18 +41,22 @@ function gulptasksStandalone($, gulp) {
// https://github.com/gulpjs/gulp/issues/1427
// path.join(electronBaseDir, "node_modules", "**", "*"),
];
return gulp.src(requiredFiles, { base: electronBaseDir })
.pipe(gulp.dest(tempDestBuildDir));
return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir));
});
gulp.task(taskPrefix + "standalone.prepare.writePackageJson", cb => {
const packageJsonString = JSON.stringify({
scripts: {
start: pj.scripts.start
const packageJsonString = JSON.stringify(
{
scripts: {
start: pj.scripts.start,
},
devDependencies: pj.devDependencies,
dependencies: pj.dependencies,
optionalDependencies: pj.optionalDependencies,
},
devDependencies: pj.devDependencies,
optionalDependencies: pj.optionalDependencies
}, null, 4);
null,
4
);
fs.writeFileSync(path.join(tempDestBuildDir, "package.json"), packageJsonString);
@ -79,8 +82,7 @@ function gulptasksStandalone($, gulp) {
});
gulp.task(taskPrefix + "standalone.prepare.copyGamefiles", () => {
return gulp.src("../build/**/*.*", { base: "../build" })
.pipe(gulp.dest(tempDestBuildDir));
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
});
gulp.task(taskPrefix + "standalone.killRunningInstances", cb => {
@ -175,9 +177,7 @@ function gulptasksStandalone($, gulp) {
);
}
gulp.task(taskPrefix + "standalone.package.prod.win64", cb =>
packageStandalone("win32", "x64", cb)
);
gulp.task(taskPrefix + "standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb));
gulp.task(taskPrefix + "standalone.package.prod.linux64", cb =>
packageStandalone("linux", "x64", cb)
);

View File

@ -451,13 +451,13 @@
justify-content: center;
align-items: flex-end;
width: 100%;
grid-template-columns: auto auto auto auto 1fr;
grid-template-columns: auto auto auto 1fr;
@include S(padding, 10px);
box-sizing: border-box;
@include S(grid-gap, 4px);
&.china {
grid-template-columns: auto auto 1fr;
grid-template-columns: auto 1fr;
}
.author {
@ -507,15 +507,6 @@
background-color: $linkBgHover;
}
&.nftLink {
background-color: #3291e9;
color: #fff;
&:hover {
background-color: darken(#3291e9, 5);
}
}
.thirdpartyLogo {
display: inline-block;
@include S(width, 50px);
@ -530,12 +521,6 @@
background-image: uiResource("main_menu/discord.png");
background-size: 95%;
}
&.nftLogo {
/* @load-async */
background-image: uiResource("main_menu/opensea.png");
background-size: 80%;
}
}
}

View File

@ -1,4 +1,12 @@
export const CHANGELOG = [
{
version: "1.3.1",
date: "beta",
entries: [
"Fixed savegames getting corrupt in rare conditions",
"Fixed game crashing sometimes since the achievements update",
],
},
{
version: "1.3.0",
date: "12.03.2020",
@ -7,7 +15,7 @@ export const CHANGELOG = [
"There are now <strong>45 Steam Achievements!</strong>",
"Fixed constant signals being editable from the regular layer",
"Fixed items still overlapping sometimes between buildings and belts",
"The game is now available in finish, italian, romanian and ukrainian! (Thanks to all contributors!)",
"The game is now available in finnish, italian, romanian and ukrainian! (Thanks to all contributors!)",
"Updated translations (Thanks to all contributors!)",
],
},

View File

@ -16,7 +16,6 @@ export const THIRDPARTY_URLS = {
github: "https://github.com/tobspr/shapez.io",
reddit: "https://www.reddit.com/r/shapezio",
shapeViewer: "https://viewer.shapez.io",
nftTokens: "https://opensea.io/collection/shapez",
standaloneStorePage: "https://store.steampowered.com/app/1318690/shapezio/",

View File

@ -540,12 +540,11 @@ export class AchievementCollection {
/** @param {ShapeDefinition} definition @returns {boolean} */
isIrrelevantShapeValid(definition) {
if (definition.cachedHash === this.root.hubGoals.currentGoal.definition.cachedHash) {
return false;
}
if (definition.cachedHash === this.root.gameMode.getBlueprintShapeKey()) {
return false;
const levels = this.root.gameMode.getLevelDefinitions();
for (let i = 0; i < levels.length; i++) {
if (definition.cachedHash === levels[i].shape) {
return false;
}
}
const upgrades = this.root.gameMode.getUpgrades();

View File

@ -58,11 +58,6 @@ export class StorageImplBrowser extends StorageInterface {
});
}
writeFileSyncIfSupported(filename, contents) {
window.localStorage.setItem(filename, contents);
return true;
}
readFileAsync(filename) {
if (this.currentBusyFilename === filename) {
logger.warn("Attempt to read", filename, "while write progress on it is ongoing!");

View File

@ -94,12 +94,6 @@ export class StorageImplBrowserIndexedDB extends StorageInterface {
});
}
writeFileSyncIfSupported(filename, contents) {
// Not supported
this.writeFileAsync(filename, contents);
return true;
}
readFileAsync(filename) {
if (!this.database) {
return Promise.reject("Storage not ready");

View File

@ -7,24 +7,6 @@ const logger = createLogger("electron-storage");
export class StorageImplElectron extends StorageInterface {
constructor(app) {
super(app);
/** @type {Object.<number, {resolve:Function, reject: Function}>} */
this.jobs = {};
this.jobId = 0;
getIPCRenderer().on("fs-response", (event, arg) => {
const id = arg.id;
if (!this.jobs[id]) {
logger.warn("Got unhandled FS response, job not known:", id);
return;
}
const { resolve, reject } = this.jobs[id];
if (arg.result.success) {
resolve(arg.result.data);
} else {
reject(arg.result.error);
}
});
}
initialize() {
@ -33,51 +15,53 @@ export class StorageImplElectron extends StorageInterface {
writeFileAsync(filename, contents) {
return new Promise((resolve, reject) => {
// ipcMain
const jobId = ++this.jobId;
this.jobs[jobId] = { resolve, reject };
getIPCRenderer().send("fs-job", {
type: "write",
filename,
contents,
id: jobId,
});
});
}
writeFileSyncIfSupported(filename, contents) {
return getIPCRenderer().sendSync("fs-sync-job", {
type: "write",
filename,
contents,
getIPCRenderer()
.invoke("fs-job", {
type: "write",
filename,
contents,
})
.then(result => {
if (result.success) {
resolve(result.data);
} else {
reject(result.error);
}
});
});
}
readFileAsync(filename) {
return new Promise((resolve, reject) => {
// ipcMain
const jobId = ++this.jobId;
this.jobs[jobId] = { resolve, reject };
getIPCRenderer().send("fs-job", {
type: "read",
filename,
id: jobId,
});
getIPCRenderer()
.invoke("fs-job", {
type: "read",
filename,
})
.then(result => {
if (result.success) {
resolve(result.data);
} else {
reject(result.error);
}
});
});
}
deleteFileAsync(filename) {
return new Promise((resolve, reject) => {
// ipcMain
const jobId = ++this.jobId;
this.jobs[jobId] = { resolve, reject };
getIPCRenderer().send("fs-job", {
type: "delete",
filename,
id: jobId,
});
getIPCRenderer()
.invoke("fs-job", {
type: "delete",
filename,
})
.then(result => {
if (result.success) {
resolve(result.data);
} else {
reject(result.error);
}
});
});
}
}

View File

@ -30,16 +30,6 @@ export class StorageInterface {
return Promise.reject();
}
/**
* Tries to write a file synchronously, used in unload handler
* @param {string} filename
* @param {string} contents
*/
writeFileSyncIfSupported(filename, contents) {
abstract;
return false;
}
/**
* Reads a string asynchronously. Returns Promise<FILE_NOT_FOUND> if file was not found.
* @param {string} filename

View File

@ -110,16 +110,6 @@ export class MainMenuState extends GameState {
${G_CHINA_VERSION ? "" : `<a class="helpTranslate">${T.mainMenu.helpTranslate}</a>`}
</div>
${
G_CHINA_VERSION
? ""
: `
<a class="nftLink boxLink" target="_blank">
shapez.io NFT Tokens
<span class="thirdpartyLogo nftLogo"></span>
</a>`
}
<div class="author">${T.mainMenu.madeBy.replace(
"<author-link>",
@ -264,18 +254,6 @@ export class MainMenuState extends GameState {
{ preventClick: true }
);
const nftLink = this.htmlElement.querySelector(".nftLink");
if (nftLink) {
this.trackClicks(
nftLink,
() => {
this.app.analytics.trackUiClick("main_menu_link_nft");
this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.nftTokens);
},
{ preventClick: true }
);
}
const githubLink = this.htmlElement.querySelector(".githubLink");
if (githubLink) {
this.trackClicks(

View File

@ -348,8 +348,8 @@ ingame:
title: Unterstütze Mich
desc: Ich entwickle in meiner Freizeit!
achievements:
title: Achievements
desc: Hunt them all!
title: Errungenschaften
desc: Hol sie dir alle!
shopUpgrades:
belt:
name: Fließbänder, Verteiler & Tunnel
@ -912,9 +912,8 @@ settings:
description: If activated the zoom will happen in the direction of your mouse
position, otherwise in the middle of the screen.
mapResourcesScale:
title: Map Resources Size
description: Controls the size of the shapes on the map overview (when zooming
out).
title: Größe der Ressourcen auf der Karte
description: Legt die Größe der Ressourcen auf der Karte (beim Herauszoomen) fest.
keybindings:
title: Tastenbelegung
hint: "Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene
@ -988,10 +987,10 @@ keybindings:
placementDisableAutoOrientation: Automatische Orientierung deaktivieren
placeMultiple: Im Platziermodus bleiben
placeInverse: Automatische Fließbandorientierung invertieren
rotateToUp: "Rotate: Point Up"
rotateToDown: "Rotate: Point Down"
rotateToRight: "Rotate: Point Right"
rotateToLeft: "Rotate: Point Left"
rotateToUp: "Rotieren: Nach oben zeigend"
rotateToDown: "Rotieren: Nach unten zeigend"
rotateToRight: "Rotieren: Nach rechts zeigend"
rotateToLeft: "Rotieren: Nach links zeigend"
about:
title: Über dieses Spiel
body: Dieses Spiel ist quelloffen (Open Source) und wurde von <a

View File

@ -14,7 +14,7 @@ steamPage:
Vaikka alussa vain prosessoit muotoja, myöhemmin niitä pitää myös maalata - tätä varten sinun täytyy kerätä ja sekoittaa värejä
Pelin ostaminen Steamista antaa sinulle pääsyn pelin täysversioon, mutta voit myös pelata kokeiluversiota ensin sivuillamme shapez.io ja päättää myöhemmin!
what_others_say: What people say about shapez.io
what_others_say: Muiden mielipiteitä shapez.io:sta
nothernlion_comment: This game is great - I'm having a wonderful time playing,
and time has flown by.
notch_comment: Oh crap. I really should sleep, but I think I just figured out
@ -30,7 +30,7 @@ global:
suffix:
thousands: k
millions: M
billions: B
billions: G
trillions: T
infinite:
time:
@ -195,7 +195,7 @@ ingame:
delete: Poista
pasteLastBlueprint: Liitä viimeisin piirustus
lockBeltDirection: Ota kuljettimen suunnittelija käyttöön
plannerSwitchSide: Käännä suunnittelijan puoli
plannerSwitchSide: Vaihda suunnittelijan puolta
cutSelection: Leikkaa
copySelection: Kopioi
clearSelection: Tyhjennä valinta
@ -347,8 +347,8 @@ ingame:
title: Tue minua
desc: Kehitän peliä vapaa-ajallani!
achievements:
title: Achievements
desc: Hunt them all!
title: Saavutukset
desc: Metsästä kaikki!
shopUpgrades:
belt:
name: Kuljettimet, jakelijat & tunnelit
@ -454,16 +454,16 @@ buildings:
description: Monikäyttöinen - Jakaa sisääntulot tasaisesti kaikkiin
ulostuloihin.
merger:
name: Yhdistäjä (compact)
name: Yhdistäjä (kompakti)
description: Yhdistää kaksi kuljetinta yhteen.
merger-inverse:
name: Yhdistäjä (compact)
name: Yhdistäjä (kompakti)
description: Yhdistää kaksi kuljetinta yhteen.
splitter:
name: Erottaja (compact)
name: Erottaja (kompakti)
description: Erottaa kuljettimen kahteen kuljettimeen.
splitter-inverse:
name: Erottaja (compact)
name: Erottaja (kompakti)
description: Erottaa kuljettimen kahteen kuljettimeen.
storage:
default:
@ -562,12 +562,12 @@ buildings:
storyRewards:
reward_cutter_and_trash:
title: Muotojen Leikkaus
desc: You just unlocked the <strong>cutter</strong>, which cuts shapes in half
from top to bottom <strong>regardless of its
orientation</strong>!<br><br>Be sure to get rid of the waste, or
otherwise <strong>it will clog and stall</strong> - For this purpose
I have given you the <strong>trash</strong>, which destroys
everything you put into it!
desc: Avasit <strong>Leikkurin</strong>, joka leikkaa muotoja
ylhäältä alas <strong>muodon suunnasta
riippumatta</strong>!<br><br>muista hankkiutua eroon jätteestä, tai
muuten <strong>se tukkii ja pysäyttää leikkurin</strong> - Siksi
olen antanut sinulle <strong>roskiksen</strong>, joka tuhoaa
kaiken sinne laitetun!
reward_rotater:
title: Kääntö
desc: Avasit <strong>Kääntäjän</strong>! Se kääntää muotoja myötäpäivään 90
@ -629,12 +629,12 @@ storyRewards:
reward_freeplay:
title: Vapaapeli
desc: Onnistuit! Avasit juuri <strong>vapaapelimuodon</strong>! Muodot luodaan
nyt <strong>satunnaisesti</strong><br><br> Since the hub will
require a <strong>throughput</strong> from now on, I highly
recommend to build a machine which automatically delivers the
requested shape!<br><br> The HUB outputs the requested shape on the
wires layer, so all you have to do is to analyze it and
automatically configure your factory based on that.
nyt <strong>satunnaisesti</strong><br><br> Koska keskusrakennus vaatii
tietyn <strong>kuljetuskapasiteetin</strong> tästä eteenpäin, suosittelen
lämpimästi rakentamaan koneen, joka tuottaa vaaditun muodon
automaattisesti!<br><br> Keskusrakennus lähettää pyydetyn muodon
johtotasolle, joten sinun ei tarvitse kuin analysoida se ja
konfiguroida tehtaasi sen perusteella.
reward_blueprints:
title: Piirustukset
desc: Nyt voit <strong>Kopioida ja Liittää</strong> paloja tehtaastasi! Valitse
@ -928,7 +928,7 @@ keybindings:
pasteLastBlueprint: Liitä viimeisin piirustus
cycleBuildings: Valitse rakennuksia
lockBeltDirection: Ota kuljetinsuunnittelija käyttöön
switchDirectionLockSide: "Suunnittelija: Muuta sivua"
switchDirectionLockSide: "Suunnittelija: Vaihda sivua"
massSelectStart: Pidä pohjassa ja raahaa aloittaaksesi
massSelectSelectMultiple: Valitse useita alueita
massSelectCopy: Kopioi alue
@ -952,24 +952,24 @@ keybindings:
comparator: Vertaa
item_producer: Signaaligeneraattori (Hiekkalaattikko)
copyWireValue: "Johdot: Kopioi arvo kursorin kohdalta"
rotateToUp: "Rotate: Point Up"
rotateToDown: "Rotate: Point Down"
rotateToRight: "Rotate: Point Right"
rotateToLeft: "Rotate: Point Left"
rotateToUp: "Käännä: osoittaa ylös"
rotateToDown: "Käännä: osoittaa alas"
rotateToRight: "Käännä: osoittaa oikealle"
rotateToLeft: "Käännä: osoittaa vasemmalle"
about:
title: Tietoja tästä pelistä
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>
Tämä peli on avointa lähdekoodia ja <a
href="https://github.com/tobspr" target="_blank">Tobias Springer</a>in
(siis minun) kehittämäni.<br><br>
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on GitHub</a>.<br><br>
Jos haluat avustaa, käy katsomassa <a href="<githublink>" target="_blank">shapez.io GitHubissa</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>
Tämä peli ei olisi mahdollinen ilman pelieni ympärillä olevaa Discord-yhteisöä - Sinun todella kannattaisi liittyä <a href="<discordlink>" target="_blank">Discord serverillemme</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>
Ääniraidan on tehnyt <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Hän on uskomattoman loistava.<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.
Lopuksi valtavat kiitokset parhaalle ystävälleni <a href="https://github.com/niklas-dahl" target="_blank">Niklakselle</a> - Ilman Factorio-sessioitamme tätä peliä ei olisi olemassa.
changelog:
title: Muutosloki
demo:

View File

@ -11,14 +11,14 @@ steamPage:
Dan jita itu tidak cukup, kamu juga perlu memproduksi bentuk secara eksponensial untuk memenuhkan kebutuhan - hal yang membantu hanyalah memperbesar pabrik! Walaupun kamu hanya perlu memproses bentuk di awal, nantinya kamu harus memberinya warna - dengan mengekstrak dan mencampur warna!
Membeli game ini di Steam memberikan kamu akses ke versi lengkap, namun kamu juga dapat mencoba demo dan memutuskan nanti!
what_others_say: What people say about shapez.io
nothernlion_comment: This game is great - I'm having a wonderful time playing,
and time has flown by.
notch_comment: Oh crap. I really should sleep, but I think I just figured out
how to make a computer in shapez.io
steam_review_comment: This game has stolen my life and I don't want it back.
Very chill factory game that won't let me stop making my lines more
efficient.
what_others_say: Apa yang orang lain katakan tentang shapez.io
nothernlion_comment: Game ini bagus - Saya sangat menikmati waktu saya ketika
memainkan game ini, dan waktu telah berlalu.
notch_comment: Oh sial. Saya benar-benar harus tidur, namun sepertinya saya baru
menemukan bagaimana cara membuat komputer di shapez.io
steam_review_comment: Game ini telah mencuri hidup saya dan saya tidak
menginginkannya kembali. Game pembuatan pabrik yang sangat santai yang tidak
akan membiarkan saya berhenti membuat pabrik saya lebih efisien.
global:
loading: Memuat
error: Terjadi kesalahan

View File

@ -9,14 +9,11 @@ steamPage:
しかし、それだけでは不十分です。指数関数的に増大していく形状の要求量に対応する必要があり――「スケーリング」が、唯一の対抗策と成り得ます。また、最初は形状を加工するだけですが、後々着色も必要になってきます。色を抽出して混ぜ合わせましょう!
Steamでゲームを購入するとフルバージョンで遊べますが、まずshapez.ioでデモをプレイし、その後で決めることもできます
what_others_say: What people say about shapez.io
nothernlion_comment: This game is great - I'm having a wonderful time playing,
and time has flown by.
notch_comment: Oh crap. I really should sleep, but I think I just figured out
how to make a computer in shapez.io
steam_review_comment: This game has stolen my life and I don't want it back.
Very chill factory game that won't let me stop making my lines more
efficient.
what_others_say: shapez.ioプレイヤーの反応
nothernlion_comment: これはすごいゲーム。プレイ体験が最高な上に時間の溶け方が尋常でない。
notch_comment: いややばいって。マジで寝なきゃなんだけど、今ならshapez.ioで計算機組めそうな気がする。
steam_review_comment: このゲームは私の生活を奪い去っていったが、返して欲しいとは思わない。
いくらでも気の向くままに生産ラインを効率化させてくれる、そんなとても穏やかな工場ゲームだ。
global:
loading: ロード中
error: エラー
@ -60,9 +57,9 @@ mainMenu:
importSavegame: インポート
openSourceHint: このゲームはオープンソースです
discordLink: 公式Discordサーバー
helpTranslate: 翻訳を助けてください!
helpTranslate: 翻訳にご協力ください!
madeBy: <author-link>によって作られました
browserWarning: このゲームはお使いのブラウザでは速度が落ちることがあります。スタンドアローン版を入手するか、Chromeでプレイすることでこの問題は避けられます。
browserWarning: このゲームはお使いのブラウザでは速度が落ちることがあります。スタンドアローン版を入手するか、Chromeでプレイすることで解決できます。
savegameLevel: レベル <x>
savegameLevelUnknown: 不明なレベル
savegameUnnamed: 無名のデータ
@ -153,7 +150,7 @@ dialogs:
desc: スクリーンショット出力を実行します。この処理は工場の全体像があまりに大きいと、 ゲームが遅くなったりクラッシュしてしまう可能性があります!
renameSavegame:
title: セーブデータの名前を変更
desc: セーブデータの名前を変更することができます
desc: セーブデータの名前を変更できます
tutorialVideoAvailable:
title: チュートリアル視聴可能
desc: このレベルで利用できるチュートリアル動画があります! 確認しますか?
@ -179,7 +176,7 @@ ingame:
cutSelection: カット
copySelection: コピー
clearSelection: 選択範囲をクリア
pipette: ピペッ
pipette: スポイ
switchLayers: レイヤーを変更
colors:
red:
@ -266,7 +263,7 @@ ingame:
2_1_place_cutter: "次に、<strong>切断機</strong>を設置し、円を 二分割します!<br><br> 追記:
切断機はそれの向きに関わらず、<strong>縦の線</strong>で切断します。"
2_2_place_trash: 切断機は<strong>詰まる</strong>場合があります!<br><br>
<strong>ゴミ箱</strong>を利用して、不必要な部品を廃棄することができます。
<strong>ゴミ箱</strong>を利用して、不必要な部品を廃棄できます。
2_3_more_cutters: "いいですね! <strong>更に2つ以上の切断機</strong>を設置して処理をスピードアップさせましょう!<br>\
<br> 追記: <strong>0から9 のホットキー</strong>を使用すると素早く部品にアクセスできます。"
3_1_rectangles: "それでは四角形を抽出しましょう! <strong>4つの抽出機を作成</strong>してそれをハブに接続します。<br><\
@ -299,8 +296,8 @@ ingame:
title: 新しい18個の設置物
desc: あなたの工場を完全自動化しましょう!
upgrades:
title: 20個のアップデートティア
desc: このデモバージョンでは5ティアのみです!
title: 無限のアップグレード段階
desc: このデモバージョンでは5段階のみです!
markers:
title: 無限個のマップマーカー
desc: これでもうあなたの工場を見失いません!
@ -314,20 +311,20 @@ ingame:
title: 製作者をサポート
desc: 余暇に制作しています!
achievements:
title: Achievements
desc: Hunt them all!
title: アチーブメント
desc: 取り尽くせ!
shopUpgrades:
belt:
name: ベルト、ディストリビュータとトンネル
name: ベルト、分配機とトンネル
description: スピード x<currentMult> → x<newMult>
miner:
name: 抽出
name: 抽出
description: スピード x<currentMult> → x<newMult>
processors:
name: 切断、回転と積み重ね
description: スピード x<currentMult> → x<newMult>
painting:
name: と着色
name: と着色
description: スピード x<currentMult> → x<newMult>
buildings:
hub:
@ -389,11 +386,11 @@ buildings:
stacker:
default:
name: 積層機
description: 入力アイテムを積み重ねます。もしうまく統合できなかった場合は、右の入力アイテムを左の入力アイテムの上に重ねます。
description: 入力アイテムを積み重ねます。可能なら同じレイヤーに統合し、そうでなければ右の入力アイテムを左の入力アイテムの上に重ねます。
mixer:
default:
name:
description: 2つの色を加算混合で混ぜ合わせます。
name:
description: 2つの色を加法混色で混ぜ合わせます。
painter:
default:
name: 着色機
@ -403,10 +400,10 @@ buildings:
description: 左から入力された形の全体を、下から入力された色で着色します。
double:
name: 着色機 (ダブル)
description: 左から入力された形を、上から入力された色で着色します。
description: 左から入力された複数の形を、上から入力された色で着色します。
quad:
name: 着色機 (四分割)
description: 入力された形を四分割づつ別の色で塗り分けられます。
description: 入力された形の四部分をそれぞれ別の色で塗り分けられます。
<strong>真らしい信号</strong>が流れているスロットのみがペイントされます!
trash:
default:
@ -467,7 +464,7 @@ buildings:
reader:
default:
name: ベルトリーダー
description: 平均スループットを計測できます。 アンロック後は、 最後に通過したアイテムの情報を出力します。
description: 平均スループットを計測できます。 ワイヤレイヤのアンロック後は、 最後に通過したアイテムの情報を出力します。
analyzer:
default:
name: 形状解析機
@ -482,7 +479,7 @@ buildings:
description: 形状の信号を2つに切断できます。
rotater:
name: 仮想回転機
description: 形状の信号を時計回り、反時計回りに回転させます。
description: 形状の信号を時計回りに回転させます。
unstacker:
name: 仮想分離機
description: 形状の信号の最上層を右側に出力し、残りの層を左側に出力します。
@ -509,8 +506,8 @@ storyRewards:
desc: "<strong>着色機</strong>が利用可能になりました。(今まで形状でやってきた方法で)色を抽出し、形状と合成することで着色します! <\
br><br>追伸: もし色覚特性をお持ちでしたら、 設定に<strong>色覚特性モード</strong>があります!"
reward_mixer:
title: 色の混合
desc: <strong>混機</strong>が利用可能になりました。この建造物は2つの色を<strong>加算混合で</strong>混ぜ合わせます!
title: 混色
desc: <strong>混機</strong>が利用可能になりました。この建造物は2つの色を<strong>加法混色で</strong>混ぜ合わせます!
reward_stacker:
title: 積層機
desc: <strong>積層機</strong>で形を組み合わせ可能になりました! 双方の入力を組み合わせ、連続した形になっていればそれらは<strong>融合してひとつ</strong>になります。そうでなければ、左の入力の<strong>上に右の入力が重なります!</strong>
@ -530,7 +527,7 @@ storyRewards:
reward_underground_belt_tier_2:
title: トンネル レベルII
desc: <strong>トンネル</strong>のバリエーションが利用可能になりました。 -
<strong>距離拡張版が追加され</strong>、以前のものと組み合わせて目的に応じて利用することができます!
<strong>距離拡張版が追加され</strong>、以前のものと組み合わせて目的に応じて利用できます!
reward_merger:
title: コンパクトな合流機
desc: <strong>合流機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました 2つの入力を1つの出力に合流させます
@ -539,54 +536,49 @@ storyRewards:
desc: <strong>分配機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました 1つの入力を2つの出力に分配します
reward_belt_reader:
title: ベルトリーダー
desc: <strong>ベルトリーダー</strong>が利用可能になりました! ベルトのスループットを計測できます。<br><br>ワイヤーのロックが解除されれば、より便利になります!
desc: <strong>ベルトリーダー</strong>が利用可能になりました! ベルトのスループットを計測できます。<br><br>ワイヤ関連の機能がアンロックされれば、より便利になります!
reward_cutter_quad:
title: 四分割
title: 四分割切断機
desc: <strong>切断機</strong>のバリエーションが利用可能になりました。 -
上下の二分割ではなく、<strong>四分割</strong>に切断できます!
左右二分割ではなく、<strong>四つ</strong>に切断できます!
reward_painter_double:
title: 着色機 (ダブル)
desc: <strong>着色機</strong>のバリエーションが利用可能になりました。 -
通常の着色機と同様に機能しますが、ひとつの色の消費で<strong>一度に2つの形</strong>を着色処理できます!
reward_storage:
title: 余剰の貯蓄
desc: <strong>ゴミ箱</strong>のバリエーションが利用可能になりました。 - 容量上限までアイテムを格納することができます!<br><br>
title: ストレージ
desc: <strong>ストレージ</strong>が利用可能になりました。 - 容量上限までアイテムを格納できます!<br><br>
左側の出力を優先するため、<strong>オーバーフローゲート</strong>としても使用できます!
reward_blueprints:
title: ブループリント
desc: 工場の建造物の<strong>コピー&ペースト</strong>が利用可能になりました!
範囲選択(CTRLキーを押したままマウスドラッグ)した状態で、'C'キーを押すことでコピーができます。<br><br>ペーストは<strong>タダではありません。</strong><strong>ブループリントの形</strong>を生産することで可能になります!(たった今納品したものです)
範囲選択(CTRLキーを押したままマウスドラッグ)した状態で、'C'キーを押すことでコピーができます。<br><br>ただしペーストは<strong>タダではありません。</strong><strong>ブループリントの形</strong>を生産する必要があります!(たった今納品した形です)
reward_rotater_180:
title: 180度の回転
desc: <strong>回転機</strong>のバリエーションが利用可能になりました 180度の回転ができるようになります!(サプライズ! :D)
title: 回転180°
desc: <strong>回転機</strong>のバリエーションが利用可能になりました 180°の回転ができるようになります!(サプライズ! :D
reward_wires_painter_and_levers:
title: ワイヤ&着色機(四分割)
desc: "<strong>ワイヤレイヤ</strong>が利用可能になりました: これは通常の レイヤーの上にある別のレイヤであり、多くの新しい要素が
あります!<br><br> 最初に、<strong>四色 着色機</strong>が利用可能になりました -
着色するスロットをワイヤレイヤで 接続します!<br><br> ワイヤレイヤに切り替えるには、
<strong>E</strong>を押します。 <br><br> 補足:
設定で<strong>ヒントを有効にする</strong>と、 ワイヤのチュートリアルが有効になります。"
desc: "<strong>ワイヤレイヤ</strong>が利用可能になりました: これは通常の レイヤーの上にある別のレイヤであり、多くの新しい要素があります!<br><br>
まず最初に、<strong>四色着色機</strong>が利用可能になりました - 着色するスロットをワイヤレイヤで接続してください!<br><br>
ワイヤレイヤに切り替えるには、<strong>E</strong>を押します。 <br><br>
補足: 設定で<strong>ヒントを有効にする</strong>と、 ワイヤのチュートリアルが有効になります。"
reward_filter:
title: アイテムフィルタ
desc: <strong>アイテムフィルタ</strong>が利用可能になりました! ワイヤレイヤの信号と一致するかどうかに応じて、
アイテムを上部または右側の出力に分離します。<br><br>真偽値(0/1)信号を利用することで
どんなアイテムでも通過させるか、または通過させないかを選ぶこともできます。
desc: <strong>アイテムフィルタ</strong>が利用可能になりました! ワイヤレイヤの信号と一致するかどうかに応じて、アイテムを上側または右側の出力に分離します。<br><br>
また、真偽値(0/1)信号を入力すれば全てのアイテムの通過・非通過を制御できます。
reward_display:
title: ディスプレイ
desc: "<strong>ディスプレイ</strong>が利用可能になりました - ワイヤレイヤで
信号を接続することで、その内容を視認することができます!<br><br> 補足: ベルトリーダーとストレージが
最後に通過したアイテムを出力していることに気づきましたか? それをディスプレイに 表示してみてください!"
desc: "<strong>ディスプレイ</strong>が利用可能になりました - ワイヤレイヤで信号を接続することで、その内容を表示できます!<br><br>
補足: ベルトリーダーとストレージが最後に通過したアイテムを出力していることに気づきましたか? それをディスプレイに表示してみてください!"
reward_constant_signal:
title: 定数信号
desc: <strong>定数信号</strong>がワイヤレイヤで
利用可能になりました! これは例えば<strong>アイテムフィルタ</strong>に接続する 場合に便利です。<br><br>
定数信号は <strong>形状</strong>、<strong>色</strong>または
<strong>真偽値</strong>(1か0)を発信できます。
desc: <strong>定数信号</strong>がワイヤレイヤで利用可能になりました! これは例えば<strong>アイテムフィルタ</strong>に接続すると便利です。<br><br>
発信できる信号は<strong>形状</strong>、<strong>色</strong>、<strong>真偽値</strong>(1か0)です。
reward_logic_gates:
title: 論理ゲート
desc: <strong>論理ゲート</strong>が利用可能になりました! 興奮する必要はありませんが、非常に優秀なのです<br><br>
これでAND, OR, XOR,
NOTを計算できます。<br><br>ボーナスとして<strong>トランジスタ</strong>も追加しました!
desc: <strong>論理ゲート</strong>が利用可能になりました! 興奮する必要はありませんが、これは非常に優秀なんですよ<br><br>
これでAND, OR, XOR, NOTを計算できます。<br><br>
ボーナスとして<strong>トランジスタ</strong>も追加しました!
reward_virtual_processing:
title: 仮想処理
desc: <strong>形状処理をシミュレート</strong>できる新しい部品をたくさん追加しました!<br><br>
@ -596,9 +588,8 @@ storyRewards:
- ワイヤでイカしたものを作る。<br><br> - 今までのように工場を建設する。<br><br> いずれにしても、楽しんでください!
no_reward:
title: 次のレベル
desc: "このレベルには報酬はありません。次にはあるでしょう! <br><br> 補足: すでに作った生産ラインは削除しないようにしましょう。 -
生産された形は<strong>すべて</strong>、後に<strong>アップグレードの解除</strong>のために必要になりま\
す!"
desc: "このレベルには報酬はありません。次はきっとありますよ! <br><br> 補足: すでに作った生産ラインは削除しないようにしましょう。 -
生産された形は<strong>すべて</strong>、後で<strong>アップグレードの解除</strong>に必要になります!"
no_reward_freeplay:
title: 次のレベル
desc: おめでとうございます!
@ -606,8 +597,8 @@ storyRewards:
title: フリープレイ
desc: やりましたね! <strong>フリープレイモード</strong>が利用可能になりました。 -
これからは納品すべき形は<strong>ランダムに</strong>生成されます!<br><br>
今後、ハブは<strong>スループット</strong>が必要になるため、要求する形状を自動的に納品するマシンを構築することを強くお勧めします!<br><br>
ハブは要求する形状をワイヤレイヤに出力するので、それを分析し自動的に調整する工場を作成するだけです
今後、ハブは<strong>スループット</strong>を要求してきます。要求された形状を自動的に納品するマシンを構築することを強くお勧めします!<br><br>
ハブは要求する形状をワイヤレイヤに出力するので、それを分析して自動的に工場を調整するだけですよ
reward_demo_end:
title: お試し終了
desc: デモ版の最後に到達しました!
@ -665,13 +656,13 @@ settings:
extremely_fast: 極速
language:
title: 言語
description: 言語を変更します。すべての翻訳はユーザーからの協力で成り立っており、まだ完全には完了していない可能性があります!
description: 言語を変更します。すべての翻訳はユーザーの皆さんの協力によるものであり、まだ不完全な可能性があります!
enableColorBlindHelper:
title: 色覚モード
description: 色覚特性を持っていてもゲームがプレイできるようにするための各種ツールを有効化します。
fullscreen:
title: フルスクリーン
description: フルスクリーンでのプレイが推奨す。スタンドアローン版のみ変更可能です。
description: フルスクリーンでのプレイが推奨されます。スタンドアローン版のみ変更可能です。
soundsMuted:
title: 効果音ミュート
description: 有効に設定するとすべての効果音をミュートします。
@ -686,13 +677,13 @@ settings:
description: 音楽の音量を設定してください。
theme:
title: ゲームテーマ
description: ゲームテーマを選択します。 (ライト / ダーク).
description: ゲームテーマを選択します。(ライト/ダーク)
themes:
dark: ダーク
light: ライト
refreshRate:
title: シミュレーション対象
description: もし144hzのモニターを利用しているなら、この設定でリフレッシュレートを変更することで、ゲームが高リフレッシュレートを正しくシミュレーションします。利用しているPCが非力な場合、この設定により実効FPSが遅くなる可能性があります。
title: リフレッシュレート
description: 秒間何回ゲームが更新されるかを設定できます。一般的には値が高いほど正確になりますが、パフォーマンスは低下します。値が低い場合、正確なスループットを計測できなくなる可能性があります。
alwaysMultiplace:
title: 連続配置
description: この設定を有効にすると、建造物を選択後に意図的にキャンセルするまで選択された状態を維持します。これはSHIFTキーを押し続けている状態と同等です。
@ -749,7 +740,7 @@ settings:
description: ズームアウトしたときの図形のサイズを調節します。
keybindings:
title: キー設定
hint: "Tip: CTRL, SHIFT, ALTを利用するようにしてください。これらはそれぞれ建造物配置の際の機能があります。"
hint: "Tip: CTRL, SHIFT, ALTを活用してください。建造物配置の際の追加機能がそれぞれ割り当てられています。"
resetKeybindings: キー設定をリセット
categoryLabels:
general: アプリケーション
@ -785,7 +776,7 @@ keybindings:
cutter: 切断機
rotater: 回転機
stacker: 積層機
mixer:
mixer:
painter: 着色機
trash: ゴミ箱
storage: ストレージ
@ -811,31 +802,31 @@ keybindings:
cycleBuildings: 建造物の選択
lockBeltDirection: ベルトプランナーを有効化
switchDirectionLockSide: "プランナー: 通る側を切り替え"
copyWireValue: "ワイヤ: カーソルに合っている形状信号をキーとしてコピー"
copyWireValue: "ワイヤ: カーソルの下の形状信号をキーとしてコピー"
massSelectStart: マウスドラッグで開始
massSelectSelectMultiple: 複数範囲選択
massSelectCopy: 範囲コピー
massSelectCut: 範囲カット
placementDisableAutoOrientation: 自動向き合わせ無効
placementDisableAutoOrientation: 自動向き合わせ無効
placeMultiple: 配置モードの維持
placeInverse: ベルトの自動向き合わせを逆転
rotateToUp: "Rotate: Point Up"
rotateToDown: "Rotate: Point Down"
rotateToRight: "Rotate: Point Right"
rotateToLeft: "Rotate: Point Left"
rotateToUp: "回転: 上向きにする"
rotateToDown: "回転: 下向きにする"
rotateToRight: "回転: 右向きにする"
rotateToLeft: "回転: 左向きにする"
about:
title: このゲームについて
body: >-
このゲームはオープンソースであり、<a href="https://github.com/tobspr"
target="_blank">Tobias Springer</a> (私)によって開発されています。<br><br>
target="_blank">Tobias Springer</a> (私です)によって開発されています。<br><br>
開発に参加したい場合は以下をチェックしてみてください。<a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
開発に参加したい場合はこちらをチェックしてみてください:<a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
このゲームはdiscordでの素晴らしいコミュニティなしには実現しませんでした。 - このサーバにも是非参加してください! <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
このゲームは素晴らしいDiscordコミュニティなしには実現しませんでした。 - このサーバにも是非参加してください! <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
サウンドトラックは<a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a>により製作されました。 - 彼は素晴らしいです<br><br>
サウンドトラックは<a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a>により製作されました。 - 彼は素晴らしいです<br><br>
最後に、私の最高の友人<a href="https://github.com/niklas-dahl" target="_blank">Niklas</a>に大きな感謝を。 - 彼とのFactorioのゲーム体験がなければ、このゲームは存在しませんでした
最後に、私の最高の友人<a href="https://github.com/niklas-dahl" target="_blank">Niklas</a>に大きな感謝を。 - 彼とのFactorioのゲーム体験がなければ、このゲームは存在しなかったでしょう
changelog:
title: 更新履歴
demo:
@ -869,9 +860,9 @@ tips:
- 切断機は配置された向きを考慮せず、常に垂直に切断します。
- ストレージは左側の出力を優先します。
- 増築可能なデザインを作るために時間を使ってください。それだけの価値があります!
- Invest time to build repeatable designs - it's worth it!
- <b>ALT</b>を押しながらベルトを設置すると、逆向きに設置できます。
- You can hold <b>ALT</b> to invert the direction of placed belts.
- <b>SHIFT</b>を使用すると複数の建物を一度に配置できます。
- <b>ALT</b>を押しながらベルトを設置すると、向きを逆転できます。
- 効率が重要です!
- ハブから遠くに離れるほど、形状資源はより複雑な形になります。
- 機械の速度には上限があるので、最大効率を得るためには入力を分割してください。
- 効率を最大化するために分配機/合流機を使用できます。
@ -886,9 +877,9 @@ tips:
- 最大の効率を得るためには、切断する前に着色をしてください。
- モジュールがあれば、空間はただの認識に過ぎなくなる――生ある人間に対する気遣いだ。
- 設計図としての工場を別に作っておくと、工場のモジュール化において重要な役割を果たします。
- 機をよく見ると、色の混ぜ方が解ります。
- Have a closer look at the color mixer, and your questions will be answered.
- Use <b>CTRL</b> + Click to select an area.
- 機をよく見ると、色の混ぜ方が解ります。
- <b>CTRL</b> + クリックで範囲選択ができます。
- ハブに近すぎる設計物を作ると、のちの設計の邪魔になるかもしれません。
- アップグレードリストの各形状の横にあるピンのアイコンは、その形状を画面左に固定表示します。
- 三原色全てを混ぜ合わせると白になります!
- マップは無限の広さがあります。臆せずに拡張してください。
@ -899,7 +890,6 @@ tips:
- このゲームにはたくさんの設定があります。是非チェックしてみてください!
- ハブのマーカーには、その方向を示す小さなコンパスがついています。
- ベルトの中身をクリアするには、範囲選択して同じ場所に貼り付けをします。
- F4を押すことで、FPSとTickレートを表示することができます。
- F4を2回押すと、マウスとカメラの座標を表示することができます。
- F4を押すことで、FPSとTickレートを表示できます。
- F4を2回押すと、マウスとカメラの座標を表示できます。
- 左のピン留めされた図形をクリックすると、固定を解除できます。
- You can click a pinned shape on the left side to unpin it.

View File

@ -13,14 +13,14 @@ steamPage:
Enquanto no começo você apenas processa as formas, mais a frente você deve pintá-las - para isso você deve extrair e misturar cores!
Comprar o jogo na Steam te garante acesso à versão completa, mas você pode jogar a versão demo em shapez.io primeiro e decidir depois!
what_others_say: What people say about shapez.io
nothernlion_comment: This game is great - I'm having a wonderful time playing,
and time has flown by.
notch_comment: Oh crap. I really should sleep, but I think I just figured out
how to make a computer in shapez.io
steam_review_comment: This game has stolen my life and I don't want it back.
Very chill factory game that won't let me stop making my lines more
efficient.
what_others_say: O que as pessoas dizem sobre o shapez.io
nothernlion_comment: Este jogo é ótimo - estou me divertindo muito jogando
e o tempo passou voando.
notch_comment: Droga. Eu realmente deveria dormir, mas eu acho que acabei
de descobrir como fazer um computador no shapez.io
steam_review_comment: Este jogo roubou minha vida e eu não a quero de volta.
Jogo de fábrica muito descontraído que não me deixa parar de fazer
linhas mais eficientes.
global:
loading: Carregando
error: Erro
@ -214,7 +214,7 @@ ingame:
uncolored: Sem cor
buildingPlacement:
cycleBuildingVariants: Aperte <key> para variações.
hotkeyLabel: "Hotkey: <key>"
hotkeyLabel: "Tecla: <key>"
infoTexts:
speed: Velocidade
range: Distância
@ -299,7 +299,7 @@ ingame:
não for necessário.
2_3_more_cutters: "Bom trabalho! Agora coloque <strong>mais 2
cortadores</strong> para acelerar este processo lento!<br><br>
PS: Use as <strong> hotkeys 0-9 </strong> para acessar as
PS: Use as <strong> teclas 0-9 </strong> para acessar as
construções mais rápido!"
3_1_rectangles: "Vamos extrair alguns retângulos! <strong>Construa 4
extratores</strong> e conecte-os ao hub.<br><br> PS: Segure

View File

@ -14,14 +14,14 @@ steamPage:
Embora no inicio apenas tenhas de processar formas, mais tarde, vais ter de as colorir - para isto terás de extrair e misturar cores!
Comprar o jogo na Steam dar-te-á acesso à versão completa, mas também podes jogar a versão demo em shapez.io primeiro e decidir mais tarde!
what_others_say: What people say about shapez.io
nothernlion_comment: This game is great - I'm having a wonderful time playing,
and time has flown by.
notch_comment: Oh crap. I really should sleep, but I think I just figured out
how to make a computer in shapez.io
steam_review_comment: This game has stolen my life and I don't want it back.
Very chill factory game that won't let me stop making my lines more
efficient.
what_others_say: O que dizem sobre o shapez.io
nothernlion_comment: Este é um jogo fantástico - Estou a ter um bom bocado enquanto o jogo,
e o tempo parece que voa.
notch_comment: Ora bolas. Eu devia ir dormir, mas acho que acabei de descobrir
como criar computorizar no shapez.io
steam_review_comment: Este jogo roubou a minha vida e não a quero de volta.
Jogo de fábrica relaxante que não me deixa parar de fazer as minhas linhas
cada vez mais eficientes.
global:
loading: A Carregar
error: Erro
@ -318,7 +318,7 @@ ingame:
purple: Roxo
cyan: Ciano
white: Branco
uncolored: Incolor
uncolored: Sem cor
black: Preto
shapeViewer:
title: Camadas

View File

@ -1 +1 @@
1.3.0
1.3.1