Merge remote-tracking branch 'tobspr/master'
1
.github/workflows/ci.yml
vendored
@ -42,6 +42,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cd gulp
|
cd gulp
|
||||||
yarn gulp translations.fullBuild
|
yarn gulp translations.fullBuild
|
||||||
|
yarn gulp localConfig.findOrCreate
|
||||||
cd ..
|
cd ..
|
||||||
yarn tslint
|
yarn tslint
|
||||||
|
|
||||||
|
5
.gitignore
vendored
@ -46,7 +46,12 @@ res_built
|
|||||||
|
|
||||||
gulp/runnable-texturepacker.jar
|
gulp/runnable-texturepacker.jar
|
||||||
tmp_standalone_files
|
tmp_standalone_files
|
||||||
|
tmp_standalone_files_china
|
||||||
|
|
||||||
# Local config
|
# Local config
|
||||||
config.local.js
|
config.local.js
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# Editor artifacts
|
||||||
|
*.*.swp
|
||||||
|
*.*.swo
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
/* eslint-disable quotes,no-undef */
|
/* 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 path = require("path");
|
||||||
const url = require("url");
|
const url = require("url");
|
||||||
const childProcess = require("child_process");
|
|
||||||
const { ipcMain, shell } = require("electron");
|
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
|
const steam = require("./steam");
|
||||||
|
const asyncLock = require("async-lock");
|
||||||
|
|
||||||
const isDev = process.argv.indexOf("--dev") >= 0;
|
const isDev = process.argv.indexOf("--dev") >= 0;
|
||||||
const isLocal = process.argv.indexOf("--local") >= 0;
|
const isLocal = process.argv.indexOf("--local") >= 0;
|
||||||
|
|
||||||
@ -152,7 +153,82 @@ ipcMain.on("exit-app", (event, flag) => {
|
|||||||
app.quit();
|
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);
|
const fname = path.join(storePath, job.filename);
|
||||||
|
|
||||||
switch (job.type) {
|
switch (job.type) {
|
||||||
@ -164,38 +240,35 @@ function performFsJob(job) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let contents = "";
|
|
||||||
try {
|
try {
|
||||||
contents = fs.readFileSync(fname, { encoding: "utf8" });
|
const data = await fs.promises.readFile(fname, { encoding: "utf8" });
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data,
|
||||||
|
};
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return {
|
return {
|
||||||
error: ex,
|
error: ex,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: contents,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
case "write": {
|
case "write": {
|
||||||
try {
|
try {
|
||||||
fs.writeFileSync(fname, job.contents);
|
await writeFileSafe(fname, job.contents);
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
data: job.contents,
|
||||||
|
};
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return {
|
return {
|
||||||
error: ex,
|
error: ex,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
data: job.contents,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "delete": {
|
case "delete": {
|
||||||
try {
|
try {
|
||||||
fs.unlinkSync(fname);
|
await fs.promises.unlink(fname);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return {
|
return {
|
||||||
error: ex,
|
error: ex,
|
||||||
@ -213,12 +286,7 @@ function performFsJob(job) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ipcMain.on("fs-job", (event, arg) => {
|
ipcMain.handle("fs-job", (event, arg) => performFsJob(arg));
|
||||||
const result = performFsJob(arg);
|
|
||||||
event.reply("fs-response", { id: arg.id, result });
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcMain.on("fs-sync-job", (event, arg) => {
|
steam.init(isDev);
|
||||||
const result = performFsJob(arg);
|
steam.listen();
|
||||||
event.returnValue = result;
|
|
||||||
});
|
|
||||||
|
@ -10,7 +10,12 @@
|
|||||||
"start": "electron --disable-direct-composition --in-process-gpu ."
|
"start": "electron --disable-direct-composition --in-process-gpu ."
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"electron": "10.1.3"
|
"electron": "10.4.0"
|
||||||
},
|
},
|
||||||
"dependencies": {}
|
"optionalDependencies": {
|
||||||
|
"shapez.io-private-artifacts": "github:tobspr/shapez.io-private-artifacts#abi-v85"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"async-lock": "^1.2.8"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
73
electron/steam.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { ipcMain } = require("electron");
|
||||||
|
|
||||||
|
let greenworks = null;
|
||||||
|
let appId = null;
|
||||||
|
let initialized = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
greenworks = require("shapez.io-private-artifacts/steam/greenworks");
|
||||||
|
appId = parseInt(fs.readFileSync(path.join(__dirname, "steam_appid.txt"), "utf8"));
|
||||||
|
} catch (err) {
|
||||||
|
// greenworks is not installed
|
||||||
|
// throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
function init (isDev) {
|
||||||
|
if (!greenworks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isDev) {
|
||||||
|
if (greenworks.restartAppIfNecessary(appId)) {
|
||||||
|
console.log("Restarting ...");
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!greenworks.init()) {
|
||||||
|
console.log("Failed to initialize greenworks");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function listen () {
|
||||||
|
ipcMain.handle("steam:is-initialized", isInitialized);
|
||||||
|
|
||||||
|
if (!greenworks || !initialized) {
|
||||||
|
console.log("Ignoring Steam IPC events");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMain.handle("steam:get-achievement-names", getAchievementNames);
|
||||||
|
ipcMain.handle("steam:activate-achievement", activateAchievement);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isInitialized(event) {
|
||||||
|
return Promise.resolve(initialized);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAchievementNames(event) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
const achievements = greenworks.getAchievementNames()
|
||||||
|
resolve(achievements);
|
||||||
|
} catch (err) {
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateAchievement(event, id) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
greenworks.activateAchievement(id, () => resolve(), err => reject(err))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
init,
|
||||||
|
listen
|
||||||
|
};
|
@ -1 +1 @@
|
|||||||
1134480
|
1318690
|
||||||
|
1154
electron/yarn.lock
@ -21,7 +21,6 @@ function gulptasksCSS($, gulp, buildFolder, browserSync) {
|
|||||||
const plugins = [postcssAssetsPlugin(cachebust)];
|
const plugins = [postcssAssetsPlugin(cachebust)];
|
||||||
if (prod) {
|
if (prod) {
|
||||||
plugins.unshift(
|
plugins.unshift(
|
||||||
$.postcssUnprefix(),
|
|
||||||
$.postcssPresetEnv({
|
$.postcssPresetEnv({
|
||||||
browsers: ["> 0.1%"],
|
browsers: ["> 0.1%"],
|
||||||
})
|
})
|
||||||
@ -62,7 +61,7 @@ function gulptasksCSS($, gulp, buildFolder, browserSync) {
|
|||||||
return gulp
|
return gulp
|
||||||
.src("../src/css/main.scss", { cwd: __dirname })
|
.src("../src/css/main.scss", { cwd: __dirname })
|
||||||
.pipe($.plumber())
|
.pipe($.plumber())
|
||||||
.pipe($.sass.sync().on("error", $.sass.logError))
|
.pipe($.dartSass.sync().on("error", $.dartSass.logError))
|
||||||
.pipe(
|
.pipe(
|
||||||
$.postcss([
|
$.postcss([
|
||||||
$.postcssCriticalSplit({
|
$.postcssCriticalSplit({
|
||||||
@ -95,7 +94,7 @@ function gulptasksCSS($, gulp, buildFolder, browserSync) {
|
|||||||
return gulp
|
return gulp
|
||||||
.src("../src/css/main.scss", { cwd: __dirname })
|
.src("../src/css/main.scss", { cwd: __dirname })
|
||||||
.pipe($.plumber())
|
.pipe($.plumber())
|
||||||
.pipe($.sass.sync().on("error", $.sass.logError))
|
.pipe($.dartSass.sync().on("error", $.dartSass.logError))
|
||||||
.pipe(
|
.pipe(
|
||||||
$.postcss([
|
$.postcss([
|
||||||
$.postcssCriticalSplit({
|
$.postcssCriticalSplit({
|
||||||
|
@ -50,6 +50,9 @@ css.gulptasksCSS($, gulp, buildFolder, browserSync);
|
|||||||
const sounds = require("./sounds");
|
const sounds = require("./sounds");
|
||||||
sounds.gulptasksSounds($, gulp, buildFolder);
|
sounds.gulptasksSounds($, gulp, buildFolder);
|
||||||
|
|
||||||
|
const localConfig = require("./local-config");
|
||||||
|
localConfig.gulptasksLocalConfig($, gulp);
|
||||||
|
|
||||||
const js = require("./js");
|
const js = require("./js");
|
||||||
js.gulptasksJS($, gulp, buildFolder, browserSync);
|
js.gulptasksJS($, gulp, buildFolder, browserSync);
|
||||||
|
|
||||||
@ -136,7 +139,7 @@ gulp.task("main.webserver", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
function serve({ standalone }) {
|
function serve({ standalone, chineseVersion = false }) {
|
||||||
browserSync.init({
|
browserSync.init({
|
||||||
server: buildFolder,
|
server: buildFolder,
|
||||||
port: 3005,
|
port: 3005,
|
||||||
@ -200,7 +203,11 @@ function serve({ standalone }) {
|
|||||||
if (standalone) {
|
if (standalone) {
|
||||||
gulp.series("js.standalone-dev.watch")(() => true);
|
gulp.series("js.standalone-dev.watch")(() => true);
|
||||||
} else {
|
} else {
|
||||||
gulp.series("js.dev.watch")(() => true);
|
if (chineseVersion) {
|
||||||
|
gulp.series("china.js.dev.watch")(() => true);
|
||||||
|
} else {
|
||||||
|
gulp.series("js.dev.watch")(() => true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,6 +228,7 @@ gulp.task(
|
|||||||
gulp.series(
|
gulp.series(
|
||||||
"utils.cleanup",
|
"utils.cleanup",
|
||||||
"utils.copyAdditionalBuildFiles",
|
"utils.copyAdditionalBuildFiles",
|
||||||
|
"localConfig.findOrCreate",
|
||||||
"imgres.buildAtlas",
|
"imgres.buildAtlas",
|
||||||
"imgres.atlasToJson",
|
"imgres.atlasToJson",
|
||||||
"imgres.atlas",
|
"imgres.atlas",
|
||||||
@ -238,6 +246,7 @@ gulp.task(
|
|||||||
"build.standalone.dev",
|
"build.standalone.dev",
|
||||||
gulp.series(
|
gulp.series(
|
||||||
"utils.cleanup",
|
"utils.cleanup",
|
||||||
|
"localConfig.findOrCreate",
|
||||||
"imgres.buildAtlas",
|
"imgres.buildAtlas",
|
||||||
"imgres.atlasToJson",
|
"imgres.atlasToJson",
|
||||||
"imgres.atlas",
|
"imgres.atlas",
|
||||||
@ -284,30 +293,28 @@ gulp.task(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Builds everything (standalone-prod)
|
// Builds everything (standalone-prod)
|
||||||
gulp.task(
|
|
||||||
"step.standalone-prod.code",
|
|
||||||
gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-prod")
|
|
||||||
);
|
|
||||||
gulp.task("step.standalone-prod.mainbuild", gulp.parallel("step.baseResources", "step.standalone-prod.code"));
|
|
||||||
gulp.task(
|
|
||||||
"step.standalone-prod.all",
|
|
||||||
gulp.series("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
|
|
||||||
);
|
|
||||||
gulp.task(
|
|
||||||
"build.standalone-prod",
|
|
||||||
gulp.series("utils.cleanup", "step.standalone-prod.all", "step.postbuild")
|
|
||||||
);
|
|
||||||
|
|
||||||
// OS X build and release upload
|
for (const prefix of ["", "china."]) {
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"build.darwin64-prod",
|
prefix + "step.standalone-prod.code",
|
||||||
gulp.series(
|
gulp.series("sounds.fullbuildHQ", "translations.fullBuild", prefix + "js.standalone-prod")
|
||||||
"build.standalone-prod",
|
);
|
||||||
"standalone.prepare",
|
|
||||||
"standalone.package.prod.darwin64",
|
gulp.task(
|
||||||
"standalone.uploadRelease.darwin64"
|
prefix + "step.standalone-prod.mainbuild",
|
||||||
)
|
gulp.parallel("step.baseResources", prefix + "step.standalone-prod.code")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
prefix + "step.standalone-prod.all",
|
||||||
|
gulp.series(prefix + "step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
prefix + "build.standalone-prod",
|
||||||
|
gulp.series("utils.cleanup", prefix + "step.standalone-prod.all", "step.postbuild")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Deploying!
|
// Deploying!
|
||||||
gulp.task(
|
gulp.task(
|
||||||
@ -320,7 +327,12 @@ gulp.task(
|
|||||||
);
|
);
|
||||||
gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod"));
|
gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod"));
|
||||||
gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod"));
|
gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod"));
|
||||||
gulp.task("main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
|
gulp.task("regular.main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
|
||||||
|
gulp.task(
|
||||||
|
"china.main.standalone",
|
||||||
|
gulp.series("china.build.standalone-prod", "china.standalone.package.prod")
|
||||||
|
);
|
||||||
|
gulp.task("standalone.all", gulp.series("regular.main.standalone", "china.main.standalone"));
|
||||||
|
|
||||||
// Live-development
|
// Live-development
|
||||||
gulp.task(
|
gulp.task(
|
||||||
@ -331,5 +343,9 @@ gulp.task(
|
|||||||
"main.serveStandalone",
|
"main.serveStandalone",
|
||||||
gulp.series("build.standalone.dev", () => serve({ standalone: true }))
|
gulp.series("build.standalone.dev", () => serve({ standalone: true }))
|
||||||
);
|
);
|
||||||
|
gulp.task(
|
||||||
|
"china.main.serveDev",
|
||||||
|
gulp.series("build.dev", () => serve({ standalone: false, chineseVersion: true }))
|
||||||
|
);
|
||||||
|
|
||||||
gulp.task("default", gulp.series("main.serveDev"));
|
gulp.task("default", gulp.series("main.serveDev"));
|
||||||
|
48
gulp/js.js
@ -6,7 +6,6 @@ function requireUncached(module) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function gulptasksJS($, gulp, buildFolder, browserSync) {
|
function gulptasksJS($, gulp, buildFolder, browserSync) {
|
||||||
|
|
||||||
//// DEV
|
//// DEV
|
||||||
|
|
||||||
gulp.task("js.dev.watch", () => {
|
gulp.task("js.dev.watch", () => {
|
||||||
@ -30,6 +29,36 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
|
|||||||
.pipe(gulp.dest(buildFolder));
|
.pipe(gulp.dest(buildFolder));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//// DEV CHINA
|
||||||
|
|
||||||
|
gulp.task("china.js.dev.watch", () => {
|
||||||
|
return gulp
|
||||||
|
.src("../src/js/main.js")
|
||||||
|
.pipe(
|
||||||
|
$.webpackStream(
|
||||||
|
requireUncached("./webpack.config.js")({
|
||||||
|
watch: true,
|
||||||
|
chineseVersion: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.pipe(gulp.dest(buildFolder))
|
||||||
|
.pipe(browserSync.stream());
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task("china.js.dev", () => {
|
||||||
|
return gulp
|
||||||
|
.src("../src/js/main.js")
|
||||||
|
.pipe(
|
||||||
|
$.webpackStream(
|
||||||
|
requireUncached("./webpack.config.js")({
|
||||||
|
chineseVersion: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.pipe(gulp.dest(buildFolder));
|
||||||
|
});
|
||||||
|
|
||||||
//// STAGING
|
//// STAGING
|
||||||
|
|
||||||
gulp.task("js.staging.transpiled", () => {
|
gulp.task("js.staging.transpiled", () => {
|
||||||
@ -162,6 +191,23 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
|
|||||||
)
|
)
|
||||||
.pipe(gulp.dest(buildFolder));
|
.pipe(gulp.dest(buildFolder));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gulp.task("china.js.standalone-prod", () => {
|
||||||
|
return gulp
|
||||||
|
.src("../src/js/main.js")
|
||||||
|
.pipe(
|
||||||
|
$.webpackStream(
|
||||||
|
requireUncached("./webpack.production.config.js")({
|
||||||
|
enableAssert: false,
|
||||||
|
environment: "prod",
|
||||||
|
es6: true,
|
||||||
|
standalone: true,
|
||||||
|
chineseVersion: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.pipe(gulp.dest(buildFolder));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
18
gulp/local-config.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const fs = require("fs");
|
||||||
|
const fse = require("fs-extra");
|
||||||
|
|
||||||
|
const configTemplatePath = path.join(__dirname, "../src/js/core/config.local.template.js");
|
||||||
|
const configPath = path.join(__dirname, "../src/js/core/config.local.js");
|
||||||
|
|
||||||
|
function gulptasksLocalConfig($, gulp) {
|
||||||
|
gulp.task("localConfig.findOrCreate", cb => {
|
||||||
|
if (!fs.existsSync(configPath)) {
|
||||||
|
fse.copySync(configTemplatePath, configPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { gulptasksLocalConfig };
|
@ -34,6 +34,7 @@
|
|||||||
"fastdom": "^1.0.9",
|
"fastdom": "^1.0.9",
|
||||||
"flatted": "^2.0.1",
|
"flatted": "^2.0.1",
|
||||||
"fs-extra": "^8.1.0",
|
"fs-extra": "^8.1.0",
|
||||||
|
"gifsicle": "^5.2.0",
|
||||||
"gulp-audiosprite": "^1.1.0",
|
"gulp-audiosprite": "^1.1.0",
|
||||||
"howler": "^2.1.2",
|
"howler": "^2.1.2",
|
||||||
"html-loader": "^0.5.5",
|
"html-loader": "^0.5.5",
|
||||||
@ -61,7 +62,8 @@
|
|||||||
"webpack-plugin-replace": "^1.1.1",
|
"webpack-plugin-replace": "^1.1.1",
|
||||||
"webpack-strip-block": "^0.2.0",
|
"webpack-strip-block": "^0.2.0",
|
||||||
"whatwg-fetch": "^3.0.0",
|
"whatwg-fetch": "^3.0.0",
|
||||||
"worker-loader": "^2.0.0"
|
"worker-loader": "^2.0.0",
|
||||||
|
"yaml": "^1.10.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^9.4.3",
|
"autoprefixer": "^9.4.3",
|
||||||
@ -77,6 +79,7 @@
|
|||||||
"gulp-cache": "^1.1.3",
|
"gulp-cache": "^1.1.3",
|
||||||
"gulp-cached": "^1.1.1",
|
"gulp-cached": "^1.1.1",
|
||||||
"gulp-clean": "^0.4.0",
|
"gulp-clean": "^0.4.0",
|
||||||
|
"gulp-dart-sass": "^1.0.2",
|
||||||
"gulp-dom": "^1.0.0",
|
"gulp-dom": "^1.0.0",
|
||||||
"gulp-flatten": "^0.4.0",
|
"gulp-flatten": "^0.4.0",
|
||||||
"gulp-fluent-ffmpeg": "^2.0.0",
|
"gulp-fluent-ffmpeg": "^2.0.0",
|
||||||
@ -90,7 +93,6 @@
|
|||||||
"gulp-pngquant": "^1.0.13",
|
"gulp-pngquant": "^1.0.13",
|
||||||
"gulp-postcss": "^8.0.0",
|
"gulp-postcss": "^8.0.0",
|
||||||
"gulp-rename": "^2.0.0",
|
"gulp-rename": "^2.0.0",
|
||||||
"gulp-sass": "^4.1.0",
|
|
||||||
"gulp-sass-lint": "^1.4.0",
|
"gulp-sass-lint": "^1.4.0",
|
||||||
"gulp-sftp": "git+https://git@github.com/webksde/gulp-sftp",
|
"gulp-sftp": "git+https://git@github.com/webksde/gulp-sftp",
|
||||||
"gulp-terser": "^1.2.0",
|
"gulp-terser": "^1.2.0",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
require("colors");
|
require("colors");
|
||||||
const packager = require("electron-packager");
|
const packager = require("electron-packager");
|
||||||
|
const pj = require("../electron/package.json");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const { getVersion } = require("./buildutils");
|
const { getVersion } = require("./buildutils");
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
@ -9,227 +10,189 @@ const execSync = require("child_process").execSync;
|
|||||||
|
|
||||||
function gulptasksStandalone($, gulp) {
|
function gulptasksStandalone($, gulp) {
|
||||||
const electronBaseDir = path.join(__dirname, "..", "electron");
|
const electronBaseDir = path.join(__dirname, "..", "electron");
|
||||||
|
const targets = [
|
||||||
|
{
|
||||||
|
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files"),
|
||||||
|
suffix: "",
|
||||||
|
taskPrefix: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files_china"),
|
||||||
|
suffix: "china",
|
||||||
|
taskPrefix: "china.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const tempDestDir = path.join(__dirname, "..", "tmp_standalone_files");
|
for (const { tempDestDir, suffix, taskPrefix } of targets) {
|
||||||
const tempDestBuildDir = path.join(tempDestDir, "built");
|
const tempDestBuildDir = path.join(tempDestDir, "built");
|
||||||
|
|
||||||
gulp.task("standalone.prepare.cleanup", () => {
|
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("standalone.prepare.copyPrefab", () => {
|
gulp.task(taskPrefix + "standalone.prepare.copyPrefab", () => {
|
||||||
// const requiredFiles = $.glob.sync("../electron/");
|
const requiredFiles = [
|
||||||
const requiredFiles = [
|
path.join(electronBaseDir, "node_modules", "**", "*.*"),
|
||||||
path.join(electronBaseDir, "lib", "**", "*.node"),
|
path.join(electronBaseDir, "node_modules", "**", ".*"),
|
||||||
path.join(electronBaseDir, "node_modules", "**", "*.*"),
|
path.join(electronBaseDir, "steam_appid.txt"),
|
||||||
path.join(electronBaseDir, "node_modules", "**", ".*"),
|
path.join(electronBaseDir, "favicon*"),
|
||||||
path.join(electronBaseDir, "favicon*"),
|
|
||||||
|
|
||||||
// fails on platforms which support symlinks
|
// fails on platforms which support symlinks
|
||||||
// https://github.com/gulpjs/gulp/issues/1427
|
// https://github.com/gulpjs/gulp/issues/1427
|
||||||
// path.join(electronBaseDir, "node_modules", "**", "*"),
|
// 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("standalone.prepare.writePackageJson", cb => {
|
gulp.task(taskPrefix + "standalone.prepare.writePackageJson", cb => {
|
||||||
fs.writeFileSync(
|
const packageJsonString = JSON.stringify(
|
||||||
path.join(tempDestBuildDir, "package.json"),
|
|
||||||
JSON.stringify(
|
|
||||||
{
|
{
|
||||||
devDependencies: {
|
scripts: {
|
||||||
electron: "6.1.12",
|
start: pj.scripts.start,
|
||||||
},
|
},
|
||||||
|
devDependencies: pj.devDependencies,
|
||||||
|
dependencies: pj.dependencies,
|
||||||
|
optionalDependencies: pj.optionalDependencies,
|
||||||
},
|
},
|
||||||
null,
|
null,
|
||||||
4
|
4
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(tempDestBuildDir, "package.json"), packageJsonString);
|
||||||
|
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task(taskPrefix + "standalone.prepareVDF", cb => {
|
||||||
|
const hash = buildutils.getRevision();
|
||||||
|
|
||||||
|
const steampipeDir = path.join(__dirname, "steampipe", "scripts");
|
||||||
|
const templateContents = fs
|
||||||
|
.readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
|
||||||
|
.toString();
|
||||||
|
|
||||||
|
const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
|
||||||
|
fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
|
||||||
|
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task(taskPrefix + "standalone.prepare.minifyCode", () => {
|
||||||
|
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task(taskPrefix + "standalone.prepare.copyGamefiles", () => {
|
||||||
|
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task(taskPrefix + "standalone.killRunningInstances", cb => {
|
||||||
|
try {
|
||||||
|
execSync("taskkill /F /IM shapezio.exe");
|
||||||
|
} catch (ex) {
|
||||||
|
console.warn("Failed to kill running instances, maybe none are up.");
|
||||||
|
}
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
taskPrefix + "standalone.prepare",
|
||||||
|
gulp.series(
|
||||||
|
taskPrefix + "standalone.killRunningInstances",
|
||||||
|
taskPrefix + "standalone.prepare.cleanup",
|
||||||
|
taskPrefix + "standalone.prepare.copyPrefab",
|
||||||
|
taskPrefix + "standalone.prepare.writePackageJson",
|
||||||
|
taskPrefix + "standalone.prepare.minifyCode",
|
||||||
|
taskPrefix + "standalone.prepare.copyGamefiles"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("standalone.prepareVDF", cb => {
|
/**
|
||||||
const hash = buildutils.getRevision();
|
*
|
||||||
|
* @param {'win32'|'linux'} platform
|
||||||
|
* @param {'x64'|'ia32'} arch
|
||||||
|
* @param {function():void} cb
|
||||||
|
*/
|
||||||
|
function packageStandalone(platform, arch, cb) {
|
||||||
|
const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
|
||||||
|
const privateArtifactsPath = "node_modules/shapez.io-private-artifacts";
|
||||||
|
|
||||||
const steampipeDir = path.join(__dirname, "steampipe", "scripts");
|
let asar;
|
||||||
const templateContents = fs
|
if (fs.existsSync(path.join(tempDestBuildDir, privateArtifactsPath))) {
|
||||||
.readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
|
asar = { unpackDir: privateArtifactsPath };
|
||||||
.toString();
|
} else {
|
||||||
|
asar = true;
|
||||||
const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
|
|
||||||
fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
|
|
||||||
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("standalone.prepare.minifyCode", () => {
|
|
||||||
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("standalone.prepare.copyGamefiles", () => {
|
|
||||||
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("standalone.killRunningInstances", cb => {
|
|
||||||
try {
|
|
||||||
execSync("taskkill /F /IM shapezio.exe");
|
|
||||||
} catch (ex) {
|
|
||||||
console.warn("Failed to kill running instances, maybe none are up.");
|
|
||||||
}
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task(
|
|
||||||
"standalone.prepare",
|
|
||||||
gulp.series(
|
|
||||||
"standalone.killRunningInstances",
|
|
||||||
"standalone.prepare.cleanup",
|
|
||||||
"standalone.prepare.copyPrefab",
|
|
||||||
"standalone.prepare.writePackageJson",
|
|
||||||
"standalone.prepare.minifyCode",
|
|
||||||
"standalone.prepare.copyGamefiles"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {'win32'|'linux'|'darwin'} platform
|
|
||||||
* @param {'x64'|'ia32'} arch
|
|
||||||
* @param {function():void} cb
|
|
||||||
* @param {boolean=} isRelease
|
|
||||||
*/
|
|
||||||
function packageStandalone(platform, arch, cb, isRelease = true) {
|
|
||||||
const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
|
|
||||||
|
|
||||||
packager({
|
|
||||||
dir: tempDestBuildDir,
|
|
||||||
appCopyright: "Tobias Springer",
|
|
||||||
appVersion: getVersion(),
|
|
||||||
buildVersion: "1.0.0",
|
|
||||||
arch,
|
|
||||||
platform,
|
|
||||||
asar: true,
|
|
||||||
executableName: "shapezio",
|
|
||||||
icon: path.join(electronBaseDir, "favicon"),
|
|
||||||
name: "shapez.io-standalone",
|
|
||||||
out: tempDestDir,
|
|
||||||
overwrite: true,
|
|
||||||
appBundleId: "io.shapez.standalone",
|
|
||||||
appCategoryType: "public.app-category.games",
|
|
||||||
...(isRelease &&
|
|
||||||
platform === "darwin" && {
|
|
||||||
osxSign: {
|
|
||||||
"identity": process.env.SHAPEZ_CLI_APPLE_CERT_NAME,
|
|
||||||
"hardened-runtime": true,
|
|
||||||
"hardenedRuntime": true,
|
|
||||||
"entitlements": "entitlements.plist",
|
|
||||||
"entitlements-inherit": "entitlements.plist",
|
|
||||||
"signature-flags": "library",
|
|
||||||
},
|
|
||||||
osxNotarize: {
|
|
||||||
appleId: process.env.SHAPEZ_CLI_APPLE_ID,
|
|
||||||
appleIdPassword: "@keychain:SHAPEZ_CLI_APPLE_ID",
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
}).then(
|
|
||||||
appPaths => {
|
|
||||||
console.log("Packages created:", appPaths);
|
|
||||||
appPaths.forEach(appPath => {
|
|
||||||
if (!fs.existsSync(appPath)) {
|
|
||||||
console.error("Bad app path gotten:", appPath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs.writeFileSync(
|
|
||||||
path.join(appPath, "LICENSE"),
|
|
||||||
fs.readFileSync(path.join(__dirname, "..", "LICENSE"))
|
|
||||||
);
|
|
||||||
|
|
||||||
fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
|
|
||||||
|
|
||||||
if (platform === "linux") {
|
|
||||||
fs.writeFileSync(
|
|
||||||
path.join(appPath, "play.sh"),
|
|
||||||
'#!/usr/bin/env bash\n./shapezio --no-sandbox "$@"\n'
|
|
||||||
);
|
|
||||||
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.platform === "win32" && platform === "darwin") {
|
|
||||||
console.warn(
|
|
||||||
"Cross-building for macOS on Windows: dereferencing symlinks.\n".red +
|
|
||||||
"This will nearly double app size and make code signature invalid. Sorry!\n"
|
|
||||||
.red.bold +
|
|
||||||
"For more information, see " +
|
|
||||||
"https://github.com/electron/electron-packager/issues/71".underline
|
|
||||||
);
|
|
||||||
|
|
||||||
// Clear up framework folders
|
|
||||||
fs.writeFileSync(
|
|
||||||
path.join(appPath, "play.sh"),
|
|
||||||
'#!/usr/bin/env bash\n./shapez.io-standalone.app/Contents/MacOS/shapezio --no-sandbox "$@"\n'
|
|
||||||
);
|
|
||||||
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
|
|
||||||
fs.chmodSync(
|
|
||||||
path.join(appPath, "shapez.io-standalone.app", "Contents", "MacOS", "shapezio"),
|
|
||||||
0o775
|
|
||||||
);
|
|
||||||
|
|
||||||
const finalPath = path.join(appPath, "shapez.io-standalone.app");
|
|
||||||
|
|
||||||
const frameworksDir = path.join(finalPath, "Contents", "Frameworks");
|
|
||||||
const frameworkFolders = fs
|
|
||||||
.readdirSync(frameworksDir)
|
|
||||||
.filter(fname => fname.endsWith(".framework"));
|
|
||||||
|
|
||||||
for (let i = 0; i < frameworkFolders.length; ++i) {
|
|
||||||
const folderName = frameworkFolders[i];
|
|
||||||
const frameworkFolder = path.join(frameworksDir, folderName);
|
|
||||||
console.log(" -> ", frameworkFolder);
|
|
||||||
|
|
||||||
const filesToDelete = fs
|
|
||||||
.readdirSync(frameworkFolder)
|
|
||||||
.filter(fname => fname.toLowerCase() !== "versions");
|
|
||||||
filesToDelete.forEach(fname => {
|
|
||||||
console.log(" -> Deleting", fname);
|
|
||||||
fs.unlinkSync(path.join(frameworkFolder, fname));
|
|
||||||
});
|
|
||||||
|
|
||||||
const frameworkSourceDir = path.join(frameworkFolder, "Versions", "A");
|
|
||||||
fse.copySync(frameworkSourceDir, frameworkFolder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cb();
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
console.error("Packaging error:", err);
|
|
||||||
cb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packager({
|
||||||
|
dir: tempDestBuildDir,
|
||||||
|
appCopyright: "Tobias Springer",
|
||||||
|
appVersion: getVersion(),
|
||||||
|
buildVersion: "1.0.0",
|
||||||
|
arch,
|
||||||
|
platform,
|
||||||
|
asar: asar,
|
||||||
|
executableName: "shapezio",
|
||||||
|
icon: path.join(electronBaseDir, "favicon"),
|
||||||
|
name: "shapez.io-standalone" + suffix,
|
||||||
|
out: tempDestDir,
|
||||||
|
overwrite: true,
|
||||||
|
appBundleId: "io.shapez.standalone",
|
||||||
|
appCategoryType: "public.app-category.games",
|
||||||
|
}).then(
|
||||||
|
appPaths => {
|
||||||
|
console.log("Packages created:", appPaths);
|
||||||
|
appPaths.forEach(appPath => {
|
||||||
|
if (!fs.existsSync(appPath)) {
|
||||||
|
console.error("Bad app path gotten:", appPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(appPath, "LICENSE"),
|
||||||
|
fs.readFileSync(path.join(__dirname, "..", "LICENSE"))
|
||||||
|
);
|
||||||
|
|
||||||
|
fse.copySync(
|
||||||
|
path.join(tempDestBuildDir, "steam_appid.txt"),
|
||||||
|
path.join(appPath, "steam_appid.txt")
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
|
||||||
|
|
||||||
|
if (platform === "linux") {
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(appPath, "play.sh"),
|
||||||
|
'#!/usr/bin/env bash\n./shapezio --no-sandbox "$@"\n'
|
||||||
|
);
|
||||||
|
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
cb();
|
||||||
|
},
|
||||||
|
err => {
|
||||||
|
console.error("Packaging error:", err);
|
||||||
|
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)
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
taskPrefix + "standalone.package.prod",
|
||||||
|
gulp.series(
|
||||||
|
taskPrefix + "standalone.prepare",
|
||||||
|
gulp.parallel(
|
||||||
|
taskPrefix + "standalone.package.prod.win64",
|
||||||
|
taskPrefix + "standalone.package.prod.linux64"
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task("standalone.package.prod.win64", cb => packageStandalone("win32", "x64", cb));
|
|
||||||
gulp.task("standalone.package.prod.win32", cb => packageStandalone("win32", "ia32", cb));
|
|
||||||
gulp.task("standalone.package.prod.linux64", cb => packageStandalone("linux", "x64", cb));
|
|
||||||
gulp.task("standalone.package.prod.linux32", cb => packageStandalone("linux", "ia32", cb));
|
|
||||||
gulp.task("standalone.package.prod.darwin64", cb => packageStandalone("darwin", "x64", cb));
|
|
||||||
gulp.task("standalone.package.prod.darwin64.unsigned", cb =>
|
|
||||||
packageStandalone("darwin", "x64", cb, false)
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task(
|
|
||||||
"standalone.package.prod",
|
|
||||||
gulp.series(
|
|
||||||
"standalone.prepare",
|
|
||||||
gulp.parallel(
|
|
||||||
"standalone.package.prod.win64",
|
|
||||||
"standalone.package.prod.linux64",
|
|
||||||
"standalone.package.prod.darwin64"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { gulptasksStandalone };
|
module.exports = { gulptasksStandalone };
|
||||||
|
@ -2,14 +2,16 @@
|
|||||||
{
|
{
|
||||||
"appid" "1318690"
|
"appid" "1318690"
|
||||||
"desc" "$DESC$"
|
"desc" "$DESC$"
|
||||||
"buildoutput" "C:\work\shapez\shapez.io\gulp\steampipe\steamtemp"
|
"buildoutput" "C:\work\shapez.io\gulp\steampipe\steamtemp"
|
||||||
"contentroot" ""
|
"contentroot" ""
|
||||||
"setlive" ""
|
"setlive" ""
|
||||||
"preview" "0"
|
"preview" "0"
|
||||||
"local" ""
|
"local" ""
|
||||||
"depots"
|
"depots"
|
||||||
{
|
{
|
||||||
"1318691" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\windows.vdf"
|
"1318691" "C:\work\shapez.io\gulp\steampipe\scripts\windows.vdf"
|
||||||
"1318692" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\linux.vdf"
|
"1318694" "C:\work\shapez.io\gulp\steampipe\scripts\china-windows.vdf"
|
||||||
|
"1318692" "C:\work\shapez.io\gulp\steampipe\scripts\linux.vdf"
|
||||||
|
"1318695" "C:\work\shapez.io\gulp\steampipe\scripts\china-linux.vdf"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
gulp/steampipe/scripts/china-linux.vdf
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"DepotBuildConfig"
|
||||||
|
{
|
||||||
|
"DepotID" "1318695"
|
||||||
|
"contentroot" "C:\work\shapez.io\tmp_standalone_files_china\shapez.io-standalonechina-linux-x64"
|
||||||
|
"FileMapping"
|
||||||
|
{
|
||||||
|
"LocalPath" "*"
|
||||||
|
"DepotPath" "."
|
||||||
|
"recursive" "1"
|
||||||
|
}
|
||||||
|
"FileExclusion" "*.pdb"
|
||||||
|
}
|
12
gulp/steampipe/scripts/china-windows.vdf
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"DepotBuildConfig"
|
||||||
|
{
|
||||||
|
"DepotID" "1318694"
|
||||||
|
"contentroot" "C:\work\shapez.io\tmp_standalone_files_china\shapez.io-standalonechina-win32-x64"
|
||||||
|
"FileMapping"
|
||||||
|
{
|
||||||
|
"LocalPath" "*"
|
||||||
|
"DepotPath" "."
|
||||||
|
"recursive" "1"
|
||||||
|
}
|
||||||
|
"FileExclusion" "*.pdb"
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
"DepotBuildConfig"
|
"DepotBuildConfig"
|
||||||
{
|
{
|
||||||
"DepotID" "1318692"
|
"DepotID" "1318692"
|
||||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64"
|
"contentroot" "C:\work\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64"
|
||||||
"FileMapping"
|
"FileMapping"
|
||||||
{
|
{
|
||||||
"LocalPath" "*"
|
"LocalPath" "*"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"DepotBuildConfig"
|
"DepotBuildConfig"
|
||||||
{
|
{
|
||||||
"DepotID" "1318691"
|
"DepotID" "1318691"
|
||||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64"
|
"contentroot" "C:\work\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64"
|
||||||
"FileMapping"
|
"FileMapping"
|
||||||
{
|
{
|
||||||
"LocalPath" "*"
|
"LocalPath" "*"
|
||||||
|
@ -25,6 +25,7 @@ function gulptasksTranslations($, gulp) {
|
|||||||
files
|
files
|
||||||
.filter(name => name.endsWith(".yaml"))
|
.filter(name => name.endsWith(".yaml"))
|
||||||
.forEach(fname => {
|
.forEach(fname => {
|
||||||
|
console.log("Loading", fname);
|
||||||
const languageName = fname.replace(".yaml", "");
|
const languageName = fname.replace(".yaml", "");
|
||||||
const abspath = path.join(translationsSourceDir, fname);
|
const abspath = path.join(translationsSourceDir, fname);
|
||||||
|
|
||||||
@ -40,39 +41,13 @@ function gulptasksTranslations($, gulp) {
|
|||||||
|
|
||||||
${storePage.intro.replace(/\n/gi, "\n\n")}
|
${storePage.intro.replace(/\n/gi, "\n\n")}
|
||||||
|
|
||||||
[h2]${storePage.title_advantages}[/h2]
|
[h2]${storePage.what_others_say}[/h2]
|
||||||
|
|
||||||
[list]
|
[list]
|
||||||
${storePage.advantages
|
[*] [i]${storePage.nothernlion_comment}[/i] [b]- Northernlion, YouTube[/b]
|
||||||
.map(x => "[*] " + x.replace(/<b>/, "[b]").replace(/<\/b>/, "[/b]"))
|
[*] [i]${storePage.notch_comment}[/i] [b]- Notch[/b]
|
||||||
.join("\n")}
|
[*] [i]${storePage.steam_review_comment}[/i] [b]- Steam User[/b]
|
||||||
[/list]
|
[/list]
|
||||||
|
|
||||||
[h2]${storePage.title_future}[/h2]
|
|
||||||
|
|
||||||
[list]
|
|
||||||
${storePage.planned
|
|
||||||
.map(x => "[*] " + x.replace(/<b>/, "[b]").replace(/<\/b>/, "[/b]"))
|
|
||||||
.join("\n")}
|
|
||||||
[/list]
|
|
||||||
|
|
||||||
[h2]${storePage.title_open_source}[/h2]
|
|
||||||
|
|
||||||
${storePage.text_open_source.replace(/\n/gi, "\n\n")}
|
|
||||||
|
|
||||||
[h2]${storePage.title_links}[/h2]
|
|
||||||
|
|
||||||
[list]
|
|
||||||
[*] [url=https://discord.com/invite/HN7EVzV]${storePage.links.discord}[/url]
|
|
||||||
[*] [url=https://trello.com/b/ISQncpJP/shapezio]${storePage.links.roadmap}[/url]
|
|
||||||
[*] [url=https://www.reddit.com/r/shapezio]${storePage.links.subreddit}[/url]
|
|
||||||
[*] [url=https://github.com/tobspr/shapez.io]${storePage.links.source_code}[/url]
|
|
||||||
[*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]${
|
|
||||||
storePage.links.translate
|
|
||||||
}[/url]
|
|
||||||
[/list]
|
|
||||||
|
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
fs.writeFileSync(destpath, trim(content.replace(/(\n[ \t\r]*)/gi, "\n")), {
|
fs.writeFileSync(destpath, trim(content.replace(/(\n[ \t\r]*)/gi, "\n")), {
|
||||||
|
@ -6,7 +6,7 @@ const { getRevision, getVersion, getAllResourceImages } = require("./buildutils"
|
|||||||
const lzString = require("lz-string");
|
const lzString = require("lz-string");
|
||||||
const CircularDependencyPlugin = require("circular-dependency-plugin");
|
const CircularDependencyPlugin = require("circular-dependency-plugin");
|
||||||
|
|
||||||
module.exports = ({ watch = false, standalone = false }) => {
|
module.exports = ({ watch = false, standalone = false, chineseVersion = false }) => {
|
||||||
return {
|
return {
|
||||||
mode: "development",
|
mode: "development",
|
||||||
devtool: "cheap-source-map",
|
devtool: "cheap-source-map",
|
||||||
@ -34,6 +34,7 @@ module.exports = ({ watch = false, standalone = false }) => {
|
|||||||
G_TRACKING_ENDPOINT: JSON.stringify(
|
G_TRACKING_ENDPOINT: JSON.stringify(
|
||||||
lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
|
lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
|
||||||
),
|
),
|
||||||
|
G_CHINA_VERSION: JSON.stringify(chineseVersion),
|
||||||
G_IS_DEV: "true",
|
G_IS_DEV: "true",
|
||||||
G_IS_RELEASE: "false",
|
G_IS_RELEASE: "false",
|
||||||
G_IS_MOBILE_APP: "false",
|
G_IS_MOBILE_APP: "false",
|
||||||
|
@ -16,12 +16,15 @@ module.exports = ({
|
|||||||
standalone = false,
|
standalone = false,
|
||||||
isBrowser = true,
|
isBrowser = true,
|
||||||
mobileApp = false,
|
mobileApp = false,
|
||||||
|
chineseVersion = false,
|
||||||
}) => {
|
}) => {
|
||||||
const globalDefs = {
|
const globalDefs = {
|
||||||
assert: enableAssert ? "window.assert" : "false && window.assert",
|
assert: enableAssert ? "window.assert" : "false && window.assert",
|
||||||
assertAlways: "window.assert",
|
assertAlways: "window.assert",
|
||||||
abstract: "window.assert(false, 'abstract method called');",
|
abstract: "window.assert(false, 'abstract method called');",
|
||||||
G_IS_DEV: "false",
|
G_IS_DEV: "false",
|
||||||
|
|
||||||
|
G_CHINA_VERSION: JSON.stringify(chineseVersion),
|
||||||
G_IS_RELEASE: environment === "prod" ? "true" : "false",
|
G_IS_RELEASE: environment === "prod" ? "true" : "false",
|
||||||
G_IS_STANDALONE: standalone ? "true" : "false",
|
G_IS_STANDALONE: standalone ? "true" : "false",
|
||||||
G_IS_BROWSER: isBrowser ? "true" : "false",
|
G_IS_BROWSER: isBrowser ? "true" : "false",
|
||||||
|
26966
gulp/yarn.lock
@ -8,6 +8,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "cd gulp && yarn gulp main.serveDev",
|
"dev": "cd gulp && yarn gulp main.serveDev",
|
||||||
|
"devStandalone": "cd gulp && yarn gulp main.serveStandalone",
|
||||||
"tslint": "cd src/js && tsc",
|
"tslint": "cd src/js && tsc",
|
||||||
"lint": "eslint src/js",
|
"lint": "eslint src/js",
|
||||||
"prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*",
|
"prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*",
|
||||||
|
BIN
res/logo_cn.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
res/ui/changelog_skins/achievements.noinline.png
Normal file
After Width: | Height: | Size: 479 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 24 KiB |
BIN
res/ui/icons/advantage_achievements.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
38
res/ui/languages/fi.svg
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||||
|
<rect style="fill:#F5F5F5;" width="512" height="512"/>
|
||||||
|
<polygon style="fill:#41479B;" points="512,229.517 211.862,229.517 211.862,0 158.897,0 158.897,229.517 0,229.517 0,282.483
|
||||||
|
158.897,282.483 158.897,512 211.862,512 211.862,282.483 512,282.483 "/>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 786 B |
38
res/ui/languages/ro.svg
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||||
|
<rect style="fill:#41479B;" width="170.67" height="512"/>
|
||||||
|
<rect x="170.67" style="fill:#FFE15A;" width="170.67" height="512"/>
|
||||||
|
<rect x="341.33" style="fill:#FF4B55;" width="170.67" height="512"/>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 730 B |
BIN
res/ui/main_menu/opensea.png
Normal file
After Width: | Height: | Size: 12 KiB |
@ -1,13 +1,19 @@
|
|||||||
@include MakeAnimationWrappedEvenOdd(0.2s ease-in-out, "changeAnim") {
|
@each $animName in ("changeAnimEven", "changeAnimOdd") {
|
||||||
0% {
|
@keyframes #{$animName} {
|
||||||
transform: scale(1, 1);
|
0% {
|
||||||
|
transform: scale(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
transform: scale(1.03, 1.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: scale(1, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
50% {
|
.#{$animName} {
|
||||||
transform: scale(1.03, 1.03);
|
animation: $animName 0.2s ease-in-out;
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
transform: scale(1, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
18
src/css/changelog_skins.scss
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
[data-changelog-skin="achievements"] {
|
||||||
|
background: #f8f8f8;
|
||||||
|
|
||||||
|
@include DarkThemeOverride {
|
||||||
|
background: rgba(0, 10, 20, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include S(border-radius, 5px);
|
||||||
|
&::before {
|
||||||
|
content: " ";
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
background: uiResource("changelog_skins/achievements.noinline.png") center center / cover no-repeat !important;
|
||||||
|
@include S(height, 80px);
|
||||||
|
@include S(border-radius, 5px);
|
||||||
|
@include S(margin-bottom, 5px);
|
||||||
|
}
|
||||||
|
}
|
@ -165,5 +165,15 @@
|
|||||||
color: #e72d2d;
|
color: #e72d2d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.achievements {
|
||||||
|
& {
|
||||||
|
/* @load-async */
|
||||||
|
background-image: uiResource("res/ui/icons/advantage_achievements.png");
|
||||||
|
}
|
||||||
|
> strong {
|
||||||
|
color: #ffac0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
@import "application_error";
|
@import "application_error";
|
||||||
@import "textual_game_state";
|
@import "textual_game_state";
|
||||||
@import "adinplay";
|
@import "adinplay";
|
||||||
|
@import "changelog_skins";
|
||||||
|
|
||||||
@import "states/preload";
|
@import "states/preload";
|
||||||
@import "states/main_menu";
|
@import "states/main_menu";
|
||||||
@ -56,8 +57,8 @@
|
|||||||
@import "ingame_hud/cat_memes";
|
@import "ingame_hud/cat_memes";
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
$elements:
|
$elements:
|
||||||
// Base
|
// Base
|
||||||
ingame_Canvas,
|
ingame_Canvas,
|
||||||
ingame_VignetteOverlay,
|
ingame_VignetteOverlay,
|
||||||
|
|
||||||
@ -119,11 +120,3 @@ body.uiHidden {
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body.modalDialogActive,
|
|
||||||
body.externalAdOpen,
|
|
||||||
body.ingameDialogOpen {
|
|
||||||
> *:not(.ingameDialog):not(.modalDialogParent):not(.loadingDialog):not(.gameLoadingOverlay):not(#ingame_HUD_ModalDialogs):not(.noBlur) {
|
|
||||||
// filter: blur(5px) !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -67,7 +67,7 @@ $icons: notification_saved, notification_success, notification_upgrade;
|
|||||||
}
|
}
|
||||||
|
|
||||||
$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi,
|
$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi,
|
||||||
th, hu, pl, ja, kor, no, pt-PT;
|
th, hu, pl, ja, kor, no, pt-PT, fi, ro;
|
||||||
|
|
||||||
@each $language in $languages {
|
@each $language in $languages {
|
||||||
[data-languageicon="#{$language}"] {
|
[data-languageicon="#{$language}"] {
|
||||||
|
@ -43,9 +43,10 @@
|
|||||||
.languageChoose {
|
.languageChoose {
|
||||||
@include S(border-radius, 8px);
|
@include S(border-radius, 8px);
|
||||||
border: solid #222428;
|
border: solid #222428;
|
||||||
background-color: #fff;
|
|
||||||
@include S(border-width, 2px);
|
@include S(border-width, 2px);
|
||||||
background-size: cover;
|
background-color: #222428 !important;
|
||||||
|
background-size: contain !important;
|
||||||
|
background-position: center center !important;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -145,12 +146,10 @@
|
|||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
transition: all 0.12s ease-in;
|
transition: all 0.12s ease-in;
|
||||||
transition-property: opacity, transform;
|
transition-property: opacity, transform;
|
||||||
transform: skewX(-0.5deg);
|
|
||||||
|
|
||||||
@include S(border-radius, $globalBorderRadius);
|
@include S(border-radius, $globalBorderRadius);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
transform: scale(1.02);
|
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -184,7 +183,7 @@
|
|||||||
.updateLabel {
|
.updateLabel {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
transform: translateX(50%) rotate(-5deg);
|
transform: translateX(50%) rotate(-5deg);
|
||||||
color: rgb(231, 78, 58);
|
color: #3291e9;
|
||||||
@include Heading;
|
@include Heading;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@include S(right, 40px);
|
@include S(right, 40px);
|
||||||
@ -451,6 +450,10 @@
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@include S(grid-gap, 4px);
|
@include S(grid-gap, 4px);
|
||||||
|
|
||||||
|
&.china {
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
.author {
|
.author {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: #eef1f4;
|
background: #eef1f4;
|
||||||
|
@include S(border-radius, 3px);
|
||||||
|
|
||||||
@include DarkThemeOverride {
|
@include DarkThemeOverride {
|
||||||
background: #424242;
|
background: #424242;
|
||||||
|
@ -12,6 +12,7 @@ import { getPlatformName, waitNextFrame } from "./core/utils";
|
|||||||
import { Vector } from "./core/vector";
|
import { Vector } from "./core/vector";
|
||||||
import { AdProviderInterface } from "./platform/ad_provider";
|
import { AdProviderInterface } from "./platform/ad_provider";
|
||||||
import { NoAdProvider } from "./platform/ad_providers/no_ad_provider";
|
import { NoAdProvider } from "./platform/ad_providers/no_ad_provider";
|
||||||
|
import { NoAchievementProvider } from "./platform/browser/no_achievement_provider";
|
||||||
import { AnalyticsInterface } from "./platform/analytics";
|
import { AnalyticsInterface } from "./platform/analytics";
|
||||||
import { GoogleAnalyticsImpl } from "./platform/browser/google_analytics";
|
import { GoogleAnalyticsImpl } from "./platform/browser/google_analytics";
|
||||||
import { SoundImplBrowser } from "./platform/browser/sound";
|
import { SoundImplBrowser } from "./platform/browser/sound";
|
||||||
@ -32,6 +33,7 @@ import { ShapezGameAnalytics } from "./platform/browser/game_analytics";
|
|||||||
import { RestrictionManager } from "./core/restriction_manager";
|
import { RestrictionManager } from "./core/restriction_manager";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @typedef {import("./platform/achievement_provider").AchievementProviderInterface} AchievementProviderInterface
|
||||||
* @typedef {import("./platform/game_analytics").GameAnalyticsInterface} GameAnalyticsInterface
|
* @typedef {import("./platform/game_analytics").GameAnalyticsInterface} GameAnalyticsInterface
|
||||||
* @typedef {import("./platform/sound").SoundInterface} SoundInterface
|
* @typedef {import("./platform/sound").SoundInterface} SoundInterface
|
||||||
* @typedef {import("./platform/storage").StorageInterface} StorageInterface
|
* @typedef {import("./platform/storage").StorageInterface} StorageInterface
|
||||||
@ -85,6 +87,9 @@ export class Application {
|
|||||||
/** @type {PlatformWrapperInterface} */
|
/** @type {PlatformWrapperInterface} */
|
||||||
this.platformWrapper = null;
|
this.platformWrapper = null;
|
||||||
|
|
||||||
|
/** @type {AchievementProviderInterface} */
|
||||||
|
this.achievementProvider = null;
|
||||||
|
|
||||||
/** @type {AdProviderInterface} */
|
/** @type {AdProviderInterface} */
|
||||||
this.adProvider = null;
|
this.adProvider = null;
|
||||||
|
|
||||||
@ -137,6 +142,7 @@ export class Application {
|
|||||||
this.sound = new SoundImplBrowser(this);
|
this.sound = new SoundImplBrowser(this);
|
||||||
this.analytics = new GoogleAnalyticsImpl(this);
|
this.analytics = new GoogleAnalyticsImpl(this);
|
||||||
this.gameAnalytics = new ShapezGameAnalytics(this);
|
this.gameAnalytics = new ShapezGameAnalytics(this);
|
||||||
|
this.achievementProvider = new NoAchievementProvider(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,10 +1,22 @@
|
|||||||
export const CHANGELOG = [
|
export const CHANGELOG = [
|
||||||
{
|
{
|
||||||
version: "1.2.3",
|
version: "1.3.1",
|
||||||
date: "unreleased",
|
date: "beta",
|
||||||
entries: [
|
entries: [
|
||||||
|
"Fixed savegames getting corrupt in rare conditions",
|
||||||
|
"Fixed game crashing sometimes since the achievements update",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "1.3.0",
|
||||||
|
date: "12.03.2020",
|
||||||
|
skin: "achievements",
|
||||||
|
entries: [
|
||||||
|
"There are now <strong>45 Steam Achievements!</strong>",
|
||||||
"Fixed constant signals being editable from the regular layer",
|
"Fixed constant signals being editable from the regular layer",
|
||||||
"Fixed items still overlapping sometimes between buildings and belts",
|
"Fixed items still overlapping sometimes between buildings and belts",
|
||||||
|
"The game is now available in finnish, italian, romanian and ukrainian! (Thanks to all contributors!)",
|
||||||
|
"Updated translations (Thanks to all contributors!)",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ import { cachebust } from "./cachebust";
|
|||||||
const logger = createLogger("background_loader");
|
const logger = createLogger("background_loader");
|
||||||
|
|
||||||
const essentialMainMenuSprites = [
|
const essentialMainMenuSprites = [
|
||||||
"logo.png",
|
G_CHINA_VERSION ? "logo_cn.png" : "logo.png",
|
||||||
...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0),
|
...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0),
|
||||||
];
|
];
|
||||||
const essentialMainMenuSounds = [
|
const essentialMainMenuSounds = [
|
||||||
|
@ -40,6 +40,9 @@ export const globalConfig = {
|
|||||||
assetsSharpness: 1.5,
|
assetsSharpness: 1.5,
|
||||||
shapesSharpness: 1.4,
|
shapesSharpness: 1.4,
|
||||||
|
|
||||||
|
// Achievements
|
||||||
|
achievementSliceDuration: 10, // Seconds
|
||||||
|
|
||||||
// Production analytics
|
// Production analytics
|
||||||
statisticsGraphDpi: 2.5,
|
statisticsGraphDpi: 2.5,
|
||||||
statisticsGraphSlices: 100,
|
statisticsGraphSlices: 100,
|
||||||
|
@ -59,6 +59,9 @@ export default {
|
|||||||
// Enables ads in the local build (normally they are deactivated there)
|
// Enables ads in the local build (normally they are deactivated there)
|
||||||
// testAds: true,
|
// testAds: true,
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
|
// Allows unlocked achievements to be logged to console in the local build
|
||||||
|
// testAchievements: true,
|
||||||
|
// -----------------------------------------------------------------------------------
|
||||||
// Disables the automatic switch to an overview when zooming out
|
// Disables the automatic switch to an overview when zooming out
|
||||||
// disableMapOverview: true,
|
// disableMapOverview: true,
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
148
src/js/game/achievement_proxy.js
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
/* typehints:start */
|
||||||
|
import { Entity } from "./entity";
|
||||||
|
import { GameRoot } from "./root";
|
||||||
|
/* typehints:end */
|
||||||
|
|
||||||
|
import { globalConfig } from "../core/config";
|
||||||
|
import { createLogger } from "../core/logging";
|
||||||
|
import { ACHIEVEMENTS } from "../platform/achievement_provider";
|
||||||
|
import { getBuildingDataFromCode } from "./building_codes";
|
||||||
|
|
||||||
|
const logger = createLogger("achievement_proxy");
|
||||||
|
|
||||||
|
const ROTATER = "rotater";
|
||||||
|
const DEFAULT = "default";
|
||||||
|
|
||||||
|
export class AchievementProxy {
|
||||||
|
/** @param {GameRoot} root */
|
||||||
|
constructor(root) {
|
||||||
|
this.root = root;
|
||||||
|
this.provider = this.root.app.achievementProvider;
|
||||||
|
this.disabled = true;
|
||||||
|
|
||||||
|
if (G_IS_DEV && globalConfig.debug.testAchievements) {
|
||||||
|
// still enable the proxy
|
||||||
|
} else if (!this.provider.hasAchievements()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sliceTime = 0;
|
||||||
|
|
||||||
|
this.root.signals.postLoadHook.add(this.onLoad, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoad() {
|
||||||
|
this.provider
|
||||||
|
.onLoad(this.root)
|
||||||
|
.then(() => {
|
||||||
|
this.disabled = false;
|
||||||
|
logger.log("Recieving achievement signals");
|
||||||
|
this.initialize();
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
this.disabled = true;
|
||||||
|
logger.error("Ignoring achievement signals", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize() {
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.darkMode, null);
|
||||||
|
|
||||||
|
if (this.has(ACHIEVEMENTS.mam)) {
|
||||||
|
this.root.signals.entityAdded.add(this.onMamFailure, this);
|
||||||
|
this.root.signals.entityDestroyed.add(this.onMamFailure, this);
|
||||||
|
this.root.signals.storyGoalCompleted.add(this.onStoryGoalCompleted, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.has(ACHIEVEMENTS.noInverseRotater)) {
|
||||||
|
this.root.signals.entityAdded.add(this.onEntityAdded, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.startSlice();
|
||||||
|
}
|
||||||
|
|
||||||
|
startSlice() {
|
||||||
|
this.sliceTime = this.root.time.now();
|
||||||
|
|
||||||
|
this.root.signals.bulkAchievementCheck.dispatch(
|
||||||
|
ACHIEVEMENTS.storeShape,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputBp25,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputBp50,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputLogo25,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputLogo50,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputRocket10,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.throughputRocket20,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.play1h,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.play10h,
|
||||||
|
this.sliceTime,
|
||||||
|
ACHIEVEMENTS.play20h,
|
||||||
|
this.sliceTime
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
if (this.disabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.root.time.now() - this.sliceTime > globalConfig.achievementSliceDuration) {
|
||||||
|
this.startSlice();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} key
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
has(key) {
|
||||||
|
if (!this.provider.collection) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this.provider.collection.map.has(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Entity} entity */
|
||||||
|
onEntityAdded(entity) {
|
||||||
|
if (!entity.components.StaticMapEntity) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const building = getBuildingDataFromCode(entity.components.StaticMapEntity.code);
|
||||||
|
|
||||||
|
if (building.metaInstance.id !== ROTATER) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (building.variant === DEFAULT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.root.savegame.currentData.stats.usedInverseRotater = true;
|
||||||
|
this.root.signals.entityAdded.remove(this.onEntityAdded);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} level */
|
||||||
|
onStoryGoalCompleted(level) {
|
||||||
|
if (level > 26) {
|
||||||
|
this.root.signals.entityAdded.add(this.onMamFailure, this);
|
||||||
|
this.root.signals.entityDestroyed.add(this.onMamFailure, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.mam, null);
|
||||||
|
|
||||||
|
// reset on every level
|
||||||
|
this.root.savegame.currentData.stats.failedMam = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMamFailure() {
|
||||||
|
this.root.savegame.currentData.stats.failedMam = true;
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ import { DrawParameters } from "../core/draw_parameters";
|
|||||||
import { findNiceIntegerValue } from "../core/utils";
|
import { findNiceIntegerValue } from "../core/utils";
|
||||||
import { Vector } from "../core/vector";
|
import { Vector } from "../core/vector";
|
||||||
import { Entity } from "./entity";
|
import { Entity } from "./entity";
|
||||||
|
import { ACHIEVEMENTS } from "../platform/achievement_provider";
|
||||||
import { GameRoot } from "./root";
|
import { GameRoot } from "./root";
|
||||||
|
|
||||||
export class Blueprint {
|
export class Blueprint {
|
||||||
@ -148,7 +149,7 @@ export class Blueprint {
|
|||||||
*/
|
*/
|
||||||
tryPlace(root, tile) {
|
tryPlace(root, tile) {
|
||||||
return root.logic.performBulkOperation(() => {
|
return root.logic.performBulkOperation(() => {
|
||||||
let anyPlaced = false;
|
let count = 0;
|
||||||
for (let i = 0; i < this.entities.length; ++i) {
|
for (let i = 0; i < this.entities.length; ++i) {
|
||||||
const entity = this.entities[i];
|
const entity = this.entities[i];
|
||||||
if (!root.logic.checkCanPlaceEntity(entity, tile)) {
|
if (!root.logic.checkCanPlaceEntity(entity, tile)) {
|
||||||
@ -160,9 +161,17 @@ export class Blueprint {
|
|||||||
root.logic.freeEntityAreaBeforeBuild(clone);
|
root.logic.freeEntityAreaBeforeBuild(clone);
|
||||||
root.map.placeStaticEntity(clone);
|
root.map.placeStaticEntity(clone);
|
||||||
root.entityMgr.registerEntity(clone);
|
root.entityMgr.registerEntity(clone);
|
||||||
anyPlaced = true;
|
count++;
|
||||||
}
|
}
|
||||||
return anyPlaced;
|
|
||||||
|
root.signals.bulkAchievementCheck.dispatch(
|
||||||
|
ACHIEVEMENTS.placeBlueprint,
|
||||||
|
count,
|
||||||
|
ACHIEVEMENTS.placeBp1000,
|
||||||
|
count
|
||||||
|
);
|
||||||
|
|
||||||
|
return count !== 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { generateMatrixRotations } from "../../core/utils";
|
import { generateMatrixRotations } from "../../core/utils";
|
||||||
import { enumDirection, Vector } from "../../core/vector";
|
import { enumDirection, Vector } from "../../core/vector";
|
||||||
|
import { ACHIEVEMENTS } from "../../platform/achievement_provider";
|
||||||
import { ItemAcceptorComponent } from "../components/item_acceptor";
|
import { ItemAcceptorComponent } from "../components/item_acceptor";
|
||||||
import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
|
import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
|
||||||
import { Entity } from "../entity";
|
import { Entity } from "../entity";
|
||||||
@ -37,6 +38,25 @@ export class MetaTrashBuilding extends MetaBuilding {
|
|||||||
return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_cutter_and_trash);
|
return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_cutter_and_trash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addAchievementReceiver(entity) {
|
||||||
|
if (!entity.root) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemProcessor = entity.components.ItemProcessor;
|
||||||
|
const tryTakeItem = itemProcessor.tryTakeItem.bind(itemProcessor);
|
||||||
|
|
||||||
|
itemProcessor.tryTakeItem = () => {
|
||||||
|
const taken = tryTakeItem(...arguments);
|
||||||
|
|
||||||
|
if (taken) {
|
||||||
|
entity.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.trash1000, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return taken;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the entity at the given location
|
* Creates the entity at the given location
|
||||||
* @param {Entity} entity
|
* @param {Entity} entity
|
||||||
@ -57,11 +77,14 @@ export class MetaTrashBuilding extends MetaBuilding {
|
|||||||
],
|
],
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
entity.addComponent(
|
entity.addComponent(
|
||||||
new ItemProcessorComponent({
|
new ItemProcessorComponent({
|
||||||
inputsPerCharge: 1,
|
inputsPerCharge: 1,
|
||||||
processorType: enumItemProcessorTypes.trash,
|
processorType: enumItemProcessorTypes.trash,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.addAchievementReceiver(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ import { RegularGameMode } from "./modes/regular";
|
|||||||
import { ProductionAnalytics } from "./production_analytics";
|
import { ProductionAnalytics } from "./production_analytics";
|
||||||
import { GameRoot } from "./root";
|
import { GameRoot } from "./root";
|
||||||
import { ShapeDefinitionManager } from "./shape_definition_manager";
|
import { ShapeDefinitionManager } from "./shape_definition_manager";
|
||||||
|
import { AchievementProxy } from "./achievement_proxy";
|
||||||
import { SoundProxy } from "./sound_proxy";
|
import { SoundProxy } from "./sound_proxy";
|
||||||
import { GameTime } from "./time/game_time";
|
import { GameTime } from "./time/game_time";
|
||||||
|
|
||||||
@ -111,6 +112,7 @@ export class GameCore {
|
|||||||
root.logic = new GameLogic(root);
|
root.logic = new GameLogic(root);
|
||||||
root.hud = new GameHUD(root);
|
root.hud = new GameHUD(root);
|
||||||
root.time = new GameTime(root);
|
root.time = new GameTime(root);
|
||||||
|
root.achievementProxy = new AchievementProxy(root);
|
||||||
root.automaticSave = new AutomaticSave(root);
|
root.automaticSave = new AutomaticSave(root);
|
||||||
root.soundProxy = new SoundProxy(root);
|
root.soundProxy = new SoundProxy(root);
|
||||||
|
|
||||||
@ -149,6 +151,9 @@ export class GameCore {
|
|||||||
|
|
||||||
// Update analytics
|
// Update analytics
|
||||||
root.productionAnalytics.update();
|
root.productionAnalytics.update();
|
||||||
|
|
||||||
|
// Check achievements
|
||||||
|
root.achievementProxy.update();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -274,6 +279,9 @@ export class GameCore {
|
|||||||
|
|
||||||
// Update analytics
|
// Update analytics
|
||||||
root.productionAnalytics.update();
|
root.productionAnalytics.update();
|
||||||
|
|
||||||
|
// Check achievements
|
||||||
|
root.achievementProxy.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update automatic save after everything finished
|
// Update automatic save after everything finished
|
||||||
|
@ -169,7 +169,7 @@ export class HubGoals extends BasicSerializableObject {
|
|||||||
getCurrentGoalDelivered() {
|
getCurrentGoalDelivered() {
|
||||||
if (this.currentGoal.throughputOnly) {
|
if (this.currentGoal.throughputOnly) {
|
||||||
return (
|
return (
|
||||||
this.root.productionAnalytics.getCurrentShapeRate(
|
this.root.productionAnalytics.getCurrentShapeRateRaw(
|
||||||
enumAnalyticsDataSource.delivered,
|
enumAnalyticsDataSource.delivered,
|
||||||
this.currentGoal.definition
|
this.currentGoal.definition
|
||||||
) / globalConfig.analyticsSliceDurationSeconds
|
) / globalConfig.analyticsSliceDurationSeconds
|
||||||
|
@ -216,8 +216,8 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
|
|||||||
const dimensions = metaBuilding.getDimensions(variant);
|
const dimensions = metaBuilding.getDimensions(variant);
|
||||||
const sprite = metaBuilding.getPreviewSprite(0, variant);
|
const sprite = metaBuilding.getPreviewSprite(0, variant);
|
||||||
const spriteWrapper = makeDiv(element, null, ["iconWrap"]);
|
const spriteWrapper = makeDiv(element, null, ["iconWrap"]);
|
||||||
spriteWrapper.setAttribute("data-tile-w", dimensions.x);
|
spriteWrapper.setAttribute("data-tile-w", String(dimensions.x));
|
||||||
spriteWrapper.setAttribute("data-tile-h", dimensions.y);
|
spriteWrapper.setAttribute("data-tile-h", String(dimensions.y));
|
||||||
|
|
||||||
spriteWrapper.innerHTML = sprite.getAsHTML(iconSize * dimensions.x, iconSize * dimensions.y);
|
spriteWrapper.innerHTML = sprite.getAsHTML(iconSize * dimensions.x, iconSize * dimensions.y);
|
||||||
|
|
||||||
|
@ -110,6 +110,12 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
|
|||||||
// KEYBINDINGS
|
// KEYBINDINGS
|
||||||
const keyActionMapper = this.root.keyMapper;
|
const keyActionMapper = this.root.keyMapper;
|
||||||
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.tryRotate, this);
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.tryRotate, this);
|
||||||
|
|
||||||
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateToUp).add(this.trySetRotate, this);
|
||||||
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateToDown).add(this.trySetRotate, this);
|
||||||
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateToRight).add(this.trySetRotate, this);
|
||||||
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateToLeft).add(this.trySetRotate, this);
|
||||||
|
|
||||||
keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this);
|
keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this);
|
||||||
keyActionMapper
|
keyActionMapper
|
||||||
.getBinding(KEYMAPPINGS.placement.switchDirectionLockSide)
|
.getBinding(KEYMAPPINGS.placement.switchDirectionLockSide)
|
||||||
@ -290,6 +296,28 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
|
|||||||
staticComp.rotation = this.currentBaseRotation;
|
staticComp.rotation = this.currentBaseRotation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rotates the current building to the specified direction.
|
||||||
|
*/
|
||||||
|
trySetRotate() {
|
||||||
|
const selectedBuilding = this.currentMetaBuilding.get();
|
||||||
|
if (selectedBuilding) {
|
||||||
|
if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateToUp).pressed) {
|
||||||
|
this.currentBaseRotation = 0;
|
||||||
|
} else if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateToDown).pressed) {
|
||||||
|
this.currentBaseRotation = 180;
|
||||||
|
} else if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateToRight).pressed) {
|
||||||
|
this.currentBaseRotation = 90;
|
||||||
|
} else if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateToLeft).pressed) {
|
||||||
|
this.currentBaseRotation = 270;
|
||||||
|
}
|
||||||
|
|
||||||
|
const staticComp = this.fakeEntity.components.StaticMapEntity;
|
||||||
|
staticComp.rotation = this.currentBaseRotation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tries to delete the building under the mouse
|
* Tries to delete the building under the mouse
|
||||||
*/
|
*/
|
||||||
|
@ -8,6 +8,7 @@ import { globalConfig } from "../../../core/config";
|
|||||||
import { makeDiv, formatBigNumber, formatBigNumberFull } from "../../../core/utils";
|
import { makeDiv, formatBigNumber, formatBigNumberFull } from "../../../core/utils";
|
||||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||||
import { createLogger } from "../../../core/logging";
|
import { createLogger } from "../../../core/logging";
|
||||||
|
import { ACHIEVEMENTS } from "../../../platform/achievement_provider";
|
||||||
import { enumMouseButton } from "../../camera";
|
import { enumMouseButton } from "../../camera";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import { KEYMAPPINGS } from "../../key_action_mapper";
|
import { KEYMAPPINGS } from "../../key_action_mapper";
|
||||||
@ -100,6 +101,7 @@ export class HUDMassSelector extends BaseHUDPart {
|
|||||||
*/
|
*/
|
||||||
const mapUidToEntity = this.root.entityMgr.getFrozenUidSearchMap();
|
const mapUidToEntity = this.root.entityMgr.getFrozenUidSearchMap();
|
||||||
|
|
||||||
|
let count = 0;
|
||||||
this.root.logic.performBulkOperation(() => {
|
this.root.logic.performBulkOperation(() => {
|
||||||
for (let i = 0; i < entityUids.length; ++i) {
|
for (let i = 0; i < entityUids.length; ++i) {
|
||||||
const uid = entityUids[i];
|
const uid = entityUids[i];
|
||||||
@ -111,8 +113,12 @@ export class HUDMassSelector extends BaseHUDPart {
|
|||||||
|
|
||||||
if (!this.root.logic.tryDeleteBuilding(entity)) {
|
if (!this.root.logic.tryDeleteBuilding(entity)) {
|
||||||
logger.error("Error in mass delete, could not remove building");
|
logger.error("Error in mass delete, could not remove building");
|
||||||
|
} else {
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.destroy1000, count);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Clear uids later
|
// Clear uids later
|
||||||
|
@ -273,7 +273,7 @@ export class HUDPinnedShapes extends BaseHUDPart {
|
|||||||
|
|
||||||
if (handle.throughputOnly) {
|
if (handle.throughputOnly) {
|
||||||
currentValue =
|
currentValue =
|
||||||
this.root.productionAnalytics.getCurrentShapeRate(
|
this.root.productionAnalytics.getCurrentShapeRateRaw(
|
||||||
enumAnalyticsDataSource.delivered,
|
enumAnalyticsDataSource.delivered,
|
||||||
handle.definition
|
handle.definition
|
||||||
) / globalConfig.analyticsSliceDurationSeconds;
|
) / globalConfig.analyticsSliceDurationSeconds;
|
||||||
|
@ -5,7 +5,7 @@ import { T } from "../../../translations";
|
|||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||||
|
|
||||||
const showIntervalSeconds = 30 * 60;
|
const showIntervalSeconds = 9 * 60;
|
||||||
|
|
||||||
export class HUDStandaloneAdvantages extends BaseHUDPart {
|
export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||||
createElements(parent) {
|
createElements(parent) {
|
||||||
@ -25,7 +25,7 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
|||||||
([key, trans]) => `
|
([key, trans]) => `
|
||||||
<div class="point ${key}">
|
<div class="point ${key}">
|
||||||
<strong>${trans.title}</strong>
|
<strong>${trans.title}</strong>
|
||||||
<p>${trans.desc}</p>
|
<p>${trans.desc}</p>
|
||||||
</div>`
|
</div>`
|
||||||
)
|
)
|
||||||
.join("")}
|
.join("")}
|
||||||
@ -60,7 +60,7 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
|||||||
this.inputReciever = new InputReceiver("standalone-advantages");
|
this.inputReciever = new InputReceiver("standalone-advantages");
|
||||||
this.close();
|
this.close();
|
||||||
|
|
||||||
this.lastShown = this.root.gameIsFresh ? this.root.time.now() : 0;
|
this.lastShown = -1e10;
|
||||||
}
|
}
|
||||||
|
|
||||||
show() {
|
show() {
|
||||||
|
@ -209,7 +209,9 @@ export class HUDStatistics extends BaseHUDPart {
|
|||||||
}
|
}
|
||||||
case enumAnalyticsDataSource.produced:
|
case enumAnalyticsDataSource.produced:
|
||||||
case enumAnalyticsDataSource.delivered: {
|
case enumAnalyticsDataSource.delivered: {
|
||||||
entries = Object.entries(this.root.productionAnalytics.getCurrentShapeRates(this.dataSource));
|
entries = Object.entries(
|
||||||
|
this.root.productionAnalytics.getCurrentShapeRatesRaw(this.dataSource)
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ export class HUDShapeStatisticsHandle {
|
|||||||
case enumAnalyticsDataSource.delivered:
|
case enumAnalyticsDataSource.delivered:
|
||||||
case enumAnalyticsDataSource.produced: {
|
case enumAnalyticsDataSource.produced: {
|
||||||
let rate =
|
let rate =
|
||||||
this.root.productionAnalytics.getCurrentShapeRate(dataSource, this.definition) /
|
this.root.productionAnalytics.getCurrentShapeRateRaw(dataSource, this.definition) /
|
||||||
globalConfig.analyticsSliceDurationSeconds;
|
globalConfig.analyticsSliceDurationSeconds;
|
||||||
|
|
||||||
this.counter.innerText = T.ingame.statistics.shapesDisplayUnits[unit].replace(
|
this.counter.innerText = T.ingame.statistics.shapesDisplayUnits[unit].replace(
|
||||||
|
@ -15,6 +15,7 @@ import {
|
|||||||
removeAllChildren,
|
removeAllChildren,
|
||||||
} from "../../../core/utils";
|
} from "../../../core/utils";
|
||||||
import { Vector } from "../../../core/vector";
|
import { Vector } from "../../../core/vector";
|
||||||
|
import { ACHIEVEMENTS } from "../../../platform/achievement_provider";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import { BaseItem } from "../../base_item";
|
import { BaseItem } from "../../base_item";
|
||||||
import { MetaHubBuilding } from "../../buildings/hub";
|
import { MetaHubBuilding } from "../../buildings/hub";
|
||||||
@ -349,6 +350,10 @@ export class HUDWaypoints extends BaseHUDPart {
|
|||||||
T.ingame.waypoints.creationSuccessNotification,
|
T.ingame.waypoints.creationSuccessNotification,
|
||||||
enumNotificationType.success
|
enumNotificationType.success
|
||||||
);
|
);
|
||||||
|
this.root.signals.achievementCheck.dispatch(
|
||||||
|
ACHIEVEMENTS.mapMarkers15,
|
||||||
|
this.waypoints.length - 1 // Disregard HUB
|
||||||
|
);
|
||||||
|
|
||||||
// Re-render the list and thus add it
|
// Re-render the list and thus add it
|
||||||
this.rerenderWaypointList();
|
this.rerenderWaypointList();
|
||||||
|
@ -11,6 +11,11 @@ function key(str) {
|
|||||||
return str.toUpperCase().charCodeAt(0);
|
return str.toUpperCase().charCodeAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const KEYCODE_UP_ARROW = 38;
|
||||||
|
const KEYCODE_DOWN_ARROW = 40;
|
||||||
|
const KEYCODE_LEFT_ARROW = 37;
|
||||||
|
const KEYCODE_RIGHT_ARROW = 39;
|
||||||
|
|
||||||
export const KEYMAPPINGS = {
|
export const KEYMAPPINGS = {
|
||||||
general: {
|
general: {
|
||||||
confirm: { keyCode: 13 }, // enter
|
confirm: { keyCode: 13 }, // enter
|
||||||
@ -81,6 +86,10 @@ export const KEYMAPPINGS = {
|
|||||||
pipette: { keyCode: key("Q") },
|
pipette: { keyCode: key("Q") },
|
||||||
rotateWhilePlacing: { keyCode: key("R") },
|
rotateWhilePlacing: { keyCode: key("R") },
|
||||||
rotateInverseModifier: { keyCode: 16 }, // SHIFT
|
rotateInverseModifier: { keyCode: 16 }, // SHIFT
|
||||||
|
rotateToUp: { keyCode: KEYCODE_UP_ARROW },
|
||||||
|
rotateToDown: { keyCode: KEYCODE_DOWN_ARROW },
|
||||||
|
rotateToRight: { keyCode: KEYCODE_RIGHT_ARROW },
|
||||||
|
rotateToLeft: { keyCode: KEYCODE_LEFT_ARROW },
|
||||||
cycleBuildingVariants: { keyCode: key("T") },
|
cycleBuildingVariants: { keyCode: key("T") },
|
||||||
cycleBuildings: { keyCode: 9 }, // TAB
|
cycleBuildings: { keyCode: 9 }, // TAB
|
||||||
switchDirectionLockSide: { keyCode: key("R") },
|
switchDirectionLockSide: { keyCode: key("R") },
|
||||||
@ -162,13 +171,13 @@ export function getStringForKeyCode(code) {
|
|||||||
return "END";
|
return "END";
|
||||||
case 36:
|
case 36:
|
||||||
return "HOME";
|
return "HOME";
|
||||||
case 37:
|
case KEYCODE_LEFT_ARROW:
|
||||||
return "⬅";
|
return "⬅";
|
||||||
case 38:
|
case KEYCODE_UP_ARROW:
|
||||||
return "⬆";
|
return "⬆";
|
||||||
case 39:
|
case KEYCODE_RIGHT_ARROW:
|
||||||
return "➡";
|
return "➡";
|
||||||
case 40:
|
case KEYCODE_DOWN_ARROW:
|
||||||
return "⬇";
|
return "⬇";
|
||||||
case 44:
|
case 44:
|
||||||
return "PRNT";
|
return "PRNT";
|
||||||
|
@ -83,7 +83,7 @@ export class ProductionAnalytics extends BasicSerializableObject {
|
|||||||
* @param {enumAnalyticsDataSource} dataSource
|
* @param {enumAnalyticsDataSource} dataSource
|
||||||
* @param {ShapeDefinition} definition
|
* @param {ShapeDefinition} definition
|
||||||
*/
|
*/
|
||||||
getCurrentShapeRate(dataSource, definition) {
|
getCurrentShapeRateRaw(dataSource, definition) {
|
||||||
const slices = this.history[dataSource];
|
const slices = this.history[dataSource];
|
||||||
return slices[slices.length - 2][definition.getHash()] || 0;
|
return slices[slices.length - 2][definition.getHash()] || 0;
|
||||||
}
|
}
|
||||||
@ -108,7 +108,7 @@ export class ProductionAnalytics extends BasicSerializableObject {
|
|||||||
* Returns the rates of all shapes
|
* Returns the rates of all shapes
|
||||||
* @param {enumAnalyticsDataSource} dataSource
|
* @param {enumAnalyticsDataSource} dataSource
|
||||||
*/
|
*/
|
||||||
getCurrentShapeRates(dataSource) {
|
getCurrentShapeRatesRaw(dataSource) {
|
||||||
const slices = this.history[dataSource];
|
const slices = this.history[dataSource];
|
||||||
|
|
||||||
// First, copy current slice
|
// First, copy current slice
|
||||||
|
@ -8,6 +8,7 @@ import { createLogger } from "../core/logging";
|
|||||||
import { GameTime } from "./time/game_time";
|
import { GameTime } from "./time/game_time";
|
||||||
import { EntityManager } from "./entity_manager";
|
import { EntityManager } from "./entity_manager";
|
||||||
import { GameSystemManager } from "./game_system_manager";
|
import { GameSystemManager } from "./game_system_manager";
|
||||||
|
import { AchievementProxy } from "./achievement_proxy";
|
||||||
import { GameHUD } from "./hud/hud";
|
import { GameHUD } from "./hud/hud";
|
||||||
import { MapView } from "./map_view";
|
import { MapView } from "./map_view";
|
||||||
import { Camera } from "./camera";
|
import { Camera } from "./camera";
|
||||||
@ -119,6 +120,9 @@ export class GameRoot {
|
|||||||
/** @type {SoundProxy} */
|
/** @type {SoundProxy} */
|
||||||
this.soundProxy = null;
|
this.soundProxy = null;
|
||||||
|
|
||||||
|
/** @type {AchievementProxy} */
|
||||||
|
this.achievementProxy = null;
|
||||||
|
|
||||||
/** @type {ShapeDefinitionManager} */
|
/** @type {ShapeDefinitionManager} */
|
||||||
this.shapeDefinitionMgr = null;
|
this.shapeDefinitionMgr = null;
|
||||||
|
|
||||||
@ -175,6 +179,10 @@ export class GameRoot {
|
|||||||
// Called before actually placing an entity, use to perform additional logic
|
// Called before actually placing an entity, use to perform additional logic
|
||||||
// for freeing space before actually placing.
|
// for freeing space before actually placing.
|
||||||
freeEntityAreaBeforeBuild: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
|
freeEntityAreaBeforeBuild: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
|
||||||
|
|
||||||
|
// Called with an achievement key and necessary args to validate it can be unlocked.
|
||||||
|
achievementCheck: /** @type {TypedSignal<[string, any]>} */ (new Signal()),
|
||||||
|
bulkAchievementCheck: /** @type {TypedSignal<(string|any)[]>} */ (new Signal()),
|
||||||
};
|
};
|
||||||
|
|
||||||
// RNG's
|
// RNG's
|
||||||
|
@ -4,6 +4,7 @@ import { enumColors } from "./colors";
|
|||||||
import { ShapeItem } from "./items/shape_item";
|
import { ShapeItem } from "./items/shape_item";
|
||||||
import { GameRoot } from "./root";
|
import { GameRoot } from "./root";
|
||||||
import { enumSubShape, ShapeDefinition } from "./shape_definition";
|
import { enumSubShape, ShapeDefinition } from "./shape_definition";
|
||||||
|
import { ACHIEVEMENTS } from "../platform/achievement_provider";
|
||||||
|
|
||||||
const logger = createLogger("shape_definition_manager");
|
const logger = createLogger("shape_definition_manager");
|
||||||
|
|
||||||
@ -96,6 +97,8 @@ export class ShapeDefinitionManager extends BasicSerializableObject {
|
|||||||
const rightSide = definition.cloneFilteredByQuadrants([2, 3]);
|
const rightSide = definition.cloneFilteredByQuadrants([2, 3]);
|
||||||
const leftSide = definition.cloneFilteredByQuadrants([0, 1]);
|
const leftSide = definition.cloneFilteredByQuadrants([0, 1]);
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.cutShape, null);
|
||||||
|
|
||||||
return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key] = [
|
return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key] = [
|
||||||
this.registerOrReturnHandle(rightSide),
|
this.registerOrReturnHandle(rightSide),
|
||||||
this.registerOrReturnHandle(leftSide),
|
this.registerOrReturnHandle(leftSide),
|
||||||
@ -137,6 +140,8 @@ export class ShapeDefinitionManager extends BasicSerializableObject {
|
|||||||
|
|
||||||
const rotated = definition.cloneRotateCW();
|
const rotated = definition.cloneRotateCW();
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.rotateShape, null);
|
||||||
|
|
||||||
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
||||||
rotated
|
rotated
|
||||||
));
|
));
|
||||||
@ -189,6 +194,9 @@ export class ShapeDefinitionManager extends BasicSerializableObject {
|
|||||||
if (this.operationCache[key]) {
|
if (this.operationCache[key]) {
|
||||||
return /** @type {ShapeDefinition} */ (this.operationCache[key]);
|
return /** @type {ShapeDefinition} */ (this.operationCache[key]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.stackShape, null);
|
||||||
|
|
||||||
const stacked = lowerDefinition.cloneAndStackWith(upperDefinition);
|
const stacked = lowerDefinition.cloneAndStackWith(upperDefinition);
|
||||||
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
||||||
stacked
|
stacked
|
||||||
@ -206,6 +214,9 @@ export class ShapeDefinitionManager extends BasicSerializableObject {
|
|||||||
if (this.operationCache[key]) {
|
if (this.operationCache[key]) {
|
||||||
return /** @type {ShapeDefinition} */ (this.operationCache[key]);
|
return /** @type {ShapeDefinition} */ (this.operationCache[key]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.paintShape, null);
|
||||||
|
|
||||||
const colorized = definition.cloneAndPaintWith(color);
|
const colorized = definition.cloneAndPaintWith(color);
|
||||||
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
|
||||||
colorized
|
colorized
|
||||||
|
@ -4,6 +4,7 @@ import { createLogger } from "../../core/logging";
|
|||||||
import { Rectangle } from "../../core/rectangle";
|
import { Rectangle } from "../../core/rectangle";
|
||||||
import { StaleAreaDetector } from "../../core/stale_area_detector";
|
import { StaleAreaDetector } from "../../core/stale_area_detector";
|
||||||
import { enumDirection, enumDirectionToVector } from "../../core/vector";
|
import { enumDirection, enumDirectionToVector } from "../../core/vector";
|
||||||
|
import { ACHIEVEMENTS } from "../../platform/achievement_provider";
|
||||||
import { BaseItem } from "../base_item";
|
import { BaseItem } from "../base_item";
|
||||||
import { BeltComponent } from "../components/belt";
|
import { BeltComponent } from "../components/belt";
|
||||||
import { ItemAcceptorComponent } from "../components/item_acceptor";
|
import { ItemAcceptorComponent } from "../components/item_acceptor";
|
||||||
|
@ -13,6 +13,7 @@ import {
|
|||||||
enumInvertedDirections,
|
enumInvertedDirections,
|
||||||
Vector,
|
Vector,
|
||||||
} from "../../core/vector";
|
} from "../../core/vector";
|
||||||
|
import { ACHIEVEMENTS } from "../../platform/achievement_provider";
|
||||||
import { BaseItem } from "../base_item";
|
import { BaseItem } from "../base_item";
|
||||||
import { arrayWireRotationVariantToType, MetaWireBuilding } from "../buildings/wire";
|
import { arrayWireRotationVariantToType, MetaWireBuilding } from "../buildings/wire";
|
||||||
import { getCodeFromBuildingData } from "../building_codes";
|
import { getCodeFromBuildingData } from "../building_codes";
|
||||||
@ -697,6 +698,8 @@ export class WireSystem extends GameSystemWithFilter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.root.signals.achievementCheck.dispatch(ACHIEVEMENTS.place5000Wires, entity);
|
||||||
|
|
||||||
// Invalidate affected area
|
// Invalidate affected area
|
||||||
const originalRect = staticComp.getTileSpaceBounds();
|
const originalRect = staticComp.getTileSpaceBounds();
|
||||||
const affectedArea = originalRect.expandedInAllDirections(1);
|
const affectedArea = originalRect.expandedInAllDirections(1);
|
||||||
|
2
src/js/globals.d.ts
vendored
@ -19,6 +19,8 @@ declare const G_BUILD_VERSION: string;
|
|||||||
declare const G_ALL_UI_IMAGES: Array<string>;
|
declare const G_ALL_UI_IMAGES: Array<string>;
|
||||||
declare const G_IS_RELEASE: boolean;
|
declare const G_IS_RELEASE: boolean;
|
||||||
|
|
||||||
|
declare const G_CHINA_VERSION: boolean;
|
||||||
|
|
||||||
// Polyfills
|
// Polyfills
|
||||||
declare interface String {
|
declare interface String {
|
||||||
replaceAll(search: string, replacement: string): string;
|
replaceAll(search: string, replacement: string): string;
|
||||||
|
@ -8,120 +8,180 @@ export const LANGUAGES = {
|
|||||||
code: "en",
|
code: "en",
|
||||||
region: "",
|
region: "",
|
||||||
},
|
},
|
||||||
"de": {
|
|
||||||
name: "Deutsch",
|
|
||||||
data: require("./built-temp/base-de.json"),
|
|
||||||
code: "de",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"fr": {
|
|
||||||
name: "Français",
|
|
||||||
data: require("./built-temp/base-fr.json"),
|
|
||||||
code: "fr",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"ja": {
|
|
||||||
name: "日本語",
|
|
||||||
data: require("./built-temp/base-ja.json"),
|
|
||||||
code: "ja",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"pt-PT": {
|
|
||||||
name: "Português (Portugal)",
|
|
||||||
data: require("./built-temp/base-pt-PT.json"),
|
|
||||||
code: "pt",
|
|
||||||
region: "PT",
|
|
||||||
},
|
|
||||||
"pt-BR": {
|
|
||||||
name: "Português (Brasil)",
|
|
||||||
data: require("./built-temp/base-pt-BR.json"),
|
|
||||||
code: "pt",
|
|
||||||
region: "BR",
|
|
||||||
},
|
|
||||||
"ru": {
|
|
||||||
name: "Русский",
|
|
||||||
data: require("./built-temp/base-ru.json"),
|
|
||||||
code: "ru",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"cs": {
|
|
||||||
name: "Čeština",
|
|
||||||
data: require("./built-temp/base-cz.json"),
|
|
||||||
code: "cs",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"es-419": {
|
|
||||||
name: "Español",
|
|
||||||
data: require("./built-temp/base-es.json"),
|
|
||||||
code: "es",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"pl": {
|
|
||||||
name: "Polski",
|
|
||||||
data: require("./built-temp/base-pl.json"),
|
|
||||||
code: "pl",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"kor": {
|
|
||||||
name: "한국어",
|
|
||||||
data: require("./built-temp/base-kor.json"),
|
|
||||||
code: "kor",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"nl": {
|
|
||||||
name: "Nederlands",
|
|
||||||
data: require("./built-temp/base-nl.json"),
|
|
||||||
code: "nl",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
"no": {
|
|
||||||
name: "Norsk",
|
|
||||||
data: require("./built-temp/base-no.json"),
|
|
||||||
code: "no",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
|
|
||||||
"tr": {
|
|
||||||
name: "Türkçe",
|
|
||||||
data: require("./built-temp/base-tr.json"),
|
|
||||||
code: "tr",
|
|
||||||
region: "",
|
|
||||||
},
|
|
||||||
|
|
||||||
"zh-CN": {
|
"zh-CN": {
|
||||||
// simplified
|
// simplified chinese
|
||||||
name: "中文简体",
|
name: "简体中文",
|
||||||
data: require("./built-temp/base-zh-CN.json"),
|
data: require("./built-temp/base-zh-CN.json"),
|
||||||
code: "zh",
|
code: "zh",
|
||||||
region: "CN",
|
region: "CN",
|
||||||
},
|
},
|
||||||
|
|
||||||
"zh-TW": {
|
"zh-TW": {
|
||||||
// traditional
|
// traditional chinese
|
||||||
name: "中文繁體",
|
name: "繁體中文",
|
||||||
data: require("./built-temp/base-zh-TW.json"),
|
data: require("./built-temp/base-zh-TW.json"),
|
||||||
code: "zh",
|
code: "zh",
|
||||||
region: "TW",
|
region: "TW",
|
||||||
},
|
},
|
||||||
|
|
||||||
"sv": {
|
"ja": {
|
||||||
name: "Svenska",
|
// japanese
|
||||||
data: require("./built-temp/base-sv.json"),
|
name: "日本語",
|
||||||
code: "sv",
|
data: require("./built-temp/base-ja.json"),
|
||||||
|
code: "ja",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"kor": {
|
||||||
|
// korean
|
||||||
|
name: "한국어",
|
||||||
|
data: require("./built-temp/base-kor.json"),
|
||||||
|
code: "kor",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"cs": {
|
||||||
|
// czech
|
||||||
|
name: "Čeština",
|
||||||
|
data: require("./built-temp/base-cz.json"),
|
||||||
|
code: "cs",
|
||||||
region: "",
|
region: "",
|
||||||
},
|
},
|
||||||
|
|
||||||
"da": {
|
"da": {
|
||||||
|
// danish
|
||||||
name: "Dansk",
|
name: "Dansk",
|
||||||
data: require("./built-temp/base-da.json"),
|
data: require("./built-temp/base-da.json"),
|
||||||
code: "da",
|
code: "da",
|
||||||
region: "",
|
region: "",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"de": {
|
||||||
|
// german
|
||||||
|
name: "Deutsch",
|
||||||
|
data: require("./built-temp/base-de.json"),
|
||||||
|
code: "de",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"es-419": {
|
||||||
|
// spanish
|
||||||
|
name: "Español",
|
||||||
|
data: require("./built-temp/base-es.json"),
|
||||||
|
code: "es",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"fr": {
|
||||||
|
// french
|
||||||
|
name: "Français",
|
||||||
|
data: require("./built-temp/base-fr.json"),
|
||||||
|
code: "fr",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"it": {
|
||||||
|
// italian
|
||||||
|
name: "Italiano",
|
||||||
|
data: require("./built-temp/base-it.json"),
|
||||||
|
code: "it",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
"hu": {
|
"hu": {
|
||||||
|
// hungarian
|
||||||
name: "Magyar",
|
name: "Magyar",
|
||||||
data: require("./built-temp/base-hu.json"),
|
data: require("./built-temp/base-hu.json"),
|
||||||
code: "hu",
|
code: "hu",
|
||||||
region: "",
|
region: "",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"nl": {
|
||||||
|
// dutch
|
||||||
|
name: "Nederlands",
|
||||||
|
data: require("./built-temp/base-nl.json"),
|
||||||
|
code: "nl",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"no": {
|
||||||
|
// norwegian
|
||||||
|
name: "Norsk",
|
||||||
|
data: require("./built-temp/base-no.json"),
|
||||||
|
code: "no",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"pl": {
|
||||||
|
// polish
|
||||||
|
name: "Polski",
|
||||||
|
data: require("./built-temp/base-pl.json"),
|
||||||
|
code: "pl",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"pt-PT": {
|
||||||
|
// portuguese
|
||||||
|
name: "Português",
|
||||||
|
data: require("./built-temp/base-pt-PT.json"),
|
||||||
|
code: "pt",
|
||||||
|
region: "PT",
|
||||||
|
},
|
||||||
|
|
||||||
|
"pt-BR": {
|
||||||
|
// portuguese - brazil
|
||||||
|
name: "Português - Brasil",
|
||||||
|
data: require("./built-temp/base-pt-BR.json"),
|
||||||
|
code: "pt",
|
||||||
|
region: "BR",
|
||||||
|
},
|
||||||
|
|
||||||
|
"ro": {
|
||||||
|
// romanian
|
||||||
|
name: "Română",
|
||||||
|
data: require("./built-temp/base-ro.json"),
|
||||||
|
code: "pt",
|
||||||
|
region: "BR",
|
||||||
|
},
|
||||||
|
|
||||||
|
"ru": {
|
||||||
|
// russian
|
||||||
|
name: "Русский",
|
||||||
|
data: require("./built-temp/base-ru.json"),
|
||||||
|
code: "ru",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"fi": {
|
||||||
|
// finish
|
||||||
|
name: "Suomi",
|
||||||
|
data: require("./built-temp/base-fi.json"),
|
||||||
|
code: "fi",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"sv": {
|
||||||
|
// swedish
|
||||||
|
name: "Svenska",
|
||||||
|
data: require("./built-temp/base-sv.json"),
|
||||||
|
code: "sv",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"tr": {
|
||||||
|
// turkish
|
||||||
|
name: "Türkçe",
|
||||||
|
data: require("./built-temp/base-tr.json"),
|
||||||
|
code: "tr",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
"uk": {
|
||||||
|
// ukrainian
|
||||||
|
name: "Українська",
|
||||||
|
data: require("./built-temp/base-uk.json"),
|
||||||
|
code: "uk",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
642
src/js/platform/achievement_provider.js
Normal file
@ -0,0 +1,642 @@
|
|||||||
|
/* typehints:start */
|
||||||
|
import { Application } from "../application";
|
||||||
|
import { Entity } from "../game/entity";
|
||||||
|
import { GameRoot } from "../game/root";
|
||||||
|
import { THEMES } from "../game/theme";
|
||||||
|
/* typehints:end */
|
||||||
|
|
||||||
|
import { enumAnalyticsDataSource } from "../game/production_analytics";
|
||||||
|
import { ShapeDefinition } from "../game/shape_definition";
|
||||||
|
import { ShapeItem } from "../game/items/shape_item";
|
||||||
|
import { globalConfig } from "../core/config";
|
||||||
|
|
||||||
|
export const ACHIEVEMENTS = {
|
||||||
|
belt500Tiles: "belt500Tiles",
|
||||||
|
blueprint100k: "blueprint100k",
|
||||||
|
blueprint1m: "blueprint1m",
|
||||||
|
completeLvl26: "completeLvl26",
|
||||||
|
cutShape: "cutShape",
|
||||||
|
darkMode: "darkMode",
|
||||||
|
destroy1000: "destroy1000",
|
||||||
|
irrelevantShape: "irrelevantShape",
|
||||||
|
level100: "level100",
|
||||||
|
level50: "level50",
|
||||||
|
logoBefore18: "logoBefore18",
|
||||||
|
mam: "mam",
|
||||||
|
mapMarkers15: "mapMarkers15",
|
||||||
|
noBeltUpgradesUntilBp: "noBeltUpgradesUntilBp",
|
||||||
|
noInverseRotater: "noInverseRotater",
|
||||||
|
oldLevel17: "oldLevel17",
|
||||||
|
openWires: "openWires",
|
||||||
|
paintShape: "paintShape",
|
||||||
|
place5000Wires: "place5000Wires",
|
||||||
|
placeBlueprint: "placeBlueprint",
|
||||||
|
placeBp1000: "placeBp1000",
|
||||||
|
play1h: "play1h",
|
||||||
|
play10h: "play10h",
|
||||||
|
play20h: "play20h",
|
||||||
|
produceLogo: "produceLogo",
|
||||||
|
produceMsLogo: "produceMsLogo",
|
||||||
|
produceRocket: "produceRocket",
|
||||||
|
rotateShape: "rotateShape",
|
||||||
|
speedrunBp30: "speedrunBp30",
|
||||||
|
speedrunBp60: "speedrunBp60",
|
||||||
|
speedrunBp120: "speedrunBp120",
|
||||||
|
stack4Layers: "stack4Layers",
|
||||||
|
stackShape: "stackShape",
|
||||||
|
store100Unique: "store100Unique",
|
||||||
|
storeShape: "storeShape",
|
||||||
|
throughputBp25: "throughputBp25",
|
||||||
|
throughputBp50: "throughputBp50",
|
||||||
|
throughputLogo25: "throughputLogo25",
|
||||||
|
throughputLogo50: "throughputLogo50",
|
||||||
|
throughputRocket10: "throughputRocket10",
|
||||||
|
throughputRocket20: "throughputRocket20",
|
||||||
|
trash1000: "trash1000",
|
||||||
|
unlockWires: "unlockWires",
|
||||||
|
upgradesTier5: "upgradesTier5",
|
||||||
|
upgradesTier8: "upgradesTier8",
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @type {keyof typeof THEMES} */
|
||||||
|
const DARK_MODE = "dark";
|
||||||
|
|
||||||
|
const HOUR_1 = 3600; // Seconds
|
||||||
|
const HOUR_10 = HOUR_1 * 10;
|
||||||
|
const HOUR_20 = HOUR_1 * 20;
|
||||||
|
const ITEM_SHAPE = ShapeItem.getId();
|
||||||
|
const MINUTE_30 = 1800; // Seconds
|
||||||
|
const MINUTE_60 = MINUTE_30 * 2;
|
||||||
|
const MINUTE_120 = MINUTE_30 * 4;
|
||||||
|
const ROTATER_CCW_CODE = 12;
|
||||||
|
const ROTATER_180_CODE = 13;
|
||||||
|
const SHAPE_BP = "CbCbCbRb:CwCwCwCw";
|
||||||
|
const SHAPE_LOGO = "RuCw--Cw:----Ru--";
|
||||||
|
const SHAPE_MS_LOGO = "RgRyRbRr";
|
||||||
|
const SHAPE_OLD_LEVEL_17 = "WrRgWrRg:CwCrCwCr:SgSgSgSg";
|
||||||
|
const SHAPE_ROCKET = "CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw";
|
||||||
|
|
||||||
|
/** @type {Layer} */
|
||||||
|
const WIRE_LAYER = "wires";
|
||||||
|
|
||||||
|
export class AchievementProviderInterface {
|
||||||
|
/* typehints:start */
|
||||||
|
collection = /** @type {AchievementCollection|undefined} */ (null);
|
||||||
|
/* typehints:end */
|
||||||
|
|
||||||
|
/** @param {Application} app */
|
||||||
|
constructor(app) {
|
||||||
|
this.app = app;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the achievement provider.
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
initialize() {
|
||||||
|
abstract;
|
||||||
|
return Promise.reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opportunity to do additional initialization work with the GameRoot.
|
||||||
|
* @param {GameRoot} root
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
onLoad(root) {
|
||||||
|
abstract;
|
||||||
|
return Promise.reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
hasLoaded() {
|
||||||
|
abstract;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call to activate an achievement with the provider
|
||||||
|
* @param {string} key - Maps to an Achievement
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
activate(key) {
|
||||||
|
abstract;
|
||||||
|
return Promise.reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if achievements are supported in the current build
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
hasAchievements() {
|
||||||
|
abstract;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Achievement {
|
||||||
|
/** @param {string} key - An ACHIEVEMENTS key */
|
||||||
|
constructor(key) {
|
||||||
|
this.key = key;
|
||||||
|
this.activate = null;
|
||||||
|
this.activatePromise = null;
|
||||||
|
this.receiver = null;
|
||||||
|
this.signal = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {}
|
||||||
|
|
||||||
|
isValid() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock() {
|
||||||
|
if (!this.activatePromise) {
|
||||||
|
this.activatePromise = this.activate(this.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.activatePromise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AchievementCollection {
|
||||||
|
/**
|
||||||
|
* @param {function} activate - Resolves when provider activation is complete
|
||||||
|
*/
|
||||||
|
constructor(activate) {
|
||||||
|
this.map = new Map();
|
||||||
|
this.activate = activate;
|
||||||
|
|
||||||
|
this.add(ACHIEVEMENTS.belt500Tiles, {
|
||||||
|
isValid: this.isBelt500TilesValid,
|
||||||
|
signal: "entityAdded",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.blueprint100k, this.createBlueprintOptions(100000));
|
||||||
|
this.add(ACHIEVEMENTS.blueprint1m, this.createBlueprintOptions(1000000));
|
||||||
|
this.add(ACHIEVEMENTS.completeLvl26, this.createLevelOptions(26));
|
||||||
|
this.add(ACHIEVEMENTS.cutShape);
|
||||||
|
this.add(ACHIEVEMENTS.darkMode, {
|
||||||
|
isValid: this.isDarkModeValid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.destroy1000, {
|
||||||
|
isValid: this.isDestroy1000Valid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.irrelevantShape, {
|
||||||
|
isValid: this.isIrrelevantShapeValid,
|
||||||
|
signal: "shapeDelivered",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.level100, this.createLevelOptions(100));
|
||||||
|
this.add(ACHIEVEMENTS.level50, this.createLevelOptions(50));
|
||||||
|
this.add(ACHIEVEMENTS.logoBefore18, {
|
||||||
|
isValid: this.isLogoBefore18Valid,
|
||||||
|
signal: "itemProduced",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.mam, {
|
||||||
|
isValid: this.isMamValid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.mapMarkers15, {
|
||||||
|
isValid: this.isMapMarkers15Valid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.noBeltUpgradesUntilBp, {
|
||||||
|
isValid: this.isNoBeltUpgradesUntilBpValid,
|
||||||
|
signal: "storyGoalCompleted",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.noInverseRotater, {
|
||||||
|
init: this.initNoInverseRotater,
|
||||||
|
isValid: this.isNoInverseRotaterValid,
|
||||||
|
signal: "storyGoalCompleted",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.oldLevel17, this.createShapeOptions(SHAPE_OLD_LEVEL_17));
|
||||||
|
this.add(ACHIEVEMENTS.openWires, {
|
||||||
|
isValid: this.isOpenWiresValid,
|
||||||
|
signal: "editModeChanged",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.paintShape);
|
||||||
|
this.add(ACHIEVEMENTS.place5000Wires, {
|
||||||
|
isValid: this.isPlace5000WiresValid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.placeBlueprint, {
|
||||||
|
isValid: this.isPlaceBlueprintValid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.placeBp1000, {
|
||||||
|
isValid: this.isPlaceBp1000Valid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.play1h, this.createTimeOptions(HOUR_1));
|
||||||
|
this.add(ACHIEVEMENTS.play10h, this.createTimeOptions(HOUR_10));
|
||||||
|
this.add(ACHIEVEMENTS.play20h, this.createTimeOptions(HOUR_20));
|
||||||
|
this.add(ACHIEVEMENTS.produceLogo, this.createShapeOptions(SHAPE_LOGO));
|
||||||
|
this.add(ACHIEVEMENTS.produceRocket, this.createShapeOptions(SHAPE_ROCKET));
|
||||||
|
this.add(ACHIEVEMENTS.produceMsLogo, this.createShapeOptions(SHAPE_MS_LOGO));
|
||||||
|
this.add(ACHIEVEMENTS.rotateShape);
|
||||||
|
this.add(ACHIEVEMENTS.speedrunBp30, this.createSpeedOptions(12, MINUTE_30));
|
||||||
|
this.add(ACHIEVEMENTS.speedrunBp60, this.createSpeedOptions(12, MINUTE_60));
|
||||||
|
this.add(ACHIEVEMENTS.speedrunBp120, this.createSpeedOptions(12, MINUTE_120));
|
||||||
|
this.add(ACHIEVEMENTS.stack4Layers, {
|
||||||
|
isValid: this.isStack4LayersValid,
|
||||||
|
signal: "itemProduced",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.stackShape);
|
||||||
|
this.add(ACHIEVEMENTS.store100Unique, {
|
||||||
|
init: this.initStore100Unique,
|
||||||
|
isValid: this.isStore100UniqueValid,
|
||||||
|
signal: "shapeDelivered",
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.storeShape, {
|
||||||
|
init: this.initStoreShape,
|
||||||
|
isValid: this.isStoreShapeValid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.throughputBp25, this.createRateOptions(SHAPE_BP, 25));
|
||||||
|
this.add(ACHIEVEMENTS.throughputBp50, this.createRateOptions(SHAPE_BP, 50));
|
||||||
|
this.add(ACHIEVEMENTS.throughputLogo25, this.createRateOptions(SHAPE_LOGO, 25));
|
||||||
|
this.add(ACHIEVEMENTS.throughputLogo50, this.createRateOptions(SHAPE_LOGO, 50));
|
||||||
|
this.add(ACHIEVEMENTS.throughputRocket10, this.createRateOptions(SHAPE_ROCKET, 10));
|
||||||
|
this.add(ACHIEVEMENTS.throughputRocket20, this.createRateOptions(SHAPE_ROCKET, 20));
|
||||||
|
this.add(ACHIEVEMENTS.trash1000, {
|
||||||
|
init: this.initTrash1000,
|
||||||
|
isValid: this.isTrash1000Valid,
|
||||||
|
});
|
||||||
|
this.add(ACHIEVEMENTS.unlockWires, this.createLevelOptions(20));
|
||||||
|
this.add(ACHIEVEMENTS.upgradesTier5, this.createUpgradeOptions(5));
|
||||||
|
this.add(ACHIEVEMENTS.upgradesTier8, this.createUpgradeOptions(8));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {GameRoot} root */
|
||||||
|
initialize(root) {
|
||||||
|
this.root = root;
|
||||||
|
this.root.signals.achievementCheck.add(this.unlock, this);
|
||||||
|
this.root.signals.bulkAchievementCheck.add(this.bulkUnlock, this);
|
||||||
|
|
||||||
|
for (let [key, achievement] of this.map.entries()) {
|
||||||
|
if (achievement.signal) {
|
||||||
|
achievement.receiver = this.unlock.bind(this, key);
|
||||||
|
this.root.signals[achievement.signal].add(achievement.receiver);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (achievement.init) {
|
||||||
|
achievement.init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.hasDefaultReceivers()) {
|
||||||
|
this.root.signals.achievementCheck.remove(this.unlock);
|
||||||
|
this.root.signals.bulkAchievementCheck.remove(this.bulkUnlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} key - Maps to an Achievement
|
||||||
|
* @param {object} [options]
|
||||||
|
* @param {function} [options.init]
|
||||||
|
* @param {function} [options.isValid]
|
||||||
|
* @param {string} [options.signal]
|
||||||
|
*/
|
||||||
|
add(key, options = {}) {
|
||||||
|
if (G_IS_DEV) {
|
||||||
|
assert(ACHIEVEMENTS[key], "Achievement key not found: ", key);
|
||||||
|
}
|
||||||
|
|
||||||
|
const achievement = new Achievement(key);
|
||||||
|
|
||||||
|
achievement.activate = this.activate;
|
||||||
|
|
||||||
|
if (options.init) {
|
||||||
|
achievement.init = options.init.bind(this, achievement);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.isValid) {
|
||||||
|
achievement.isValid = options.isValid.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.signal) {
|
||||||
|
achievement.signal = options.signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.map.set(key, achievement);
|
||||||
|
}
|
||||||
|
|
||||||
|
bulkUnlock() {
|
||||||
|
for (let i = 0; i < arguments.length; i += 2) {
|
||||||
|
this.unlock(arguments[i], arguments[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} key - Maps to an Achievement
|
||||||
|
* @param {any} data - Data received from signal dispatches for validation
|
||||||
|
*/
|
||||||
|
unlock(key, data) {
|
||||||
|
if (!this.map.has(key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const achievement = this.map.get(key);
|
||||||
|
|
||||||
|
if (!achievement.isValid(data)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
achievement
|
||||||
|
.unlock()
|
||||||
|
.then(() => {
|
||||||
|
this.onActivate(null, key);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
this.onActivate(err, key);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up after achievement activation attempt with the provider. Could
|
||||||
|
* utilize err to retry some number of times if needed.
|
||||||
|
* @param {?Error} err - Error is null if activation was successful
|
||||||
|
* @param {string} key - Maps to an Achievement
|
||||||
|
*/
|
||||||
|
onActivate(err, key) {
|
||||||
|
this.remove(key);
|
||||||
|
|
||||||
|
if (!this.hasDefaultReceivers()) {
|
||||||
|
this.root.signals.achievementCheck.remove(this.unlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {string} key - Maps to an Achievement */
|
||||||
|
remove(key) {
|
||||||
|
const achievement = this.map.get(key);
|
||||||
|
if (achievement) {
|
||||||
|
if (achievement.receiver) {
|
||||||
|
this.root.signals[achievement.signal].remove(achievement.receiver);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.map.delete(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the collection-level achievementCheck receivers are still
|
||||||
|
* necessary.
|
||||||
|
*/
|
||||||
|
hasDefaultReceivers() {
|
||||||
|
if (!this.map.size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let achievement of this.map.values()) {
|
||||||
|
if (!achievement.signal) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remaining methods exist to extend Achievement instances within the
|
||||||
|
* collection.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hasAllUpgradesAtLeastAtTier(tier) {
|
||||||
|
const upgrades = this.root.gameMode.getUpgrades();
|
||||||
|
|
||||||
|
for (let upgradeId in upgrades) {
|
||||||
|
if (this.root.hubGoals.getUpgradeLevel(upgradeId) < tier - 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ShapeItem} item
|
||||||
|
* @param {string} shape
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
isShape(item, shape) {
|
||||||
|
return item.getItemType() === ITEM_SHAPE && item.definition.getHash() === shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
createBlueprintOptions(count) {
|
||||||
|
return {
|
||||||
|
init: ({ key }) => this.unlock(key, ShapeDefinition.fromShortKey(SHAPE_BP)),
|
||||||
|
isValid: definition =>
|
||||||
|
definition.cachedHash === SHAPE_BP && this.root.hubGoals.storedShapes[SHAPE_BP] >= count,
|
||||||
|
signal: "shapeDelivered",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createLevelOptions(level) {
|
||||||
|
return {
|
||||||
|
init: ({ key }) => this.unlock(key, this.root.hubGoals.level),
|
||||||
|
isValid: currentLevel => currentLevel >= level,
|
||||||
|
signal: "storyGoalCompleted",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createRateOptions(shape, rate) {
|
||||||
|
return {
|
||||||
|
isValid: () => {
|
||||||
|
return (
|
||||||
|
this.root.productionAnalytics.getCurrentShapeRateRaw(
|
||||||
|
enumAnalyticsDataSource.delivered,
|
||||||
|
this.root.shapeDefinitionMgr.getShapeFromShortKey(shape)
|
||||||
|
) /
|
||||||
|
globalConfig.analyticsSliceDurationSeconds >=
|
||||||
|
rate
|
||||||
|
);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createShapeOptions(shape) {
|
||||||
|
return {
|
||||||
|
isValid: item => this.isShape(item, shape),
|
||||||
|
signal: "itemProduced",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createSpeedOptions(level, time) {
|
||||||
|
return {
|
||||||
|
isValid: currentLevel => currentLevel >= level && this.root.time.now() < time,
|
||||||
|
signal: "storyGoalCompleted",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createTimeOptions(duration) {
|
||||||
|
return {
|
||||||
|
isValid: () => this.root.time.now() >= duration,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
createUpgradeOptions(tier) {
|
||||||
|
return {
|
||||||
|
init: ({ key }) => this.unlock(key, null),
|
||||||
|
isValid: () => this.hasAllUpgradesAtLeastAtTier(tier),
|
||||||
|
signal: "upgradePurchased",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Entity} entity @returns {boolean} */
|
||||||
|
isBelt500TilesValid(entity) {
|
||||||
|
return entity.components.Belt && entity.components.Belt.assignedPath.totalLength >= 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
isDarkModeValid() {
|
||||||
|
return this.root.app.settings.currentData.settings.theme === DARK_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} count @returns {boolean} */
|
||||||
|
isDestroy1000Valid(count) {
|
||||||
|
return count >= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {ShapeDefinition} definition @returns {boolean} */
|
||||||
|
isIrrelevantShapeValid(definition) {
|
||||||
|
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();
|
||||||
|
for (let upgradeId in upgrades) {
|
||||||
|
for (const tier in upgrades[upgradeId]) {
|
||||||
|
const requiredShapes = upgrades[upgradeId][tier].required;
|
||||||
|
for (let i = 0; i < requiredShapes.length; i++) {
|
||||||
|
if (definition.cachedHash === requiredShapes[i].shape) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {ShapeItem} item @returns {boolean} */
|
||||||
|
isLogoBefore18Valid(item) {
|
||||||
|
return this.root.hubGoals.level < 18 && this.isShape(item, SHAPE_LOGO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
isMamValid() {
|
||||||
|
return this.root.hubGoals.level > 27 && !this.root.savegame.currentData.stats.failedMam;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} count @returns {boolean} */
|
||||||
|
isMapMarkers15Valid(count) {
|
||||||
|
return count >= 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} level
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
isNoBeltUpgradesUntilBpValid(level) {
|
||||||
|
return level >= 12 && this.root.hubGoals.upgradeLevels.belt === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
initNoInverseRotater() {
|
||||||
|
if (this.root.savegame.currentData.stats.usedInverseRotater === true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entities = this.root.entityMgr.componentToEntity.StaticMapEntity;
|
||||||
|
|
||||||
|
let usedInverseRotater = false;
|
||||||
|
for (var i = 0; i < entities.length; i++) {
|
||||||
|
const entity = entities[i].components.StaticMapEntity;
|
||||||
|
|
||||||
|
if (entity.code === ROTATER_CCW_CODE || entity.code === ROTATER_180_CODE) {
|
||||||
|
usedInverseRotater = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.root.savegame.currentData.stats.usedInverseRotater = usedInverseRotater;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} level @returns {boolean} */
|
||||||
|
isNoInverseRotaterValid(level) {
|
||||||
|
return level >= 14 && !this.root.savegame.currentData.stats.usedInverseRotater;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {string} currentLayer @returns {boolean} */
|
||||||
|
isOpenWiresValid(currentLayer) {
|
||||||
|
return currentLayer === WIRE_LAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Entity} entity @returns {boolean} */
|
||||||
|
isPlace5000WiresValid(entity) {
|
||||||
|
return (
|
||||||
|
entity.components.Wire &&
|
||||||
|
entity.registered &&
|
||||||
|
entity.root.entityMgr.componentToEntity.Wire.length >= 5000
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} count @returns {boolean} */
|
||||||
|
isPlaceBlueprintValid(count) {
|
||||||
|
return count != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} count @returns {boolean} */
|
||||||
|
isPlaceBp1000Valid(count) {
|
||||||
|
return count >= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {ShapeItem} item @returns {boolean} */
|
||||||
|
isStack4LayersValid(item) {
|
||||||
|
return item.getItemType() === ITEM_SHAPE && item.definition.layers.length === 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Achievement} achievement */
|
||||||
|
initStore100Unique({ key }) {
|
||||||
|
this.unlock(key, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
isStore100UniqueValid() {
|
||||||
|
return Object.keys(this.root.hubGoals.storedShapes).length >= 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Achievement} achievement */
|
||||||
|
initStoreShape({ key }) {
|
||||||
|
this.unlock(key, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
isStoreShapeValid() {
|
||||||
|
const entities = this.root.systemMgr.systems.storage.allEntities;
|
||||||
|
|
||||||
|
if (entities.length === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < entities.length; i++) {
|
||||||
|
if (entities[i].components.Storage.storedCount > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {Achievement} achievement */
|
||||||
|
initTrash1000({ key }) {
|
||||||
|
if (Number(this.root.savegame.currentData.stats.trashedCount)) {
|
||||||
|
this.unlock(key, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.root.savegame.currentData.stats.trashedCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param {number} count @returns {boolean} */
|
||||||
|
isTrash1000Valid(count) {
|
||||||
|
this.root.savegame.currentData.stats.trashedCount += count;
|
||||||
|
|
||||||
|
return this.root.savegame.currentData.stats.trashedCount >= 1000;
|
||||||
|
}
|
||||||
|
}
|
23
src/js/platform/browser/no_achievement_provider.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { AchievementProviderInterface } from "../achievement_provider";
|
||||||
|
|
||||||
|
export class NoAchievementProvider extends AchievementProviderInterface {
|
||||||
|
hasAchievements() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasLoaded() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize() {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoad() {
|
||||||
|
return Promise.reject(new Error("No achievements to load"));
|
||||||
|
}
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
}
|
@ -58,11 +58,6 @@ export class StorageImplBrowser extends StorageInterface {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFileSyncIfSupported(filename, contents) {
|
|
||||||
window.localStorage.setItem(filename, contents);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
readFileAsync(filename) {
|
readFileAsync(filename) {
|
||||||
if (this.currentBusyFilename === filename) {
|
if (this.currentBusyFilename === filename) {
|
||||||
logger.warn("Attempt to read", filename, "while write progress on it is ongoing!");
|
logger.warn("Attempt to read", filename, "while write progress on it is ongoing!");
|
||||||
|
@ -94,12 +94,6 @@ export class StorageImplBrowserIndexedDB extends StorageInterface {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFileSyncIfSupported(filename, contents) {
|
|
||||||
// Not supported
|
|
||||||
this.writeFileAsync(filename, contents);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
readFileAsync(filename) {
|
readFileAsync(filename) {
|
||||||
if (!this.database) {
|
if (!this.database) {
|
||||||
return Promise.reject("Storage not ready");
|
return Promise.reject("Storage not ready");
|
||||||
|
@ -4,7 +4,9 @@ import { queryParamOptions } from "../../core/query_parameters";
|
|||||||
import { clamp } from "../../core/utils";
|
import { clamp } from "../../core/utils";
|
||||||
import { GamedistributionAdProvider } from "../ad_providers/gamedistribution";
|
import { GamedistributionAdProvider } from "../ad_providers/gamedistribution";
|
||||||
import { NoAdProvider } from "../ad_providers/no_ad_provider";
|
import { NoAdProvider } from "../ad_providers/no_ad_provider";
|
||||||
|
import { SteamAchievementProvider } from "../electron/steam_achievement_provider";
|
||||||
import { PlatformWrapperInterface } from "../wrapper";
|
import { PlatformWrapperInterface } from "../wrapper";
|
||||||
|
import { NoAchievementProvider } from "./no_achievement_provider";
|
||||||
import { StorageImplBrowser } from "./storage";
|
import { StorageImplBrowser } from "./storage";
|
||||||
import { StorageImplBrowserIndexedDB } from "./storage_indexed_db";
|
import { StorageImplBrowserIndexedDB } from "./storage_indexed_db";
|
||||||
|
|
||||||
@ -71,6 +73,7 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
|
|||||||
|
|
||||||
return this.detectStorageImplementation()
|
return this.detectStorageImplementation()
|
||||||
.then(() => this.initializeAdProvider())
|
.then(() => this.initializeAdProvider())
|
||||||
|
.then(() => this.initializeAchievementProvider())
|
||||||
.then(() => super.initialize());
|
.then(() => super.initialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,6 +199,20 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initializeAchievementProvider() {
|
||||||
|
if (G_IS_DEV && globalConfig.debug.testAchievements) {
|
||||||
|
this.app.achievementProvider = new SteamAchievementProvider(this.app);
|
||||||
|
|
||||||
|
return this.app.achievementProvider.initialize().catch(err => {
|
||||||
|
logger.error("Failed to initialize achievement provider, disabling:", err);
|
||||||
|
|
||||||
|
this.app.achievementProvider = new NoAchievementProvider(this.app);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.app.achievementProvider.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
exitApp() {
|
exitApp() {
|
||||||
// Can not exit app
|
// Can not exit app
|
||||||
}
|
}
|
||||||
|
143
src/js/platform/electron/steam_achievement_provider.js
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/* typehints:start */
|
||||||
|
import { Application } from "../../application";
|
||||||
|
import { GameRoot } from "../../game/root";
|
||||||
|
/* typehints:end */
|
||||||
|
|
||||||
|
import { createLogger } from "../../core/logging";
|
||||||
|
import { getIPCRenderer } from "../../core/utils";
|
||||||
|
import { ACHIEVEMENTS, AchievementCollection, AchievementProviderInterface } from "../achievement_provider";
|
||||||
|
|
||||||
|
const logger = createLogger("achievements/steam");
|
||||||
|
|
||||||
|
const ACHIEVEMENT_IDS = {
|
||||||
|
[ACHIEVEMENTS.belt500Tiles]: "belt_500_tiles",
|
||||||
|
[ACHIEVEMENTS.blueprint100k]: "blueprint_100k",
|
||||||
|
[ACHIEVEMENTS.blueprint1m]: "blueprint_1m",
|
||||||
|
[ACHIEVEMENTS.completeLvl26]: "complete_lvl_26",
|
||||||
|
[ACHIEVEMENTS.cutShape]: "cut_shape",
|
||||||
|
[ACHIEVEMENTS.darkMode]: "dark_mode",
|
||||||
|
[ACHIEVEMENTS.destroy1000]: "destroy_1000",
|
||||||
|
[ACHIEVEMENTS.irrelevantShape]: "irrelevant_shape",
|
||||||
|
[ACHIEVEMENTS.level100]: "level_100",
|
||||||
|
[ACHIEVEMENTS.level50]: "level_50",
|
||||||
|
[ACHIEVEMENTS.logoBefore18]: "logo_before_18",
|
||||||
|
[ACHIEVEMENTS.mam]: "mam",
|
||||||
|
[ACHIEVEMENTS.mapMarkers15]: "map_markers_15",
|
||||||
|
[ACHIEVEMENTS.openWires]: "open_wires",
|
||||||
|
[ACHIEVEMENTS.oldLevel17]: "old_level_17",
|
||||||
|
[ACHIEVEMENTS.noBeltUpgradesUntilBp]: "no_belt_upgrades_until_bp",
|
||||||
|
[ACHIEVEMENTS.noInverseRotater]: "no_inverse_rotator", // [sic]
|
||||||
|
[ACHIEVEMENTS.paintShape]: "paint_shape",
|
||||||
|
[ACHIEVEMENTS.place5000Wires]: "place_5000_wires",
|
||||||
|
[ACHIEVEMENTS.placeBlueprint]: "place_blueprint",
|
||||||
|
[ACHIEVEMENTS.placeBp1000]: "place_bp_1000",
|
||||||
|
[ACHIEVEMENTS.play1h]: "play_1h",
|
||||||
|
[ACHIEVEMENTS.play10h]: "play_10h",
|
||||||
|
[ACHIEVEMENTS.play20h]: "play_20h",
|
||||||
|
[ACHIEVEMENTS.produceLogo]: "produce_logo",
|
||||||
|
[ACHIEVEMENTS.produceMsLogo]: "produce_ms_logo",
|
||||||
|
[ACHIEVEMENTS.produceRocket]: "produce_rocket",
|
||||||
|
[ACHIEVEMENTS.rotateShape]: "rotate_shape",
|
||||||
|
[ACHIEVEMENTS.speedrunBp30]: "speedrun_bp_30",
|
||||||
|
[ACHIEVEMENTS.speedrunBp60]: "speedrun_bp_60",
|
||||||
|
[ACHIEVEMENTS.speedrunBp120]: "speedrun_bp_120",
|
||||||
|
[ACHIEVEMENTS.stack4Layers]: "stack_4_layers",
|
||||||
|
[ACHIEVEMENTS.stackShape]: "stack_shape",
|
||||||
|
[ACHIEVEMENTS.store100Unique]: "store_100_unique",
|
||||||
|
[ACHIEVEMENTS.storeShape]: "store_shape",
|
||||||
|
[ACHIEVEMENTS.throughputBp25]: "throughput_bp_25",
|
||||||
|
[ACHIEVEMENTS.throughputBp50]: "throughput_bp_50",
|
||||||
|
[ACHIEVEMENTS.throughputLogo25]: "throughput_logo_25",
|
||||||
|
[ACHIEVEMENTS.throughputLogo50]: "throughput_logo_50",
|
||||||
|
[ACHIEVEMENTS.throughputRocket10]: "throughput_rocket_10",
|
||||||
|
[ACHIEVEMENTS.throughputRocket20]: "throughput_rocket_20",
|
||||||
|
[ACHIEVEMENTS.trash1000]: "trash_1000",
|
||||||
|
[ACHIEVEMENTS.unlockWires]: "unlock_wires",
|
||||||
|
[ACHIEVEMENTS.upgradesTier5]: "upgrades_tier_5",
|
||||||
|
[ACHIEVEMENTS.upgradesTier8]: "upgrades_tier_8",
|
||||||
|
};
|
||||||
|
|
||||||
|
export class SteamAchievementProvider extends AchievementProviderInterface {
|
||||||
|
/** @param {Application} app */
|
||||||
|
constructor(app) {
|
||||||
|
super(app);
|
||||||
|
|
||||||
|
this.initialized = false;
|
||||||
|
this.collection = new AchievementCollection(this.activate.bind(this));
|
||||||
|
|
||||||
|
if (G_IS_DEV) {
|
||||||
|
for (let key in ACHIEVEMENT_IDS) {
|
||||||
|
assert(this.collection.map.has(key), "Key not found in collection: " + key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log("Collection created with", this.collection.map.size, "achievements");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {boolean} */
|
||||||
|
hasAchievements() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {GameRoot} root
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
onLoad(root) {
|
||||||
|
this.root = root;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.collection = new AchievementCollection(this.activate.bind(this));
|
||||||
|
this.collection.initialize(root);
|
||||||
|
|
||||||
|
logger.log("Initialized", this.collection.map.size, "relevant achievements");
|
||||||
|
return Promise.resolve();
|
||||||
|
} catch (err) {
|
||||||
|
logger.error("Failed to initialize the collection");
|
||||||
|
return Promise.reject(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns {Promise<void>} */
|
||||||
|
initialize() {
|
||||||
|
if (!G_IS_STANDALONE) {
|
||||||
|
logger.warn("Steam unavailable. Achievements won't sync.");
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ipc = getIPCRenderer();
|
||||||
|
|
||||||
|
return this.ipc.invoke("steam:is-initialized").then(initialized => {
|
||||||
|
this.initialized = initialized;
|
||||||
|
|
||||||
|
if (!this.initialized) {
|
||||||
|
logger.warn("Steam failed to intialize. Achievements won't sync.");
|
||||||
|
} else {
|
||||||
|
logger.log("Steam achievement provider initialized");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} key
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
activate(key) {
|
||||||
|
let promise;
|
||||||
|
|
||||||
|
if (!this.initialized) {
|
||||||
|
promise = Promise.resolve();
|
||||||
|
} else {
|
||||||
|
promise = this.ipc.invoke("steam:activate-achievement", ACHIEVEMENT_IDS[key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return promise
|
||||||
|
.then(() => {
|
||||||
|
logger.log("Achievement activated:", key);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
logger.error("Failed to activate achievement:", key, err);
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -7,24 +7,6 @@ const logger = createLogger("electron-storage");
|
|||||||
export class StorageImplElectron extends StorageInterface {
|
export class StorageImplElectron extends StorageInterface {
|
||||||
constructor(app) {
|
constructor(app) {
|
||||||
super(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() {
|
initialize() {
|
||||||
@ -33,51 +15,53 @@ export class StorageImplElectron extends StorageInterface {
|
|||||||
|
|
||||||
writeFileAsync(filename, contents) {
|
writeFileAsync(filename, contents) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// ipcMain
|
getIPCRenderer()
|
||||||
const jobId = ++this.jobId;
|
.invoke("fs-job", {
|
||||||
this.jobs[jobId] = { resolve, reject };
|
type: "write",
|
||||||
|
filename,
|
||||||
getIPCRenderer().send("fs-job", {
|
contents,
|
||||||
type: "write",
|
})
|
||||||
filename,
|
.then(result => {
|
||||||
contents,
|
if (result.success) {
|
||||||
id: jobId,
|
resolve(result.data);
|
||||||
});
|
} else {
|
||||||
});
|
reject(result.error);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
writeFileSyncIfSupported(filename, contents) {
|
|
||||||
return getIPCRenderer().sendSync("fs-sync-job", {
|
|
||||||
type: "write",
|
|
||||||
filename,
|
|
||||||
contents,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
readFileAsync(filename) {
|
readFileAsync(filename) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// ipcMain
|
getIPCRenderer()
|
||||||
const jobId = ++this.jobId;
|
.invoke("fs-job", {
|
||||||
this.jobs[jobId] = { resolve, reject };
|
type: "read",
|
||||||
|
filename,
|
||||||
getIPCRenderer().send("fs-job", {
|
})
|
||||||
type: "read",
|
.then(result => {
|
||||||
filename,
|
if (result.success) {
|
||||||
id: jobId,
|
resolve(result.data);
|
||||||
});
|
} else {
|
||||||
|
reject(result.error);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteFileAsync(filename) {
|
deleteFileAsync(filename) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// ipcMain
|
getIPCRenderer()
|
||||||
const jobId = ++this.jobId;
|
.invoke("fs-job", {
|
||||||
this.jobs[jobId] = { resolve, reject };
|
type: "delete",
|
||||||
getIPCRenderer().send("fs-job", {
|
filename,
|
||||||
type: "delete",
|
})
|
||||||
filename,
|
.then(result => {
|
||||||
id: jobId,
|
if (result.success) {
|
||||||
});
|
resolve(result.data);
|
||||||
|
} else {
|
||||||
|
reject(result.error);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,35 @@
|
|||||||
|
import { NoAchievementProvider } from "../browser/no_achievement_provider";
|
||||||
import { PlatformWrapperImplBrowser } from "../browser/wrapper";
|
import { PlatformWrapperImplBrowser } from "../browser/wrapper";
|
||||||
import { getIPCRenderer } from "../../core/utils";
|
import { getIPCRenderer } from "../../core/utils";
|
||||||
import { createLogger } from "../../core/logging";
|
import { createLogger } from "../../core/logging";
|
||||||
import { StorageImplElectron } from "./storage";
|
import { StorageImplElectron } from "./storage";
|
||||||
|
import { SteamAchievementProvider } from "./steam_achievement_provider";
|
||||||
import { PlatformWrapperInterface } from "../wrapper";
|
import { PlatformWrapperInterface } from "../wrapper";
|
||||||
|
|
||||||
const logger = createLogger("electron-wrapper");
|
const logger = createLogger("electron-wrapper");
|
||||||
|
|
||||||
export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser {
|
export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser {
|
||||||
initialize() {
|
initialize() {
|
||||||
|
this.steamOverlayCanvasFix = document.createElement("canvas");
|
||||||
|
this.steamOverlayCanvasFix.width = 1;
|
||||||
|
this.steamOverlayCanvasFix.height = 1;
|
||||||
|
this.steamOverlayCanvasFix.id = "steamOverlayCanvasFix";
|
||||||
|
|
||||||
|
this.steamOverlayContextFix = this.steamOverlayCanvasFix.getContext("2d");
|
||||||
|
document.documentElement.appendChild(this.steamOverlayCanvasFix);
|
||||||
|
|
||||||
|
this.app.ticker.frameEmitted.add(this.steamOverlayFixRedrawCanvas, this);
|
||||||
|
|
||||||
this.app.storage = new StorageImplElectron(this);
|
this.app.storage = new StorageImplElectron(this);
|
||||||
return PlatformWrapperInterface.prototype.initialize.call(this);
|
this.app.achievementProvider = new SteamAchievementProvider(this.app);
|
||||||
|
|
||||||
|
return this.initializeAchievementProvider().then(() =>
|
||||||
|
PlatformWrapperInterface.prototype.initialize.call(this)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
steamOverlayFixRedrawCanvas() {
|
||||||
|
this.steamOverlayContextFix.clearRect(0, 0, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
getId() {
|
getId() {
|
||||||
@ -38,6 +58,14 @@ export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser {
|
|||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initializeAchievementProvider() {
|
||||||
|
return this.app.achievementProvider.initialize().catch(err => {
|
||||||
|
logger.error("Failed to initialize achievement provider, disabling:", err);
|
||||||
|
|
||||||
|
this.app.achievementProvider = new NoAchievementProvider(this.app);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
getSupportsFullscreen() {
|
getSupportsFullscreen() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -30,16 +30,6 @@ export class StorageInterface {
|
|||||||
return Promise.reject();
|
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.
|
* Reads a string asynchronously. Returns Promise<FILE_NOT_FOUND> if file was not found.
|
||||||
* @param {string} filename
|
* @param {string} filename
|
||||||
|
@ -12,6 +12,7 @@ import { SavegameInterface_V1004 } from "./schemas/1004";
|
|||||||
import { SavegameInterface_V1005 } from "./schemas/1005";
|
import { SavegameInterface_V1005 } from "./schemas/1005";
|
||||||
import { SavegameInterface_V1006 } from "./schemas/1006";
|
import { SavegameInterface_V1006 } from "./schemas/1006";
|
||||||
import { SavegameInterface_V1007 } from "./schemas/1007";
|
import { SavegameInterface_V1007 } from "./schemas/1007";
|
||||||
|
import { SavegameInterface_V1008 } from "./schemas/1008";
|
||||||
|
|
||||||
const logger = createLogger("savegame");
|
const logger = createLogger("savegame");
|
||||||
|
|
||||||
@ -52,7 +53,7 @@ export class Savegame extends ReadWriteProxy {
|
|||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
static getCurrentVersion() {
|
static getCurrentVersion() {
|
||||||
return 1007;
|
return 1008;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,7 +78,11 @@ export class Savegame extends ReadWriteProxy {
|
|||||||
return {
|
return {
|
||||||
version: this.getCurrentVersion(),
|
version: this.getCurrentVersion(),
|
||||||
dump: null,
|
dump: null,
|
||||||
stats: {},
|
stats: {
|
||||||
|
failedMam: false,
|
||||||
|
trashedCount: 0,
|
||||||
|
usedInverseRotater: false,
|
||||||
|
},
|
||||||
lastUpdate: Date.now(),
|
lastUpdate: Date.now(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -126,6 +131,11 @@ export class Savegame extends ReadWriteProxy {
|
|||||||
data.version = 1007;
|
data.version = 1007;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.version === 1007) {
|
||||||
|
SavegameInterface_V1008.migrate1007to1008(data);
|
||||||
|
data.version = 1008;
|
||||||
|
}
|
||||||
|
|
||||||
return ExplainedResult.good();
|
return ExplainedResult.good();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import { SavegameInterface_V1004 } from "./schemas/1004";
|
|||||||
import { SavegameInterface_V1005 } from "./schemas/1005";
|
import { SavegameInterface_V1005 } from "./schemas/1005";
|
||||||
import { SavegameInterface_V1006 } from "./schemas/1006";
|
import { SavegameInterface_V1006 } from "./schemas/1006";
|
||||||
import { SavegameInterface_V1007 } from "./schemas/1007";
|
import { SavegameInterface_V1007 } from "./schemas/1007";
|
||||||
|
import { SavegameInterface_V1008 } from "./schemas/1008";
|
||||||
|
|
||||||
/** @type {Object.<number, typeof BaseSavegameInterface>} */
|
/** @type {Object.<number, typeof BaseSavegameInterface>} */
|
||||||
export const savegameInterfaces = {
|
export const savegameInterfaces = {
|
||||||
@ -19,6 +20,7 @@ export const savegameInterfaces = {
|
|||||||
1005: SavegameInterface_V1005,
|
1005: SavegameInterface_V1005,
|
||||||
1006: SavegameInterface_V1006,
|
1006: SavegameInterface_V1006,
|
||||||
1007: SavegameInterface_V1007,
|
1007: SavegameInterface_V1007,
|
||||||
|
1008: SavegameInterface_V1008,
|
||||||
};
|
};
|
||||||
|
|
||||||
const logger = createLogger("savegame_interface_registry");
|
const logger = createLogger("savegame_interface_registry");
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
/**
|
/**
|
||||||
* @typedef {import("../game/entity").Entity} Entity
|
* @typedef {import("../game/entity").Entity} Entity
|
||||||
*
|
*
|
||||||
* @typedef {{}} SavegameStats
|
* @typedef {{
|
||||||
|
* failedMam: boolean,
|
||||||
|
* trashedCount: number,
|
||||||
|
* usedInverseRotater: boolean
|
||||||
|
* }} SavegameStats
|
||||||
*
|
*
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
* camera: any,
|
* camera: any,
|
||||||
|
32
src/js/savegame/schemas/1008.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { createLogger } from "../../core/logging.js";
|
||||||
|
import { SavegameInterface_V1007 } from "./1007.js";
|
||||||
|
|
||||||
|
const schema = require("./1008.json");
|
||||||
|
const logger = createLogger("savegame_interface/1008");
|
||||||
|
|
||||||
|
export class SavegameInterface_V1008 extends SavegameInterface_V1007 {
|
||||||
|
getVersion() {
|
||||||
|
return 1008;
|
||||||
|
}
|
||||||
|
|
||||||
|
getSchemaUncached() {
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {import("../savegame_typedefs.js").SavegameData} data
|
||||||
|
*/
|
||||||
|
static migrate1007to1008(data) {
|
||||||
|
logger.log("Migrating 1007 to 1008");
|
||||||
|
const dump = data.dump;
|
||||||
|
if (!dump) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.assign(data.stats, {
|
||||||
|
failedMam: true,
|
||||||
|
trashedCount: 0,
|
||||||
|
usedInverseRotater: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
5
src/js/savegame/schemas/1008.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [],
|
||||||
|
"additionalProperties": true
|
||||||
|
}
|
@ -15,7 +15,9 @@ export class AboutState extends TextualGameState {
|
|||||||
getMainContentHTML() {
|
getMainContentHTML() {
|
||||||
return `
|
return `
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<img src="${cachebust("res/logo.png")}" alt="shapez.io Logo">
|
<img src="${cachebust(
|
||||||
|
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
|
||||||
|
)}" alt="shapez.io Logo">
|
||||||
</div>
|
</div>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
${T.about.body
|
${T.about.body
|
||||||
|
@ -19,7 +19,7 @@ export class ChangelogState extends TextualGameState {
|
|||||||
for (let i = 0; i < entries.length; ++i) {
|
for (let i = 0; i < entries.length; ++i) {
|
||||||
const entry = entries[i];
|
const entry = entries[i];
|
||||||
html += `
|
html += `
|
||||||
<div class="entry">
|
<div class="entry" data-changelog-skin="${entry.skin || "default"}">
|
||||||
<span class="version">${entry.version}</span>
|
<span class="version">${entry.version}</span>
|
||||||
<span class="date">${entry.date}</span>
|
<span class="date">${entry.date}</span>
|
||||||
<ul class="changes">
|
<ul class="changes">
|
||||||
|
@ -42,7 +42,12 @@ export class MainMenuState extends GameState {
|
|||||||
|
|
||||||
return `
|
return `
|
||||||
<div class="topButtons">
|
<div class="topButtons">
|
||||||
<button class="languageChoose" data-languageicon="${this.app.settings.getLanguage()}"></button>
|
${
|
||||||
|
G_CHINA_VERSION
|
||||||
|
? ""
|
||||||
|
: `<button class="languageChoose" data-languageicon="${this.app.settings.getLanguage()}"></button>`
|
||||||
|
}
|
||||||
|
|
||||||
<button class="settingsButton"></button>
|
<button class="settingsButton"></button>
|
||||||
${
|
${
|
||||||
G_IS_STANDALONE || G_IS_DEV
|
G_IS_STANDALONE || G_IS_DEV
|
||||||
@ -58,8 +63,10 @@ export class MainMenuState extends GameState {
|
|||||||
</video>
|
</video>
|
||||||
|
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<img src="${cachebust("res/logo.png")}" alt="shapez.io Logo">
|
<img src="${cachebust(
|
||||||
<span class="updateLabel">v${G_BUILD_VERSION}</span>
|
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
|
||||||
|
)}" alt="shapez.io Logo">
|
||||||
|
<span class="updateLabel">v${G_BUILD_VERSION} - Achievements!</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mainWrapper ${showDemoBadges ? "demo" : "noDemo"}">
|
<div class="mainWrapper ${showDemoBadges ? "demo" : "noDemo"}">
|
||||||
@ -77,11 +84,17 @@ export class MainMenuState extends GameState {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer ${G_CHINA_VERSION ? "china" : ""}">
|
||||||
|
|
||||||
|
${
|
||||||
|
G_CHINA_VERSION
|
||||||
|
? ""
|
||||||
|
: `
|
||||||
<a class="githubLink boxLink" target="_blank">
|
<a class="githubLink boxLink" target="_blank">
|
||||||
${T.mainMenu.openSourceHint}
|
${T.mainMenu.openSourceHint}
|
||||||
<span class="thirdpartyLogo githubLogo"></span>
|
<span class="thirdpartyLogo githubLogo"></span>
|
||||||
</a>
|
</a>`
|
||||||
|
}
|
||||||
|
|
||||||
<a class="discordLink boxLink" target="_blank">
|
<a class="discordLink boxLink" target="_blank">
|
||||||
${T.mainMenu.discordLink}
|
${T.mainMenu.discordLink}
|
||||||
@ -89,13 +102,14 @@ export class MainMenuState extends GameState {
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="sidelinks">
|
<div class="sidelinks">
|
||||||
<a class="redditLink">${T.mainMenu.subreddit}</a>
|
${G_CHINA_VERSION ? "" : `<a class="redditLink">${T.mainMenu.subreddit}</a>`}
|
||||||
|
|
||||||
<a class="changelog">${T.changelog.title}</a>
|
${G_CHINA_VERSION ? "" : `<a class="changelog">${T.changelog.title}</a>`}
|
||||||
|
|
||||||
<a class="helpTranslate">${T.mainMenu.helpTranslate}</a>
|
${G_CHINA_VERSION ? "" : `<a class="helpTranslate">${T.mainMenu.helpTranslate}</a>`}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="author">${T.mainMenu.madeBy.replace(
|
<div class="author">${T.mainMenu.madeBy.replace(
|
||||||
"<author-link>",
|
"<author-link>",
|
||||||
'<a class="producerLink" target="_blank">Tobias Springer</a>'
|
'<a class="producerLink" target="_blank">Tobias Springer</a>'
|
||||||
@ -208,10 +222,13 @@ export class MainMenuState extends GameState {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.trackClicks(qs(".settingsButton"), this.onSettingsButtonClicked);
|
this.trackClicks(qs(".settingsButton"), this.onSettingsButtonClicked);
|
||||||
this.trackClicks(qs(".changelog"), this.onChangelogClicked);
|
|
||||||
this.trackClicks(qs(".redditLink"), this.onRedditClicked);
|
if (!G_CHINA_VERSION) {
|
||||||
this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked);
|
this.trackClicks(qs(".languageChoose"), this.onLanguageChooseClicked);
|
||||||
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked);
|
this.trackClicks(qs(".redditLink"), this.onRedditClicked);
|
||||||
|
this.trackClicks(qs(".changelog"), this.onChangelogClicked);
|
||||||
|
this.trackClicks(qs(".helpTranslate"), this.onTranslationHelpLinkClicked);
|
||||||
|
}
|
||||||
|
|
||||||
if (G_IS_STANDALONE) {
|
if (G_IS_STANDALONE) {
|
||||||
this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked);
|
this.trackClicks(qs(".exitAppButton"), this.onExitAppButtonClicked);
|
||||||
@ -228,23 +245,29 @@ export class MainMenuState extends GameState {
|
|||||||
const discordLink = this.htmlElement.querySelector(".discordLink");
|
const discordLink = this.htmlElement.querySelector(".discordLink");
|
||||||
this.trackClicks(
|
this.trackClicks(
|
||||||
discordLink,
|
discordLink,
|
||||||
() => this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.discord),
|
() => {
|
||||||
|
this.app.analytics.trackUiClick("main_menu_link_discord");
|
||||||
|
this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.discord);
|
||||||
|
},
|
||||||
{ preventClick: true }
|
{ preventClick: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const githubLink = this.htmlElement.querySelector(".githubLink");
|
const githubLink = this.htmlElement.querySelector(".githubLink");
|
||||||
this.trackClicks(
|
if (githubLink) {
|
||||||
githubLink,
|
this.trackClicks(
|
||||||
() => this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.github),
|
githubLink,
|
||||||
{ preventClick: true }
|
() => {
|
||||||
);
|
this.app.analytics.trackUiClick("main_menu_link_github");
|
||||||
|
this.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.github);
|
||||||
|
},
|
||||||
|
{ preventClick: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const producerLink = this.htmlElement.querySelector(".producerLink");
|
const producerLink = this.htmlElement.querySelector(".producerLink");
|
||||||
this.trackClicks(
|
this.trackClicks(producerLink, () => this.app.platformWrapper.openExternalLink("https://tobspr.io"), {
|
||||||
producerLink,
|
preventClick: true,
|
||||||
() => this.app.platformWrapper.openExternalLink("https://tobspr.com"),
|
});
|
||||||
{ preventClick: true }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
renderMainMenu() {
|
renderMainMenu() {
|
||||||
|
@ -9,17 +9,19 @@ export class MobileWarningState extends GameState {
|
|||||||
|
|
||||||
getInnerHTML() {
|
getInnerHTML() {
|
||||||
return `
|
return `
|
||||||
|
|
||||||
<img class="logo" src="${cachebust("res/logo.png")}" alt="shapez.io Logo">
|
<img class="logo" src="${cachebust(
|
||||||
|
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
|
||||||
|
)}" alt="shapez.io Logo">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
I'm sorry, but shapez.io is not available on mobile devices yet!
|
I'm sorry, but shapez.io is not available on mobile devices yet!
|
||||||
There is also no estimate when this will change, but feel to make a contribution! It's
|
There is also no estimate when this will change, but feel to make a contribution! It's
|
||||||
<a href="https://github.com/tobspr/shapez.io" target="_blank">open source</a>!</p>
|
<a href="https://github.com/tobspr/shapez.io" target="_blank">open source</a>!</p>
|
||||||
|
|
||||||
<p>If you want to play on your computer, you can also get the standalone on Steam:</p>
|
<p>If you want to play on your computer, you can also get the standalone on Steam:</p>
|
||||||
|
|
||||||
|
|
||||||
<a href="${
|
<a href="${
|
||||||
THIRDPARTY_URLS.standaloneStorePage + "?ref=mobile"
|
THIRDPARTY_URLS.standaloneStorePage + "?ref=mobile"
|
||||||
}" class="standaloneLink" target="_blank">Get the shapez.io standalone!</a>
|
}" class="standaloneLink" target="_blank">Get the shapez.io standalone!</a>
|
||||||
|
@ -3,7 +3,6 @@ import { cachebust } from "../core/cachebust";
|
|||||||
import { globalConfig } from "../core/config";
|
import { globalConfig } from "../core/config";
|
||||||
import { GameState } from "../core/game_state";
|
import { GameState } from "../core/game_state";
|
||||||
import { createLogger } from "../core/logging";
|
import { createLogger } from "../core/logging";
|
||||||
import { findNiceValue } from "../core/utils";
|
|
||||||
import { getRandomHint } from "../game/hints";
|
import { getRandomHint } from "../game/hints";
|
||||||
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
|
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
|
||||||
import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
|
import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
|
||||||
@ -20,7 +19,7 @@ export class PreloadState extends GameState {
|
|||||||
return `
|
return `
|
||||||
<div class="loadingImage"></div>
|
<div class="loadingImage"></div>
|
||||||
<div class="loadingStatus">
|
<div class="loadingStatus">
|
||||||
<span class="desc">Booting</span>
|
<span class="desc">${G_CHINA_VERSION ? "加载中" : "Booting"}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span class="prefab_GameHint"></span>
|
<span class="prefab_GameHint"></span>
|
||||||
@ -115,6 +114,10 @@ export class PreloadState extends GameState {
|
|||||||
|
|
||||||
.then(() => this.setStatus("Initializing language"))
|
.then(() => this.setStatus("Initializing language"))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
if (G_CHINA_VERSION) {
|
||||||
|
return this.app.settings.updateLanguage("zh-CN");
|
||||||
|
}
|
||||||
|
|
||||||
if (this.app.settings.getLanguage() === "auto-detect") {
|
if (this.app.settings.getLanguage() === "auto-detect") {
|
||||||
const language = autoDetectLanguageId();
|
const language = autoDetectLanguageId();
|
||||||
logger.log("Setting language to", language);
|
logger.log("Setting language to", language);
|
||||||
@ -163,6 +166,10 @@ export class PreloadState extends GameState {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (G_CHINA_VERSION) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
return this.app.storage
|
return this.app.storage
|
||||||
.readFileAsync("lastversion.bin")
|
.readFileAsync("lastversion.bin")
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
@ -192,7 +199,9 @@ export class PreloadState extends GameState {
|
|||||||
for (let i = 0; i < changelogEntries.length; ++i) {
|
for (let i = 0; i < changelogEntries.length; ++i) {
|
||||||
const entry = changelogEntries[i];
|
const entry = changelogEntries[i];
|
||||||
dialogHtml += `
|
dialogHtml += `
|
||||||
<div class="changelogDialogEntry">
|
<div class="changelogDialogEntry" data-changelog-skin="${
|
||||||
|
entry.skin || "default"
|
||||||
|
}">
|
||||||
<span class="version">${entry.version}</span>
|
<span class="version">${entry.version}</span>
|
||||||
<span class="date">${entry.date}</span>
|
<span class="date">${entry.date}</span>
|
||||||
<ul class="changes">
|
<ul class="changes">
|
||||||
@ -220,6 +229,9 @@ export class PreloadState extends GameState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
|
if (G_CHINA_VERSION) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const now = performance.now();
|
const now = performance.now();
|
||||||
if (now - this.lastHintShown > this.nextHintDuration) {
|
if (now - this.lastHintShown > this.nextHintDuration) {
|
||||||
this.lastHintShown = now;
|
this.lastHintShown = now;
|
||||||
@ -250,6 +262,9 @@ export class PreloadState extends GameState {
|
|||||||
*/
|
*/
|
||||||
setStatus(text) {
|
setStatus(text) {
|
||||||
logger.log("✅ " + text);
|
logger.log("✅ " + text);
|
||||||
|
if (G_CHINA_VERSION) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
this.currentStatus = text;
|
this.currentStatus = text;
|
||||||
this.statusText.innerText = text;
|
this.statusText.innerText = text;
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
@ -265,7 +280,9 @@ export class PreloadState extends GameState {
|
|||||||
|
|
||||||
subElement.innerHTML = `
|
subElement.innerHTML = `
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<img src="${cachebust("res/logo.png")}" alt="Shapez.io Logo">
|
<img src="${cachebust(
|
||||||
|
G_CHINA_VERSION ? "res/logo_cn.png" : "res/logo.png"
|
||||||
|
)}" alt="Shapez.io Logo">
|
||||||
</div>
|
</div>
|
||||||
<div class="failureInner">
|
<div class="failureInner">
|
||||||
<div class="errorHeader">
|
<div class="errorHeader">
|
||||||
|
@ -28,8 +28,14 @@ export class SettingsState extends TextualGameState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
<div class="other">
|
<div class="other">
|
||||||
<button class="styledButton about">${T.about.title}</button>
|
|
||||||
|
|
||||||
|
${
|
||||||
|
G_CHINA_VERSION
|
||||||
|
? ""
|
||||||
|
: `
|
||||||
|
<button class="styledButton about">${T.about.title}</button>
|
||||||
|
`
|
||||||
|
}
|
||||||
<div class="versionbar">
|
<div class="versionbar">
|
||||||
<div class="buildVersion">${T.global.loading} ...</div>
|
<div class="buildVersion">${T.global.loading} ...</div>
|
||||||
</div>
|
</div>
|
||||||
@ -68,6 +74,10 @@ export class SettingsState extends TextualGameState {
|
|||||||
for (let i = 0; i < allApplicationSettings.length; ++i) {
|
for (let i = 0; i < allApplicationSettings.length; ++i) {
|
||||||
const setting = allApplicationSettings[i];
|
const setting = allApplicationSettings[i];
|
||||||
|
|
||||||
|
if (G_CHINA_VERSION && setting.id === "language") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
categoriesHTML[setting.categoryId] += setting.getHtml(this.app);
|
categoriesHTML[setting.categoryId] += setting.getHtml(this.app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,9 +104,12 @@ export class SettingsState extends TextualGameState {
|
|||||||
|
|
||||||
onEnter(payload) {
|
onEnter(payload) {
|
||||||
this.renderBuildText();
|
this.renderBuildText();
|
||||||
this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
|
|
||||||
preventDefault: false,
|
if (!G_CHINA_VERSION) {
|
||||||
});
|
this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
|
||||||
|
preventDefault: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const keybindingsButton = this.htmlElement.querySelector(".editKeybindings");
|
const keybindingsButton = this.htmlElement.querySelector(".editKeybindings");
|
||||||
|
|
||||||
@ -131,6 +144,10 @@ export class SettingsState extends TextualGameState {
|
|||||||
|
|
||||||
initSettings() {
|
initSettings() {
|
||||||
allApplicationSettings.forEach(setting => {
|
allApplicationSettings.forEach(setting => {
|
||||||
|
if (G_CHINA_VERSION && setting.id === "language") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/** @type {HTMLElement} */
|
/** @type {HTMLElement} */
|
||||||
const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
|
const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
|
||||||
setting.bind(this.app, element, this.dialogs);
|
setting.bind(this.app, element, this.dialogs);
|
||||||
|
@ -18,7 +18,7 @@ const original = YAML.parse(originalContents);
|
|||||||
|
|
||||||
const placeholderRegexp = /[[<]([a-zA-Z_0-9/-_]+?)[\]>]/gi;
|
const placeholderRegexp = /[[<]([a-zA-Z_0-9/-_]+?)[\]>]/gi;
|
||||||
|
|
||||||
function match(originalObj, translatedObj, path = "/") {
|
function match(originalObj, translatedObj, path = "/", ignorePlaceholderMismatch = false) {
|
||||||
for (const key in originalObj) {
|
for (const key in originalObj) {
|
||||||
if (!translatedObj.hasOwnProperty(key)) {
|
if (!translatedObj.hasOwnProperty(key)) {
|
||||||
console.warn(" | Missing key", path + key);
|
console.warn(" | Missing key", path + key);
|
||||||
@ -34,13 +34,12 @@ function match(originalObj, translatedObj, path = "/") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (typeof valueOriginal === "object") {
|
if (typeof valueOriginal === "object") {
|
||||||
match(valueOriginal, valueMatching, path + key + "/");
|
match(valueOriginal, valueMatching, path + key + "/", ignorePlaceholderMismatch);
|
||||||
} else if (typeof valueOriginal === "string") {
|
} else if (typeof valueOriginal === "string") {
|
||||||
// @todo
|
|
||||||
const originalPlaceholders = matchAll(valueOriginal, placeholderRegexp).toArray();
|
const originalPlaceholders = matchAll(valueOriginal, placeholderRegexp).toArray();
|
||||||
const translatedPlaceholders = matchAll(valueMatching, placeholderRegexp).toArray();
|
const translatedPlaceholders = matchAll(valueMatching, placeholderRegexp).toArray();
|
||||||
|
|
||||||
if (originalPlaceholders.length !== translatedPlaceholders.length) {
|
if (!ignorePlaceholderMismatch && originalPlaceholders.length !== translatedPlaceholders.length) {
|
||||||
console.warn(
|
console.warn(
|
||||||
" | Mismatching placeholders in",
|
" | Mismatching placeholders in",
|
||||||
path + key,
|
path + key,
|
||||||
@ -66,12 +65,13 @@ function match(originalObj, translatedObj, path = "/") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < files.length; ++i) {
|
for (let i = 0; i < files.length; ++i) {
|
||||||
const filePath = path.join(__dirname, "translations", files[i]);
|
const filename = files[i];
|
||||||
console.log("Processing", files[i]);
|
const filePath = path.join(__dirname, "translations", filename);
|
||||||
|
console.log("Processing", filename);
|
||||||
const translatedContents = fs.readFileSync(filePath).toString("utf-8");
|
const translatedContents = fs.readFileSync(filePath).toString("utf-8");
|
||||||
|
|
||||||
const json = YAML.parse(translatedContents);
|
const json = YAML.parse(translatedContents);
|
||||||
match(original, json, "/");
|
match(original, json, "/", filename.toLowerCase().includes("zh-cn"));
|
||||||
|
|
||||||
const stringified = YAML.stringify(json, {
|
const stringified = YAML.stringify(json, {
|
||||||
indent: 4,
|
indent: 4,
|
||||||
|
@ -6,45 +6,19 @@ steamPage:
|
|||||||
لعبة شيبز (أشكال) هي لعبة مريحة تقوم فيها ببناء مصانع ووتشغيلها آليا
|
لعبة شيبز (أشكال) هي لعبة مريحة تقوم فيها ببناء مصانع ووتشغيلها آليا
|
||||||
لصناعة أشكال هندسية.
|
لصناعة أشكال هندسية.
|
||||||
|
|
||||||
مع التقدم في المستوى، تزداد الأشكال تعقيداً، فيتوجب عليك التوسع في الخريطة اللانهائية، وذلك ليس كافياً للتقدم في مستوى اللعبة حيث عليك صناعة المزيد بأضعاف مضاعفة لتلبية الطلب، الشيء
|
مع التقدم في المستوى، تزداد الأشكال تعقيداً، فيتوجب عليك التوسع في الخريطة اللانهائية، وذلك ليس كافياً للتقدم في مستوى اللعبة حيث عليك صناعة المزيد بأضعاف مضاعفة لتلبية الطلب، الشيء الوحيد الذي يمكنه مساعدتك هو التوسع.
|
||||||
الوحيد الذي يمكنه مساعدتك هو التوسع.
|
|
||||||
|
|
||||||
بينما في البداية تقوم بصناعة أشكال مختلفة، تتطلب منك المراحل المتقدمة تلوين هذه الأشكال، حيث يتوجب عليك استخراج وخلط الألوان.
|
بينما في البداية تقوم بصناعة أشكال مختلفة، تتطلب منك المراحل المتقدمة تلوين هذه الأشكال، حيث يتوجب عليك استخراج وخلط الألوان.
|
||||||
|
|
||||||
عند شراءك اللعبة على ستيم (Steam) تحصل على الإصدار الكامل للعبة، ولكن يمكن أيضاً لعبة نسخة تجريبية على موقع shapez.io ثم يمكنك القرار لاحقا
|
عند شراءك اللعبة على ستيم (Steam) تحصل على الإصدار الكامل للعبة، ولكن يمكن أيضاً لعبة نسخة تجريبية على موقع shapez.io ثم يمكنك القرار لاحقا
|
||||||
title_advantages: ميزات نسخة الحاسوب
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 New Level</b> for a total of 26 levels
|
and time has flown by.
|
||||||
- <b>18 New Buildings</b> for a fully automated factory!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>Unlimited Upgrade Tiers</b> for many hours of fun!
|
how to make a computer in shapez.io
|
||||||
- <b>Wires Update</b> for an entirely new dimension!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Dark Mode</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Unlimited Savegames
|
efficient.
|
||||||
- Unlimited Markers
|
|
||||||
- Support me! ❤️
|
|
||||||
title_future: Planned Content
|
|
||||||
planned:
|
|
||||||
- Blueprint Library (Standalone Exclusive)
|
|
||||||
- Steam Achievements
|
|
||||||
- Puzzle Mode
|
|
||||||
- Minimap
|
|
||||||
- Mods
|
|
||||||
- Sandbox mode
|
|
||||||
- ... and a lot more!
|
|
||||||
title_open_source: This game is open source!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Official Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Help translate
|
|
||||||
text_open_source: >-
|
|
||||||
Anybody can contribute, I'm actively involved in the community and
|
|
||||||
attempt to review all suggestions and take feedback into consideration
|
|
||||||
where possible.
|
|
||||||
|
|
||||||
Be sure to check out my trello board for the full roadmap!
|
|
||||||
global:
|
global:
|
||||||
loading: Loading
|
loading: Loading
|
||||||
error: Error
|
error: Error
|
||||||
@ -355,9 +329,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 New Buildings
|
title: 18 New Buildings
|
||||||
desc: Fully automate your factory!
|
desc: Fully automate your factory!
|
||||||
savegames:
|
|
||||||
title: ∞ Savegames
|
|
||||||
desc: As many as your heart desires!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade Tiers
|
title: ∞ Upgrade Tiers
|
||||||
desc: This demo version has only 5!
|
desc: This demo version has only 5!
|
||||||
@ -373,6 +344,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Support me
|
title: Support me
|
||||||
desc: I develop it in my spare time!
|
desc: I develop it in my spare time!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Belts, Distributor & Tunnels
|
name: Belts, Distributor & Tunnels
|
||||||
@ -976,6 +950,10 @@ keybindings:
|
|||||||
comparator: Compare
|
comparator: Compare
|
||||||
item_producer: Item Producer (Sandbox)
|
item_producer: Item Producer (Sandbox)
|
||||||
copyWireValue: "Wires: Copy value below cursor"
|
copyWireValue: "Wires: Copy value below cursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: About this Game
|
title: About this Game
|
||||||
body: >-
|
body: >-
|
||||||
|
@ -14,40 +14,14 @@ steamPage:
|
|||||||
Mentre que al principi només processes formes, més envant les hauràs de colorejar, pel que necessitaràs extreure y mesclar colors!
|
Mentre que al principi només processes formes, més envant les hauràs de colorejar, pel que necessitaràs extreure y mesclar colors!
|
||||||
|
|
||||||
Si compres el joc a Steam tendràs accés al joc complet, però també pots jugar a la demo a shapez.io primer i decidir-te més tard!
|
Si compres el joc a Steam tendràs accés al joc complet, però també pots jugar a la demo a shapez.io primer i decidir-te més tard!
|
||||||
title_advantages: "Avantatges de la versió completa:"
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 Nous nivells</b> per a un total de 26 nivells
|
and time has flown by.
|
||||||
- <b>18 Nous edificis</b> per construir una fàbrica completament
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
automatitzada!
|
how to make a computer in shapez.io
|
||||||
- <b>20 Nivells de millora</b> per més hores de diversió!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Actualització de Cablejat</b> per a una dimensió totalment nova!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- <b>Mode Oscur</b>!
|
efficient.
|
||||||
- Pots guardar jocs il·limitats
|
|
||||||
- Marcadors il·limitats
|
|
||||||
- Em dones suport! ❤️
|
|
||||||
title_future: Contingut Planejat
|
|
||||||
planned:
|
|
||||||
- Llibreria de plànols (Exclusiu de la versió completa)
|
|
||||||
- Trofeus d'Steam
|
|
||||||
- Mode Puzzle
|
|
||||||
- Minimapa
|
|
||||||
- Mods
|
|
||||||
- Mode Sandbox
|
|
||||||
- ... i mot més!
|
|
||||||
title_open_source: Aquest joc és de codi obert!
|
|
||||||
title_links: Enllaços
|
|
||||||
links:
|
|
||||||
discord: Discord Oficial
|
|
||||||
roadmap: Full de ruta
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Codi font (GitHub)
|
|
||||||
translate: Ajuda a traduir-lo
|
|
||||||
text_open_source: >-
|
|
||||||
Qualsevol pot contribuir, i estic activament involucrat en la comunitat
|
|
||||||
i intent prestar atenció a tots els suggeriments i tenir en compte tots
|
|
||||||
el comentaris.
|
|
||||||
|
|
||||||
Assegura't de mirar el meu tauler de Trello per al full de ruta complet!
|
|
||||||
global:
|
global:
|
||||||
loading: Carregant
|
loading: Carregant
|
||||||
error: Error
|
error: Error
|
||||||
@ -365,9 +339,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Nous edificis
|
title: 18 Nous edificis
|
||||||
desc: Automatitza la teva fàbrica completament!
|
desc: Automatitza la teva fàbrica completament!
|
||||||
savegames:
|
|
||||||
title: Guarda ∞ partides
|
|
||||||
desc: Tantes com vulguis!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Nivells de millora
|
title: ∞ Nivells de millora
|
||||||
desc: La versió demo només en té 5!
|
desc: La versió demo només en té 5!
|
||||||
@ -383,6 +354,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Dona'm suport
|
title: Dona'm suport
|
||||||
desc: EL desenvolupo en el meu temps lliure!
|
desc: EL desenvolupo en el meu temps lliure!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Cintes transportadores, Distribuidors i Túnels
|
name: Cintes transportadores, Distribuidors i Túnels
|
||||||
@ -1003,6 +977,10 @@ keybindings:
|
|||||||
comparator: Comparador
|
comparator: Comparador
|
||||||
item_producer: Productor d'items (Sandbox)
|
item_producer: Productor d'items (Sandbox)
|
||||||
copyWireValue: "Cables: Copiar valor davall el cursor"
|
copyWireValue: "Cables: Copiar valor davall el cursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Sobre aquest Joc
|
title: Sobre aquest Joc
|
||||||
body: >-
|
body: >-
|
||||||
|
@ -5,46 +5,19 @@ steamPage:
|
|||||||
intro: >-
|
intro: >-
|
||||||
Máte rádi automatizaci? Tak to jste na správném místě!
|
Máte rádi automatizaci? Tak to jste na správném místě!
|
||||||
|
|
||||||
shapez.io je relaxační hra, ve které musíte stavět továrny na automatizaci výroby geometrických tvarů. Jak se zvyšuje úroveň, tvary se stávají
|
shapez.io je relaxační hra, ve které musíte stavět továrny na automatizaci výroby geometrických tvarů. Jak se zvyšuje úroveň, tvary se stávají stále složitějšími a vy se musíte rozšířit po nekonečné mapě.
|
||||||
stále složitějšími a vy se musíte rozšířit po nekonečné mapě.
|
|
||||||
|
|
||||||
A jako by to nestačilo, musíte také produkovat exponenciálně více, abyste uspokojili požadavky - jediná věc, která pomáhá, je škálování! Zatímco
|
A jako by to nestačilo, musíte také produkovat exponenciálně více, abyste uspokojili požadavky - jediná věc, která pomáhá, je škálování! Zatímco na začátku tvary pouze zpracováváte, později je musíte obarvit - těžbou a mícháním barev!
|
||||||
na začátku tvary pouze zpracováváte, později je musíte obarvit - těžbou a mícháním barev!
|
|
||||||
|
|
||||||
Koupením hry na platformě Steam získáte přístup k plné verzi hry, ale také můžete nejdříve hrát demo verzi na shapez.io a až potom se rozhodnout!
|
Koupením hry na platformě Steam získáte přístup k plné verzi hry, ale také můžete nejdříve hrát demo verzi na shapez.io a až potom se rozhodnout!
|
||||||
title_advantages: Výhody samostatné verze hry
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 Nových úrovní</b> z celkových 26 úrovní
|
and time has flown by.
|
||||||
- <b>18 Nových budov</b> pro plně automatizovanou továrnu!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 Řad vylepšení</b> pro mnoho hodin zábavy!
|
how to make a computer in shapez.io
|
||||||
- <b>Wires Update</b> pro zcela novou dimenzi!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Tmavý mód</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Neomezený počet uložených her
|
efficient.
|
||||||
- Neomezené značky
|
|
||||||
- Podpořte mě! ❤️
|
|
||||||
title_future: Plánovaný obsah
|
|
||||||
planned:
|
|
||||||
- Blueprintová knihovna
|
|
||||||
- Steam Achievements
|
|
||||||
- Puzzle mód
|
|
||||||
- Minimapa
|
|
||||||
- Módy
|
|
||||||
- Sandbox mód
|
|
||||||
- ... a mnohem více!
|
|
||||||
title_open_source: Tato hra je open source!
|
|
||||||
text_open_source: >-
|
|
||||||
Kdokoli může přispět, jsem aktivně zapojený do komunity, pokouším se
|
|
||||||
zkontrolovat všechny návrhy a vzít v úvahu zpětnou vazbu všude, kde je
|
|
||||||
to možné.
|
|
||||||
|
|
||||||
Nezapomeňte se podívat na můj trello board pro kompletní plán!
|
|
||||||
title_links: Odkazy
|
|
||||||
links:
|
|
||||||
discord: Oficiální Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Zdrojový kód (GitHub)
|
|
||||||
translate: Pomozte přeložit hru!
|
|
||||||
global:
|
global:
|
||||||
loading: Načítání
|
loading: Načítání
|
||||||
error: Chyba
|
error: Chyba
|
||||||
@ -200,12 +173,11 @@ dialogs:
|
|||||||
desc: Zde můžete přejmenovat svoji uloženou hru.
|
desc: Zde můžete přejmenovat svoji uloženou hru.
|
||||||
tutorialVideoAvailable:
|
tutorialVideoAvailable:
|
||||||
title: Dostupný tutoriál
|
title: Dostupný tutoriál
|
||||||
desc: Pro tuto úroveň je k dispozici tutoriál! Chtěli byste se na
|
desc: Pro tuto úroveň je k dispozici tutoriál! Chtěli byste se na něj podívat?
|
||||||
něj podívat?
|
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: Dostupný tutoriál
|
title: Dostupný tutoriál
|
||||||
desc: Pro tuto úroveň je k dispozici tutoriál, ale je dostupný
|
desc: Pro tuto úroveň je k dispozici tutoriál, ale je dostupný pouze v
|
||||||
pouze v angličtině. Chtěli byste se na něj podívat?
|
angličtině. Chtěli byste se na něj podívat?
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: Posun mapy
|
moveMap: Posun mapy
|
||||||
@ -291,8 +263,8 @@ ingame:
|
|||||||
interactiveTutorial:
|
interactiveTutorial:
|
||||||
title: Tutoriál
|
title: Tutoriál
|
||||||
hints:
|
hints:
|
||||||
1_1_extractor: Umístěte <strong>extraktor</strong> na naleziště<strong>kruhového
|
1_1_extractor: Umístěte <strong>extraktor</strong> na naleziště
|
||||||
tvaru</strong> a vytěžte jej!
|
<strong>kruhového tvaru</strong> a vytěžte jej!
|
||||||
1_2_conveyor: "Připojte extraktor pomocí <strong>dopravníkového pásu</strong> k
|
1_2_conveyor: "Připojte extraktor pomocí <strong>dopravníkového pásu</strong> k
|
||||||
vašemu HUBu!<br><br>Tip: <strong>Klikněte a táhněte</strong>
|
vašemu HUBu!<br><br>Tip: <strong>Klikněte a táhněte</strong>
|
||||||
myší pro položení více pásů!"
|
myší pro položení více pásů!"
|
||||||
@ -300,22 +272,23 @@ ingame:
|
|||||||
a pásy, abyste dosáhli cíle rychleji.<br><br>Tip: Chcete-li
|
a pásy, abyste dosáhli cíle rychleji.<br><br>Tip: Chcete-li
|
||||||
umístit více extraktorů, podržte <strong>SHIFT</strong>. Pomocí
|
umístit více extraktorů, podržte <strong>SHIFT</strong>. Pomocí
|
||||||
<strong>R</strong> je můžete otočit."
|
<strong>R</strong> je můžete otočit."
|
||||||
2_1_place_cutter: "Teď umístěte <strong>pilu</strong> k rozřezání kruhového tvaru na dvě
|
2_1_place_cutter: "Teď umístěte <strong>pilu</strong> k rozřezání kruhového
|
||||||
poloviny!<br><br> PS: Pila řeže tvary vždy <strong>svisle na
|
tvaru na dvě poloviny!<br><br> PS: Pila řeže tvary vždy
|
||||||
poloviny</strong> bez ohledu na její orientaci."
|
<strong>svisle na poloviny</strong> bez ohledu na její
|
||||||
2_2_place_trash:
|
orientaci."
|
||||||
Pila se může <strong>zaseknout a zastavit vaši produkci</strong>!<br><br> Použijte
|
2_2_place_trash: Pila se může <strong>zaseknout a zastavit vaši
|
||||||
<strong>koš</strong> ke smazání (!) nepotřebných
|
produkci</strong>!<br><br> Použijte <strong>koš</strong> ke
|
||||||
částí tvarů.
|
smazání (!) nepotřebných částí tvarů.
|
||||||
2_3_more_cutters: "Dobrá práce! Teď postavte <strong>více pil</strong> pro zrychlení
|
2_3_more_cutters: "Dobrá práce! Teď postavte <strong>více pil</strong> pro
|
||||||
tohoto pomalého procesu!<br><br> PS: Použijte <strong>0-9
|
zrychlení tohoto pomalého procesu!<br><br> PS: Použijte
|
||||||
na klávesnici</strong> pro rychlejší přístup k budovám!"
|
<strong>0-9 na klávesnici</strong> pro rychlejší přístup k
|
||||||
|
budovám!"
|
||||||
3_1_rectangles: "Teď vytěžte nějaké obdélníkové tvary! <strong>Postavte 4
|
3_1_rectangles: "Teď vytěžte nějaké obdélníkové tvary! <strong>Postavte 4
|
||||||
extraktory</strong> a připojte je k HUBu.<br><br> PS:
|
extraktory</strong> a připojte je k HUBu.<br><br> PS: Podržením
|
||||||
Podržením klávesy <strong>SHIFT</strong> a tažením pásu aktivujete
|
klávesy <strong>SHIFT</strong> a tažením pásu aktivujete
|
||||||
plánovač pásů!"
|
plánovač pásů!"
|
||||||
21_1_place_quad_painter: Postavte <strong>čtyřnásobný barvič</strong> a získejte nějaké
|
21_1_place_quad_painter: Postavte <strong>čtyřnásobný barvič</strong> a získejte
|
||||||
<strong>kruhové tvary</strong>, <strong>bílou</strong> a
|
nějaké <strong>kruhové tvary</strong>, <strong>bílou</strong> a
|
||||||
<strong>červenou</strong> barvu!
|
<strong>červenou</strong> barvu!
|
||||||
21_2_switch_to_wires: Změňte vrstvy na vrstvu kabelů stisknutím klávesy
|
21_2_switch_to_wires: Změňte vrstvy na vrstvu kabelů stisknutím klávesy
|
||||||
<strong>E</strong>!<br><br> Pak <strong>připojte všechny čtyři
|
<strong>E</strong>!<br><br> Pak <strong>připojte všechny čtyři
|
||||||
@ -357,9 +330,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Nových budov
|
title: 18 Nových budov
|
||||||
desc: Plně automatizujte svou továrnu!
|
desc: Plně automatizujte svou továrnu!
|
||||||
savegames:
|
|
||||||
title: ∞ Uložených her
|
|
||||||
desc: Tolik, kolik vaše srdce touží!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ vylepšení
|
title: ∞ vylepšení
|
||||||
desc: Tato demo verze má pouze 5!
|
desc: Tato demo verze má pouze 5!
|
||||||
@ -375,6 +345,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Podpořte mě
|
title: Podpořte mě
|
||||||
desc: Vyvíjím to ve svém volném čase!
|
desc: Vyvíjím to ve svém volném čase!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Pásy, distribuce a tunely
|
name: Pásy, distribuce a tunely
|
||||||
@ -404,7 +377,7 @@ buildings:
|
|||||||
name: Extraktor
|
name: Extraktor
|
||||||
description: Umístěte na naleziště tvaru nebo barvy pro zahájení těžby.
|
description: Umístěte na naleziště tvaru nebo barvy pro zahájení těžby.
|
||||||
chainable:
|
chainable:
|
||||||
name: Extraktor (Navazující)
|
name: Extraktor (Řetěz)
|
||||||
description: Umístěte na naleziště tvaru nebo barvy pro zahájení těžby. Lze
|
description: Umístěte na naleziště tvaru nebo barvy pro zahájení těžby. Lze
|
||||||
zapojit po skupinách.
|
zapojit po skupinách.
|
||||||
underground_belt:
|
underground_belt:
|
||||||
@ -449,10 +422,10 @@ buildings:
|
|||||||
name: Barvič
|
name: Barvič
|
||||||
description: Obarví celý tvar v levém vstupu barvou z pravého vstupu.
|
description: Obarví celý tvar v levém vstupu barvou z pravého vstupu.
|
||||||
double:
|
double:
|
||||||
name: Barvič (dvojnásobný)
|
name: Barvič (2x)
|
||||||
description: Obarví tvary z levých vstupů barvou z horního vstupu.
|
description: Obarví tvary z levých vstupů barvou z horního vstupu.
|
||||||
quad:
|
quad:
|
||||||
name: Barvič (čtyřnásobný)
|
name: Barvič (4x)
|
||||||
description: Umožňuje obarvit každou čtvrtinu tvaru individuálně. Jen čtvrtiny
|
description: Umožňuje obarvit každou čtvrtinu tvaru individuálně. Jen čtvrtiny
|
||||||
se vstupy barev s <strong>logickým signálem</strong> na vrstvě
|
se vstupy barev s <strong>logickým signálem</strong> na vrstvě
|
||||||
kabelů budou obarveny!
|
kabelů budou obarveny!
|
||||||
@ -475,16 +448,16 @@ buildings:
|
|||||||
name: Vyvažovač
|
name: Vyvažovač
|
||||||
description: Multifunkční - Rovnoměrně rozděluje vstupy na výstupech.
|
description: Multifunkční - Rovnoměrně rozděluje vstupy na výstupech.
|
||||||
merger:
|
merger:
|
||||||
name: Spojovač (kompaktní)
|
name: Spojovač
|
||||||
description: Spojí dva pásy do jednoho.
|
description: Spojí dva pásy do jednoho.
|
||||||
merger-inverse:
|
merger-inverse:
|
||||||
name: Spojovač (kompaktní)
|
name: Spojovač
|
||||||
description: Spojí dva pásy do jednoho.
|
description: Spojí dva pásy do jednoho.
|
||||||
splitter:
|
splitter:
|
||||||
name: Rozdělovač (kompaktní)
|
name: Rozdělovač
|
||||||
description: Rozdělí jeden pás na dva.
|
description: Rozdělí jeden pás na dva.
|
||||||
splitter-inverse:
|
splitter-inverse:
|
||||||
name: Rozdělovač (kompaktní)
|
name: Rozdělovač
|
||||||
description: Rozdělí jeden pás na dva.
|
description: Rozdělí jeden pás na dva.
|
||||||
storage:
|
storage:
|
||||||
default:
|
default:
|
||||||
@ -558,12 +531,12 @@ buildings:
|
|||||||
name: Virtuální rotor
|
name: Virtuální rotor
|
||||||
description: Virtuálně otáčí tvary o 90 stupňů po směru hodinových ručiček.
|
description: Virtuálně otáčí tvary o 90 stupňů po směru hodinových ručiček.
|
||||||
unstacker:
|
unstacker:
|
||||||
name: Virtuální extrahátor
|
name: Virt. extrahátor
|
||||||
description: Virtuálně extrahuje nejvyšší vrstvu do pravého výstupu a zbývající
|
description: Virtuálně extrahuje nejvyšší vrstvu do pravého výstupu a zbývající
|
||||||
do levé.
|
do levé.
|
||||||
stacker:
|
stacker:
|
||||||
name: Virtuální kombinátor
|
name: Virt. kombinátor
|
||||||
description: Virtuálně Spojí tvary dohromady. Pokud nemohou být spojeny, pravý
|
description: Virtuálně spojí tvary dohromady. Pokud nemohou být spojeny, pravý
|
||||||
tvar je položen na levý.
|
tvar je položen na levý.
|
||||||
painter:
|
painter:
|
||||||
name: Virtuální barvič
|
name: Virtuální barvič
|
||||||
@ -611,12 +584,12 @@ storyRewards:
|
|||||||
budovami a pásy.
|
budovami a pásy.
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: Otáčení II
|
title: Otáčení II
|
||||||
desc: Odemkli jste variantu <strong>rotoru</strong> - Umožňuje vám otáčet
|
desc: Odemkli jste variantu <strong>rotoru</strong> - Umožňuje vám otáčet proti
|
||||||
proti směru hodinových ručiček. Vyberte rotor a <strong>zmáčkněte
|
směru hodinových ručiček. Vyberte rotor a <strong>zmáčkněte 'T' pro
|
||||||
'T' pro přepnutí mezi variantami</strong>!
|
přepnutí mezi variantami</strong>!
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Napojovací extraktor
|
title: Řetězový extraktor
|
||||||
desc: "Právě jste odemkli <strong>napojovací extraktor</strong>! Může
|
desc: "Právě jste odemkli <strong>řetězový extraktor</strong>! Může
|
||||||
<strong>předat své zdroje</strong> ostatním extraktorům, čímž můžete
|
<strong>předat své zdroje</strong> ostatním extraktorům, čímž můžete
|
||||||
efektivněji těžit více zdrojů!<br><br> PS: Starý extraktor bude od
|
efektivněji těžit více zdrojů!<br><br> PS: Starý extraktor bude od
|
||||||
teď nahrazen ve vašem panelu nástrojů!"
|
teď nahrazen ve vašem panelu nástrojů!"
|
||||||
@ -641,12 +614,13 @@ storyRewards:
|
|||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Volná hra
|
title: Volná hra
|
||||||
desc: Zvládli jste to! Odemkli jste <strong>mód volné hry</strong>! To znamená,
|
desc: Zvládli jste to! Odemkli jste <strong>mód volné hry</strong>! To znamená,
|
||||||
že od teď budou tvary <strong>náhodně</strong> generovány!<br><br> Vzhledem k
|
že od teď budou tvary <strong>náhodně</strong> generovány!<br><br>
|
||||||
tomu, že Hub nadále potřebuje <strong>propustnost</strong>,
|
Vzhledem k tomu, že Hub nadále potřebuje
|
||||||
především doporučuji postavit továrnu, která automaticky doručí
|
<strong>propustnost</strong>, především doporučuji postavit továrnu,
|
||||||
požadovaný tvar!<br><br> Hub vysílá požadovaný tvar na vrstvu
|
která automaticky doručí požadovaný tvar!<br><br> Hub vysílá
|
||||||
kabelů, takže jediné co musíte udělat, je analyzovat tvar a
|
požadovaný tvar na vrstvu kabelů, takže jediné co musíte udělat, je
|
||||||
automaticky nastavit svou továrnu dle této analýzy.
|
analyzovat tvar a automaticky nastavit svou továrnu dle této
|
||||||
|
analýzy.
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Plány
|
title: Plány
|
||||||
desc: Nyní můžete <strong>kopírovat a vkládat</strong> části továrny! Vyberte
|
desc: Nyní můžete <strong>kopírovat a vkládat</strong> části továrny! Vyberte
|
||||||
@ -656,8 +630,8 @@ storyRewards:
|
|||||||
(Jsou to ty které jste právě dodali).
|
(Jsou to ty které jste právě dodali).
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Další úroveň
|
title: Další úroveň
|
||||||
desc: "Tato úroveň vám nic neodemkla, ale s další to přijde! <br><br> PS:
|
desc: "Tato úroveň vám nic neodemkla, ale s další to přijde! <br><br> PS: Radši
|
||||||
Radši neničte vaše stávající továrny - budete potřebovat
|
neničte vaše stávající továrny - budete potřebovat
|
||||||
<strong>všechny</strong> produkované tvary později na
|
<strong>všechny</strong> produkované tvary později na
|
||||||
<strong>odemčení vylepšení</strong>!"
|
<strong>odemčení vylepšení</strong>!"
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
@ -665,8 +639,8 @@ storyRewards:
|
|||||||
desc: Gratuluji! Mimochodem, více obsahu najdete v plné verzi!
|
desc: Gratuluji! Mimochodem, více obsahu najdete v plné verzi!
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Vyvažovač
|
title: Vyvažovač
|
||||||
desc: Multifunkční <strong>vyvažovač</strong> byl odemknut - Může
|
desc: Multifunkční <strong>vyvažovač</strong> byl odemknut - Může být použit ke
|
||||||
být použit ke zvětšení vašich továren <strong>rozdělováním a spojováním
|
zvětšení vašich továren <strong>rozdělováním a spojováním
|
||||||
předmětů</strong> na několik pásu!
|
předmětů</strong> na několik pásu!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: Kompaktní spojovač
|
title: Kompaktní spojovač
|
||||||
@ -717,10 +691,10 @@ storyRewards:
|
|||||||
desc: "Právě jste odemkli <strong>vrstvu kabelů</strong>: Je to samostatná
|
desc: "Právě jste odemkli <strong>vrstvu kabelů</strong>: Je to samostatná
|
||||||
vrstva navíc oproti běžné vrstvě a představuje spoustu nových
|
vrstva navíc oproti běžné vrstvě a představuje spoustu nových
|
||||||
možností!<br><br> Do začátku jsem zpřístupnil <strong>čtyřnásobný
|
možností!<br><br> Do začátku jsem zpřístupnil <strong>čtyřnásobný
|
||||||
barvič</strong> - Připojte vstupy, které byste chtěli obarvit
|
barvič</strong> - Připojte vstupy, které byste chtěli obarvit na
|
||||||
na vrstvě kabelů!<br><br> Pro přepnutí mezi vrstvami stiskněte klávesu
|
vrstvě kabelů!<br><br> Pro přepnutí mezi vrstvami stiskněte klávesu
|
||||||
<strong>E</strong>. <br><br> PS: <strong>Aktivujte nápovědy</strong> v
|
<strong>E</strong>. <br><br> PS: <strong>Aktivujte nápovědy</strong>
|
||||||
nastavení pro spuštění tutoriálu o kabelech!"
|
v nastavení pro spuštění tutoriálu o kabelech!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Filtr předmětů
|
title: Filtr předmětů
|
||||||
desc: Právě jste odemkli <strong>filtr předmětů</strong>! Nasměruje předměty buď
|
desc: Právě jste odemkli <strong>filtr předmětů</strong>! Nasměruje předměty buď
|
||||||
@ -794,8 +768,9 @@ settings:
|
|||||||
SHIFT.
|
SHIFT.
|
||||||
offerHints:
|
offerHints:
|
||||||
title: Tipy & Nápovědy
|
title: Tipy & Nápovědy
|
||||||
description: Pokud bude zapnuté, budou se ve hře zobrazovat tipy a nápovědy. Také
|
description: Pokud bude zapnuté, budou se ve hře zobrazovat tipy a nápovědy.
|
||||||
skryje určité elementy na obrazovce pro jednodušší osvojení hry.
|
Také skryje určité elementy na obrazovce pro jednodušší osvojení
|
||||||
|
hry.
|
||||||
movementSpeed:
|
movementSpeed:
|
||||||
title: Rychlost kamery
|
title: Rychlost kamery
|
||||||
description: Mění, jak rychle se kamera posouvá při použití klávesnice.
|
description: Mění, jak rychle se kamera posouvá při použití klávesnice.
|
||||||
@ -862,8 +837,8 @@ settings:
|
|||||||
title: Uvolní kurzor při kliknutím pravým tlačítkem
|
title: Uvolní kurzor při kliknutím pravým tlačítkem
|
||||||
description: Povoleno dle výchozího nastavení, uvolní kurzor pokaždé co kliknete
|
description: Povoleno dle výchozího nastavení, uvolní kurzor pokaždé co kliknete
|
||||||
pravým tlačítkem, když máte budovu vybranou pro pokládání. Při
|
pravým tlačítkem, když máte budovu vybranou pro pokládání. Při
|
||||||
vypnutí, můžete smazat budovy při kliknutí pravým tlačítkem spolu
|
vypnutí, můžete smazat budovy při kliknutí pravým tlačítkem
|
||||||
s položením dalších budov.
|
spolu s položením dalších budov.
|
||||||
lowQualityTextures:
|
lowQualityTextures:
|
||||||
title: Nižší kvalita textur (Horší vzhled)
|
title: Nižší kvalita textur (Horší vzhled)
|
||||||
description: Používá nižší kvalitu textur pro zlepšení výkonu. Toto nastavení
|
description: Používá nižší kvalitu textur pro zlepšení výkonu. Toto nastavení
|
||||||
@ -887,12 +862,11 @@ settings:
|
|||||||
obrazovky. Rychlost záleží na nastavení rychlosti pohybu.
|
obrazovky. Rychlost záleží na nastavení rychlosti pohybu.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Přiblížení ke kurzoru
|
title: Přiblížení ke kurzoru
|
||||||
description: Při zapnutí dojde k přibližování ve směru polohy
|
description: Při zapnutí dojde k přibližování ve směru polohy kurzoru, jinak ve
|
||||||
kurzoru, jinak ve středu obrazovky.
|
středu obrazovky.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Velikost zdrojů na mapě
|
title: Velikost zdrojů na mapě
|
||||||
description: Určuje velikost ikon tvarů na náhledu mapy (při
|
description: Určuje velikost ikon tvarů na náhledu mapy (při oddálení).
|
||||||
oddálení).
|
|
||||||
rangeSliderPercentage: <amount> %
|
rangeSliderPercentage: <amount> %
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Klávesové zkratky
|
title: Klávesové zkratky
|
||||||
@ -967,22 +941,24 @@ keybindings:
|
|||||||
comparator: Porovnávač
|
comparator: Porovnávač
|
||||||
item_producer: Výrobník předmětů (Sandbox)
|
item_producer: Výrobník předmětů (Sandbox)
|
||||||
copyWireValue: "Kabely: Zkopírovat hodnotu pod kurzorem"
|
copyWireValue: "Kabely: Zkopírovat hodnotu pod kurzorem"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: O hře
|
title: O hře
|
||||||
body: >-
|
body: >-
|
||||||
Tato hra je open source. Je vyvíjená <a
|
Tato hra je open source. Je vyvíjená <a href="https://github.com/tobspr"
|
||||||
href="https://github.com/tobspr" target="_blank">Tobiasem Springerem</a>
|
target="_blank">Tobiasem Springerem</a> (česky neumí, ale je fakt frajer
|
||||||
(česky neumí, ale je fakt frajer :) ).<br><br>
|
:) ).<br><br>
|
||||||
|
|
||||||
Pokud se chceš na hře podílet, podívej se na <a href="<githublink>" target="_blank">shapez.io na githubu</a>.<br><br>
|
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 možná ani bez skvělé Discord komunity okolo Tobiasových her - Vážně by ses měl přijít mrknout na
|
Tato hra by nebyla možná ani 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>
|
||||||
<a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
|
|
||||||
|
|
||||||
Soundtrack udělal <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Je úžasnej.<br><br>
|
Soundtrack udělal <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Je úžasnej.<br><br>
|
||||||
|
|
||||||
V neposlední řadě by Tobias (já jen tlumočím) rád poděkoval skvělému kamarádovi
|
V neposlední řadě by Tobias (já jen tlumočím) rád poděkoval skvělému kamarádovi <a href="https://github.com/niklas-dahl" target="_blank">Niklasi</a> - Bez hodin strávených u Factoria by tato hra nikdy neexistovala.
|
||||||
<a href="https://github.com/niklas-dahl" target="_blank">Niklasi</a> - Bez hodin strávených u Factoria by tato hra nikdy neexistovala.
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Seznam změn
|
title: Seznam změn
|
||||||
demo:
|
demo:
|
||||||
@ -1008,7 +984,7 @@ tips:
|
|||||||
- Můžete proplétat různé úrovně tunelů.
|
- Můžete proplétat různé úrovně tunelů.
|
||||||
- Snažte se postavit kompaktní továrny - vyplatí se to!
|
- Snažte se postavit kompaktní továrny - vyplatí se to!
|
||||||
- Barvič má zrcadlově otočenou variantu, kterou můžete vybrat klávesou
|
- Barvič má zrcadlově otočenou variantu, kterou můžete vybrat klávesou
|
||||||
<b>T</b>
|
<b>T</b>.
|
||||||
- Užití správné kombinace vylepšení maximalizuje efektivitu.
|
- Užití správné kombinace vylepšení maximalizuje efektivitu.
|
||||||
- Na maximální úrovní, 5 extraktorů zaplní jeden celý pás.
|
- Na maximální úrovní, 5 extraktorů zaplní jeden celý pás.
|
||||||
- Nezapomeňte na tunely!
|
- Nezapomeňte na tunely!
|
||||||
@ -1019,7 +995,7 @@ tips:
|
|||||||
- Smícháním všech 3 barev získáte bílou barvu.
|
- Smícháním všech 3 barev získáte bílou barvu.
|
||||||
- Sklad preferuje levý výstup.
|
- Sklad preferuje levý výstup.
|
||||||
- Investujte čas pro vytvoření opakovatelných designů - ulehčí vám to
|
- Investujte čas pro vytvoření opakovatelných designů - ulehčí vám to
|
||||||
pozdější expanzy!
|
pozdější expanzi!
|
||||||
- Držení klávesy <b>SHIFT</b> umožňuje postavit více budov stejného typu.
|
- Držení klávesy <b>SHIFT</b> umožňuje postavit více budov stejného typu.
|
||||||
- Můžete podržet klávesu <b>ALT</b> k obrácení směru pokládaných pásů.
|
- Můžete podržet klávesu <b>ALT</b> k obrácení směru pokládaných pásů.
|
||||||
- Efektivita je klíčová!
|
- Efektivita je klíčová!
|
||||||
|
@ -14,39 +14,14 @@ steamPage:
|
|||||||
Mens du i starten kun laver former, skal du senere farvelægge dem - for at gøre dette skal du udvinde og blande farver!
|
Mens du i starten kun laver former, skal du senere farvelægge dem - for at gøre dette skal du udvinde og blande farver!
|
||||||
|
|
||||||
At købe spllet på Steam, giver dig adgang til det fulde spil, men du kan også spille en demo version på shapez.io og vælge senere!
|
At købe spllet på Steam, giver dig adgang til det fulde spil, men du kan også spille en demo version på shapez.io og vælge senere!
|
||||||
title_advantages: Steam version Fordele
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 Nye Niveauer</b> for i alt 26 niveauer
|
and time has flown by.
|
||||||
- <b>18 Nye Bygninger</b> for en fuldt autmaticeret fabrik!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 Upgraderings Niveauer</b> for mange timers sjov!
|
how to make a computer in shapez.io
|
||||||
- <b>Ledninger Opdatering</b> for en helt ny dimension!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Dark Mode</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Unlimited Savegames
|
efficient.
|
||||||
- Uendelige Markører
|
|
||||||
- Hjælp med at støtte mig! ❤️
|
|
||||||
title_future: Planned Content
|
|
||||||
planned:
|
|
||||||
- Blueprint Library (Standalone Exclusive)
|
|
||||||
- Steam Achievements
|
|
||||||
- Puzzle Mode
|
|
||||||
- Minimap
|
|
||||||
- Mods
|
|
||||||
- Sandbox mode
|
|
||||||
- ... og meget mere!
|
|
||||||
title_open_source: This game is open source!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Official Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Hjælp med oversættelse
|
|
||||||
text_open_source: >-
|
|
||||||
Hvem som helst kan bidrage, jeg er aktivt involveret i fælleskabet og
|
|
||||||
forsøger at gennemgå alle ideer og tager feedback i overvejelse
|
|
||||||
hvor muligt.
|
|
||||||
|
|
||||||
Be sure to check out my trello board for the full roadmap!
|
|
||||||
global:
|
global:
|
||||||
loading: Indlæser
|
loading: Indlæser
|
||||||
error: Fejl
|
error: Fejl
|
||||||
@ -359,9 +334,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Nye Bygninger
|
title: 18 Nye Bygninger
|
||||||
desc: Fully automate your factory!
|
desc: Fully automate your factory!
|
||||||
savegames:
|
|
||||||
title: ∞ Gemte spil
|
|
||||||
desc: Så mange dit hjerte begær!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade Tiers
|
title: ∞ Upgrade Tiers
|
||||||
desc: This demo version has only 5!
|
desc: This demo version has only 5!
|
||||||
@ -377,6 +349,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Støt mig
|
title: Støt mig
|
||||||
desc: Jeg arbejder på det i min fritid!
|
desc: Jeg arbejder på det i min fritid!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Bælter, Fordelere & Tuneller
|
name: Bælter, Fordelere & Tuneller
|
||||||
@ -469,8 +444,9 @@ buildings:
|
|||||||
description: Lader dig transportere energi.
|
description: Lader dig transportere energi.
|
||||||
second:
|
second:
|
||||||
name: Ledning
|
name: Ledning
|
||||||
description: Overfør signaler, som kan være elementer, farver eller boolsk variabler (1 / 0).
|
description: Overfør signaler, som kan være elementer, farver eller boolsk
|
||||||
Forskellig farvet ledninger kan ikke forbindes.
|
variabler (1 / 0). Forskellig farvet ledninger kan ikke
|
||||||
|
forbindes.
|
||||||
balancer:
|
balancer:
|
||||||
default:
|
default:
|
||||||
name: Balancer
|
name: Balancer
|
||||||
@ -983,6 +959,10 @@ keybindings:
|
|||||||
comparator: Compare
|
comparator: Compare
|
||||||
item_producer: Item Producer (Sandbox)
|
item_producer: Item Producer (Sandbox)
|
||||||
copyWireValue: "Wires: Copy value below cursor"
|
copyWireValue: "Wires: Copy value below cursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Om dette spil
|
title: Om dette spil
|
||||||
body: >-
|
body: >-
|
||||||
@ -992,8 +972,7 @@ about:
|
|||||||
|
|
||||||
Hvis du vil kontribuere, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
Hvis du vil kontribuere, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br>
|
||||||
|
|
||||||
Dette spil ville ikke have været muligt uden det fremragende Discord-fælleskab omkring mine spil - Du burde virkelig deltage på
|
Dette spil ville ikke have været muligt uden det fremragende Discord-fælleskab omkring mine spil - Du burde virkelig deltage på <a href="<discordlink>" target="_blank">Discordserveren</a>!<br><br>
|
||||||
<a href="<discordlink>" target="_blank">Discordserveren</a>!<br><br>
|
|
||||||
|
|
||||||
Lydsporet er lavet af <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Han er fantastisk.<br><br>
|
Lydsporet er lavet af <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Han er fantastisk.<br><br>
|
||||||
|
|
||||||
|
@ -7,41 +7,17 @@ steamPage:
|
|||||||
|
|
||||||
shapez.io ist ein entspanntes Spiel, in dem du Fabriken zur automatisierten Produktion von geometrischen Formen bauen musst.
|
shapez.io ist ein entspanntes Spiel, in dem du Fabriken zur automatisierten Produktion von geometrischen Formen bauen musst.
|
||||||
|
|
||||||
Mit steigendem Level werden die Formen immer komplexer, und du musst dich auf der unendlich großen Karte ausbreiten. Das ist noch nicht alles, denn du musst exponentiell mehr produzieren,
|
Mit steigendem Level werden die Formen immer komplexer, und du musst dich auf der unendlich großen Karte ausbreiten. Das ist noch nicht alles, denn du musst exponentiell mehr produzieren, um die Anforderungen zu erfüllen - Da hilft nur skalieren!
|
||||||
um die Anforderungen zu erfüllen - Da hilft nur skalieren!
|
|
||||||
|
|
||||||
Während du am Anfang nur Formen verarbeitest, musst du diese später auch einfärben - Dafür musst du Farben extrahieren und mischen! Der Kauf des Spiels auf Steam gibt dir Zugriff auf die
|
Während du am Anfang nur Formen verarbeitest, musst du diese später auch einfärben - Dafür musst du Farben extrahieren und mischen! Der Kauf des Spiels auf Steam gibt dir Zugriff auf die Vollversion, aber du kannst auch zuerst die Demo auf shapez.io spielen und dich später entscheiden!
|
||||||
Vollversion, aber du kannst auch zuerst die Demo auf shapez.io spielen und dich später entscheiden!
|
what_others_say: Was andere über shapez.io sagen
|
||||||
title_advantages: Vorteile der Vollversion
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
advantages:
|
and time has flown by.
|
||||||
- <b>12 Neue Level</b> für insgesamt 26 Level
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>18 Neue Gebäude</b> für eine komplett automatisierte Fabrik!
|
how to make a computer in shapez.io
|
||||||
- <b>20 Upgrade-Stufen</b> für viele Stunden Spielspaß
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Wires-Update</b> für eine komplett neue Dimension!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- <b>Dark-Mode</b>!
|
efficient.
|
||||||
- Unbegrenzte Speicherstände
|
|
||||||
- Unbegrenzte Wegpunkte
|
|
||||||
- Unterstütze mich! ❤️
|
|
||||||
title_future: Geplante Inhalte
|
|
||||||
planned:
|
|
||||||
- Blaupausen-Bibliothek
|
|
||||||
- Errungenschaften auf Steam
|
|
||||||
- Puzzel-Modus
|
|
||||||
- Minimap
|
|
||||||
- Modunterstützung
|
|
||||||
- Sandkastenmodus
|
|
||||||
- ... und noch viel mehr!
|
|
||||||
title_open_source: Dieses Spiel ist quelloffen!
|
|
||||||
text_open_source: Jeder kann etwas zum Spiel beitragen! Ich engagiere mich aktiv
|
|
||||||
in der Community und versuche alle Vorschläge zu berücksichtigen. Die
|
|
||||||
vollständige Roadmap findet ihr auf meinem Trello-Board!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Offizieller Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Quellcode (GitHub)
|
|
||||||
translate: Hilf beim Übersetzen
|
|
||||||
global:
|
global:
|
||||||
loading: Laden
|
loading: Laden
|
||||||
error: Fehler
|
error: Fehler
|
||||||
@ -356,9 +332,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Neue Gebäude
|
title: 18 Neue Gebäude
|
||||||
desc: Automatisiere deine Fabrik!
|
desc: Automatisiere deine Fabrik!
|
||||||
savegames:
|
|
||||||
title: ∞ Speicherstände
|
|
||||||
desc: So viele dein Herz begehrt!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade-Stufen
|
title: ∞ Upgrade-Stufen
|
||||||
desc: Diese Demo hat nur 5!
|
desc: Diese Demo hat nur 5!
|
||||||
@ -374,6 +347,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Unterstütze Mich
|
title: Unterstütze Mich
|
||||||
desc: Ich entwickle in meiner Freizeit!
|
desc: Ich entwickle in meiner Freizeit!
|
||||||
|
achievements:
|
||||||
|
title: Errungenschaften
|
||||||
|
desc: Hol sie dir alle!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Fließbänder, Verteiler & Tunnel
|
name: Fließbänder, Verteiler & Tunnel
|
||||||
@ -521,7 +497,8 @@ buildings:
|
|||||||
sind.
|
sind.
|
||||||
not:
|
not:
|
||||||
name: NICHT-Gatter
|
name: NICHT-Gatter
|
||||||
description: Kehrt den Wert um. Macht aus einer "1" eine "0" und eine "0" aus einer "1".
|
description: Kehrt den Wert um. Macht aus einer "1" eine "0" und eine "0" aus
|
||||||
|
einer "1".
|
||||||
xor:
|
xor:
|
||||||
name: XODER-Gatter
|
name: XODER-Gatter
|
||||||
description: Gibt eine "1" aus, wenn genau einer der Eingänge wahr (Form, Farbe
|
description: Gibt eine "1" aus, wenn genau einer der Eingänge wahr (Form, Farbe
|
||||||
@ -935,9 +912,8 @@ settings:
|
|||||||
description: If activated the zoom will happen in the direction of your mouse
|
description: If activated the zoom will happen in the direction of your mouse
|
||||||
position, otherwise in the middle of the screen.
|
position, otherwise in the middle of the screen.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Map Resources Size
|
title: Größe der Ressourcen auf der Karte
|
||||||
description: Controls the size of the shapes on the map overview (when zooming
|
description: Legt die Größe der Ressourcen auf der Karte (beim Herauszoomen) fest.
|
||||||
out).
|
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Tastenbelegung
|
title: Tastenbelegung
|
||||||
hint: "Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene
|
hint: "Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene
|
||||||
@ -1011,6 +987,10 @@ keybindings:
|
|||||||
placementDisableAutoOrientation: Automatische Orientierung deaktivieren
|
placementDisableAutoOrientation: Automatische Orientierung deaktivieren
|
||||||
placeMultiple: Im Platziermodus bleiben
|
placeMultiple: Im Platziermodus bleiben
|
||||||
placeInverse: Automatische Fließbandorientierung invertieren
|
placeInverse: Automatische Fließbandorientierung invertieren
|
||||||
|
rotateToUp: "Rotieren: Nach oben zeigend"
|
||||||
|
rotateToDown: "Rotieren: Nach unten zeigend"
|
||||||
|
rotateToRight: "Rotieren: Nach rechts zeigend"
|
||||||
|
rotateToLeft: "Rotieren: Nach links zeigend"
|
||||||
about:
|
about:
|
||||||
title: Über dieses Spiel
|
title: Über dieses Spiel
|
||||||
body: Dieses Spiel ist quelloffen (Open Source) und wurde von <a
|
body: Dieses Spiel ist quelloffen (Open Source) und wurde von <a
|
||||||
|
@ -14,39 +14,14 @@ steamPage:
|
|||||||
While you only process shapes at the beginning, you have to color them later - for this you have to extract and mix colors!
|
While you only process shapes at the beginning, you have to color them later - for this you have to extract and mix colors!
|
||||||
|
|
||||||
Buying the game on Steam gives you access to the full version, but you can also play a demo on shapez.io first and decide later!
|
Buying the game on Steam gives you access to the full version, but you can also play a demo on shapez.io first and decide later!
|
||||||
title_advantages: Standalone Advantages
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 New Level</b> for a total of 26 levels
|
and time has flown by.
|
||||||
- <b>18 New Buildings</b> for a fully automated factory!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>Unlimited Upgrade Tiers</b> for many hours of fun!
|
how to make a computer in shapez.io
|
||||||
- <b>Wires Update</b> for an entirely new dimension!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Dark Mode</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Unlimited Savegames
|
efficient.
|
||||||
- Unlimited Markers
|
|
||||||
- Support me! ❤️
|
|
||||||
title_future: Planned Content
|
|
||||||
planned:
|
|
||||||
- Blueprint Library (Standalone Exclusive)
|
|
||||||
- Steam Achievements
|
|
||||||
- Puzzle Mode
|
|
||||||
- Minimap
|
|
||||||
- Mods
|
|
||||||
- Sandbox mode
|
|
||||||
- ... and a lot more!
|
|
||||||
title_open_source: This game is open source!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Official Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Help translate
|
|
||||||
text_open_source: >-
|
|
||||||
Anybody can contribute, I'm actively involved in the community and
|
|
||||||
attempt to review all suggestions and take feedback into consideration
|
|
||||||
where possible.
|
|
||||||
|
|
||||||
Be sure to check out my trello board for the full roadmap!
|
|
||||||
global:
|
global:
|
||||||
loading: Φόρτωση
|
loading: Φόρτωση
|
||||||
error: Σφάλμα
|
error: Σφάλμα
|
||||||
@ -370,9 +345,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 New Buildings
|
title: 18 New Buildings
|
||||||
desc: Fully automate your factory!
|
desc: Fully automate your factory!
|
||||||
savegames:
|
|
||||||
title: ∞ Savegames
|
|
||||||
desc: As many as your heart desires!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade Tiers
|
title: ∞ Upgrade Tiers
|
||||||
desc: This demo version has only 5!
|
desc: This demo version has only 5!
|
||||||
@ -388,6 +360,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Support me
|
title: Support me
|
||||||
desc: I develop it in my spare time!
|
desc: I develop it in my spare time!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Ιμάντες, Διανομείς & Σήραγγες
|
name: Ιμάντες, Διανομείς & Σήραγγες
|
||||||
@ -1007,6 +982,10 @@ keybindings:
|
|||||||
comparator: Compare
|
comparator: Compare
|
||||||
item_producer: Item Producer (Sandbox)
|
item_producer: Item Producer (Sandbox)
|
||||||
copyWireValue: "Wires: Copy value below cursor"
|
copyWireValue: "Wires: Copy value below cursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Σχετικά με αυτό το παιχνίδι
|
title: Σχετικά με αυτό το παιχνίδι
|
||||||
body: >-
|
body: >-
|
||||||
|
@ -30,49 +30,20 @@ steamPage:
|
|||||||
intro: >-
|
intro: >-
|
||||||
Do you like automation games? Then you are in the right place!
|
Do you like automation games? Then you are in the right place!
|
||||||
|
|
||||||
shapez.io is a relaxed game in which you have to build factories for the automated production of geometric shapes. As the level increases, the shapes become more and more complex, and you
|
shapez.io is a relaxed game in which you have to build factories for the automated production of geometric shapes. As the level increases, the shapes become more and more complex, and you have to spread out on the infinite map.
|
||||||
have to spread out on the infinite map.
|
|
||||||
|
|
||||||
And as if that wasn't enough, you also have to produce exponentially more to satisfy the demands - the only thing that helps is scaling! While you only have to process shapes at the
|
And as if that wasn't enough, you also have to produce exponentially more to satisfy the demands - the only thing that helps is scaling! While you only have to process shapes at the beginning, you will later have to color them - by extracting and mixing colors!
|
||||||
beginning, you will later have to color them - by extracting and mixing colors!
|
|
||||||
|
|
||||||
Buying the game on Steam gives you access to the full version, but you can also play a demo at shapez.io first and decide later!
|
Buying the game on Steam gives you access to the full version, but you can also play a demo at shapez.io first and decide later!
|
||||||
|
|
||||||
title_advantages: Standalone Advantages
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
|
||||||
- <b>12 New Levels</b> for a total of 26 levels
|
|
||||||
- <b>18 New Buildings</b> for a fully automated factory!
|
|
||||||
- <b>Unlimited Upgrade Tiers</b> for many hours of fun!
|
|
||||||
- <b>Wires Update</b> for an entirely new dimension!
|
|
||||||
- <b>Dark Mode</b>!
|
|
||||||
- Unlimited Savegames
|
|
||||||
- Unlimited Markers
|
|
||||||
- Support me! ❤️
|
|
||||||
|
|
||||||
title_future: Planned Content
|
nothernlion_comment: >-
|
||||||
planned:
|
This game is great - I'm having a wonderful time playing, and time has flown by.
|
||||||
- Blueprint Library
|
notch_comment: >-
|
||||||
- Steam Achievements
|
Oh crap. I really should sleep, but I think I just figured out how to make a computer in shapez.io
|
||||||
- Puzzle Mode
|
steam_review_comment: >-
|
||||||
- Minimap
|
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.
|
||||||
- Mods
|
|
||||||
- Sandbox mode
|
|
||||||
- ... and a lot more!
|
|
||||||
|
|
||||||
title_open_source: This game is open source!
|
|
||||||
text_open_source: >-
|
|
||||||
Anybody can contribute, I'm actively involved in the community and attempt to review all suggestions and take feedback into consideration where possible.
|
|
||||||
|
|
||||||
Be sure to check out my trello board for the full roadmap!
|
|
||||||
|
|
||||||
title_links: Links
|
|
||||||
|
|
||||||
links:
|
|
||||||
discord: Official Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Help translate
|
|
||||||
|
|
||||||
global:
|
global:
|
||||||
loading: Loading
|
loading: Loading
|
||||||
@ -482,9 +453,9 @@ ingame:
|
|||||||
title: 18 New Buildings
|
title: 18 New Buildings
|
||||||
desc: Fully automate your factory!
|
desc: Fully automate your factory!
|
||||||
|
|
||||||
savegames:
|
achievements:
|
||||||
title: ∞ Savegames
|
title: Achievements
|
||||||
desc: As many as your heart desires!
|
desc: Hunt them all!
|
||||||
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade Tiers
|
title: ∞ Upgrade Tiers
|
||||||
@ -1163,6 +1134,10 @@ keybindings:
|
|||||||
rotateWhilePlacing: Rotate
|
rotateWhilePlacing: Rotate
|
||||||
rotateInverseModifier: >-
|
rotateInverseModifier: >-
|
||||||
Modifier: Rotate CCW instead
|
Modifier: Rotate CCW instead
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
cycleBuildingVariants: Cycle Variants
|
cycleBuildingVariants: Cycle Variants
|
||||||
confirmMassDelete: Delete area
|
confirmMassDelete: Delete area
|
||||||
pasteLastBlueprint: Paste last blueprint
|
pasteLastBlueprint: Paste last blueprint
|
||||||
@ -1228,6 +1203,7 @@ tips:
|
|||||||
- You don't need to divide up items evenly for full efficiency.
|
- You don't need to divide up items evenly for full efficiency.
|
||||||
- Holding <b>SHIFT</b> will activate the belt planner, letting you place long lines of belts easily.
|
- Holding <b>SHIFT</b> will activate the belt planner, letting you place long lines of belts easily.
|
||||||
- Cutters always cut vertically, regardless of their orientation.
|
- Cutters always cut vertically, regardless of their orientation.
|
||||||
|
- Mix all three primary colors to get white.
|
||||||
- The storage buffer prioritises the left output.
|
- The storage buffer prioritises the left output.
|
||||||
- Invest time to build repeatable designs - it's worth it!
|
- Invest time to build repeatable designs - it's worth it!
|
||||||
- Holding <b>SHIFT</b> lets you place multiple buildings at a time.
|
- Holding <b>SHIFT</b> lets you place multiple buildings at a time.
|
||||||
|
@ -14,39 +14,14 @@ steamPage:
|
|||||||
Mientras que sólo procesas formas al principio, tienes que colorearlas después - ¡para ello tienes que extraer y mezclar colores!
|
Mientras que sólo procesas formas al principio, tienes que colorearlas después - ¡para ello tienes que extraer y mezclar colores!
|
||||||
|
|
||||||
Comprando el juego en Steam tienes acceso a la versión completa, ¡pero también puedes jugar una demo en shapez.io primero y decidir después!
|
Comprando el juego en Steam tienes acceso a la versión completa, ¡pero también puedes jugar una demo en shapez.io primero y decidir después!
|
||||||
title_advantages: Ventajas del juego
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 nuevos niveles</b> de un total de 26 niveles
|
and time has flown by.
|
||||||
- <b>18 nuevos edificios</b> ¡Para una fábrica totalmente automatizada!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>Nieveles infinitos de mejoras</b> ¡Para horas de diversión!
|
how to make a computer in shapez.io
|
||||||
- ¡<b>Cables</b> para una dimensión completamente nueva!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- ¡<b>Modo oscuro</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Partidad guardadas ilimitadas
|
efficient.
|
||||||
- Marcadores ilimitados
|
|
||||||
- ¡Me apoyarás! ❤️
|
|
||||||
title_future: Contenido futuro
|
|
||||||
planned:
|
|
||||||
- Librería de planos (Exclusivo de Standalone)
|
|
||||||
- Logros de Steam
|
|
||||||
- Modo Puzzle
|
|
||||||
- Minimapa
|
|
||||||
- Mods
|
|
||||||
- Modo libre
|
|
||||||
- ... y mucho más!
|
|
||||||
title_open_source: Este juego es de código abierto!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Discord oficial
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Código fuente (GitHub)
|
|
||||||
translate: Ayuda a traducír
|
|
||||||
text_open_source: >-
|
|
||||||
Cualquiera puede contribuír, Estoy activamete involucrado en la comunidad y
|
|
||||||
trato de revisar todas las sugerencias además de tomar en cuenta los consejos
|
|
||||||
siempre que sea posible.
|
|
||||||
|
|
||||||
¡Asegurate de revisar mi página de Trello donde podrás encontrar el Roadmap!
|
|
||||||
global:
|
global:
|
||||||
loading: Cargando
|
loading: Cargando
|
||||||
error: Error
|
error: Error
|
||||||
@ -122,7 +97,8 @@ dialogs:
|
|||||||
confirmSavegameDelete:
|
confirmSavegameDelete:
|
||||||
title: Confirmar borrado
|
title: Confirmar borrado
|
||||||
text: ¿Estás seguro de querér borrar el siguiente guardado?<br><br>
|
text: ¿Estás seguro de querér borrar el siguiente guardado?<br><br>
|
||||||
'<savegameName>' que está en el nivel <savegameLevel><br><br> ¡Esto no se puede deshacer!
|
'<savegameName>' que está en el nivel <savegameLevel><br><br> ¡Esto
|
||||||
|
no se puede deshacer!
|
||||||
savegameDeletionError:
|
savegameDeletionError:
|
||||||
title: Fallo al borrar
|
title: Fallo al borrar
|
||||||
text: "Fallo al borrar la partida guardada:"
|
text: "Fallo al borrar la partida guardada:"
|
||||||
@ -131,8 +107,8 @@ dialogs:
|
|||||||
text: Tienes que reinciar la partida para aplicar los cambios.
|
text: Tienes que reinciar la partida para aplicar los cambios.
|
||||||
editKeybinding:
|
editKeybinding:
|
||||||
title: Cambiar atajos de teclado
|
title: Cambiar atajos de teclado
|
||||||
desc: Pulsa la tecla o botón del ratón que quieras asignar, o presiona escape para
|
desc: Pulsa la tecla o botón del ratón que quieras asignar, o presiona escape
|
||||||
cancelar.
|
para cancelar.
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Reiniciar atajos de teclado
|
title: Reiniciar atajos de teclado
|
||||||
desc: Esto devolverá todos los atajos de teclado a los valores por defecto. Por
|
desc: Esto devolverá todos los atajos de teclado a los valores por defecto. Por
|
||||||
@ -185,7 +161,9 @@ dialogs:
|
|||||||
createMarker:
|
createMarker:
|
||||||
title: Nuevo marcador
|
title: Nuevo marcador
|
||||||
titleEdit: Editar marcador
|
titleEdit: Editar marcador
|
||||||
desc: Dale un nombre significativo, tambien puedes incluir la <strong>clave</strong> de una forma (La cual puedes generar <link>aquí</link>)
|
desc: Dale un nombre significativo, tambien puedes incluir la
|
||||||
|
<strong>clave</strong> de una forma (La cual puedes generar
|
||||||
|
<link>aquí</link>)
|
||||||
markerDemoLimit:
|
markerDemoLimit:
|
||||||
desc: Solo puedes crear dos marcadores en la versión de prueba. ¡Obtén el juego
|
desc: Solo puedes crear dos marcadores en la versión de prueba. ¡Obtén el juego
|
||||||
completo para marcadores ilimitados!
|
completo para marcadores ilimitados!
|
||||||
@ -207,7 +185,8 @@ dialogs:
|
|||||||
desc: ¡Hay un video tutorial disponible para este nivel! ¿Te gustaría verlo?
|
desc: ¡Hay un video tutorial disponible para este nivel! ¿Te gustaría verlo?
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: Tutorial Disponible
|
title: Tutorial Disponible
|
||||||
desc: Hay un video tutorial disponible para este nivel, pero solo está disponible en inglés ¿Te gustaría verlo?
|
desc: Hay un video tutorial disponible para este nivel, pero solo está
|
||||||
|
disponible en inglés ¿Te gustaría verlo?
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: Mover
|
moveMap: Mover
|
||||||
@ -310,38 +289,39 @@ ingame:
|
|||||||
1_1_extractor: ¡Coloca un <strong>extractor</strong> encima de un
|
1_1_extractor: ¡Coloca un <strong>extractor</strong> encima de un
|
||||||
<strong>círculo</strong> para extraerlo!
|
<strong>círculo</strong> para extraerlo!
|
||||||
1_2_conveyor: "¡Conecta el extractor con una <strong>cinta
|
1_2_conveyor: "¡Conecta el extractor con una <strong>cinta
|
||||||
transportadora</strong> a tu HUB!<br><br> Pista:
|
transportadora</strong> a tu HUB!<br><br> Pista: ¡<strong>Pulsa
|
||||||
¡<strong>Pulsa y arrastra</strong> la cinta transportadora con
|
y arrastra</strong> la cinta transportadora con el ratón!"
|
||||||
el ratón!"
|
|
||||||
1_3_expand: '¡Esto <strong>NO</strong> es un "juego de esperar"! Construye más
|
1_3_expand: '¡Esto <strong>NO</strong> es un "juego de esperar"! Construye más
|
||||||
extractores y cintas transportadoras para completar el objetivo
|
extractores y cintas transportadoras para completar el objetivo
|
||||||
más rápido.<br><br> Pista: Mantén pulsado <strong>SHIFT</strong>
|
más rápido.<br><br> Pista: Mantén pulsado <strong>SHIFT</strong>
|
||||||
para colocar varios extractores y usa <strong>R</strong> para
|
para colocar varios extractores y usa <strong>R</strong> para
|
||||||
rotarlos.'
|
rotarlos.'
|
||||||
2_1_place_cutter: "¡Ahora pon un <strong>Cortador</strong> para dividir los circulos en dos
|
2_1_place_cutter: "¡Ahora pon un <strong>Cortador</strong> para dividir los
|
||||||
mitades!<br><br> PD: El cortador siempre corta de <strong>de arriba a
|
circulos en dos mitades!<br><br> PD: El cortador siempre corta
|
||||||
abajo</strong> independientemente de su orientación."
|
de <strong>de arriba a abajo</strong> independientemente de su
|
||||||
2_2_place_trash: ¡El cortador se puede <strong>trabar y atorar</strong>!<br><br> Usa un
|
orientación."
|
||||||
<strong>basurero</strong> para deshacerse de la actualmente (!) no
|
2_2_place_trash: ¡El cortador se puede <strong>trabar y atorar</strong>!<br><br>
|
||||||
necesitada basura.
|
Usa un <strong>basurero</strong> para deshacerse de la
|
||||||
2_3_more_cutters: "¡Buen trabajo! ¡Ahora pon <strong>2 cortadores más</strong> para acelerar
|
actualmente (!) no necesitada basura.
|
||||||
este lento proceso!<br><br> PD: Usa las teclas <strong>0-9
|
2_3_more_cutters: "¡Buen trabajo! ¡Ahora pon <strong>2 cortadores más</strong>
|
||||||
</strong> para acceder a los edificios más rápido!"
|
para acelerar este lento proceso!<br><br> PD: Usa las teclas
|
||||||
|
<strong>0-9 </strong> para acceder a los edificios más rápido!"
|
||||||
3_1_rectangles: "¡Ahora consigamos unos rectangulos! <strong>construye 4
|
3_1_rectangles: "¡Ahora consigamos unos rectangulos! <strong>construye 4
|
||||||
extractores</strong> y conectalos a el HUB.<br><br> PD:
|
extractores</strong> y conectalos a el HUB.<br><br> PD: Manten
|
||||||
Manten apretado <strong>SHIFT</strong> mientrás pones cintas transportadoras para activar
|
apretado <strong>SHIFT</strong> mientrás pones cintas
|
||||||
el planeador de cintas!"
|
transportadoras para activar el planeador de cintas!"
|
||||||
21_1_place_quad_painter: ¡Pon el <strong>pintaor cuadruple</strong> y consigue unos
|
21_1_place_quad_painter: ¡Pon el <strong>pintador cuádruple</strong> y consigue
|
||||||
<strong>circulos</strong>, el color <strong>blanco</strong> y el color
|
unos <strong>círculos</strong>, el color <strong>blanco</strong>
|
||||||
<strong>rojo</strong>!
|
y el color <strong>rojo</strong>!
|
||||||
21_2_switch_to_wires: ¡Cambia a la capa de cables apretando la técla
|
21_2_switch_to_wires: ¡Cambia a la capa de cables apretando la tecla
|
||||||
<strong>E</strong>!<br><br> Luego <strong>conecta las cuatro
|
<strong>E</strong>!<br><br> Luego <strong>conecta las cuatro
|
||||||
entradas</strong> de el pintador con cables!
|
entradas</strong> del pintador con cables!
|
||||||
21_3_place_button: ¡Genial! ¡Ahora pon un <strong>Interruptor</strong> y conectalo
|
21_3_place_button: ¡Genial! ¡Ahora pon un <strong>Interruptor</strong> y
|
||||||
con cables!
|
conéctalo con cables!
|
||||||
21_4_press_button: "Presiona el interruptor para hacer que <strong>emita una señal
|
21_4_press_button: "Presiona el interruptor para hacer que <strong>emita una
|
||||||
verdadera</strong> lo cual activa el piintador.<br><br> PD: ¡No necesitas
|
señal verdadera</strong> lo cual activa el pintador.<br><br>
|
||||||
conectar todas las entradas! Intenta conectando solo dos."
|
PD: ¡No necesitas conectar todas las entradas! Intenta
|
||||||
|
conectando sólo dos."
|
||||||
connectedMiners:
|
connectedMiners:
|
||||||
one_miner: 1 Minero
|
one_miner: 1 Minero
|
||||||
n_miners: <amount> Mineros
|
n_miners: <amount> Mineros
|
||||||
@ -360,9 +340,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 nuevos edificios
|
title: 18 nuevos edificios
|
||||||
desc: ¡Automatiza completamente tu fabrica!
|
desc: ¡Automatiza completamente tu fabrica!
|
||||||
savegames:
|
|
||||||
title: Archivos de guardado infinitos
|
|
||||||
desc: ¡Tantos como desees!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: Niveles infinitos de mejoras
|
title: Niveles infinitos de mejoras
|
||||||
desc: ¡Esta demo solo tiene 5!
|
desc: ¡Esta demo solo tiene 5!
|
||||||
@ -378,6 +355,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Apoyame
|
title: Apoyame
|
||||||
desc: ¡Desarrollo este juego en mi tiempo libre!
|
desc: ¡Desarrollo este juego en mi tiempo libre!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Cintas transportadoras, Distribuidores y Túneles
|
name: Cintas transportadoras, Distribuidores y Túneles
|
||||||
@ -408,8 +388,8 @@ buildings:
|
|||||||
description: Te permite transportar energía
|
description: Te permite transportar energía
|
||||||
second:
|
second:
|
||||||
name: Cable
|
name: Cable
|
||||||
description: Transfiere señales, que pueden ser items, colores o valores booleanos (1 / 0).
|
description: Transfiere señales, que pueden ser items, colores o valores
|
||||||
Cables de diferentes colores no se conectan.
|
booleanos (1 / 0). Cables de diferentes colores no se conectan.
|
||||||
miner:
|
miner:
|
||||||
default:
|
default:
|
||||||
name: Extractor
|
name: Extractor
|
||||||
@ -471,9 +451,9 @@ buildings:
|
|||||||
la entrada de arriba.
|
la entrada de arriba.
|
||||||
quad:
|
quad:
|
||||||
name: Pintor (Cuádruple)
|
name: Pintor (Cuádruple)
|
||||||
description: Te permite colorear cada cuadrante de la forma individualemte. ¡Solo las
|
description: Te permite colorear cada cuadrante de la forma individualemte.
|
||||||
ranuras con una <strong>señal verdadera</strong> en la capa de cables
|
¡Solo las ranuras con una <strong>señal verdadera</strong> en la
|
||||||
seran pintadas!
|
capa de cables seran pintadas!
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: Basurero
|
name: Basurero
|
||||||
@ -481,7 +461,8 @@ buildings:
|
|||||||
balancer:
|
balancer:
|
||||||
default:
|
default:
|
||||||
name: Balanceador
|
name: Balanceador
|
||||||
description: Multifuncional - Distribuye igualmente todas las entradas en las salidas.
|
description: Multifuncional - Distribuye igualmente todas las entradas en las
|
||||||
|
salidas.
|
||||||
merger:
|
merger:
|
||||||
name: Unión (compacta)
|
name: Unión (compacta)
|
||||||
description: Junta dos cintas transportadoras en una.
|
description: Junta dos cintas transportadoras en una.
|
||||||
@ -497,8 +478,9 @@ buildings:
|
|||||||
storage:
|
storage:
|
||||||
default:
|
default:
|
||||||
name: Almacén
|
name: Almacén
|
||||||
description: Guarda items en exceso, hasta una dada capacidad. Prioritiza la salida
|
description: Guarda items en exceso, hasta una dada capacidad. Prioritiza la
|
||||||
de la izquierda y puede ser usada como una puerta de desbordamiento.
|
salida de la izquierda y puede ser usada como una puerta de
|
||||||
|
desbordamiento.
|
||||||
wire_tunnel:
|
wire_tunnel:
|
||||||
default:
|
default:
|
||||||
name: Cruze de cables
|
name: Cruze de cables
|
||||||
@ -506,71 +488,76 @@ buildings:
|
|||||||
constant_signal:
|
constant_signal:
|
||||||
default:
|
default:
|
||||||
name: Señal costante
|
name: Señal costante
|
||||||
description: Emite una señal constante, que puede ser una forma, color o valor booleano (1 / 0).
|
description: Emite una señal constante, que puede ser una forma, color o valor
|
||||||
|
booleano (1 / 0).
|
||||||
lever:
|
lever:
|
||||||
default:
|
default:
|
||||||
name: Interruptor
|
name: Interruptor
|
||||||
description: Puede ser activado para emitir una señal booleana (1 / 0) en la capa de cables,
|
description: Puede ser activado para emitir una señal booleana (1 / 0) en la
|
||||||
la cual puede ser usada por ejemplo para un filtro de items.
|
capa de cables, la cual puede ser usada por ejemplo para un
|
||||||
|
filtro de items.
|
||||||
logic_gate:
|
logic_gate:
|
||||||
default:
|
default:
|
||||||
name: Puerta AND
|
name: Puerta AND
|
||||||
description: Emite el valor booleano "1" si ambas entradas son verdaderas. (Verdadeas significa una forma,
|
description: Emite el valor booleano "1" si ambas entradas son verdaderas.
|
||||||
color o valor booleano "1")
|
(Verdadeas significa una forma, color o valor booleano "1")
|
||||||
not:
|
not:
|
||||||
name: Puerta NOT
|
name: Puerta NOT
|
||||||
description: Emite el valor booleano "1" si ambas entradas no son verdaderas. (Verdadeas significa una forma,
|
description: Emite el valor booleano "1" si ambas entradas no son verdaderas.
|
||||||
color o valor booleano "1")
|
(Verdadeas significa una forma, color o valor booleano "1")
|
||||||
xor:
|
xor:
|
||||||
name: Puerta XOR
|
name: Puerta XOR
|
||||||
description: Emite el valor booleano "1" si una de las entradas es verdadera, pero no si ambas lo son.
|
description: Emite el valor booleano "1" si una de las entradas es verdadera,
|
||||||
(Verdadeas significa una forma,
|
pero no si ambas lo son. (Verdadeas significa una forma, color o
|
||||||
color o valor booleano "1")
|
valor booleano "1")
|
||||||
or:
|
or:
|
||||||
name: Puerta OR
|
name: Puerta OR
|
||||||
description: Emite el valor booleano "1" Si una de las entradas es verdadera. (Verdadeas significa una forma,
|
description: Emite el valor booleano "1" Si una de las entradas es verdadera.
|
||||||
color o valor booleano "1")
|
(Verdadeas significa una forma, color o valor booleano "1")
|
||||||
transistor:
|
transistor:
|
||||||
default:
|
default:
|
||||||
name: Transistor
|
name: Transistor
|
||||||
description: Envia la señal de abajo si la señal del costado es verdadera (Verdadeas significa una forma,
|
description: Envia la señal de abajo si la señal del costado es verdadera
|
||||||
color o valor booleano "1").
|
(Verdadeas significa una forma, color o valor booleano "1").
|
||||||
mirrored:
|
mirrored:
|
||||||
name: Transistor
|
name: Transistor
|
||||||
description: Envia la señal de abajo si la señal del costado es verdadera (Verdadeas significa una forma,
|
description: Envia la señal de abajo si la señal del costado es verdadera
|
||||||
color o valor booleano "1").
|
(Verdadeas significa una forma, color o valor booleano "1").
|
||||||
filter:
|
filter:
|
||||||
default:
|
default:
|
||||||
name: Filtro
|
name: Filtro
|
||||||
description: Conecta una señal para enviar todas las que coincidan hacia arriba y las demás
|
description: Conecta una señal para enviar todas las que coincidan hacia arriba
|
||||||
hacia la derecha. También puede ser controlada por señales booleanas.
|
y las demás hacia la derecha. También puede ser controlada por
|
||||||
|
señales booleanas.
|
||||||
display:
|
display:
|
||||||
default:
|
default:
|
||||||
name: Monitor
|
name: Monitor
|
||||||
description: Conecta una señal para mostrarla en el monitor - Puede ser una forma,
|
description: Conecta una señal para mostrarla en el monitor - Puede ser una
|
||||||
color o valor booleano.
|
forma, color o valor booleano.
|
||||||
reader:
|
reader:
|
||||||
default:
|
default:
|
||||||
name: Lector de cinta
|
name: Lector de cinta
|
||||||
description: Te permite medir la cantidad media de items que pasan por la cinta. Emite el último
|
description: Te permite medir la cantidad media de items que pasan por la cinta.
|
||||||
item leído en la capa de cables (una vez desbloquada).
|
Emite el último item leído en la capa de cables (una vez
|
||||||
|
desbloquada).
|
||||||
analyzer:
|
analyzer:
|
||||||
default:
|
default:
|
||||||
name: Analizador de formas
|
name: Analizador de formas
|
||||||
description: analiza el cuadrante de arriba a la derecha de la capa más baja de la forma
|
description: analiza el cuadrante de arriba a la derecha de la capa más baja de
|
||||||
y devuelve su figura y color.
|
la forma y devuelve su figura y color.
|
||||||
comparator:
|
comparator:
|
||||||
default:
|
default:
|
||||||
name: Comparador
|
name: Comparador
|
||||||
description: Devuelve el valor booleano "1" Si ambas señales son exactamente iguales. Puede comparar
|
description: Devuelve el valor booleano "1" Si ambas señales son exactamente
|
||||||
formas, items y valores booleanos.
|
iguales. Puede comparar formas, items y valores booleanos.
|
||||||
virtual_processor:
|
virtual_processor:
|
||||||
default:
|
default:
|
||||||
name: Cortador virtual
|
name: Cortador virtual
|
||||||
description: Corta virtualmente la forma en dos.
|
description: Corta virtualmente la forma en dos.
|
||||||
rotater:
|
rotater:
|
||||||
name: Rotador virtual
|
name: Rotador virtual
|
||||||
description: Rota virtualmente la forma, tanto en sentido del horario como sentido anti-horario.
|
description: Rota virtualmente la forma, tanto en sentido del horario como
|
||||||
|
sentido anti-horario.
|
||||||
unstacker:
|
unstacker:
|
||||||
name: Desapilador virtual
|
name: Desapilador virtual
|
||||||
description: Extrae virtualmente la capa más alta en la salida a la derecha y
|
description: Extrae virtualmente la capa más alta en la salida a la derecha y
|
||||||
@ -585,17 +572,17 @@ buildings:
|
|||||||
item_producer:
|
item_producer:
|
||||||
default:
|
default:
|
||||||
name: Productor de items
|
name: Productor de items
|
||||||
description: Solo disponible en modo libre, envía la señal recivida de la
|
description: Solo disponible en modo libre, envía la señal recivida de la capa
|
||||||
capa de cables en la capa regular.
|
de cables en la capa regular.
|
||||||
storyRewards:
|
storyRewards:
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Cortador de figuras
|
title: Cortador de figuras
|
||||||
desc: ¡Acabas de desbloquear el <strong>cortador</strong>, el cual corta formas por la mitad
|
desc: ¡Acabas de desbloquear el <strong>cortador</strong>, el cual corta formas
|
||||||
de arriba a abajo <strong>independientemente de su
|
por la mitad de arriba a abajo <strong>independientemente de su
|
||||||
orientacion</strong>!<br><br>Asegurate de deshacerte de la basura, o
|
orientacion</strong>!<br><br>Asegurate de deshacerte de la basura, o
|
||||||
sino <strong>se trabará y parará</strong> - Por este proposite
|
sino <strong>se trabará y parará</strong> - Por este proposite Te he
|
||||||
Te he dado el <strong>basurero</strong>, el cual destruye
|
dado el <strong>basurero</strong>, el cual destruye todo lo que
|
||||||
todo lo que pongas dentro de él!
|
pongas dentro de él!
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotador
|
title: Rotador
|
||||||
desc: ¡El <strong>rotador</strong> se ha desbloqueado! Rota figuras en sentido
|
desc: ¡El <strong>rotador</strong> se ha desbloqueado! Rota figuras en sentido
|
||||||
@ -620,8 +607,8 @@ storyRewards:
|
|||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Separador/Fusionador
|
title: Separador/Fusionador
|
||||||
desc: Has desbloqueado el <strong>separador</strong> , una variante de el
|
desc: Has desbloqueado el <strong>separador</strong> , una variante de el
|
||||||
<strong>balanceador</strong> - Acepta una entrada y la separa
|
<strong>balanceador</strong> - Acepta una entrada y la separa en
|
||||||
en dos!
|
dos!
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Túnel
|
title: Túnel
|
||||||
desc: El <strong>túnel</strong> se ha desbloqueado - ¡Ahora puedes transportar
|
desc: El <strong>túnel</strong> se ha desbloqueado - ¡Ahora puedes transportar
|
||||||
@ -635,8 +622,8 @@ storyRewards:
|
|||||||
title: Extractor en cadena
|
title: Extractor en cadena
|
||||||
desc: "¡Has desbloqueado el <strong>extractor en cadena</strong>! ¡Este puede
|
desc: "¡Has desbloqueado el <strong>extractor en cadena</strong>! ¡Este puede
|
||||||
<strong>enviar sus recursos</strong> a otros extractores así puedes
|
<strong>enviar sus recursos</strong> a otros extractores así puedes
|
||||||
extraer recursos más eficientemente!<br><br> PD: ¡El extractor
|
extraer recursos más eficientemente!<br><br> PD: ¡El extractor viejo
|
||||||
viejo ha sido reemplazado en tu barra de herramientas!"
|
ha sido reemplazado en tu barra de herramientas!"
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Túnel nivel II
|
title: Túnel nivel II
|
||||||
desc: Has desbloqueado una nueva variante del <strong>túnel</strong> - ¡Tiene un
|
desc: Has desbloqueado una nueva variante del <strong>túnel</strong> - ¡Tiene un
|
||||||
@ -653,18 +640,21 @@ storyRewards:
|
|||||||
consumiendo solo un color en vez de dos!
|
consumiendo solo un color en vez de dos!
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Almacenamiento intermedio
|
title: Almacenamiento intermedio
|
||||||
desc: Haz desbloquado el edificio de <strong>almacenamiento</strong> - ¡Te permite
|
desc: Haz desbloquado el edificio de <strong>almacenamiento</strong> - ¡Te
|
||||||
guardar items hasta una capacidad determinada!<br><br> Prioriza la salida
|
permite guardar items hasta una capacidad determinada!<br><br>
|
||||||
de la izquierda, por lo que tambien puedes suarlo como una <strong>puerta de desbordamiento</strong>!
|
Prioriza la salida de la izquierda, por lo que tambien puedes suarlo
|
||||||
|
como una <strong>puerta de desbordamiento</strong>!
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Juego libre
|
title: Juego libre
|
||||||
desc: ¡Lo hiciste! Haz desbloqueado el <strong>modo de juego libre</strong>! ¡Esto significa
|
desc: ¡Lo hiciste! Haz desbloqueado el <strong>modo de juego libre</strong>!
|
||||||
que las formas ahora son <strong>aleatoriamente</strong> generadas!<br><br>
|
¡Esto significa que las formas ahora son
|
||||||
Debído a que desde ahora de adelante el HUB pedrirá una cantidad especifica de formas <strong>por segundo</strong>
|
<strong>aleatoriamente</strong> generadas!<br><br> Debído a que
|
||||||
¡Te recomiendo encarecidamente que construyas una maquina que automáticamente
|
desde ahora de adelante el HUB pedrirá una cantidad especifica de
|
||||||
envíe la forma pedida!<br><br> El HUB emite la forma
|
formas <strong>por segundo</strong> ¡Te recomiendo encarecidamente
|
||||||
pedida en la capa de cables, así que todo lo que tienes que hacer es analizarla y
|
que construyas una maquina que automáticamente envíe la forma
|
||||||
automaticamente configurar tu fabrica basada en ello.
|
pedida!<br><br> El HUB emite la forma pedida en la capa de cables,
|
||||||
|
así que todo lo que tienes que hacer es analizarla y automaticamente
|
||||||
|
configurar tu fabrica basada en ello.
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Planos
|
title: Planos
|
||||||
desc: ¡Ahora puedes <strong>copiar y pegar</strong> partes de tu fábrica!
|
desc: ¡Ahora puedes <strong>copiar y pegar</strong> partes de tu fábrica!
|
||||||
@ -685,67 +675,71 @@ storyRewards:
|
|||||||
completo!
|
completo!
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Balanceador
|
title: Balanceador
|
||||||
desc: El <strong>balanceador</strong> multifuncional ha sido desbloqueado - ¡Este puede
|
desc: El <strong>balanceador</strong> multifuncional ha sido desbloqueado -
|
||||||
ser usado para construir fabricas más grandes al <strong>separar y mezclar
|
¡Este puede ser usado para construir fabricas más grandes al
|
||||||
items</strong> hacia múltiples cintas!
|
<strong>separar y mezclar items</strong> hacia múltiples cintas!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: Unión compacta
|
title: Unión compacta
|
||||||
desc: Has desbloqueado la variante <strong>unión</strong> de el
|
desc: Has desbloqueado la variante <strong>unión</strong> de el
|
||||||
<strong>balanceador</strong> - ¡Acepta dos entradas y las une en
|
<strong>balanceador</strong> - ¡Acepta dos entradas y las une en una
|
||||||
una sola cinta!
|
sola cinta!
|
||||||
reward_belt_reader:
|
reward_belt_reader:
|
||||||
title: Lector de cinta
|
title: Lector de cinta
|
||||||
desc: ¡Has desbloqueado el <strong>lector de cinta</strong>! Este te permite
|
desc: You have now unlocked the <strong>belt reader</strong>! It allows you to
|
||||||
medir la cantidad de items que pasan por esta.<br><brY tan solo espera hasta debloquear
|
measure the throughput of a belt.<br><br>And wait until you unlock
|
||||||
los cables - ¡Ahí si que se vuelve útil!
|
wires - then it gets really useful!
|
||||||
reward_rotater_180:
|
reward_rotater_180:
|
||||||
title: Rotador (180 grados)
|
title: Rotador (180 grados)
|
||||||
desc: ¡Has desbloqueado el <strong>rotador</strong> de 180 grados! - Te permite
|
desc: ¡Has desbloqueado el <strong>rotador</strong> de 180 grados! - Te permite
|
||||||
rotar una forma en 180 grados (¡Sorpresa! :D)
|
rotar una forma en 180 grados (¡Sorpresa! :D)
|
||||||
reward_display:
|
reward_display:
|
||||||
title: Monitor
|
title: Monitor
|
||||||
desc: "Has desbloqueado el <strong>Monitor</strong> - ¡Conecta una señal dentro de
|
desc: "Has desbloqueado el <strong>Monitor</strong> - ¡Conecta una señal dentro
|
||||||
la capa de cables para visualizarla!<br><br> PD: ¿Te has dado cuenta que el lector
|
de la capa de cables para visualizarla!<br><br> PD: ¿Te has dado
|
||||||
de cinta y el almacenador emiten su último item leído? ¡Trata de conectarlo
|
cuenta que el lector de cinta y el almacenador emiten su último item
|
||||||
al monitor!"
|
leído? ¡Trata de conectarlo al monitor!"
|
||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: Señal constante
|
title: Señal constante
|
||||||
desc: ¡Has desbloqueado la <strong>señal constante</strong> en la capa de
|
desc: ¡Has desbloqueado la <strong>señal constante</strong> en la capa de
|
||||||
cables! Esto es muy útil para conectar a el <strong>filtro de items</strong>
|
cables! Esto es muy útil para conectar a el <strong>filtro de
|
||||||
por ejemplo.<br><br> La señal constante puede emitir
|
items</strong> por ejemplo.<br><br> La señal constante puede emitir
|
||||||
<strong>formas</strong>, <strong>colores</strong> o
|
<strong>formas</strong>, <strong>colores</strong> o <strong>valores
|
||||||
<strong>valores booleanos</strong> (1 / 0).
|
booleanos</strong> (1 / 0).
|
||||||
reward_logic_gates:
|
reward_logic_gates:
|
||||||
title: Puertas lógicas
|
title: Puertas lógicas
|
||||||
desc: ¡Has desbloqueado las <strong>puertas lógicas</strong>! No es necesario que te emociones
|
desc: ¡Has desbloqueado las <strong>puertas lógicas</strong>! No es necesario
|
||||||
por esto ¡Pero en realidad es super geniall!<br><br> Con estas puertas
|
que te emociones por esto ¡Pero en realidad es super
|
||||||
ahora puedes computar operaciones AND, OR, XOR y NOT.<br><br> Como bonus
|
geniall!<br><br> Con estas puertas ahora puedes computar operaciones
|
||||||
también te he dado el <strong>transistor</strong>!
|
AND, OR, XOR y NOT.<br><br> Como bonus también te he dado el
|
||||||
|
<strong>transistor</strong>!
|
||||||
reward_virtual_processing:
|
reward_virtual_processing:
|
||||||
title: Procesamiento virtual
|
title: Procesamiento virtual
|
||||||
desc: ¡Acabo de darte un monton de nuevos edificios los cuales te permiten
|
desc: ¡Acabo de darte un monton de nuevos edificios los cuales te permiten
|
||||||
<strong>simular el procesamiento de las formas</strong>!<br><br> ¡Ahora puedes
|
<strong>simular el procesamiento de las formas</strong>!<br><br>
|
||||||
simular un cortador, rotador, apilador y más dentro de la capa de cables!
|
¡Ahora puedes simular un cortador, rotador, apilador y más dentro de
|
||||||
Con esto ahora tienes tres opciones para continuar el juego:<br><br> -
|
la capa de cables! Con esto ahora tienes tres opciones para
|
||||||
Construir una <strong>maquina automatizada</strong> para crear cualquier
|
continuar el juego:<br><br> - Construir una <strong>maquina
|
||||||
forma que te pida el HUB (¡Te recomiendo que lo intentes!).<br><br> - Construir
|
automatizada</strong> para crear cualquier forma que te pida el HUB
|
||||||
algo genial con los cables.<br><br> - Continuar jugando de
|
(¡Te recomiendo que lo intentes!).<br><br> - Construir algo genial
|
||||||
la manera regular.<br><br> ¡Cualquiera que eligas, recuerda divertirte!
|
con los cables.<br><br> - Continuar jugando de la manera
|
||||||
|
regular.<br><br> ¡Cualquiera que eligas, recuerda divertirte!
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: Cables y pintor cuádruple
|
title: Cables y pintor cuádruple
|
||||||
desc: "Has desbloqueado la <strong>Capa de cables</strong>: ¡Es una capa
|
desc: "Has desbloqueado la <strong>Capa de cables</strong>: ¡Es una capa
|
||||||
separada a la capa regular e introduce un montón de mecanicas
|
separada a la capa regular e introduce un montón de mecanicas
|
||||||
nuevas!<br><br> Para empezar te he dado el <strong>Pintor
|
nuevas!<br><br> Para empezar te he dado el <strong>Pintor
|
||||||
Cuádruple</strong> - ¡Conecta las ranuras que quieras pintar usando
|
Cuádruple</strong> - ¡Conecta las ranuras que quieras pintar usando
|
||||||
la capa de cables!<br><br> Para cambiar a la capa de cables, presiona la tecla
|
la capa de cables!<br><br> Para cambiar a la capa de cables,
|
||||||
<strong>E</strong>. <br><br> PD: ¡Activa las <strong>pistas</strong> en
|
presiona la tecla <strong>E</strong>. <br><br> PD: ¡Activa las
|
||||||
las opciones para activar el tutorial de cables!"
|
<strong>pistas</strong> en las opciones para activar el tutorial de
|
||||||
|
cables!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Filtro de items
|
title: Filtro de items
|
||||||
desc: Has desbloqueado el <strong>Filtro de Items</strong>! Este enviará los items tanto
|
desc: Has desbloqueado el <strong>Filtro de Items</strong>! Este enviará los
|
||||||
arriaba como a la derecha dependiendo en si coinciden con la
|
items tanto arriaba como a la derecha dependiendo en si coinciden
|
||||||
señal de la capa de cables o no.<br><br> Tambien puedes enviar una señal
|
con la señal de la capa de cables o no.<br><br> Tambien puedes
|
||||||
booleana (1 / 0) para activarlo o desactivarlo completamente.
|
enviar una señal booleana (1 / 0) para activarlo o desactivarlo
|
||||||
|
completamente.
|
||||||
reward_demo_end:
|
reward_demo_end:
|
||||||
title: Fin de la demo
|
title: Fin de la demo
|
||||||
desc: ¡Has llegado al final de la demo!
|
desc: ¡Has llegado al final de la demo!
|
||||||
@ -874,12 +868,13 @@ settings:
|
|||||||
description: Establece el volumen para la música
|
description: Establece el volumen para la música
|
||||||
lowQualityMapResources:
|
lowQualityMapResources:
|
||||||
title: Recursos del mapa de baja calidad
|
title: Recursos del mapa de baja calidad
|
||||||
description: Simplifica el renderizado de los recusos en el mapa al ser vistos desde cerca,
|
description: Simplifica el renderizado de los recusos en el mapa al ser vistos
|
||||||
mejorando el rendimiento. ¡Incluso se ve más limpio, asi que asegurate de probarlo!
|
desde cerca, mejorando el rendimiento. ¡Incluso se ve más
|
||||||
|
limpio, asi que asegurate de probarlo!
|
||||||
disableTileGrid:
|
disableTileGrid:
|
||||||
title: Deshabilitar grilla
|
title: Deshabilitar grilla
|
||||||
description: Deshabilitar la grilla puede ayudar con el rendimiento. ¡También hace
|
description: Deshabilitar la grilla puede ayudar con el rendimiento. ¡También
|
||||||
que el juego se vea más limpio!
|
hace que el juego se vea más limpio!
|
||||||
clearCursorOnDeleteWhilePlacing:
|
clearCursorOnDeleteWhilePlacing:
|
||||||
title: Limpiar el cursos al apretar click derecho
|
title: Limpiar el cursos al apretar click derecho
|
||||||
description: Activado por defecto, Limpia el cursor al hacer click derecho
|
description: Activado por defecto, Limpia el cursor al hacer click derecho
|
||||||
@ -888,33 +883,35 @@ settings:
|
|||||||
un edificio.
|
un edificio.
|
||||||
lowQualityTextures:
|
lowQualityTextures:
|
||||||
title: Texturas de baja calidad (Feo)
|
title: Texturas de baja calidad (Feo)
|
||||||
description: Usa texturas de baja calidad para mejorar el rendimiento. ¡Esto hará que el
|
description: Usa texturas de baja calidad para mejorar el rendimiento. ¡Esto
|
||||||
juego se vea muy feo!
|
hará que el juego se vea muy feo!
|
||||||
displayChunkBorders:
|
displayChunkBorders:
|
||||||
title: Mostrar bordes de chunk
|
title: Mostrar bordes de chunk
|
||||||
description: Este juego está dividido en chunks de 16x16 cuadrados, si esta opción es
|
description: Este juego está dividido en chunks de 16x16 cuadrados, si esta
|
||||||
habilitada los bordes de cada chunk serán mostrados.
|
opción es habilitada los bordes de cada chunk serán mostrados.
|
||||||
pickMinerOnPatch:
|
pickMinerOnPatch:
|
||||||
title: Elegír el minero en la veta de recursos
|
title: Elegír el minero en la veta de recursos
|
||||||
description: Activado pir defecto, selecciona el minero si usas el cuentagotas sobre
|
description: Activado pir defecto, selecciona el minero si usas el cuentagotas
|
||||||
una veta de recursos.
|
sobre una veta de recursos.
|
||||||
simplifiedBelts:
|
simplifiedBelts:
|
||||||
title: Cintas trasportadoras simplificadas (Feo)
|
title: Cintas trasportadoras simplificadas (Feo)
|
||||||
description: No rederiza los items en las cintas trasportadoras exceptuando al pasar el cursor sobre la cinta para mejorar
|
description: No rederiza los items en las cintas trasportadoras exceptuando al
|
||||||
el rendimiento. No recomiendo jugar con esta opcion activada
|
pasar el cursor sobre la cinta para mejorar el rendimiento. No
|
||||||
a menos que necesites fuertemente mejorar el rendimiento.
|
recomiendo jugar con esta opcion activada a menos que necesites
|
||||||
|
fuertemente mejorar el rendimiento.
|
||||||
enableMousePan:
|
enableMousePan:
|
||||||
title: Habilitar movimiento con mouse
|
title: Habilitar movimiento con mouse
|
||||||
description: Te permite mover el mapa moviendo el cursor hacia los bordes de la
|
description: Te permite mover el mapa moviendo el cursor hacia los bordes de la
|
||||||
pantalla. La velocidad depende de la opción de velocidad de movimiento.
|
pantalla. La velocidad depende de la opción de velocidad de
|
||||||
|
movimiento.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Hacer zoom donde está el cursor
|
title: Hacer zoom donde está el cursor
|
||||||
description: Si se activa, se hará zoom en al dirección donde esté tu cursor,
|
description: Si se activa, se hará zoom en al dirección donde esté tu cursor, a
|
||||||
a diferencia de hacer zoom en el centro de la pantalla.
|
diferencia de hacer zoom en el centro de la pantalla.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Tamaño de recursos en el mapa
|
title: Tamaño de recursos en el mapa
|
||||||
description: Controla el tamaño de los recursos en la vista de aerea del mapa (Al hacer zoom
|
description: Controla el tamaño de los recursos en la vista de aerea del mapa
|
||||||
minimo).
|
(Al hacer zoom minimo).
|
||||||
rangeSliderPercentage: <amount> %
|
rangeSliderPercentage: <amount> %
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Atajos de teclado
|
title: Atajos de teclado
|
||||||
@ -989,6 +986,10 @@ keybindings:
|
|||||||
comparator: Comparador
|
comparator: Comparador
|
||||||
item_producer: Productor de items (Sandbox)
|
item_producer: Productor de items (Sandbox)
|
||||||
copyWireValue: "Cables: Copiar valor bajo el cursos"
|
copyWireValue: "Cables: Copiar valor bajo el cursos"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Sobre el juego
|
title: Sobre el juego
|
||||||
body: >-
|
body: >-
|
||||||
@ -1020,54 +1021,73 @@ tips:
|
|||||||
- Si apilar las formas no funciona, intenta intercambiar las entradas.
|
- Si apilar las formas no funciona, intenta intercambiar las entradas.
|
||||||
- Puedes activar la dirección del planeador de cintas apretando <b>R</b>.
|
- Puedes activar la dirección del planeador de cintas apretando <b>R</b>.
|
||||||
- Mantener apretado <b>CTRL</b> te permite poner cintas sin auto-orientación.
|
- Mantener apretado <b>CTRL</b> te permite poner cintas sin auto-orientación.
|
||||||
- Las proporciones siempre serán las mismas. Siempre y cuando todas las mejoras estén al mismo nivel.
|
- Las proporciones siempre serán las mismas. Siempre y cuando todas las
|
||||||
|
mejoras estén al mismo nivel.
|
||||||
- La ejecución en serie es más eficiente que la paralela.
|
- La ejecución en serie es más eficiente que la paralela.
|
||||||
- ¡Desbloquearás más variantes de edificios más adelante en el juego!
|
- ¡Desbloquearás más variantes de edificios más adelante en el juego!
|
||||||
- Puedes usar <b>T</b> para cambiar entre diferentes variantes.
|
- Puedes usar <b>T</b> para cambiar entre diferentes variantes.
|
||||||
- ¡La simetría es clave!
|
- ¡La simetría es clave!
|
||||||
- Los túneles de diferentes niveles pueden cruzarse entre sí
|
- Los túneles de diferentes niveles pueden cruzarse entre sí
|
||||||
- Intenta construir fábricas compactas - ¡Me lo agradecerás luego!
|
- Intenta construir fábricas compactas - ¡Me lo agradecerás luego!
|
||||||
- El pintor tiene una variante en espejo que puedes seleccionar con la técla <b>T</b>
|
- El pintor tiene una variante en espejo que puedes seleccionar con la técla
|
||||||
|
<b>T</b>
|
||||||
- Tener una buena proporción entre edificion maximizará su eficiencia
|
- Tener una buena proporción entre edificion maximizará su eficiencia
|
||||||
- A su máximo nivel, 5 extractores llenarán por completo una cinta trasnportadora.
|
- A su máximo nivel, 5 extractores llenarán por completo una cinta
|
||||||
|
trasnportadora.
|
||||||
- ¡No te olvides de utilizár túneles!
|
- ¡No te olvides de utilizár túneles!
|
||||||
- No es necesario dividir los items de manera uniforme para conseguír la mayor eficiencia.
|
- No es necesario dividir los items de manera uniforme para conseguír la
|
||||||
- Mantener apretado <b>SHIFT</b> activará el planeador de cintas, permitiendote poner
|
mayor eficiencia.
|
||||||
largas lineas de cintas fácilmente.
|
- Mantener apretado <b>SHIFT</b> activará el planeador de cintas,
|
||||||
|
permitiendote poner largas lineas de cintas fácilmente.
|
||||||
- Los cortadores siempre cortan verticalmente, sin importar su orientación.
|
- Los cortadores siempre cortan verticalmente, sin importar su orientación.
|
||||||
- Para obtener blanco solo mexcla todos los colores.
|
- Para obtener blanco solo mexcla todos los colores.
|
||||||
- El buffer de almacenamiento prioriza la primera salida.
|
- El buffer de almacenamiento prioriza la primera salida.
|
||||||
- Invierte tiempo en construir diseños repetibles, ¡vale la pena!
|
- Invierte tiempo en construir diseños repetibles, ¡vale la pena!
|
||||||
- Mantener apretado <b>CTRL</b> te permite poner varios edificios a la vez.
|
- Mantener apretado <b>CTRL</b> te permite poner varios edificios a la vez.
|
||||||
- Puedes apretar <b>ALT</b> para invertir la dirección a la que van las cintas.
|
- Puedes apretar <b>ALT</b> para invertir la dirección a la que van las
|
||||||
|
cintas.
|
||||||
- ¡La eficiencia es la clave!
|
- ¡La eficiencia es la clave!
|
||||||
- Mientras más lejos del HUB estés más complejas serán las formas que te encuentres.
|
- Mientras más lejos del HUB estés más complejas serán las formas que te
|
||||||
- Las máquinas tienen una velocidad limitada, divídelas para una máxima eficiencia.
|
encuentres.
|
||||||
|
- Las máquinas tienen una velocidad limitada, divídelas para una máxima
|
||||||
|
eficiencia.
|
||||||
- Usa balanceadores para maximizar tu eficiencia.
|
- Usa balanceadores para maximizar tu eficiencia.
|
||||||
- La organización es importante. Trate de no cruzar demasiado las cintas transportadoras.
|
- La organización es importante. Trate de no cruzar demasiado las cintas
|
||||||
|
transportadoras.
|
||||||
- ¡Planea con anticipación, o será un gran caos!
|
- ¡Planea con anticipación, o será un gran caos!
|
||||||
- ¡No saques tus viejas fábricas! Las necesitararás para desbloquear nuevas mejoras.
|
- ¡No saques tus viejas fábricas! Las necesitararás para desbloquear nuevas
|
||||||
|
mejoras.
|
||||||
- ¡Intenta superar el nivel 20 por tu cuenta antes de buscar ayuda!
|
- ¡Intenta superar el nivel 20 por tu cuenta antes de buscar ayuda!
|
||||||
- No compliques las cosas, intenta mantenerlo simple y llegarás lejos.
|
- No compliques las cosas, intenta mantenerlo simple y llegarás lejos.
|
||||||
- Puede que tengas que reutilizar las fábricas más tarde en el juego. Planea tus fábricas para que sean reutilizables.
|
- Puede que tengas que reutilizar las fábricas más tarde en el juego. Planea
|
||||||
- A veces puedes encontrar la forma que necesitas en el mapa sin la necesidad de usar apiladores.
|
tus fábricas para que sean reutilizables.
|
||||||
|
- A veces puedes encontrar la forma que necesitas en el mapa sin la
|
||||||
|
necesidad de usar apiladores.
|
||||||
- Los molinillos no pueden aparecer enteros naturalmente.
|
- Los molinillos no pueden aparecer enteros naturalmente.
|
||||||
- Colorear las formas antes de cortarlas para una máxima eficiencia.
|
- Colorear las formas antes de cortarlas para una máxima eficiencia.
|
||||||
- Con los módulos, el espacio es sólo una percepción; una preocupación para los mortales.
|
- Con los módulos, el espacio es sólo una percepción; una preocupación para
|
||||||
|
los mortales.
|
||||||
- Haz una fábrica para planos separada. Son importantes para los módulos.
|
- Haz una fábrica para planos separada. Son importantes para los módulos.
|
||||||
- Echa un vistazo más de cerca al mezclador de colores, y tus preguntas serán respondidas.
|
- Echa un vistazo más de cerca al mezclador de colores, y tus preguntas
|
||||||
|
serán respondidas.
|
||||||
- Usa <b>CTRL</b> + Click izquierdo para seleccionar un área.
|
- Usa <b>CTRL</b> + Click izquierdo para seleccionar un área.
|
||||||
- Construir demasiado cerca del HUB puede interponerse en el camino de proyectos a futuro.
|
- Construir demasiado cerca del HUB puede interponerse en el camino de
|
||||||
- El icono del alfiler junto a cada forma de la lista de mejoras lo fija a la pantalla.
|
proyectos a futuro.
|
||||||
|
- El icono del alfiler junto a cada forma de la lista de mejoras lo fija a
|
||||||
|
la pantalla.
|
||||||
- ¡Mezcla todos los colores primarios para obtener blanco!
|
- ¡Mezcla todos los colores primarios para obtener blanco!
|
||||||
- Tienes un mapa infinito, no te agobies tu fábrica, ¡expande!
|
- Tienes un mapa infinito, no te agobies tu fábrica, ¡expande!
|
||||||
- ¡Prueba también Factorio! Es mi juego favorito.
|
- ¡Prueba también Factorio! Es mi juego favorito.
|
||||||
- ¡El cortador cuádruple corta en el sentido de las agujas del reloj empezando por la parte superior derecha!
|
- ¡El cortador cuádruple corta en el sentido de las agujas del reloj
|
||||||
|
empezando por la parte superior derecha!
|
||||||
- ¡Puedes descargar tus archivos de guardado en el menú principal!
|
- ¡Puedes descargar tus archivos de guardado en el menú principal!
|
||||||
- ¡Este juego tiene un montón de atajos útiles! Asegúrate de revisar la página de ajustes.
|
- ¡Este juego tiene un montón de atajos útiles! Asegúrate de revisar la
|
||||||
|
página de ajustes.
|
||||||
- Este juego tiene muchos ajustes, ¡asegúrate de revisarlos!
|
- Este juego tiene muchos ajustes, ¡asegúrate de revisarlos!
|
||||||
- ¡El marcador de tu HUB tiene una pequeña brújula para indicar su dirección!
|
- ¡El marcador de tu HUB tiene una pequeña brújula para indicar su dirección!
|
||||||
- Para despejar las cintas transportadoras, corta el área y luego pégala en el mismo lugar.
|
- Para despejar las cintas transportadoras, corta el área y luego pégala en
|
||||||
|
el mismo lugar.
|
||||||
- Presiona F4 para mostrar tu FPS y Tick Rate.
|
- Presiona F4 para mostrar tu FPS y Tick Rate.
|
||||||
- Presiona F4 dos veces para mostrar las coordenadas de tu ratón y de la cámara.
|
- Presiona F4 dos veces para mostrar las coordenadas de tu ratón y de la
|
||||||
|
cámara.
|
||||||
- Puedes hacer clic en una forma fijada en el lado izquierdo para desfijarla.
|
- Puedes hacer clic en una forma fijada en el lado izquierdo para desfijarla.
|
||||||
|
@ -4,48 +4,24 @@ steamPage:
|
|||||||
loputtomassa maailmassa.
|
loputtomassa maailmassa.
|
||||||
discordLinkShort: Virallinen Discord
|
discordLinkShort: Virallinen Discord
|
||||||
intro: >-
|
intro: >-
|
||||||
Shapez.io on rento peli, jossa sinun täytyy rakentaa tehtaita geometristen muotojen
|
Shapez.io on rento peli, jossa sinun täytyy rakentaa tehtaita
|
||||||
automatisoituun tuotantoon.
|
geometristen muotojen automatisoituun tuotantoon.
|
||||||
|
|
||||||
Kun taso nousee, muodot tulevat entistä vaikeammiksi ja sinun täytyy laajentua loputtomassa kartassa.
|
Kun taso nousee, muodot tulevat entistä vaikeammiksi ja sinun täytyy laajentua loputtomassa kartassa.
|
||||||
|
|
||||||
Ja jos tämä ei ollut tarpeeksi, niin sinun täytyy tuottaa eksponentiaalisesti enemmän täyttääksesi tarpeet
|
Ja jos tämä ei ollut tarpeeksi, niin sinun täytyy tuottaa eksponentiaalisesti enemmän täyttääksesi tarpeet - ainut asia mikä auttaa on skaalautuminen!
|
||||||
- ainut asia mikä auttaa on skaalautuminen!
|
|
||||||
|
|
||||||
Vaikka alussa vain prosessoit muotoja, myöhemmin niitä pitää myös maalata - tätä varten sinun täytyy kerätä ja sekoittaa värejä
|
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!
|
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!
|
||||||
title_advantages: Täysversion hyödyt
|
what_others_say: Muiden mielipiteitä shapez.io:sta
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 uutta tasoa</b> nostaen tasojen määrän 26 tasoon!
|
and time has flown by.
|
||||||
- <b>18 uutta laitetta</b> täysin automatisoidulle tehtaalle!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 päivitystasoa</b> monelle hauskalle pelitunnille!
|
how to make a computer in shapez.io
|
||||||
- <b>Johdot -päivitys</b> tuo täysin uuden ulottuvuuden!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Tumma teema</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Rajattomat tallennukset
|
efficient.
|
||||||
- Rajattomat merkit
|
|
||||||
- Tue minua! ❤️
|
|
||||||
title_future: Suunniteltu sisältö
|
|
||||||
planned:
|
|
||||||
- Pohjapiirustuskirjasto (Vain täysversiossa)
|
|
||||||
- Steam Achievements
|
|
||||||
- Palapelitila
|
|
||||||
- Minikartta
|
|
||||||
- Modit
|
|
||||||
- Hiekkalaatikkotila
|
|
||||||
- ... ja paljon muuta!
|
|
||||||
title_open_source: Tämä peli on avointa lähdekoodia!
|
|
||||||
title_links: Linkit
|
|
||||||
links:
|
|
||||||
discord: Virallinen Discord
|
|
||||||
roadmap: Tiekartta
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Lähdekoodi (GitHub)
|
|
||||||
translate: Auta kääntämään
|
|
||||||
text_open_source: >-
|
|
||||||
Kuka tahansa voi osallistua. Olen aktiivisesti mukana yhteisössä ja
|
|
||||||
yritän tarkistaa kaikki ehdotukset ja ottaa palautteen huomioon missä mahdollista.
|
|
||||||
Muista tarkistaa Trello -lautani, jossa löytyy koko tiekartta!
|
|
||||||
global:
|
global:
|
||||||
loading: Ladataan
|
loading: Ladataan
|
||||||
error: Virhe
|
error: Virhe
|
||||||
@ -54,7 +30,7 @@ global:
|
|||||||
suffix:
|
suffix:
|
||||||
thousands: k
|
thousands: k
|
||||||
millions: M
|
millions: M
|
||||||
billions: B
|
billions: G
|
||||||
trillions: T
|
trillions: T
|
||||||
infinite: ∞
|
infinite: ∞
|
||||||
time:
|
time:
|
||||||
@ -120,19 +96,18 @@ dialogs:
|
|||||||
text: "Tallennuksen lataus epäonnistui:"
|
text: "Tallennuksen lataus epäonnistui:"
|
||||||
confirmSavegameDelete:
|
confirmSavegameDelete:
|
||||||
title: Varmista poisto
|
title: Varmista poisto
|
||||||
text: Oletko varma, että haluat poistaa valitun pelin?<br><br>
|
text: Oletko varma, että haluat poistaa valitun pelin?<br><br> '<savegameName>'
|
||||||
'<savegameName>' tasossa <savegameLevel><br><br> Tätä toimintoa ei
|
tasossa <savegameLevel><br><br> Tätä toimintoa ei voi peruuttaa!
|
||||||
voi peruuttaa!
|
|
||||||
savegameDeletionError:
|
savegameDeletionError:
|
||||||
title: Poisto epäonnistui
|
title: Poisto epäonnistui
|
||||||
text: "Tallennuksen poisto epäonnistui:"
|
text: "Tallennuksen poisto epäonnistui:"
|
||||||
restartRequired:
|
restartRequired:
|
||||||
title: Uudelleenkäynnistys vaaditaan
|
title: Uudelleenkäynnistys vaaditaan
|
||||||
text: "Käynnistä peli uudelleen ottaaksesi asetukset käyttöön."
|
text: Käynnistä peli uudelleen ottaaksesi asetukset käyttöön.
|
||||||
editKeybinding:
|
editKeybinding:
|
||||||
title: Vaihda pikanäppäin
|
title: Vaihda pikanäppäin
|
||||||
desc: Paina näppäintä tai hiiren nappia, jonka haluat asettaa tai paina
|
desc: Paina näppäintä tai hiiren nappia, jonka haluat asettaa tai paina escape
|
||||||
escape peruuttaaksesi.
|
peruuttaaksesi.
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Nollaa pikanäppäimet
|
title: Nollaa pikanäppäimet
|
||||||
desc: Tämä nollaa kaikki pikanäppäimet oletusarvoihin. Vahvista.
|
desc: Tämä nollaa kaikki pikanäppäimet oletusarvoihin. Vahvista.
|
||||||
@ -157,12 +132,12 @@ dialogs:
|
|||||||
päivitysikkunan näytön oikeasta yläkulmasta.
|
päivitysikkunan näytön oikeasta yläkulmasta.
|
||||||
massDeleteConfirm:
|
massDeleteConfirm:
|
||||||
title: Vahvista poisto
|
title: Vahvista poisto
|
||||||
desc: Olet poistamassa paljon rakennuksia (<count> tarkalleen)! Oletko varma, että
|
desc: Olet poistamassa paljon rakennuksia (<count> tarkalleen)! Oletko varma,
|
||||||
haluat jatkaa?
|
että haluat jatkaa?
|
||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Vahvista leikkaus
|
title: Vahvista leikkaus
|
||||||
desc: Olet leikkaamassa paljon rakennuksia (<count> tarkalleen)! Oletko varma, että
|
desc: Olet leikkaamassa paljon rakennuksia (<count> tarkalleen)! Oletko varma,
|
||||||
haluat jatkaa?
|
että haluat jatkaa?
|
||||||
blueprintsNotUnlocked:
|
blueprintsNotUnlocked:
|
||||||
title: Ei vielä avattu
|
title: Ei vielä avattu
|
||||||
desc: Suorita taso 12 avataksesi piirustukset!
|
desc: Suorita taso 12 avataksesi piirustukset!
|
||||||
@ -172,13 +147,13 @@ dialogs:
|
|||||||
rakentamisesta helpompaa. Tässä on muutama, mutta <strong>katso
|
rakentamisesta helpompaa. Tässä on muutama, mutta <strong>katso
|
||||||
kaikki pikanäppäimet</strong>!<br><br> <code
|
kaikki pikanäppäimet</strong>!<br><br> <code
|
||||||
class='keybinding'>CTRL</code> + Raahaus: Valitse alue.<br> <code
|
class='keybinding'>CTRL</code> + Raahaus: Valitse alue.<br> <code
|
||||||
class='keybinding'>SHIFT</code>: Pidä pohjassa sijoittaaksesi
|
class='keybinding'>SHIFT</code>: Pidä pohjassa sijoittaaksesi useita
|
||||||
useita samoja rakennuksia.<br> <code class='keybinding'>ALT</code>:
|
samoja rakennuksia.<br> <code class='keybinding'>ALT</code>: Käännä
|
||||||
Käännä sijoitettavien kuljettimien suunta.<br>"
|
sijoitettavien kuljettimien suunta.<br>"
|
||||||
createMarker:
|
createMarker:
|
||||||
title: Uusi merkki
|
title: Uusi merkki
|
||||||
desc: Anna merkille kuvaava nimi. Voit myös liittää <strong>lyhyen koodin</strong>
|
desc: Anna merkille kuvaava nimi. Voit myös liittää <strong>lyhyen
|
||||||
muodosta. (Jonka voit luoda <link>täällä</link>.)
|
koodin</strong> muodosta. (Jonka voit luoda <link>täällä</link>.)
|
||||||
titleEdit: Muokkaa merkkiä
|
titleEdit: Muokkaa merkkiä
|
||||||
markerDemoLimit:
|
markerDemoLimit:
|
||||||
desc: Voit tehdä vain kaksi mukautettua merkkiä demoversiossa. Hanki täysversio
|
desc: Voit tehdä vain kaksi mukautettua merkkiä demoversiossa. Hanki täysversio
|
||||||
@ -193,9 +168,9 @@ dialogs:
|
|||||||
leikata sen?
|
leikata sen?
|
||||||
editSignal:
|
editSignal:
|
||||||
title: Aseta signaali
|
title: Aseta signaali
|
||||||
descItems: "Valitse esivalmisteltu muoto"
|
descItems: Valitse esivalmisteltu muoto
|
||||||
descShortKey: ... tai käytä muodon <strong>pikanäppäintä</strong>
|
descShortKey: ... tai käytä muodon <strong>pikanäppäintä</strong> (Jonka voit
|
||||||
(Jonka voit luoda <link>täällä</link>)
|
luoda <link>täällä</link>)
|
||||||
renameSavegame:
|
renameSavegame:
|
||||||
title: Nimeä tallennus uudelleen
|
title: Nimeä tallennus uudelleen
|
||||||
desc: Voit nimetä tallennuksesi uudelleen täällä.
|
desc: Voit nimetä tallennuksesi uudelleen täällä.
|
||||||
@ -220,7 +195,7 @@ ingame:
|
|||||||
delete: Poista
|
delete: Poista
|
||||||
pasteLastBlueprint: Liitä viimeisin piirustus
|
pasteLastBlueprint: Liitä viimeisin piirustus
|
||||||
lockBeltDirection: Ota kuljettimen suunnittelija käyttöön
|
lockBeltDirection: Ota kuljettimen suunnittelija käyttöön
|
||||||
plannerSwitchSide: Käännä suunnittelijan puoli
|
plannerSwitchSide: Vaihda suunnittelijan puolta
|
||||||
cutSelection: Leikkaa
|
cutSelection: Leikkaa
|
||||||
copySelection: Kopioi
|
copySelection: Kopioi
|
||||||
clearSelection: Tyhjennä valinta
|
clearSelection: Tyhjennä valinta
|
||||||
@ -315,27 +290,29 @@ ingame:
|
|||||||
laittaaksesi useampia poimijoita ja käytä <strong>R</strong>
|
laittaaksesi useampia poimijoita ja käytä <strong>R</strong>
|
||||||
kääntääksesi niitä."
|
kääntääksesi niitä."
|
||||||
2_1_place_cutter: "Nyt aseta <strong>Leikkuri</strong> leikataksesi ympyrä
|
2_1_place_cutter: "Nyt aseta <strong>Leikkuri</strong> leikataksesi ympyrä
|
||||||
puoliksi!<br><br> PS: Leikkuri aina leikkaa <strong>ylhäältä alaspäin</strong>
|
puoliksi!<br><br> PS: Leikkuri aina leikkaa <strong>ylhäältä
|
||||||
riippumatta sen asennosta."
|
alaspäin</strong> riippumatta sen asennosta."
|
||||||
2_2_place_trash: Leikkuri voi <strong>tukkeutua</strong>!<br><br> Käytä
|
2_2_place_trash: Leikkuri voi <strong>tukkeutua</strong>!<br><br> Käytä
|
||||||
<strong>roskakoria</strong> hävittääksesi (vielä!) tarpeeton jäte.
|
<strong>roskakoria</strong> hävittääksesi (vielä!) tarpeeton
|
||||||
|
jäte.
|
||||||
2_3_more_cutters: "Hienoa! Lisää <strong>kaksi leikkuria</strong> nopeuttaaksesi
|
2_3_more_cutters: "Hienoa! Lisää <strong>kaksi leikkuria</strong> nopeuttaaksesi
|
||||||
hidasta prosessia!<br><br> PS: Käytä <strong>pikanäppäimiä 0-9</strong>
|
hidasta prosessia!<br><br> PS: Käytä <strong>pikanäppäimiä
|
||||||
valitaksesi rakennuksen nopeammin!"
|
0-9</strong> valitaksesi rakennuksen nopeammin!"
|
||||||
3_1_rectangles: "Poimitaanpa nyt neliöitä! <strong>Rakenna 4
|
3_1_rectangles: "Poimitaanpa nyt neliöitä! <strong>Rakenna 4 poimijaa</strong>
|
||||||
poimijaa</strong> ja yhdistä ne keskusrakennukseen.<br><br> PS:
|
ja yhdistä ne keskusrakennukseen.<br><br> PS: Pidä
|
||||||
Pidä <strong>SHIFT</strong> painettuna, kun raahaat kuljetinta
|
<strong>SHIFT</strong> painettuna, kun raahaat kuljetinta
|
||||||
aktivoidaksesi kuljetinsuunnittelijan!"
|
aktivoidaksesi kuljetinsuunnittelijan!"
|
||||||
21_1_place_quad_painter: Aseta <strong>nelimaalain</strong> ja hanki
|
21_1_place_quad_painter: Aseta <strong>nelimaalain</strong> ja hanki
|
||||||
<strong>ympyröitä</strong>, <strong>valkoista</strong> ja
|
<strong>ympyröitä</strong>, <strong>valkoista</strong> ja
|
||||||
<strong>punaista</strong> väriä!
|
<strong>punaista</strong> väriä!
|
||||||
21_2_switch_to_wires: Vaihda Johdot -tasolle painamalla
|
21_2_switch_to_wires: Vaihda Johdot -tasolle painamalla
|
||||||
<strong>E</strong>!<br><br> Sitten <strong>yhdistä kaikki neljä tuloa</strong> maalaimeen johdoilla!
|
<strong>E</strong>!<br><br> Sitten <strong>yhdistä kaikki neljä
|
||||||
21_3_place_button: MahtaVATA! Aseta nyt <strong>kytkin</strong> ja yhdistä
|
tuloa</strong> maalaimeen johdoilla!
|
||||||
se johdoilla!
|
21_3_place_button: MahtaVATA! Aseta nyt <strong>kytkin</strong> ja yhdistä se
|
||||||
|
johdoilla!
|
||||||
21_4_press_button: "Paina kytkintä <strong>lähettääksesi tosi-
|
21_4_press_button: "Paina kytkintä <strong>lähettääksesi tosi-
|
||||||
signaalin</strong> ja aktivoidaksesi maalaimen.<br><br> PS: Kaikkia
|
signaalin</strong> ja aktivoidaksesi maalaimen.<br><br> PS:
|
||||||
tuloja ei tarvitse kytkeä! Kokeile vaikka vain kahta."
|
Kaikkia tuloja ei tarvitse kytkeä! Kokeile vaikka vain kahta."
|
||||||
connectedMiners:
|
connectedMiners:
|
||||||
one_miner: 1 poimija
|
one_miner: 1 poimija
|
||||||
n_miners: <amount> poimijaa
|
n_miners: <amount> poimijaa
|
||||||
@ -354,9 +331,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Uutta laitetta
|
title: 18 Uutta laitetta
|
||||||
desc: Automatisoi tehtaasi täysin!
|
desc: Automatisoi tehtaasi täysin!
|
||||||
savegames:
|
|
||||||
title: ∞ Tallennukset
|
|
||||||
desc: Niin paljon kuin sielusi kaipaa!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ päivitystasoa
|
title: ∞ päivitystasoa
|
||||||
desc: Kokeiluversiossa on vain viisi!
|
desc: Kokeiluversiossa on vain viisi!
|
||||||
@ -372,6 +346,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Tue minua
|
title: Tue minua
|
||||||
desc: Kehitän peliä vapaa-ajallani!
|
desc: Kehitän peliä vapaa-ajallani!
|
||||||
|
achievements:
|
||||||
|
title: Saavutukset
|
||||||
|
desc: Metsästä kaikki!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Kuljettimet, jakelijat & tunnelit
|
name: Kuljettimet, jakelijat & tunnelit
|
||||||
@ -401,22 +378,25 @@ buildings:
|
|||||||
description: Sallii sähkönkuljetuksen
|
description: Sallii sähkönkuljetuksen
|
||||||
second:
|
second:
|
||||||
name: Johto
|
name: Johto
|
||||||
description: Siirtää signaaleja, jotka voivat olla muotoja, värejä, taikka binääriarvoja (1 / 0).
|
description: Siirtää signaaleja, jotka voivat olla muotoja, värejä, taikka
|
||||||
Eriväriset johdot eivät yhdisty toisiinsa.
|
binääriarvoja (1 / 0). Eriväriset johdot eivät yhdisty
|
||||||
|
toisiinsa.
|
||||||
miner:
|
miner:
|
||||||
default:
|
default:
|
||||||
name: Poimija
|
name: Poimija
|
||||||
description: Laita muodon tai värin päälle poimiaksesi sitä.
|
description: Laita muodon tai värin päälle poimiaksesi sitä.
|
||||||
chainable:
|
chainable:
|
||||||
name: Poimija (Sarja)
|
name: Poimija (Sarja)
|
||||||
description: Laita muodon tai värin päälle poimiaksesi sitä. Voidaan kytkeä sarjaan.
|
description: Laita muodon tai värin päälle poimiaksesi sitä. Voidaan kytkeä
|
||||||
|
sarjaan.
|
||||||
underground_belt:
|
underground_belt:
|
||||||
default:
|
default:
|
||||||
name: Tunneli
|
name: Tunneli
|
||||||
description: Sallii resurssien kuljetuksen laitteiden ja kuljetinten alta.
|
description: Sallii resurssien kuljetuksen laitteiden ja kuljetinten alta.
|
||||||
tier2:
|
tier2:
|
||||||
name: Tunneli taso II
|
name: Tunneli taso II
|
||||||
description: Sallii resurssien kuljetuksen laitteiden ja kuljetinten alta pidemmältä matkalta.
|
description: Sallii resurssien kuljetuksen laitteiden ja kuljetinten alta
|
||||||
|
pidemmältä matkalta.
|
||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: Leikkuri
|
name: Leikkuri
|
||||||
@ -462,8 +442,8 @@ buildings:
|
|||||||
sisääntulosta tulevalla värillä.
|
sisääntulosta tulevalla värillä.
|
||||||
quad:
|
quad:
|
||||||
name: Maalain (neljännes)
|
name: Maalain (neljännes)
|
||||||
description: Maalaa jokaisen neljänneksen erikseen. Vain ruudut
|
description: Maalaa jokaisen neljänneksen erikseen. Vain ruudut joissa
|
||||||
joissa <strong>signaali on tosi</strong> johtotasolla maalataan.
|
<strong>signaali on tosi</strong> johtotasolla maalataan.
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
name: Roskakori
|
name: Roskakori
|
||||||
@ -471,24 +451,25 @@ buildings:
|
|||||||
balancer:
|
balancer:
|
||||||
default:
|
default:
|
||||||
name: Tasaaja
|
name: Tasaaja
|
||||||
description: Monikäyttöinen - Jakaa sisääntulot tasaisesti kaikkiin ulostuloihin.
|
description: Monikäyttöinen - Jakaa sisääntulot tasaisesti kaikkiin
|
||||||
|
ulostuloihin.
|
||||||
merger:
|
merger:
|
||||||
name: Yhdistäjä (compact)
|
name: Yhdistäjä (kompakti)
|
||||||
description: Yhdistää kaksi kuljetinta yhteen.
|
description: Yhdistää kaksi kuljetinta yhteen.
|
||||||
merger-inverse:
|
merger-inverse:
|
||||||
name: Yhdistäjä (compact)
|
name: Yhdistäjä (kompakti)
|
||||||
description: Yhdistää kaksi kuljetinta yhteen.
|
description: Yhdistää kaksi kuljetinta yhteen.
|
||||||
splitter:
|
splitter:
|
||||||
name: Erottaja (compact)
|
name: Erottaja (kompakti)
|
||||||
description: Erottaa kuljettimen kahteen kuljettimeen.
|
description: Erottaa kuljettimen kahteen kuljettimeen.
|
||||||
splitter-inverse:
|
splitter-inverse:
|
||||||
name: Erottaja (compact)
|
name: Erottaja (kompakti)
|
||||||
description: Erottaa kuljettimen kahteen kuljettimeen.
|
description: Erottaa kuljettimen kahteen kuljettimeen.
|
||||||
storage:
|
storage:
|
||||||
default:
|
default:
|
||||||
name: Varasto
|
name: Varasto
|
||||||
description: Varastoi ylijäämätavarat tiettyyn kapasiteettiin asti. Priorisoi vasemman ulostulon
|
description: Varastoi ylijäämätavarat tiettyyn kapasiteettiin asti. Priorisoi
|
||||||
ja voidaan käyttää ylivuotoporttina.
|
vasemman ulostulon ja voidaan käyttää ylivuotoporttina.
|
||||||
wire_tunnel:
|
wire_tunnel:
|
||||||
default:
|
default:
|
||||||
name: Johdon ylitys
|
name: Johdon ylitys
|
||||||
@ -496,29 +477,31 @@ buildings:
|
|||||||
constant_signal:
|
constant_signal:
|
||||||
default:
|
default:
|
||||||
name: Jatkuva signaali
|
name: Jatkuva signaali
|
||||||
description: Lähettää vakiosignaalin, joka voi olla muoto, väri, taikka binääriarvo (1 / 0).
|
description: Lähettää vakiosignaalin, joka voi olla muoto, väri, taikka
|
||||||
|
binääriarvo (1 / 0).
|
||||||
lever:
|
lever:
|
||||||
default:
|
default:
|
||||||
name: Kytkin
|
name: Kytkin
|
||||||
description: Voidaan kytkeä lähettämään binääriarvoa (1 / 0) johtotasolla,
|
description: Voidaan kytkeä lähettämään binääriarvoa (1 / 0) johtotasolla, jota
|
||||||
jota voidaan sitten käyttää esimerkiksi tavarasuodattimen ohjaukseen.
|
voidaan sitten käyttää esimerkiksi tavarasuodattimen ohjaukseen.
|
||||||
logic_gate:
|
logic_gate:
|
||||||
default:
|
default:
|
||||||
name: AND portti
|
name: AND portti
|
||||||
description: Lähettää totuusarvon "1", jos molemmat sisääntulot ovat totta. (Totuus tarkoittaa,
|
description: Lähettää totuusarvon "1", jos molemmat sisääntulot ovat totta.
|
||||||
että muoto, väri tai binääriarvo on "1")
|
(Totuus tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
||||||
not:
|
not:
|
||||||
name: NOT portti
|
name: NOT portti
|
||||||
description: Lähettää totuusarvon "1", jos sisääntulot eivät ole totta.
|
description: Lähettää totuusarvon "1", jos sisääntulot eivät ole totta. (Totuus
|
||||||
(Totuus tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
||||||
xor:
|
xor:
|
||||||
name: XOR portti
|
name: XOR portti
|
||||||
description: Lähettää totuusarvon "1", jos yksi sisääntuloista on totta, mutta kaikki eivät.
|
description: Lähettää totuusarvon "1", jos yksi sisääntuloista on totta, mutta
|
||||||
(Totuus tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
kaikki eivät. (Totuus tarkoittaa, että muoto, väri tai
|
||||||
|
binääriarvo on "1")
|
||||||
or:
|
or:
|
||||||
name: OR portti
|
name: OR portti
|
||||||
description: Lähettää totuusarvon "1", jos yksi sisääntuloista on totta.
|
description: Lähettää totuusarvon "1", jos yksi sisääntuloista on totta. (Totuus
|
||||||
(Totuus tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
tarkoittaa, että muoto, väri tai binääriarvo on "1")
|
||||||
transistor:
|
transistor:
|
||||||
default:
|
default:
|
||||||
name: Transistori
|
name: Transistori
|
||||||
@ -531,13 +514,13 @@ buildings:
|
|||||||
filter:
|
filter:
|
||||||
default:
|
default:
|
||||||
name: Suodatin
|
name: Suodatin
|
||||||
description: Yhdistä signaali reitittääksesi kaikki vastaavat tavarat ylös,
|
description: Yhdistä signaali reitittääksesi kaikki vastaavat tavarat ylös, ja
|
||||||
ja jäljelle jäävät vasemmalle. Voidaan ohjata myös binääriarvoilla.
|
jäljelle jäävät vasemmalle. Voidaan ohjata myös binääriarvoilla.
|
||||||
display:
|
display:
|
||||||
default:
|
default:
|
||||||
name: Näyttö
|
name: Näyttö
|
||||||
description: Yhdistä signaali näyttääksesi sen näytöllä. Voi olla muoto,
|
description: Yhdistä signaali näyttääksesi sen näytöllä. Voi olla muoto, väri
|
||||||
väri tai binääriarvo.
|
tai binääriarvo.
|
||||||
reader:
|
reader:
|
||||||
default:
|
default:
|
||||||
name: Kuljetinanturi
|
name: Kuljetinanturi
|
||||||
@ -551,8 +534,8 @@ buildings:
|
|||||||
comparator:
|
comparator:
|
||||||
default:
|
default:
|
||||||
name: Vertain
|
name: Vertain
|
||||||
description: Palauttaa totuusarvon "1", jos molemmat signaalit ovat täysin samat.
|
description: Palauttaa totuusarvon "1", jos molemmat signaalit ovat täysin
|
||||||
Voi verrata värejä, tavaroita ja binääriarvoja.
|
samat. Voi verrata värejä, tavaroita ja binääriarvoja.
|
||||||
virtual_processor:
|
virtual_processor:
|
||||||
default:
|
default:
|
||||||
name: Virtuaalileikkuri
|
name: Virtuaalileikkuri
|
||||||
@ -562,35 +545,38 @@ buildings:
|
|||||||
description: Käännä tavara virtuaalisesti, sekä myötäpäivään että vastapäivään.
|
description: Käännä tavara virtuaalisesti, sekä myötäpäivään että vastapäivään.
|
||||||
unstacker:
|
unstacker:
|
||||||
name: Virtuaalierottaja
|
name: Virtuaalierottaja
|
||||||
description: Erota ylin taso virtuaalisesti oikeaan ulostuloon ja jäljelle jäävät
|
description: Erota ylin taso virtuaalisesti oikeaan ulostuloon ja jäljelle
|
||||||
vasempaan ulostuloon.
|
jäävät vasempaan ulostuloon.
|
||||||
stacker:
|
stacker:
|
||||||
name: Virtuaaliyhdistäjä
|
name: Virtuaaliyhdistäjä
|
||||||
description: Yhdistä oikea tavara virtuaalisesti vasempaan.
|
description: Yhdistä oikea tavara virtuaalisesti vasempaan.
|
||||||
painter:
|
painter:
|
||||||
name: Virtuaalimaalain
|
name: Virtuaalimaalain
|
||||||
description: Maalaa virtuaalisesti tavara alhaalta sisääntulosta oikean sisääntulon värillä.
|
description: Maalaa virtuaalisesti tavara alhaalta sisääntulosta oikean
|
||||||
|
sisääntulon värillä.
|
||||||
item_producer:
|
item_producer:
|
||||||
default:
|
default:
|
||||||
name: Signaaligeneraattori
|
name: Signaaligeneraattori
|
||||||
description: Saatavilla vain hiekkalaatikkotilassa. Lähettää
|
description: Saatavilla vain hiekkalaatikkotilassa. Lähettää johtotasolla
|
||||||
johtotasolla annetun signaalin normaaliin tasoon.
|
annetun signaalin normaaliin tasoon.
|
||||||
storyRewards:
|
storyRewards:
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Muotojen Leikkaus
|
title: Muotojen Leikkaus
|
||||||
desc: Avasit juuri <strong>leikkurin</strong>. Se leikkaa muotoja ylhäältä alaspäin
|
desc: Avasit <strong>Leikkurin</strong>, joka leikkaa muotoja
|
||||||
ja tuottaa muodon molemmat puoliskot. <strong>Jos käytät vain yhden puoliskon, tuhoa toinen
|
ylhäältä alas <strong>muodon suunnasta
|
||||||
puolisko tai se jumittaa leikkurin!</strong> - Siksi sinulla on
|
riippumatta</strong>!<br><br>muista hankkiutua eroon jätteestä, tai
|
||||||
<strong>roskakori</strong>, joka tuhoaa kaiken sinne laittamasi!
|
muuten <strong>se tukkii ja pysäyttää leikkurin</strong> - Siksi
|
||||||
|
olen antanut sinulle <strong>roskiksen</strong>, joka tuhoaa
|
||||||
|
kaiken sinne laitetun!
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Kääntö
|
title: Kääntö
|
||||||
desc: Avasit <strong>Kääntäjän</strong>! Se kääntää muotoja myötäpäivään 90 astetta.
|
desc: Avasit <strong>Kääntäjän</strong>! Se kääntää muotoja myötäpäivään 90
|
||||||
|
astetta.
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Värjäys
|
title: Värjäys
|
||||||
desc: "Avasit <strong>Maalaimen</strong> - Poimi joitain värialueita
|
desc: "Avasit <strong>Maalaimen</strong> - Poimi joitain värialueita (Samoin
|
||||||
(Samoin kuin muotoja) ja yhdistä se muotoon maalaimen
|
kuin muotoja) ja yhdistä se muotoon maalaimen avulla!<br><br>PS: Jos
|
||||||
avulla!<br><br>PS: Jos olet värisokea, asetuksissa on <strong> tila
|
olet värisokea, asetuksissa on <strong> tila värisokeille</strong>!"
|
||||||
värisokeille</strong>!"
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Värin Sekoitus
|
title: Värin Sekoitus
|
||||||
desc: Avasit <strong>Värinsekoittajan</strong> - Yhdistä kaksi väriä
|
desc: Avasit <strong>Värinsekoittajan</strong> - Yhdistä kaksi väriä
|
||||||
@ -617,14 +603,15 @@ storyRewards:
|
|||||||
<strong>painamalla 'T' vaihtaaksesi sen versioita</strong>!
|
<strong>painamalla 'T' vaihtaaksesi sen versioita</strong>!
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Sarjapoimija
|
title: Sarjapoimija
|
||||||
desc: "Avasit juuri <strong>Sarjapoimijan</strong>! Se voi
|
desc: "Avasit juuri <strong>Sarjapoimijan</strong>! Se voi <strong>siirtää
|
||||||
<strong>siirtää resurssejaan</strong> muihin poimijoihin, joten
|
resurssejaan</strong> muihin poimijoihin, joten voit hankkia
|
||||||
voit hankkia resursseja tehokkaammin!<br><br> PS: Vanha
|
resursseja tehokkaammin!<br><br> PS: Vanha poimija on nyt korvattu
|
||||||
poimija on nyt korvattu työkalupalkissa!"
|
työkalupalkissa!"
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunneli Taso II
|
title: Tunneli Taso II
|
||||||
desc: Avasit uuden version <strong>Tunnelista</strong> - Siinä on <strong>pidempi
|
desc: Avasit uuden version <strong>Tunnelista</strong> - Siinä on
|
||||||
kantama</strong>, ja voit myös yhdistellä ja sovitella tunneleita!
|
<strong>pidempi kantama</strong>, ja voit myös yhdistellä ja
|
||||||
|
sovitella tunneleita!
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Neljännesleikkuri
|
title: Neljännesleikkuri
|
||||||
desc: Avasit version <strong>Leikkurista</strong> - Se sallii muotojen
|
desc: Avasit version <strong>Leikkurista</strong> - Se sallii muotojen
|
||||||
@ -636,38 +623,40 @@ storyRewards:
|
|||||||
kerrallaan</strong> käyttäen vain yhden värin kahden sijaan!
|
kerrallaan</strong> käyttäen vain yhden värin kahden sijaan!
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Varastopuskuri
|
title: Varastopuskuri
|
||||||
desc: Olet avannut <strong>Varaston</strong> - Voit varastoida
|
desc: Olet avannut <strong>Varaston</strong> - Voit varastoida resursseja
|
||||||
resursseja tiettyyn rajaan saakka!<br><br> Priorisoi vasemman ulostulon
|
tiettyyn rajaan saakka!<br><br> Priorisoi vasemman ulostulon ja
|
||||||
ja voidaan käyttää <strong> ylivuotoporttina</strong>!
|
voidaan käyttää <strong> ylivuotoporttina</strong>!
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Vapaapeli
|
title: Vapaapeli
|
||||||
desc: Onnistuit! Avasit juuri <strong>vapaapelimuodon</strong>!
|
desc: Onnistuit! Avasit juuri <strong>vapaapelimuodon</strong>! Muodot luodaan
|
||||||
Muodot luodaan nyt <strong>satunnaisesti</strong><br><br>
|
nyt <strong>satunnaisesti</strong><br><br> Koska keskusrakennus vaatii
|
||||||
Since the hub will require a <strong>throughput</strong> from now
|
tietyn <strong>kuljetuskapasiteetin</strong> tästä eteenpäin, suosittelen
|
||||||
on, I highly recommend to build a machine which automatically
|
lämpimästi rakentamaan koneen, joka tuottaa vaaditun muodon
|
||||||
delivers the requested shape!<br><br> The HUB outputs the requested
|
automaattisesti!<br><br> Keskusrakennus lähettää pyydetyn muodon
|
||||||
shape on the wires layer, so all you have to do is to analyze it and
|
johtotasolle, joten sinun ei tarvitse kuin analysoida se ja
|
||||||
automatically configure your factory based on that.
|
konfiguroida tehtaasi sen perusteella.
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Piirustukset
|
title: Piirustukset
|
||||||
desc: Nyt voit <strong>Kopioida ja Liittää</strong> paloja tehtaastasi! Valitse
|
desc: Nyt voit <strong>Kopioida ja Liittää</strong> paloja tehtaastasi! Valitse
|
||||||
alue (pidä CTRL pohjassa ja raahaa hiirellä), ja paina 'C'
|
alue (pidä CTRL pohjassa ja raahaa hiirellä), ja paina 'C'
|
||||||
kopioidaksesi piirrustuksen.<br><br>Sen liittäminen ei ole
|
kopioidaksesi piirrustuksen.<br><br>Sen liittäminen ei ole
|
||||||
<strong>ilmaista</strong>. Sinun täytyy tuottaa <strong>piirustusmuotoja</strong>,
|
<strong>ilmaista</strong>. Sinun täytyy tuottaa
|
||||||
jotta sinulla on varaa siihen! (Ne mitkä juuri toimitit).
|
<strong>piirustusmuotoja</strong>, jotta sinulla on varaa siihen!
|
||||||
|
(Ne mitkä juuri toimitit).
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Seuraava taso
|
title: Seuraava taso
|
||||||
desc: "Et saanut palkintoa tältä tasolta, mutta seuraavalta tasolta saat! <br><br> PS: Parempi
|
desc: "Et saanut palkintoa tältä tasolta, mutta seuraavalta tasolta saat!
|
||||||
olla tuhoamatta vanhoja tehtaita - Tarvitset <strong>kaikkia</strong>
|
<br><br> PS: Parempi olla tuhoamatta vanhoja tehtaita - Tarvitset
|
||||||
muotoja myöhemmin <strong>avataksesi päivityksiä</strong>!"
|
<strong>kaikkia</strong> muotoja myöhemmin <strong>avataksesi
|
||||||
|
päivityksiä</strong>!"
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: Seuraava taso
|
title: Seuraava taso
|
||||||
desc: Onnittelut! Muuten, lisää sisältöä on suunniteltu täysversioon!
|
desc: Onnittelut! Muuten, lisää sisältöä on suunniteltu täysversioon!
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Tasaaja
|
title: Tasaaja
|
||||||
desc: Monikäyttöinen <strong>tasaaja</strong> avattu - Voit rakentaa
|
desc: Monikäyttöinen <strong>tasaaja</strong> avattu - Voit rakentaa sen avulla
|
||||||
sen avulla isompia tehtaita <strong>erottaen ja yhdistäen
|
isompia tehtaita <strong>erottaen ja yhdistäen tavaroita</strong>
|
||||||
tavaroita</strong> useille kuljettimille!
|
useille kuljettimille!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: Kompakti Yhdistäjä
|
title: Kompakti Yhdistäjä
|
||||||
desc: Avasit <strong>yhdistäjän</strong>, joka on versio
|
desc: Avasit <strong>yhdistäjän</strong>, joka on versio
|
||||||
@ -675,51 +664,56 @@ storyRewards:
|
|||||||
reward_belt_reader:
|
reward_belt_reader:
|
||||||
title: Kuljetinanturi
|
title: Kuljetinanturi
|
||||||
desc: Olet avannut <strong>Kuljetinanturin</strong>! Voit mitata kuljettimen
|
desc: Olet avannut <strong>Kuljetinanturin</strong>! Voit mitata kuljettimen
|
||||||
tehokkuutta.<br><br>Ja odotahan vain, kunhan saat Johdot auki. Sitten tämä on kätevä!
|
tehokkuutta.<br><br>Ja odotahan vain, kunhan saat Johdot auki.
|
||||||
|
Sitten tämä on kätevä!
|
||||||
reward_rotater_180:
|
reward_rotater_180:
|
||||||
title: Kääntäjä (180°)
|
title: Kääntäjä (180°)
|
||||||
desc: Avasit juuri 180-asteen <strong>Kääntäjän</strong>! - Sillä voit
|
desc: Avasit juuri 180-asteen <strong>Kääntäjän</strong>! - Sillä voit kääntää
|
||||||
kääntää muotoa 180 astetta (Ylläripylläri! :D)
|
muotoa 180 astetta (Ylläripylläri! :D)
|
||||||
reward_display:
|
reward_display:
|
||||||
title: Näyttö
|
title: Näyttö
|
||||||
desc: "Avasit juuri <strong>Näytön</strong> - Yhdistä signaali näyttöön
|
desc: "Avasit juuri <strong>Näytön</strong> - Yhdistä signaali näyttöön
|
||||||
Johto-tasolla visualisoidaksesi sen<br><br> PS: Huomasitko, että kuljetinanturi ja varasto näyttävät viimeisimmän esineen? Yritäpä saada se näkyviin näytölle!"
|
Johto-tasolla visualisoidaksesi sen<br><br> PS: Huomasitko, että
|
||||||
|
kuljetinanturi ja varasto näyttävät viimeisimmän esineen? Yritäpä
|
||||||
|
saada se näkyviin näytölle!"
|
||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: Jatkuva Signaali
|
title: Jatkuva Signaali
|
||||||
desc: Avasit <strong>Jatkuvan Signaalin</strong> laitteen johtotasolla!
|
desc: Avasit <strong>Jatkuvan Signaalin</strong> laitteen johtotasolla! Tämä on
|
||||||
Tämä on hyödyllinen esimerkiksi yhdistettynä
|
hyödyllinen esimerkiksi yhdistettynä
|
||||||
<strong>tavarasuodattimeen.</strong><br><br> Jatkuva signaali voi lähettää esim.
|
<strong>tavarasuodattimeen.</strong><br><br> Jatkuva signaali voi
|
||||||
<strong>muodon</strong>, <strong>värin</strong> tai <strong>binääriarvon</strong> (1 / 0).
|
lähettää esim. <strong>muodon</strong>, <strong>värin</strong> tai
|
||||||
|
<strong>binääriarvon</strong> (1 / 0).
|
||||||
reward_logic_gates:
|
reward_logic_gates:
|
||||||
title: Logiikkaportit
|
title: Logiikkaportit
|
||||||
desc: Avasit <strong>Logiikkaportit</strong> (heh,heh)! Niistä ei tarvitse innostua,
|
desc: Avasit <strong>Logiikkaportit</strong> (heh,heh)! Niistä ei tarvitse
|
||||||
mutta ne ovat oikeasti tosi päheitä!<br><br> Logiikkaporteilla
|
innostua, mutta ne ovat oikeasti tosi päheitä!<br><br>
|
||||||
voit suorittaa AND, OR, XOR ja NOT operaatioita.<br><br> Kaupanpäällisiksi sait
|
Logiikkaporteilla voit suorittaa AND, OR, XOR ja NOT
|
||||||
myös <strong>transistorin</strong>!
|
operaatioita.<br><br> Kaupanpäällisiksi sait myös
|
||||||
|
<strong>transistorin</strong>!
|
||||||
reward_virtual_processing:
|
reward_virtual_processing:
|
||||||
title: Virtuaaliprosessointi
|
title: Virtuaaliprosessointi
|
||||||
desc: Sait juuri hyvän setin uusia laitteita, joiden avulla
|
desc: Sait juuri hyvän setin uusia laitteita, joiden avulla <strong>voit
|
||||||
<strong>voit simuloida muotojen prosessointia</strong>!<br><br> Nyt voit
|
simuloida muotojen prosessointia</strong>!<br><br> Nyt voit
|
||||||
simuloida leikkuria, kääntäjää, pinoajaa ja muita johtotasolla!
|
simuloida leikkuria, kääntäjää, pinoajaa ja muita johtotasolla!
|
||||||
Sinulla on nyt kolme vaihtoehtoa pelin jatkamiseen:<br><br> -
|
Sinulla on nyt kolme vaihtoehtoa pelin jatkamiseen:<br><br> -
|
||||||
Rakenna <strong>automatisoitu kone</strong> luodaksesi mikä tahansa
|
Rakenna <strong>automatisoitu kone</strong> luodaksesi mikä tahansa
|
||||||
keskusrakennuksen vaatima muoto (Suosittelen kokeilemaan!).<br><br> - Rakenna
|
keskusrakennuksen vaatima muoto (Suosittelen kokeilemaan!).<br><br>
|
||||||
jotakin hienoa johdoilla.<br><br> - Jatka pelaamista
|
- Rakenna jotakin hienoa johdoilla.<br><br> - Jatka pelaamista
|
||||||
tavallisesti.<br><br> Mitä valitsetkin, muista pitää hauskaa!
|
tavallisesti.<br><br> Mitä valitsetkin, muista pitää hauskaa!
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: Johdot & Nelimaalain
|
title: Johdot & Nelimaalain
|
||||||
desc: "Avasit juuri <strong>Johtotason</strong>: Se on erillinen
|
desc: "Avasit juuri <strong>Johtotason</strong>: Se on erillinen taso tavallisen
|
||||||
taso tavallisen tason päällä ja sieltä löytyy useita uusia
|
tason päällä ja sieltä löytyy useita uusia mekaniikkoja!<br><br>
|
||||||
mekaniikkoja!<br><br> Aluksi avasin sinulle <strong>Nelimaalaimen</strong>
|
Aluksi avasin sinulle <strong>Nelimaalaimen</strong> - Yhdistä
|
||||||
- Yhdistä johtotasolla lokerot, joihin haluat maalia<br><br>
|
johtotasolla lokerot, joihin haluat maalia<br><br> Vaihtaaksesi
|
||||||
Vaihtaaksesi johtotasolle, paina <strong>E</strong>. <br><br>
|
johtotasolle, paina <strong>E</strong>. <br><br> PS: <strong>Aktivoi
|
||||||
PS: <strong>Aktivoi vinkit</strong> asetuksissa nähdäksesi Johdot-tutoriaalin!"
|
vinkit</strong> asetuksissa nähdäksesi Johdot-tutoriaalin!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Esinesuodatin
|
title: Esinesuodatin
|
||||||
desc: Olet avannut <strong>Esinesuodattimen</strong>! Se lähettää esineet
|
desc: Olet avannut <strong>Esinesuodattimen</strong>! Se lähettää esineet joko
|
||||||
joko ylös tai oikealle riippuen siitä vastaavatko ne
|
ylös tai oikealle riippuen siitä vastaavatko ne signaalia
|
||||||
signaalia johtotasolla vai eivät.<br><br> Voit myös lähettää
|
johtotasolla vai eivät.<br><br> Voit myös lähettää binääriarvon (1 /
|
||||||
binääriarvon (1 / 0) aktivoidaksesi tai sammuttaaksesi sen.
|
0) aktivoidaksesi tai sammuttaaksesi sen.
|
||||||
reward_demo_end:
|
reward_demo_end:
|
||||||
title: Kokeiluversion loppu!
|
title: Kokeiluversion loppu!
|
||||||
desc: Olet läpäissyt kokeiluversion!
|
desc: Olet läpäissyt kokeiluversion!
|
||||||
@ -739,7 +733,8 @@ settings:
|
|||||||
uiScale:
|
uiScale:
|
||||||
title: Käyttöliittymän koko
|
title: Käyttöliittymän koko
|
||||||
description: Muuttaa käyttöliittymän kokoa. Käyttöliittymä skaalataan silti
|
description: Muuttaa käyttöliittymän kokoa. Käyttöliittymä skaalataan silti
|
||||||
laitteen resoluution perusteella, mutta tämä asetus määrittää skaalauksen määrän.
|
laitteen resoluution perusteella, mutta tämä asetus määrittää
|
||||||
|
skaalauksen määrän.
|
||||||
scales:
|
scales:
|
||||||
super_small: Erittäin pieni
|
super_small: Erittäin pieni
|
||||||
small: Pieni
|
small: Pieni
|
||||||
@ -782,12 +777,12 @@ settings:
|
|||||||
saattavat olla puutteellisia!
|
saattavat olla puutteellisia!
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: Värisokeatila
|
title: Värisokeatila
|
||||||
description: Ottaa käyttöön useita työkaluja, jotka helpottavat pelaamista
|
description: Ottaa käyttöön useita työkaluja, jotka helpottavat pelaamista jos
|
||||||
jos olet värisokea.
|
olet värisokea.
|
||||||
fullscreen:
|
fullscreen:
|
||||||
title: Kokonäyttö
|
title: Kokonäyttö
|
||||||
description: Peliä suositellaan pelattavaksi kokonäytön tilassa
|
description: Peliä suositellaan pelattavaksi kokonäytön tilassa parhaan
|
||||||
parhaan kokemuksen saamiseksi. Saatavilla vain täysversiossa.
|
kokemuksen saamiseksi. Saatavilla vain täysversiossa.
|
||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: Mykistä äänet
|
title: Mykistä äänet
|
||||||
description: Jos käytössä, mykistää kaikki ääniefektit.
|
description: Jos käytössä, mykistää kaikki ääniefektit.
|
||||||
@ -826,16 +821,16 @@ settings:
|
|||||||
tekstin lukemisesta helpompaa.
|
tekstin lukemisesta helpompaa.
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Kiertäminen laitetyypin mukaan
|
title: Kiertäminen laitetyypin mukaan
|
||||||
description: Muistaa jokaisen laitetyypin viimeisimmän kiertoasetuksen.
|
description: Muistaa jokaisen laitetyypin viimeisimmän kiertoasetuksen. Tämä voi
|
||||||
Tämä voi olla mukavampi vaihtoehto jos sijoitat usein eri laitetyyppejä.
|
olla mukavampi vaihtoehto jos sijoitat usein eri laitetyyppejä.
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Kompaktit laitetiedot
|
title: Kompaktit laitetiedot
|
||||||
description: Lyhentää laitteiden tietolaatikoita näyttämällä vain niiden
|
description: Lyhentää laitteiden tietolaatikoita näyttämällä vain niiden
|
||||||
suhteet. Muuten laitteen kuvaus ja kuva näytetään.
|
suhteet. Muuten laitteen kuvaus ja kuva näytetään.
|
||||||
disableCutDeleteWarnings:
|
disableCutDeleteWarnings:
|
||||||
title: Poista leikkaus/poisto -varoitukset
|
title: Poista leikkaus/poisto -varoitukset
|
||||||
description: Poista varoitusikkunat, jotka ilmestyvät kun leikkaat/poistat enemmän
|
description: Poista varoitusikkunat, jotka ilmestyvät kun leikkaat/poistat
|
||||||
kuin 100 entiteettiä.
|
enemmän kuin 100 entiteettiä.
|
||||||
soundVolume:
|
soundVolume:
|
||||||
title: Efektien äänenvoimakkuus
|
title: Efektien äänenvoimakkuus
|
||||||
description: Aseta ääniefektien äänenvoimakkuus
|
description: Aseta ääniefektien äänenvoimakkuus
|
||||||
@ -845,13 +840,16 @@ settings:
|
|||||||
lowQualityMapResources:
|
lowQualityMapResources:
|
||||||
title: Alhaisen tason resurssit
|
title: Alhaisen tason resurssit
|
||||||
description: Yksinkertaistaa resurssikenttien ulkonäön suurennetussa näkymässä
|
description: Yksinkertaistaa resurssikenttien ulkonäön suurennetussa näkymässä
|
||||||
suorituskyvyn parantamiseksi. Näyttää jopa siistimmältä, joten kannattaa kokeilla!
|
suorituskyvyn parantamiseksi. Näyttää jopa siistimmältä, joten
|
||||||
|
kannattaa kokeilla!
|
||||||
disableTileGrid:
|
disableTileGrid:
|
||||||
title: Poista ruudukko
|
title: Poista ruudukko
|
||||||
description: Poistaa ruudukon ja parantaa suorituskykyä. Pelialue näyttää myös siistimmältä!
|
description: Poistaa ruudukon ja parantaa suorituskykyä. Pelialue näyttää myös
|
||||||
|
siistimmältä!
|
||||||
clearCursorOnDeleteWhilePlacing:
|
clearCursorOnDeleteWhilePlacing:
|
||||||
title: Tyhjennä kursori oikalla klikillä
|
title: Tyhjennä kursori oikalla klikillä
|
||||||
description: Oletuksena päällä. Tyhjentää kursorin klikattaessa oikealla kun laite on valittu asetettavaksi.
|
description: Oletuksena päällä. Tyhjentää kursorin klikattaessa oikealla kun
|
||||||
|
laite on valittu asetettavaksi.
|
||||||
lowQualityTextures:
|
lowQualityTextures:
|
||||||
title: Alhaisen tason tekstuurit (ruma)
|
title: Alhaisen tason tekstuurit (ruma)
|
||||||
description: Käyttää alhaisen tason tekstuureja tehojen säästämiseksi. Tämä
|
description: Käyttää alhaisen tason tekstuureja tehojen säästämiseksi. Tämä
|
||||||
@ -862,16 +860,21 @@ settings:
|
|||||||
reunat jokaiselle kimpaleelle näytetään.
|
reunat jokaiselle kimpaleelle näytetään.
|
||||||
pickMinerOnPatch:
|
pickMinerOnPatch:
|
||||||
title: Valitse poimija resurssikentässä
|
title: Valitse poimija resurssikentässä
|
||||||
description: Oletuksena päällä. Valitsee poimijan jos käytät pipettiä resurssikentän päällä.
|
description: Oletuksena päällä. Valitsee poimijan jos käytät pipettiä
|
||||||
|
resurssikentän päällä.
|
||||||
simplifiedBelts:
|
simplifiedBelts:
|
||||||
title: Yksinkertaiset kuljettimet (ruma)
|
title: Yksinkertaiset kuljettimet (ruma)
|
||||||
description: Ei näytä tavaroita kuljettimella, ellei hiiren osoitin ole sen päällä. Asetusta ei suositella, ellet todella tarvitse lisätehoja.
|
description: Ei näytä tavaroita kuljettimella, ellei hiiren osoitin ole sen
|
||||||
|
päällä. Asetusta ei suositella, ellet todella tarvitse
|
||||||
|
lisätehoja.
|
||||||
enableMousePan:
|
enableMousePan:
|
||||||
title: Ruudun liikuttaminen hiirellä
|
title: Ruudun liikuttaminen hiirellä
|
||||||
description: Liikuttaa ruutua siirrettäessä hiiri reunaan. Nopeus määritellään liikenopeuden asetuksissa.
|
description: Liikuttaa ruutua siirrettäessä hiiri reunaan. Nopeus määritellään
|
||||||
|
liikenopeuden asetuksissa.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Suurenna kursoriin
|
title: Suurenna kursoriin
|
||||||
description: Aktivoituna suurentaa näkymää hiiren osoittimen suuntaan. Muuten suurentaa ruudun keskelle.
|
description: Aktivoituna suurentaa näkymää hiiren osoittimen suuntaan. Muuten
|
||||||
|
suurentaa ruudun keskelle.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Kartan resurssien koko
|
title: Kartan resurssien koko
|
||||||
description: Määrittää muotojen koon kartalla (loitonnettaessa).
|
description: Määrittää muotojen koon kartalla (loitonnettaessa).
|
||||||
@ -925,7 +928,7 @@ keybindings:
|
|||||||
pasteLastBlueprint: Liitä viimeisin piirustus
|
pasteLastBlueprint: Liitä viimeisin piirustus
|
||||||
cycleBuildings: Valitse rakennuksia
|
cycleBuildings: Valitse rakennuksia
|
||||||
lockBeltDirection: Ota kuljetinsuunnittelija käyttöön
|
lockBeltDirection: Ota kuljetinsuunnittelija käyttöön
|
||||||
switchDirectionLockSide: "Suunnittelija: Muuta sivua"
|
switchDirectionLockSide: "Suunnittelija: Vaihda sivua"
|
||||||
massSelectStart: Pidä pohjassa ja raahaa aloittaaksesi
|
massSelectStart: Pidä pohjassa ja raahaa aloittaaksesi
|
||||||
massSelectSelectMultiple: Valitse useita alueita
|
massSelectSelectMultiple: Valitse useita alueita
|
||||||
massSelectCopy: Kopioi alue
|
massSelectCopy: Kopioi alue
|
||||||
@ -949,18 +952,24 @@ keybindings:
|
|||||||
comparator: Vertaa
|
comparator: Vertaa
|
||||||
item_producer: Signaaligeneraattori (Hiekkalaattikko)
|
item_producer: Signaaligeneraattori (Hiekkalaattikko)
|
||||||
copyWireValue: "Johdot: Kopioi arvo kursorin kohdalta"
|
copyWireValue: "Johdot: Kopioi arvo kursorin kohdalta"
|
||||||
|
rotateToUp: "Käännä: osoittaa ylös"
|
||||||
|
rotateToDown: "Käännä: osoittaa alas"
|
||||||
|
rotateToRight: "Käännä: osoittaa oikealle"
|
||||||
|
rotateToLeft: "Käännä: osoittaa vasemmalle"
|
||||||
about:
|
about:
|
||||||
title: Tietoja tästä pelistä
|
title: Tietoja tästä pelistä
|
||||||
body: >-
|
body: >-
|
||||||
Tämä peli on avointa lähdekoodia ja kehittäjä on <a
|
Tämä peli on avointa lähdekoodia ja <a
|
||||||
href="https://github.com/tobspr" target="_blank">Tobias Springer</a>
|
href="https://github.com/tobspr" target="_blank">Tobias Springer</a>in
|
||||||
(tämä on minä).<br><br>
|
(siis minun) kehittämäni.<br><br>
|
||||||
|
|
||||||
Tämän pelin tekeminen ei olisi ollut mahdollista ilman suurta Discord-yhteisöä pelini ympärillä - Voisit liittyä <a href="<discordlink>" target="_blank">Discord palvelimelleni</a>!<br><br>
|
Jos haluat avustaa, käy katsomassa <a href="<githublink>" target="_blank">shapez.io GitHubissa</a>.<br><br>
|
||||||
|
|
||||||
Ääniraidan on tehnyt <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Hän on mahtava.<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>
|
||||||
|
|
||||||
Lopuksi, isot kiitokset parhaalle kaverilleni <a href="https://github.com/niklas-dahl" target="_blank">Niklakselle</a> - Ilman meidän factorio istuntoja tätä peliä ei olisi koskaan olemassa.
|
Ääniraidan on tehnyt <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Hän on uskomattoman loistava.<br><br>
|
||||||
|
|
||||||
|
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:
|
changelog:
|
||||||
title: Muutosloki
|
title: Muutosloki
|
||||||
demo:
|
demo:
|
||||||
@ -977,7 +986,8 @@ tips:
|
|||||||
- Älä rakenna liian lähelle keskusrakennusta tai olet pian pulassa!
|
- Älä rakenna liian lähelle keskusrakennusta tai olet pian pulassa!
|
||||||
- Jos pinoaminen ei toimi, kokeile vaihtaa syöttöjä.
|
- Jos pinoaminen ei toimi, kokeile vaihtaa syöttöjä.
|
||||||
- Voit vaihtaa kuljetinsuunnittelijan suuntaa painamalla <b>R</b>.
|
- Voit vaihtaa kuljetinsuunnittelijan suuntaa painamalla <b>R</b>.
|
||||||
- <b>CTRL:n</b> painaminen antaa vetää kuljettimia ilman automaattisuuntausta.
|
- <b>CTRL:n</b> painaminen antaa vetää kuljettimia ilman
|
||||||
|
automaattisuuntausta.
|
||||||
- Suhteet säilyvät samana, kunhan kaikki pivityset ovat samalla tasolla.
|
- Suhteet säilyvät samana, kunhan kaikki pivityset ovat samalla tasolla.
|
||||||
- Sarjassa tekeminen on tehokkaampaa, kuin rinnan.
|
- Sarjassa tekeminen on tehokkaampaa, kuin rinnan.
|
||||||
- Rakennuksista avautuu lisää versioita myöhemmin pelissä!
|
- Rakennuksista avautuu lisää versioita myöhemmin pelissä!
|
||||||
@ -990,7 +1000,8 @@ tips:
|
|||||||
- Maksimitasolla 5 poimijaa täyttää yhden kuljettimen.
|
- Maksimitasolla 5 poimijaa täyttää yhden kuljettimen.
|
||||||
- Älä unohda tunneleita!
|
- Älä unohda tunneleita!
|
||||||
- Asioita ei tarvitse jakaa tasan parhaan tehokkuuden saavuttamiseksi.
|
- Asioita ei tarvitse jakaa tasan parhaan tehokkuuden saavuttamiseksi.
|
||||||
- <b>SHIFTin</b>painaminen aktivoi kuljetinsuunnittelijan, joka helpottaa pitkien linjojen rakentamista.
|
- <b>SHIFTin</b>painaminen aktivoi kuljetinsuunnittelijan, joka helpottaa
|
||||||
|
pitkien linjojen rakentamista.
|
||||||
- Leikkurit leikkaavat aina pystysuunnassa riippumatta niiden asemoinnista.
|
- Leikkurit leikkaavat aina pystysuunnassa riippumatta niiden asemoinnista.
|
||||||
- Sekoita kolmea väriä saadaksesi valkoista.
|
- Sekoita kolmea väriä saadaksesi valkoista.
|
||||||
- Varasto priorisoi ensimmäisen lähdön.
|
- Varasto priorisoi ensimmäisen lähdön.
|
||||||
@ -999,14 +1010,16 @@ tips:
|
|||||||
- <b>ALTia</b> voit vaihtaa kuljetinten suuntaa.
|
- <b>ALTia</b> voit vaihtaa kuljetinten suuntaa.
|
||||||
- Tehokkuus on keskeistä!
|
- Tehokkuus on keskeistä!
|
||||||
- Muotokentät ovat monimutkaisempia kauempana keskusrakennuksesta.
|
- Muotokentät ovat monimutkaisempia kauempana keskusrakennuksesta.
|
||||||
- Koneiden nopeus on rajoitettu. Jaa töitä useammalle koneelle tehokkuuden maksimoimiseksi
|
- Koneiden nopeus on rajoitettu. Jaa töitä useammalle koneelle tehokkuuden
|
||||||
|
maksimoimiseksi
|
||||||
- Käytä tasaajia tehokkuuden maksimoimiseksi.
|
- Käytä tasaajia tehokkuuden maksimoimiseksi.
|
||||||
- Järjestys on tärkeää. Vältä liiallista kuljetinten risteämistä.
|
- Järjestys on tärkeää. Vältä liiallista kuljetinten risteämistä.
|
||||||
- Suunnittele etukäteen tai jodut keskelle kaaosta!
|
- Suunnittele etukäteen tai jodut keskelle kaaosta!
|
||||||
- Älä poista vanhoja tehtaitasi! Tarvitset niitä päivitysten avaamiseen.
|
- Älä poista vanhoja tehtaitasi! Tarvitset niitä päivitysten avaamiseen.
|
||||||
- Yritä läpäistä taso 20 itseksesi, ennen kuin etsit apuja!
|
- Yritä läpäistä taso 20 itseksesi, ennen kuin etsit apuja!
|
||||||
- Älä monimutkaista asioita. Yksinkertainen vie pitkälle.
|
- Älä monimutkaista asioita. Yksinkertainen vie pitkälle.
|
||||||
- Saatat joutua käyttämään tehtaitasi uudelleen myöhemmin. Rakenna niistä kierrätettäviä.
|
- Saatat joutua käyttämään tehtaitasi uudelleen myöhemmin. Rakenna niistä
|
||||||
|
kierrätettäviä.
|
||||||
- Joskus tarvitsemasi muoto löytyy suoraan kartalta, etkä tarvitse pinoajia.
|
- Joskus tarvitsemasi muoto löytyy suoraan kartalta, etkä tarvitse pinoajia.
|
||||||
- Kokonaiset tuulimyllyt ja piikkipyörät eivät synny luonnollisesti.
|
- Kokonaiset tuulimyllyt ja piikkipyörät eivät synny luonnollisesti.
|
||||||
- Tehokkainta on maalata muodot ennen leikkausta.
|
- Tehokkainta on maalata muodot ennen leikkausta.
|
||||||
@ -1014,14 +1027,16 @@ tips:
|
|||||||
- Tee erilliset mallitehtaat. Ne ovat tärkeitä modulaarisuudessa.
|
- Tee erilliset mallitehtaat. Ne ovat tärkeitä modulaarisuudessa.
|
||||||
- Katso tarkkaan värinsekoitinta ja kysymyksiisi vastataan.
|
- Katso tarkkaan värinsekoitinta ja kysymyksiisi vastataan.
|
||||||
- <b>CTRL</b> + hiiren vasen nappi valitsee alueen.
|
- <b>CTRL</b> + hiiren vasen nappi valitsee alueen.
|
||||||
- Liian lähelle keskusrakennusta rakennettu tehdas on tiellä myöhemmissä projekteissa.
|
- Liian lähelle keskusrakennusta rakennettu tehdas on tiellä myöhemmissä
|
||||||
|
projekteissa.
|
||||||
- Nastaikoni päivityslistan muotojen vieressä kiinnittää muodon ruudulle.
|
- Nastaikoni päivityslistan muotojen vieressä kiinnittää muodon ruudulle.
|
||||||
- Sekoita kaikkia päävärejä saadaksesi valkoista!
|
- Sekoita kaikkia päävärejä saadaksesi valkoista!
|
||||||
- Kartta on ääretön. Älä rakenna tehtaitasi liian ahtaasti, laajenna!
|
- Kartta on ääretön. Älä rakenna tehtaitasi liian ahtaasti, laajenna!
|
||||||
- Kokeile myös Factoriota! Se on lempipelini.
|
- Kokeile myös Factoriota! Se on lempipelini.
|
||||||
- Nelileikkuri leikkaa myötäpäivään aloittaen yläoikealta!
|
- Nelileikkuri leikkaa myötäpäivään aloittaen yläoikealta!
|
||||||
- Voit ladata tallennuksesi päävalikosta!
|
- Voit ladata tallennuksesi päävalikosta!
|
||||||
- Tässä pelissä on monia käteviä pikanäppäimiä. Muista tutustua asetussivuihin.
|
- Tässä pelissä on monia käteviä pikanäppäimiä. Muista tutustua
|
||||||
|
asetussivuihin.
|
||||||
- Tässä pelissä on useita asetuksia. Tutustu niihin!
|
- Tässä pelissä on useita asetuksia. Tutustu niihin!
|
||||||
- Keskusrakennuksen merkissä on pieni kompassi osoittamassa sen suuntaa!
|
- Keskusrakennuksen merkissä on pieni kompassi osoittamassa sen suuntaa!
|
||||||
- Poistaaksesti kuljettimia leikkaa alue ja liitä se samaan kohtaan
|
- Poistaaksesti kuljettimia leikkaa alue ja liitä se samaan kohtaan
|
||||||
|
@ -6,50 +6,23 @@ steamPage:
|
|||||||
intro: >-
|
intro: >-
|
||||||
Vous aimez les jeux d’automatisation ? Ce jeu est pour vous !
|
Vous aimez les jeux d’automatisation ? Ce jeu est pour vous !
|
||||||
|
|
||||||
shapez.io est un jeu calme où vous devrez construire des usines pour produire automatiquement des formes géométriques. À mesure que le niveau augmente, les formes deviennent de plus en plus
|
shapez.io est un jeu calme où vous devrez construire des usines pour produire automatiquement des formes géométriques. À mesure que le niveau augmente, les formes deviennent de plus en plus complexes, et vous devrez vous étendre sur la carte infinie.
|
||||||
complexes, et vous devrez vous étendre sur la carte infinie.
|
|
||||||
|
|
||||||
Et en plus, vous devrez aussi produire de plus en plus pour satisfaire la demande. La seule solution est de construire en plus grand ! Au début vous ne ferez que découper les formes, mais
|
Et en plus, vous devrez aussi produire de plus en plus pour satisfaire la demande. La seule solution est de construire en plus grand ! Au début vous ne ferez que découper les formes, mais plus tard vous devrez les peindre — et pour ça vous devrez extraire et mélanger des couleurs !
|
||||||
plus tard vous devrez les peindre — et pour ça vous devrez extraire et mélanger des couleurs !
|
|
||||||
|
|
||||||
En achetant le jeu sur Steam, vous aurez accès à la version complète, mais vous pouvez aussi jouer à une démo sur shapez.io et vous décider ensuite !
|
En achetant le jeu sur Steam, vous aurez accès à la version complète, mais vous pouvez aussi jouer à une démo sur shapez.io et vous décider ensuite !
|
||||||
title_advantages: Avantages de la version complète
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 nouveaux niveaux</b> avec 26 niveaux en tout !
|
and time has flown by.
|
||||||
- <b>18 nouveaux bâtiments</b> pour automatiser entièrement votre usine !
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 niveaux d’amélioration</b> pour s’amuser pendant des heures !
|
how to make a computer in shapez.io
|
||||||
- <b>Les câbles</b> ouvrent une toute nouvelle dimension !
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Mode sombre</b> !
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Sauvegardes illimitées
|
efficient.
|
||||||
- Balises illimitées
|
|
||||||
- Me soutenir ! ❤️
|
|
||||||
title_future: Prévu
|
|
||||||
planned:
|
|
||||||
- Bibliothèque de plans
|
|
||||||
- Succès sur Steam
|
|
||||||
- Mode réflexion
|
|
||||||
- Mini-carte
|
|
||||||
- Mods
|
|
||||||
- Mode bac à sable
|
|
||||||
- …et bien plus !
|
|
||||||
title_open_source: Ce jeu est open source !
|
|
||||||
text_open_source: >-
|
|
||||||
Tout le monde peut contribuer. Je suis très impliqué dans la communauté
|
|
||||||
et j’essaie de lire toutes les suggestions et de prendre en compte vos
|
|
||||||
retours quand c’est possible.
|
|
||||||
|
|
||||||
N’oubliez pas de consulter mon tableau Trello pour voir tout le plan de développement !
|
|
||||||
title_links: Liens
|
|
||||||
links:
|
|
||||||
discord: Discord officiel
|
|
||||||
roadmap: Plan de développement
|
|
||||||
subreddit: Reddit
|
|
||||||
source_code: Code source (GitHub)
|
|
||||||
translate: Aidez à traduire
|
|
||||||
global:
|
global:
|
||||||
loading: Chargement
|
loading: Chargement
|
||||||
error: Erreur
|
error: Erreur
|
||||||
thousandsDivider:
|
thousandsDivider: ","
|
||||||
decimalSeparator: ","
|
decimalSeparator: ","
|
||||||
suffix:
|
suffix:
|
||||||
thousands: k
|
thousands: k
|
||||||
@ -153,10 +126,10 @@ dialogs:
|
|||||||
desc: "Voici les changements depuis votre dernière session de jeu :"
|
desc: "Voici les changements depuis votre dernière session de jeu :"
|
||||||
upgradesIntroduction:
|
upgradesIntroduction:
|
||||||
title: Débloquer les améliorations
|
title: Débloquer les améliorations
|
||||||
desc: <strong>Ne détruisez pas vos anciennes usines !</strong> Toutes les
|
desc: <strong>Ne détruisez pas vos anciennes usines !</strong> Toutes les formes
|
||||||
formes que vous produisez peuvent être utilisées pour débloquer des
|
que vous produisez peuvent être utilisées pour débloquer des
|
||||||
améliorations. L’onglet des améliorations se trouve dans le coin supérieur
|
améliorations. L’onglet des améliorations se trouve dans le coin
|
||||||
droit de l’écran.
|
supérieur droit de l’écran.
|
||||||
massDeleteConfirm:
|
massDeleteConfirm:
|
||||||
title: Confirmer la suppression
|
title: Confirmer la suppression
|
||||||
desc: Vous allez supprimer beaucoup de bâtiments (<count> pour être précis) !
|
desc: Vous allez supprimer beaucoup de bâtiments (<count> pour être précis) !
|
||||||
@ -319,32 +292,35 @@ ingame:
|
|||||||
plus vite votre but.<br><br> Astuce : Gardez
|
plus vite votre but.<br><br> Astuce : Gardez
|
||||||
<strong>MAJ</strong> enfoncé pour placer plusieurs extracteurs,
|
<strong>MAJ</strong> enfoncé pour placer plusieurs extracteurs,
|
||||||
et utilisez <strong>R</strong> pour les faire pivoter."
|
et utilisez <strong>R</strong> pour les faire pivoter."
|
||||||
2_1_place_cutter: "Maintenant, placez un <strong>découpeur</strong> pour
|
2_1_place_cutter: "Maintenant, placez un <strong>découpeur</strong> pour couper
|
||||||
couper les cercles en deux.<br><br> PS : Le découpeur coupe toujours
|
les cercles en deux.<br><br> PS : Le découpeur coupe toujours
|
||||||
<strong>de haut en bas</strong> quelle que soit son orientation."
|
<strong>de haut en bas</strong> quelle que soit son
|
||||||
|
orientation."
|
||||||
2_2_place_trash: Le découpeur peut se <strong>bloquer</strong> !<br><br>
|
2_2_place_trash: Le découpeur peut se <strong>bloquer</strong> !<br><br>
|
||||||
Utilisez la <strong>poubelle</strong> pour vous débarrasser des déchets
|
Utilisez la <strong>poubelle</strong> pour vous débarrasser des
|
||||||
dont vous n’avez pas (encore) besoin.
|
déchets dont vous n’avez pas (encore) besoin.
|
||||||
2_3_more_cutters: "Bravo ! Maintenant ajoutez <strong>deux découpeurs de
|
2_3_more_cutters: "Bravo ! Maintenant ajoutez <strong>deux découpeurs de
|
||||||
plus</strong> pour accélérer le processus !<br><br>
|
plus</strong> pour accélérer le processus !<br><br> PS :
|
||||||
PS : Utilisez les <strong>raccourcis clavier 0–9</strong> pour accéder
|
Utilisez les <strong>raccourcis clavier 0–9</strong> pour
|
||||||
plus rapidement aux bâtiments."
|
accéder plus rapidement aux bâtiments."
|
||||||
3_1_rectangles: "Maintenant, extrayez des rectangles.<strong>Construisez
|
3_1_rectangles: "Maintenant, extrayez des rectangles.<strong>Construisez quatre
|
||||||
quatre extracteurs</strong> et connectez-les au centre.<br><br>
|
extracteurs</strong> et connectez-les au centre.<br><br> PS :
|
||||||
PS : Gardez <strong>MAJ</strong> enfoncé en plaçant un convoyeur pour
|
Gardez <strong>MAJ</strong> enfoncé en plaçant un convoyeur pour
|
||||||
activer le planificateur."
|
activer le planificateur."
|
||||||
21_1_place_quad_painter: Placez une <strong>station de peinture quadruple</strong> et
|
21_1_place_quad_painter: Placez une <strong>station de peinture
|
||||||
connectez des <strong>cercles</strong> et des couleurs
|
quadruple</strong> et connectez des <strong>cercles</strong> et
|
||||||
<strong>blanche</strong> et <strong>rouge</strong> !
|
des couleurs <strong>blanche</strong> et
|
||||||
|
<strong>rouge</strong> !
|
||||||
21_2_switch_to_wires: Basculez sur le calque de câblage en appuyant sur
|
21_2_switch_to_wires: Basculez sur le calque de câblage en appuyant sur
|
||||||
<strong>E</strong>.<br><br> Puis <strong>connectez les quatre
|
<strong>E</strong>.<br><br> Puis <strong>connectez les quatre
|
||||||
entrées</strong> de la station de peinture quadruple avec des câbles !
|
entrées</strong> de la station de peinture quadruple avec des
|
||||||
21_3_place_button: Génial ! Maintenant, placez un
|
câbles !
|
||||||
<strong>interrupteur</strong> et connectez-le avec des câbles !
|
21_3_place_button: Génial ! Maintenant, placez un <strong>interrupteur</strong>
|
||||||
21_4_press_button: "Appuyez sur le bouton pour qu’il émette un
|
et connectez-le avec des câbles !
|
||||||
<strong>signal vrai</strong> et active la station de peinture quadruple.<br><br> PS : Vous
|
21_4_press_button: "Appuyez sur le bouton pour qu’il émette un <strong>signal
|
||||||
n’êtes pas obligé de connecter toutes les entrées ! Essayez d’en brancher
|
vrai</strong> et active la station de peinture
|
||||||
seulement deux."
|
quadruple.<br><br> PS : Vous n’êtes pas obligé de connecter
|
||||||
|
toutes les entrées ! Essayez d’en brancher seulement deux."
|
||||||
connectedMiners:
|
connectedMiners:
|
||||||
one_miner: 1 extracteur
|
one_miner: 1 extracteur
|
||||||
n_miners: <amount> extracteurs
|
n_miners: <amount> extracteurs
|
||||||
@ -363,9 +339,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 nouveaux bâtiments
|
title: 18 nouveaux bâtiments
|
||||||
desc: Automatisez entièrement votre usine !
|
desc: Automatisez entièrement votre usine !
|
||||||
savegames:
|
|
||||||
title: Sauvegardes ∞
|
|
||||||
desc: Autant que votre cœur le désire !
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ niveaux d’amélioration
|
title: ∞ niveaux d’amélioration
|
||||||
desc: Cette version de démonstration n’en a que 5 !
|
desc: Cette version de démonstration n’en a que 5 !
|
||||||
@ -381,6 +354,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Me soutenir
|
title: Me soutenir
|
||||||
desc: Je le développe pendant mon temps libre !
|
desc: Je le développe pendant mon temps libre !
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Convoyeurs, distributeurs et tunnels
|
name: Convoyeurs, distributeurs et tunnels
|
||||||
@ -473,16 +449,16 @@ buildings:
|
|||||||
painter:
|
painter:
|
||||||
default:
|
default:
|
||||||
name: Station de peinture
|
name: Station de peinture
|
||||||
description: Peint entièrement la forme venant de gauche avec la couleur
|
description: Peint entièrement la forme venant de gauche avec la couleur entrant
|
||||||
entrant en haut.
|
en haut.
|
||||||
mirrored:
|
mirrored:
|
||||||
name: Station de peinture
|
name: Station de peinture
|
||||||
description: Peint entièrement la forme venant de gauche avec la couleur
|
description: Peint entièrement la forme venant de gauche avec la couleur entrant
|
||||||
entrant en bas.
|
en bas.
|
||||||
double:
|
double:
|
||||||
name: Station de peinture (double)
|
name: Station de peinture (double)
|
||||||
description: Peint entièrement les deux formes venant de gauche avec la
|
description: Peint entièrement les deux formes venant de gauche avec la couleur
|
||||||
couleur entrant en haut.
|
entrant en haut.
|
||||||
quad:
|
quad:
|
||||||
name: Station de peinture (quadruple)
|
name: Station de peinture (quadruple)
|
||||||
description: Peint chaque quadrant d’une forme avec une couleur différente.
|
description: Peint chaque quadrant d’une forme avec une couleur différente.
|
||||||
@ -574,8 +550,8 @@ buildings:
|
|||||||
comparator:
|
comparator:
|
||||||
default:
|
default:
|
||||||
name: Comparateur
|
name: Comparateur
|
||||||
description: Émet “1” si les deux entrées sont exactement les mêmes, sinon
|
description: Émet “1” si les deux entrées sont exactement les mêmes, sinon émet
|
||||||
émet “0”. Peut comparer des formes, des couleurs, et des booléens.
|
“0”. Peut comparer des formes, des couleurs, et des booléens.
|
||||||
virtual_processor:
|
virtual_processor:
|
||||||
default:
|
default:
|
||||||
name: Découpeur virtuel
|
name: Découpeur virtuel
|
||||||
@ -601,19 +577,20 @@ buildings:
|
|||||||
storyRewards:
|
storyRewards:
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Découpage de formes
|
title: Découpage de formes
|
||||||
desc: Vous avez débloqué le <strong>découpeur</strong>. Il coupe des formes en
|
desc: You just unlocked the <strong>cutter</strong>, which cuts shapes in half
|
||||||
deux <strong>de haut en bas</strong> quelle que soit son
|
from top to bottom <strong>regardless of its
|
||||||
orientation !<br><br> Assurez-vous de vous débarrasser des déchets,
|
orientation</strong>!<br><br>Be sure to get rid of the waste, or
|
||||||
sinon <strong>gare au blocage</strong>. À cet effet, je mets à votre
|
otherwise <strong>it will clog and stall</strong> - For this purpose
|
||||||
disposition la poubelle, qui détruit tout ce que vous y mettez !
|
I have given you the <strong>trash</strong>, which destroys
|
||||||
|
everything you put into it!
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Rotation
|
title: Rotation
|
||||||
desc: Le <strong>pivoteur</strong> a été débloqué ! Il pivote les formes de 90
|
desc: Le <strong>pivoteur</strong> a été débloqué ! Il pivote les formes de 90
|
||||||
degrés vers la droite.
|
degrés vers la droite.
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Peinture
|
title: Peinture
|
||||||
desc: "La <strong>station de peinture</strong> a été débloquée. Extrayez
|
desc: "La <strong>station de peinture</strong> a été débloquée. Extrayez des
|
||||||
des pigments de couleur (comme vous le faites avec les formes) et
|
pigments de couleur (comme vous le faites avec les formes) et
|
||||||
combinez-les avec une forme dans une station pour les peindre !
|
combinez-les avec une forme dans une station pour les peindre !
|
||||||
<br><br>PS : Si vous êtes daltonien, il y a un <strong>mode
|
<br><br>PS : Si vous êtes daltonien, il y a un <strong>mode
|
||||||
daltonien</strong> paramétrable dans les préférences !"
|
daltonien</strong> paramétrable dans les préférences !"
|
||||||
@ -631,10 +608,9 @@ storyRewards:
|
|||||||
<strong>placée au-dessus</strong> de la forme de gauche.
|
<strong>placée au-dessus</strong> de la forme de gauche.
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Répartiteur
|
title: Répartiteur
|
||||||
desc: Le <strong>répartiteur</strong> multifonctionnel a été débloqué. Il peut
|
desc: The multifunctional <strong>balancer</strong> has been unlocked - It can
|
||||||
être utilisé pour construire de plus grandes usines en
|
be used to build bigger factories by <strong>splitting and merging
|
||||||
<strong>distribuant équitablement et rassemblant les formes</strong>
|
items</strong> onto multiple belts!
|
||||||
entre plusieurs convoyeurs !<br><br>
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: Tunnel
|
title: Tunnel
|
||||||
desc: Le <strong>tunnel</strong> a été débloqué. Vous pouvez maintenant faire
|
desc: Le <strong>tunnel</strong> a été débloqué. Vous pouvez maintenant faire
|
||||||
@ -659,12 +635,13 @@ storyRewards:
|
|||||||
reward_merger:
|
reward_merger:
|
||||||
title: Fusionneur compact
|
title: Fusionneur compact
|
||||||
desc: Vous avez débloqué le <strong>fusionneur</strong>, une variante du
|
desc: Vous avez débloqué le <strong>fusionneur</strong>, une variante du
|
||||||
<strong>répartiteur</strong>. Il accepte deux entrées et les fusionne en un
|
<strong>répartiteur</strong>. Il accepte deux entrées et les
|
||||||
seul convoyeur !
|
fusionne en un seul convoyeur !
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Répartiteur compact
|
title: Répartiteur compact
|
||||||
desc: Vous avez débloqué une variante compacte du <strong>répartiteur</strong> —
|
desc: You have unlocked a <strong>splitter</strong> variant of the
|
||||||
Il accepte une seule entrée et la divise en deux sorties !
|
<strong>balancer</strong> - It accepts one input and splits them
|
||||||
|
into two!
|
||||||
reward_belt_reader:
|
reward_belt_reader:
|
||||||
title: Lecteur de débit
|
title: Lecteur de débit
|
||||||
desc: Vous avez débloqué le <strong>lecteur de débit</strong> ! Il vous permet
|
desc: Vous avez débloqué le <strong>lecteur de débit</strong> ! Il vous permet
|
||||||
@ -677,10 +654,10 @@ storyRewards:
|
|||||||
plutôt que seulement deux !
|
plutôt que seulement deux !
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Station de peinture double
|
title: Station de peinture double
|
||||||
desc: Vous avez débloqué une variante de la <strong>station de peinture</strong>
|
desc: Vous avez débloqué une variante de la <strong>station de
|
||||||
— Elle fonctionne comme la station de peinture de base, mais elle permet de
|
peinture</strong> — Elle fonctionne comme la station de peinture de
|
||||||
traiter <strong>deux formes à la fois</strong> en ne consommant qu’une
|
base, mais elle permet de traiter <strong>deux formes à la
|
||||||
couleur au lieu de deux !
|
fois</strong> en ne consommant qu’une couleur au lieu de deux !
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Stockage
|
title: Stockage
|
||||||
desc: Vous avez débloqué le bâtiment de <strong>stockage</strong>. Il permet de
|
desc: Vous avez débloqué le bâtiment de <strong>stockage</strong>. Il permet de
|
||||||
@ -704,11 +681,11 @@ storyRewards:
|
|||||||
desc: "Vous avez débloqué le <strong>calque de câblage</strong> : C’est un
|
desc: "Vous avez débloqué le <strong>calque de câblage</strong> : C’est un
|
||||||
calque au-dessus du calque normal, qui introduit beaucoup de
|
calque au-dessus du calque normal, qui introduit beaucoup de
|
||||||
nouvelles mécaniques de jeu !<br><br> Pour commencer, je vous
|
nouvelles mécaniques de jeu !<br><br> Pour commencer, je vous
|
||||||
débloque la <strong>station de peinture quadruple</strong>. Connectez les
|
débloque la <strong>station de peinture quadruple</strong>.
|
||||||
entrées à peindre sur le calque de câblage.<br><br> Pour voir le
|
Connectez les entrées à peindre sur le calque de câblage.<br><br>
|
||||||
calque de câblage, appuyez sur <strong>E</strong>.<br><br>PS : Activez
|
Pour voir le calque de câblage, appuyez sur
|
||||||
les <strong>indices</strong> dans les paramètres pour voir un tutoriel
|
<strong>E</strong>.<br><br>PS : Activez les <strong>indices</strong>
|
||||||
sur le câblage."
|
dans les paramètres pour voir un tutoriel sur le câblage."
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Filtre à objets
|
title: Filtre à objets
|
||||||
desc: Vous avez débloqué le <strong>filtre à objets</strong> ! Il dirige les
|
desc: Vous avez débloqué le <strong>filtre à objets</strong> ! Il dirige les
|
||||||
@ -735,22 +712,18 @@ storyRewards:
|
|||||||
desc: "Vous avez débloqué les <strong>portes logiques</strong> ! Vous n’êtes pas
|
desc: "Vous avez débloqué les <strong>portes logiques</strong> ! Vous n’êtes pas
|
||||||
obligé de trouver ça génial, mais en fait c’est super cool !<br><br>
|
obligé de trouver ça génial, mais en fait c’est super cool !<br><br>
|
||||||
Avec ces portes, vous pouvez maintenant faire les opérations
|
Avec ces portes, vous pouvez maintenant faire les opérations
|
||||||
booléennes ET, OU, OU-EXCLUSIF et NON !<br><br> Et la cerise
|
booléennes ET, OU, OU-EXCLUSIF et NON !<br><br> Et la cerise sur le
|
||||||
sur le gâteau : je vous donne aussi le
|
gâteau : je vous donne aussi le <strong>transistor</strong> !"
|
||||||
<strong>transistor</strong> !"
|
|
||||||
reward_virtual_processing:
|
reward_virtual_processing:
|
||||||
title: Traitement virtuel
|
title: Traitement virtuel
|
||||||
desc: Je viens de vous donner tout un tas de nouveaux bâtiments qui vous
|
desc: I just gave a whole bunch of new buildings which allow you to
|
||||||
permettent de <strong>simuler le traitement des
|
<strong>simulate the processing of shapes</strong>!<br><br> You can
|
||||||
formes</strong> !<br><br> Vous pouvez maintenant simuler un
|
now simulate a cutter, rotator, stacker and more on the wires layer!
|
||||||
découpeur, un pivoteur, un combineur et plus encore sur le calque de
|
With this you now have three options to continue the game:<br><br> -
|
||||||
câblage !<br><br> Avec ça, vous avez trois possibilités pour
|
Build an <strong>automated machine</strong> to create any possible
|
||||||
continuer le jeu :<br><br> - Construire une <strong>machine
|
shape requested by the HUB (I recommend to try it!).<br><br> - Build
|
||||||
automatisée</strong> pour fabriquer n’importe quelle forme demandée
|
something cool with wires.<br><br> - Continue to play
|
||||||
par le centre (je conseille d’essayer !).<br><br> - Construire
|
normally.<br><br> Whatever you choose, remember to have fun!
|
||||||
quelque chose de cool avec des câbles.<br><br> - Continuer à jouer
|
|
||||||
normalement.<br><br> Dans tous les cas, l’important c’est de
|
|
||||||
s’amuser !
|
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Niveau suivant
|
title: Niveau suivant
|
||||||
desc: "Ce niveau n’a pas de récompense mais le prochain, si !<br><br> PS : Ne
|
desc: "Ce niveau n’a pas de récompense mais le prochain, si !<br><br> PS : Ne
|
||||||
@ -943,10 +916,12 @@ settings:
|
|||||||
déplacement.
|
déplacement.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Zoomer vers le curseur
|
title: Zoomer vers le curseur
|
||||||
description: Si activé, zoome vers la position de la souris ; sinon, vers le centre de l’écran.
|
description: Si activé, zoome vers la position de la souris ; sinon, vers le
|
||||||
|
centre de l’écran.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Taille des ressources sur la carte
|
title: Taille des ressources sur la carte
|
||||||
description: Contrôle la taille des formes sur la vue d’ensemble de la carte visible en dézoomant.
|
description: Contrôle la taille des formes sur la vue d’ensemble de la carte
|
||||||
|
visible en dézoomant.
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Contrôles
|
title: Contrôles
|
||||||
hint: "Astuce : N’oubliez pas d’utiliser CTRL, MAJ et ALT ! Ces touches activent
|
hint: "Astuce : N’oubliez pas d’utiliser CTRL, MAJ et ALT ! Ces touches activent
|
||||||
@ -1021,6 +996,10 @@ keybindings:
|
|||||||
placementDisableAutoOrientation: Désactiver l’orientation automatique
|
placementDisableAutoOrientation: Désactiver l’orientation automatique
|
||||||
placeMultiple: Rester en mode placement
|
placeMultiple: Rester en mode placement
|
||||||
placeInverse: Inverser l’orientation des convoyeurs
|
placeInverse: Inverser l’orientation des convoyeurs
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: À propos de ce jeu
|
title: À propos de ce jeu
|
||||||
body: >-
|
body: >-
|
||||||
@ -1030,8 +1009,7 @@ about:
|
|||||||
|
|
||||||
Si vous souhaitez contribuer, allez voir <a href="<githublink>" target="_blank">shapez.io sur GitHub</a>.<br><br>
|
Si vous souhaitez contribuer, allez voir <a href="<githublink>" target="_blank">shapez.io sur GitHub</a>.<br><br>
|
||||||
|
|
||||||
Ce jeu n’aurait pas pu être réalisé sans la précieuse communauté Discord autour de mes jeux — Vous devriez vraiment rejoindre le
|
Ce jeu n’aurait pas pu être réalisé sans la précieuse communauté Discord autour de mes jeux — Vous devriez vraiment rejoindre le <a href="<discordlink>" target="_blank">serveur Discord</a> !<br><br>
|
||||||
<a href="<discordlink>" 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 génial !<br><br>
|
La bande son a été créée par <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> — Il est génial !<br><br>
|
||||||
|
|
||||||
@ -1063,8 +1041,8 @@ tips:
|
|||||||
- La symétrie est la clé !
|
- La symétrie est la clé !
|
||||||
- Vous pouvez entrelacer différents niveaux de tunnels.
|
- Vous pouvez entrelacer différents niveaux de tunnels.
|
||||||
- Essayez de construire des usines compactes, cela paiera !
|
- Essayez de construire des usines compactes, cela paiera !
|
||||||
- La station de peinture a une variante en miroir que vous pouvez sélectionner avec
|
- La station de peinture a une variante en miroir que vous pouvez
|
||||||
<b>T</b>
|
sélectionner avec <b>T</b>
|
||||||
- Avoir les bons ratios de construction maximisera l’efficacité.
|
- Avoir les bons ratios de construction maximisera l’efficacité.
|
||||||
- Au niveau maximum, 5 extracteurs rempliront un seul convoyeur.
|
- Au niveau maximum, 5 extracteurs rempliront un seul convoyeur.
|
||||||
- N’oubliez pas les tunnels !
|
- N’oubliez pas les tunnels !
|
||||||
@ -1076,8 +1054,7 @@ tips:
|
|||||||
orientation.
|
orientation.
|
||||||
- Pour obtenir du blanc, mélangez les trois couleurs.
|
- Pour obtenir du blanc, mélangez les trois couleurs.
|
||||||
- Le stockage priorise la première sortie.
|
- Le stockage priorise la première sortie.
|
||||||
- Investissez du temps pour créer des plans reproductibles, ça vaut le
|
- Investissez du temps pour créer des plans reproductibles, ça vaut le coup !
|
||||||
coup !
|
|
||||||
- Maintenir <b>CTRL</b> permet de placer plusieurs bâtiments.
|
- Maintenir <b>CTRL</b> permet de placer plusieurs bâtiments.
|
||||||
- Vous pouvez maintenir <b>ALT</b> pour inverser la direction des convoyeurs
|
- Vous pouvez maintenir <b>ALT</b> pour inverser la direction des convoyeurs
|
||||||
placés.
|
placés.
|
||||||
|
@ -13,39 +13,14 @@ steamPage:
|
|||||||
While you only process shapes at the beginning, you have to color them later - for this you have to extract and mix colors!
|
While you only process shapes at the beginning, you have to color them later - for this you have to extract and mix colors!
|
||||||
|
|
||||||
Buying the game on Steam gives you access to the full version, but you can also play a demo on shapez.io first and decide later!
|
Buying the game on Steam gives you access to the full version, but you can also play a demo on shapez.io first and decide later!
|
||||||
title_advantages: Standalone Advantages
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 New Level</b> for a total of 26 levels
|
and time has flown by.
|
||||||
- <b>18 New Buildings</b> for a fully automated factory!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>Unlimited Upgrade Tiers</b> for many hours of fun!
|
how to make a computer in shapez.io
|
||||||
- <b>Wires Update</b> for an entirely new dimension!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Dark Mode</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Unlimited Savegames
|
efficient.
|
||||||
- Unlimited Markers
|
|
||||||
- Support me! ❤️
|
|
||||||
title_future: Planned Content
|
|
||||||
planned:
|
|
||||||
- Blueprint Library (Standalone Exclusive)
|
|
||||||
- Steam Achievements
|
|
||||||
- Puzzle Mode
|
|
||||||
- Minimap
|
|
||||||
- Mods
|
|
||||||
- Sandbox mode
|
|
||||||
- ... and a lot more!
|
|
||||||
title_open_source: This game is open source!
|
|
||||||
title_links: Links
|
|
||||||
links:
|
|
||||||
discord: Official Discord
|
|
||||||
roadmap: Roadmap
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Help translate
|
|
||||||
text_open_source: >-
|
|
||||||
Anybody can contribute, I'm actively involved in the community and
|
|
||||||
attempt to review all suggestions and take feedback into consideration
|
|
||||||
where possible.
|
|
||||||
|
|
||||||
Be sure to check out my trello board for the full roadmap!
|
|
||||||
global:
|
global:
|
||||||
loading: Učitavanje
|
loading: Učitavanje
|
||||||
error: Greška
|
error: Greška
|
||||||
@ -356,9 +331,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 New Buildings
|
title: 18 New Buildings
|
||||||
desc: Fully automate your factory!
|
desc: Fully automate your factory!
|
||||||
savegames:
|
|
||||||
title: ∞ Savegames
|
|
||||||
desc: As many as your heart desires!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Upgrade Tiers
|
title: ∞ Upgrade Tiers
|
||||||
desc: This demo version has only 5!
|
desc: This demo version has only 5!
|
||||||
@ -374,6 +346,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Support me
|
title: Support me
|
||||||
desc: I develop it in my spare time!
|
desc: I develop it in my spare time!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Trake, Distributer i Tuneli
|
name: Trake, Distributer i Tuneli
|
||||||
@ -970,6 +945,10 @@ keybindings:
|
|||||||
comparator: Compare
|
comparator: Compare
|
||||||
item_producer: Item Producer (Sandbox)
|
item_producer: Item Producer (Sandbox)
|
||||||
copyWireValue: "Wires: Copy value below cursor"
|
copyWireValue: "Wires: Copy value below cursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: O Igri
|
title: O Igri
|
||||||
body: >-
|
body: >-
|
||||||
|
@ -11,43 +11,18 @@ steamPage:
|
|||||||
És ha ez nem lenne elég, exponenciálisan többet kell termelned az igények kielégítése érdekében - az egyetlen dolog, ami segít, az a termelés mennyisége! Az alakzatokat a játék elején csak feldolgoznod kell, később azonban színezned is kell őket - ehhez bányászni és keverni kell a színeket!
|
És ha ez nem lenne elég, exponenciálisan többet kell termelned az igények kielégítése érdekében - az egyetlen dolog, ami segít, az a termelés mennyisége! Az alakzatokat a játék elején csak feldolgoznod kell, később azonban színezned is kell őket - ehhez bányászni és keverni kell a színeket!
|
||||||
|
|
||||||
A játék Steamen történő megvásárlása hozzáférést biztosít a teljes verzióhoz, de kipróbálhatod a játékot a shapez.io oldalon, és később dönthetsz!
|
A játék Steamen történő megvásárlása hozzáférést biztosít a teljes verzióhoz, de kipróbálhatod a játékot a shapez.io oldalon, és később dönthetsz!
|
||||||
title_advantages: Önálló Verzió Előnyei
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 Új Szint</b>, összesen 26
|
and time has flown by.
|
||||||
- <b>18 Új Épület</b> egy teljesen automatizált gyárhoz!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 Fejlesztési szint</b> sok órányi szórakozáshoz!
|
how to make a computer in shapez.io
|
||||||
- <b>Vezetékek Frissítés</b> egy teljesen új dimenzióhoz!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Sötét mód</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Végtelen mentés
|
efficient.
|
||||||
- Végtelen Jelölő
|
|
||||||
- Támogatod a Fejlesztőt ❤️
|
|
||||||
title_future: Tervezett Tartalom
|
|
||||||
planned:
|
|
||||||
- Tervrajz Könyvtár
|
|
||||||
- Steam Eredmények
|
|
||||||
- Puzzle Mód
|
|
||||||
- Kistérkép
|
|
||||||
- Modok
|
|
||||||
- Homokozó játékmód
|
|
||||||
- ... és még sok más!
|
|
||||||
title_open_source: A játék nyílt forráskódú!
|
|
||||||
text_open_source: >-
|
|
||||||
Bárki hozzájárulhat, aktívan részt veszek a közösségben és próbálok
|
|
||||||
áttekinteni minden javaslatot, és figyelembe veszem a visszajelzéseket,
|
|
||||||
ahol lehetséges.
|
|
||||||
|
|
||||||
Feltétlenül nézd meg a Trello táblámat a teljes ütemtervért!
|
|
||||||
title_links: Linkek
|
|
||||||
links:
|
|
||||||
discord: Hivatalos Discord
|
|
||||||
roadmap: Ütemterv
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Forráskód (GitHub)
|
|
||||||
translate: Segíts lefordítani
|
|
||||||
global:
|
global:
|
||||||
loading: Betöltés
|
loading: Betöltés
|
||||||
error: Hiba
|
error: Hiba
|
||||||
thousandsDivider: "."
|
thousandsDivider: .
|
||||||
decimalSeparator: ","
|
decimalSeparator: ","
|
||||||
suffix:
|
suffix:
|
||||||
thousands: e
|
thousands: e
|
||||||
@ -359,9 +334,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Új Épület
|
title: 18 Új Épület
|
||||||
desc: Egy teljesen automatikus gyárhoz!
|
desc: Egy teljesen automatikus gyárhoz!
|
||||||
savegames:
|
|
||||||
title: ∞ Mentés
|
|
||||||
desc: Amennyit csak szeretnél!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Fejlesztési Szint
|
title: ∞ Fejlesztési Szint
|
||||||
desc: A Demó Verzió csak 5-öt tartalmaz!
|
desc: A Demó Verzió csak 5-öt tartalmaz!
|
||||||
@ -377,6 +349,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Támogass
|
title: Támogass
|
||||||
desc: A játékot továbbfejlesztem szabadidőmben
|
desc: A játékot továbbfejlesztem szabadidőmben
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Futószalagok, Elosztók & Alagutak
|
name: Futószalagok, Elosztók & Alagutak
|
||||||
@ -743,7 +718,14 @@ storyRewards:
|
|||||||
desc: Elérted a Demó verzió végét!
|
desc: Elérted a Demó verzió végét!
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Végtelen Játékmód
|
title: Végtelen Játékmód
|
||||||
desc: Megcsináltad! Feloldottad a <strong>Végtelen Játékmódot</strong>! Innentől kezdve az alakzatok <strong>véleetlenszerűen</strong> generálódnak!<br><br> A Központ innentől nem darabszámot kér, hanem <strong>átmenő teljesítményt</strong>, így ajánlom, hogy építs egy olyan gépezetet, amely automatikusan eljuttatja a Központnak a kívánt alakzatot!<br><br> A Központ kiküldi a kívánt alakzatot a Vezeték rétegre, szóval annyi a dolgot, hogy megvizsgáld az Alakzatvizsgálóval és ez alapján beállítsd a gyáradat.
|
desc: Megcsináltad! Feloldottad a <strong>Végtelen Játékmódot</strong>! Innentől
|
||||||
|
kezdve az alakzatok <strong>véleetlenszerűen</strong>
|
||||||
|
generálódnak!<br><br> A Központ innentől nem darabszámot kér, hanem
|
||||||
|
<strong>átmenő teljesítményt</strong>, így ajánlom, hogy építs egy
|
||||||
|
olyan gépezetet, amely automatikusan eljuttatja a Központnak a
|
||||||
|
kívánt alakzatot!<br><br> A Központ kiküldi a kívánt alakzatot a
|
||||||
|
Vezeték rétegre, szóval annyi a dolgot, hogy megvizsgáld az
|
||||||
|
Alakzatvizsgálóval és ez alapján beállítsd a gyáradat.
|
||||||
settings:
|
settings:
|
||||||
title: Beállítások
|
title: Beállítások
|
||||||
categories:
|
categories:
|
||||||
@ -986,6 +968,10 @@ keybindings:
|
|||||||
placementDisableAutoOrientation: Automatikus irány kikapcsolása
|
placementDisableAutoOrientation: Automatikus irány kikapcsolása
|
||||||
placeMultiple: Több lehelyezése
|
placeMultiple: Több lehelyezése
|
||||||
placeInverse: Futószalag irányának megfordítása
|
placeInverse: Futószalag irányának megfordítása
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: A Játékról
|
title: A Játékról
|
||||||
body: >-
|
body: >-
|
||||||
@ -1016,30 +1002,29 @@ tips:
|
|||||||
- Igyekezz kompakt gyárakat építeni - megéri!
|
- Igyekezz kompakt gyárakat építeni - megéri!
|
||||||
- Ne építs közvetlenül a Központ közelébe, mert óriási káoszt okozhat!
|
- Ne építs közvetlenül a Központ közelébe, mert óriási káoszt okozhat!
|
||||||
- A szalagtervező irányát az <b>R</b> billentyűvel állíthatod.
|
- A szalagtervező irányát az <b>R</b> billentyűvel állíthatod.
|
||||||
- Az arányok mindaddig állandók maradnak, amíg a Fejlesztéseid azonos
|
- Holding <b>CTRL</b> allows dragging of belts without auto-orientation.
|
||||||
szinten vannak.
|
|
||||||
- A soros végrehajtás hatékonyabb, mint a párhuzamos.
|
- A soros végrehajtás hatékonyabb, mint a párhuzamos.
|
||||||
- A <b>T</b> megnyomásával váltogathatsz a különböző épülettípusok között.
|
- Serial execution is more efficient than parallel.
|
||||||
- A szimmetria kulcsfontosságú!
|
- A szimmetria kulcsfontosságú!
|
||||||
- A hatékonyság kulcsfontosságú!
|
- You can use <b>T</b> to switch between different variants.
|
||||||
- A Festőnek van egy tükrözött változata is, amit a <b>T</b>-vel hozhatsz elő.
|
- Symmetry is key!
|
||||||
- Az épületek megfelelő arányban való építésével maximalizálható a hatékonyság.
|
- Az épületek megfelelő arányban való építésével maximalizálható a
|
||||||
|
hatékonyság.
|
||||||
- A legmagasabb szinten 5 Bánya teljesen megtölt egy Futószalagot.
|
- A legmagasabb szinten 5 Bánya teljesen megtölt egy Futószalagot.
|
||||||
- Ne feledkezz meg az Alagutakról!
|
- The painter has a mirrored variant which you can select with <b>T</b>
|
||||||
- A <b>SHIFT</b> lenyomva tartásával bekapcsolod a Futószalagok automatikus
|
- Having the right building ratios will maximize efficiency.
|
||||||
iránykeresését, amellyel hosszú Futószalagokat helyezhetsz le könnyedén.
|
|
||||||
- A Vágók mindig függőleges irányban vágnak, mindegy, milyen irányban állnak.
|
- A Vágók mindig függőleges irányban vágnak, mindegy, milyen irányban állnak.
|
||||||
- A fehér szín előállításához keverd össze mindhárom színt.
|
- A fehér szín előállításához keverd össze mindhárom színt.
|
||||||
- A <b>SHIFT</b> lenyomva tartásával több épületet is lehelyezhetsz egymás után.
|
- You don't need to divide up items evenly for full efficiency.
|
||||||
- Az <b>ALT</b> lenyomva tartásával megfordíthatod a lehelyezendú Futószalag irányát.
|
- Az <b>ALT</b> lenyomva tartásával megfordíthatod a lehelyezendú Futószalag
|
||||||
|
irányát.
|
||||||
- A hatékonyság kulcsfontosságú!
|
- A hatékonyság kulcsfontosságú!
|
||||||
- A Központtól távolabb eső bányászható alakzatok jóval összetettebbek.
|
- A Központtól távolabb eső bányászható alakzatok jóval összetettebbek.
|
||||||
- A gépeknek korlátozott sebességük van, csinálj belőlük többet a maximális
|
- A gépeknek korlátozott sebességük van, csinálj belőlük többet a maximális
|
||||||
hatékonyságért.
|
hatékonyságért.
|
||||||
- Használj Elosztókat a maximális hatékonyságért.
|
- Használj Elosztókat a maximális hatékonyságért.
|
||||||
- A rendszerezettség fontos. Igyekezz a lehető legkevesebbszer keresztezni
|
- Holding <b>SHIFT</b> lets you place multiple buildings at a time.
|
||||||
Futószalagokat.
|
- You can hold <b>ALT</b> to invert the direction of placed belts.
|
||||||
- Tervezz előre, mert óriási káosz lehet a vége!
|
|
||||||
- Ne rombold le a régi gyáraidat! Szükséged lesz rájuk a Fejlesztésekhez.
|
- Ne rombold le a régi gyáraidat! Szükséged lesz rájuk a Fejlesztésekhez.
|
||||||
- Próbáld megdönteni a 20. Szintet, mielőtt segítséget kérnél!
|
- Próbáld megdönteni a 20. Szintet, mielőtt segítséget kérnél!
|
||||||
- Ne bonyolítsd túl a dolgokat; csináld egyszerűen és sokra viheted.
|
- Ne bonyolítsd túl a dolgokat; csináld egyszerűen és sokra viheted.
|
||||||
@ -1052,7 +1037,8 @@ tips:
|
|||||||
- Színezd be az alakzatodat vágás előtt a maximális hatékonyság érdekében.
|
- Színezd be az alakzatodat vágás előtt a maximális hatékonyság érdekében.
|
||||||
- Ha modulárisan építkezel, akkor nem számít a hely.
|
- Ha modulárisan építkezel, akkor nem számít a hely.
|
||||||
- Csinálj egy különálló Tervrajz-gyárat. A modulokhoz később hasznos lesz.
|
- Csinálj egy különálló Tervrajz-gyárat. A modulokhoz később hasznos lesz.
|
||||||
- A <b>CTRL</b> + balklikkel jelölhetsz ki egy területet a pályán.
|
- You may need to reuse factories later in the game. Build your factories to
|
||||||
|
be reusable.
|
||||||
- Ha közel építesz a Központhoz, útban lesz a következő projektjeidnek.
|
- Ha közel építesz a Központhoz, útban lesz a következő projektjeidnek.
|
||||||
- A Fejlesztések lapon a gombostű ikon megnyomásával kitűzheted a képernyőre
|
- A Fejlesztések lapon a gombostű ikon megnyomásával kitűzheted a képernyőre
|
||||||
az aktuális alakzatot.
|
az aktuális alakzatot.
|
||||||
@ -1061,7 +1047,7 @@ tips:
|
|||||||
- Próbáld ki a Factorio-t is! Az a kedvenc játékom.
|
- Próbáld ki a Factorio-t is! Az a kedvenc játékom.
|
||||||
- A Negyedelő az alakzat jobb felső negyedétől kezd vágni, az óramutató
|
- A Negyedelő az alakzat jobb felső negyedétől kezd vágni, az óramutató
|
||||||
járásával megegyező irányban!
|
járásával megegyező irányban!
|
||||||
- A játékmentéseidet a Főmenüben tudod lementeni!
|
- Use <b>CTRL</b> + Click to select an area.
|
||||||
- A játék nagyon sok hasznos gyorsbillentyűt tartalmaz! Nézd meg őket a
|
- A játék nagyon sok hasznos gyorsbillentyűt tartalmaz! Nézd meg őket a
|
||||||
Beállítások menüben.
|
Beállítások menüben.
|
||||||
- A játék nagyon sok beállítást tartalmaz, mindenképpen nézd meg őket!
|
- A játék nagyon sok beállítást tartalmaz, mindenképpen nézd meg őket!
|
||||||
@ -1070,3 +1056,12 @@ tips:
|
|||||||
ugyanarra a helyre.
|
ugyanarra a helyre.
|
||||||
- Az F4 megnyomásával láthatod az FPS-edet és a Tick/mp értéket.
|
- Az F4 megnyomásával láthatod az FPS-edet és a Tick/mp értéket.
|
||||||
- Nyomd meg az F4-et kétszer, hogy arra a csempére ugorj, ahol az egered van.
|
- Nyomd meg az F4-et kétszer, hogy arra a csempére ugorj, ahol az egered van.
|
||||||
|
- You can download your savegames in the main menu!
|
||||||
|
- This game has a lot of useful keybindings! Be sure to check out the
|
||||||
|
settings page.
|
||||||
|
- This game has a lot of settings, be sure to check them out!
|
||||||
|
- Your hub marker has a small compass that shows which direction it is in!
|
||||||
|
- To clear belts, cut the area and then paste it at the same location.
|
||||||
|
- Press F4 to show your FPS and Tick Rate.
|
||||||
|
- Press F4 twice to show the tile of your mouse and camera.
|
||||||
|
- You can click a pinned shape on the left side to unpin it.
|
||||||
|
@ -1,55 +1,28 @@
|
|||||||
steamPage:
|
steamPage:
|
||||||
shortText: shapez.io adalah game tentang membangun pabrik untuk mengotomatiskan
|
shortText: shapez.io adalah game tentang membangun pabrik untuk mengotomatiskan
|
||||||
pembuatan dan pemrosesan bentuk-bentuk yang semakin lama semakin kompleks
|
pembuatan dan pemrosesan bentuk-bentuk yang semakin lama semakin
|
||||||
di dalam peta yang meluas tanpa batas.
|
kompleks di dalam peta yang meluas tanpa batas.
|
||||||
discordLinkShort: Server Discord Resmi
|
discordLinkShort: Server Discord Resmi
|
||||||
intro: >-
|
intro: >-
|
||||||
Kamu suka game otomasi? Maka kamu berada di tempat yang tepat!
|
Kamu suka game otomasi? Maka kamu berada di tempat yang tepat!
|
||||||
|
|
||||||
shapez.io adalah game santai dimana kamu harus membuat pabrik untuk mengotomatiskan produksi bentuk-bentuk geometris. Semakin meningkatnya level, bentuk-bentuknya menjadi lebih kompleks,
|
shapez.io adalah game santai dimana kamu harus membuat pabrik untuk mengotomatiskan produksi bentuk-bentuk geometris. Semakin meningkatnya level, bentuk-bentuknya menjadi lebih kompleks, dan kamu perlu meluaskan pabrikmu semakin jauh lagi.
|
||||||
dan kamu perlu meluaskan pabrikmu semakin jauh lagi.
|
|
||||||
|
|
||||||
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
|
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!
|
||||||
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!
|
Membeli game ini di Steam memberikan kamu akses ke versi lengkap, namun kamu juga dapat mencoba demo dan memutuskan nanti!
|
||||||
title_advantages: Keuntungan Versi Lengkap
|
what_others_say: Apa yang orang lain katakan tentang shapez.io
|
||||||
advantages:
|
nothernlion_comment: Game ini bagus - Saya sangat menikmati waktu saya ketika
|
||||||
- <b>12 Level Baru</b> dengan total 26 level
|
memainkan game ini, dan waktu telah berlalu.
|
||||||
- <b>18 Bangunan Baru</b> untuk membuat pabrik yang otomatis sepenuhnya!
|
notch_comment: Oh sial. Saya benar-benar harus tidur, namun sepertinya saya baru
|
||||||
- <b>20 Tingkatan Upgrade</b> untuk keseruan berjam-jam!
|
menemukan bagaimana cara membuat komputer di shapez.io
|
||||||
- <b>Update Kabel</b> untuk dimensi yang benar-benar baru!
|
steam_review_comment: Game ini telah mencuri hidup saya dan saya tidak
|
||||||
- <b>Mode Gelap</b>!
|
menginginkannya kembali. Game pembuatan pabrik yang sangat santai yang tidak
|
||||||
- Data Simpanan Tidak Terbatas
|
akan membiarkan saya berhenti membuat pabrik saya lebih efisien.
|
||||||
- Penanda Tidak Terbatas
|
|
||||||
- Dukung saya! ❤️
|
|
||||||
title_future: Konten Terencana
|
|
||||||
planned:
|
|
||||||
- Perpustakaan Cetak Biru (Eksklusif Versi Lengkap)
|
|
||||||
- Achievement Steam
|
|
||||||
- Mode Puzzle
|
|
||||||
- Peta Kecil
|
|
||||||
- Modifikasi
|
|
||||||
- Mode Sandbox
|
|
||||||
- ... dan masih banyak lagi!
|
|
||||||
title_open_source: Game ini open source!
|
|
||||||
title_links: Tautan (Links)
|
|
||||||
links:
|
|
||||||
discord: Server Discord Resmi
|
|
||||||
roadmap: Peta Jalan
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: Source code (GitHub)
|
|
||||||
translate: Bantu menterjemahkan
|
|
||||||
text_open_source: >-
|
|
||||||
Semua orang bisa berpartisipasi, saya aktif terlibat dalam komunitas dan
|
|
||||||
mencoba untuk meninjau semua saran dan mempertimbangkan segala umpan
|
|
||||||
balik jika memungkinkan.
|
|
||||||
|
|
||||||
Pastikan untuk memeriksa papan trello saya untuk peta jalan selengkapnya!
|
|
||||||
global:
|
global:
|
||||||
loading: Memuat
|
loading: Memuat
|
||||||
error: Terjadi kesalahan
|
error: Terjadi kesalahan
|
||||||
thousandsDivider: "."
|
thousandsDivider: .
|
||||||
decimalSeparator: ","
|
decimalSeparator: ","
|
||||||
suffix:
|
suffix:
|
||||||
thousands: rb
|
thousands: rb
|
||||||
@ -91,9 +64,8 @@ mainMenu:
|
|||||||
discordLink: Server Discord Resmi
|
discordLink: Server Discord Resmi
|
||||||
helpTranslate: Bantu Terjemahkan!
|
helpTranslate: Bantu Terjemahkan!
|
||||||
madeBy: Dibuat oleh <author-link>
|
madeBy: Dibuat oleh <author-link>
|
||||||
browserWarning: Maaf, tetapi permainan ini biasanya lambat pada
|
browserWarning: Maaf, tetapi permainan ini biasanya lambat pada browser kamu!
|
||||||
browser kamu! Dapatkan versi lengkap atau unduh Chrome untuk
|
Dapatkan versi lengkap atau unduh Chrome untuk pengalaman sepenuhnya.
|
||||||
pengalaman sepenuhnya.
|
|
||||||
savegameLevel: Level <x>
|
savegameLevel: Level <x>
|
||||||
savegameLevelUnknown: Level tidak diketahui
|
savegameLevelUnknown: Level tidak diketahui
|
||||||
savegameUnnamed: Tidak Dinamai
|
savegameUnnamed: Tidak Dinamai
|
||||||
@ -131,8 +103,8 @@ dialogs:
|
|||||||
text: kamu harus memulai kembali permainan untuk menerapkan pengaturan.
|
text: kamu harus memulai kembali permainan untuk menerapkan pengaturan.
|
||||||
editKeybinding:
|
editKeybinding:
|
||||||
title: Ganti Tombol Pintas (Keybinding)
|
title: Ganti Tombol Pintas (Keybinding)
|
||||||
desc: Tekan tombol pada keyboard atau mouse yang ingin kamu ganti, atau
|
desc: Tekan tombol pada keyboard atau mouse yang ingin kamu ganti, atau tekan
|
||||||
tekan escape untuk membatalkan.
|
escape untuk membatalkan.
|
||||||
resetKeybindingsConfirmation:
|
resetKeybindingsConfirmation:
|
||||||
title: Setel Ulang Tombol-tombol Pintas (Keybinding)
|
title: Setel Ulang Tombol-tombol Pintas (Keybinding)
|
||||||
desc: Ini akan menyetel ulang semua tombol pintas kepada pengaturan awalnya.
|
desc: Ini akan menyetel ulang semua tombol pintas kepada pengaturan awalnya.
|
||||||
@ -147,8 +119,8 @@ dialogs:
|
|||||||
pengalaman sepenuhnya!
|
pengalaman sepenuhnya!
|
||||||
oneSavegameLimit:
|
oneSavegameLimit:
|
||||||
title: Penyimpanan Permainan Terbatas
|
title: Penyimpanan Permainan Terbatas
|
||||||
desc: Kamu hanya dapat memiliki satu data simpanan dalam versi demo. Harap
|
desc: Kamu hanya dapat memiliki satu data simpanan dalam versi demo. Harap hapus
|
||||||
hapus yang telah ada atau dapatkan versi lengkap!
|
yang telah ada atau dapatkan versi lengkap!
|
||||||
updateSummary:
|
updateSummary:
|
||||||
title: Update Baru!
|
title: Update Baru!
|
||||||
desc: "Berikut perubahan-perubahan yang telah dibuat sejak kamu main terakhir
|
desc: "Berikut perubahan-perubahan yang telah dibuat sejak kamu main terakhir
|
||||||
@ -164,8 +136,8 @@ dialogs:
|
|||||||
untuk melakukannya?
|
untuk melakukannya?
|
||||||
massCutConfirm:
|
massCutConfirm:
|
||||||
title: Konfirmasi Pemindahan (Cut)
|
title: Konfirmasi Pemindahan (Cut)
|
||||||
desc: Kamu akan memindahkan (cut) banyak bangunan (tepatnya <count>)! Apakah kamu
|
desc: Kamu akan memindahkan (cut) banyak bangunan (tepatnya <count>)! Apakah
|
||||||
yakin untuk melakukannya?
|
kamu yakin untuk melakukannya?
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: Tidak Mampu Memindahkan
|
title: Tidak Mampu Memindahkan
|
||||||
desc: Kamu tidak mampu menanggung biaya pemindahan area ini! Apakah kamu yakin
|
desc: Kamu tidak mampu menanggung biaya pemindahan area ini! Apakah kamu yakin
|
||||||
@ -194,24 +166,25 @@ dialogs:
|
|||||||
lengkap untuk penanda-penanda tak terbatas!
|
lengkap untuk penanda-penanda tak terbatas!
|
||||||
exportScreenshotWarning:
|
exportScreenshotWarning:
|
||||||
title: Ekspor Screenshot
|
title: Ekspor Screenshot
|
||||||
desc: Kamu meminta untuk mengekspor pabrikmu sebagai screenshot.
|
desc: Kamu meminta untuk mengekspor pabrikmu sebagai screenshot. Harap ketahui
|
||||||
Harap ketahui bahwa ini bisa menjadi lambat untuk pabrik
|
bahwa ini bisa menjadi lambat untuk pabrik yang besar dan bahkan
|
||||||
yang besar dan bahkan dapat membuat permainanmu berhenti!
|
dapat membuat permainanmu berhenti!
|
||||||
editSignal:
|
editSignal:
|
||||||
title: Atur Tanda
|
title: Atur Tanda
|
||||||
descItems: "Pilih item yang telah ditentukan sebelumnya:"
|
descItems: "Pilih item yang telah ditentukan sebelumnya:"
|
||||||
descShortKey: ... atau masukkan <strong>shortkey</strong> dari bentuk (Yang
|
descShortKey: ... atau masukkan <strong>shortkey</strong> dari bentuk (Yang bisa
|
||||||
bisa kamu buat sendiri <link>disini</link>)
|
kamu buat sendiri <link>disini</link>)
|
||||||
renameSavegame:
|
renameSavegame:
|
||||||
title: Ganti Nama Data Simpanan
|
title: Ganti Nama Data Simpanan
|
||||||
desc: Kamu bisa mengganti nama data simpanan di sini.
|
desc: Kamu bisa mengganti nama data simpanan di sini.
|
||||||
tutorialVideoAvailable:
|
tutorialVideoAvailable:
|
||||||
title: Tutorial Tersedia
|
title: Tutorial Tersedia
|
||||||
desc: Ada video tutorial yang tersedia untuk level ini! Apakah kamu ingin menontonnya?
|
desc: Ada video tutorial yang tersedia untuk level ini! Apakah kamu ingin
|
||||||
|
menontonnya?
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: Tutorial Tersedia
|
title: Tutorial Tersedia
|
||||||
desc: Ada video tutorial yang tersedia untuk level ini, tetapi hanya dalam Bahasa Inggris.
|
desc: Ada video tutorial yang tersedia untuk level ini, tetapi hanya dalam
|
||||||
Apakah kamu ingin menontonnya?
|
Bahasa Inggris. Apakah kamu ingin menontonnya?
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: Geser
|
moveMap: Geser
|
||||||
@ -276,8 +249,8 @@ ingame:
|
|||||||
description: Menunjukan semua bentuk yang tersimpan pada bangunan pusatmu.
|
description: Menunjukan semua bentuk yang tersimpan pada bangunan pusatmu.
|
||||||
produced:
|
produced:
|
||||||
title: Terproduksi
|
title: Terproduksi
|
||||||
description: Menunjukkan semua bentuk yang diproduksi pabrikmu,
|
description: Menunjukkan semua bentuk yang diproduksi pabrikmu, termasuk
|
||||||
termasuk produk-produk antara.
|
produk-produk antara.
|
||||||
delivered:
|
delivered:
|
||||||
title: Terkirim
|
title: Terkirim
|
||||||
description: Menunjukkan bentuk-bentuk yang sedang dikirim ke bangunan pusatmu.
|
description: Menunjukkan bentuk-bentuk yang sedang dikirim ke bangunan pusatmu.
|
||||||
@ -315,37 +288,40 @@ ingame:
|
|||||||
1_1_extractor: Letakkan <strong>ekstraktor</strong> diatas <strong>bentuk
|
1_1_extractor: Letakkan <strong>ekstraktor</strong> diatas <strong>bentuk
|
||||||
lingkaran</strong> untuk mengekstrak bentuk tersebut!
|
lingkaran</strong> untuk mengekstrak bentuk tersebut!
|
||||||
1_2_conveyor: "Hubungkan ekstraktor dengan <strong>sabuk konveyor</strong> ke
|
1_2_conveyor: "Hubungkan ekstraktor dengan <strong>sabuk konveyor</strong> ke
|
||||||
bangunan pusatmu!<br><br>Tip: <strong>Klik dan
|
bangunan pusatmu!<br><br>Tip: <strong>Klik dan seret</strong>
|
||||||
seret</strong> sabuk konveyor dengan mouse!"
|
sabuk konveyor dengan mouse!"
|
||||||
1_3_expand: "Ini <strong>BUKAN</strong> permainan menganggur! Bangun lebih
|
1_3_expand: "Ini <strong>BUKAN</strong> permainan menganggur! Bangun lebih
|
||||||
banyak ekstraktor dan sabuk konveyor untuk menyelesaikan
|
banyak ekstraktor dan sabuk konveyor untuk menyelesaikan
|
||||||
objektif dengan lebih cepat. <br><br>Tip: Tahan tombol
|
objektif dengan lebih cepat. <br><br>Tip: Tahan tombol
|
||||||
<strong>SHIFT</strong> untuk meletakkan beberapa ekstraktor sekaligus, dan
|
<strong>SHIFT</strong> untuk meletakkan beberapa ekstraktor
|
||||||
gunakan tombol <strong>R</strong> untuk memutar."
|
sekaligus, dan gunakan tombol <strong>R</strong> untuk memutar."
|
||||||
2_1_place_cutter: "Sekarang letakkan <strong>Pemotong</strong> untuk memotong lingkaran
|
2_1_place_cutter: "Sekarang letakkan <strong>Pemotong</strong> untuk memotong
|
||||||
menjadi 2 bagian!<br><br> NB: Pemotong akan selalu memotong dari <strong>atas ke
|
lingkaran menjadi 2 bagian!<br><br> NB: Pemotong akan selalu
|
||||||
bawah</strong> apapun orientasinya."
|
memotong dari <strong>atas ke bawah</strong> apapun
|
||||||
2_2_place_trash: Pemotong dapat <strong>tersumbat dan macet</strong>!<br><br> Gunakan
|
orientasinya."
|
||||||
<strong>tong sampah</strong> untuk membuang sisa (!) yang saat ini tidak diperlukan.
|
2_2_place_trash: Pemotong dapat <strong>tersumbat dan macet</strong>!<br><br>
|
||||||
2_3_more_cutters:
|
Gunakan <strong>tong sampah</strong> untuk membuang sisa (!)
|
||||||
"Kerja yang bagus! Sekarang letakkan <strong>2 pemotong lagi</strong> untuk mempercepat
|
yang saat ini tidak diperlukan.
|
||||||
proses ini!<br><br> NB: Gunakan <strong>tombol 0-9
|
2_3_more_cutters: "Kerja yang bagus! Sekarang letakkan <strong>2 pemotong
|
||||||
</strong> untuk mengakses bangunan lebih cepat!"
|
lagi</strong> untuk mempercepat proses ini!<br><br> NB: Gunakan
|
||||||
|
<strong>tombol 0-9 </strong> untuk mengakses bangunan lebih
|
||||||
|
cepat!"
|
||||||
3_1_rectangles: "Sekarang ekstrak beberapa persegi! <strong>Bangun 4
|
3_1_rectangles: "Sekarang ekstrak beberapa persegi! <strong>Bangun 4
|
||||||
ekstraktor</strong> dan hubungkan mereka ke bangunan pusat.<br><br> NB:
|
ekstraktor</strong> dan hubungkan mereka ke bangunan
|
||||||
Tahan <strong>SHIFT</strong> saat meletakkan konveyor untuk mengaktifkan
|
pusat.<br><br> NB: Tahan <strong>SHIFT</strong> saat meletakkan
|
||||||
perencana sabuk konveyor!"
|
konveyor untuk mengaktifkan perencana sabuk konveyor!"
|
||||||
21_1_place_quad_painter: Letakkan <strong>pemotong empat bagian</strong> dan ekstrak beberapa
|
21_1_place_quad_painter: Letakkan <strong>pemotong empat bagian</strong> dan
|
||||||
<strong>lingkaran</strong>, warna <strong>putih</strong> dan
|
ekstrak beberapa <strong>lingkaran</strong>, warna
|
||||||
<strong>merah</strong>!
|
<strong>putih</strong> dan <strong>merah</strong>!
|
||||||
21_2_switch_to_wires: Pindah ke lapisan kabel dengan menekan tombol
|
21_2_switch_to_wires: Pindah ke lapisan kabel dengan menekan tombol
|
||||||
<strong>E</strong>!<br><br> Lalu <strong>hubungkan keempat
|
<strong>E</strong>!<br><br> Lalu <strong>hubungkan keempat
|
||||||
input</strong> dari pengecat dengan menggunakan kabel!
|
input</strong> dari pengecat dengan menggunakan kabel!
|
||||||
21_3_place_button: Mantap! Sekarang letakkan <strong>saklar</strong> dan hubungkan
|
21_3_place_button: Mantap! Sekarang letakkan <strong>saklar</strong> dan
|
||||||
dengan menggunakan kabel!
|
hubungkan dengan menggunakan kabel!
|
||||||
21_4_press_button: "Tekan saklar untuk <strong>memancarkan sinyal yang
|
21_4_press_button: "Tekan saklar untuk <strong>memancarkan sinyal yang
|
||||||
benar</strong> dan mengaktifkan pengecat.<br><br> NB: Kamu
|
benar</strong> dan mengaktifkan pengecat.<br><br> NB: Kamu tidak
|
||||||
tidak perlu menghubungkan semua input! Cobalah hanya menghubungkan dua."
|
perlu menghubungkan semua input! Cobalah hanya menghubungkan
|
||||||
|
dua."
|
||||||
connectedMiners:
|
connectedMiners:
|
||||||
one_miner: 1 Ekstraktor
|
one_miner: 1 Ekstraktor
|
||||||
n_miners: <amount> Ekstraktor
|
n_miners: <amount> Ekstraktor
|
||||||
@ -364,9 +340,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 Bangunan Baru
|
title: 18 Bangunan Baru
|
||||||
desc: Untuk membuat pabrik yang otomatis sepenuhnya!
|
desc: Untuk membuat pabrik yang otomatis sepenuhnya!
|
||||||
savegames:
|
|
||||||
title: ∞ Data Simpanan
|
|
||||||
desc: Sebanyak yang kamu mau!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ Tingkatan Upgrade
|
title: ∞ Tingkatan Upgrade
|
||||||
desc: Versi demo ini hanya punya 5!
|
desc: Versi demo ini hanya punya 5!
|
||||||
@ -382,6 +355,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Dukung saya
|
title: Dukung saya
|
||||||
desc: Saya membuat game ini di waktu luang!
|
desc: Saya membuat game ini di waktu luang!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Sabuk konveyor, Pembagi Arus & Terowongan
|
name: Sabuk konveyor, Pembagi Arus & Terowongan
|
||||||
@ -404,7 +380,8 @@ buildings:
|
|||||||
belt:
|
belt:
|
||||||
default:
|
default:
|
||||||
name: Sabuk Konveyor
|
name: Sabuk Konveyor
|
||||||
description: Mengangkut sumber daya, tahan dan seret untuk meletakkan beberapa sekaligus.
|
description: Mengangkut sumber daya, tahan dan seret untuk meletakkan beberapa
|
||||||
|
sekaligus.
|
||||||
wire:
|
wire:
|
||||||
default:
|
default:
|
||||||
name: Kabel
|
name: Kabel
|
||||||
@ -506,7 +483,8 @@ buildings:
|
|||||||
default:
|
default:
|
||||||
name: Tempat Penyimpanan
|
name: Tempat Penyimpanan
|
||||||
description: Menyimpan bentuk yang berlebihan, hingga kapasitas tertentu.
|
description: Menyimpan bentuk yang berlebihan, hingga kapasitas tertentu.
|
||||||
Memprioritaskan output dari kiri dan dapat digunakan sebagai gerbang luapan.
|
Memprioritaskan output dari kiri dan dapat digunakan sebagai
|
||||||
|
gerbang luapan.
|
||||||
wire_tunnel:
|
wire_tunnel:
|
||||||
default:
|
default:
|
||||||
name: Terowongan Kabel
|
name: Terowongan Kabel
|
||||||
@ -520,8 +498,8 @@ buildings:
|
|||||||
default:
|
default:
|
||||||
name: Saklar
|
name: Saklar
|
||||||
description: Dapat digunakan untuk mengeluarkan sinyal boolean (1 atau 0) pada
|
description: Dapat digunakan untuk mengeluarkan sinyal boolean (1 atau 0) pada
|
||||||
lapisan kabel, yang bisa digunakan untuk mengontrol komponen, seperti
|
lapisan kabel, yang bisa digunakan untuk mengontrol komponen,
|
||||||
filter item.
|
seperti filter item.
|
||||||
logic_gate:
|
logic_gate:
|
||||||
default:
|
default:
|
||||||
name: Gerbang AND
|
name: Gerbang AND
|
||||||
@ -533,8 +511,9 @@ buildings:
|
|||||||
berarti sebuah bentuk, warna atau boolean "1")
|
berarti sebuah bentuk, warna atau boolean "1")
|
||||||
xor:
|
xor:
|
||||||
name: Gerbang XOR
|
name: Gerbang XOR
|
||||||
description: Mengeluarkan boolean "1" jika salah satu input adalah benar, namun bukan
|
description: Mengeluarkan boolean "1" jika salah satu input adalah benar, namun
|
||||||
keduanya. (Benar berarti sebuah bentuk, warna atau boolean "1")
|
bukan keduanya. (Benar berarti sebuah bentuk, warna atau boolean
|
||||||
|
"1")
|
||||||
or:
|
or:
|
||||||
name: Gerbang OR
|
name: Gerbang OR
|
||||||
description: Mengeluarkan boolean "1" jika satu input adalah benar. (Benar
|
description: Mengeluarkan boolean "1" jika satu input adalah benar. (Benar
|
||||||
@ -557,8 +536,8 @@ buildings:
|
|||||||
display:
|
display:
|
||||||
default:
|
default:
|
||||||
name: Layar
|
name: Layar
|
||||||
description: Hubungkan sebuah sinyal untuk ditunjukkan pada layar - Dapat
|
description: Hubungkan sebuah sinyal untuk ditunjukkan pada layar - Dapat berupa
|
||||||
berupa bentuk, warna atau boolean.
|
bentuk, warna atau boolean.
|
||||||
reader:
|
reader:
|
||||||
default:
|
default:
|
||||||
name: Pembaca Sabuk Konveyor
|
name: Pembaca Sabuk Konveyor
|
||||||
@ -568,8 +547,8 @@ buildings:
|
|||||||
analyzer:
|
analyzer:
|
||||||
default:
|
default:
|
||||||
name: Penganalisa bentuk
|
name: Penganalisa bentuk
|
||||||
description: Menganalisa bentuk bagian kanan atas pada lapisan paling bawah
|
description: Menganalisa bentuk bagian kanan atas pada lapisan paling bawah lalu
|
||||||
lalu mengeluarkan bentuk dan warnanya.
|
mengeluarkan bentuk dan warnanya.
|
||||||
comparator:
|
comparator:
|
||||||
default:
|
default:
|
||||||
name: Pembanding
|
name: Pembanding
|
||||||
@ -584,14 +563,15 @@ buildings:
|
|||||||
description: Memutar bentuk searah jarum jam secara virtual.
|
description: Memutar bentuk searah jarum jam secara virtual.
|
||||||
unstacker:
|
unstacker:
|
||||||
name: Pemisah Tumpukan Virtual
|
name: Pemisah Tumpukan Virtual
|
||||||
description: Memisahkan lapisan paling atas ke output kanan dan
|
description: Memisahkan lapisan paling atas ke output kanan dan sisanya ke
|
||||||
sisanya ke output kiri secara virtual.
|
output kiri secara virtual.
|
||||||
stacker:
|
stacker:
|
||||||
name: Penumpuk Virtual
|
name: Penumpuk Virtual
|
||||||
description: Menumpuk bentuk kanan ke bentuk kiri secara virtual.
|
description: Menumpuk bentuk kanan ke bentuk kiri secara virtual.
|
||||||
painter:
|
painter:
|
||||||
name: Pengecat Virtual
|
name: Pengecat Virtual
|
||||||
description: Mengecat bentuk dari input bawah dengan warna dari input kanan secara virtual.
|
description: Mengecat bentuk dari input bawah dengan warna dari input kanan
|
||||||
|
secara virtual.
|
||||||
item_producer:
|
item_producer:
|
||||||
default:
|
default:
|
||||||
name: Pembuat Bentuk
|
name: Pembuat Bentuk
|
||||||
@ -603,30 +583,31 @@ storyRewards:
|
|||||||
desc: <strong>Pemotong</strong> telah dibuka, yang dapat memotong bentuk menjadi
|
desc: <strong>Pemotong</strong> telah dibuka, yang dapat memotong bentuk menjadi
|
||||||
dua secara vertikal <strong>apapun
|
dua secara vertikal <strong>apapun
|
||||||
orientasinya</strong>!<br><br>Pastikan untuk membuang sisanya, jika
|
orientasinya</strong>!<br><br>Pastikan untuk membuang sisanya, jika
|
||||||
tidak <strong>ini dapat tersumbat dan macet</strong> -
|
tidak <strong>ini dapat tersumbat dan macet</strong> - Oleh karena
|
||||||
Oleh karena itu kamu diberikan <strong>tong sampah</strong>, yang
|
itu kamu diberikan <strong>tong sampah</strong>, yang menghapus
|
||||||
menghapus semua yang kamu masukkan!
|
semua yang kamu masukkan!
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: Memutar
|
title: Memutar
|
||||||
desc: <strong>Pemutar</strong> telah dibuka! Ia memutar bentuk-bentuk searah
|
desc: <strong>Pemutar</strong> telah dibuka! Ia memutar bentuk-bentuk searah
|
||||||
jarum jam sebesar 90 derajat.
|
jarum jam sebesar 90 derajat.
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: Mengecat
|
title: Mengecat
|
||||||
desc: "<strong>Pengecat</strong> telah dibuka – Ekstrak beberapa warna
|
desc: "<strong>Pengecat</strong> telah dibuka – Ekstrak beberapa warna (seperti
|
||||||
(seperti yang kamu lakukan dengan bentuk) dan kemudian kombinasikan
|
yang kamu lakukan dengan bentuk) dan kemudian kombinasikan dengan
|
||||||
dengan bentuk di dalam pengecat untuk mewarnai mereka!<br><br>
|
bentuk di dalam pengecat untuk mewarnai mereka!<br><br> NB: Apabila
|
||||||
NB: Apabila kamu buta warna, terdapat <strong>mode buta
|
kamu buta warna, terdapat <strong>mode buta warna</strong> di dalam
|
||||||
warna</strong> di dalam pengaturan!"
|
pengaturan!"
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: Mencampur Warna
|
title: Mencampur Warna
|
||||||
desc: <strong>Pencampur Warna</strong> telah dibuka – Bangunan ini mencampur dua warna menjadi satu!
|
desc: The <strong>mixer</strong> has been unlocked - It mixes two colors using
|
||||||
|
<strong>additive blending</strong>!
|
||||||
reward_stacker:
|
reward_stacker:
|
||||||
title: Penumpuk
|
title: Penumpuk
|
||||||
desc: Kamu sekarang dapat mengombinasikan bentuk-bentuk dengan
|
desc: Kamu sekarang dapat mengombinasikan bentuk-bentuk dengan
|
||||||
<strong>penumpuk</strong>! Kedua input akan dikombinasikan, dan
|
<strong>penumpuk</strong>! Kedua input akan dikombinasikan, dan
|
||||||
apabila mereka dapat diletakan disebelah satu sama lain, mereka
|
apabila mereka dapat diletakan disebelah satu sama lain, mereka
|
||||||
akan <strong>terpadukan</strong>. Apabila tidak bisa, maka input kanan
|
akan <strong>terpadukan</strong>. Apabila tidak bisa, maka input
|
||||||
akan <strong>diletakkan diatas</strong> input kiri!
|
kanan akan <strong>diletakkan diatas</strong> input kiri!
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: Pembagi Kompak
|
title: Pembagi Kompak
|
||||||
desc: Kamu telah membuka varian <strong>pembagi</strong> dari
|
desc: Kamu telah membuka varian <strong>pembagi</strong> dari
|
||||||
@ -639,38 +620,40 @@ storyRewards:
|
|||||||
bangungan-bangunan dengannya!
|
bangungan-bangunan dengannya!
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: Memutar Berlawanan Arah Jarum Jam
|
title: Memutar Berlawanan Arah Jarum Jam
|
||||||
desc: Kamu telah membuka varian dari <strong>Pemutar</strong> - Bangunan ini memungkinkan
|
desc: Kamu telah membuka varian dari <strong>Pemutar</strong> - Bangunan ini
|
||||||
kamu untuk memutar bentuk-bentuk berlawanan arah jarum jam! Untuk
|
memungkinkan kamu untuk memutar bentuk-bentuk berlawanan arah jarum
|
||||||
membangunnya, pilih pemutar dan <strong>tekan 'T' to memilih
|
jam! Untuk membangunnya, pilih pemutar dan <strong>tekan 'T' to
|
||||||
varian</strong>!
|
memilih varian</strong>!
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Ekstraktor Merantai
|
title: Ekstraktor Merantai
|
||||||
desc: "Kamu telah membuka <strong>Ekstraktor (Berantai)</strong>! Bangunan ini dapat
|
desc: "Kamu telah membuka <strong>Ekstraktor (Berantai)</strong>! Bangunan ini
|
||||||
<strong>mengoper sumber daya</strong> ke ekstraktor depannya
|
dapat <strong>mengoper sumber daya</strong> ke ekstraktor depannya
|
||||||
sehingga kamu dapat mengekstrak sumber daya dengan lebih
|
sehingga kamu dapat mengekstrak sumber daya dengan lebih
|
||||||
efisien!<br><br> NB: Ekstraktor yang lama sudah diganti pada toolbar
|
efisien!<br><br> NB: Ekstraktor yang lama sudah diganti pada toolbar
|
||||||
kamu sekarang!"
|
kamu sekarang!"
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Terowongan Tingkat II
|
title: Terowongan Tingkat II
|
||||||
desc: Kamu telah membuka varian baru <strong>terowongan</strong> - Bangunan ini memiliki
|
desc: Kamu telah membuka varian baru <strong>terowongan</strong> - Bangunan ini
|
||||||
<strong>jangkauan yang lebih panjang</strong>, dan sekarang kamu
|
memiliki <strong>jangkauan yang lebih panjang</strong>, dan sekarang
|
||||||
juga dapat memadukan terowongan-terowongan tersebut!
|
kamu juga dapat memadukan terowongan-terowongan tersebut!
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Pemotongan Empat Bagian
|
title: Pemotongan Empat Bagian
|
||||||
desc: Kamu telah membuka varian dari <strong>pemotong</strong> - Bangunan ini memungkinkan
|
desc: Kamu telah membuka varian dari <strong>pemotong</strong> - Bangunan ini
|
||||||
kamu untuk memotong bentuk-bentuk menjadi <strong>empat bagian</strong>
|
memungkinkan kamu untuk memotong bentuk-bentuk menjadi <strong>empat
|
||||||
daripada hanya dua bagian!
|
bagian</strong> daripada hanya dua bagian!
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: Pengecatan Ganda
|
title: Pengecatan Ganda
|
||||||
desc: Kamu telah membuka varian dari <strong>pengecat</strong> - Bangunan ini bekerja
|
desc: Kamu telah membuka varian dari <strong>pengecat</strong> - Bangunan ini
|
||||||
seperti pengecat biasa namun dapat memproses <strong>dua bentuk
|
bekerja seperti pengecat biasa namun dapat memproses <strong>dua
|
||||||
sekaligus</strong>, dan mengonsumsi hanya satu warna daripada dua!
|
bentuk sekaligus</strong>, dan mengonsumsi hanya satu warna daripada
|
||||||
|
dua!
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Tempat Penyimpanan
|
title: Tempat Penyimpanan
|
||||||
desc: Kamu telah membuka <strong>Tempat Penyimpanan</strong> - Bangunan ini memungkinkan
|
desc: Kamu telah membuka <strong>Tempat Penyimpanan</strong> - Bangunan ini
|
||||||
kamu untuk menyimpan item hingga kapasitas tertentu!<br><br> Bangunan ini
|
memungkinkan kamu untuk menyimpan item hingga kapasitas
|
||||||
mengutamakan output kiri, sehingga kamu dapat menggunakannya sebagai
|
tertentu!<br><br> Bangunan ini mengutamakan output kiri, sehingga
|
||||||
<strong>gerbang luapan (overflow gate)</strong>!
|
kamu dapat menggunakannya sebagai <strong>gerbang luapan (overflow
|
||||||
|
gate)</strong>!
|
||||||
reward_freeplay:
|
reward_freeplay:
|
||||||
title: Permainan Bebas
|
title: Permainan Bebas
|
||||||
desc: Kamu berhasil! Kamu telah membuka <strong>mode permainan bebas</strong>!
|
desc: Kamu berhasil! Kamu telah membuka <strong>mode permainan bebas</strong>!
|
||||||
@ -678,22 +661,22 @@ storyRewards:
|
|||||||
<strong>acak</strong>!<br><br> Karena bangunan pusat akan
|
<strong>acak</strong>!<br><br> Karena bangunan pusat akan
|
||||||
membutuhkan <strong>penghasilan</strong> dari sekarang, Saya sangat
|
membutuhkan <strong>penghasilan</strong> dari sekarang, Saya sangat
|
||||||
menyarankan untuk membangun mesin yang secara otomatis mengirim
|
menyarankan untuk membangun mesin yang secara otomatis mengirim
|
||||||
bentuk yang diminta!<br><br> Bangunan pusat mengeluarkan bentuk
|
bentuk yang diminta!<br><br> Bangunan pusat mengeluarkan bentuk yang
|
||||||
yang diminta pada lapisan kabel, jadi yang harus kamu lakukan adalah
|
diminta pada lapisan kabel, jadi yang harus kamu lakukan adalah
|
||||||
menganalisa dan membangun pabrik secara otomatis berdasarkan itu.
|
menganalisa dan membangun pabrik secara otomatis berdasarkan itu.
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: Cetak Biru
|
title: Cetak Biru
|
||||||
desc: Kamu sekarang dapat <strong>menyalin (copy) dan menempel (paste)</strong> bagian dari
|
desc: Kamu sekarang dapat <strong>menyalin (copy) dan menempel (paste)</strong>
|
||||||
pabrikmu! Pilih sebuah area (tahan CTRL, lalu seret dengan
|
bagian dari pabrikmu! Pilih sebuah area (tahan CTRL, lalu seret
|
||||||
mouse), dan tekan 'C' untuk menyalinnya.<br><br>Untuk
|
dengan mouse), dan tekan 'C' untuk menyalinnya.<br><br>Untuk
|
||||||
menempelnya <strong>tidak gratis</strong>, Kamu harus memproduksi
|
menempelnya <strong>tidak gratis</strong>, Kamu harus memproduksi
|
||||||
<strong>bentuk cetak biru</strong> untuk dapat melakukannya! (Bentuk
|
<strong>bentuk cetak biru</strong> untuk dapat melakukannya! (Bentuk
|
||||||
yang baru saja kamu kirim).
|
yang baru saja kamu kirim).
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Level Selanjutnya
|
title: Level Selanjutnya
|
||||||
desc: "Level ini tidak memiliki hadiah, namun yang selanjutnya akan! <br><br>
|
desc: "Level ini tidak memiliki hadiah, namun yang selanjutnya akan! <br><br>
|
||||||
NB: Sebaiknya kamu jangan hancurkan pabrik yang telah ada –
|
NB: Sebaiknya kamu jangan hancurkan pabrik yang telah ada – Kamu
|
||||||
Kamu akan membutuhkan <strong>semua</strong> bentuk-bentuk tersebut lagi
|
akan membutuhkan <strong>semua</strong> bentuk-bentuk tersebut lagi
|
||||||
nanti untuk <strong>membuka tingkatan-tingkatan
|
nanti untuk <strong>membuka tingkatan-tingkatan
|
||||||
selanjutnya</strong>!"
|
selanjutnya</strong>!"
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
@ -702,9 +685,10 @@ storyRewards:
|
|||||||
lengkap!
|
lengkap!
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Penyeimbang
|
title: Penyeimbang
|
||||||
desc: <strong>Penyeimbang</strong> multifungsional telah terbuka - Bangunan ini dapat
|
desc: <strong>Penyeimbang</strong> multifungsional telah terbuka - Bangunan ini
|
||||||
digunakan untuk membuat pabrik yang lebih besar lagi dengan <strong>memisahkan
|
dapat digunakan untuk membuat pabrik yang lebih besar lagi dengan
|
||||||
dan menggabungkan item</strong> ke beberapa sabuk konveyor!
|
<strong>memisahkan dan menggabungkan item</strong> ke beberapa sabuk
|
||||||
|
konveyor!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: Penggabung Kompak
|
title: Penggabung Kompak
|
||||||
desc: Kamu telah membuka varian<strong>penggabung</strong> dari
|
desc: Kamu telah membuka varian<strong>penggabung</strong> dari
|
||||||
@ -714,8 +698,8 @@ storyRewards:
|
|||||||
title: Pembaca Sabuk Konveyor
|
title: Pembaca Sabuk Konveyor
|
||||||
desc: Kamu telah membuka <strong>pembaca sabuk konveyor</strong>! Bangunan ini
|
desc: Kamu telah membuka <strong>pembaca sabuk konveyor</strong>! Bangunan ini
|
||||||
memungkinkan kamu untuk mengukur penghasilan dalam sebuah sabuk
|
memungkinkan kamu untuk mengukur penghasilan dalam sebuah sabuk
|
||||||
konveyor.<br><br> Dan tunggu sampai kamu membuka kabel - maka bangunan ini
|
konveyor.<br><br> Dan tunggu sampai kamu membuka kabel - maka
|
||||||
akan sangat berguna!
|
bangunan ini akan sangat berguna!
|
||||||
reward_rotater_180:
|
reward_rotater_180:
|
||||||
title: Pemutar (180 derajat)
|
title: Pemutar (180 derajat)
|
||||||
desc: Kamu telah membuka <strong>pemutar</strong> 180 derajat! - Bangunan ini
|
desc: Kamu telah membuka <strong>pemutar</strong> 180 derajat! - Bangunan ini
|
||||||
@ -730,41 +714,46 @@ storyRewards:
|
|||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: Sinyal Konstan
|
title: Sinyal Konstan
|
||||||
desc: Kamu telah membuka bangunan <strong>sinyal konstan</strong> pada lapisan
|
desc: Kamu telah membuka bangunan <strong>sinyal konstan</strong> pada lapisan
|
||||||
kabel! Bangunan ini berguna untuk menyambungkannya ke <strong>filter item</strong>
|
kabel! Bangunan ini berguna untuk menyambungkannya ke <strong>filter
|
||||||
contohnya.<br><br> Sinyal konstannya dapat memancarkan
|
item</strong> contohnya.<br><br> Sinyal konstannya dapat memancarkan
|
||||||
<strong>bentuk</strong>, <strong>warna</strong> atau
|
<strong>bentuk</strong>, <strong>warna</strong> atau
|
||||||
<strong>boolean</strong> (1 atau 0).
|
<strong>boolean</strong> (1 atau 0).
|
||||||
reward_logic_gates:
|
reward_logic_gates:
|
||||||
title: Gerbang Logis
|
title: Gerbang Logis
|
||||||
desc: Kamu telah membuka <strong>gerbang logis</strong>! Kamu tidak perlu bersemangat
|
desc: Kamu telah membuka <strong>gerbang logis</strong>! Kamu tidak perlu
|
||||||
tentang ini, tetapi sebenarnya ini sangat keren!<br><br> Dengan gerbang-gerbang tersebut
|
bersemangat tentang ini, tetapi sebenarnya ini sangat keren!<br><br>
|
||||||
kamu sekarang dapat mengkalkulasi operasi AND, OR, XOR dan NOT.<br><br> Sebagai bonus
|
Dengan gerbang-gerbang tersebut kamu sekarang dapat mengkalkulasi
|
||||||
kamu juga telah mendapatkan <strong>transistor</strong>!
|
operasi AND, OR, XOR dan NOT.<br><br> Sebagai bonus kamu juga telah
|
||||||
|
mendapatkan <strong>transistor</strong>!
|
||||||
reward_virtual_processing:
|
reward_virtual_processing:
|
||||||
title: Prosesi Virtual
|
title: Prosesi Virtual
|
||||||
desc: Kamu baru saja mendapatkan banyak bangunan yang memungkinkan kamu untuk
|
desc: Kamu baru saja mendapatkan banyak bangunan yang memungkinkan kamu untuk
|
||||||
<strong>menstimulasi prosesi pembuatan bentuk</strong>!<br><br> Kamu sekarang
|
<strong>menstimulasi prosesi pembuatan bentuk</strong>!<br><br> Kamu
|
||||||
dapat menstimulasi pemotongan, pemutaran, penumpukan dan masih banyak lagi pada lapisan kabel!
|
sekarang dapat menstimulasi pemotongan, pemutaran, penumpukan dan
|
||||||
Dengan ini kamu sekarang memiliki tiga opsi untuk melanjutkan permainan:<br><br> -
|
masih banyak lagi pada lapisan kabel! Dengan ini kamu sekarang
|
||||||
Membuat sebuah <strong>mesin otomatis</strong> untuk membuat segala bentuk
|
memiliki tiga opsi untuk melanjutkan permainan:<br><br> - Membuat
|
||||||
yang diminta oleh PUSAT (Saya sarankan kamu untuk mencobanya!).<br><br> - Membuat
|
sebuah <strong>mesin otomatis</strong> untuk membuat segala bentuk
|
||||||
sesuatu yang keren dengan kabel.<br><br> - Melanjutkan permainan seperti
|
yang diminta oleh PUSAT (Saya sarankan kamu untuk
|
||||||
biasa.<br><br> Apapun yang kamu pilih, ingatlah untuk bersenang-senang!
|
mencobanya!).<br><br> - Membuat sesuatu yang keren dengan
|
||||||
|
kabel.<br><br> - Melanjutkan permainan seperti biasa.<br><br> Apapun
|
||||||
|
yang kamu pilih, ingatlah untuk bersenang-senang!
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: Kabel & Pengecat (Empat Bagian)
|
title: Kabel & Pengecat (Empat Bagian)
|
||||||
desc: "Kamu baru saja membuka <strong>Lapisan Kabel</strong>: Ini adalah sebuah
|
desc: "Kamu baru saja membuka <strong>Lapisan Kabel</strong>: Ini adalah sebuah
|
||||||
lapisan terpisah diatas lapisan biasa dan memperkenalkan banyak mekanisme
|
lapisan terpisah diatas lapisan biasa dan memperkenalkan banyak
|
||||||
baru!<br><br> Untuk permulaan kamu telah membuka <strong>Pengecat (Empat
|
mekanisme baru!<br><br> Untuk permulaan kamu telah membuka
|
||||||
Bagian)</strong> - Hubungkan slot yang ingin kamu cat pada
|
<strong>Pengecat (Empat Bagian)</strong> - Hubungkan slot yang ingin
|
||||||
lapisan kabel!<br><br> Untuk mengubah ke lapisan kabel, tekan tombol
|
kamu cat pada lapisan kabel!<br><br> Untuk mengubah ke lapisan
|
||||||
<strong>E</strong>. <br><br> NB: <strong>Nyalakan petunjuk</strong> di
|
kabel, tekan tombol <strong>E</strong>. <br><br> NB:
|
||||||
pengaturan untuk mengaktifkan tutorial kabel!"
|
<strong>Nyalakan petunjuk</strong> di pengaturan untuk mengaktifkan
|
||||||
|
tutorial kabel!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Filter Item
|
title: Filter Item
|
||||||
desc: Kamu telah membuka <strong>Filter</strong>! Bangunan ini akan mengarahkan item baik
|
desc: Kamu telah membuka <strong>Filter</strong>! Bangunan ini akan mengarahkan
|
||||||
ke output atas atau output kanan tergantung apakah mereka cocok dengan
|
item baik ke output atas atau output kanan tergantung apakah mereka
|
||||||
sinyal dari lapisan kabel atau tidak.<br><br> Kamu juga bisa memasukkan
|
cocok dengan sinyal dari lapisan kabel atau tidak.<br><br> Kamu juga
|
||||||
sinyal boolean (1 atau 0) untuk mengaktifkan atau menonaktifkannya.
|
bisa memasukkan sinyal boolean (1 atau 0) untuk mengaktifkan atau
|
||||||
|
menonaktifkannya.
|
||||||
reward_demo_end:
|
reward_demo_end:
|
||||||
title: Akhir dari Demo
|
title: Akhir dari Demo
|
||||||
desc: Kamu telah mencapai akhir dari versi demo!
|
desc: Kamu telah mencapai akhir dari versi demo!
|
||||||
@ -784,8 +773,8 @@ settings:
|
|||||||
uiScale:
|
uiScale:
|
||||||
title: Skala Antarmuka (User Interface)
|
title: Skala Antarmuka (User Interface)
|
||||||
description: Ganti ukuran antarmuka pengguna. Antarmuka tetap akan berskalakan
|
description: Ganti ukuran antarmuka pengguna. Antarmuka tetap akan berskalakan
|
||||||
berdasar resolusi perangkatmu, tetapi pengaturan ini
|
berdasar resolusi perangkatmu, tetapi pengaturan ini mengontrol
|
||||||
mengontrol besar skala.
|
besar skala.
|
||||||
scales:
|
scales:
|
||||||
super_small: Sangat kecil
|
super_small: Sangat kecil
|
||||||
small: Kecil
|
small: Kecil
|
||||||
@ -805,8 +794,8 @@ settings:
|
|||||||
disabled: Dinonaktifkan
|
disabled: Dinonaktifkan
|
||||||
scrollWheelSensitivity:
|
scrollWheelSensitivity:
|
||||||
title: Kepekaan Zoom
|
title: Kepekaan Zoom
|
||||||
description: Mengubah seberapa peka zoom yang dilakukan (baik dengan roda
|
description: Mengubah seberapa peka zoom yang dilakukan (baik dengan roda mouse
|
||||||
mouse atau trackpad).
|
atau trackpad).
|
||||||
sensitivity:
|
sensitivity:
|
||||||
super_slow: Sangat lambat
|
super_slow: Sangat lambat
|
||||||
slow: Lambat
|
slow: Lambat
|
||||||
@ -815,7 +804,8 @@ settings:
|
|||||||
super_fast: Sangat cepat
|
super_fast: Sangat cepat
|
||||||
movementSpeed:
|
movementSpeed:
|
||||||
title: Kecepatan gerakan
|
title: Kecepatan gerakan
|
||||||
description: Mengubah seberapa cepat pandangan bergerak ketika menggunakan keyboard atau mouse.
|
description: Mengubah seberapa cepat pandangan bergerak ketika menggunakan
|
||||||
|
keyboard atau mouse.
|
||||||
speeds:
|
speeds:
|
||||||
super_slow: Sangat lambat
|
super_slow: Sangat lambat
|
||||||
slow: Lambat
|
slow: Lambat
|
||||||
@ -876,9 +866,9 @@ settings:
|
|||||||
membuat teks lebih mudah dibaca.
|
membuat teks lebih mudah dibaca.
|
||||||
rotationByBuilding:
|
rotationByBuilding:
|
||||||
title: Pemutaran Masing-masing Tipe Bangunan
|
title: Pemutaran Masing-masing Tipe Bangunan
|
||||||
description: Setiap tipe bangunan mengingat putaran atau rotasi yang kamu tetapkan
|
description: Setiap tipe bangunan mengingat putaran atau rotasi yang kamu
|
||||||
kepadanya. Ini mungkin lebih nyaman apabila kamu sering berganti
|
tetapkan kepadanya. Ini mungkin lebih nyaman apabila kamu sering
|
||||||
untuk menempatkan berbagai tipe bangunan.
|
berganti untuk menempatkan berbagai tipe bangunan.
|
||||||
compactBuildingInfo:
|
compactBuildingInfo:
|
||||||
title: Pemadatan Informasi Bangunan
|
title: Pemadatan Informasi Bangunan
|
||||||
description: Memendekkan kotak-kotak informasi bangunan-bangunan dengan hanya
|
description: Memendekkan kotak-kotak informasi bangunan-bangunan dengan hanya
|
||||||
@ -896,45 +886,50 @@ settings:
|
|||||||
description: Mengatur volume untuk musik
|
description: Mengatur volume untuk musik
|
||||||
lowQualityMapResources:
|
lowQualityMapResources:
|
||||||
title: Kualitas Peta Sumber Daya Rendah
|
title: Kualitas Peta Sumber Daya Rendah
|
||||||
description:
|
description: Menyederhanakan rendering sumber daya pada peta saat diperbesar
|
||||||
Menyederhanakan rendering sumber daya pada peta saat diperbesar untuk meningkatkan performa.
|
untuk meningkatkan performa. Bahkan terlihat lebih rapi, jadi
|
||||||
Bahkan terlihat lebih rapi, jadi pastikan untuk mencobanya!
|
pastikan untuk mencobanya!
|
||||||
disableTileGrid:
|
disableTileGrid:
|
||||||
title: Nonaktifkan Grid
|
title: Nonaktifkan Grid
|
||||||
description: Menonaktifkan ubin grid dapat membantu performa.
|
description: Menonaktifkan ubin grid dapat membantu performa. Ini juga membuat
|
||||||
Ini juga membuat game menjadi lebih rapi!
|
game menjadi lebih rapi!
|
||||||
clearCursorOnDeleteWhilePlacing:
|
clearCursorOnDeleteWhilePlacing:
|
||||||
title: Menghapus Kursor dengan Klik Kanan
|
title: Menghapus Kursor dengan Klik Kanan
|
||||||
description: >-
|
description: Diaktifkan secara default, menghapus kursor setiap kali kamu
|
||||||
Diaktifkan secara default, menghapus kursor setiap kali kamu mengklik kanan saat kamu memiliki bangunan yang dipilih untuk penempatan. Jika dinonaktifkan, kamu dapat menghapus
|
mengklik kanan saat kamu memiliki bangunan yang dipilih untuk
|
||||||
bangunan dengan mengklik kanan saat meletakkan bangunan.
|
penempatan. Jika dinonaktifkan, kamu dapat menghapus bangunan
|
||||||
|
dengan mengklik kanan saat meletakkan bangunan.
|
||||||
lowQualityTextures:
|
lowQualityTextures:
|
||||||
title: Tekstur Kualitas Rendah (Jelek)
|
title: Tekstur Kualitas Rendah (Jelek)
|
||||||
description: Menggunakan kualitas rendah untuk menyelamatkan performa.
|
description: Menggunakan kualitas rendah untuk menyelamatkan performa. Ini akan
|
||||||
Ini akan membuat penampilan game menjadi jelek!
|
membuat penampilan game menjadi jelek!
|
||||||
displayChunkBorders:
|
displayChunkBorders:
|
||||||
title: Tampilkan Batasan Chunk
|
title: Tampilkan Batasan Chunk
|
||||||
description: Game ini dibagi-bagi menjadi ubin 16x16 bagian, jika pengaturan ini
|
description: Game ini dibagi-bagi menjadi ubin 16x16 bagian, jika pengaturan ini
|
||||||
diaktifkan maka batas dari tiap chunk akan diperlihatkan.
|
diaktifkan maka batas dari tiap chunk akan diperlihatkan.
|
||||||
pickMinerOnPatch:
|
pickMinerOnPatch:
|
||||||
title: Memilih Ekstraktor pada Tampungan Sumber Daya
|
title: Memilih Ekstraktor pada Tampungan Sumber Daya
|
||||||
description: Diaktifkan secara default, memilih ekstraktor apabila kamu menggunakan pipet ketika
|
description: Diaktifkan secara default, memilih ekstraktor apabila kamu
|
||||||
mengarahkan pada tampungan sumber daya.
|
menggunakan pipet ketika mengarahkan pada tampungan sumber daya.
|
||||||
simplifiedBelts:
|
simplifiedBelts:
|
||||||
title: Sabuk Sederhana (Jelek)
|
title: Sabuk Sederhana (Jelek)
|
||||||
description: Tidak merender item pada sabuk konveyor kecuali ketika mengarahkan ke konveyor
|
description: Tidak merender item pada sabuk konveyor kecuali ketika mengarahkan
|
||||||
untuk menyelamatkan performa. Saya tidak merekomendasikan untuk bermain dengan pengaturan ini
|
ke konveyor untuk menyelamatkan performa. Saya tidak
|
||||||
jika kamu tidak benar-benar perlu performanya.
|
merekomendasikan untuk bermain dengan pengaturan ini jika kamu
|
||||||
|
tidak benar-benar perlu performanya.
|
||||||
enableMousePan:
|
enableMousePan:
|
||||||
title: Bergeser pada Layar Tepi
|
title: Bergeser pada Layar Tepi
|
||||||
description: Memungkinkan untuk memindahkan peta dengan menggerakkan kursor ke tepi layar. Kecepatannya tergantung pada pengaturan Kecepatan Gerakan.
|
description: Memungkinkan untuk memindahkan peta dengan menggerakkan kursor ke
|
||||||
|
tepi layar. Kecepatannya tergantung pada pengaturan Kecepatan
|
||||||
|
Gerakan.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Zoom ke arah Kursor
|
title: Zoom ke arah Kursor
|
||||||
description: Jika dinyalakan maka zoom akan terjadi pada arah dan posisi kursor,
|
description: Jika dinyalakan maka zoom akan terjadi pada arah dan posisi kursor,
|
||||||
sebaliknya zoom kana mengarah pada tengah layar.
|
sebaliknya zoom kana mengarah pada tengah layar.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Ukuran Sumber Daya Peta
|
title: Ukuran Sumber Daya Peta
|
||||||
description: Mengontrol ukuran bentuk-bentuk pada gambaran peta (ketika zoom out).
|
description: Mengontrol ukuran bentuk-bentuk pada gambaran peta (ketika zoom
|
||||||
|
out).
|
||||||
rangeSliderPercentage: <amount> %
|
rangeSliderPercentage: <amount> %
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Tombol Pintas
|
title: Tombol Pintas
|
||||||
@ -1009,6 +1004,10 @@ keybindings:
|
|||||||
comparator: Pembanding
|
comparator: Pembanding
|
||||||
item_producer: Pembuat Item
|
item_producer: Pembuat Item
|
||||||
copyWireValue: "Kabel: Salin nilai di bawah kursor"
|
copyWireValue: "Kabel: Salin nilai di bawah kursor"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Tentang permainan ini
|
title: Tentang permainan ini
|
||||||
body: >-
|
body: >-
|
||||||
@ -1022,8 +1021,7 @@ about:
|
|||||||
|
|
||||||
Lagunya dibuat oleh <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Dia mengagumkan.<br><br>
|
Lagunya dibuat oleh <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - Dia mengagumkan.<br><br>
|
||||||
|
|
||||||
Akhir kata, banyak terima kasih kepada teman baik saya <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Tanpa sesi-sesi factorio kami, permainan ini tidak mungkin
|
Akhir kata, banyak terima kasih kepada teman baik saya <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Tanpa sesi-sesi factorio kami, permainan ini tidak mungkin tercipta.
|
||||||
tercipta.
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Catatan Perubahan
|
title: Catatan Perubahan
|
||||||
demo:
|
demo:
|
||||||
@ -1039,55 +1037,81 @@ tips:
|
|||||||
- Pastikan pabrikmu berbentuk modul - akan membantu!
|
- Pastikan pabrikmu berbentuk modul - akan membantu!
|
||||||
- Jangan membangun terlalu dekat PUSAT, atau akan menjadi berantakan!
|
- Jangan membangun terlalu dekat PUSAT, atau akan menjadi berantakan!
|
||||||
- Apabila penumpukkan tidak bekerja, cobalah tukar kedua input.
|
- Apabila penumpukkan tidak bekerja, cobalah tukar kedua input.
|
||||||
- Kamu bisa mengubah arah Perencana Sabuk Konveyor dengan menekan tombol <b>R</b>.
|
- Kamu bisa mengubah arah Perencana Sabuk Konveyor dengan menekan tombol
|
||||||
- Menahan <b>CTRL</b> memungkinkan untuk menyeret sabuk konveyor tanpa rotasi otomatis.
|
<b>R</b>.
|
||||||
- Rasio akan tetap sama, selama semua upgrade berada pada Tingkatan yang sama.
|
- Menahan <b>CTRL</b> memungkinkan untuk menyeret sabuk konveyor tanpa
|
||||||
|
rotasi otomatis.
|
||||||
|
- Rasio akan tetap sama, selama semua upgrade berada pada Tingkatan yang
|
||||||
|
sama.
|
||||||
- Eksekusi atau pembuatan secara serial lebih efisian daripada paralel.
|
- Eksekusi atau pembuatan secara serial lebih efisian daripada paralel.
|
||||||
- Kamu akan membuka lebih banyak variasi bangunan nanti dalam game!
|
- Kamu akan membuka lebih banyak variasi bangunan nanti dalam game!
|
||||||
- Kamu bisa menggunakan tombol <b>T</b> untuk berganti antara varian.
|
- Kamu bisa menggunakan tombol <b>T</b> untuk berganti antara varian.
|
||||||
- Simetri adalah kunci!
|
- Simetri adalah kunci!
|
||||||
- Kamu dapat memadukan dua varian terowongan dalam satu baris ubin.
|
- Kamu dapat memadukan dua varian terowongan dalam satu baris ubin.
|
||||||
- Cobalah untuk membuat pabrik yang kompak dan padat - akan membantu!
|
- Cobalah untuk membuat pabrik yang kompak dan padat - akan membantu!
|
||||||
- Pengecat memiliki varian lain yang bisa kamu pilih dengan menekan tombol <b>T</b>
|
- Pengecat memiliki varian lain yang bisa kamu pilih dengan menekan tombol
|
||||||
|
<b>T</b>
|
||||||
- Memiliki rasio bangunan yang tepat dapat memaksimalkan efektivitas.
|
- Memiliki rasio bangunan yang tepat dapat memaksimalkan efektivitas.
|
||||||
- Pada level maksimum, 5 ekstraktor akan memenuhi 1 sabuk konveyor.
|
- Pada level maksimum, 5 ekstraktor akan memenuhi 1 sabuk konveyor.
|
||||||
- Jangan lupa gunakan terowongan!
|
- Jangan lupa gunakan terowongan!
|
||||||
- Kamu tidak perlu membagi item secara merata untuk meraih efisiensi maksimal.
|
- Kamu tidak perlu membagi item secara merata untuk meraih efisiensi
|
||||||
- Menahan <b>SHIFT</b> akan mengaktifkan Perencana Sabuk Konveyor, memungkinkan kamu untuk meletakkan sabuk konveyor yang panjang dengan mudah
|
maksimal.
|
||||||
|
- Menahan <b>SHIFT</b> akan mengaktifkan Perencana Sabuk Konveyor,
|
||||||
|
memungkinkan kamu untuk meletakkan sabuk konveyor yang panjang dengan
|
||||||
|
mudah
|
||||||
- Pemotong selalu memotong secara vertikal, bagaimanapun orientasinya.
|
- Pemotong selalu memotong secara vertikal, bagaimanapun orientasinya.
|
||||||
- Untuk mendapatkan warna putih, campurkan ketiga warna.
|
- Untuk mendapatkan warna putih, campurkan ketiga warna.
|
||||||
- Tempat penyimpanan memprioritaskan output kiri.
|
- Tempat penyimpanan memprioritaskan output kiri.
|
||||||
- Gunakan waktu untuk menciptakan desain yang dapat diulang - sangat berharga!
|
- Gunakan waktu untuk menciptakan desain yang dapat diulang - sangat
|
||||||
- Menahan <b>SHIFT</b> memungkinkan kamu untuk meletakkan beberapa bangunan sekaligus.
|
berharga!
|
||||||
- Kamu dapat menahan <b>ALT</b> untuk memutar arah pada sabuk konveyor yang sudah diletakkan.
|
- Menahan <b>SHIFT</b> memungkinkan kamu untuk meletakkan beberapa bangunan
|
||||||
|
sekaligus.
|
||||||
|
- Kamu dapat menahan <b>ALT</b> untuk memutar arah pada sabuk konveyor yang
|
||||||
|
sudah diletakkan.
|
||||||
- Efisiensi adalah kunci!
|
- Efisiensi adalah kunci!
|
||||||
- Tampungan bentuk yang semakin jauh dari pusat maka akan semakin kompleks.
|
- Tampungan bentuk yang semakin jauh dari pusat maka akan semakin kompleks.
|
||||||
- Mesin-mesin memiliki kecepatan maksimum, bagilah mereka untuk mendapatkan efisiensi maksimal.
|
- Mesin-mesin memiliki kecepatan maksimum, bagilah mereka untuk mendapatkan
|
||||||
|
efisiensi maksimal.
|
||||||
- Gunakan penyeimbang untuk memaksimalkan efisiensi pabrikmu.
|
- Gunakan penyeimbang untuk memaksimalkan efisiensi pabrikmu.
|
||||||
- Pabrik yang terorganisir itu penting. Cobalah untuk tidak banyak menyebrangi konveyor.
|
- Pabrik yang terorganisir itu penting. Cobalah untuk tidak banyak
|
||||||
|
menyebrangi konveyor.
|
||||||
- Rencanakan terlebih dahulu, supaya tidak menjadi berantakan!
|
- Rencanakan terlebih dahulu, supaya tidak menjadi berantakan!
|
||||||
- Jangan hapus pabrik-pabrik lama kamu! Kamu akan memerlukannya untuk mengupgrade Tingkatan selanjutnya.
|
- Jangan hapus pabrik-pabrik lama kamu! Kamu akan memerlukannya untuk
|
||||||
- Cobalah untuk menyelesaikan level 20 atau 26 sendiri terlebih dahulu sebelum mencari bantuan!
|
mengupgrade Tingkatan selanjutnya.
|
||||||
|
- Cobalah untuk menyelesaikan level 20 atau 26 sendiri terlebih dahulu
|
||||||
|
sebelum mencari bantuan!
|
||||||
- Jangan mempersulit hal-hal, cobalah untuk tetap simpel dan kamu akan maju.
|
- Jangan mempersulit hal-hal, cobalah untuk tetap simpel dan kamu akan maju.
|
||||||
- Kamu mungkin perlu menggunakan ulang pabrik-pabrik yang telah kamu buat. Buat pabrikmu supaya dapat digunakan kembali.
|
- Kamu mungkin perlu menggunakan ulang pabrik-pabrik yang telah kamu buat.
|
||||||
- Terkadang, kamu dapat menemukan bentuk yang diperlukan pada peta tanpa harus menumpuknya.
|
Buat pabrikmu supaya dapat digunakan kembali.
|
||||||
- Bentuk penuh windmills dan pinwheels tidak akan pernah muncul secara natural.
|
- Terkadang, kamu dapat menemukan bentuk yang diperlukan pada peta tanpa
|
||||||
|
harus menumpuknya.
|
||||||
|
- Bentuk penuh windmills dan pinwheels tidak akan pernah muncul secara
|
||||||
|
natural.
|
||||||
- Warnai bentuk sebelum memotongnya untuk meningkatkan efisiensi.
|
- Warnai bentuk sebelum memotongnya untuk meningkatkan efisiensi.
|
||||||
- Dengan modul-modul, ruang hanyalah persepsi; sebuah kekhawatiran untuk seorang yang hidup.
|
- Dengan modul-modul, ruang hanyalah persepsi; sebuah kekhawatiran untuk
|
||||||
- Buatlah pabrik Cetak Biru yang terpisah. Mereka sangat penting untuk membuat modul.
|
seorang yang hidup.
|
||||||
|
- Buatlah pabrik Cetak Biru yang terpisah. Mereka sangat penting untuk
|
||||||
|
membuat modul.
|
||||||
- Perhatikan lebih dekat pencampur warnanya, dan pertanyaanmu akan terjawab.
|
- Perhatikan lebih dekat pencampur warnanya, dan pertanyaanmu akan terjawab.
|
||||||
- Gunakan <b>CTRL</b> + Klik untuk memilih sebuah area.
|
- Gunakan <b>CTRL</b> + Klik untuk memilih sebuah area.
|
||||||
- Bangunan yang terlau dekat dengan pusat dapat menghalangi projek yang akan datang.
|
- Bangunan yang terlau dekat dengan pusat dapat menghalangi projek yang akan
|
||||||
- Ikon pin di samping tiap bentuk pada tab upgrade akan mem-pin bentuknya ke layar.
|
datang.
|
||||||
|
- Ikon pin di samping tiap bentuk pada tab upgrade akan mem-pin bentuknya ke
|
||||||
|
layar.
|
||||||
- Campur semua warna utama untuk menciptakan warna putih!
|
- Campur semua warna utama untuk menciptakan warna putih!
|
||||||
- Kamu punya peta yang tak terbatas. Jadi jangan memadatkan pabrikmu di pusat, luaskan!
|
- Kamu punya peta yang tak terbatas. Jadi jangan memadatkan pabrikmu di
|
||||||
|
pusat, luaskan!
|
||||||
- Cobalah Factorio juga! Itu game favorit saya.
|
- Cobalah Factorio juga! Itu game favorit saya.
|
||||||
- Pemotong (Empat Bagian) memotong searah jarum jam mulai dari bagian kanan atas.
|
- Pemotong (Empat Bagian) memotong searah jarum jam mulai dari bagian kanan
|
||||||
|
atas.
|
||||||
- Kamu bisa mengunduh data simpananmu di menu utama (main menu)!
|
- Kamu bisa mengunduh data simpananmu di menu utama (main menu)!
|
||||||
- Game ini memiliki banyak tombol pintas (keybindings) yag sangat berguna! Pastikan untuk mengeceknya di pengaturan.
|
- Game ini memiliki banyak tombol pintas (keybindings) yag sangat berguna!
|
||||||
|
Pastikan untuk mengeceknya di pengaturan.
|
||||||
- Game ini memiliki banyak pengaturan, Pastikan untuk mengeceknya!
|
- Game ini memiliki banyak pengaturan, Pastikan untuk mengeceknya!
|
||||||
- Penanda bangunan pusatmu memiliki kompas yang menunjukkan lokasinya!
|
- Penanda bangunan pusatmu memiliki kompas yang menunjukkan lokasinya!
|
||||||
- Untuk membersihkan sabuk konveyor, pindahkan (cut) bagian dan tempel (paste) di lokasi yang sama.
|
- Untuk membersihkan sabuk konveyor, pindahkan (cut) bagian dan tempel
|
||||||
|
(paste) di lokasi yang sama.
|
||||||
- Tekan F4 untuk menunjukkan FPS dan Tick Rate kamu.
|
- Tekan F4 untuk menunjukkan FPS dan Tick Rate kamu.
|
||||||
- Tekan F4 dua kali untuk menunjukkan ubin mouse dan kameramu.
|
- Tekan F4 dua kali untuk menunjukkan ubin mouse dan kameramu.
|
||||||
- Kamu bisa mengklik bentuk yang di-pin di sebelah kiri untuk tidak mem-pinnya lagi.
|
- Kamu bisa mengklik bentuk yang di-pin di sebelah kiri untuk tidak
|
||||||
|
mem-pinnya lagi.
|
||||||
|
@ -14,39 +14,14 @@ steamPage:
|
|||||||
All'inizio lavorerai solo con le forme, ma in seguito dovrai colorarle; a questo scopo dovrai estrarre e mescolare i colori!
|
All'inizio lavorerai solo con le forme, ma in seguito dovrai colorarle; a questo scopo dovrai estrarre e mescolare i colori!
|
||||||
|
|
||||||
Comprare il gioco su Steam ti garantirà l'accesso alla versone completa, ma puoi anche giocare una demo su shapez.io e decidere in seguito!
|
Comprare il gioco su Steam ti garantirà l'accesso alla versone completa, ma puoi anche giocare una demo su shapez.io e decidere in seguito!
|
||||||
title_advantages: Vantaggi della versione completa
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>12 nuovi livelli</b> per un totale di 26 livelli
|
and time has flown by.
|
||||||
- <b>18 nuovi edifici</b> per una fabbrica completamente automatizzata!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 gradi di miglioramenti</b> per molte ore di divertimento!
|
how to make a computer in shapez.io
|
||||||
- <b>L'aggiornamento dei Cavi</b> per una dimensione completamente nuova!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>Modalità scura</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- Salvataggi illimitati
|
efficient.
|
||||||
- Etichette illimitate
|
|
||||||
- Mi sostieni! ❤️
|
|
||||||
title_future: Contenuti pianificati
|
|
||||||
planned:
|
|
||||||
- Archivio dei progetti (esclusiva della versione completa)
|
|
||||||
- Achievement di steam
|
|
||||||
- Modalità puzzle
|
|
||||||
- Minimappa
|
|
||||||
- Mod
|
|
||||||
- Modalità sandbox
|
|
||||||
- ... e molto altro!
|
|
||||||
title_open_source: Questo gioco è open source!
|
|
||||||
title_links: Link
|
|
||||||
links:
|
|
||||||
discord: Server Discord ufficiale
|
|
||||||
roadmap: Tabella di marcia
|
|
||||||
subreddit: Reddit
|
|
||||||
source_code: Codice sorgente (GitHub)
|
|
||||||
translate: Aiutaci a tradurre
|
|
||||||
text_open_source: >-
|
|
||||||
Chiunque può contribuire, partecipo attivamente nella community e cerco
|
|
||||||
di leggere tutti i suggerimenti e di prendere in considerazione tutti i
|
|
||||||
feedback, quando possibile.
|
|
||||||
|
|
||||||
Controlla la mia pagina di trello per la tabella di marcia completa!
|
|
||||||
global:
|
global:
|
||||||
loading: Caricamento
|
loading: Caricamento
|
||||||
error: Errore
|
error: Errore
|
||||||
@ -208,7 +183,8 @@ dialogs:
|
|||||||
desc: Qui puoi cambiare il nome del salvataggio.
|
desc: Qui puoi cambiare il nome del salvataggio.
|
||||||
tutorialVideoAvailable:
|
tutorialVideoAvailable:
|
||||||
title: Tutorial Disponibile
|
title: Tutorial Disponibile
|
||||||
desc: C'è un video tutorial disponibile per questo livello! Vorresti dargli un'occhiata?
|
desc: C'è un video tutorial disponibile per questo livello! Vorresti dargli
|
||||||
|
un'occhiata?
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: Tutorial Disponibile
|
title: Tutorial Disponibile
|
||||||
desc: C'è un video tutorial per questo livello, ma è disponibile solo in
|
desc: C'è un video tutorial per questo livello, ma è disponibile solo in
|
||||||
@ -308,29 +284,33 @@ ingame:
|
|||||||
velocemente.<br><br>Suggerimento: Tieni premuto
|
velocemente.<br><br>Suggerimento: Tieni premuto
|
||||||
<strong>MAIUSC</strong> per piazzare estrattori multipli, e usa
|
<strong>MAIUSC</strong> per piazzare estrattori multipli, e usa
|
||||||
<strong>R</strong> per ruotarli."
|
<strong>R</strong> per ruotarli."
|
||||||
2_1_place_cutter: "Ora posiziona un <strong>Taglierino</strong> per tagliare i cerchi in due
|
2_1_place_cutter: "Ora posiziona un <strong>Taglierino</strong> per tagliare i
|
||||||
metà!<br><br> PS: Il taglierino taglia sempre <strong>dall'alto verso il
|
cerchi in due metà!<br><br> PS: Il taglierino taglia sempre
|
||||||
basso</strong> indipendentemente dal suo orientamento."
|
<strong>dall'alto verso il basso</strong> indipendentemente dal
|
||||||
2_2_place_trash: Il taglierino può <strong>intasarsi e bloccarsi</strong>!<br><br> Usa un
|
suo orientamento."
|
||||||
<strong>cestino</strong> per sbarazzarti delgli scarti (!) inutilizzati.
|
2_2_place_trash: Il taglierino può <strong>intasarsi e
|
||||||
2_3_more_cutters: "Ben fatto! Ora posiziona <strong>altri 2 taglierini</strong> per velocizzare
|
bloccarsi</strong>!<br><br> Usa un <strong>cestino</strong> per
|
||||||
questo lento processo!<br><br> PS: Usa i numeri <strong>da 0 a 9 </strong>
|
sbarazzarti delgli scarti (!) inutilizzati.
|
||||||
per selezionare gli edifici più in fretta!"
|
2_3_more_cutters: "Ben fatto! Ora posiziona <strong>altri 2 taglierini</strong>
|
||||||
|
per velocizzare questo lento processo!<br><br> PS: Usa i numeri
|
||||||
|
<strong>da 0 a 9 </strong> per selezionare gli edifici più in
|
||||||
|
fretta!"
|
||||||
3_1_rectangles: "Ora estraiamo qualche rettangolo! <strong>Costruisci 4
|
3_1_rectangles: "Ora estraiamo qualche rettangolo! <strong>Costruisci 4
|
||||||
estrattori</strong> e connettili alla HUB.<br><br> PS:
|
estrattori</strong> e connettili alla HUB.<br><br> PS: Tieni
|
||||||
Tieni premuto <strong>SHIFT</strong> mentre trascini un nastro per attivare il
|
premuto <strong>SHIFT</strong> mentre trascini un nastro per
|
||||||
pianificatore di nastri!"
|
attivare il pianificatore di nastri!"
|
||||||
21_1_place_quad_painter: Posiziona il <strong>verniciatore quadruplo</strong> e prendi dei
|
21_1_place_quad_painter: Posiziona il <strong>verniciatore quadruplo</strong> e
|
||||||
<strong>cerchi</strong> e i colori <strong>bianco</strong>
|
prendi dei <strong>cerchi</strong> e i colori
|
||||||
<strong>rosso</strong>!
|
<strong>bianco</strong> <strong>rosso</strong>!
|
||||||
21_2_switch_to_wires: Per passare al livello elettrico basta premere
|
21_2_switch_to_wires: Per passare al livello elettrico basta premere
|
||||||
<strong>E</strong>!<br><br> Poi <strong>connetti tutti e quattro gli
|
<strong>E</strong>!<br><br> Poi <strong>connetti tutti e quattro
|
||||||
input</strong> del verniciatore con i cavi!
|
gli input</strong> del verniciatore con i cavi!
|
||||||
21_3_place_button: Fantastico! Ora posiziona un <strong>Interruttore</strong> e connettilo
|
21_3_place_button: Fantastico! Ora posiziona un <strong>Interruttore</strong> e
|
||||||
con i cavi!
|
connettilo con i cavi!
|
||||||
21_4_press_button: "Premi l'interruttore per fargli <strong>emettere un segnale di verità
|
21_4_press_button: "Premi l'interruttore per fargli <strong>emettere un segnale
|
||||||
</strong> e fargli quindi attivare il vernciatore.<br><br> PS: Non c'è bisogno
|
di verità </strong> e fargli quindi attivare il
|
||||||
che tu connetta tutti gli imput! Prova a collegarne solo due."
|
vernciatore.<br><br> PS: Non c'è bisogno che tu connetta tutti
|
||||||
|
gli imput! Prova a collegarne solo due."
|
||||||
colors:
|
colors:
|
||||||
red: Rosso
|
red: Rosso
|
||||||
green: Verde
|
green: Verde
|
||||||
@ -363,9 +343,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 18 nuovi edifici
|
title: 18 nuovi edifici
|
||||||
desc: Automatizza completamente la tua fabbrica!
|
desc: Automatizza completamente la tua fabbrica!
|
||||||
savegames:
|
|
||||||
title: ∞ salvataggi
|
|
||||||
desc: Quanti ne desideri!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: ∞ gradi di miglioramenti
|
title: ∞ gradi di miglioramenti
|
||||||
desc: Questa demo ne ha solo 5!
|
desc: Questa demo ne ha solo 5!
|
||||||
@ -381,6 +358,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: Sostienimi
|
title: Sostienimi
|
||||||
desc: Lo sviluppo nel tempo libero!
|
desc: Lo sviluppo nel tempo libero!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: Nastri, distribuzione e tunnel
|
name: Nastri, distribuzione e tunnel
|
||||||
@ -694,9 +674,9 @@ storyRewards:
|
|||||||
destro è <strong>impilato sopra</strong> il sinistro!
|
destro è <strong>impilato sopra</strong> il sinistro!
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: Bilanciatore
|
title: Bilanciatore
|
||||||
desc: Il <strong>bilanciatore</strong> multifunzione è stato sbloccato - Può essere
|
desc: Il <strong>bilanciatore</strong> multifunzione è stato sbloccato - Può
|
||||||
usato per costruire fabbriche più grandi <strong>unendo e dividendo gli
|
essere usato per costruire fabbriche più grandi <strong>unendo e
|
||||||
oggetti</strong> su diversi nastri!
|
dividendo gli oggetti</strong> su diversi nastri!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: Aggregatore compatto
|
title: Aggregatore compatto
|
||||||
desc: Hai sbloccato un <strong>aggregatore</strong>, variante del
|
desc: Hai sbloccato un <strong>aggregatore</strong>, variante del
|
||||||
@ -745,13 +725,14 @@ storyRewards:
|
|||||||
divertirti!
|
divertirti!
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: Cavi e Verniciatrice quadrupla
|
title: Cavi e Verniciatrice quadrupla
|
||||||
desc: "Hai appena sbloccato il <strong>Livello Elettrico</strong>: è un livello separato
|
desc: "Hai appena sbloccato il <strong>Livello Elettrico</strong>: è un livello
|
||||||
dal livelo normale e introduce molte altre
|
separato dal livelo normale e introduce molte altre meccaniche di
|
||||||
meccaniche di gioco!<br><br> Per il momento ti ho sbloccato il <strong>Verniciatore
|
gioco!<br><br> Per il momento ti ho sbloccato il
|
||||||
Quadruplo</strong> - Connetti con il piano elettrico gli spazi
|
<strong>Verniciatore Quadruplo</strong> - Connetti con il piano
|
||||||
che vorresti colorare!<br><br> Per passare al livello elettrico ti basta premere
|
elettrico gli spazi che vorresti colorare!<br><br> Per passare al
|
||||||
<strong>E</strong>. <br><br> PS: <strong>Attiva gli aiuti</strong> nelle
|
livello elettrico ti basta premere <strong>E</strong>. <br><br> PS:
|
||||||
impostazioni per attivare il tutorial dei cavi!"
|
<strong>Attiva gli aiuti</strong> nelle impostazioni per attivare il
|
||||||
|
tutorial dei cavi!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: Filtro oggetti
|
title: Filtro oggetti
|
||||||
desc: Hai sbloccato il <strong>filtro oggetti</strong>! Smisterà gli oggetti
|
desc: Hai sbloccato il <strong>filtro oggetti</strong>! Smisterà gli oggetti
|
||||||
@ -926,12 +907,12 @@ settings:
|
|||||||
movimento.
|
movimento.
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: Zoom verso il Cursore
|
title: Zoom verso il Cursore
|
||||||
description: Se attivato, lo zoom andrà verso la posizione del mouse,
|
description: Se attivato, lo zoom andrà verso la posizione del mouse, altrimenti
|
||||||
altrimenti sarà verso il centro dello schermo.
|
sarà verso il centro dello schermo.
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: Grandezza delle Risorse sulla Mappa
|
title: Grandezza delle Risorse sulla Mappa
|
||||||
description: Controlla la grandezza delle forme visualizzate sulla mappa (quando si fa lo zoom
|
description: Controlla la grandezza delle forme visualizzate sulla mappa (quando
|
||||||
indietro).
|
si fa lo zoom indietro).
|
||||||
rangeSliderPercentage: <amount> %
|
rangeSliderPercentage: <amount> %
|
||||||
keybindings:
|
keybindings:
|
||||||
title: Comandi
|
title: Comandi
|
||||||
@ -1006,6 +987,10 @@ keybindings:
|
|||||||
comparator: Comparatore
|
comparator: Comparatore
|
||||||
item_producer: Generatore di oggetti (Sandbox)
|
item_producer: Generatore di oggetti (Sandbox)
|
||||||
copyWireValue: "Cavi: Copia valore sotto il cursore"
|
copyWireValue: "Cavi: Copia valore sotto il cursore"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: Riguardo questo gioco
|
title: Riguardo questo gioco
|
||||||
body: >-
|
body: >-
|
||||||
@ -1015,14 +1000,11 @@ about:
|
|||||||
|
|
||||||
Se vuoi contribuire visita la pagina github di <a href="<githublink>" target="_blank">shapez.io</a>.<br><br>
|
Se vuoi contribuire visita la pagina github di <a href="<githublink>" target="_blank">shapez.io</a>.<br><br>
|
||||||
|
|
||||||
Realizzare questo gioco non sarebbe stato possibile senza la grande community di Discord per i miei giochi -
|
Realizzare questo gioco non sarebbe stato possibile senza la grande community di Discord per i miei giochi - Unisciti al <a href="<discordlink>" target="_blank">server di Discord</a>!<br><br>
|
||||||
Unisciti al <a href="<discordlink>" target="_blank">server di Discord</a>!<br><br>
|
|
||||||
|
|
||||||
La colonna sonora è stata composta da<a href="https://soundcloud.com/pettersumelius" target="_blank">
|
La colonna sonora è stata composta da<a href="https://soundcloud.com/pettersumelius" target="_blank"> Peppsen</a> - È un grande.<br><br>
|
||||||
Peppsen</a> - È un grande.<br><br>
|
|
||||||
|
|
||||||
Per finire, grazie di cuore al mio migliore amico <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> -
|
Per finire, grazie di cuore al mio migliore amico <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Senza le nostre sessioni su factorio questo gioco non sarebbe mai esistito.
|
||||||
Senza le nostre sessioni su factorio questo gioco non sarebbe mai esistito.
|
|
||||||
changelog:
|
changelog:
|
||||||
title: Registro modifiche
|
title: Registro modifiche
|
||||||
demo:
|
demo:
|
||||||
@ -1057,8 +1039,8 @@ tips:
|
|||||||
efficienza.
|
efficienza.
|
||||||
- Tenere premuto <b>SHIFT</b> attiva il pianificatore nastri, facilitando il
|
- Tenere premuto <b>SHIFT</b> attiva il pianificatore nastri, facilitando il
|
||||||
posizionamento dei nastri più lunghi
|
posizionamento dei nastri più lunghi
|
||||||
- I taglierini tagliano sempre in verticale, indipendentemente
|
- I taglierini tagliano sempre in verticale, indipendentemente dal loro
|
||||||
dal loro orientamento.
|
orientamento.
|
||||||
- Mischia tutti i tre colori per fare il bianco.
|
- Mischia tutti i tre colori per fare il bianco.
|
||||||
- Il magazzino prioritizza la prima uscita.
|
- Il magazzino prioritizza la prima uscita.
|
||||||
- Impiega tempo per costruire design replicabili, ne vale la pena!
|
- Impiega tempo per costruire design replicabili, ne vale la pena!
|
||||||
|
@ -2,43 +2,18 @@ steamPage:
|
|||||||
shortText: shapez.ioは無限のマップ内で様々な"形"を資源とし、段々と複雑になっていく形の作成や合成の自動化を目指して工場を構築するゲームです。
|
shortText: shapez.ioは無限のマップ内で様々な"形"を資源とし、段々と複雑になっていく形の作成や合成の自動化を目指して工場を構築するゲームです。
|
||||||
discordLinkShort: 公式Discord
|
discordLinkShort: 公式Discord
|
||||||
intro: >-
|
intro: >-
|
||||||
工場の自動化ゲームはお好きですか?それなら間違いないでしょう!
|
工場の自動化ゲームはお好きですか? それならここに来て正解です!
|
||||||
|
|
||||||
Shapez.ioは、様々な幾何学的形状を生成するために工場を建設する、落ち着いたゲームです。レベルが上がる毎に生成すべき形はどんどん複雑になり、工場を無限に広がるマップに拡張する必要があります。
|
shapez.ioは、様々な幾何学形状の自動生産工場を建設する、リラックスして遊べるゲームです。レベルが上がるにつれ生産すべき形はどんどん複雑になり、無限に広がるマップに工場を拡張していくことになります。
|
||||||
|
|
||||||
しかし、それだけでは不十分です。需要は指数関数的に上昇し、より多くの形状を生産する必要があり――"スケーリング"が、唯一の対抗策と成り得ます。最初は形状を加工するだけですが、後々着色も必要になってきます――それには色を抽出して、混ぜ合わせることが必要です!
|
しかし、それだけでは不十分です。指数関数的に増大していく形状の要求量に対応する必要があり――「スケーリング」が、唯一の対抗策と成り得ます。また、最初は形状を加工するだけですが、後々着色も必要になってきます。色を抽出して混ぜ合わせましょう!
|
||||||
|
|
||||||
Steamでゲームを購入するとフルバージョンで遊ぶことができますが、まずshapez.ioでデモをプレイし、その後で決めることもできます!
|
Steamでゲームを購入するとフルバージョンで遊べますが、まずshapez.ioでデモをプレイし、その後で決めることもできます!
|
||||||
title_advantages: スタンドアロン版の特典
|
what_others_say: shapez.ioプレイヤーの反応:
|
||||||
advantages:
|
nothernlion_comment: これはすごいゲーム。プレイ体験が最高な上に時間の溶け方が尋常でない。
|
||||||
- <b>新しい12個のレベル</b>が追加され、全部で26個のレベルになります。
|
notch_comment: いややばいって。マジで寝なきゃなんだけど、今ならshapez.ioで計算機組めそうな気がする。
|
||||||
- <b>新しい18個のパーツ</b>が自動化工場建設のために使用できます!
|
steam_review_comment: このゲームは私の生活を奪い去っていったが、返して欲しいとは思わない。
|
||||||
- <b>20個のアップデートティア</b>によって多くの時間楽しむことができます!
|
いくらでも気の向くままに生産ラインを効率化させてくれる、そんなとても穏やかな工場ゲームだ。
|
||||||
- <b>ワイヤアップデート</b>によって全く新次元の体験を得られます!
|
|
||||||
- <b>ダークモード</b>!
|
|
||||||
- セーブ数の上限がなくなります。
|
|
||||||
- マップマーカー数の上限がなくなります。
|
|
||||||
- 私をサポートできる!❤️
|
|
||||||
title_future: 計画中の要素
|
|
||||||
planned:
|
|
||||||
- ブループリント (スタンドアロン版専用)
|
|
||||||
- Steamの実績
|
|
||||||
- パズルモード
|
|
||||||
- ミニマップ
|
|
||||||
- MOD対応
|
|
||||||
- サンドボックスモード
|
|
||||||
- ……あともっとたくさんの要素!
|
|
||||||
title_open_source: このゲームはオープンソースです!
|
|
||||||
text_open_source: |-
|
|
||||||
誰でも参加することができます。私はコミュニティに積極的に参加し、すべての提案を確認し、可能な場合はフィードバックしようとしています。
|
|
||||||
完全なロードマップについては、Trello boardを確認してください!
|
|
||||||
title_links: リンク
|
|
||||||
links:
|
|
||||||
discord: 公式Discord
|
|
||||||
roadmap: ロードマップ
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: ソースコード(GitHub)
|
|
||||||
translate: 翻訳を助けてください!
|
|
||||||
global:
|
global:
|
||||||
loading: ロード中
|
loading: ロード中
|
||||||
error: エラー
|
error: エラー
|
||||||
@ -82,9 +57,9 @@ mainMenu:
|
|||||||
importSavegame: インポート
|
importSavegame: インポート
|
||||||
openSourceHint: このゲームはオープンソースです
|
openSourceHint: このゲームはオープンソースです
|
||||||
discordLink: 公式Discordサーバー
|
discordLink: 公式Discordサーバー
|
||||||
helpTranslate: 翻訳を助けてください!
|
helpTranslate: 翻訳にご協力ください!
|
||||||
madeBy: <author-link>によって作られました
|
madeBy: <author-link>によって作られました
|
||||||
browserWarning: このゲームはお使いのブラウザでは速度が落ちることがあります。スタンドアローン版を入手するか、Chromeでプレイすることでこの問題は避けられます。
|
browserWarning: このゲームはお使いのブラウザでは速度が落ちることがあります。スタンドアローン版を入手するか、Chromeでプレイすることで解決できます。
|
||||||
savegameLevel: レベル <x>
|
savegameLevel: レベル <x>
|
||||||
savegameLevelUnknown: 不明なレベル
|
savegameLevelUnknown: 不明なレベル
|
||||||
savegameUnnamed: 無名のデータ
|
savegameUnnamed: 無名のデータ
|
||||||
@ -149,7 +124,7 @@ dialogs:
|
|||||||
desc: 多数の建造物をカットしようとしています! (<count> 個の選択) 続行しますか?
|
desc: 多数の建造物をカットしようとしています! (<count> 個の選択) 続行しますか?
|
||||||
massCutInsufficientConfirm:
|
massCutInsufficientConfirm:
|
||||||
title: カット確認
|
title: カット確認
|
||||||
desc: 設置コストが不足しています! 続行しますか?
|
desc: 設置コストが不足しています! 続行しますか?
|
||||||
blueprintsNotUnlocked:
|
blueprintsNotUnlocked:
|
||||||
title: 未解除
|
title: 未解除
|
||||||
desc: レベル12をクリアしてブループリント機能を解除してください!
|
desc: レベル12をクリアしてブループリント機能を解除してください!
|
||||||
@ -175,15 +150,13 @@ dialogs:
|
|||||||
desc: スクリーンショット出力を実行します。この処理は工場の全体像があまりに大きいと、 ゲームが遅くなったりクラッシュしてしまう可能性があります!
|
desc: スクリーンショット出力を実行します。この処理は工場の全体像があまりに大きいと、 ゲームが遅くなったりクラッシュしてしまう可能性があります!
|
||||||
renameSavegame:
|
renameSavegame:
|
||||||
title: セーブデータの名前を変更
|
title: セーブデータの名前を変更
|
||||||
desc: セーブデータの名前を変更することができます
|
desc: セーブデータの名前を変更できます
|
||||||
tutorialVideoAvailable:
|
tutorialVideoAvailable:
|
||||||
title: チュートリアル視聴可能
|
title: チュートリアル視聴可能
|
||||||
desc: このレベルで利用できるチュートリアルの動画があります!
|
desc: このレベルで利用できるチュートリアル動画があります! 確認しますか?
|
||||||
見ますか?
|
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: チュートリアル視聴可能
|
title: チュートリアル視聴可能
|
||||||
desc: このレベルで利用できるチュートリアルの動画がありますが、それは
|
desc: このレベルで利用できるチュートリアル動画がありますが、言語は英語です。確認しますか?
|
||||||
英語です。見ますか?
|
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: マップ移動
|
moveMap: マップ移動
|
||||||
@ -203,7 +176,7 @@ ingame:
|
|||||||
cutSelection: カット
|
cutSelection: カット
|
||||||
copySelection: コピー
|
copySelection: コピー
|
||||||
clearSelection: 選択範囲をクリア
|
clearSelection: 選択範囲をクリア
|
||||||
pipette: ピペット
|
pipette: スポイト
|
||||||
switchLayers: レイヤーを変更
|
switchLayers: レイヤーを変更
|
||||||
colors:
|
colors:
|
||||||
red: 赤
|
red: 赤
|
||||||
@ -287,28 +260,23 @@ ingame:
|
|||||||
もっと早く要件を満たせるように、追加の抽出機とベルトを設置しましょう。<br><br>Tip:
|
もっと早く要件を満たせるように、追加の抽出機とベルトを設置しましょう。<br><br>Tip:
|
||||||
<strong>SHIFT</strong>
|
<strong>SHIFT</strong>
|
||||||
キーを押し続けると抽出機を連続配置できます。<strong>R</strong>キーで設置方向を回転できます。"
|
キーを押し続けると抽出機を連続配置できます。<strong>R</strong>キーで設置方向を回転できます。"
|
||||||
2_1_place_cutter: "次に、<strong>切断機</strong>を設置し、円を
|
2_1_place_cutter: "次に、<strong>切断機</strong>を設置し、円を 二分割します!<br><br> 追記:
|
||||||
2分割します!<br><br> 追記: 切断機はそれの向きに関わらず、<strong>縦の線</strong>で切断します。"
|
切断機はそれの向きに関わらず、<strong>縦の線</strong>で切断します。"
|
||||||
2_2_place_trash: 切断機は<strong>詰まる</strong>場合があります!<br><br>
|
2_2_place_trash: 切断機は<strong>詰まる</strong>場合があります!<br><br>
|
||||||
<strong>ゴミ箱</strong>を利用して、不必要な部品を廃棄することができます。
|
<strong>ゴミ箱</strong>を利用して、不必要な部品を廃棄できます。
|
||||||
2_3_more_cutters: "いいですね!<strong>更に2つ以上の切断機</strong>を設置して
|
2_3_more_cutters: "いいですね! <strong>更に2つ以上の切断機</strong>を設置して処理をスピードアップさせましょう!<br>\
|
||||||
処理をスピードアップさせましょう!<br><br> 追記: <strong>0から9
|
<br> 追記: <strong>0から9 のホットキー</strong>を使用すると素早く部品にアクセスできます。"
|
||||||
のホットキー</strong>を使用すると素早く部品にアクセスできます。"
|
3_1_rectangles: "それでは四角形を抽出しましょう! <strong>4つの抽出機を作成</strong>してそれをハブに接続します。<br><\
|
||||||
3_1_rectangles: "それでは四角形を抽出しましょう!<strong>4つの抽出機を
|
br> 追記: <strong>SHIFT</strong>を押しながらベルトを引くと ベルトプランナーが有効になります!"
|
||||||
作成</strong>してそれをハブに接続します。<br><br> 追記:
|
|
||||||
<strong>SHIFT</strong>を押しながらベルトを引くと
|
|
||||||
ベルトプランナーが有効になります!"
|
|
||||||
21_1_place_quad_painter: <strong>四色着色機</strong>を設置して、
|
21_1_place_quad_painter: <strong>四色着色機</strong>を設置して、
|
||||||
<strong>円</strong>、<strong>白</strong>そして
|
<strong>円</strong>、<strong>白</strong>そして
|
||||||
<strong>赤</strong>を抽出します!
|
<strong>赤</strong>を抽出します!
|
||||||
21_2_switch_to_wires: <strong>E</strong>を押すとワイヤレイヤに
|
21_2_switch_to_wires: <strong>E</strong>を押すとワイヤレイヤに
|
||||||
切り替えできます!<br><br>そして<strong>4つの入力全てを</strong>
|
切り替えできます! <br><br>そして<strong>4つの入力全てを</strong> ケーブルで接続します!
|
||||||
ケーブルで接続します!
|
21_3_place_button: いいですね! 次に<strong>スイッチ</strong>を設置して そのワイヤに接続します!
|
||||||
21_3_place_button: いいね!次に<strong>スイッチ</strong>を設置して
|
|
||||||
そのワイヤに接続します!
|
|
||||||
21_4_press_button: "スイッチを押して<strong>真らしい信号を
|
21_4_press_button: "スイッチを押して<strong>真らしい信号を
|
||||||
発する</strong>ようにして、着色機を有効化します。<br><br> 追記: 全ての
|
発する</strong>ようにして、着色機を有効化します。<br><br> 追記: 全ての
|
||||||
入力を接続する必要はありません!2つだけ接続してみてください。"
|
入力を接続する必要はありません! 2つだけ接続してみてください。"
|
||||||
connectedMiners:
|
connectedMiners:
|
||||||
one_miner: 1個の抽出機
|
one_miner: 1個の抽出機
|
||||||
n_miners: <amount>個の抽出機
|
n_miners: <amount>個の抽出機
|
||||||
@ -327,12 +295,9 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 新しい18個の設置物
|
title: 新しい18個の設置物
|
||||||
desc: あなたの工場を完全自動化しましょう!
|
desc: あなたの工場を完全自動化しましょう!
|
||||||
savegames:
|
|
||||||
title: 無限個のセーブデータ
|
|
||||||
desc: あなたが望むだけデータを作成できます!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: 20個のアップデートティア
|
title: 無限のアップグレード段階
|
||||||
desc: このデモバージョンでは5ティアのみです!
|
desc: このデモバージョンでは5段階のみです!
|
||||||
markers:
|
markers:
|
||||||
title: 無限個のマップマーカー
|
title: 無限個のマップマーカー
|
||||||
desc: これでもうあなたの工場を見失いません!
|
desc: これでもうあなたの工場を見失いません!
|
||||||
@ -345,18 +310,21 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: 製作者をサポート
|
title: 製作者をサポート
|
||||||
desc: 余暇に制作しています!
|
desc: 余暇に制作しています!
|
||||||
|
achievements:
|
||||||
|
title: アチーブメント
|
||||||
|
desc: 取り尽くせ!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: ベルト、ディストリビュータとトンネル
|
name: ベルト、分配機とトンネル
|
||||||
description: スピード x<currentMult> → x<newMult>
|
description: スピード x<currentMult> → x<newMult>
|
||||||
miner:
|
miner:
|
||||||
name: 抽出機
|
name: 抽出
|
||||||
description: スピード x<currentMult> → x<newMult>
|
description: スピード x<currentMult> → x<newMult>
|
||||||
processors:
|
processors:
|
||||||
name: 切断、回転と積み重ね
|
name: 切断、回転と積み重ね
|
||||||
description: スピード x<currentMult> → x<newMult>
|
description: スピード x<currentMult> → x<newMult>
|
||||||
painting:
|
painting:
|
||||||
name: 混合と着色
|
name: 混色と着色
|
||||||
description: スピード x<currentMult> → x<newMult>
|
description: スピード x<currentMult> → x<newMult>
|
||||||
buildings:
|
buildings:
|
||||||
hub:
|
hub:
|
||||||
@ -401,28 +369,28 @@ buildings:
|
|||||||
cutter:
|
cutter:
|
||||||
default:
|
default:
|
||||||
name: 切断機
|
name: 切断機
|
||||||
description: 形を上下の直線で切断し、双方を出力します。<strong>もしひとつの出力しか使わない場合、他の出力を破棄しないと出力が詰まって停止することに注意してください!</strong>
|
description: 形を垂直に切断し、双方を出力します。<strong>ひとつの出力しか使わない場合、他の出力を破棄しないと詰まって停止してしまうことに注意してください!</strong>
|
||||||
quad:
|
quad:
|
||||||
name: 切断機 (四分割)
|
name: 切断機 (四分割)
|
||||||
description: 形を四分割します。<strong>もしひとつの出力しか使わない場合、他の出力を破棄しないと出力が詰まって停止することに注意してください!</strong>
|
description: 形を四分割します。<strong>ひとつの出力しか使わない場合、他の出力を破棄しないと詰まって停止してしまうことに注意してください!</strong>
|
||||||
rotater:
|
rotater:
|
||||||
default:
|
default:
|
||||||
name: 回転機
|
name: 回転機
|
||||||
description: 形を時計回り方向に90度回転します。
|
description: 形を時計回りに90度回転します。
|
||||||
ccw:
|
ccw:
|
||||||
name: 回転機 (逆)
|
name: 回転機 (逆)
|
||||||
description: 形を反時計回り方向に90度回転します。
|
description: 形を反時計回りに90度回転します。
|
||||||
rotate180:
|
rotate180:
|
||||||
name: 回転機 (180度)
|
name: 回転機 (180度)
|
||||||
description: 形を180度回転します。
|
description: 形を180度回転します。
|
||||||
stacker:
|
stacker:
|
||||||
default:
|
default:
|
||||||
name: 積層機
|
name: 積層機
|
||||||
description: 入力アイテムを積み重ねます。もしうまく統合できなかった場合は、右の入力アイテムを左の入力アイテムの上に重ねます。
|
description: 入力アイテムを積み重ねます。可能なら同じレイヤーに統合し、そうでなければ右の入力アイテムを左の入力アイテムの上に重ねます。
|
||||||
mixer:
|
mixer:
|
||||||
default:
|
default:
|
||||||
name: 混合機
|
name: 混色機
|
||||||
description: 2つの色を加算混合で混ぜ合わせます。
|
description: 2つの色を加法混色で混ぜ合わせます。
|
||||||
painter:
|
painter:
|
||||||
default:
|
default:
|
||||||
name: 着色機
|
name: 着色機
|
||||||
@ -432,10 +400,10 @@ buildings:
|
|||||||
description: 左から入力された形の全体を、下から入力された色で着色します。
|
description: 左から入力された形の全体を、下から入力された色で着色します。
|
||||||
double:
|
double:
|
||||||
name: 着色機 (ダブル)
|
name: 着色機 (ダブル)
|
||||||
description: 左から入力された形を、上から入力された色で着色します。
|
description: 左から入力された複数の形を、上から入力された色で着色します。
|
||||||
quad:
|
quad:
|
||||||
name: 着色機 (四分割)
|
name: 着色機 (四分割)
|
||||||
description: 入力された形を四分割づつ別の色で塗り分けられます。
|
description: 入力された形の四部分をそれぞれ別の色で塗り分けられます。
|
||||||
<strong>真らしい信号</strong>が流れているスロットのみがペイントされます!
|
<strong>真らしい信号</strong>が流れているスロットのみがペイントされます!
|
||||||
trash:
|
trash:
|
||||||
default:
|
default:
|
||||||
@ -495,8 +463,8 @@ buildings:
|
|||||||
description: 入力された信号をディスプレイに表示します。 形状、色、真偽値のいずれでも可能です。
|
description: 入力された信号をディスプレイに表示します。 形状、色、真偽値のいずれでも可能です。
|
||||||
reader:
|
reader:
|
||||||
default:
|
default:
|
||||||
name: ベルトリーダ
|
name: ベルトリーダー
|
||||||
description: 平均スループットを計測できます。 アンロック後は、 最後に通過したアイテムの情報を出力します。
|
description: 平均スループットを計測できます。 ワイヤレイヤのアンロック後は、 最後に通過したアイテムの情報を出力します。
|
||||||
analyzer:
|
analyzer:
|
||||||
default:
|
default:
|
||||||
name: 形状解析機
|
name: 形状解析機
|
||||||
@ -511,7 +479,7 @@ buildings:
|
|||||||
description: 形状の信号を2つに切断できます。
|
description: 形状の信号を2つに切断できます。
|
||||||
rotater:
|
rotater:
|
||||||
name: 仮想回転機
|
name: 仮想回転機
|
||||||
description: 形状の信号を時計回り、反時計回りに回転させます。
|
description: 形状の信号を時計回りに回転させます。
|
||||||
unstacker:
|
unstacker:
|
||||||
name: 仮想分離機
|
name: 仮想分離機
|
||||||
description: 形状の信号の最上層を右側に出力し、残りの層を左側に出力します。
|
description: 形状の信号の最上層を右側に出力し、残りの層を左側に出力します。
|
||||||
@ -528,125 +496,100 @@ buildings:
|
|||||||
storyRewards:
|
storyRewards:
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: 形の切断
|
title: 形の切断
|
||||||
desc:
|
desc: <strong>切断機</strong>が利用可能になりました。これは入力された形を、<strong>向きを考慮せず上下の直線で</strong>半分に切断します! <br><br>利用しない側の出力に注意しましょう、破棄しなければ<strong>詰まって停止してしまいます。</strong>
|
||||||
<strong>切断機</strong>が利用可能になりました。これは入力された形を、<strong>向きを考慮せず上下の直線で</strong>半分に切断します。<br><br>利用しない側の出力に注意しましょう。破棄するなどをしない限り<strong>詰まって停止してしまいます</strong>
|
|
||||||
- このために<strong>ゴミ箱</strong>も用意しました。入力アイテムをすべて破棄できます!
|
- このために<strong>ゴミ箱</strong>も用意しました。入力アイテムをすべて破棄できます!
|
||||||
reward_rotater:
|
reward_rotater:
|
||||||
title: 回転
|
title: 回転
|
||||||
desc: <strong>回転機</strong>が利用可能になりました。形を時計回り方向に90度回転させます。
|
desc: <strong>回転機</strong>が利用可能になりました! 形を時計回り方向に90度回転させます。
|
||||||
reward_painter:
|
reward_painter:
|
||||||
title: 着色
|
title: 着色
|
||||||
desc: "<strong>着色機</strong>が利用可能になりました。(今まで形状でやってきた方法で)色を抽出し、
|
desc: "<strong>着色機</strong>が利用可能になりました。(今まで形状でやってきた方法で)色を抽出し、形状と合成することで着色します! <\
|
||||||
形状と合成することで着色します!<br><br>追伸: もし色覚特性をお持ちでしたら、
|
br><br>追伸: もし色覚特性をお持ちでしたら、 設定に<strong>色覚特性モード</strong>があります!"
|
||||||
設定に<strong>色覚特性モード</strong>があります!"
|
|
||||||
reward_mixer:
|
reward_mixer:
|
||||||
title: 色の混合
|
title: 混色
|
||||||
desc: <strong>混合機</strong>が利用可能になりました。 -
|
desc: <strong>混色機</strong>が利用可能になりました。この建造物は2つの色を<strong>加法混色で</strong>混ぜ合わせます!
|
||||||
この建造物は2つの色を<strong>加算混合で</strong>混ぜ合わせます。
|
|
||||||
reward_stacker:
|
reward_stacker:
|
||||||
title: 積層機
|
title: 積層機
|
||||||
desc: <strong>積層機</strong>で形を組み合わせ可能になりました。双方の入力を組み合わせ、もし連続した形になっていればそれらは<strong>融合してひとつ</strong>になります! もしできなかった場合は、左の入力の<strong>上に右の入力が重なります。</strong>
|
desc: <strong>積層機</strong>で形を組み合わせ可能になりました! 双方の入力を組み合わせ、連続した形になっていればそれらは<strong>融合してひとつ</strong>になります。そうでなければ、左の入力の<strong>上に右の入力が重なります!</strong>
|
||||||
reward_balancer:
|
reward_balancer:
|
||||||
title: 分配機/合流機
|
title: 分配機/合流機
|
||||||
desc: 多機能な<strong>分配機/合流機</strong>が利用可能になりました - より
|
desc: 多機能な<strong>分配機/合流機</strong>が利用可能になりました。より大規模な工場を構築するため、複数のベルト間で<strong>アイテムを合流、分配</strong>できます!
|
||||||
大規模な工場を構築するため、複数のベルト間で<strong>アイテムを合流、
|
|
||||||
分配</strong>できます!
|
|
||||||
reward_tunnel:
|
reward_tunnel:
|
||||||
title: トンネル
|
title: トンネル
|
||||||
desc: <strong>トンネル</strong>が利用可能になりました。 - 他のベルトや建造物の地下を通してベルトが配置可能です!
|
desc: <strong>トンネル</strong>が利用可能になりました。他のベルトや建造物の地下を通してベルトが配置可能です!
|
||||||
reward_rotater_ccw:
|
reward_rotater_ccw:
|
||||||
title: 反時計回りの回転
|
title: 反時計回りの回転
|
||||||
desc: <strong>回転機</strong>のバリエーションが利用可能になりました。 -
|
desc: <strong>回転機</strong>のバリエーションが利用可能になりました。反時計回りの回転ができるようになります! 回転機を選択し、<strong>'T'キーを押すことで方向の切り替えができます。</strong>
|
||||||
反時計回りの回転ができるようになります! 回転機を選択し、<strong>'T'キーを押すことで方向の切り替えができます</strong>
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: 連鎖抽出機
|
title: 連鎖抽出機
|
||||||
desc: "<strong>連鎖抽出機</strong>が利用可能になりました!他の
|
desc: "<strong>連鎖抽出機</strong>が利用可能になりました! 他の抽出機に<strong>出力を渡す</strong>ことができるので、
|
||||||
他の抽出機に<strong>出力を渡す</strong>ことができるので、
|
資源の抽出がより効率的になります!<br><br> 補足: ツールバーの 旧い抽出機が置き換えられました!"
|
||||||
資源の抽出がより効率的になります!<br><br> 補足: ツールバーの
|
|
||||||
旧い抽出機が置き換えられました!"
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: トンネル レベルII
|
title: トンネル レベルII
|
||||||
desc: <strong>トンネル</strong>のバリエーションが利用可能になりました。 -
|
desc: <strong>トンネル</strong>のバリエーションが利用可能になりました。 -
|
||||||
<strong>距離拡張版が追加され</strong>、以前のものと組み合わせて目的に応じて利用することができます!
|
<strong>距離拡張版が追加され</strong>、以前のものと組み合わせて目的に応じて利用できます!
|
||||||
reward_merger:
|
reward_merger:
|
||||||
title: コンパクトな合流機
|
title: コンパクトな合流機
|
||||||
desc: <strong>合流機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました! -
|
desc: <strong>合流機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました! 2つの入力を1つの出力に合流させます!
|
||||||
2つの入力を1つの出力に合流させます!
|
|
||||||
reward_splitter:
|
reward_splitter:
|
||||||
title: コンパクトな分配機
|
title: コンパクトな分配機
|
||||||
desc: <strong>分配機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました! -
|
desc: <strong>分配機</strong>の<strong>コンパクトバージョン</strong>が利用可能になりました! 1つの入力を2つの出力に分配します!
|
||||||
1つの入力を2つの出力に分配します!
|
|
||||||
reward_belt_reader:
|
reward_belt_reader:
|
||||||
title: ベルトリーダ
|
title: ベルトリーダー
|
||||||
desc: <strong>ベルトリーダ</strong>が利用可能になりました!ベルトのスループットを計測できます。<br><br>ワイヤーのロックが解除されれば、より便利になります!
|
desc: <strong>ベルトリーダー</strong>が利用可能になりました! ベルトのスループットを計測できます。<br><br>ワイヤ関連の機能がアンロックされれば、より便利になります!
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: 四分割
|
title: 四分割切断機
|
||||||
desc: <strong>切断機</strong>のバリエーションが利用可能になりました。 -
|
desc: <strong>切断機</strong>のバリエーションが利用可能になりました。 -
|
||||||
上下の二分割ではなく、<strong>四分割</strong>に切断できます!
|
左右二分割ではなく、<strong>四つ</strong>に切断できます!
|
||||||
reward_painter_double:
|
reward_painter_double:
|
||||||
title: 着色機 (ダブル)
|
title: 着色機 (ダブル)
|
||||||
desc: <strong>着色機</strong>のバリエーションが利用可能になりました。 -
|
desc: <strong>着色機</strong>のバリエーションが利用可能になりました。 -
|
||||||
通常の着色機と同様に機能しますが、ひとつの色の消費で<strong>一度に2つの形</strong>を着色処理できます!
|
通常の着色機と同様に機能しますが、ひとつの色の消費で<strong>一度に2つの形</strong>を着色処理できます!
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: 余剰の貯蓄
|
title: ストレージ
|
||||||
desc:
|
desc: <strong>ストレージ</strong>が利用可能になりました。 - 容量上限までアイテムを格納できます!<br><br>
|
||||||
<strong>ゴミ箱</strong>のバリエーションが利用可能になりました。 - 容量上限までアイテムを格納することができます!<br><br>
|
|
||||||
左側の出力を優先するため、<strong>オーバーフローゲート</strong>としても使用できます!
|
左側の出力を優先するため、<strong>オーバーフローゲート</strong>としても使用できます!
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: ブループリント
|
title: ブループリント
|
||||||
desc: >-
|
desc: 工場の建造物の<strong>コピー&ペースト</strong>が利用可能になりました!
|
||||||
工場の建造物の<strong>コピー&ペースト</strong>が利用可能になりました!
|
範囲選択(CTRLキーを押したままマウスドラッグ)した状態で、'C'キーを押すことでコピーができます。<br><br>ただしペーストは<strong>タダではありません。</strong><strong>ブループリントの形</strong>を生産する必要があります!(たった今納品した形です)
|
||||||
範囲選択(CTRLキーを押したままマウスドラッグ)した状態で、'C'キーを押すことでコピーができます。<br><br>ペーストは<strong>タダではありません。</strong><strong>ブループリントの形</strong>を生産することで可能になります!(たった今納品したものです)
|
|
||||||
reward_rotater_180:
|
reward_rotater_180:
|
||||||
title: 180度の回転
|
title: 回転(180°)
|
||||||
desc: <strong>回転機</strong>のバリエーションが利用可能になりました! 180度の回転ができるようになります!(サプライズ! :D)
|
desc: <strong>回転機</strong>のバリエーションが利用可能になりました! 180°の回転ができるようになります!(サプライズ! :D)
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: ワイヤ&着色機(四分割)
|
title: ワイヤ&着色機(四分割)
|
||||||
desc: "<strong>ワイヤレイヤ</strong>が利用可能になりました: これは通常の
|
desc: "<strong>ワイヤレイヤ</strong>が利用可能になりました: これは通常の レイヤーの上にある別のレイヤであり、多くの新しい要素があります!<br><br>
|
||||||
レイヤーの上にある別のレイヤであり、多くの新しい要素が
|
まず最初に、<strong>四色着色機</strong>が利用可能になりました - 着色するスロットをワイヤレイヤで接続してください!<br><br>
|
||||||
あります!<br><br> 最初に、<strong>四色
|
ワイヤレイヤに切り替えるには、<strong>E</strong>を押します。 <br><br>
|
||||||
着色機</strong>が利用可能になりました - 着色するスロットをワイヤレイヤで
|
補足: 設定で<strong>ヒントを有効にする</strong>と、 ワイヤのチュートリアルが有効になります。"
|
||||||
接続します!<br><br> ワイヤレイヤに切り替えるには、
|
|
||||||
<strong>E</strong>を押します。 <br><br> 補足: 設定で<strong>ヒントを有効にする</strong>と、
|
|
||||||
ワイヤのチュートリアルが有効になります。"
|
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: アイテムフィルタ
|
title: アイテムフィルタ
|
||||||
desc:
|
desc: <strong>アイテムフィルタ</strong>が利用可能になりました! ワイヤレイヤの信号と一致するかどうかに応じて、アイテムを上側または右側の出力に分離します。<br><br>
|
||||||
<strong>アイテムフィルタ</strong>が利用可能になりました! ワイヤレイヤの信号と一致するかどうかに応じて、
|
また、真偽値(0/1)信号を入力すれば全てのアイテムの通過・非通過を制御できます。
|
||||||
アイテムを上部または右側の出力に分離します。<br><br>真偽値(0/1)信号を利用することで
|
|
||||||
どんなアイテムでも通過させるか、または通過させないかを選ぶこともできます。
|
|
||||||
reward_display:
|
reward_display:
|
||||||
title: ディスプレイ
|
title: ディスプレイ
|
||||||
desc: "<strong>ディスプレイ</strong>が利用可能になりました - ワイヤレイヤで
|
desc: "<strong>ディスプレイ</strong>が利用可能になりました - ワイヤレイヤで信号を接続することで、その内容を表示できます!<br><br>
|
||||||
信号を接続することで、その内容を視認することができます!<br><br> 補足: ベルトリーダーとストレージが
|
補足: ベルトリーダーとストレージが最後に通過したアイテムを出力していることに気づきましたか? それをディスプレイに表示してみてください!"
|
||||||
最後に通過したアイテムを出力していることに気づきましたか? それをディスプレイに
|
|
||||||
表示してみてください!"
|
|
||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: 定数信号
|
title: 定数信号
|
||||||
desc: <strong>定数信号</strong>がワイヤレイヤで
|
desc: <strong>定数信号</strong>がワイヤレイヤで利用可能になりました! これは例えば<strong>アイテムフィルタ</strong>に接続すると便利です。<br><br>
|
||||||
利用可能になりました!これは例えば<strong>アイテムフィルタ</strong>に接続する
|
発信できる信号は<strong>形状</strong>、<strong>色</strong>、<strong>真偽値</strong>(1か0)です。
|
||||||
場合に便利です。<br><br> 定数信号は
|
|
||||||
<strong>形状</strong>、<strong>色</strong>または
|
|
||||||
<strong>真偽値</strong>(1か0)を発信できます。
|
|
||||||
reward_logic_gates:
|
reward_logic_gates:
|
||||||
title: 論理ゲート
|
title: 論理ゲート
|
||||||
desc:
|
desc: <strong>論理ゲート</strong>が利用可能になりました! 興奮する必要はありませんが、これは非常に優秀なんですよ!<br><br>
|
||||||
<strong>論理ゲート</strong>が利用可能になりました! 興奮するほどでは ありませんが、これらは非常に優秀です!<br><br>
|
これでAND, OR, XOR, NOTを計算できます。<br><br>
|
||||||
AND, OR, XOR and
|
ボーナスとして<strong>トランジスタ</strong>も追加しました!
|
||||||
NOTを計算できます!<br><br>ボーナスとして<strong>トランジスタ</strong>も追加しました!
|
|
||||||
reward_virtual_processing:
|
reward_virtual_processing:
|
||||||
title: 仮想処理
|
title: 仮想処理
|
||||||
desc: <strong>形状処理をシミュレート</strong>できる新しい部品を沢山追加しました!<br><br>
|
desc: <strong>形状処理をシミュレート</strong>できる新しい部品をたくさん追加しました!<br><br>
|
||||||
ワイヤレイヤで切断、回転、積層をシミュレートできるようになりました。
|
ワイヤレイヤで切断、回転、積層などをシミュレートできるようになりました!
|
||||||
これからゲームを続けるにあたり、3つの方法があります:<br><br> -
|
ゲームを続けるにあたって、あなたには3つの選択肢があります:<br><br> -
|
||||||
<strong>完全自動化された機械</strong>を構築し、HUBが要求する形状を作成する(試してみることをオススメします!)。<br><br>
|
<strong>完全自動化された工場</strong>を構築し、HUBが要求するあらゆる形状を作成する(試してみることをオススメします!)。<br><br>
|
||||||
- ワイヤでイカしたものを作る。<br><br> - 今までのように工場を建設する。<br><br> いずれにしても、楽しんでください!
|
- ワイヤでイカしたものを作る。<br><br> - 今までのように工場を建設する。<br><br> いずれにしても、楽しんでください!
|
||||||
no_reward:
|
no_reward:
|
||||||
title: 次のレベル
|
title: 次のレベル
|
||||||
desc:
|
desc: "このレベルには報酬はありません。次はきっとありますよ! <br><br> 補足: すでに作った生産ラインは削除しないようにしましょう。 -
|
||||||
"このレベルには報酬はありません。次にはあるでしょう! <br><br> 補足: すでに作った生産ラインは削除しないようにしましょう。 -
|
生産された形は<strong>すべて</strong>、後で<strong>アップグレードの解除</strong>に必要になります!"
|
||||||
生産された形は<strong>すべて</strong>、後に<strong>アップグレードの解除</strong>のために必要になりま\
|
|
||||||
す!"
|
|
||||||
no_reward_freeplay:
|
no_reward_freeplay:
|
||||||
title: 次のレベル
|
title: 次のレベル
|
||||||
desc: おめでとうございます!
|
desc: おめでとうございます!
|
||||||
@ -654,8 +597,8 @@ storyRewards:
|
|||||||
title: フリープレイ
|
title: フリープレイ
|
||||||
desc: やりましたね! <strong>フリープレイモード</strong>が利用可能になりました。 -
|
desc: やりましたね! <strong>フリープレイモード</strong>が利用可能になりました。 -
|
||||||
これからは納品すべき形は<strong>ランダムに</strong>生成されます!<br><br>
|
これからは納品すべき形は<strong>ランダムに</strong>生成されます!<br><br>
|
||||||
今後、ハブには<strong>スループット</strong>が必要になるため、要求する形状を自動的に納品するマシンを構築することを強くお勧めします!<br><br>
|
今後、ハブは<strong>スループット</strong>を要求してきます。要求された形状を自動的に納品するマシンを構築することを強くお勧めします!<br><br>
|
||||||
ハブは要求する形状をワイヤー層に出力するので、それを分析し自動的に調整する工場を作成するだけです。
|
ハブは要求する形状をワイヤレイヤに出力するので、それを分析して自動的に工場を調整するだけですよ。
|
||||||
reward_demo_end:
|
reward_demo_end:
|
||||||
title: お試し終了
|
title: お試し終了
|
||||||
desc: デモ版の最後に到達しました!
|
desc: デモ版の最後に到達しました!
|
||||||
@ -713,13 +656,13 @@ settings:
|
|||||||
extremely_fast: 極速
|
extremely_fast: 極速
|
||||||
language:
|
language:
|
||||||
title: 言語
|
title: 言語
|
||||||
description: 言語を変更します。すべての翻訳はユーザーからの協力で成り立っており、まだ完全には完了していない可能性があります!
|
description: 言語を変更します。すべての翻訳はユーザーの皆さんの協力によるものであり、まだ不完全な可能性があります!
|
||||||
enableColorBlindHelper:
|
enableColorBlindHelper:
|
||||||
title: 色覚モード
|
title: 色覚モード
|
||||||
description: 色覚特性を持っていてもゲームがプレイできるようにするための各種ツールを有効化します。
|
description: 色覚特性を持っていてもゲームがプレイできるようにするための各種ツールを有効化します。
|
||||||
fullscreen:
|
fullscreen:
|
||||||
title: フルスクリーン
|
title: フルスクリーン
|
||||||
description: フルスクリーンでのプレイが推奨です。スタンドアローン版のみ変更可能です。
|
description: フルスクリーンでのプレイが推奨されます。スタンドアローン版のみ変更可能です。
|
||||||
soundsMuted:
|
soundsMuted:
|
||||||
title: 効果音ミュート
|
title: 効果音ミュート
|
||||||
description: 有効に設定するとすべての効果音をミュートします。
|
description: 有効に設定するとすべての効果音をミュートします。
|
||||||
@ -734,13 +677,13 @@ settings:
|
|||||||
description: 音楽の音量を設定してください。
|
description: 音楽の音量を設定してください。
|
||||||
theme:
|
theme:
|
||||||
title: ゲームテーマ
|
title: ゲームテーマ
|
||||||
description: ゲームテーマを選択します。 (ライト / ダーク).
|
description: ゲームテーマを選択します。(ライト/ダーク)
|
||||||
themes:
|
themes:
|
||||||
dark: ダーク
|
dark: ダーク
|
||||||
light: ライト
|
light: ライト
|
||||||
refreshRate:
|
refreshRate:
|
||||||
title: シミュレーション対象
|
title: リフレッシュレート
|
||||||
description: もし144hzのモニターを利用しているなら、この設定でリフレッシュレートを変更することで、ゲームが高リフレッシュレートを正しくシミュレーションします。利用しているPCが非力な場合、この設定により実効FPSが遅くなる可能性があります。
|
description: 秒間何回ゲームが更新されるかを設定できます。一般的には値が高いほど正確になりますが、パフォーマンスは低下します。値が低い場合、正確なスループットを計測できなくなる可能性があります。
|
||||||
alwaysMultiplace:
|
alwaysMultiplace:
|
||||||
title: 連続配置
|
title: 連続配置
|
||||||
description: この設定を有効にすると、建造物を選択後に意図的にキャンセルするまで選択された状態を維持します。これはSHIFTキーを押し続けている状態と同等です。
|
description: この設定を有効にすると、建造物を選択後に意図的にキャンセルするまで選択された状態を維持します。これはSHIFTキーを押し続けている状態と同等です。
|
||||||
@ -771,8 +714,7 @@ settings:
|
|||||||
description: 配置用のグリッドを無効にして、パフォーマンスを向上させます。 これにより、ゲームの見た目もすっきりします。
|
description: 配置用のグリッドを無効にして、パフォーマンスを向上させます。 これにより、ゲームの見た目もすっきりします。
|
||||||
clearCursorOnDeleteWhilePlacing:
|
clearCursorOnDeleteWhilePlacing:
|
||||||
title: 右クリックで配置をキャンセル
|
title: 右クリックで配置をキャンセル
|
||||||
description:
|
description: デフォルトで有効です。建物を設置しているときに右クリックすると、選択中の建物がキャンセルされます。
|
||||||
デフォルトで有効です。建物を設置しているときに右クリックすると、選択中の建物がキャンセルされます。
|
|
||||||
無効にすると、建物の設置中に右クリックで建物を削除できます。
|
無効にすると、建物の設置中に右クリックで建物を削除できます。
|
||||||
lowQualityTextures:
|
lowQualityTextures:
|
||||||
title: 低品質のテクスチャ(視認性低下)
|
title: 低品質のテクスチャ(視認性低下)
|
||||||
@ -792,14 +734,13 @@ settings:
|
|||||||
description: 画面の端にカーソルを合わせることで移動できます。移動速度を設定することで、速度を変更できます。
|
description: 画面の端にカーソルを合わせることで移動できます。移動速度を設定することで、速度を変更できます。
|
||||||
zoomToCursor:
|
zoomToCursor:
|
||||||
title: カーソルに向かってズーム
|
title: カーソルに向かってズーム
|
||||||
description: 有効にすると、カーソルの方に向かってズームします。
|
description: 有効にすると、カーソルの方に向かってズームします。 無効にすると、画面の中央に向かってズームします。
|
||||||
無効にすると、画面の中央に向かってズームします。
|
|
||||||
mapResourcesScale:
|
mapResourcesScale:
|
||||||
title: 資源アイコンのサイズ
|
title: 資源アイコンのサイズ
|
||||||
description: ズームアウトしたときの図形のサイズを調節します。
|
description: ズームアウトしたときの図形のサイズを調節します。
|
||||||
keybindings:
|
keybindings:
|
||||||
title: キー設定
|
title: キー設定
|
||||||
hint: "Tip: CTRL, SHIFT, ALTを利用するようにしてください。これらはそれぞれ建造物配置の際の機能があります。"
|
hint: "Tip: CTRL, SHIFT, ALTを活用してください。建造物配置の際の追加機能がそれぞれ割り当てられています。"
|
||||||
resetKeybindings: キー設定をリセット
|
resetKeybindings: キー設定をリセット
|
||||||
categoryLabels:
|
categoryLabels:
|
||||||
general: アプリケーション
|
general: アプリケーション
|
||||||
@ -835,7 +776,7 @@ keybindings:
|
|||||||
cutter: 切断機
|
cutter: 切断機
|
||||||
rotater: 回転機
|
rotater: 回転機
|
||||||
stacker: 積層機
|
stacker: 積層機
|
||||||
mixer: 混合機
|
mixer: 混色機
|
||||||
painter: 着色機
|
painter: 着色機
|
||||||
trash: ゴミ箱
|
trash: ゴミ箱
|
||||||
storage: ストレージ
|
storage: ストレージ
|
||||||
@ -846,7 +787,7 @@ keybindings:
|
|||||||
filter: アイテムフィルタ
|
filter: アイテムフィルタ
|
||||||
wire_tunnel: 交差ワイヤ
|
wire_tunnel: 交差ワイヤ
|
||||||
display: ディスプレイ
|
display: ディスプレイ
|
||||||
reader: ベルトリーダ
|
reader: ベルトリーダー
|
||||||
virtual_processor: 仮想切断機
|
virtual_processor: 仮想切断機
|
||||||
transistor: トランジスタ
|
transistor: トランジスタ
|
||||||
analyzer: 形状解析機
|
analyzer: 形状解析機
|
||||||
@ -861,27 +802,31 @@ keybindings:
|
|||||||
cycleBuildings: 建造物の選択
|
cycleBuildings: 建造物の選択
|
||||||
lockBeltDirection: ベルトプランナーを有効化
|
lockBeltDirection: ベルトプランナーを有効化
|
||||||
switchDirectionLockSide: "プランナー: 通る側を切り替え"
|
switchDirectionLockSide: "プランナー: 通る側を切り替え"
|
||||||
copyWireValue: "ワイヤ: カーソルに合っている形状信号をキーとしてコピー"
|
copyWireValue: "ワイヤ: カーソルの下の形状信号をキーとしてコピー"
|
||||||
massSelectStart: マウスドラッグで開始
|
massSelectStart: マウスドラッグで開始
|
||||||
massSelectSelectMultiple: 複数範囲選択
|
massSelectSelectMultiple: 複数範囲選択
|
||||||
massSelectCopy: 範囲コピー
|
massSelectCopy: 範囲コピー
|
||||||
massSelectCut: 範囲カット
|
massSelectCut: 範囲カット
|
||||||
placementDisableAutoOrientation: 自動向き合わせ無効
|
placementDisableAutoOrientation: 自動向き合わせを無効化
|
||||||
placeMultiple: 配置モードの維持
|
placeMultiple: 配置モードの維持
|
||||||
placeInverse: ベルトの自動向き合わせを逆転
|
placeInverse: ベルトの自動向き合わせを逆転
|
||||||
|
rotateToUp: "回転: 上向きにする"
|
||||||
|
rotateToDown: "回転: 下向きにする"
|
||||||
|
rotateToRight: "回転: 右向きにする"
|
||||||
|
rotateToLeft: "回転: 左向きにする"
|
||||||
about:
|
about:
|
||||||
title: このゲームについて
|
title: このゲームについて
|
||||||
body: >-
|
body: >-
|
||||||
このゲームはオープンソースであり、<a href="https://github.com/tobspr"
|
このゲームはオープンソースであり、<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:
|
changelog:
|
||||||
title: 更新履歴
|
title: 更新履歴
|
||||||
demo:
|
demo:
|
||||||
@ -894,58 +839,57 @@ demo:
|
|||||||
settingNotAvailable: デモ版では利用できません。
|
settingNotAvailable: デモ版では利用できません。
|
||||||
tips:
|
tips:
|
||||||
- ハブは現在指定されている形状だけではなく、あらゆる種類の入力を受け付けることができます。
|
- ハブは現在指定されている形状だけではなく、あらゆる種類の入力を受け付けることができます。
|
||||||
- あなたの工場が拡張可能か確認してください - あとで報われるでしょう!
|
- あなたの工場が部品単位で増築可能か確認してください。あとできっと役に立ちます!
|
||||||
- ハブのすぐ近くに建設しないでください。ぐちゃぐちゃになりますよ。
|
- ハブのすぐ近くに建設しないでください。あとでぐちゃぐちゃになりますよ!
|
||||||
- 積層が上手く行かない場合は、入力を入れ替えてみてください。
|
- 積層が上手く行かない場合は、入力を入れ替えてみてください。
|
||||||
- <b>R</b>を押すと、ベルトプランナーの経由方向を切り替えることができます。
|
- <b>R</b>を押すと、ベルトプランナーの経由方向を切り替えることができます。
|
||||||
- <b>CTRL</b>を押したままドラッグすると、向きを保ったままベルトを設置できます。
|
- <b>CTRL</b>を押したままドラッグすると、向きを保ったままベルトを設置できます。
|
||||||
- アップグレードが同じティアなら、お互いの比率は同じです。
|
- アップグレード段階が同じなら、比率も同じに保たれます。
|
||||||
- 直列処理は、並列処理より効率的です。
|
- 直列処理は、並列処理より効率的です。
|
||||||
- 後半になると、より多くの建物のバリエーションを解除できます。
|
- 後半になると、より多くの建物のバリエーションを解除できます。
|
||||||
- <b>T</b>を押すと、建物のバリエーションを切り替えることができます。
|
- <b>T</b>を押すと、建物のバリエーションを切り替えることができます。
|
||||||
- 対称性が重要です!
|
- 対称性が重要です!
|
||||||
- ティアの違うトンネル同士は、同じラインに重ねることができます。
|
- 別の種類のトンネル同士は、同じラインに重ねることができます。
|
||||||
- コンパクトに工場を作ってみてください - あとで報われるでしょう!
|
- コンパクトに工場を作ってみてください。あとできっと役に立ちます!
|
||||||
- 着色機には鏡写しのバリエーションがあり、<b>T</b>で選択できます。
|
- 着色機には鏡写しのバリエーションがあり、<b>T</b>で選択できます。
|
||||||
- 適切な比率で建設することで、効率が最大化できます。
|
- 適切な比率で建設することで、効率を最大化できます。
|
||||||
- 最大レベルでは、1つのベルトは5つの抽出機で満たすことができます。
|
- 最大レベルでは、1つのベルトは5つの抽出機で満たすことができます。
|
||||||
- トンネルを忘れないでください。
|
- トンネルを忘れないでください!
|
||||||
- 最大限の効率を得るためには、アイテムを均等に分割する必要はありません。
|
- アイテムを均等に分割することは、最大効率を得るために必須ではありません。
|
||||||
- <b>SHIFT</b>を押したままベルトを設置するとベルトプランナーが有効になり、
|
- <b>SHIFT</b>を押したままにするとベルトプランナーが有効になり、長距離のベルトを簡単に配置できます。
|
||||||
- 切断機は向きを考慮せず、常に垂直に切断します。
|
- 切断機は配置された向きを考慮せず、常に垂直に切断します。
|
||||||
- 白を作るためには、3色全てを混ぜます。
|
- ストレージは左側の出力を優先します。
|
||||||
- ストレージは優先出力を優先して出力します。
|
- 増築可能なデザインを作るために時間を使ってください。それだけの価値があります!
|
||||||
- 増築可能なデザインを作るために時間を使ってください - それには価値があります!
|
- <b>SHIFT</b>を使用すると複数の建物を一度に配置できます。
|
||||||
- <b>SHIFT</b>を使用すると複数の建物を配置できます。
|
- <b>ALT</b>を押しながらベルトを設置すると、向きを逆転できます。
|
||||||
- <b>ALT</b>を押しながらベルトを設置すると、逆向きに設置できます。
|
|
||||||
- 効率が重要です!
|
- 効率が重要です!
|
||||||
- ハブから遠くに離れるほど、形状資源はより複雑な形になります。
|
- ハブから遠くに離れるほど、形状資源はより複雑な形になります。
|
||||||
- 機械の速度には上限があるので、最大効率を得るためには入力を分割します。
|
- 機械の速度には上限があるので、最大効率を得るためには入力を分割してください。
|
||||||
- 効率を最大化するために分配機/合流機を使用できます。
|
- 効率を最大化するために分配機/合流機を使用できます。
|
||||||
- 構成が重要です。ベルトを交差させすぎないようにしてください。
|
- 構成が重要です。ベルトを交差させすぎないようにしてください。
|
||||||
- 事前設計が重要です。さもないとぐちゃぐちゃになりますよ!
|
- 事前設計が重要です。さもないとぐちゃぐちゃになりますよ!
|
||||||
- 旧い工場を撤去しないでください!アップグレードを行うために、それらが必要になります。
|
- 古い工場を撤去しないでください! 各種アップグレードに必要になります。
|
||||||
- 助けなしでレベル20をクリアしてみてください!
|
- 自力でレベル20やレベル26をクリアしてみてください!
|
||||||
- 複雑にしないでください。単純に保つことができれば、成功することができるでしょう。
|
- 複雑にしないでください。単純に保つことが成功の秘訣です。
|
||||||
- ゲームの後半で工場を再利用する必要があるかもしれません。
|
- あとで工場を再利用する必要が出てくるかもしれません。
|
||||||
- 積層機を使用することなく、必要な形状資源を発見することができるかもしれません。
|
- 積層機を使用することなく、必要な形状資源を発見できるかもしれません。
|
||||||
- 完全な風車の形は資源としては生成されません。
|
- 完全な風車の形状は資源としては生成されません。
|
||||||
- 最大の効率を得るためには、切断する前に着色をしてください。
|
- 最大の効率を得るためには、切断する前に着色をしてください。
|
||||||
- モジュールとは、知覚こそが空間を生むものである。これは、人間である限り。
|
- モジュールがあれば、空間はただの認識に過ぎなくなる――生ある人間に対する気遣いだ。
|
||||||
- 工場の設計図を蓄えておいてください。それらを再利用することで、新たな工場が作成できます。
|
- 設計図としての工場を別に作っておくと、工場のモジュール化において重要な役割を果たします。
|
||||||
- 混合機をよく見ると、色の混ぜ方が解ります。
|
- 混色機をよく見ると、色の混ぜ方が解ります。
|
||||||
- <b>CTRL</b> + クリックで範囲選択ができます。
|
- <b>CTRL</b> + クリックで範囲選択ができます。
|
||||||
- ハブに近すぎる設計物を作ると、のちの設計の邪魔になる可能性があります。
|
- ハブに近すぎる設計物を作ると、のちの設計の邪魔になるかもしれません。
|
||||||
- アップグレードリストの各形状の横にあるピンのアイコンは、それを画面左に固定します。
|
- アップグレードリストの各形状の横にあるピンのアイコンは、その形状を画面左に固定表示します。
|
||||||
- 原色全てを混ぜ合わせると白になります!
|
- 三原色全てを混ぜ合わせると白になります!
|
||||||
- マップは無限の広さがあります。臆せずに拡張してください。
|
- マップは無限の広さがあります。臆せずに拡張してください。
|
||||||
- Factorioもプレイしてみてください!私のお気に入りのゲームです。
|
- Factorioもプレイしてみてください! 私のお気に入りのゲームです。
|
||||||
- 切断機(四分割)は右上から時計回りに切断します!
|
- 切断機(四分割)は右上から時計回りに切断します。
|
||||||
- メインメニューからセーブデータを保存できます!
|
- メインメニューからセーブデータを保存できます!
|
||||||
- このゲームには便利なキーバインドがたくさんあります!設定ページを見てみてください。
|
- このゲームには便利なキーバインドがたくさんあります! 設定ページを見てみてください。
|
||||||
- このゲームにはたくさんの設定があります!是非チェックしてみてください!
|
- このゲームにはたくさんの設定があります。是非チェックしてみてください!
|
||||||
- ハブを示すマーカーには、その方向を示す小さなコンパスがあります。
|
- ハブのマーカーには、その方向を示す小さなコンパスがついています。
|
||||||
- ベルトをクリアするには、範囲選択して同じ場所に貼り付けをします。
|
- ベルトの中身をクリアするには、範囲選択して同じ場所に貼り付けをします。
|
||||||
- F4を押すことで、FPSとTickレートを表示することができます。
|
- F4を押すことで、FPSとTickレートを表示できます。
|
||||||
- F4を2回押すと、マウスとカメラの座標を表示することができます。
|
- F4を2回押すと、マウスとカメラの座標を表示できます。
|
||||||
- 左のピン留めされた図形をクリックして、固定を解除できます。
|
- 左のピン留めされた図形をクリックすると、固定を解除できます。
|
||||||
|
@ -8,38 +8,14 @@ steamPage:
|
|||||||
심지어 그것만으로는 충분하지 않을 겁니다. 수요는 기하급수적으로 늘어나게 될 것이고, 더욱 복잡한 도형을 더욱 많이 생산하여야 하므로, 유일하게 도움이 되는 것은 끊임없이 확장을 하는 것입니다! 처음에는 단순한 도형만을 만들지만, 나중에는 색소를 추출하고 혼합하여 도형에 색칠을 해야 합니다!
|
심지어 그것만으로는 충분하지 않을 겁니다. 수요는 기하급수적으로 늘어나게 될 것이고, 더욱 복잡한 도형을 더욱 많이 생산하여야 하므로, 유일하게 도움이 되는 것은 끊임없이 확장을 하는 것입니다! 처음에는 단순한 도형만을 만들지만, 나중에는 색소를 추출하고 혼합하여 도형에 색칠을 해야 합니다!
|
||||||
|
|
||||||
Steam에서 게임을 구매하여 정식 버전의 콘텐츠를 사용하실 수 있지만, 먼저 Shapez.io의 체험판 버전을 플레이해보시고 구매를 고려하셔도 됩니다!
|
Steam에서 게임을 구매하여 정식 버전의 콘텐츠를 사용하실 수 있지만, 먼저 Shapez.io의 체험판 버전을 플레이해보시고 구매를 고려하셔도 됩니다!
|
||||||
title_advantages: 정식 버전의 장점
|
what_others_say: What people say about shapez.io
|
||||||
advantages:
|
nothernlion_comment: This game is great - I'm having a wonderful time playing,
|
||||||
- <b>새로운 12 레벨</b>의 추가로 총 26레벨까지
|
and time has flown by.
|
||||||
- 완벽한 자동화를 위한 <b>새로운 18개의 건물</b>!
|
notch_comment: Oh crap. I really should sleep, but I think I just figured out
|
||||||
- <b>20 티어 업그레이드</b>로 오랫동안 즐겨보세요!
|
how to make a computer in shapez.io
|
||||||
- <b>전선 업데이트</b>로 완전히 새로운 차원을 접해보세요!
|
steam_review_comment: This game has stolen my life and I don't want it back.
|
||||||
- <b>다크 모드</b>!
|
Very chill factory game that won't let me stop making my lines more
|
||||||
- 무한한 세이브 파일
|
efficient.
|
||||||
- 무한한 마커
|
|
||||||
- 저를 지원해주세요! ❤️
|
|
||||||
title_future: 계획된 콘텐츠
|
|
||||||
planned:
|
|
||||||
- 청사진 라이브러리
|
|
||||||
- Steam 도전과제
|
|
||||||
- 퍼즐 모드
|
|
||||||
- 미니맵
|
|
||||||
- 모드
|
|
||||||
- 샌드박스 모드
|
|
||||||
- ... 그리고 더 다양한 것까지!
|
|
||||||
title_open_source: 이 게임은 오픈 소스입니다!
|
|
||||||
title_links: 링크
|
|
||||||
links:
|
|
||||||
discord: 공식 Discord
|
|
||||||
roadmap: 로드맵
|
|
||||||
subreddit: Subreddit
|
|
||||||
source_code: 소스 코드 (GitHub)
|
|
||||||
translate: 번역에 도움주세요
|
|
||||||
text_open_source: >-
|
|
||||||
누구나 번역에 기여하실 수 있으며, 저는 커뮤니티에서 적극적으로 참여하여 모든 제안을 검토하고 가능한 모든 피드백도 고려하고자
|
|
||||||
합니다.
|
|
||||||
|
|
||||||
모든 로드맵을 보시려면 저의 trello 보드를 참고해주세요.
|
|
||||||
global:
|
global:
|
||||||
loading: 불러오는 중
|
loading: 불러오는 중
|
||||||
error: 오류
|
error: 오류
|
||||||
@ -186,8 +162,7 @@ dialogs:
|
|||||||
desc: 현재 레벨에서 사용할 수 있는 튜토리얼 비디오가 있습니다! 보시겠습니까?
|
desc: 현재 레벨에서 사용할 수 있는 튜토리얼 비디오가 있습니다! 보시겠습니까?
|
||||||
tutorialVideoAvailableForeignLanguage:
|
tutorialVideoAvailableForeignLanguage:
|
||||||
title: 활성화된 튜토리얼
|
title: 활성화된 튜토리얼
|
||||||
desc: 현재 레벨에서 사용할 수 있는 튜토리얼 비디오가 있습니다! 허나 영어로만
|
desc: 현재 레벨에서 사용할 수 있는 튜토리얼 비디오가 있습니다! 허나 영어로만 제공될 것입니다. 보시겠습니까?
|
||||||
제공될 것입니다. 보시겠습니까?
|
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: 이동
|
moveMap: 이동
|
||||||
@ -278,28 +253,25 @@ ingame:
|
|||||||
1_3_expand: "이 게임은 방치형 게임이 <strong>아닙니다</strong>! 더 많은 추출기와 벨트를 만들어 지정된 목표를 빨리
|
1_3_expand: "이 게임은 방치형 게임이 <strong>아닙니다</strong>! 더 많은 추출기와 벨트를 만들어 지정된 목표를 빨리
|
||||||
달성하세요.<br><br> 팁: <strong>SHIFT</strong> 키를 누른 상태에서는 빠르게 배치할 수
|
달성하세요.<br><br> 팁: <strong>SHIFT</strong> 키를 누른 상태에서는 빠르게 배치할 수
|
||||||
있고, <strong>R</strong> 키를 눌러 회전할 수 있습니다."
|
있고, <strong>R</strong> 키를 눌러 회전할 수 있습니다."
|
||||||
2_1_place_cutter: "이제 <strong>절단기</strong>를 배치하여 원형 도형을 둘로 자르세요!<br><br>
|
2_1_place_cutter: "Now place a <strong>Cutter</strong> to cut the circles in two
|
||||||
추신: 절단기는 방향에 관계 없이 항상 수직으로 자릅니다."
|
halves!<br><br> PS: The cutter always cuts from <strong>top to
|
||||||
|
bottom</strong> regardless of its orientation."
|
||||||
2_2_place_trash: 절단기가 <strong>막히거나 멈출 수 있습니다</strong>!<br><br>
|
2_2_place_trash: 절단기가 <strong>막히거나 멈출 수 있습니다</strong>!<br><br>
|
||||||
<strong>휴지통</strong>을 사용하여 현재 필요없는 쓰레기 도형 (!)을
|
<strong>휴지통</strong>을 사용하여 현재 필요없는 쓰레기 도형 (!)을 제거하세요.
|
||||||
제거하세요.
|
2_3_more_cutters: "잘하셨습니다! 느린 처리 속도를 보완하기 위해 <strong>절단기를 두 개</strong> 이상
|
||||||
2_3_more_cutters: "잘하셨습니다! 느린 처리 속도를 보완하기 위해 <strong>절단기를 두 개</strong>
|
배치해보세요!<br><br> 추신: <strong>상단 숫자 단축키 (0~9)</strong>를 사용하여 건물을
|
||||||
이상 배치해보세요!<br><br> 추신: <strong>상단 숫자 단축키 (0~9)</strong>를 사용하여
|
빠르게 선택할 수 있습니다!"
|
||||||
건물을 빠르게 선택할 수 있습니다!"
|
3_1_rectangles: "이제 사각형 도형을 추출해 볼까요! <strong>추출기 네 개를 배치</strong>하고 허브와
|
||||||
3_1_rectangles: "이제 사각형 도형을 추출해 볼까요! <strong>추출기 네 개를
|
연결하세요.<br><br> 추신: 긴 벨트 한 줄을 간단히 만들려면 <strong>SHIFT 키</strong>를
|
||||||
배치</strong>하고 허브와 연결하세요.<br><br> 추신: 긴 벨트 한 줄을
|
누른 채 드래그하세요!"
|
||||||
간단히 만들려면 <strong>SHIFT 키</strong>를 누른 채 드래그하세요!"
|
|
||||||
21_1_place_quad_painter: <strong>4단 색칠기</strong>를 배치하여 <strong>흰색</strong>과
|
21_1_place_quad_painter: <strong>4단 색칠기</strong>를 배치하여 <strong>흰색</strong>과
|
||||||
<strong>빨간색</strong>이 칠해진 <strong>원형
|
<strong>빨간색</strong>이 칠해진 <strong>원형 도형</strong>을 만들어보세요!
|
||||||
도형</strong>을 만들어보세요!
|
21_2_switch_to_wires: <strong>E 키</strong>를 눌러 전선 레이어 로 전환하세요!<br><br> 그 후 색칠기의
|
||||||
21_2_switch_to_wires: <strong>E 키</strong>를 눌러 전선 레이어
|
<strong>네 입력 부분</strong>을 모두 케이블로 연결하세요!
|
||||||
로 전환하세요!<br><br> 그 후 색칠기의 <strong>네 입력 부분</strong>을
|
21_3_place_button: 훌륭해요! 이제 <strong>스위치</strong>를 배치하고 전선으로 연결하세요!
|
||||||
모두 케이블로 연결하세요!
|
21_4_press_button: "Press the switch to make it <strong>emit a truthy
|
||||||
21_3_place_button: 훌륭해요! 이제 <strong>스위치</strong>를 배치하고 전선으로
|
signal</strong> and thus activate the painter.<br><br> PS: You
|
||||||
연결하세요!
|
don't have to connect all inputs! Try wiring only two."
|
||||||
21_4_press_button: "스위치를 눌러 </strong>참 신호를 내보내<strong>
|
|
||||||
색칠기를 활성화하세요. 추신: 모든 입력을 연결할 필요는 없습니다!
|
|
||||||
지금은 두 개만 연결하세요."
|
|
||||||
colors:
|
colors:
|
||||||
red: 빨간색
|
red: 빨간색
|
||||||
green: 초록색
|
green: 초록색
|
||||||
@ -332,9 +304,6 @@ ingame:
|
|||||||
buildings:
|
buildings:
|
||||||
title: 새로운 18개의 건축물
|
title: 새로운 18개의 건축물
|
||||||
desc: 완벽한 자동화된 공장을 위한 건물들입니다!
|
desc: 완벽한 자동화된 공장을 위한 건물들입니다!
|
||||||
savegames:
|
|
||||||
title: 무한한 세이브 파일
|
|
||||||
desc: 당신이 내키는대로 마음껏 할 수 있습니다!
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: 20 티어까지 확장된 업그레이드
|
title: 20 티어까지 확장된 업그레이드
|
||||||
desc: 체험판에서는 5 티어까지만 사용할 수 있습니다!
|
desc: 체험판에서는 5 티어까지만 사용할 수 있습니다!
|
||||||
@ -350,6 +319,9 @@ ingame:
|
|||||||
support:
|
support:
|
||||||
title: 저를 지원해주세요
|
title: 저를 지원해주세요
|
||||||
desc: 저는 여가 시간에 게임을 개발합니다!
|
desc: 저는 여가 시간에 게임을 개발합니다!
|
||||||
|
achievements:
|
||||||
|
title: Achievements
|
||||||
|
desc: Hunt them all!
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
belt:
|
belt:
|
||||||
name: 벨트, 밸런서, 터널
|
name: 벨트, 밸런서, 터널
|
||||||
@ -632,9 +604,10 @@ storyRewards:
|
|||||||
있습니다.<br><br> 추신: 벨트 판독기와 저장고가 마지막으로 읽은 아이템을 출력했나요? 디스플레이로 한번 봐보세요!"
|
있습니다.<br><br> 추신: 벨트 판독기와 저장고가 마지막으로 읽은 아이템을 출력했나요? 디스플레이로 한번 봐보세요!"
|
||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: 일정 신호기
|
title: 일정 신호기
|
||||||
desc: 전선 레이어에서 구축할 수 있는 <strong>일정 신호기</strong>가 잠금 해제되었습니다! 간단한 예시로, <strong>아이템
|
desc: 전선 레이어에서 구축할 수 있는 <strong>일정 신호기</strong>가 잠금 해제되었습니다! 간단한 예시로,
|
||||||
선별</strong>에 연결하여 사용하는 데 유용합니다.<br><br> 일정 신호기는 <strong>도형</strong>,
|
<strong>아이템 선별</strong>에 연결하여 사용하는 데 유용합니다.<br><br> 일정 신호기는
|
||||||
<strong>색상</strong>, 또는 <strong>불 값</strong> (1 또는 0)을 출력할 수 있습니다.
|
<strong>도형</strong>, <strong>색상</strong>, 또는 <strong>불 값</strong> (1
|
||||||
|
또는 0)을 출력할 수 있습니다.
|
||||||
reward_logic_gates:
|
reward_logic_gates:
|
||||||
title: 논리 회로
|
title: 논리 회로
|
||||||
desc: <strong>논리 회로</strong>가 잠금 해제되었습니다! 굳이 흥분할 필요는 없지만, 진짜 멋진 기술입니다!<br><br>
|
desc: <strong>논리 회로</strong>가 잠금 해제되었습니다! 굳이 흥분할 필요는 없지만, 진짜 멋진 기술입니다!<br><br>
|
||||||
@ -649,12 +622,13 @@ storyRewards:
|
|||||||
- 평소처럼 게임을 진행합니다.<br><br> 어떤 방식으로든, 재미있게 게임을 플레이해주시길 바랍니다!
|
- 평소처럼 게임을 진행합니다.<br><br> 어떤 방식으로든, 재미있게 게임을 플레이해주시길 바랍니다!
|
||||||
reward_wires_painter_and_levers:
|
reward_wires_painter_and_levers:
|
||||||
title: 전선과 4단 색칠기
|
title: 전선과 4단 색칠기
|
||||||
desc: "<strong>전선 레이어</strong>가 잠금 해제되었습니다! 전선 레이어는
|
desc: "You just unlocked the <strong>Wires Layer</strong>: It is a separate
|
||||||
일반 레이어 위에 존재하는 별도의 레이어로, 이를 통한 다양하고 새로운
|
layer on top of the regular layer and introduces a lot of new
|
||||||
메커니즘을 소개하겠습니다!<br><br> 우선 <strong>4단 색칠기</strong>가
|
mechanics!<br><br> For the beginning I unlocked you the <strong>Quad
|
||||||
잠금 해제되었습니다. 전선 레이어에서 색칠하고 싶은 슬롯에 전선을 연결하세요!
|
Painter</strong> - Connect the slots you would like to paint with on
|
||||||
전선 레이어로 전환하려면 <strong>E</strong> 키를 누르세요. <br><br>
|
the wires layer!<br><br> To switch to the wires layer, press
|
||||||
추신: 설정에서 <strong>힌트를 활성화</strong>하여 전선 튜토리얼을 활성화하세요!"
|
<strong>E</strong>. <br><br> PS: <strong>Enable hints</strong> in
|
||||||
|
the settings to activate the wires tutorial!"
|
||||||
reward_filter:
|
reward_filter:
|
||||||
title: 아이템 선별기
|
title: 아이템 선별기
|
||||||
desc: <strong>아이템 선별기</strong>가 잠금 해제되었습니다! 전선 레이어의 신호와 일치하는지에 대한 여부로 아이템을 위쪽
|
desc: <strong>아이템 선별기</strong>가 잠금 해제되었습니다! 전선 레이어의 신호와 일치하는지에 대한 여부로 아이템을 위쪽
|
||||||
@ -875,6 +849,10 @@ keybindings:
|
|||||||
comparator: 비교기
|
comparator: 비교기
|
||||||
item_producer: 아이템 생성기 (샌드박스)
|
item_producer: 아이템 생성기 (샌드박스)
|
||||||
copyWireValue: "전선: 커서 아래 값 복사"
|
copyWireValue: "전선: 커서 아래 값 복사"
|
||||||
|
rotateToUp: "Rotate: Point Up"
|
||||||
|
rotateToDown: "Rotate: Point Down"
|
||||||
|
rotateToRight: "Rotate: Point Right"
|
||||||
|
rotateToLeft: "Rotate: Point Left"
|
||||||
about:
|
about:
|
||||||
title: 게임 정보
|
title: 게임 정보
|
||||||
body: >-
|
body: >-
|
||||||
|