mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-13 13:04:03 +00:00
Merge branch 'master' into patch-2
This commit is contained in:
commit
c713b64817
@ -1,9 +0,0 @@
|
||||
[[actions]]
|
||||
name = "play"
|
||||
path = "shapezio.exe"
|
||||
platform = "windows"
|
||||
|
||||
[[actions]]
|
||||
name = "play"
|
||||
path = "play.sh"
|
||||
platform = "linux"
|
66
gulp/build_variants.js
Normal file
66
gulp/build_variants.js
Normal file
@ -0,0 +1,66 @@
|
||||
/**
|
||||
* @type {Record<string, {
|
||||
* standalone: boolean,
|
||||
* environment?: 'dev' | 'staging' | 'prod',
|
||||
* electronBaseDir?: string,
|
||||
* steamAppId?: number,
|
||||
* executableName?: string,
|
||||
* buildArgs: {
|
||||
* chineseVersion?: boolean,
|
||||
* wegameVersion?: boolean,
|
||||
* steamDemo?: boolean
|
||||
* }}>}
|
||||
*/
|
||||
const BUILD_VARIANTS = {
|
||||
"web-localhost": {
|
||||
standalone: false,
|
||||
environment: "dev",
|
||||
buildArgs: {},
|
||||
},
|
||||
"web-shapezio-beta": {
|
||||
standalone: false,
|
||||
environment: "staging",
|
||||
buildArgs: {},
|
||||
},
|
||||
"web-shapezio": {
|
||||
standalone: false,
|
||||
environment: "prod",
|
||||
buildArgs: {},
|
||||
},
|
||||
"standalone-steam": {
|
||||
standalone: true,
|
||||
executableName: "shapez",
|
||||
steamAppId: 1318690,
|
||||
buildArgs: {},
|
||||
},
|
||||
"standalone-steam-china": {
|
||||
standalone: true,
|
||||
steamAppId: 1318690,
|
||||
buildArgs: {
|
||||
chineseVersion: true,
|
||||
},
|
||||
},
|
||||
"standalone-steam-demo": {
|
||||
standalone: true,
|
||||
steamAppId: 1930750,
|
||||
buildArgs: {
|
||||
steamDemo: true,
|
||||
},
|
||||
},
|
||||
"standalone-steam-china-demo": {
|
||||
standalone: true,
|
||||
steamAppId: 1930750,
|
||||
buildArgs: {
|
||||
steamDemo: true,
|
||||
chineseVersion: true,
|
||||
},
|
||||
},
|
||||
"standalone-wegame": {
|
||||
standalone: true,
|
||||
electronBaseDir: "electron_wegame",
|
||||
buildArgs: {
|
||||
wegameVersion: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
module.exports = { BUILD_VARIANTS };
|
139
gulp/cordova.js
vendored
139
gulp/cordova.js
vendored
@ -1,139 +0,0 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const buildUtils = require("./buildutils");
|
||||
|
||||
function gulptasksCordova($, gulp, buildFolder) {
|
||||
const cdvRes = path.join("..", "..", "res");
|
||||
|
||||
// Cleans up the app assets
|
||||
// Removes all temporary folders used while optimizing the assets
|
||||
gulp.task("cleanupAppAssetsBuiltFolder", () => {
|
||||
return gulp
|
||||
.src(path.join(cdvRes, "built"), { read: false, allowEmpty: true })
|
||||
.pipe($.clean({ force: true }));
|
||||
});
|
||||
|
||||
// Optimizes all built assets
|
||||
gulp.task("optimizeBuiltAppAssets", () => {
|
||||
return gulp
|
||||
.src(path.join(cdvRes, "built", "**", "*.png"))
|
||||
.pipe($.flatten())
|
||||
.pipe($.imagemin([$.imagemin.optipng({ optimizationLevel: 1 })]))
|
||||
.pipe(gulp.dest(path.join(cdvRes, "built")));
|
||||
});
|
||||
|
||||
// Scales the icon resources
|
||||
gulp.task("scaleIconIos", async () => {
|
||||
const sizes = [
|
||||
180,
|
||||
60,
|
||||
120,
|
||||
76,
|
||||
152,
|
||||
40,
|
||||
80,
|
||||
57,
|
||||
114,
|
||||
72,
|
||||
144,
|
||||
167,
|
||||
29,
|
||||
58,
|
||||
87,
|
||||
50,
|
||||
100,
|
||||
167,
|
||||
20,
|
||||
1024,
|
||||
24,
|
||||
48,
|
||||
55,
|
||||
172,
|
||||
196,
|
||||
];
|
||||
for (let i = 0; i < sizes.length; ++i) {
|
||||
const size = sizes[i];
|
||||
console.log("Scaling icon to", size, "x", size);
|
||||
const img = await $.jimp.read(path.join(cdvRes, "ios", "icon-prefab.png"));
|
||||
await img.resize(size, size).write(path.join(cdvRes, "built", "ios", "icon@" + size + ".png"));
|
||||
}
|
||||
});
|
||||
|
||||
gulp.task("copyOtherIosResources", () => {
|
||||
return gulp
|
||||
.src(path.join(cdvRes, "ios", "splash-prefab.png"))
|
||||
.pipe($.rename("Default@2x~universal~anyany.png"))
|
||||
.pipe(gulp.dest(path.join(cdvRes, "built", "ios")));
|
||||
});
|
||||
|
||||
gulp.task("prepareIosRes", gulp.series("scaleIconIos", "copyOtherIosResources"));
|
||||
|
||||
gulp.task("copyAndroidResources", () => {
|
||||
return gulp
|
||||
.src(path.join(cdvRes, "android", "**", "*.*"))
|
||||
.pipe(gulp.dest(path.join(cdvRes, "built", "android")));
|
||||
});
|
||||
|
||||
gulp.task("prepareAndroidRes", gulp.series("copyAndroidResources"));
|
||||
|
||||
gulp.task(
|
||||
"prepareCordovaAssets",
|
||||
gulp.series(
|
||||
"cleanupAppAssetsBuiltFolder",
|
||||
gulp.parallel("prepareIosRes", "prepareAndroidRes"),
|
||||
"optimizeBuiltAppAssets"
|
||||
)
|
||||
);
|
||||
|
||||
// Patches the config.xml by replacing the app id to app_beta
|
||||
|
||||
gulp.task("patchConfigXML", cb => {
|
||||
const configUrl = path.join("..", "..", "config.xml");
|
||||
let configContent = fs.readFileSync(configUrl).toString();
|
||||
const version = buildUtils.getVersion();
|
||||
configContent = configContent.replace("%VERSION%", version);
|
||||
configContent = configContent.replace(' id="io.shapez.app" ', ' id="io.shapez.app_beta" ');
|
||||
configContent = configContent.replace("<name>Shapez.io</name>", "<name>Shapez.io BETA</name>");
|
||||
fs.writeFileSync(configUrl, configContent);
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task("patchConfigXMLChangeStagingToProd", cb => {
|
||||
const configUrl = path.join("..", "..", "config.xml");
|
||||
let configContent = fs.readFileSync(configUrl).toString();
|
||||
configContent = configContent.replace(' id="io.shapez.app_beta" ', ' id="io.shapez.app" ');
|
||||
configContent = configContent.replace("<name>Shapez.io BETA</name>", "<name>Shapez.io</name>");
|
||||
fs.writeFileSync(configUrl, configContent);
|
||||
cb();
|
||||
});
|
||||
|
||||
// Triggers a new build on phonegap
|
||||
gulp.task("triggerPhonegapBuild", () => {
|
||||
return gulp
|
||||
.src("src/html/", { dot: false })
|
||||
.pipe(
|
||||
$.phonegapBuild({
|
||||
isRepository: true,
|
||||
appId: "3339820",
|
||||
platforms: ["android", "ios"],
|
||||
user: {
|
||||
token: process.env.SHAPEZ_CLI_PHONEGAP_KEY,
|
||||
},
|
||||
})
|
||||
)
|
||||
.pipe(
|
||||
$.phonegapBuild({
|
||||
isRepository: true,
|
||||
appId: "3537816",
|
||||
platforms: ["android", "ios"],
|
||||
user: {
|
||||
token: process.env.SHAPEZ_CLI_PHONEGAP_KEY,
|
||||
},
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
gulptasksCordova,
|
||||
};
|
228
gulp/gulpfile.js
228
gulp/gulpfile.js
@ -18,7 +18,6 @@ const $ = require("gulp-load-plugins")({
|
||||
|
||||
const envVars = [
|
||||
"SHAPEZ_CLI_SERVER_HOST",
|
||||
// "SHAPEZ_CLI_PHONEGAP_KEY",
|
||||
"SHAPEZ_CLI_ALPHA_FTP_USER",
|
||||
"SHAPEZ_CLI_ALPHA_FTP_PW",
|
||||
"SHAPEZ_CLI_STAGING_FTP_USER",
|
||||
@ -33,8 +32,7 @@ const envVars = [
|
||||
|
||||
for (let i = 0; i < envVars.length; ++i) {
|
||||
if (!process.env[envVars[i]]) {
|
||||
console.warn("Please set", envVars[i]);
|
||||
// process.exit(1);
|
||||
console.warn("Unset environment variable, might cause issues:", envVars[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -57,7 +55,7 @@ const js = require("./js");
|
||||
js.gulptasksJS($, gulp, buildFolder, browserSync);
|
||||
|
||||
const html = require("./html");
|
||||
html.gulptasksHTML($, gulp, buildFolder, browserSync);
|
||||
html.gulptasksHTML($, gulp, buildFolder);
|
||||
|
||||
const ftp = require("./ftp");
|
||||
ftp.gulptasksFTP($, gulp, buildFolder);
|
||||
@ -66,13 +64,11 @@ const docs = require("./docs");
|
||||
docs.gulptasksDocs($, gulp, buildFolder);
|
||||
|
||||
const standalone = require("./standalone");
|
||||
standalone.gulptasksStandalone($, gulp, buildFolder);
|
||||
|
||||
const releaseUploader = require("./release-uploader");
|
||||
releaseUploader.gulptasksReleaseUploader($, gulp, buildFolder);
|
||||
standalone.gulptasksStandalone($, gulp);
|
||||
|
||||
const translations = require("./translations");
|
||||
translations.gulptasksTranslations($, gulp, buildFolder);
|
||||
const { BUILD_VARIANTS } = require("./build_variants");
|
||||
translations.gulptasksTranslations($, gulp);
|
||||
|
||||
///////////////////// BUILD TASKS /////////////////////
|
||||
|
||||
@ -142,9 +138,9 @@ gulp.task("main.webserver", () => {
|
||||
/**
|
||||
*
|
||||
* @param {object} param0
|
||||
* @param {"web"|"standalone"|"china"|"wegame"} param0.version
|
||||
* @param {keyof typeof BUILD_VARIANTS} param0.version
|
||||
*/
|
||||
function serve({ version = "web" }) {
|
||||
function serveHTML({ version = "web-dev" }) {
|
||||
browserSync.init({
|
||||
server: [buildFolder, path.join(baseDir, "mod_examples")],
|
||||
port: 3005,
|
||||
@ -168,10 +164,7 @@ function serve({ version = "web" }) {
|
||||
gulp.watch(["../src/**/*.scss"], gulp.series("css.dev"));
|
||||
|
||||
// Watch .html files, those trigger a html rebuild
|
||||
gulp.watch("../src/**/*.html", gulp.series(version === "web" ? "html.dev" : "html.standalone-dev"));
|
||||
|
||||
// Watch sound files
|
||||
// gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], gulp.series("sounds.dev"));
|
||||
gulp.watch("../src/**/*.html", gulp.series("html." + version + ".dev"));
|
||||
|
||||
// Watch translations
|
||||
gulp.watch("../translations/**/*.yaml", gulp.series("translations.convertToJson"));
|
||||
@ -204,27 +197,7 @@ function serve({ version = "web" }) {
|
||||
return gulp.src(path).pipe(browserSync.reload({ stream: true }));
|
||||
});
|
||||
|
||||
switch (version) {
|
||||
case "web": {
|
||||
gulp.series("js.dev.watch")(() => true);
|
||||
break;
|
||||
}
|
||||
case "standalone": {
|
||||
gulp.series("js.standalone-dev.watch")(() => true);
|
||||
break;
|
||||
}
|
||||
case "china": {
|
||||
gulp.series("china.js.dev.watch")(() => true);
|
||||
break;
|
||||
}
|
||||
case "wegame": {
|
||||
gulp.series("wegame.js.dev.watch")(() => true);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new Error("Unknown version " + version);
|
||||
}
|
||||
}
|
||||
gulp.series("js." + version + ".dev.watch")(() => true);
|
||||
}
|
||||
|
||||
///////////////////// RUNNABLE TASKS /////////////////////
|
||||
@ -238,9 +211,9 @@ gulp.task("step.deleteEmpty", cb => {
|
||||
|
||||
gulp.task("step.postbuild", gulp.series("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty"));
|
||||
|
||||
// Builds everything (dev)
|
||||
// // Builds everything (dev)
|
||||
gulp.task(
|
||||
"build.dev",
|
||||
"build.prepare.dev",
|
||||
gulp.series(
|
||||
"utils.cleanup",
|
||||
"utils.copyAdditionalBuildFiles",
|
||||
@ -252,146 +225,95 @@ gulp.task(
|
||||
"imgres.copyImageResources",
|
||||
"imgres.copyNonImageResources",
|
||||
"translations.fullBuild",
|
||||
"css.dev",
|
||||
"html.dev"
|
||||
"css.dev"
|
||||
)
|
||||
);
|
||||
|
||||
// Builds everything (standalone -dev)
|
||||
gulp.task(
|
||||
"build.standalone.dev",
|
||||
gulp.series(
|
||||
"utils.cleanup",
|
||||
"localConfig.findOrCreate",
|
||||
"imgres.buildAtlas",
|
||||
"imgres.atlasToJson",
|
||||
"imgres.atlas",
|
||||
"sounds.dev",
|
||||
"imgres.copyImageResources",
|
||||
"imgres.copyNonImageResources",
|
||||
"translations.fullBuild",
|
||||
"css.dev",
|
||||
"html.standalone-dev"
|
||||
)
|
||||
);
|
||||
// // Builds everything (staging)
|
||||
// gulp.task("step.staging.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.staging"));
|
||||
// gulp.task(
|
||||
// "step.staging.mainbuild",
|
||||
// gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code")
|
||||
// );
|
||||
// gulp.task("step.staging.all", gulp.series("step.staging.mainbuild", "css.prod", "html.staging"));
|
||||
// gulp.task("build.staging", gulp.series("utils.cleanup", "step.staging.all", "step.postbuild"));
|
||||
|
||||
// Builds everything (staging)
|
||||
gulp.task("step.staging.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.staging"));
|
||||
gulp.task(
|
||||
"step.staging.mainbuild",
|
||||
gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code")
|
||||
);
|
||||
gulp.task("step.staging.all", gulp.series("step.staging.mainbuild", "css.prod", "html.staging"));
|
||||
gulp.task("build.staging", gulp.series("utils.cleanup", "step.staging.all", "step.postbuild"));
|
||||
// // Builds everything (prod)
|
||||
// gulp.task("step.prod.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.prod"));
|
||||
// gulp.task(
|
||||
// "step.prod.mainbuild",
|
||||
// gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code")
|
||||
// );
|
||||
// gulp.task("step.prod.all", gulp.series("step.prod.mainbuild", "css.prod", "html.prod"));
|
||||
// gulp.task("build.prod", gulp.series("utils.cleanup", "step.prod.all", "step.postbuild"));
|
||||
|
||||
// Builds everything (prod)
|
||||
gulp.task("step.prod.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.prod"));
|
||||
gulp.task(
|
||||
"step.prod.mainbuild",
|
||||
gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code")
|
||||
);
|
||||
gulp.task("step.prod.all", gulp.series("step.prod.mainbuild", "css.prod", "html.prod"));
|
||||
gulp.task("build.prod", gulp.series("utils.cleanup", "step.prod.all", "step.postbuild"));
|
||||
// Builds everything for every variant
|
||||
for (const variant in BUILD_VARIANTS) {
|
||||
const data = BUILD_VARIANTS[variant];
|
||||
const buildName = "build." + variant;
|
||||
|
||||
// Builds everything (standalone-beta)
|
||||
gulp.task(
|
||||
"step.standalone-beta.code",
|
||||
gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-beta")
|
||||
);
|
||||
gulp.task("step.standalone-beta.mainbuild", gulp.parallel("step.baseResources", "step.standalone-beta.code"));
|
||||
gulp.task(
|
||||
"step.standalone-beta.all",
|
||||
gulp.series("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta")
|
||||
);
|
||||
gulp.task(
|
||||
"build.standalone-beta",
|
||||
gulp.series("utils.cleanup", "step.standalone-beta.all", "step.postbuild")
|
||||
);
|
||||
|
||||
// Builds everything (standalone-prod)
|
||||
|
||||
for (const prefix of ["", "china.", "wegame."]) {
|
||||
gulp.task(
|
||||
prefix + "step.standalone-prod.code",
|
||||
gulp.series("sounds.fullbuildHQ", "translations.fullBuild", prefix + "js.standalone-prod")
|
||||
buildName + ".code",
|
||||
gulp.series(
|
||||
data.standalone ? "sounds.fullbuildHQ" : "sounds.fullbuild",
|
||||
"translations.fullBuild",
|
||||
"js." + variant + ".prod"
|
||||
)
|
||||
);
|
||||
|
||||
gulp.task(
|
||||
prefix + "step.standalone-prod.mainbuild",
|
||||
gulp.parallel("step.baseResources", prefix + "step.standalone-prod.code")
|
||||
);
|
||||
gulp.task(buildName + ".resourcesAndCode", gulp.parallel("step.baseResources", buildName + ".code"));
|
||||
|
||||
gulp.task(
|
||||
prefix + "step.standalone-prod.all",
|
||||
gulp.series(prefix + "step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
|
||||
buildName + ".all",
|
||||
gulp.series(buildName + ".resourcesAndCode", "css.prod-standalone", "html." + variant + ".prod")
|
||||
);
|
||||
|
||||
gulp.task(buildName, gulp.series("utils.cleanup", buildName + ".all", "step.postbuild"));
|
||||
|
||||
// serve
|
||||
gulp.task(
|
||||
prefix + "build.standalone-prod",
|
||||
gulp.series("utils.cleanup", prefix + "step.standalone-prod.all", "step.postbuild")
|
||||
"serve." + variant,
|
||||
gulp.series("build.prepare.dev", "html." + variant + ".dev", () => serveHTML({ version: variant }))
|
||||
);
|
||||
}
|
||||
|
||||
// OS X build and release upload
|
||||
gulp.task(
|
||||
"build.darwin64-prod",
|
||||
gulp.series(
|
||||
"build.standalone-prod",
|
||||
"standalone.prepare",
|
||||
"standalone.package.prod.darwin64.signManually"
|
||||
)
|
||||
);
|
||||
// gulp.task(
|
||||
// "build.darwin64-prod",
|
||||
// gulp.series(
|
||||
// "build.standalone-prod",
|
||||
// "standalone.prepare",
|
||||
// "standalone.package.prod.darwin64.signManually"
|
||||
// )
|
||||
// );
|
||||
|
||||
// Deploying!
|
||||
gulp.task(
|
||||
"main.deploy.alpha",
|
||||
gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.alpha")
|
||||
"deploy.staging",
|
||||
gulp.series("utils.requireCleanWorkingTree", "build.web-shapezio-beta", "ftp.upload.staging")
|
||||
);
|
||||
gulp.task(
|
||||
"main.deploy.staging",
|
||||
gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging")
|
||||
);
|
||||
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"));
|
||||
|
||||
// steam
|
||||
gulp.task("regular.main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
|
||||
|
||||
// china
|
||||
gulp.task(
|
||||
"china.main.standalone",
|
||||
gulp.series("china.build.standalone-prod", "china.standalone.package.prod")
|
||||
"deploy.prod",
|
||||
gulp.series("utils.requireCleanWorkingTree", "build.web-shapezio", "ftp.upload.prod")
|
||||
);
|
||||
|
||||
// wegame
|
||||
gulp.task(
|
||||
"wegame.main.standalone",
|
||||
gulp.series("wegame.build.standalone-prod", "wegame.standalone.package.prod")
|
||||
);
|
||||
// // china
|
||||
// gulp.task(
|
||||
// "china.main.standalone",
|
||||
// gulp.series("china.build.standalone-prod", "china.standalone.package.prod")
|
||||
// );
|
||||
|
||||
// all (except wegame)
|
||||
gulp.task("standalone.steam", gulp.series("regular.main.standalone", "china.main.standalone"));
|
||||
gulp.task(
|
||||
"standalone.all",
|
||||
gulp.series("regular.main.standalone", "china.main.standalone", "wegame.main.standalone")
|
||||
);
|
||||
// // wegame
|
||||
// gulp.task(
|
||||
// "wegame.main.standalone",
|
||||
// gulp.series("wegame.build.standalone-prod", "wegame.standalone.package.prod")
|
||||
// );
|
||||
|
||||
// Live-development
|
||||
gulp.task(
|
||||
"main.serveDev",
|
||||
gulp.series("build.dev", () => serve({ version: "web" }))
|
||||
);
|
||||
gulp.task(
|
||||
"main.serveStandalone",
|
||||
gulp.series("build.standalone.dev", () => serve({ version: "standalone" }))
|
||||
);
|
||||
gulp.task(
|
||||
"china.main.serveDev",
|
||||
gulp.series("build.dev", () => serve({ version: "china" }))
|
||||
);
|
||||
gulp.task(
|
||||
"wegame.main.serveDev",
|
||||
gulp.series("build.dev", () => serve({ version: "wegame" }))
|
||||
);
|
||||
// // all (except wegame)
|
||||
// gulp.task("standalone.steam", gulp.series("regular.main.standalone", "china.main.standalone"));
|
||||
// gulp.task(
|
||||
// "standalone.all",
|
||||
// gulp.series("regular.main.standalone", "china.main.standalone", "wegame.main.standalone")
|
||||
// );
|
||||
|
||||
gulp.task("default", gulp.series("main.serveDev"));
|
||||
gulp.task("default", gulp.series("serve.web-localhost"));
|
||||
|
118
gulp/html.js
118
gulp/html.js
@ -2,6 +2,7 @@ const buildUtils = require("./buildutils");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const crypto = require("crypto");
|
||||
const { BUILD_VARIANTS } = require("./build_variants");
|
||||
|
||||
function computeIntegrityHash(fullPath, algorithm = "sha256") {
|
||||
const file = fs.readFileSync(fullPath);
|
||||
@ -9,12 +10,20 @@ function computeIntegrityHash(fullPath, algorithm = "sha256") {
|
||||
return algorithm + "-" + hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* PROVIDES (per <variant>)
|
||||
*
|
||||
* html.<variant>.dev
|
||||
* html.<variant>.prod
|
||||
*/
|
||||
function gulptasksHTML($, gulp, buildFolder) {
|
||||
const commitHash = buildUtils.getRevision();
|
||||
async function buildHtml(
|
||||
apiUrl,
|
||||
{ analytics = false, standalone = false, app = false, integrity = true, enableCachebust = true }
|
||||
) {
|
||||
async function buildHtml({
|
||||
googleAnalytics = false,
|
||||
standalone = false,
|
||||
integrity = true,
|
||||
enableCachebust = true,
|
||||
}) {
|
||||
function cachebust(url) {
|
||||
if (enableCachebust) {
|
||||
return buildUtils.cachebust(url, commitHash);
|
||||
@ -22,7 +31,7 @@ function gulptasksHTML($, gulp, buildFolder) {
|
||||
return url;
|
||||
}
|
||||
|
||||
const hasLocalFiles = standalone || app;
|
||||
const hasLocalFiles = standalone;
|
||||
|
||||
return gulp
|
||||
.src("../src/html/" + (standalone ? "index.standalone.html" : "index.html"))
|
||||
@ -31,13 +40,6 @@ function gulptasksHTML($, gulp, buildFolder) {
|
||||
/** @this {Document} **/ function () {
|
||||
const document = this;
|
||||
|
||||
// Preconnect to api
|
||||
const prefetchLink = document.createElement("link");
|
||||
prefetchLink.rel = "preconnect";
|
||||
prefetchLink.href = apiUrl;
|
||||
prefetchLink.setAttribute("crossorigin", "anonymous");
|
||||
document.head.appendChild(prefetchLink);
|
||||
|
||||
// Append css
|
||||
const css = document.createElement("link");
|
||||
css.rel = "stylesheet";
|
||||
@ -53,31 +55,8 @@ function gulptasksHTML($, gulp, buildFolder) {
|
||||
}
|
||||
document.head.appendChild(css);
|
||||
|
||||
// Append async css
|
||||
// const asyncCss = document.createElement("link");
|
||||
// asyncCss.rel = "stylesheet";
|
||||
// asyncCss.type = "text/css";
|
||||
// asyncCss.media = "none";
|
||||
// asyncCss.setAttribute("onload", "this.media='all'");
|
||||
// asyncCss.href = cachebust("async-resources.css");
|
||||
// if (integrity) {
|
||||
// asyncCss.setAttribute(
|
||||
// "integrity",
|
||||
// computeIntegrityHash(path.join(buildFolder, "async-resources.css"))
|
||||
// );
|
||||
// }
|
||||
// document.head.appendChild(asyncCss);
|
||||
|
||||
if (app) {
|
||||
// Append cordova link
|
||||
const cdv = document.createElement("script");
|
||||
cdv.src = "cordova.js";
|
||||
cdv.type = "text/javascript";
|
||||
document.head.appendChild(cdv);
|
||||
}
|
||||
|
||||
// Google analytics
|
||||
if (analytics) {
|
||||
if (googleAnalytics) {
|
||||
const tagManagerScript = document.createElement("script");
|
||||
tagManagerScript.src =
|
||||
"https://www.googletagmanager.com/gtag/js?id=UA-165342524-1";
|
||||
@ -92,14 +71,6 @@ function gulptasksHTML($, gulp, buildFolder) {
|
||||
gtag('config', 'UA-165342524-1', { anonymize_ip: true });
|
||||
`;
|
||||
document.head.appendChild(initScript);
|
||||
|
||||
const abTestingScript = document.createElement("script");
|
||||
abTestingScript.setAttribute(
|
||||
"src",
|
||||
"https://www.googleoptimize.com/optimize.js?id=OPT-M5NHCV7"
|
||||
);
|
||||
abTestingScript.setAttribute("async", "");
|
||||
document.head.appendChild(abTestingScript);
|
||||
}
|
||||
|
||||
// Do not need to preload in app or standalone
|
||||
@ -250,50 +221,25 @@ function gulptasksHTML($, gulp, buildFolder) {
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
}
|
||||
|
||||
gulp.task("html.dev", () => {
|
||||
return buildHtml("http://localhost:5005", {
|
||||
analytics: false,
|
||||
integrity: false,
|
||||
enableCachebust: false,
|
||||
for (const variant in BUILD_VARIANTS) {
|
||||
const data = BUILD_VARIANTS[variant];
|
||||
gulp.task("html." + variant + ".dev", () => {
|
||||
return buildHtml({
|
||||
googleAnalytics: false,
|
||||
standalone: data.standalone,
|
||||
integrity: false,
|
||||
enableCachebust: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task("html.staging", () => {
|
||||
return buildHtml("https://api-staging.shapez.io", {
|
||||
analytics: true,
|
||||
gulp.task("html." + variant + ".prod", () => {
|
||||
return buildHtml({
|
||||
googleAnalytics: !data.standalone,
|
||||
standalone: data.standalone,
|
||||
integrity: true,
|
||||
enableCachebust: !data.standalone,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task("html.prod", () => {
|
||||
return buildHtml("https://analytics.shapez.io", {
|
||||
analytics: true,
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task("html.standalone-dev", () => {
|
||||
return buildHtml("https://localhost:5005", {
|
||||
analytics: false,
|
||||
standalone: true,
|
||||
integrity: false,
|
||||
enableCachebust: false,
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task("html.standalone-beta", () => {
|
||||
return buildHtml("https://api-staging.shapez.io", {
|
||||
analytics: false,
|
||||
standalone: true,
|
||||
enableCachebust: false,
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task("html.standalone-prod", () => {
|
||||
return buildHtml("https://analytics.shapez.io", {
|
||||
analytics: false,
|
||||
standalone: true,
|
||||
enableCachebust: false,
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
348
gulp/js.js
348
gulp/js.js
@ -1,260 +1,124 @@
|
||||
const path = require("path");
|
||||
const { BUILD_VARIANTS } = require("./build_variants");
|
||||
|
||||
function requireUncached(module) {
|
||||
delete require.cache[require.resolve(module)];
|
||||
return require(module);
|
||||
}
|
||||
|
||||
/**
|
||||
* PROVIDES (per <variant>)
|
||||
*
|
||||
* js.<variant>.dev.watch
|
||||
* js.<variant>.dev
|
||||
* js.<variant>.prod
|
||||
*
|
||||
*/
|
||||
|
||||
function gulptasksJS($, gulp, buildFolder, browserSync) {
|
||||
//// DEV
|
||||
|
||||
gulp.task("js.dev.watch", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
watch: true,
|
||||
})
|
||||
for (const variant in BUILD_VARIANTS) {
|
||||
const data = BUILD_VARIANTS[variant];
|
||||
|
||||
gulp.task("js." + variant + ".dev.watch", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
...data.buildArgs,
|
||||
standalone: data.standalone,
|
||||
watch: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
|
||||
gulp.task("js.dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe($.webpackStream(requireUncached("./webpack.config.js")({})))
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
if (!data.standalone) {
|
||||
// WEB
|
||||
|
||||
//// DEV CHINA
|
||||
gulp.task("js." + variant + ".dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
...data.buildArgs,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
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("js." + variant + ".prod.transpiled", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
es6: false,
|
||||
environment: data.environment,
|
||||
...data.buildArgs,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe($.rename("bundle-transpiled.js"))
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
gulp.task("china.js.dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
chineseVersion: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
//// DEV WEGAME
|
||||
|
||||
gulp.task("wegame.js.dev.watch", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
watch: true,
|
||||
wegameVersion: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
|
||||
gulp.task("wegame.js.dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
wegameVersion: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
//// STAGING
|
||||
|
||||
gulp.task("js.staging.transpiled", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: true,
|
||||
environment: "staging",
|
||||
es6: false,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe($.rename("bundle-transpiled.js"))
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
gulp.task("js.staging.latest", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: true,
|
||||
environment: "staging",
|
||||
es6: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
gulp.task("js.staging", gulp.parallel("js.staging.transpiled", "js.staging.latest"));
|
||||
|
||||
//// PROD
|
||||
|
||||
gulp.task("js.prod.transpiled", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: false,
|
||||
environment: "prod",
|
||||
es6: false,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe($.rename("bundle-transpiled.js"))
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
|
||||
gulp.task("js.prod.latest", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: false,
|
||||
environment: "prod",
|
||||
es6: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
|
||||
gulp.task("js.prod", gulp.parallel("js.prod.transpiled", "js.prod.latest"));
|
||||
|
||||
//// STANDALONE
|
||||
|
||||
gulp.task("js.standalone-dev.watch", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
watch: true,
|
||||
standalone: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder))
|
||||
.pipe(browserSync.stream());
|
||||
});
|
||||
|
||||
gulp.task("js.standalone-dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
standalone: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
gulp.task("js.standalone-beta", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: true,
|
||||
environment: "staging",
|
||||
es6: true,
|
||||
standalone: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
|
||||
gulp.task("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,
|
||||
})
|
||||
)
|
||||
)
|
||||
.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));
|
||||
});
|
||||
|
||||
gulp.task("wegame.js.standalone-prod", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
enableAssert: false,
|
||||
environment: "prod",
|
||||
es6: false,
|
||||
standalone: true,
|
||||
wegameVersion: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
gulp.task("js." + variant + ".prod.es6", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
es6: true,
|
||||
environment: data.environment,
|
||||
...data.buildArgs,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
gulp.task(
|
||||
"js." + variant + ".prod",
|
||||
gulp.parallel("js." + variant + ".prod.transpiled", "js." + variant + ".prod.es6")
|
||||
);
|
||||
} else {
|
||||
// STANDALONE
|
||||
gulp.task("js." + variant + ".dev", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.config.js")({
|
||||
...data.buildArgs,
|
||||
standalone: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
gulp.task("js." + variant + ".prod", () => {
|
||||
return gulp
|
||||
.src("../src/js/main.js")
|
||||
.pipe(
|
||||
$.webpackStream(
|
||||
requireUncached("./webpack.production.config.js")({
|
||||
...data.buildArgs,
|
||||
environment: "prod",
|
||||
es6: true,
|
||||
standalone: true,
|
||||
})
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(buildFolder));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
@ -1,66 +0,0 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const execSync = require("child_process").execSync;
|
||||
const { Octokit } = require("@octokit/rest");
|
||||
const buildutils = require("./buildutils");
|
||||
|
||||
function gulptasksReleaseUploader($, gulp, buildFolder) {
|
||||
const standaloneDir = path.join(__dirname, "..", "tmp_standalone_files");
|
||||
const darwinApp = path.join(standaloneDir, "shapez.io-standalone-darwin-x64", "shapez.io-standalone.app");
|
||||
const dmgName = "shapez.io-standalone.dmg";
|
||||
const dmgPath = path.join(standaloneDir, "shapez.io-standalone-darwin-x64", dmgName);
|
||||
|
||||
gulp.task("standalone.uploadRelease.darwin64.cleanup", () => {
|
||||
return gulp.src(dmgPath, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
|
||||
});
|
||||
|
||||
gulp.task("standalone.uploadRelease.darwin64.compress", cb => {
|
||||
console.log("Packaging disk image", dmgPath);
|
||||
execSync(`hdiutil create -format UDBZ -srcfolder ${darwinApp} ${dmgPath}`);
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task("standalone.uploadRelease.darwin64.upload", async cb => {
|
||||
const currentTag = buildutils.getTag();
|
||||
|
||||
const octokit = new Octokit({
|
||||
auth: process.env.SHAPEZ_CLI_GITHUB_TOKEN
|
||||
});
|
||||
|
||||
const createdRelease = await octokit.request("POST /repos/{owner}/{repo}/releases", {
|
||||
owner: process.env.SHAPEZ_CLI_GITHUB_USER,
|
||||
repo: "shapez.io",
|
||||
tag_name: currentTag,
|
||||
name: currentTag,
|
||||
draft: true
|
||||
});
|
||||
|
||||
const { data: { id, upload_url } } = createdRelease;
|
||||
console.log(`Created release ${id} for tag ${currentTag}`);
|
||||
|
||||
const dmgContents = fs.readFileSync(dmgPath);
|
||||
const dmgSize = fs.statSync(dmgPath).size;
|
||||
console.log("Uploading", dmgContents.length / 1024 / 1024, "MB to", upload_url);
|
||||
|
||||
await octokit.request({
|
||||
method: "POST",
|
||||
url: upload_url,
|
||||
headers: {
|
||||
"content-type": "application/x-apple-diskimage"
|
||||
},
|
||||
name: dmgName,
|
||||
data: dmgContents
|
||||
});
|
||||
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task("standalone.uploadRelease.darwin64",
|
||||
gulp.series(
|
||||
"standalone.uploadRelease.darwin64.cleanup",
|
||||
"standalone.uploadRelease.darwin64.compress",
|
||||
"standalone.uploadRelease.darwin64.upload"
|
||||
));
|
||||
}
|
||||
|
||||
module.exports = { gulptasksReleaseUploader };
|
@ -8,6 +8,7 @@ const fse = require("fs-extra");
|
||||
const buildutils = require("./buildutils");
|
||||
const execSync = require("child_process").execSync;
|
||||
const electronNotarize = require("electron-notarize");
|
||||
const { BUILD_VARIANTS } = require("./build_variants");
|
||||
|
||||
let signAsync;
|
||||
try {
|
||||
@ -17,56 +18,32 @@ try {
|
||||
}
|
||||
|
||||
function gulptasksStandalone($, gulp) {
|
||||
const targets = [
|
||||
{
|
||||
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files"),
|
||||
suffix: "",
|
||||
taskPrefix: "",
|
||||
electronBaseDir: path.join(__dirname, "..", "electron"),
|
||||
steam: true,
|
||||
},
|
||||
{
|
||||
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files_china"),
|
||||
suffix: "china",
|
||||
taskPrefix: "china.",
|
||||
electronBaseDir: path.join(__dirname, "..", "electron"),
|
||||
steam: true,
|
||||
},
|
||||
{
|
||||
tempDestDir: path.join(__dirname, "..", "tmp_standalone_files_wegame"),
|
||||
suffix: "wegame",
|
||||
taskPrefix: "wegame.",
|
||||
electronBaseDir: path.join(__dirname, "..", "electron_wegame"),
|
||||
steam: false,
|
||||
},
|
||||
];
|
||||
|
||||
for (const { tempDestDir, suffix, taskPrefix, electronBaseDir, steam } of targets) {
|
||||
for (const variant in BUILD_VARIANTS) {
|
||||
const variantData = BUILD_VARIANTS[variant];
|
||||
if (!variantData.standalone) {
|
||||
continue;
|
||||
}
|
||||
const tempDestDir = path.join(__dirname, "..", "build_output", variant);
|
||||
const taskPrefix = "standalone." + variant;
|
||||
const electronBaseDir = path.join(__dirname, "..", variantData.electronBaseDir || "electron");
|
||||
const tempDestBuildDir = path.join(tempDestDir, "built");
|
||||
|
||||
gulp.task(taskPrefix + "standalone.prepare.cleanup", () => {
|
||||
gulp.task(taskPrefix + ".prepare.cleanup", () => {
|
||||
return gulp.src(tempDestDir, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
|
||||
});
|
||||
|
||||
gulp.task(taskPrefix + "standalone.prepare.copyPrefab", () => {
|
||||
gulp.task(taskPrefix + ".prepare.copyPrefab", () => {
|
||||
const requiredFiles = [
|
||||
path.join(electronBaseDir, "node_modules", "**", "*.*"),
|
||||
path.join(electronBaseDir, "node_modules", "**", ".*"),
|
||||
path.join(electronBaseDir, "wegame_sdk", "**", "*.*"),
|
||||
path.join(electronBaseDir, "wegame_sdk", "**", ".*"),
|
||||
path.join(electronBaseDir, "favicon*"),
|
||||
|
||||
// fails on platforms which support symlinks
|
||||
// https://github.com/gulpjs/gulp/issues/1427
|
||||
// path.join(electronBaseDir, "node_modules", "**", "*"),
|
||||
];
|
||||
if (steam) {
|
||||
requiredFiles.push(path.join(electronBaseDir, "steam_appid.txt"));
|
||||
}
|
||||
return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir));
|
||||
});
|
||||
|
||||
gulp.task(taskPrefix + "standalone.prepare.writePackageJson", cb => {
|
||||
gulp.task(taskPrefix + ".prepare.writePackageJson", cb => {
|
||||
const packageJsonString = JSON.stringify(
|
||||
{
|
||||
scripts: {
|
||||
@ -85,52 +62,15 @@ function gulptasksStandalone($, gulp) {
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task(taskPrefix + "standalone.prepareVDF", cb => {
|
||||
if (!steam) {
|
||||
cb();
|
||||
return;
|
||||
}
|
||||
|
||||
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.prepareVDF.darwin", cb => {
|
||||
if (!steam) {
|
||||
cb();
|
||||
return;
|
||||
}
|
||||
|
||||
const hash = buildutils.getRevision();
|
||||
const steampipeDir = path.join(__dirname, "steampipe-darwin", "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", () => {
|
||||
gulp.task(taskPrefix + ".prepare.minifyCode", () => {
|
||||
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
|
||||
});
|
||||
|
||||
gulp.task(taskPrefix + "standalone.prepare.copyGamefiles", () => {
|
||||
gulp.task(taskPrefix + ".prepare.copyGamefiles", () => {
|
||||
return gulp.src("../build/**/*.*", { base: "../build" }).pipe(gulp.dest(tempDestBuildDir));
|
||||
});
|
||||
|
||||
gulp.task(taskPrefix + "standalone.killRunningInstances", cb => {
|
||||
gulp.task(taskPrefix + ".killRunningInstances", cb => {
|
||||
try {
|
||||
execSync("taskkill /F /IM shapezio.exe");
|
||||
} catch (ex) {
|
||||
@ -140,14 +80,14 @@ function gulptasksStandalone($, gulp) {
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
taskPrefix + "standalone.prepare",
|
||||
taskPrefix + ".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"
|
||||
taskPrefix + ".killRunningInstances",
|
||||
taskPrefix + ".prepare.cleanup",
|
||||
taskPrefix + ".prepare.copyPrefab",
|
||||
taskPrefix + ".prepare.writePackageJson",
|
||||
taskPrefix + ".prepare.minifyCode",
|
||||
taskPrefix + ".prepare.copyGamefiles"
|
||||
)
|
||||
);
|
||||
|
||||
@ -158,11 +98,13 @@ function gulptasksStandalone($, gulp) {
|
||||
* @param {function():void} cb
|
||||
*/
|
||||
function packageStandalone(platform, arch, cb, isRelease = true) {
|
||||
const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
|
||||
const privateArtifactsPath = "node_modules/shapez.io-private-artifacts";
|
||||
|
||||
let asar = steam;
|
||||
if (steam && fs.existsSync(path.join(tempDestBuildDir, privateArtifactsPath))) {
|
||||
// Only use asar on steam builds (not supported by wegame)
|
||||
let asar = Boolean(variantData.steamAppId);
|
||||
|
||||
// Unpack private artifacts though
|
||||
if (asar && fs.existsSync(path.join(tempDestBuildDir, privateArtifactsPath))) {
|
||||
// @ts-expect-error
|
||||
asar = { unpackDir: privateArtifactsPath };
|
||||
}
|
||||
@ -177,10 +119,10 @@ function gulptasksStandalone($, gulp) {
|
||||
asar: asar,
|
||||
executableName: "shapezio",
|
||||
icon: path.join(electronBaseDir, "favicon"),
|
||||
name: "shapez.io-standalone" + suffix,
|
||||
name: "shapez-" + variant,
|
||||
out: tempDestDir,
|
||||
overwrite: true,
|
||||
appBundleId: "tobspr.shapezio.standalone",
|
||||
appBundleId: "tobspr.shapezio." + variant,
|
||||
appCategoryType: "public.app-category.games",
|
||||
...(isRelease &&
|
||||
platform === "darwin" && {
|
||||
@ -189,6 +131,7 @@ function gulptasksStandalone($, gulp) {
|
||||
"hardenedRuntime": true,
|
||||
"entitlements": "entitlements.plist",
|
||||
"entitlements-inherit": "entitlements.plist",
|
||||
// @ts-ignore
|
||||
"signatureFlags": ["library"],
|
||||
"version": "16.0.7",
|
||||
},
|
||||
@ -202,43 +145,42 @@ function gulptasksStandalone($, gulp) {
|
||||
console.log("Packages created:", appPaths);
|
||||
appPaths.forEach(appPath => {
|
||||
if (!fs.existsSync(appPath)) {
|
||||
console.error("Bad app path gotten:", appPath);
|
||||
console.error("Bad app path:", appPath);
|
||||
return;
|
||||
}
|
||||
|
||||
if (steam) {
|
||||
if (variantData.steamAppId) {
|
||||
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, "steam_appid.txt"),
|
||||
String(variantData.steamAppId)
|
||||
);
|
||||
|
||||
fs.writeFileSync(path.join(appPath, ".itch.toml"), tomlFile);
|
||||
|
||||
if (platform === "linux") {
|
||||
// Write launcher script
|
||||
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 (platform === "darwin") {
|
||||
if (!isRelease) {
|
||||
fse.copySync(
|
||||
path.join(tempDestBuildDir, "steam_appid.txt"),
|
||||
// Needs special location
|
||||
fs.writeFileSync(
|
||||
path.join(
|
||||
path.join(
|
||||
appPath,
|
||||
"shapez.io-standalone.app",
|
||||
"Contents",
|
||||
"MacOS"
|
||||
),
|
||||
appPath,
|
||||
"shapez.io-standalone.app",
|
||||
"Contents",
|
||||
"MacOS",
|
||||
"steam_appid.txt"
|
||||
)
|
||||
),
|
||||
String(variantData.steamAppId)
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -255,7 +197,7 @@ function gulptasksStandalone($, gulp) {
|
||||
}
|
||||
|
||||
// Manual signing with patched @electron/osx-sign (we need --no-strict)
|
||||
gulp.task(taskPrefix + "standalone.package.prod.darwin64.signManually", cb =>
|
||||
gulp.task(taskPrefix + ".package.darwin64", cb =>
|
||||
packageStandalone(
|
||||
"darwin",
|
||||
"x64",
|
||||
@ -327,29 +269,44 @@ function gulptasksStandalone($, gulp) {
|
||||
)
|
||||
);
|
||||
|
||||
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.darwin64", cb =>
|
||||
packageStandalone("darwin", "x64", cb)
|
||||
);
|
||||
gulp.task(taskPrefix + "standalone.package.prod.darwin64.unsigned", cb =>
|
||||
packageStandalone("darwin", "x64", cb, false)
|
||||
);
|
||||
|
||||
gulp.task(taskPrefix + ".package.win64", cb => packageStandalone("win32", "x64", cb));
|
||||
gulp.task(taskPrefix + ".package.linux64", cb => packageStandalone("linux", "x64", cb));
|
||||
gulp.task(
|
||||
taskPrefix + "standalone.package.prod",
|
||||
taskPrefix + ".build-from-windows",
|
||||
gulp.series(
|
||||
taskPrefix + "standalone.prepare",
|
||||
gulp.parallel(
|
||||
taskPrefix + "standalone.package.prod.win64",
|
||||
taskPrefix + "standalone.package.prod.linux64",
|
||||
taskPrefix + "standalone.package.prod.darwin64"
|
||||
)
|
||||
taskPrefix + ".prepare",
|
||||
gulp.parallel(taskPrefix + ".package.win64", taskPrefix + ".package.linux64")
|
||||
)
|
||||
);
|
||||
gulp.task(
|
||||
taskPrefix + ".build-from-darwin",
|
||||
gulp.series(taskPrefix + ".prepare", gulp.parallel(taskPrefix + ".package.darwin64"))
|
||||
);
|
||||
}
|
||||
|
||||
// Steam helpers
|
||||
gulp.task("standalone.prepareVDF", cb => {
|
||||
const hash = buildutils.getRevision();
|
||||
const version = buildutils.getVersion();
|
||||
|
||||
for (const platform of ["steampipe", "steampipe-darwin"]) {
|
||||
const steampipeDir = path.join(__dirname, platform, "scripts");
|
||||
for (const buildVariant of ["app", "app-demo"]) {
|
||||
const templateContents = fs
|
||||
.readFileSync(path.join(steampipeDir, buildVariant + ".vdf.template"), {
|
||||
encoding: "utf-8",
|
||||
})
|
||||
.toString();
|
||||
|
||||
const convertedContents = templateContents.replace(
|
||||
"$DESC$",
|
||||
platform + " " + buildVariant + " version " + version + ", commit " + hash
|
||||
);
|
||||
fs.writeFileSync(path.join(steampipeDir, buildVariant + ".vdf"), convertedContents);
|
||||
}
|
||||
}
|
||||
cb();
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { gulptasksStandalone };
|
||||
|
14
gulp/steampipe-darwin/scripts/app-demo.vdf.template
Normal file
14
gulp/steampipe-darwin/scripts/app-demo.vdf.template
Normal file
@ -0,0 +1,14 @@
|
||||
"appbuild"
|
||||
{
|
||||
"appid" "1930750"
|
||||
"desc" "$DESC$"
|
||||
"buildoutput" "$STEAMPIPE_DIR$/steamtmp"
|
||||
"contentroot" ""
|
||||
"setlive" ""
|
||||
"preview" "0"
|
||||
"local" ""
|
||||
"depots"
|
||||
{
|
||||
"1930756" "$STEAMPIPE_DIR$/scripts/demo-darwin.vdf"
|
||||
}
|
||||
}
|
@ -2,13 +2,13 @@
|
||||
{
|
||||
"appid" "1318690"
|
||||
"desc" "$DESC$"
|
||||
"buildoutput" "/Users/tobiasspringer/work/shapez.io/gulp/steampipe-darwin/steamtmp"
|
||||
"buildoutput" "$PROJECT_DIR$/gulp/steampipe-darwin/steamtmp"
|
||||
"contentroot" ""
|
||||
"setlive" ""
|
||||
"preview" "0"
|
||||
"local" ""
|
||||
"depots"
|
||||
{
|
||||
"1318693" "/Users/tobiasspringer/work/shapez.io/gulp/steampipe-darwin/scripts/darwin.vdf"
|
||||
"1318693" "$PROJECT_DIR$/gulp/steampipe-darwin/scripts/darwin.vdf"
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1318693"
|
||||
"contentroot" "/Users/tobiasspringer/work/shapez.io/tmp_standalone_files/shapez.io-standalone-darwin-x64"
|
||||
"contentroot" "$PROJECT_DIR$/tmp_standalone_files/shapez.io-standalone-darwin-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
|
12
gulp/steampipe-darwin/scripts/demo-darwin.vdf
Normal file
12
gulp/steampipe-darwin/scripts/demo-darwin.vdf
Normal file
@ -0,0 +1,12 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1930756"
|
||||
"contentroot" "$PROJECT_DIR$/tmp_standalone_files/shapez.io-demo-darwin-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
"DepotPath" "."
|
||||
"recursive" "1"
|
||||
}
|
||||
"FileExclusion" "*.pdb"
|
||||
}
|
@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
yarn gulp standalone.prepareVDF.darwin
|
||||
yarn gulp standalone.prepareVDF
|
||||
steamcmd.sh +login $STEAM_UPLOAD_SHAPEZ_ID $STEAM_UPLOAD_SHAPEZ_USER +run_app_build $PWD/scripts/app.vdf +quit
|
||||
|
17
gulp/steampipe/scripts/app-demo.vdf.template
Normal file
17
gulp/steampipe/scripts/app-demo.vdf.template
Normal file
@ -0,0 +1,17 @@
|
||||
"appbuild"
|
||||
{
|
||||
"appid" "1930750"
|
||||
"desc" "$DESC$"
|
||||
"buildoutput" "$STEAMPIPE_DIR$\steamtemp"
|
||||
"contentroot" ""
|
||||
"setlive" ""
|
||||
"preview" "0"
|
||||
"local" ""
|
||||
"depots"
|
||||
{
|
||||
"1930753" "$STEAMPIPE_DIR$\scripts\demo-windows.vdf"
|
||||
"1930754" "$STEAMPIPE_DIR$\scripts\demo-china-windows.vdf"
|
||||
"1930752" "$STEAMPIPE_DIR$\scripts\demo-linux.vdf"
|
||||
"1930755" "$STEAMPIPE_DIR$\scripts\demo-china-linux.vdf"
|
||||
}
|
||||
}
|
@ -2,16 +2,16 @@
|
||||
{
|
||||
"appid" "1318690"
|
||||
"desc" "$DESC$"
|
||||
"buildoutput" "C:\work\shapez\shapez.io\gulp\steampipe\steamtemp"
|
||||
"buildoutput" "$STEAMPIPE_DIR$\steamtemp"
|
||||
"contentroot" ""
|
||||
"setlive" ""
|
||||
"preview" "0"
|
||||
"local" ""
|
||||
"depots"
|
||||
{
|
||||
"1318691" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\windows.vdf"
|
||||
"1318694" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\china-windows.vdf"
|
||||
"1318692" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\linux.vdf"
|
||||
"1318695" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\china-linux.vdf"
|
||||
"1318691" "$STEAMPIPE_DIR$\scripts\windows.vdf"
|
||||
"1318694" "$STEAMPIPE_DIR$\scripts\china-windows.vdf"
|
||||
"1318692" "$STEAMPIPE_DIR$\scripts\linux.vdf"
|
||||
"1318695" "$STEAMPIPE_DIR$\scripts\china-linux.vdf"
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1318695"
|
||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files_china\shapez.io-standalonechina-linux-x64"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files_china\shapez.io-standalonechina-linux-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
|
@ -1,7 +1,7 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1318694"
|
||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files_china\shapez.io-standalonechina-win32-x64"
|
||||
"contentroot" "$PROJECT_DIR$\shapez.io-standalonechina-win32-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
|
12
gulp/steampipe/scripts/demo-china-linux.vdf
Normal file
12
gulp/steampipe/scripts/demo-china-linux.vdf
Normal file
@ -0,0 +1,12 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1930755"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files_china\shapez.io-demochina-linux-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
"DepotPath" "."
|
||||
"recursive" "1"
|
||||
}
|
||||
"FileExclusion" "*.pdb"
|
||||
}
|
12
gulp/steampipe/scripts/demo-china-windows.vdf
Normal file
12
gulp/steampipe/scripts/demo-china-windows.vdf
Normal file
@ -0,0 +1,12 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1930754"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files_china\shapez.io-demochina-win32-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
"DepotPath" "."
|
||||
"recursive" "1"
|
||||
}
|
||||
"FileExclusion" "*.pdb"
|
||||
}
|
12
gulp/steampipe/scripts/demo-linux.vdf
Normal file
12
gulp/steampipe/scripts/demo-linux.vdf
Normal file
@ -0,0 +1,12 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1930752"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files\shapez.io-demo-linux-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
"DepotPath" "."
|
||||
"recursive" "1"
|
||||
}
|
||||
"FileExclusion" "*.pdb"
|
||||
}
|
12
gulp/steampipe/scripts/demo-windows.vdf
Normal file
12
gulp/steampipe/scripts/demo-windows.vdf
Normal file
@ -0,0 +1,12 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1930753"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files\shapez.io-demo-win32-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
"DepotPath" "."
|
||||
"recursive" "1"
|
||||
}
|
||||
"FileExclusion" "*.pdb"
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1318692"
|
||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files\shapez.io-standalone-linux-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
|
@ -1,7 +1,7 @@
|
||||
"DepotBuildConfig"
|
||||
{
|
||||
"DepotID" "1318691"
|
||||
"contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64"
|
||||
"contentroot" "$PROJECT_DIR$\tmp_standalone_files\shapez.io-standalone-win32-x64"
|
||||
"FileMapping"
|
||||
{
|
||||
"LocalPath" "*"
|
||||
|
3
gulp/steampipe/upload-demo.bat
Normal file
3
gulp/steampipe/upload-demo.bat
Normal file
@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
cmd /c yarn gulp standalone.prepareVDF
|
||||
steamcmd +login %STEAM_UPLOAD_SHAPEZ_ID% %STEAM_UPLOAD_SHAPEZ_USER% +run_app_build %cd%/scripts/app-demo.vdf +quit
|
@ -1,4 +1,3 @@
|
||||
@echo off
|
||||
cmd /c yarn gulp standalone.prepareVDF
|
||||
steamcmd +login %STEAM_UPLOAD_SHAPEZ_ID% %STEAM_UPLOAD_SHAPEZ_USER% +run_app_build %cd%/scripts/app.vdf +quit
|
||||
start https://partner.steamgames.com/apps/builds/1318690
|
||||
|
@ -3,10 +3,15 @@
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
const { getRevision, getVersion, getAllResourceImages } = require("./buildutils");
|
||||
const lzString = require("lz-string");
|
||||
const CircularDependencyPlugin = require("circular-dependency-plugin");
|
||||
|
||||
module.exports = ({ watch = false, standalone = false, chineseVersion = false, wegameVersion = false }) => {
|
||||
module.exports = ({
|
||||
watch = false,
|
||||
standalone = false,
|
||||
chineseVersion = false,
|
||||
wegameVersion = false,
|
||||
steamDemo = false,
|
||||
}) => {
|
||||
return {
|
||||
mode: "development",
|
||||
devtool: "cheap-source-map",
|
||||
@ -31,16 +36,13 @@ module.exports = ({ watch = false, standalone = false, chineseVersion = false, w
|
||||
"window.assert(false, 'abstract method called of: ' + (this.name || (this.constructor && this.constructor.name)));",
|
||||
G_HAVE_ASSERT: "true",
|
||||
G_APP_ENVIRONMENT: JSON.stringify("dev"),
|
||||
G_TRACKING_ENDPOINT: JSON.stringify(
|
||||
lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
|
||||
),
|
||||
G_CHINA_VERSION: JSON.stringify(chineseVersion),
|
||||
G_WEGAME_VERSION: JSON.stringify(wegameVersion),
|
||||
G_IS_DEV: "true",
|
||||
G_IS_RELEASE: "false",
|
||||
G_IS_MOBILE_APP: "false",
|
||||
G_IS_BROWSER: "true",
|
||||
G_IS_STANDALONE: standalone ? "true" : "false",
|
||||
G_IS_STANDALONE: JSON.stringify(standalone),
|
||||
G_IS_STEAM_DEMO: JSON.stringify(steamDemo),
|
||||
G_BUILD_TIME: "" + new Date().getTime(),
|
||||
G_BUILD_COMMIT_HASH: JSON.stringify(getRevision()),
|
||||
G_BUILD_VERSION: JSON.stringify(getVersion()),
|
||||
|
@ -3,24 +3,24 @@
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
const { getRevision, getVersion, getAllResourceImages } = require("./buildutils");
|
||||
const lzString = require("lz-string");
|
||||
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
const StringReplacePlugin = require("string-replace-webpack-plugin");
|
||||
const UnusedFilesPlugin = require("unused-files-webpack-plugin").UnusedFilesWebpackPlugin;
|
||||
|
||||
module.exports = ({
|
||||
enableAssert = false,
|
||||
environment,
|
||||
es6 = false,
|
||||
|
||||
standalone = false,
|
||||
isBrowser = true,
|
||||
mobileApp = false,
|
||||
|
||||
chineseVersion = false,
|
||||
wegameVersion = false,
|
||||
steamDemo = false,
|
||||
}) => {
|
||||
const globalDefs = {
|
||||
assert: enableAssert ? "window.assert" : "false && window.assert",
|
||||
assert: "false && window.assert",
|
||||
assertAlways: "window.assert",
|
||||
abstract: "window.assert(false, 'abstract method called');",
|
||||
G_IS_DEV: "false",
|
||||
@ -29,13 +29,10 @@ module.exports = ({
|
||||
G_WEGAME_VERSION: JSON.stringify(wegameVersion),
|
||||
G_IS_RELEASE: environment === "prod" ? "true" : "false",
|
||||
G_IS_STANDALONE: standalone ? "true" : "false",
|
||||
G_IS_STEAM_DEMO: JSON.stringify(steamDemo),
|
||||
G_IS_BROWSER: isBrowser ? "true" : "false",
|
||||
G_IS_MOBILE_APP: mobileApp ? "true" : "false",
|
||||
G_TRACKING_ENDPOINT: JSON.stringify(
|
||||
lzString.compressToEncodedURIComponent("https://tracking.shapez.io/v1")
|
||||
),
|
||||
G_APP_ENVIRONMENT: JSON.stringify(environment),
|
||||
G_HAVE_ASSERT: enableAssert ? "true" : "false",
|
||||
G_HAVE_ASSERT: "false",
|
||||
G_BUILD_TIME: "" + new Date().getTime(),
|
||||
G_BUILD_COMMIT_HASH: JSON.stringify(getRevision()),
|
||||
G_BUILD_VERSION: JSON.stringify(getVersion()),
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 210 KiB |
@ -52,6 +52,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
.playtimeDisclaimer {
|
||||
@include S(margin-bottom, 10px);
|
||||
@include PlainText;
|
||||
}
|
||||
|
||||
.steamLinkButton {
|
||||
@include IncreasedClickArea(5px);
|
||||
@include S(margin, 0);
|
||||
|
@ -1,10 +1,16 @@
|
||||
#ingame_HUD_CatMemes {
|
||||
#ingame_HUD_SteamCapsule {
|
||||
position: absolute;
|
||||
@include S(width, 150px);
|
||||
@include S(height, 150px);
|
||||
background: transparent center center / contain no-repeat;
|
||||
@include S(height, 119px);
|
||||
background: transparent center center / cover no-repeat;
|
||||
|
||||
right: 0;
|
||||
pointer-events: all;
|
||||
overflow: hidden;
|
||||
@include S(right, 10px);
|
||||
|
||||
border: D(2px) solid #000;
|
||||
@include S(border-radius, $globalBorderRadius);
|
||||
cursor: pointer;
|
||||
@include S(bottom, 150px);
|
||||
|
||||
& {
|
||||
@ -12,6 +18,10 @@
|
||||
background-image: uiResource("res/ui/memes/cat1.png") !important;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
opacity: 0.95;
|
||||
}
|
||||
|
||||
@include InlineAnimation(0.5s ease-in-out) {
|
||||
0% {
|
||||
transform: translateX(100%);
|
@ -57,7 +57,7 @@
|
||||
@import "ingame_hud/shape_viewer";
|
||||
@import "ingame_hud/sandbox_controller";
|
||||
@import "ingame_hud/standalone_advantages";
|
||||
@import "ingame_hud/cat_memes";
|
||||
@import "ingame_hud/steam_capsule";
|
||||
@import "ingame_hud/puzzle_back_to_menu";
|
||||
@import "ingame_hud/puzzle_editor_review";
|
||||
@import "ingame_hud/puzzle_dlc_logo";
|
||||
@ -105,6 +105,7 @@ ingame_HUD_Waypoints_Hint,
|
||||
ingame_HUD_WatermarkClicker,
|
||||
ingame_HUD_Watermark,
|
||||
ingame_HUD_ColorBlindBelowTileHelper,
|
||||
ingame_HUD_SteamCapsule,
|
||||
ingame_HUD_SandboxController,
|
||||
|
||||
// Overlays
|
||||
@ -118,8 +119,7 @@ ingame_HUD_StandaloneAdvantages,
|
||||
ingame_HUD_UnlockNotification,
|
||||
ingame_HUD_PuzzleCompleteNotification,
|
||||
ingame_HUD_SettingsMenu,
|
||||
ingame_HUD_ModalDialogs,
|
||||
ingame_HUD_CatMemes;
|
||||
ingame_HUD_ModalDialogs;
|
||||
|
||||
$zindex: 100;
|
||||
|
||||
@ -132,7 +132,7 @@ $zindex: 100;
|
||||
}
|
||||
|
||||
body.uiHidden {
|
||||
> div {
|
||||
> div:not(.ingameDialog):not(#ingame_HUD_SettingsMenu):not(#ingame_HUD_ModalDialogs):not(#ingame_HUD_UnlockNotification):not(#ingame_HUD_PuzzleCompleteNotification) {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
@ -97,7 +97,7 @@
|
||||
}
|
||||
|
||||
.standaloneBanner {
|
||||
background: rgb(216, 79, 76);
|
||||
background: rgba(12, 168, 93, 0.957);
|
||||
@include S(border-radius, $globalBorderRadius);
|
||||
box-sizing: border-box;
|
||||
@include S(padding, 15px);
|
||||
@ -106,8 +106,7 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
strong {
|
||||
font-weight: bold;
|
||||
@include S(margin, 0, 4px);
|
||||
font-weight: 700 !important;
|
||||
}
|
||||
|
||||
h3 {
|
||||
@ -129,9 +128,16 @@
|
||||
@include S(padding-left, 20px);
|
||||
li {
|
||||
@include Text;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.playtimeDisclaimer {
|
||||
color: #fff;
|
||||
@include S(margin-top, 15px);
|
||||
@include SuperSmallText;
|
||||
}
|
||||
|
||||
.steamLink {
|
||||
align-self: center;
|
||||
justify-self: center;
|
||||
@ -153,6 +159,12 @@
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
@include InlineAnimation(1s ease-in-out infinite) {
|
||||
50% {
|
||||
transform: scale(1.02, 1.03);
|
||||
}
|
||||
}
|
||||
|
||||
> .discount {
|
||||
position: absolute;
|
||||
@include S(top, -7px);
|
||||
@ -186,9 +198,8 @@
|
||||
img {
|
||||
@include S(width, 300px);
|
||||
}
|
||||
|
||||
position: relative;
|
||||
@include S(left, -22px);
|
||||
@include S(left, -8px);
|
||||
|
||||
.updateLabel {
|
||||
position: absolute;
|
||||
@ -677,25 +688,19 @@
|
||||
}
|
||||
|
||||
.footer {
|
||||
display: grid;
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
justify-content: center;
|
||||
align-items: flex-end;
|
||||
width: 100%;
|
||||
grid-template-columns: auto auto auto 1fr;
|
||||
@include S(padding, 10px);
|
||||
box-sizing: border-box;
|
||||
@include S(grid-gap, 4px);
|
||||
|
||||
&.noLinks {
|
||||
grid-template-columns: auto 1fr;
|
||||
}
|
||||
|
||||
&.wegameDisclaimer {
|
||||
@include SuperSmallText;
|
||||
display: grid;
|
||||
justify-content: center;
|
||||
grid-template-columns: 1fr auto 1fr;
|
||||
text-align: center;
|
||||
|
||||
> .disclaimer {
|
||||
|
@ -47,6 +47,10 @@
|
||||
align-self: end;
|
||||
margin-top: auto;
|
||||
|
||||
&.noabout {
|
||||
align-self: start;
|
||||
}
|
||||
|
||||
@include StyleBelowWidth($layoutBreak) {
|
||||
margin-top: 0;
|
||||
display: grid;
|
||||
|
@ -41,7 +41,6 @@ import { ModsState } from "./states/mods";
|
||||
|
||||
/**
|
||||
* @typedef {import("./platform/achievement_provider").AchievementProviderInterface} AchievementProviderInterface
|
||||
* @typedef {import("./platform/game_analytics").GameAnalyticsInterface} GameAnalyticsInterface
|
||||
* @typedef {import("./platform/sound").SoundInterface} SoundInterface
|
||||
* @typedef {import("./platform/storage").StorageInterface} StorageInterface
|
||||
*/
|
||||
@ -118,7 +117,7 @@ export class Application {
|
||||
/** @type {AnalyticsInterface} */
|
||||
this.analytics = null;
|
||||
|
||||
/** @type {GameAnalyticsInterface} */
|
||||
/** @type {ShapezGameAnalytics} */
|
||||
this.gameAnalytics = null;
|
||||
|
||||
this.initPlatformDependentInstances();
|
||||
@ -227,12 +226,10 @@ export class Application {
|
||||
window.addEventListener("resize", () => this.checkResize(), true);
|
||||
window.addEventListener("orientationchange", () => this.checkResize(), true);
|
||||
|
||||
if (!G_IS_MOBILE_APP && !IS_MOBILE) {
|
||||
window.addEventListener("mousemove", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseout", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseover", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseleave", this.handleMousemove.bind(this));
|
||||
}
|
||||
window.addEventListener("mousemove", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseout", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseover", this.handleMousemove.bind(this));
|
||||
window.addEventListener("mouseleave", this.handleMousemove.bind(this));
|
||||
|
||||
// Unload events
|
||||
window.addEventListener("beforeunload", this.onBeforeUnload.bind(this), true);
|
||||
|
@ -17,6 +17,10 @@ export function getLogoSprite() {
|
||||
return "logo_wegame.png";
|
||||
}
|
||||
|
||||
if (G_IS_STEAM_DEMO) {
|
||||
return "logo_demo.png";
|
||||
}
|
||||
|
||||
if (G_CHINA_VERSION) {
|
||||
return "logo_cn.png";
|
||||
}
|
||||
|
@ -117,13 +117,7 @@ export const globalConfig = {
|
||||
rendering: {},
|
||||
debug: require("./config.local").default,
|
||||
|
||||
currentDiscount: {
|
||||
amount: 50,
|
||||
from: Date.parse("May 23 2022 17:00 +2:00"),
|
||||
until: Date.parse("May 30 2022 23:59 +2:00"),
|
||||
|
||||
active: false, // computed later
|
||||
},
|
||||
currentDiscount: 0,
|
||||
|
||||
// Secret vars
|
||||
info: {
|
||||
@ -169,8 +163,3 @@ if (G_IS_DEV && globalConfig.debug.noArtificialDelays) {
|
||||
globalConfig.warmupTimeSecondsFast = 0;
|
||||
globalConfig.warmupTimeSecondsRegular = 0;
|
||||
}
|
||||
|
||||
globalConfig.currentDiscount.active =
|
||||
!G_IS_STANDALONE &&
|
||||
new Date().getTime() < globalConfig.currentDiscount.until &&
|
||||
new Date().getTime() > globalConfig.currentDiscount.from;
|
||||
|
@ -19,12 +19,10 @@ export function setGlobalApp(app) {
|
||||
export const BUILD_OPTIONS = {
|
||||
HAVE_ASSERT: G_HAVE_ASSERT,
|
||||
APP_ENVIRONMENT: G_APP_ENVIRONMENT,
|
||||
TRACKING_ENDPOINT: G_TRACKING_ENDPOINT,
|
||||
CHINA_VERSION: G_CHINA_VERSION,
|
||||
WEGAME_VERSION: G_WEGAME_VERSION,
|
||||
IS_DEV: G_IS_DEV,
|
||||
IS_RELEASE: G_IS_RELEASE,
|
||||
IS_MOBILE_APP: G_IS_MOBILE_APP,
|
||||
IS_BROWSER: G_IS_BROWSER,
|
||||
IS_STANDALONE: G_IS_STANDALONE,
|
||||
BUILD_TIME: G_BUILD_TIME,
|
||||
|
@ -2,7 +2,6 @@
|
||||
import { Application } from "../application";
|
||||
/* typehints:end */
|
||||
import { ExplainedResult } from "./explained_result";
|
||||
import { queryParamOptions } from "./query_parameters";
|
||||
import { ReadWriteProxy } from "./read_write_proxy";
|
||||
|
||||
export class RestrictionManager extends ReadWriteProxy {
|
||||
@ -56,13 +55,12 @@ export class RestrictionManager extends ReadWriteProxy {
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isLimitedVersion() {
|
||||
if (G_IS_STANDALONE) {
|
||||
// Standalone is never limited
|
||||
return false;
|
||||
if (G_IS_STEAM_DEMO) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (queryParamOptions.embedProvider === "gamedistribution") {
|
||||
// also full version on gamedistribution
|
||||
if (G_IS_STANDALONE) {
|
||||
// Standalone is never limited
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2,29 +2,6 @@ import { T } from "../translations";
|
||||
|
||||
const bigNumberSuffixTranslationKeys = ["thousands", "millions", "billions", "trillions"];
|
||||
|
||||
/**
|
||||
* Returns if this platform is android
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isAndroid() {
|
||||
if (!G_IS_MOBILE_APP) {
|
||||
return false;
|
||||
}
|
||||
const platform = window.device.platform;
|
||||
return platform === "Android" || platform === "amazon-fireos";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if this platform is iOs
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isIos() {
|
||||
if (!G_IS_MOBILE_APP) {
|
||||
return false;
|
||||
}
|
||||
return window.device.platform === "iOS";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a platform name
|
||||
* @returns {"android" | "browser" | "ios" | "standalone" | "unknown"}
|
||||
@ -34,10 +11,6 @@ export function getPlatformName() {
|
||||
return "standalone";
|
||||
} else if (G_IS_BROWSER) {
|
||||
return "browser";
|
||||
} else if (G_IS_MOBILE_APP && isAndroid()) {
|
||||
return "android";
|
||||
} else if (G_IS_MOBILE_APP && isIos()) {
|
||||
return "ios";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
@ -456,7 +429,7 @@ export function isSupportedBrowser() {
|
||||
// and if not iOS Chrome check
|
||||
// so use the below updated condition
|
||||
|
||||
if (G_IS_MOBILE_APP || G_IS_STANDALONE) {
|
||||
if (G_IS_STANDALONE) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,21 +0,0 @@
|
||||
import { makeDiv } from "../../../core/utils";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
|
||||
const memeShowIntervalSeconds = 70 * 60;
|
||||
const memeShowDuration = 5;
|
||||
|
||||
export class HUDCatMemes extends BaseHUDPart {
|
||||
createElements(parent) {
|
||||
this.element = makeDiv(parent, "ingame_HUD_CatMemes");
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.domAttach = new DynamicDomAttach(this.root, this.element);
|
||||
}
|
||||
|
||||
update() {
|
||||
const now = this.root.time.realtimeNow();
|
||||
this.domAttach.update(now % memeShowIntervalSeconds > memeShowIntervalSeconds - memeShowDuration);
|
||||
}
|
||||
}
|
@ -125,7 +125,11 @@ export class HUDModalDialogs extends BaseHUDPart {
|
||||
|
||||
dialog.buttonSignals.getStandalone.add(() => {
|
||||
this.app.analytics.trackUiClick("demo_dialog_click");
|
||||
window.open(THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_demo_dialog");
|
||||
window.open(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_demo_dialog" +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
});
|
||||
|
||||
return dialog.buttonSignals;
|
||||
|
@ -5,8 +5,6 @@ import { T } from "../../../translations";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
|
||||
const showIntervalSeconds = 9 * 60;
|
||||
|
||||
export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||
createElements(parent) {
|
||||
this.background = makeDiv(parent, "ingame_HUD_StandaloneAdvantages", ["ingameDialog"]);
|
||||
@ -33,10 +31,11 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||
</div>
|
||||
|
||||
<div class="lowerBar">
|
||||
<div class="playtimeDisclaimer">${T.demoBanners.playtimeDisclaimer}</div>
|
||||
<button class="steamLinkButton ${A_B_TESTING_LINK_TYPE}">
|
||||
${
|
||||
globalConfig.currentDiscount.active
|
||||
? `<span class='discount'>${globalConfig.currentDiscount.amount}% off!</span>`
|
||||
globalConfig.currentDiscount > 0
|
||||
? `<span class='discount'>${globalConfig.currentDiscount}% off!</span>`
|
||||
: ""
|
||||
}
|
||||
</button>
|
||||
@ -46,13 +45,15 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||
);
|
||||
|
||||
this.trackClicks(this.contentDiv.querySelector("button.steamLinkButton"), () => {
|
||||
const discount = globalConfig.currentDiscount.active
|
||||
? "_discount" + globalConfig.currentDiscount.amount
|
||||
: "";
|
||||
const discount =
|
||||
globalConfig.currentDiscount > 0 ? "_discount" + globalConfig.currentDiscount : "";
|
||||
|
||||
this.root.app.analytics.trackUiClick("standalone_advantage_visit_steam");
|
||||
this.root.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_std_advg" + discount
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_std_advg" +
|
||||
discount +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
this.close();
|
||||
});
|
||||
@ -62,6 +63,22 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||
});
|
||||
}
|
||||
|
||||
get showIntervalSeconds() {
|
||||
switch (this.root.app.gameAnalytics.abtVariant) {
|
||||
case "0":
|
||||
return 5 * 60;
|
||||
case "1":
|
||||
return 10 * 60;
|
||||
case "2":
|
||||
default:
|
||||
return 15 * 60;
|
||||
case "3":
|
||||
return 20 * 60;
|
||||
case "4":
|
||||
return 1e14;
|
||||
}
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.domAttach = new DynamicDomAttach(this.root, this.background, {
|
||||
attachClass: "visible",
|
||||
@ -86,7 +103,7 @@ export class HUDStandaloneAdvantages extends BaseHUDPart {
|
||||
}
|
||||
|
||||
update() {
|
||||
if (!this.visible && this.root.time.now() - this.lastShown > showIntervalSeconds) {
|
||||
if (!this.visible && this.root.time.now() - this.lastShown > this.showIntervalSeconds) {
|
||||
this.show();
|
||||
}
|
||||
|
||||
|
31
src/js/game/hud/parts/steam_capsule.js
Normal file
31
src/js/game/hud/parts/steam_capsule.js
Normal file
@ -0,0 +1,31 @@
|
||||
import { globalConfig, THIRDPARTY_URLS } from "../../../core/config";
|
||||
import { makeDiv } from "../../../core/utils";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
|
||||
const showCapsuleAfter = 30 * 60;
|
||||
|
||||
export class HUDSteamCapsule extends BaseHUDPart {
|
||||
createElements(parent) {
|
||||
this.element = makeDiv(parent, "ingame_HUD_SteamCapsule");
|
||||
}
|
||||
|
||||
initialize() {
|
||||
const discount = globalConfig.currentDiscount > 0 ? "_discount" + globalConfig.currentDiscount : "";
|
||||
|
||||
this.domAttach = new DynamicDomAttach(this.root, this.element);
|
||||
|
||||
this.trackClicks(this.element, () => {
|
||||
this.root.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_steamcapsule" +
|
||||
discount +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
update() {
|
||||
this.domAttach.update(this.root.time.now() > showCapsuleAfter);
|
||||
}
|
||||
}
|
@ -75,7 +75,7 @@ export class HUDUnlockNotification extends BaseHUDPart {
|
||||
<div class="rewardName">
|
||||
${T.ingame.levelCompleteNotification.unlockText.replace("<reward>", rewardName)}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="rewardDesc">
|
||||
${T.storyRewards[reward].desc}
|
||||
</div>
|
||||
@ -131,6 +131,13 @@ export class HUDUnlockNotification extends BaseHUDPart {
|
||||
|
||||
this.root.hud.signals.unlockNotificationFinished.dispatch();
|
||||
|
||||
if (
|
||||
this.root.hubGoals.level === 7 &&
|
||||
this.root.app.restrictionMgr.getIsStandaloneMarketingActive()
|
||||
) {
|
||||
this.root.hud.parts.standaloneAdvantages.show();
|
||||
}
|
||||
|
||||
if (!this.root.app.settings.getAllSettings().offerHints) {
|
||||
return;
|
||||
}
|
||||
|
@ -2,66 +2,35 @@ import { globalConfig, THIRDPARTY_URLS } from "../../../core/config";
|
||||
import { makeDiv } from "../../../core/utils";
|
||||
import { T } from "../../../translations";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
|
||||
const watermarkShowIntervalSeconds = G_IS_DEV ? 120 : 7 * 60;
|
||||
const watermarkShowDuration = 5;
|
||||
|
||||
export class HUDWatermark extends BaseHUDPart {
|
||||
createElements(parent) {
|
||||
this.element = makeDiv(
|
||||
parent,
|
||||
"ingame_HUD_Watermark",
|
||||
[],
|
||||
`
|
||||
<strong>${T.ingame.watermark.title}</strong>
|
||||
<p>${T.ingame.watermark.desc}
|
||||
</p>
|
||||
|
||||
|
||||
`
|
||||
);
|
||||
|
||||
this.linkElement = makeDiv(
|
||||
parent,
|
||||
"ingame_HUD_WatermarkClicker",
|
||||
globalConfig.currentDiscount.active ? ["withDiscount"] : [],
|
||||
globalConfig.currentDiscount > 0 ? ["withDiscount"] : [],
|
||||
T.ingame.watermark.get_on_steam +
|
||||
(globalConfig.currentDiscount.active
|
||||
? `<span class='discount'>${globalConfig.currentDiscount.amount}% off!</span>`
|
||||
(globalConfig.currentDiscount > 0
|
||||
? `<span class='discount'>${globalConfig.currentDiscount}% off!</span>`
|
||||
: "")
|
||||
);
|
||||
this.trackClicks(this.linkElement, () => {
|
||||
this.root.app.analytics.trackUiClick("watermark_click_2_direct");
|
||||
const discount = globalConfig.currentDiscount.active
|
||||
? "_discount" + globalConfig.currentDiscount.amount
|
||||
: "";
|
||||
const discount =
|
||||
globalConfig.currentDiscount > 0 ? "_discount" + globalConfig.currentDiscount : "";
|
||||
|
||||
this.root.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_watermark" + discount
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_watermark" +
|
||||
discount +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.trackClicks(this.element, this.onWatermarkClick);
|
||||
initialize() {}
|
||||
|
||||
this.domAttach = new DynamicDomAttach(this.root, this.element, {
|
||||
attachClass: "visible",
|
||||
timeToKeepSeconds: 0.5,
|
||||
});
|
||||
}
|
||||
|
||||
update() {
|
||||
this.domAttach.update(
|
||||
this.root.time.realtimeNow() % watermarkShowIntervalSeconds < watermarkShowDuration
|
||||
);
|
||||
}
|
||||
|
||||
onWatermarkClick() {
|
||||
this.root.app.analytics.trackUiClick("watermark_click_2_new");
|
||||
this.root.hud.parts.standaloneAdvantages.show();
|
||||
}
|
||||
update() {}
|
||||
|
||||
/**
|
||||
*
|
||||
@ -70,7 +39,7 @@ export class HUDWatermark extends BaseHUDPart {
|
||||
drawOverlays(parameters) {
|
||||
const w = this.root.gameWidth;
|
||||
|
||||
parameters.context.fillStyle = "rgba(230, 230, 230, 0.9)";
|
||||
parameters.context.fillStyle = "rgba(20, 30, 40, 0.25)";
|
||||
parameters.context.font = "bold " + this.root.app.getEffectiveUiScale() * 40 + "px GameFont";
|
||||
parameters.context.textAlign = "center";
|
||||
parameters.context.fillText(
|
||||
|
@ -31,11 +31,9 @@ import { IS_MOBILE } from "../../core/config";
|
||||
import { HUDKeybindingOverlay } from "../hud/parts/keybinding_overlay";
|
||||
import { HUDWatermark } from "../hud/parts/watermark";
|
||||
import { HUDStandaloneAdvantages } from "../hud/parts/standalone_advantages";
|
||||
import { HUDCatMemes } from "../hud/parts/cat_memes";
|
||||
import { HUDSteamCapsule } from "../hud/parts/steam_capsule";
|
||||
import { HUDPartTutorialHints } from "../hud/parts/tutorial_hints";
|
||||
import { HUDInteractiveTutorial } from "../hud/parts/interactive_tutorial";
|
||||
import { HUDSandboxController } from "../hud/parts/sandbox_controller";
|
||||
import { queryParamOptions } from "../../core/query_parameters";
|
||||
import { MetaBlockBuilding } from "../buildings/block";
|
||||
import { MetaItemProducerBuilding } from "../buildings/item_producer";
|
||||
import { MOD_SIGNALS } from "../../mods/mod_signals";
|
||||
@ -584,7 +582,7 @@ export class RegularGameMode extends GameMode {
|
||||
if (this.root.app.restrictionMgr.getIsStandaloneMarketingActive()) {
|
||||
this.additionalHudParts.watermark = HUDWatermark;
|
||||
this.additionalHudParts.standaloneAdvantages = HUDStandaloneAdvantages;
|
||||
this.additionalHudParts.catMemes = HUDCatMemes;
|
||||
this.additionalHudParts.catMemes = HUDSteamCapsule;
|
||||
}
|
||||
|
||||
if (this.root.app.settings.getAllSettings().offerHints) {
|
||||
|
3
src/js/globals.d.ts
vendored
3
src/js/globals.d.ts
vendored
@ -10,11 +10,10 @@ declare const G_APP_ENVIRONMENT: string;
|
||||
declare const G_HAVE_ASSERT: boolean;
|
||||
declare const G_BUILD_TIME: number;
|
||||
declare const G_IS_STANDALONE: boolean;
|
||||
declare const G_IS_STEAM_DEMO: boolean;
|
||||
declare const G_IS_BROWSER: boolean;
|
||||
declare const G_IS_MOBILE_APP: boolean;
|
||||
|
||||
declare const G_BUILD_COMMIT_HASH: string;
|
||||
declare const G_TRACKING_ENDPOINT: string;
|
||||
declare const G_BUILD_VERSION: string;
|
||||
declare const G_ALL_UI_IMAGES: Array<string>;
|
||||
declare const G_IS_RELEASE: boolean;
|
||||
|
@ -105,6 +105,10 @@ export class ModLoader {
|
||||
}
|
||||
|
||||
exposeExports() {
|
||||
if (G_IS_STEAM_DEMO) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (G_IS_DEV || G_IS_STANDALONE) {
|
||||
let exports = {};
|
||||
const modules = require.context("../", true, /\.js$/);
|
||||
@ -136,6 +140,11 @@ export class ModLoader {
|
||||
}
|
||||
|
||||
async initMods() {
|
||||
if (G_IS_STEAM_DEMO) {
|
||||
this.initialized = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!G_IS_STANDALONE && !G_IS_DEV) {
|
||||
this.initialized = true;
|
||||
return;
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { globalConfig } from "../../core/config";
|
||||
import { createLogger } from "../../core/logging";
|
||||
import { randomInt } from "../../core/utils";
|
||||
import { BeltComponent } from "../../game/components/belt";
|
||||
import { StaticMapEntityComponent } from "../../game/components/static_map_entity";
|
||||
import { RegularGameMode } from "../../game/modes/regular";
|
||||
@ -13,16 +14,26 @@ const logger = createLogger("game_analytics");
|
||||
|
||||
const analyticsUrl = G_IS_DEV ? "http://localhost:8001" : "https://analytics.shapez.io";
|
||||
|
||||
// Be sure to increment the ID whenever it changes to make sure all
|
||||
// users are tracked
|
||||
const analyticsLocalFile = "shapez_token_123.bin";
|
||||
// Be sure to increment the ID whenever it changes
|
||||
const analyticsLocalFile = G_IS_STEAM_DEMO ? "shapez_token_steamdemo.bin" : "shapez_token_123.bin";
|
||||
|
||||
const currentABT = "abt_sa_si";
|
||||
|
||||
export class ShapezGameAnalytics extends GameAnalyticsInterface {
|
||||
constructor(app) {
|
||||
super(app);
|
||||
this.abtVariant = "0";
|
||||
}
|
||||
|
||||
get environment() {
|
||||
if (G_IS_DEV) {
|
||||
return "dev";
|
||||
}
|
||||
|
||||
if (G_IS_STEAM_DEMO) {
|
||||
return "steam-demo";
|
||||
}
|
||||
|
||||
if (G_IS_STANDALONE) {
|
||||
return "steam";
|
||||
}
|
||||
@ -38,6 +49,22 @@ export class ShapezGameAnalytics extends GameAnalyticsInterface {
|
||||
}
|
||||
}
|
||||
|
||||
fetchABVariant() {
|
||||
return this.app.storage.readFileAsync("shapez_" + currentABT + ".bin").then(
|
||||
abt => {
|
||||
this.abtVariant = abt;
|
||||
logger.log("Got abtVariant:", abt);
|
||||
},
|
||||
err => {
|
||||
if (err === FILE_NOT_FOUND) {
|
||||
this.abtVariant = String(randomInt(0, 4));
|
||||
logger.log("Determing abt variant to", this.abtVariant);
|
||||
this.app.storage.writeFileAsync("shapez_" + currentABT + ".bin", this.abtVariant);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
@ -48,46 +75,67 @@ export class ShapezGameAnalytics extends GameAnalyticsInterface {
|
||||
return;
|
||||
}
|
||||
|
||||
setInterval(() => this.sendTimePoints(), 60 * 1000);
|
||||
|
||||
// Retrieve sync key from player
|
||||
return this.app.storage.readFileAsync(analyticsLocalFile).then(
|
||||
syncKey => {
|
||||
this.syncKey = syncKey;
|
||||
logger.log("Player sync key read:", this.syncKey);
|
||||
},
|
||||
error => {
|
||||
// File was not found, retrieve new key
|
||||
if (error === FILE_NOT_FOUND) {
|
||||
logger.log("Retrieving new player key");
|
||||
return this.fetchABVariant().then(() => {
|
||||
setInterval(() => this.sendTimePoints(), 60 * 1000);
|
||||
|
||||
// Perform call to get a new key from the API
|
||||
this.sendToApi("/v1/register", {
|
||||
environment: this.environment,
|
||||
standalone:
|
||||
G_IS_STANDALONE &&
|
||||
this.app.achievementProvider instanceof SteamAchievementProvider,
|
||||
commit: G_BUILD_COMMIT_HASH,
|
||||
})
|
||||
.then(res => {
|
||||
// Try to read and parse the key from the api
|
||||
if (res.key && typeof res.key === "string" && res.key.length === 40) {
|
||||
this.syncKey = res.key;
|
||||
logger.log("Key retrieved:", this.syncKey);
|
||||
this.app.storage.writeFileAsync(analyticsLocalFile, res.key);
|
||||
} else {
|
||||
throw new Error("Bad response from analytics server: " + res);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error("Failed to register on analytics api:", err);
|
||||
});
|
||||
} else {
|
||||
logger.error("Failed to read ga key:", error);
|
||||
}
|
||||
return;
|
||||
if (this.app.restrictionMgr.isLimitedVersion()) {
|
||||
fetch(
|
||||
"https://play.shapez.io/shapez_launch_" +
|
||||
this.environment +
|
||||
"_" +
|
||||
currentABT +
|
||||
"_" +
|
||||
this.abtVariant,
|
||||
{
|
||||
method: "GET",
|
||||
mode: "no-cors",
|
||||
cache: "no-cache",
|
||||
referrer: "no-referrer",
|
||||
credentials: "omit",
|
||||
}
|
||||
).catch(err => {});
|
||||
}
|
||||
);
|
||||
|
||||
return this.app.storage.readFileAsync(analyticsLocalFile).then(
|
||||
syncKey => {
|
||||
this.syncKey = syncKey;
|
||||
logger.log("Player sync key read:", this.syncKey);
|
||||
},
|
||||
error => {
|
||||
// File was not found, retrieve new key
|
||||
if (error === FILE_NOT_FOUND) {
|
||||
logger.log("Retrieving new player key");
|
||||
|
||||
// Perform call to get a new key from the API
|
||||
this.sendToApi("/v1/register", {
|
||||
environment: this.environment,
|
||||
standalone:
|
||||
G_IS_STANDALONE &&
|
||||
!G_IS_STEAM_DEMO &&
|
||||
this.app.achievementProvider instanceof SteamAchievementProvider,
|
||||
commit: G_BUILD_COMMIT_HASH,
|
||||
})
|
||||
.then(res => {
|
||||
// Try to read and parse the key from the api
|
||||
if (res.key && typeof res.key === "string" && res.key.length === 40) {
|
||||
this.syncKey = res.key;
|
||||
logger.log("Key retrieved:", this.syncKey);
|
||||
this.app.storage.writeFileAsync(analyticsLocalFile, res.key);
|
||||
} else {
|
||||
throw new Error("Bad response from analytics server: " + res);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error("Failed to register on analytics api:", err);
|
||||
});
|
||||
} else {
|
||||
logger.error("Failed to read ga key:", error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,7 +0,0 @@
|
||||
import { GameAnalyticsInterface } from "../game_analytics";
|
||||
|
||||
export class NoGameAnalytics extends GameAnalyticsInterface {
|
||||
initialize() {
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
@ -189,7 +189,7 @@ function initializeSettings() {
|
||||
},
|
||||
/**
|
||||
* @param {Application} app
|
||||
*/ app => app.restrictionMgr.getHasExtendedSettings()
|
||||
*/ app => G_IS_STANDALONE
|
||||
),
|
||||
|
||||
new BoolSetting(
|
||||
@ -514,7 +514,7 @@ export class ApplicationSettings extends ReadWriteProxy {
|
||||
const settings = data.settings;
|
||||
|
||||
// MODS
|
||||
if (!THEMES[settings.theme]) {
|
||||
if (!THEMES[settings.theme] || !this.app.restrictionMgr.getHasExtendedSettings()) {
|
||||
console.warn("Resetting theme because its no longer available: " + settings.theme);
|
||||
settings.theme = "light";
|
||||
}
|
||||
@ -700,7 +700,7 @@ export class ApplicationSettings extends ReadWriteProxy {
|
||||
}
|
||||
|
||||
// MODS
|
||||
if (!THEMES[data.settings.theme]) {
|
||||
if (!THEMES[data.settings.theme] || !this.app.restrictionMgr.getHasExtendedSettings()) {
|
||||
console.warn("Resetting theme because its no longer available: " + data.settings.theme);
|
||||
data.settings.theme = "light";
|
||||
}
|
||||
|
@ -38,9 +38,8 @@ export class MainMenuState extends GameState {
|
||||
getInnerHTML() {
|
||||
const showLanguageIcon = !G_CHINA_VERSION && !G_WEGAME_VERSION;
|
||||
const showExitAppButton = G_IS_STANDALONE;
|
||||
const showUpdateLabel = !G_WEGAME_VERSION;
|
||||
const showBrowserWarning = !G_IS_STANDALONE && !isSupportedBrowser();
|
||||
const showPuzzleDLC = !G_WEGAME_VERSION && G_IS_STANDALONE;
|
||||
const showPuzzleDLC = !G_WEGAME_VERSION && G_IS_STANDALONE && !G_IS_STEAM_DEMO;
|
||||
const showWegameFooter = G_WEGAME_VERSION;
|
||||
const hasMods = MODS.anyModsActive();
|
||||
|
||||
@ -69,15 +68,17 @@ export class MainMenuState extends GameState {
|
||||
const ownsPuzzleDLC =
|
||||
G_IS_DEV ||
|
||||
(G_IS_STANDALONE &&
|
||||
!G_IS_STEAM_DEMO &&
|
||||
/** @type { PlatformWrapperImplElectron}*/ (this.app.platformWrapper).dlcs.puzzle);
|
||||
|
||||
const bannerHtml = `
|
||||
<h3>${T.demoBanners.title}</h3>
|
||||
<p>${T.demoBanners.intro}</p>
|
||||
<span class="playtimeDisclaimer">${T.demoBanners.playtimeDisclaimer}</span>
|
||||
<a href="#" class="steamLink ${A_B_TESTING_LINK_TYPE}" target="_blank">
|
||||
${
|
||||
globalConfig.currentDiscount.active
|
||||
? `<span class='discount'>${globalConfig.currentDiscount.amount}% off!</span>`
|
||||
globalConfig.currentDiscount > 0
|
||||
? `<span class='discount'>${globalConfig.currentDiscount}% off!</span>`
|
||||
: ""
|
||||
}
|
||||
|
||||
@ -201,7 +202,7 @@ export class MainMenuState extends GameState {
|
||||
|
||||
<div class="footer ${showExternalLinks ? "" : "noLinks"} ">
|
||||
${
|
||||
showExternalLinks
|
||||
showExternalLinks && !G_IS_STEAM_DEMO
|
||||
? `
|
||||
<a class="githubLink boxLink" target="_blank">
|
||||
${T.mainMenu.openSourceHint}
|
||||
@ -453,11 +454,12 @@ export class MainMenuState extends GameState {
|
||||
|
||||
onSteamLinkClicked() {
|
||||
this.app.analytics.trackUiClick("main_menu_steam_link_" + A_B_TESTING_LINK_TYPE);
|
||||
const discount = globalConfig.currentDiscount.active
|
||||
? "_discount" + globalConfig.currentDiscount.amount
|
||||
: "";
|
||||
const discount = globalConfig.currentDiscount > 0 ? "_discount" + globalConfig.currentDiscount : "";
|
||||
this.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_mainmenu" + discount
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_mainmenu" +
|
||||
discount +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
|
||||
return false;
|
||||
@ -743,7 +745,9 @@ export class MainMenuState extends GameState {
|
||||
getStandalone.add(() => {
|
||||
this.app.analytics.trackUiClick("visit_steampage_from_slot_limit");
|
||||
this.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_slotlimit"
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_slotlimit" +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
});
|
||||
}
|
||||
|
@ -3,6 +3,8 @@ import { TextualGameState } from "../core/textual_game_state";
|
||||
import { MODS } from "../mods/modloader";
|
||||
import { T } from "../translations";
|
||||
|
||||
const MODS_SUPPORTED = !G_IS_STEAM_DEMO && (G_IS_STANDALONE || G_IS_DEV);
|
||||
|
||||
export class ModsState extends TextualGameState {
|
||||
constructor() {
|
||||
super("ModsState");
|
||||
@ -19,12 +21,12 @@ export class ModsState extends TextualGameState {
|
||||
|
||||
<div class="actions">
|
||||
${
|
||||
(G_IS_STANDALONE || G_IS_DEV) && MODS.mods.length > 0
|
||||
MODS_SUPPORTED && MODS.mods.length > 0
|
||||
? `<button class="styledButton browseMods">${T.mods.browseMods}</button>`
|
||||
: ""
|
||||
}
|
||||
${
|
||||
G_IS_STANDALONE || G_IS_DEV
|
||||
MODS_SUPPORTED
|
||||
? `<button class="styledButton openModsFolder">${T.mods.openFolder}</button>`
|
||||
: ""
|
||||
}
|
||||
@ -41,7 +43,7 @@ export class ModsState extends TextualGameState {
|
||||
}
|
||||
|
||||
getMainContentHTML() {
|
||||
if (!G_IS_STANDALONE && !G_IS_DEV) {
|
||||
if (!MODS_SUPPORTED) {
|
||||
return `
|
||||
<div class="noModSupport">
|
||||
|
||||
@ -137,7 +139,9 @@ export class ModsState extends TextualGameState {
|
||||
onSteamLinkClicked() {
|
||||
this.app.analytics.trackUiClick("mods_steam_link");
|
||||
this.app.platformWrapper.openExternalLink(
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink + "/shapez_modsettings"
|
||||
THIRDPARTY_URLS.stanaloneCampaignLink +
|
||||
"/shapez_modsettings" +
|
||||
(G_IS_STEAM_DEMO ? "_steamdemo" : "")
|
||||
);
|
||||
|
||||
return false;
|
||||
|
@ -61,6 +61,26 @@ export class PreloadState extends GameState {
|
||||
this.startLoading();
|
||||
}
|
||||
|
||||
async fetchDiscounts() {
|
||||
await Promise.race([
|
||||
new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
reject("Failed to resolve steam discounts within timeout");
|
||||
}, 2000);
|
||||
}),
|
||||
fetch("https://analytics.shapez.io/v1/discounts")
|
||||
.then(res => res.json())
|
||||
.then(data => {
|
||||
globalConfig.currentDiscount = Number(
|
||||
data["1318690"].data.price_overview.discount_percent
|
||||
);
|
||||
logger.log("Fetched current discount:", globalConfig.currentDiscount);
|
||||
}),
|
||||
]).catch(err => {
|
||||
logger.warn("Failed to fetch current discount:", err);
|
||||
});
|
||||
}
|
||||
|
||||
onLeave() {
|
||||
// this.dialogs.cleanup();
|
||||
}
|
||||
@ -101,6 +121,9 @@ export class PreloadState extends GameState {
|
||||
.then(() => this.app.analytics.initialize())
|
||||
.then(() => this.app.gameAnalytics.initialize())
|
||||
|
||||
.then(() => this.setStatus("Connecting to api"))
|
||||
.then(() => this.fetchDiscounts())
|
||||
|
||||
.then(() => this.setStatus("Initializing settings"))
|
||||
.then(() => {
|
||||
return this.app.settings.initialize();
|
||||
|
@ -36,13 +36,11 @@ export class SettingsState extends TextualGameState {
|
||||
: `
|
||||
<button class="styledButton categoryButton manageMods">${T.mods.title}
|
||||
<span class="newBadge">${T.settings.newBadge}</span>
|
||||
</button>
|
||||
|
||||
`
|
||||
</button>`
|
||||
}
|
||||
|
||||
|
||||
<div class="other">
|
||||
<div class="other ${G_CHINA_VERSION || G_WEGAME_VERSION ? "noabout" : ""}">
|
||||
|
||||
${
|
||||
G_CHINA_VERSION || G_WEGAME_VERSION
|
||||
|
@ -53,7 +53,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo Version
|
||||
intro: Get the standalone to unlock all features!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Play
|
||||
continue: Continue
|
||||
@ -415,9 +424,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 New Buildings
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -433,6 +439,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo - Versió de prova
|
||||
intro: Aconsegueix el joc complet per obtenir totes les característiques!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Jugar
|
||||
continue: Continuar
|
||||
@ -425,9 +434,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nous edificis
|
||||
desc: Automatitza la teva fàbrica completament!
|
||||
upgrades:
|
||||
title: ∞ Nivells de millora
|
||||
desc: La versió demo només en té 5!
|
||||
markers:
|
||||
title: ∞ Marcadors
|
||||
desc: Mai et perdis per el mapa!
|
||||
@ -443,6 +449,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -52,7 +52,16 @@ global:
|
||||
loggingIn: Přihlašuji
|
||||
demoBanners:
|
||||
title: Demo verze
|
||||
intro: Získejte plnou verzi pro odemknutí všech funkcí a obsahu!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Hrát
|
||||
continue: Pokračovat
|
||||
@ -78,8 +87,8 @@ mainMenu:
|
||||
puzzleDlcViewNow: Zobrazit DLC
|
||||
mods:
|
||||
title: Aktivní módy
|
||||
warningPuzzleDLC: Nelze hrát Puzzle DLC společně s módy. Prosím
|
||||
deaktivujte všechny módy, abyste mohli hrát DLC.
|
||||
warningPuzzleDLC: Nelze hrát Puzzle DLC společně s módy. Prosím deaktivujte
|
||||
všechny módy, abyste mohli hrát DLC.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -259,8 +268,8 @@ dialogs:
|
||||
modsDifference:
|
||||
title: Varování o módech
|
||||
desc: Aktuálně nainstalované módy se liší od módů, se kterými byla uložená hra
|
||||
vytvořena. To může způsobit, že se uložená hra rozbije nebo se vůbec nenačte.
|
||||
Jste si jisti, že chcete pokračovat?
|
||||
vytvořena. To může způsobit, že se uložená hra rozbije nebo se vůbec
|
||||
nenačte. Jste si jisti, že chcete pokračovat?
|
||||
missingMods: Chybějící módy
|
||||
newMods: Nově nainstalované módy
|
||||
ingame:
|
||||
@ -416,9 +425,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nových budov
|
||||
desc: Plně automatizujte svou továrnu!
|
||||
upgrades:
|
||||
title: ∞ vylepšení
|
||||
desc: Tato demo verze má pouze 5!
|
||||
markers:
|
||||
title: ∞ Značek
|
||||
desc: Nikdy se neztraťte ve své továrně!
|
||||
@ -434,6 +440,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Získejte je všechny!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zóna
|
||||
zoneWidth: Šířka
|
||||
@ -1008,8 +1017,8 @@ settings:
|
||||
description: Určuje velikost ikon tvarů na náhledu mapy (při oddálení).
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Popisek tvaru – Zobrazit vždy
|
||||
description: Určuje, zda se má vždy zobrazovat nápověda tvaru při najetí na budovy,
|
||||
místo toho, abyste museli držet „ALT“.
|
||||
description: Určuje, zda se má vždy zobrazovat nápověda tvaru při najetí na
|
||||
budovy, místo toho, abyste museli držet „ALT“.
|
||||
rangeSliderPercentage: <amount> %
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: Nové!
|
||||
@ -1291,6 +1300,6 @@ mods:
|
||||
noModSupport: K instalaci módů potřebujete samostatnou verzi hry na Steamu.
|
||||
togglingComingSoon:
|
||||
title: Již brzy
|
||||
description: Aktivace či deaktivace módů je v současné době možná pouze kopírováním
|
||||
souboru módu z nebo do mods/ složky. Nicméně, možnost správy módů přímo
|
||||
ze hry je plánována pro budoucí aktualizaci!
|
||||
description: Aktivace či deaktivace módů je v současné době možná pouze
|
||||
kopírováním souboru módu z nebo do mods/ složky. Nicméně, možnost
|
||||
správy módů přímo ze hry je plánována pro budoucí aktualizaci!
|
||||
|
@ -54,7 +54,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demoversion
|
||||
intro: Køb spillet for at få den fulde oplevelse!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Spil
|
||||
continue: Fortsæt
|
||||
@ -79,8 +88,8 @@ mainMenu:
|
||||
puzzleDlcViewNow: Se DLC
|
||||
mods:
|
||||
title: Active Mods
|
||||
warningPuzzleDLC: Det er ikke muligt at spille Puzzle DLC med mods. Slå
|
||||
alle mods fra for at spille DLC.
|
||||
warningPuzzleDLC: Det er ikke muligt at spille Puzzle DLC med mods. Slå alle
|
||||
mods fra for at spille DLC.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -417,9 +426,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nye Bygninger
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -435,6 +441,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
@ -820,9 +829,10 @@ storyRewards:
|
||||
reward_logic_gates:
|
||||
title: Logic Gates
|
||||
desc: Du har oplåst <strong>logiske porte</strong>! Du behøver ikke være
|
||||
ellevild over dette, men det er faktisk virkelig sejt!<br><br> Med de porte
|
||||
kan du beregne AND-, OR-, XOR- og NOT-operationer.<br><br> Og som
|
||||
en bonus har jeg også gived dig <strong>transistoren</strong>!
|
||||
ellevild over dette, men det er faktisk virkelig sejt!<br><br> Med
|
||||
de porte kan du beregne AND-, OR-, XOR- og NOT-operationer.<br><br>
|
||||
Og som en bonus har jeg også gived dig
|
||||
<strong>transistoren</strong>!
|
||||
reward_virtual_processing:
|
||||
title: Virtual Processing
|
||||
desc: I just gave a whole bunch of new buildings which allow you to
|
||||
@ -1180,7 +1190,8 @@ tips:
|
||||
- Building too close to the hub can get in the way of later projects.
|
||||
- The pin icon next to each shape in the upgrade list pins it to the screen.
|
||||
- Bland alle grundfarverne for at lave hvid farve!
|
||||
- Du har en uendeligt stor verden, lad være med at kramme fabrikken sammen. Udvid!
|
||||
- Du har en uendeligt stor verden, lad være med at kramme fabrikken sammen.
|
||||
Udvid!
|
||||
- Prøv også Factorio. Det er mit yndlingsspil!
|
||||
- The quad cutter cuts clockwise starting from the top right!
|
||||
- Du kan downloade dine gemte spil i hovedmenuen!
|
||||
@ -1255,10 +1266,10 @@ backendErrors:
|
||||
ratelimit: You are performing your actions too frequent. Please wait a bit.
|
||||
invalid-api-key: Kunne ikke forbinde til backend. Vær venlig at prøve igen eller
|
||||
at opdatere/genstarte dit spil (Invalid Api Key).
|
||||
unauthorized: Kunne ikke forbinde til backend. Vær venlig at prøve igen eller
|
||||
at opdatere/genstarte dit spil (Unauthorized).
|
||||
bad-token: Kunne ikke forbinde til backend. Vær venlig at opdatere/genstarte
|
||||
dit spil (Bad Token).
|
||||
unauthorized: Kunne ikke forbinde til backend. Vær venlig at prøve igen eller at
|
||||
opdatere/genstarte dit spil (Unauthorized).
|
||||
bad-token: Kunne ikke forbinde til backend. Vær venlig at opdatere/genstarte dit
|
||||
spil (Bad Token).
|
||||
bad-id: Invalid puzzle identifier.
|
||||
not-found: The given puzzle could not be found.
|
||||
bad-category: The given category could not be found.
|
||||
|
@ -26,7 +26,7 @@ global:
|
||||
loading: Laden
|
||||
error: Fehler
|
||||
loggingIn: Einloggen
|
||||
thousandsDivider: "."
|
||||
thousandsDivider: .
|
||||
decimalSeparator: ","
|
||||
suffix:
|
||||
thousands: k
|
||||
@ -56,7 +56,16 @@ global:
|
||||
space: LEER
|
||||
demoBanners:
|
||||
title: Demoversion
|
||||
intro: Kauf die Vollversion für alle Features!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Spielen
|
||||
continue: Fortsetzen
|
||||
@ -82,7 +91,8 @@ mainMenu:
|
||||
puzzleDlcViewNow: DLC anzeigen
|
||||
mods:
|
||||
title: Aktive Mods
|
||||
warningPuzzleDLC: Das Puzzle-DLC und Mods sind nicht kompatibel. Bitte deaktiviere zuerst alle Mods, um das DLC zu spielen.
|
||||
warningPuzzleDLC: Das Puzzle-DLC und Mods sind nicht kompatibel. Bitte
|
||||
deaktiviere zuerst alle Mods, um das DLC zu spielen.
|
||||
puzzleMenu:
|
||||
play: Spielen
|
||||
edit: Bearbeiten
|
||||
@ -330,8 +340,10 @@ dialogs:
|
||||
rückgängig gemacht werden!
|
||||
modsDifference:
|
||||
title: Geänderte Mods
|
||||
desc: Zwischen den derzeit und bei der Erstellung des Spielstands installierten Mods wurde ein Unterschied festgestellt.
|
||||
Das kann dazu führen, dass dein Spielstand zerstört wird, oder gar nicht erst lädt. Willst du ihn wirklich laden?
|
||||
desc: Zwischen den derzeit und bei der Erstellung des Spielstands installierten
|
||||
Mods wurde ein Unterschied festgestellt. Das kann dazu führen, dass
|
||||
dein Spielstand zerstört wird, oder gar nicht erst lädt. Willst du
|
||||
ihn wirklich laden?
|
||||
missingMods: Fehlende Mods
|
||||
newMods: Neu installierte Mods
|
||||
ingame:
|
||||
@ -490,9 +502,6 @@ ingame:
|
||||
achievements:
|
||||
title: Errungenschaften
|
||||
desc: Hol sie dir alle!
|
||||
upgrades:
|
||||
title: ∞ Upgrade-Stufen
|
||||
desc: Diese Demo hat nur 5!
|
||||
markers:
|
||||
title: ∞ Markierungen
|
||||
desc: Verliere nie den Überblick!
|
||||
@ -505,6 +514,9 @@ ingame:
|
||||
support:
|
||||
title: Unterstütze Mich
|
||||
desc: Ich entwickle das Spiel in meiner Freizeit!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Breite
|
||||
@ -959,13 +971,16 @@ mods:
|
||||
openFolder: Modordner öffnen
|
||||
folderOnlyStandalone: Du kannst den Modordner nur in der Vollversion öffnen.
|
||||
browseMods: Mods durchsuchen
|
||||
modsInfo: Um Mods zu installieren und zu verwalten, kopiere sie in den Modordner im Spielverzeichnis.
|
||||
Diesen kannst du auch mit dem 'Modordner öffnen'-Knopf oben rechts aufrufen.
|
||||
modsInfo: Um Mods zu installieren und zu verwalten, kopiere sie in den Modordner
|
||||
im Spielverzeichnis. Diesen kannst du auch mit dem 'Modordner
|
||||
öffnen'-Knopf oben rechts aufrufen.
|
||||
noModSupport: Du brauchst die Steam-Vollversion, um Mods zu installieren.
|
||||
togglingComingSoon:
|
||||
title: Demnächst
|
||||
description: Du kannst Mods aktuell nur (de-)aktivieren, indem du die entsprechende Datei in den Modordner einfügst, oder löschst.
|
||||
Das (De-)Aktivieren der Mods in diesem Menü ist allerdings schon für ein späteres Update geplant!
|
||||
description: Du kannst Mods aktuell nur (de-)aktivieren, indem du die
|
||||
entsprechende Datei in den Modordner einfügst, oder löschst. Das
|
||||
(De-)Aktivieren der Mods in diesem Menü ist allerdings schon für ein
|
||||
späteres Update geplant!
|
||||
settings:
|
||||
title: Einstellungen
|
||||
categories:
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo Version
|
||||
intro: Get the standalone to unlock all features!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Παίξε
|
||||
changelog: Changelog
|
||||
@ -431,9 +440,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 New Buildings
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -449,6 +455,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -22,7 +22,7 @@
|
||||
---
|
||||
steamPage:
|
||||
# This is the short text appearing on the steam page
|
||||
shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
|
||||
shortText: shapez is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
|
||||
|
||||
# This is the text shown above the Discord link
|
||||
discordLinkShort: Official Discord
|
||||
@ -30,18 +30,18 @@ steamPage:
|
||||
intro: >-
|
||||
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 have to spread out on the infinite map.
|
||||
shapez 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.
|
||||
|
||||
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!
|
||||
|
||||
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 first and decide later!
|
||||
|
||||
what_others_say: What people say about shapez.io
|
||||
what_others_say: What people say about shapez
|
||||
|
||||
nothernlion_comment: >-
|
||||
This game is great - I'm having a wonderful time playing, and time has flown by.
|
||||
notch_comment: >-
|
||||
Oh crap. I really should sleep, but I think I just figured out how to make a computer in shapez.io
|
||||
Oh crap. I really should sleep, but I think I just figured out how to make a computer in shapez
|
||||
steam_review_comment: >-
|
||||
This game has stolen my life and I don't want it back. Very chill factory game that won't let me stop making my lines more efficient.
|
||||
|
||||
@ -94,9 +94,18 @@ global:
|
||||
|
||||
demoBanners:
|
||||
# This is the "advertisement" shown in the main menu and other various places
|
||||
title: Demo Version
|
||||
title: Demo
|
||||
intro: >-
|
||||
Get the full game to unlock all features and content!
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: >-
|
||||
The full version contains more than <strong>24 hours of content</strong>.
|
||||
|
||||
mainMenu:
|
||||
play: Play
|
||||
@ -141,7 +150,7 @@ puzzleMenu:
|
||||
validatingPuzzle: Validating Puzzle
|
||||
submittingPuzzle: Submitting Puzzle
|
||||
noPuzzles: There are currently no puzzles in this section.
|
||||
dlcHint: Purchased the DLC already? Make sure it is activated by right clicking shapez.io in your library, selecting Properties > DLCs.
|
||||
dlcHint: Purchased the DLC already? Make sure it is activated by right clicking shapez in your library, selecting Properties > DLCs.
|
||||
|
||||
categories:
|
||||
levels: Levels
|
||||
@ -654,7 +663,7 @@ ingame:
|
||||
|
||||
support:
|
||||
title: Support me
|
||||
desc: I develop the game in my spare time!
|
||||
desc: I develop shapez in my spare time!
|
||||
|
||||
# puzzle mode
|
||||
puzzleEditorSettings:
|
||||
@ -1111,7 +1120,7 @@ mods:
|
||||
|
||||
modsInfo: >-
|
||||
To install and manage mods, copy them to the mods folder (use the 'Open Mods Folder' button). Be sure to restart the game afterwards, otherwise the mods will not show up.
|
||||
noModSupport: You need the full version on Steam to install mods.
|
||||
noModSupport: Get the full version on Steam to install mods!
|
||||
|
||||
togglingComingSoon:
|
||||
title: Coming Soon
|
||||
@ -1427,7 +1436,7 @@ about:
|
||||
body: >-
|
||||
This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br>
|
||||
|
||||
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on GitHub</a>.<br><br>
|
||||
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez on GitHub</a>.<br><br>
|
||||
|
||||
This game wouldn't have been possible without the great Discord community around my games - You should really join the <a href="<discordlink>" target="_blank">Discord server</a>!<br><br>
|
||||
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Iniciando sesión
|
||||
demoBanners:
|
||||
title: Versión de prueba
|
||||
intro: ¡Obtén el juego completo para desbloquear todas las características!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Jugar
|
||||
continue: Continuar
|
||||
@ -429,9 +438,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 nuevos edificios
|
||||
desc: ¡Automatiza completamente tu fabrica!
|
||||
upgrades:
|
||||
title: Niveles infinitos de mejoras
|
||||
desc: ¡Esta demo solo tiene 5!
|
||||
markers:
|
||||
title: Marcadores infinitos
|
||||
desc: ¡Nunca te pierdas en tu propia fabrica!
|
||||
@ -447,6 +453,9 @@ ingame:
|
||||
achievements:
|
||||
title: Logros
|
||||
desc: Atrapalos a todos!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Área
|
||||
zoneWidth: Anchura
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demoversio
|
||||
intro: Hanki pelin täysversio avataksesi kaikki ominaisuudet!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Pelaa
|
||||
continue: Jatka
|
||||
@ -417,9 +426,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Uutta laitetta
|
||||
desc: Automatisoi tehtaasi täysin!
|
||||
upgrades:
|
||||
title: ∞ päivitystasoa
|
||||
desc: Kokeiluversiossa on vain viisi!
|
||||
markers:
|
||||
title: ∞ Merkit
|
||||
desc: Älä koskaan eksy tehtaassasi!
|
||||
@ -435,6 +441,9 @@ ingame:
|
||||
achievements:
|
||||
title: Saavutukset
|
||||
desc: Metsästä kaikki!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -53,7 +53,16 @@ global:
|
||||
loggingIn: Se connecter
|
||||
demoBanners:
|
||||
title: Version de démo
|
||||
intro: Achetez la version complète pour débloquer toutes les fonctionnalités !
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Jouer
|
||||
continue: Continuer
|
||||
@ -108,8 +117,9 @@ dialogs:
|
||||
text: "Impossible de charger votre sauvegarde :"
|
||||
confirmSavegameDelete:
|
||||
title: Confirmez la suppression
|
||||
text: Êtes-vous sûr de vouloir supprimer cette partie ?<br><br> « <savegameName> »
|
||||
au niveau <savegameLevel><br><br> Ce sera définitif !
|
||||
text: Êtes-vous sûr de vouloir supprimer cette partie ?<br><br>
|
||||
« <savegameName> » au niveau <savegameLevel><br><br> Ce sera
|
||||
définitif !
|
||||
savegameDeletionError:
|
||||
title: Impossible de supprimer
|
||||
text: "Impossible de supprimer votre sauvegarde :"
|
||||
@ -428,9 +438,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 nouveaux bâtiments
|
||||
desc: Automatisez entièrement votre usine !
|
||||
upgrades:
|
||||
title: ∞ niveaux d’amélioration
|
||||
desc: Cette version de démonstration n’en a que 5 !
|
||||
markers:
|
||||
title: Balises ∞
|
||||
desc: Ne vous perdez plus jamais dans votre usine !
|
||||
@ -446,6 +453,9 @@ ingame:
|
||||
achievements:
|
||||
title: Succès
|
||||
desc: Débloquez-les tous !
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Largeur
|
||||
@ -456,7 +466,6 @@ ingame:
|
||||
report: Signaler
|
||||
clearBuildings: Effacer les Constructions
|
||||
resetPuzzle: Réinitialiser le Puzzle
|
||||
|
||||
puzzleEditorControls:
|
||||
title: Créateur de Puzzles
|
||||
instructions:
|
||||
@ -476,7 +485,6 @@ ingame:
|
||||
- 6. Une fois publié <strong>tous les bâtiments seront
|
||||
supprimés</strong> sauf les générateurs et les récepteurs - C'est
|
||||
la partie ou le joueur est censé se débrouiller seul :)
|
||||
|
||||
puzzleCompletion:
|
||||
title: Puzzle Résolu !
|
||||
titleLike: "Cliquez sur le cœur si vous avez aimé le Puzzle:"
|
||||
@ -641,8 +649,8 @@ buildings:
|
||||
couleur ou « 1 »).
|
||||
not:
|
||||
name: Porte NON
|
||||
description: Émet un « 1 » booléen si l’entrée n’est pas vraie (une forme, couleur
|
||||
ou « 1 »).
|
||||
description: Émet un « 1 » booléen si l’entrée n’est pas vraie (une forme,
|
||||
couleur ou « 1 »).
|
||||
xor:
|
||||
name: Porte OU-EXCLUSIF
|
||||
description: Émet un « 1 » booléen si une des entrées est vraie (une forme,
|
||||
@ -684,8 +692,9 @@ buildings:
|
||||
comparator:
|
||||
default:
|
||||
name: Comparateur
|
||||
description: Émet « 1 » si les deux entrées sont exactement les mêmes, sinon émet
|
||||
« 0 ». Peut comparer des formes, des couleurs, et des booléens.
|
||||
description: Émet « 1 » si les deux entrées sont exactement les mêmes, sinon
|
||||
émet « 0 ». Peut comparer des formes, des couleurs, et des
|
||||
booléens.
|
||||
virtual_processor:
|
||||
default:
|
||||
name: Découpeur virtuel
|
||||
@ -1359,13 +1368,17 @@ mods:
|
||||
version: Version
|
||||
modWebsite: Page web
|
||||
openFolder: Ouvrir le dossier des mods
|
||||
folderOnlyStandalone: Ouvrir le dossier des mods est uniquement possible avec la version complète
|
||||
folderOnlyStandalone: Ouvrir le dossier des mods est uniquement possible avec la
|
||||
version complète
|
||||
browseMods: Chercher les Mods
|
||||
modsInfo: Pour installer et gérer les mods, copier-les dans le dossier Mods dans le répertoire du jeu.
|
||||
Vous pouvez aussi utiliser le bouton 'Ouvrir le dossier des Mods' en haut à droite
|
||||
noModSupport: Vous avez besoin de la version complète sur Steam pour installer des mods.
|
||||
modsInfo: Pour installer et gérer les mods, copier-les dans le dossier Mods dans
|
||||
le répertoire du jeu. Vous pouvez aussi utiliser le bouton 'Ouvrir le
|
||||
dossier des Mods' en haut à droite
|
||||
noModSupport: Vous avez besoin de la version complète sur Steam pour installer
|
||||
des mods.
|
||||
togglingComingSoon:
|
||||
title: Bientôt disponible
|
||||
description: Activer ou désactiver un mod est pour le moment possible qu'en
|
||||
copiant le fichier du mod depuis ou vers le dossier des mods. Cependant,
|
||||
activer ou désactiver un mod est prévu pour une mise à jour future !
|
||||
copiant le fichier du mod depuis ou vers le dossier des mods.
|
||||
Cependant, activer ou désactiver un mod est prévu pour une mise à
|
||||
jour future !
|
||||
|
@ -52,7 +52,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: גרסאת דמו
|
||||
intro: תשיג את המשחק המלא כדי לפתוח את כל הפיצ'רים
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: שחק
|
||||
continue: המשך
|
||||
@ -406,9 +415,6 @@ ingame:
|
||||
achievements:
|
||||
title: הישגים
|
||||
desc: "!השג את כולם"
|
||||
upgrades:
|
||||
title: רמות לשדרוגים ∞
|
||||
desc: "!לגרסת הדמו הזאת יש רק 5"
|
||||
markers:
|
||||
title: סימונים ∞
|
||||
desc: "!אף פעם לא תלך לאיבוד במפעל שלך"
|
||||
@ -421,6 +427,9 @@ ingame:
|
||||
support:
|
||||
title: תמוך בי
|
||||
desc: "!אני יצרתי רת המשחק הזה בזמני החופשי"
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -55,7 +55,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo Verzija
|
||||
intro: Nabavi samostalnu igru kako bi otključao sve značajke!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Igraj
|
||||
continue: Nastavi
|
||||
@ -417,9 +426,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 New Buildings
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -435,6 +441,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -53,7 +53,16 @@ global:
|
||||
loggingIn: Bejelentkezés
|
||||
demoBanners:
|
||||
title: Demó verzió
|
||||
intro: Vásárold meg az Önálló Verziót a teljes játékélményért!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Játék
|
||||
continue: Folytatás
|
||||
@ -421,9 +430,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Új Épület
|
||||
desc: Egy teljesen automatikus gyárhoz!
|
||||
upgrades:
|
||||
title: ∞ Fejlesztési Szint
|
||||
desc: A Demó Verzió csak 5-öt tartalmaz!
|
||||
markers:
|
||||
title: ∞ Jelölő
|
||||
desc: Hogy mindig tudd, mi hol van!
|
||||
@ -439,6 +445,9 @@ ingame:
|
||||
achievements:
|
||||
title: Steam Achievementek
|
||||
desc: Szerezd meg mindet!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zóna
|
||||
zoneWidth: Szélesség
|
||||
|
@ -53,7 +53,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Versi Demo
|
||||
intro: Dapatkan versi lengkap untuk membuka semua fitur!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Mulai Permainan
|
||||
continue: Lanjutkan
|
||||
@ -426,9 +435,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Bangunan Baru
|
||||
desc: Untuk membuat pabrik yang otomatis sepenuhnya!
|
||||
upgrades:
|
||||
title: ∞ Tingkatan Upgrade
|
||||
desc: Versi demo ini hanya punya 5!
|
||||
markers:
|
||||
title: ∞ Penanda
|
||||
desc: Kamu tidak akan tersesat di pabrikmu sendiri!
|
||||
@ -444,6 +450,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Versione Demo
|
||||
intro: Ottieni la versione completa per sbloccare tutte le funzioni!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Gioca
|
||||
changelog: Registro modifiche
|
||||
@ -432,9 +441,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 nuovi edifici
|
||||
desc: Automatizza completamente la tua fabbrica!
|
||||
upgrades:
|
||||
title: ∞ gradi di miglioramenti
|
||||
desc: Questa demo ne ha solo 5!
|
||||
markers:
|
||||
title: ∞ etichette
|
||||
desc: Non perderti nella tua fabbrica!
|
||||
@ -450,6 +456,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievement
|
||||
desc: Collezionali tutti!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zona
|
||||
zoneWidth: Larghezza
|
||||
|
@ -48,7 +48,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: デモ版
|
||||
intro: スタンドアローン版を手に入れ、すべての機能をアンロックしましょう!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: プレイ
|
||||
continue: 続きから
|
||||
@ -381,9 +390,6 @@ ingame:
|
||||
buildings:
|
||||
title: 新しい18個の設置物
|
||||
desc: あなたの工場を完全自動化しましょう!
|
||||
upgrades:
|
||||
title: 無限のアップグレード段階
|
||||
desc: このデモバージョンでは5段階のみです!
|
||||
markers:
|
||||
title: 無限個のマップマーカー
|
||||
desc: これでもうあなたの工場を見失いません!
|
||||
@ -399,6 +405,9 @@ ingame:
|
||||
achievements:
|
||||
title: アチーブメント
|
||||
desc: 取り尽くせ!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
@ -1014,9 +1023,9 @@ tips:
|
||||
- 切断機は配置された向きを考慮せず、常に垂直に切断します。
|
||||
- ストレージは左側の出力を優先します。
|
||||
- 増築可能なデザインを目指してみましょう。それだけの価値があります!
|
||||
- <b>ALT</b>を押しながらベルトを設置すると、向きを逆転できます。
|
||||
- ハブから遠くに離れるほど、形状資源はより複雑な形になります。
|
||||
- 機械の速度には上限があるので、最大効率を得るためには入力を分割してください。
|
||||
- Invest time to build repeatable designs - it's worth it!
|
||||
- Holding <b>SHIFT</b> lets you place multiple buildings at a time.
|
||||
- You can hold <b>ALT</b> to invert the direction of placed belts.
|
||||
- 効率を最大化するために分配機/合流機を使用できます。
|
||||
- 構成が重要です。ベルトを交差させすぎないようにしてください。
|
||||
- 事前設計が重要です。さもないとぐちゃぐちゃになりますよ!
|
||||
@ -1030,10 +1039,10 @@ tips:
|
||||
- モジュールがあれば、空間はただの認識に過ぎなくなる――生ある人間に対する気遣いだ。
|
||||
- 設計図としての工場を別に作っておくと、工場のモジュール化において重要な役割を果たします。
|
||||
- 混色機をよく見ると、色の混ぜ方が解ります。
|
||||
- <b>CTRL</b>を押したままクリックすると、領域を選択できます。
|
||||
- With modules, space is merely a perception; a concern for mortal men.
|
||||
- アップグレードリストの各形状の横にあるピンのアイコンは、その形状を画面左に固定表示します。
|
||||
- 三原色全てを混ぜ合わせると白になります!
|
||||
- マップは無限の広さがあります。臆せずに拡張してください。
|
||||
- Use <b>CTRL</b> + Click to select an area.
|
||||
- Factorioもプレイしてみてください! 私のお気に入りのゲームです。
|
||||
- 切断機(四分割)は右上から時計回りに切断します。
|
||||
- メインメニューからセーブデータを保存できます!
|
||||
@ -1044,6 +1053,10 @@ tips:
|
||||
- F4を押すことで、FPSとTickレートを表示できます。
|
||||
- F4を2回押すと、マウスとカメラの座標を表示できます。
|
||||
- 左のピン留めされた図形をクリックすると、ピン留めを解除できます。
|
||||
- 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.
|
||||
puzzleMenu:
|
||||
play: Play
|
||||
edit: Edit
|
||||
|
@ -50,7 +50,16 @@ global:
|
||||
loggingIn: 로그인 중
|
||||
demoBanners:
|
||||
title: 체험판 버전
|
||||
intro: 정식 버전을 구매해서 모든 콘텐츠를 사용해 보세요!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: 시작
|
||||
changelog: 버전 기록
|
||||
@ -58,8 +67,7 @@ mainMenu:
|
||||
openSourceHint: 이 게임은 오픈 소스입니다!
|
||||
discordLink: 공식 디스코드 서버
|
||||
helpTranslate: 번역을 도와주세요!
|
||||
browserWarning:
|
||||
이 게임은 현재 브라우저에서 느리게 작동하는 것으로 알려져 있습니다! 더 좋은 성능을 위해 정식 버전을 구매하거나
|
||||
browserWarning: 이 게임은 현재 브라우저에서 느리게 작동하는 것으로 알려져 있습니다! 더 좋은 성능을 위해 정식 버전을 구매하거나
|
||||
Google Chrome 브라우저를 다운로드하세요.
|
||||
savegameLevel: 레벨 <x>
|
||||
savegameLevelUnknown: 미확인 레벨
|
||||
@ -75,8 +83,7 @@ mainMenu:
|
||||
puzzleDlcViewNow: DLC 보러 가기
|
||||
mods:
|
||||
title: Active Mods
|
||||
warningPuzzleDLC: 퍼즐 DLC는 모드와 호환되지 않습니다. DLC 플레이 전
|
||||
모든 모드를 비활성화 해주세요.
|
||||
warningPuzzleDLC: 퍼즐 DLC는 모드와 호환되지 않습니다. DLC 플레이 전 모든 모드를 비활성화 해주세요.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: 확인
|
||||
@ -132,8 +139,7 @@ dialogs:
|
||||
desc: 지난번 플레이 이후 변경 사항은 다음과 같습니다.
|
||||
upgradesIntroduction:
|
||||
title: 업그레이드 하기
|
||||
desc:
|
||||
<strong>기존의 공장을 허물지 마세요!</strong> 여러분이 그동안 만들어 수집한 모든 도형은 업그레이드에 사용됩니다.
|
||||
desc: <strong>기존의 공장을 허물지 마세요!</strong> 여러분이 그동안 만들어 수집한 모든 도형은 업그레이드에 사용됩니다.
|
||||
업그레이드 버튼은 화면의 오른쪽 위에 있습니다.
|
||||
massDeleteConfirm:
|
||||
title: 삭제 확인
|
||||
@ -146,8 +152,7 @@ dialogs:
|
||||
desc: 12 레벨부터 청사진 기능이 해금됩니다!
|
||||
keybindingsIntroduction:
|
||||
title: 유용한 조작법
|
||||
desc:
|
||||
"이 게임에는 거대한 공장을 수월하게 세우기 위한 많은 조작법이 있습니다. 아래는 그 대표적인 것이며, 자세한 조작법은
|
||||
desc: "이 게임에는 거대한 공장을 수월하게 세우기 위한 많은 조작법이 있습니다. 아래는 그 대표적인 것이며, 자세한 조작법은
|
||||
<strong>조작법 설정</strong>을 참고해주세요!<br><br> <code
|
||||
class='keybinding'>CTRL</code> + 드래그: 영역을 선택합니다.<br> <code
|
||||
class='keybinding'>SHIFT</code>: 누르는 동안 같은 건물을 여러개 배치할 수 있습니다.<br>
|
||||
@ -161,8 +166,7 @@ dialogs:
|
||||
desc: 체험판 버전에서는 마커를 2개 까지만 배치할 수 있습니다. 정식 버전을 구입하면 마커를 무제한으로 배치할 수 있습니다!
|
||||
exportScreenshotWarning:
|
||||
title: 스크린샷 내보내기
|
||||
desc:
|
||||
당신의 공장을 스크린샷으로 내보내려 합니다. 매우 거대한 크기의 공장이라면 그 처리 시간이 상당히 오래 걸릴 것이며, 최악의 경우
|
||||
desc: 당신의 공장을 스크린샷으로 내보내려 합니다. 매우 거대한 크기의 공장이라면 그 처리 시간이 상당히 오래 걸릴 것이며, 최악의 경우
|
||||
게임이 중단될 수 있습니다!
|
||||
massCutInsufficientConfirm:
|
||||
title: 자르기 확인
|
||||
@ -188,8 +192,7 @@ dialogs:
|
||||
submitPuzzle:
|
||||
title: 퍼즐 보내기
|
||||
descName: "퍼즐에 이름을 지어 주세요:"
|
||||
descIcon:
|
||||
"퍼즐의 아이콘으로 보여지게 될 짧은 단어를 지정해 주세요. (<link>이곳</link>에서 생성하시거나, 아래 랜덤한 도형
|
||||
descIcon: "퍼즐의 아이콘으로 보여지게 될 짧은 단어를 지정해 주세요. (<link>이곳</link>에서 생성하시거나, 아래 랜덤한 도형
|
||||
중 하나를 선택하세요):"
|
||||
placeholderName: 퍼즐 제목
|
||||
puzzleResizeBadBuildings:
|
||||
@ -215,8 +218,7 @@ dialogs:
|
||||
desc: 오프라인 모드임으로 퍼즐을 저장하거나 업로드할 수 없습니다. 그래도 계속하시겠습니까?
|
||||
puzzlePlayRegularRecommendation:
|
||||
title: 권장 사항
|
||||
desc:
|
||||
퍼즐 DLC 플레이시 소개되지 않은 요소를 접하시게 될 수 있으므로, 적어도 일반 게임을 12레벨까지 플레이하시는것을
|
||||
desc: 퍼즐 DLC 플레이시 소개되지 않은 요소를 접하시게 될 수 있으므로, 적어도 일반 게임을 12레벨까지 플레이하시는것을
|
||||
<strong>강력히</strong> 권장드립니다. 그래도 계속하시겠습니까?
|
||||
puzzleShare:
|
||||
title: 짧은 키 복사됨
|
||||
@ -323,31 +325,25 @@ ingame:
|
||||
waypoints:
|
||||
waypoints: 마커
|
||||
hub: 허브
|
||||
description:
|
||||
마커를 좌클릭하여 그곳으로 이동하고, 우클릭으로 삭제할 수 있습니다.<br><br>마커를 배치하기 위해
|
||||
description: 마커를 좌클릭하여 그곳으로 이동하고, 우클릭으로 삭제할 수 있습니다.<br><br>마커를 배치하기 위해
|
||||
<keybinding> 키로 지금 있는 위치에, 또는 <strong>우클릭</strong>하여 원하는 위치에 배치할 수
|
||||
있습니다.
|
||||
creationSuccessNotification: 마커가 성공적으로 생성되었습니다.
|
||||
interactiveTutorial:
|
||||
title: 튜토리얼
|
||||
hints:
|
||||
1_1_extractor:
|
||||
<strong>원형 도형</strong>을 추출하기 위해 그 위에 <strong>추출기</strong>를 선택한 뒤
|
||||
1_1_extractor: <strong>원형 도형</strong>을 추출하기 위해 그 위에 <strong>추출기</strong>를 선택한 뒤
|
||||
배치하여 추출하세요!
|
||||
1_2_conveyor:
|
||||
"이제 <strong>컨베이어 벨트</strong>를 추출기와 허브를 서로 연결하세요!<br><br> 팁: 벨트를
|
||||
1_2_conveyor: "이제 <strong>컨베이어 벨트</strong>를 추출기와 허브를 서로 연결하세요!<br><br> 팁: 벨트를
|
||||
마우스로 <strong>클릭한 뒤 드래그</strong>하세요!"
|
||||
1_3_expand:
|
||||
"이 게임은 방치형 게임이 <strong>아닙니다</strong>! 더 많은 추출기와 벨트를 만들어 지정된 목표를 빨리
|
||||
1_3_expand: "이 게임은 방치형 게임이 <strong>아닙니다</strong>! 더 많은 추출기와 벨트를 만들어 지정된 목표를 빨리
|
||||
달성하세요.<br><br> 팁: <strong>SHIFT</strong> 키를 누른 상태에서는 빠르게 배치할 수
|
||||
있고, <strong>R</strong> 키를 눌러 회전할 수 있습니다."
|
||||
2_1_place_cutter:
|
||||
"이제 <strong>절단기</strong>를 배치해 원형 도형을 반으로 잘라보세요!<br><br> 참고:
|
||||
2_1_place_cutter: "이제 <strong>절단기</strong>를 배치해 원형 도형을 반으로 잘라보세요!<br><br> 참고:
|
||||
절단기는 놓는 방향에 상관없이 항상 <strong>위에서 아래로만</strong> 자릅니다."
|
||||
2_2_place_trash: 절단기가 <strong>막히거나 멈출 수 있습니다</strong>!<br><br>
|
||||
<strong>휴지통</strong>을 사용하여 현재 필요없는 쓰레기 도형 (!)을 제거하세요.
|
||||
2_3_more_cutters:
|
||||
"잘하셨습니다! 느린 처리 속도를 보완하기 위해 <strong>절단기를 두 개</strong> 이상
|
||||
2_3_more_cutters: "잘하셨습니다! 느린 처리 속도를 보완하기 위해 <strong>절단기를 두 개</strong> 이상
|
||||
배치해보세요!<br><br> 추신: <strong>상단 숫자 단축키 (0~9)</strong>를 사용하여 건물을
|
||||
빠르게 선택할 수 있습니다!"
|
||||
3_1_rectangles: "이제 사각형 도형을 추출해 볼까요! <strong>추출기 네 개를 배치</strong>하고 허브와
|
||||
@ -355,12 +351,10 @@ ingame:
|
||||
누른 채 드래그하세요!"
|
||||
21_1_place_quad_painter: <strong>4단 색칠기</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>를 눌러 전선 레이어 로 전환하세요!<br><br> 그 후 색칠기의
|
||||
<strong>네 입력 부분</strong>을 모두 케이블로 연결하세요!
|
||||
21_3_place_button: 훌륭해요! 이제 <strong>스위치</strong>를 배치하고 전선으로 연결하세요!
|
||||
21_4_press_button:
|
||||
"스위치를 눌러서 색칠기에 <strong>참 신호를 보내</strong> 활성화해보세요.<br><br> 추신:
|
||||
21_4_press_button: "스위치를 눌러서 색칠기에 <strong>참 신호를 보내</strong> 활성화해보세요.<br><br> 추신:
|
||||
모든 입력을 연결할 필요는 없습니다! 두개만 연결해 보세요."
|
||||
colors:
|
||||
red: 빨간색
|
||||
@ -394,9 +388,6 @@ ingame:
|
||||
buildings:
|
||||
title: 새로운 18개의 건축물
|
||||
desc: 완벽한 자동화된 공장을 위한 건물들입니다!
|
||||
upgrades:
|
||||
title: 20 티어까지 확장된 업그레이드
|
||||
desc: 체험판에서는 5 티어까지만 사용할 수 있습니다!
|
||||
markers:
|
||||
title: 무한한 마커 배치
|
||||
desc: 넓은 공장에서 길을 잃지 마세요!
|
||||
@ -412,6 +403,9 @@ ingame:
|
||||
achievements:
|
||||
title: 도전 과제
|
||||
desc: 모두 잡아 보세요!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: 구역
|
||||
zoneWidth: 너비
|
||||
@ -487,13 +481,11 @@ buildings:
|
||||
cutter:
|
||||
default:
|
||||
name: 절단기
|
||||
description:
|
||||
도형을 수직으로 잘라 두 가지 도형으로 나눕니다. <strong>한쪽만 사용할 경우라면 다른 부분을 파괴하지 않을 경우
|
||||
description: 도형을 수직으로 잘라 두 가지 도형으로 나눕니다. <strong>한쪽만 사용할 경우라면 다른 부분을 파괴하지 않을 경우
|
||||
절단기가 막혀 멈추게 됩니다!</strong>
|
||||
quad:
|
||||
name: 4단 절단기
|
||||
description:
|
||||
도형을 즉시 네 개로 자릅니다. <strong>한쪽만 사용할 경우라면 다른 부분을 파괴하지 않을 경우 절단기가 막혀
|
||||
description: 도형을 즉시 네 개로 자릅니다. <strong>한쪽만 사용할 경우라면 다른 부분을 파괴하지 않을 경우 절단기가 막혀
|
||||
멈추게 됩니다!</strong>
|
||||
rotater:
|
||||
default:
|
||||
@ -508,8 +500,7 @@ buildings:
|
||||
stacker:
|
||||
default:
|
||||
name: 결합기
|
||||
description:
|
||||
도형을 서로 결합하고 쌓습니다. 서로 결합할 수 있다면 두 도형을 붙여 하나로 만들고, 그렇지 않으면 오른쪽 도형이 왼쪽
|
||||
description: 도형을 서로 결합하고 쌓습니다. 서로 결합할 수 있다면 두 도형을 붙여 하나로 만들고, 그렇지 않으면 오른쪽 도형이 왼쪽
|
||||
도형 위에 쌓이게 됩니다.
|
||||
mixer:
|
||||
default:
|
||||
@ -524,8 +515,7 @@ buildings:
|
||||
description: 색소를 이용해 도형을 색칠합니다. 위쪽에서 받는 색소로 왼쪽에서 받는 도형 전체를 색칠합니다.
|
||||
quad:
|
||||
name: 4단 색칠기
|
||||
description:
|
||||
도형의 각 사분면에 개별적으로 색상을 칠할 수 있습니다. 전선 레이어를 통해 <strong>참 신호</strong>가
|
||||
description: 도형의 각 사분면에 개별적으로 색상을 칠할 수 있습니다. 전선 레이어를 통해 <strong>참 신호</strong>가
|
||||
있는 슬롯만 칠해집니다!
|
||||
mirrored:
|
||||
name: 색칠기
|
||||
@ -572,8 +562,7 @@ buildings:
|
||||
lever:
|
||||
default:
|
||||
name: 스위치
|
||||
description:
|
||||
전선 레이어에서 불 값 (1 또는 0)을 방출하도록 전환할 수 있으며, 그 후 아이템 선별같은 구성 요소를 제어하는 데
|
||||
description: 전선 레이어에서 불 값 (1 또는 0)을 방출하도록 전환할 수 있으며, 그 후 아이템 선별같은 구성 요소를 제어하는 데
|
||||
사용될 수 있습니다.
|
||||
logic_gate:
|
||||
default:
|
||||
@ -584,8 +573,7 @@ buildings:
|
||||
description: 입력이 거짓일 경우 불 값 "1"을 내보냅니다 (참은 도형, 색상, 불 값 "1"을 의미합니다).
|
||||
xor:
|
||||
name: XOR 회로
|
||||
description:
|
||||
입력 중 하나만 참이고 둘 다 같지 않을 경우 불 값 "1"을 내보냅니다 (참은 도형, 색상, 불 값 "1"을
|
||||
description: 입력 중 하나만 참이고 둘 다 같지 않을 경우 불 값 "1"을 내보냅니다 (참은 도형, 색상, 불 값 "1"을
|
||||
의미합니다).
|
||||
or:
|
||||
name: OR 회로
|
||||
@ -652,8 +640,7 @@ buildings:
|
||||
storyRewards:
|
||||
reward_cutter_and_trash:
|
||||
title: 절단기
|
||||
desc:
|
||||
<strong>절단기</strong>가 잠금 해제되었습니다! 절단기는 들어오는 도형이 어떤 도형을 하고 있던 수직으로 잘라
|
||||
desc: <strong>절단기</strong>가 잠금 해제되었습니다! 절단기는 들어오는 도형이 어떤 도형을 하고 있던 수직으로 잘라
|
||||
<strong>반으로 나눕니다</strong>!<br><br> 쓰지 않는 도형은 쓰레기로 처리하세요, 그렇지 않으면
|
||||
<strong>작동을 멈출 것입니다</strong>! 이러한 목적을 위해 <strong>휴지통</strong>도 함께
|
||||
지급되었습니다. 휴지통에 들어간 것은 모두 파괴됩니다!
|
||||
@ -662,8 +649,7 @@ storyRewards:
|
||||
desc: <strong>회전기</strong>가 잠금 해제되었습니다! 회전기는 들어오는 도형을 시계 방향으로 90도 회전시켜줍니다.
|
||||
reward_painter:
|
||||
title: 색칠기
|
||||
desc:
|
||||
"<strong>색칠기</strong>가 잠금 해제되었습니다! 도형과 마찬가지로 색소를 추출하고 색칠기에 넣거 도형과 결합하여 색칠된
|
||||
desc: "<strong>색칠기</strong>가 잠금 해제되었습니다! 도형과 마찬가지로 색소를 추출하고 색칠기에 넣거 도형과 결합하여 색칠된
|
||||
도형을 만들도록 하세요!<br><br>추신: 만약 당신이 색맹이라면, 설정에서 <strong>색맹 모드</strong>를
|
||||
활성화하세요!"
|
||||
reward_mixer:
|
||||
@ -672,28 +658,24 @@ storyRewards:
|
||||
색소</strong>를 얻을 수 있습니다!
|
||||
reward_stacker:
|
||||
title: 결합기
|
||||
desc:
|
||||
<strong>결합기</strong>가 잠금 해제되었습니다! 이제 결합기를 통해 여러 도형을 붙이고 결합할 수 있습니다! 들어오는 두
|
||||
desc: <strong>결합기</strong>가 잠금 해제되었습니다! 이제 결합기를 통해 여러 도형을 붙이고 결합할 수 있습니다! 들어오는 두
|
||||
도형의 도형이 서로 나란히 붙일 수 있다면, 하나의 도형으로 <strong>결합</strong>됩니다. 만약 서로
|
||||
겹쳐진다면, 오른쪽 도형이 왼쪽 도형의 <strong>위에 쌓이게</strong> 됩니다!
|
||||
reward_splitter:
|
||||
title: 압축형 분배기
|
||||
desc:
|
||||
<strong>밸런서</strong>의 새로운 형태인 <strong>분배기</strong>가 잠금 해제되었습니다! 이제 벨트 한 줄을
|
||||
desc: <strong>밸런서</strong>의 새로운 형태인 <strong>분배기</strong>가 잠금 해제되었습니다! 이제 벨트 한 줄을
|
||||
즉시 두 줄로 분배합니다!
|
||||
reward_tunnel:
|
||||
title: 터널
|
||||
desc: <strong>터널</strong>이 잠금 해제되었습니다! 이제 벨트와 건물 아래로 공간을 만들어내 옮길 수 있습니다!
|
||||
reward_rotater_ccw:
|
||||
title: 반시계 방향 회전기
|
||||
desc:
|
||||
<strong>반시계 방향 회전기</strong>가 잠금 해제되었습니다! 반시계 방향 회전기는 회전기의 다른 형태로, 이름처럼
|
||||
desc: <strong>반시계 방향 회전기</strong>가 잠금 해제되었습니다! 반시계 방향 회전기는 회전기의 다른 형태로, 이름처럼
|
||||
들어오는 도형을 반시계 방향으로 90도만큼 회전시킵니다! 제작하려면 회전기를 선택한 후 <strong>'T' 키를 눌러
|
||||
다른 형태로 전환</strong>하세요!
|
||||
reward_miner_chainable:
|
||||
title: 연쇄 추출기
|
||||
desc:
|
||||
"<strong>연쇄 추출기</strong>가 잠금 해제되었습니다! 자원을 보다 더욱 효율적으로 추출할 수 있도록 <strong>앞에
|
||||
desc: "<strong>연쇄 추출기</strong>가 잠금 해제되었습니다! 자원을 보다 더욱 효율적으로 추출할 수 있도록 <strong>앞에
|
||||
있는 추출기로 자원을 보낼 수 있습니다</strong>!<br><br> 추신: 이제 툴바에 있는 기존 추출기는 연쇄
|
||||
추출기로 대체되었습니다!"
|
||||
reward_underground_belt_tier_2:
|
||||
@ -702,18 +684,15 @@ storyRewards:
|
||||
거리</strong>를 운송할 수 있고 기존 터널과 겹쳐지지 않고도 자원을 보낼 수 있습니다!
|
||||
reward_cutter_quad:
|
||||
title: 4단 절단기
|
||||
desc:
|
||||
새로운 종류의 <strong>절단기</strong>가 잠금 해제되었습니다! 4단 절단기는 도형을 두 조각이 아닌 <strong>네
|
||||
desc: 새로운 종류의 <strong>절단기</strong>가 잠금 해제되었습니다! 4단 절단기는 도형을 두 조각이 아닌 <strong>네
|
||||
조각</strong>으로 자를 수 있습니다!
|
||||
reward_painter_double:
|
||||
title: 2단 색칠기
|
||||
desc:
|
||||
새로운 종류의 <strong>절단기</strong>가 잠금 해제되었습니다! 일반적인 색칠기와 거의 동일하지만, 하나의 색소를 사용하여
|
||||
desc: 새로운 종류의 <strong>절단기</strong>가 잠금 해제되었습니다! 일반적인 색칠기와 거의 동일하지만, 하나의 색소를 사용하여
|
||||
<strong>동시에 두 개의 도형을 색칠</strong>할 수 있습니다!
|
||||
reward_storage:
|
||||
title: 저장고
|
||||
desc:
|
||||
<strong>저장고</strong>가 잠금 해제되었습니다! 저장고는 최대 용량까지 도형을 저장할 수 있습니다!<br><br> 왼쪽
|
||||
desc: <strong>저장고</strong>가 잠금 해제되었습니다! 저장고는 최대 용량까지 도형을 저장할 수 있습니다!<br><br> 왼쪽
|
||||
출력이 우선되므로 <strong>오버플로 회로</strong>로도 활용될 수 있습니다!
|
||||
reward_freeplay:
|
||||
title: 자유플레이
|
||||
@ -723,38 +702,32 @@ storyRewards:
|
||||
레이어를 통해 내보내므로 이를 분석하는 구조를 기반으로 하여 공장을 자동으로 구성하기만 하면 됩니다.
|
||||
reward_blueprints:
|
||||
title: 청사진
|
||||
desc:
|
||||
이제 공장의 일부를 <strong>복사하고 붙여넣는 기능</strong>을 사용할 수 있습니다! 영역을 선택 (CTRL 키를 누른 채
|
||||
desc: 이제 공장의 일부를 <strong>복사하고 붙여넣는 기능</strong>을 사용할 수 있습니다! 영역을 선택 (CTRL 키를 누른 채
|
||||
마우스로 드래그)한 뒤 'C' 키를 눌러 복사할 수 있습니다.<br><br>하지만 <strong>공짜는
|
||||
아닙니다</strong>, <strong>청사진 도형 도형</strong>을 허브에 저장하고 그것을 일부 사용해 붙여넣기
|
||||
기능을 사용할 수 있습니다! (방금 당신이 만든 것입니다.)
|
||||
no_reward:
|
||||
title: 다음 레벨
|
||||
desc:
|
||||
"이번 레벨의 보상은 없네요. 대신 다음 레벨에서 줄겁니다!<br><br> 추신: 기존 공장을 파괴하지는 마세요. 후에
|
||||
desc: "이번 레벨의 보상은 없네요. 대신 다음 레벨에서 줄겁니다!<br><br> 추신: 기존 공장을 파괴하지는 마세요. 후에
|
||||
<strong>업그레이드 잠금 해제</strong>되면 <strong>기존의 모든</strong> 도형이 필요합니다!"
|
||||
no_reward_freeplay:
|
||||
title: 다음 레벨
|
||||
desc: 축하드립니다!
|
||||
reward_balancer:
|
||||
title: 밸런서
|
||||
desc:
|
||||
<strong>밸런서</strong>가 잠금 해제되었습니다! 다목적 밸런서를 통해 여러 벨트의 아이템을 서로 <strong>다른
|
||||
desc: <strong>밸런서</strong>가 잠금 해제되었습니다! 다목적 밸런서를 통해 여러 벨트의 아이템을 서로 <strong>다른
|
||||
벨트로 분할하거나 합침</strong>으로써 더욱 거대한 공장을 만들 수 있습니다!
|
||||
reward_merger:
|
||||
title: 압축형 병합기
|
||||
desc:
|
||||
<strong>밸런서</strong>의 새로운 형태인 <strong>병합기</strong>가 잠금 해제되었습니다! 이제 벨트 두 줄을
|
||||
desc: <strong>밸런서</strong>의 새로운 형태인 <strong>병합기</strong>가 잠금 해제되었습니다! 이제 벨트 두 줄을
|
||||
즉시 한 줄로 병합합니다!
|
||||
reward_belt_reader:
|
||||
title: 벨트 판독기
|
||||
desc:
|
||||
<strong>벨트 판독기</strong>가 잠금 해제되었습니다! 이제 벨트의 처리량을 확인할 수 있습니다.<br><br>그리고,
|
||||
desc: <strong>벨트 판독기</strong>가 잠금 해제되었습니다! 이제 벨트의 처리량을 확인할 수 있습니다.<br><br>그리고,
|
||||
전선이 잠금 해제될 때 까지 기다리신다면 정말 유용하게 사용할 수 있을 겁니다!
|
||||
reward_rotater_180:
|
||||
title: 180도 회전기
|
||||
desc:
|
||||
<strong>180도 회전기</strong>가 잠금 해제되었습니다! 이제 도형을 바로 180도로 회전시킬 수 있습니다. (짜잔!
|
||||
desc: <strong>180도 회전기</strong>가 잠금 해제되었습니다! 이제 도형을 바로 180도로 회전시킬 수 있습니다. (짜잔!
|
||||
:D)
|
||||
reward_display:
|
||||
title: 디스플레이
|
||||
@ -762,37 +735,32 @@ storyRewards:
|
||||
있습니다.<br><br> 추신: 벨트 판독기와 저장고가 마지막으로 읽은 아이템을 출력했나요? 디스플레이로 한번 봐보세요!"
|
||||
reward_constant_signal:
|
||||
title: 일정 신호기
|
||||
desc:
|
||||
전선 레이어에서 구축할 수 있는 <strong>일정 신호기</strong>가 잠금 해제되었습니다! 간단한 예시로,
|
||||
desc: 전선 레이어에서 구축할 수 있는 <strong>일정 신호기</strong>가 잠금 해제되었습니다! 간단한 예시로,
|
||||
<strong>아이템 선별</strong>에 연결하여 사용하는 데 유용합니다.<br><br> 일정 신호기는
|
||||
<strong>도형</strong>, <strong>색상</strong>, 또는 <strong>불 값</strong> (1
|
||||
또는 0)을 출력할 수 있습니다.
|
||||
reward_logic_gates:
|
||||
title: 논리 회로
|
||||
desc:
|
||||
<strong>논리 회로</strong>가 잠금 해제되었습니다! 굳이 흥분할 필요는 없지만, 진짜 멋진 기술입니다!<br><br>
|
||||
desc: <strong>논리 회로</strong>가 잠금 해제되었습니다! 굳이 흥분할 필요는 없지만, 진짜 멋진 기술입니다!<br><br>
|
||||
논리 회로를 통해 이제 AND, OR, XOR, NOT 논리 연산을 할 수 있습니다.<br><br> 보너스로,
|
||||
<strong>트랜지스터</strong>도 지급되었습니다!
|
||||
reward_virtual_processing:
|
||||
title: 가상 처리
|
||||
desc:
|
||||
<strong>도형의 처리를 시뮬레이션</strong>할 수 있는 다양한 새로운 건물이 잠금 해제되었습니다!<br><br> 이제 전선
|
||||
desc: <strong>도형의 처리를 시뮬레이션</strong>할 수 있는 다양한 새로운 건물이 잠금 해제되었습니다!<br><br> 이제 전선
|
||||
레이어에서 도형에 대한 절단기, 회전기, 결합기 등을 가상으로 시뮬레이션할 수 있습니다! 이제 게임 진행에 있어 다음 세
|
||||
가지의 방법이 존재합니다:<br><br> - <strong>완전 자동화된 기계</strong>를 구축하고 허브에서 요구되는
|
||||
도형을 제작합니다. (먼저 시도해볼 것을 권합니다!).<br><br> - 전선을 통해 멋진 것들 만듭니다.<br><br>
|
||||
- 평소처럼 게임을 진행합니다.<br><br> 어떤 방식으로든, 재미있게 게임을 플레이해주시길 바랍니다!
|
||||
reward_wires_painter_and_levers:
|
||||
title: 전선과 4단 색칠기
|
||||
desc:
|
||||
" 방금 <strong>전선 레이어</strong>를 활성화하셨습니다: 이것은 일반 레이어 위에 존재하는 별개의 레이어로 수많은
|
||||
desc: " 방금 <strong>전선 레이어</strong>를 활성화하셨습니다: 이것은 일반 레이어 위에 존재하는 별개의 레이어로 수많은
|
||||
새로운 요소를 사용할 수 있습니다!<br><br> <strong>4단 색칠기</strong>를 활성화해 드리겠습니다 -
|
||||
전선 레이어에서 색을 칠할 부분에 연결해 보세요!<br><br> 전선 레이어로 전환하시려면
|
||||
<strong>E</strong>키를 눌러주세요.<br><br> 추신: <strong>힌트를 활성화</strong>해서
|
||||
전선 튜토리얼을 활성화해 보세요!"
|
||||
reward_filter:
|
||||
title: 아이템 선별기
|
||||
desc:
|
||||
<strong>아이템 선별기</strong>가 잠금 해제되었습니다! 전선 레이어의 신호와 일치하는지에 대한 여부로 아이템을 위쪽
|
||||
desc: <strong>아이템 선별기</strong>가 잠금 해제되었습니다! 전선 레이어의 신호와 일치하는지에 대한 여부로 아이템을 위쪽
|
||||
출력이나 오른쪽 출력으로 보냅니다.<br><br> 불 값 (1 또는 0)을 전달하여 완전히 활성화과 비활성화를 전환할 수
|
||||
있습니다.
|
||||
reward_demo_end:
|
||||
@ -813,8 +781,7 @@ settings:
|
||||
labels:
|
||||
uiScale:
|
||||
title: UI 크기
|
||||
description:
|
||||
사용자 인터페이스의 크기를 변경합니다. 인터페이스는 당신의 해상도에 따라 확장되는데 이 설정은 그 확장의 정도를
|
||||
description: 사용자 인터페이스의 크기를 변경합니다. 인터페이스는 당신의 해상도에 따라 확장되는데 이 설정은 그 확장의 정도를
|
||||
제어합니다.
|
||||
scales:
|
||||
super_small: 매우 작게
|
||||
@ -861,18 +828,15 @@ settings:
|
||||
light: 라이트
|
||||
refreshRate:
|
||||
title: 틱 빈도
|
||||
description:
|
||||
이것은 초당 발생하는 게임 틱 수를 결정합니다. 일반적으로 틱 속도가 높을수록 정밀도는 향상되나 성능은 낮아집니다. 낮은
|
||||
description: 이것은 초당 발생하는 게임 틱 수를 결정합니다. 일반적으로 틱 속도가 높을수록 정밀도는 향상되나 성능은 낮아집니다. 낮은
|
||||
틱 빈도에서는 처리량이 정확하지 않을 수 있습니다.
|
||||
alwaysMultiplace:
|
||||
title: 다수 배치 항시 켜기
|
||||
description:
|
||||
활성화할 경우 모든 건물은 배치한 후 취소할 때 까지 커서에 선택된 상태를 유지합니다. 이 기능은 SHIFT 키를 계속
|
||||
description: 활성화할 경우 모든 건물은 배치한 후 취소할 때 까지 커서에 선택된 상태를 유지합니다. 이 기능은 SHIFT 키를 계속
|
||||
누르는 것과 같습니다.
|
||||
offerHints:
|
||||
title: 힌트와 튜토리얼
|
||||
description:
|
||||
게임 플레이하는 동안 힌트와 튜토리얼을 보여줄 지를 결정합니다. 또한 게임에 더 쉽게 빠져들 수 있도록 특정 레벨까지
|
||||
description: 게임 플레이하는 동안 힌트와 튜토리얼을 보여줄 지를 결정합니다. 또한 게임에 더 쉽게 빠져들 수 있도록 특정 레벨까지
|
||||
특정한 UI 요소를 숨깁니다.
|
||||
enableTunnelSmartplace:
|
||||
title: 지능적인 터널 배치
|
||||
@ -901,8 +865,7 @@ settings:
|
||||
description: 색맹 사용자를 위해 게임을 플레이하는 데 도움을 주는 다양한 도구를 활성화합니다.
|
||||
rotationByBuilding:
|
||||
title: 건물 유형에 따른 방향
|
||||
description:
|
||||
각 건물 유형마다 개별적으로 마지막으로 설정했던 방향을 기억하도록 합니다. 다른 건물 변형을 자주 전환하는 경우 이
|
||||
description: 각 건물 유형마다 개별적으로 마지막으로 설정했던 방향을 기억하도록 합니다. 다른 건물 변형을 자주 전환하는 경우 이
|
||||
방법이 더욱 편할 수 있습니다.
|
||||
soundVolume:
|
||||
title: 효과음 볼륨
|
||||
@ -918,8 +881,7 @@ settings:
|
||||
description: 성능 향상을 위해 타일 그리드를 비활성화할 수 있습니다. 이 역시 게임을 더욱 깨끗하게 보여줍니다!
|
||||
clearCursorOnDeleteWhilePlacing:
|
||||
title: 우클릭 시 커서 지우기
|
||||
description:
|
||||
기본적으로 활성화되어 있으며, 배치할 건물을 선택한 상태에서 마우스 우클릭 시 커서를 지웁니다. 비활성화할 경우, 건물을
|
||||
description: 기본적으로 활성화되어 있으며, 배치할 건물을 선택한 상태에서 마우스 우클릭 시 커서를 지웁니다. 비활성화할 경우, 건물을
|
||||
커서에 선택한 채로 우클릭하면 바로 건물을 삭제할 수 있습니다.
|
||||
lowQualityTextures:
|
||||
title: 저품질 텍스처 (못생김)
|
||||
@ -932,8 +894,7 @@ settings:
|
||||
description: 기본적으로 활성화되어 있으며, 자원 패치에서 피펫 기능을 사용 시 즉시 추출기를 선택합니다.
|
||||
simplifiedBelts:
|
||||
title: 벨트 단순화 (못생김)
|
||||
description:
|
||||
성능 향상을 위해 벨트를 가리킬 때를 제외한 모든 상황에서 벨트 아이템을 렌더링하지 않습니다. 이 기능을 사용할 정도로
|
||||
description: 성능 향상을 위해 벨트를 가리킬 때를 제외한 모든 상황에서 벨트 아이템을 렌더링하지 않습니다. 이 기능을 사용할 정도로
|
||||
심각한 성능 문제가 일어나지 않는 한, 이 설정을 사용할 필요는 없습니다.
|
||||
enableMousePan:
|
||||
title: 화면 가장자리 패닝
|
||||
@ -1151,8 +1112,7 @@ puzzleMenu:
|
||||
medium: 중간
|
||||
hard: 어려움
|
||||
unknown: Unrated
|
||||
dlcHint:
|
||||
DLC를 이미 구입하셨나요? 라이브러리에서 shapez.io를 오른쪽 클릭한 다음 속성… > DLC 메뉴를 선택해서
|
||||
dlcHint: DLC를 이미 구입하셨나요? 라이브러리에서 shapez.io를 오른쪽 클릭한 다음 속성… > DLC 메뉴를 선택해서
|
||||
활성화되었는지 확인해주세요.
|
||||
search:
|
||||
action: Search
|
||||
@ -1198,11 +1158,10 @@ mods:
|
||||
openFolder: 모드폴더 열기
|
||||
folderOnlyStandalone: 모드폴더를 여는것은 정식버전에서만 가능합니다.
|
||||
browseMods: 모드 찾기
|
||||
modsInfo: 모드를 설치하기위해 모드폴더에 모드 파일을 넣으세요.
|
||||
오른쪽 위에있는 '모드폴더 열기' 버튼으로 모드폴더를 열수 있습니다.
|
||||
modsInfo: 모드를 설치하기위해 모드폴더에 모드 파일을 넣으세요. 오른쪽 위에있는 '모드폴더 열기' 버튼으로 모드폴더를 열수 있습니다.
|
||||
noModSupport: 모드를 사용하기 위해 정식버전이 필요합니다.
|
||||
togglingComingSoon:
|
||||
title: 곧 업데이트 됩니다!
|
||||
description: 지금은 mods/ 폴더에 모드 파일을 넣고 빼는 방식으로만 모드를 활성화/비활성화할 수 있습니다. 모드를 이곳에서 켜고 끌수 있는 기능은 추후 업데이트될 예정입니다.
|
||||
모드폴더에 넣고/빼는것으로 할수있습니다.
|
||||
모드를 토글하는 기능은 곧 업데이트 됩니다!
|
||||
description: 지금은 mods/ 폴더에 모드 파일을 넣고 빼는 방식으로만 모드를 활성화/비활성화할 수 있습니다. 모드를 이곳에서 켜고
|
||||
끌수 있는 기능은 추후 업데이트될 예정입니다. 모드폴더에 넣고/빼는것으로 할수있습니다. 모드를 토글하는 기능은 곧 업데이트
|
||||
됩니다!
|
||||
|
@ -55,7 +55,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo Version
|
||||
intro: Get the standalone to unlock all features!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Play
|
||||
changelog: Changelog
|
||||
@ -416,9 +425,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 New Buildings
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -434,6 +440,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Inloggen
|
||||
demoBanners:
|
||||
title: Demoversie
|
||||
intro: Koop de standalone om alle functies te ontgrendelen!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Spelen
|
||||
changelog: Wijzigingenlijst
|
||||
@ -82,8 +91,8 @@ mainMenu:
|
||||
puzzleDlcViewNow: Bekijk DLC
|
||||
mods:
|
||||
title: Actieve Mods
|
||||
warningPuzzleDLC: Het spelen van de Puzzle DLC is niet mogelijk met mods. Schakel
|
||||
alsjeblieft alle mods uit om de DLC te spelen.
|
||||
warningPuzzleDLC: Het spelen van de Puzzle DLC is niet mogelijk met mods.
|
||||
Schakel alsjeblieft alle mods uit om de DLC te spelen.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -430,9 +439,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nieuwe Gebouwen
|
||||
desc: Automatiseer je fabrieken nog beter en maak ze nog sneller!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Levels
|
||||
desc: Deze demo heeft er slechts 5!
|
||||
markers:
|
||||
title: ∞ Markeringen
|
||||
desc: Verdwaal nooit meer in je fabriek!
|
||||
@ -448,6 +454,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Krijg ze allemaal!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Gebied
|
||||
zoneWidth: Breedte
|
||||
@ -1188,11 +1197,9 @@ tips:
|
||||
- Knippers knippen altijd verticaal, ongeacht hun oriëntatie.
|
||||
- De opslagbuffer geeft prioriteit aan de eerste uitvoer.
|
||||
- Investeer tijd om herhaalbare ontwerpen te maken - het is het waard!
|
||||
- Je kunt <b>ALT</b> ingedrukt houden om de richting van de geplaatste
|
||||
lopende banden om te keren.
|
||||
- Vormontginningen die verder van de HUB verwijderd zijn, zijn complexer.
|
||||
- Machines hebben een beperkte snelheid, verdeel ze voor maximale
|
||||
efficiëntie.
|
||||
- Invest time to build repeatable designs - it's worth it!
|
||||
- Holding <b>SHIFT</b> lets you place multiple buildings at a time.
|
||||
- You can hold <b>ALT</b> to invert the direction of placed belts.
|
||||
- Gebruik verdelers om je efficiëntie te maximaliseren.
|
||||
- Organisatie is belangrijk. Probeer de lopende banden niet te veel over te
|
||||
steken.
|
||||
@ -1212,11 +1219,11 @@ tips:
|
||||
mannen.
|
||||
- Maak een aparte blueprint fabriek. Ze zijn belangrijk voor modules.
|
||||
- Bekijk de kleurenmixer eens wat beter, en je vragen worden beantwoord.
|
||||
- Use <b>CTRL</b> + Click to select an area.
|
||||
- With modules, space is merely a perception; a concern for mortal men.
|
||||
- Met het speldpictogram naast elke vorm in de upgradelijst zet deze vast op
|
||||
het scherm.
|
||||
- Meng alle primaire kleuren door elkaar om wit te maken!
|
||||
- Je hebt een oneindige wereld, verkramp je fabriek niet, breid uit!
|
||||
- Use <b>CTRL</b> + Click to select an area.
|
||||
- Probeer ook Factorio! Het is mijn favoriete spel.
|
||||
- De quad-knipper knipt met de klok mee vanaf de rechterbovenhoek!
|
||||
- Je kunt je savegames downloaden in het hoofdmenu!
|
||||
@ -1231,6 +1238,10 @@ tips:
|
||||
- Druk twee keer op F4 om de tegel van je muis en camera weer te geven.
|
||||
- Je kan aan de linkerkant op een vastgezette vorm klikken om deze los te
|
||||
maken.
|
||||
- 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.
|
||||
puzzleMenu:
|
||||
play: Spelen
|
||||
edit: Bewerken
|
||||
@ -1323,13 +1334,16 @@ mods:
|
||||
version: Versie
|
||||
modWebsite: Website
|
||||
openFolder: Open Mods Map
|
||||
folderOnlyStandalone: Het openen van de mod map is alleen mogelijk bij het gebruiken van de zelfstandige versie.
|
||||
folderOnlyStandalone: Het openen van de mod map is alleen mogelijk bij het
|
||||
gebruiken van de zelfstandige versie.
|
||||
browseMods: Door mods bladeren
|
||||
modsInfo: Om mods te installeren en te beheren, kopieert u ze naar de map mods in de
|
||||
spel map. U kunt ook de knop 'Open Mods Map' gebruiken rechtsboven.
|
||||
modsInfo: Om mods te installeren en te beheren, kopieert u ze naar de map mods
|
||||
in de spel map. U kunt ook de knop 'Open Mods Map' gebruiken
|
||||
rechtsboven.
|
||||
noModSupport: Je hebt de zelfstandige versie op Steam nodig om mods te installeren.
|
||||
togglingComingSoon:
|
||||
title: Binnenkort Beschikbaar
|
||||
description: Mods in- of uitschakelen is momenteel alleen mogelijk door
|
||||
het mod-bestand van of naar de mods map te kopiëren. Echter, in staat zijn om
|
||||
ze hier in- of uitteschakelen is gepland voor een toekomstige update!
|
||||
description: Mods in- of uitschakelen is momenteel alleen mogelijk door het
|
||||
mod-bestand van of naar de mods map te kopiëren. Echter, in staat
|
||||
zijn om ze hier in- of uitteschakelen is gepland voor een
|
||||
toekomstige update!
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logger inn
|
||||
demoBanners:
|
||||
title: Demo Versjon
|
||||
intro: Skaff deg frittstående versjon for å åpne alle funksjoner!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Spill
|
||||
changelog: Endringshistorikk
|
||||
@ -422,9 +431,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nye Bygninger
|
||||
desc: Fullautomatiser din fabrikk!
|
||||
upgrades:
|
||||
title: ∞ Oppgraderingsnivåer
|
||||
desc: Demoversjonen har kun 5!
|
||||
markers:
|
||||
title: ∞ Markører
|
||||
desc: Aldri gå deg vill i din fabrikk!
|
||||
@ -440,6 +446,9 @@ ingame:
|
||||
achievements:
|
||||
title: Prestasjoner
|
||||
desc: Skaff dem alle!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Sone
|
||||
zoneWidth: Bredde
|
||||
|
@ -15,14 +15,13 @@ steamPage:
|
||||
|
||||
Kupienie gry w serwisie Steam przyznaje Ci dostęp do pełnej wersji, ale możesz również skorzystać z wersji demonstracyjnej na stronie shapez.io i rozważyć zakup później!
|
||||
what_others_say: Co inni ludzie mówią o shapez.io
|
||||
nothernlion_comment: Ta gra jest świetna - świetnie się bawię grając,
|
||||
a czas minął bardzo szybko.
|
||||
notch_comment: O kurcze. Naprawdę powinienem spać, ale chyba właśnie się wymyśliłem
|
||||
jak stworzyć komputer w shapez.io
|
||||
steam_review_comment: Ta gra skradła mi życie i nie chce go z powrotem!
|
||||
Bardzo luźna gra o fabrykach która nie pozwoli mi robić moich lini bardziej
|
||||
nothernlion_comment: Ta gra jest świetna - świetnie się bawię grając, a czas
|
||||
minął bardzo szybko.
|
||||
notch_comment: O kurcze. Naprawdę powinienem spać, ale chyba właśnie się
|
||||
wymyśliłem jak stworzyć komputer w shapez.io
|
||||
steam_review_comment: Ta gra skradła mi życie i nie chce go z powrotem! Bardzo
|
||||
luźna gra o fabrykach która nie pozwoli mi robić moich lini bardziej
|
||||
wydajnych.
|
||||
|
||||
global:
|
||||
loading: Ładowanie
|
||||
error: Wystąpił błąd
|
||||
@ -57,7 +56,16 @@ global:
|
||||
loggingIn: Logowanie
|
||||
demoBanners:
|
||||
title: Wersja demonstracyjna
|
||||
intro: Kup pełną wersję gry, aby odblokować więcej funkcji!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Rozpocznij
|
||||
continue: Kontynuuj
|
||||
@ -83,7 +91,7 @@ mainMenu:
|
||||
mods:
|
||||
title: Aktywne Mody
|
||||
warningPuzzleDLC: Granie w DLC Układanek nie jest możliwe z modami. Proszę
|
||||
wyłącz wszystkie mody, aby otworzyć DLC.
|
||||
wyłącz wszystkie mody, aby otworzyć DLC.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: Ok
|
||||
@ -210,21 +218,21 @@ dialogs:
|
||||
submitPuzzle:
|
||||
title: Prześlij układankę
|
||||
descName: "Podaj nazwę układanki:"
|
||||
descIcon: "Wprowadź unikalny skrót klawiszowy, który będzie wyświetlany jako ikona
|
||||
Twojej układanki (możesz je wygenerować <link>tutaj</link>) lub wybrać jedną
|
||||
z losowo wybranych kształtów poniżej:"
|
||||
descIcon: "Wprowadź unikalny skrót klawiszowy, który będzie wyświetlany jako
|
||||
ikona Twojej układanki (możesz je wygenerować <link>tutaj</link>)
|
||||
lub wybrać jedną z losowo wybranych kształtów poniżej:"
|
||||
placeholderName: Nazwa Układanki
|
||||
puzzleResizeBadBuildings:
|
||||
title: Zmiana rozmiaru jest nie możliwa
|
||||
desc: Nie możesz zmniejszyć rozmiaru układanki, bo wtedy niektóre budowle
|
||||
będą poza obszarem.
|
||||
desc: Nie możesz zmniejszyć rozmiaru układanki, bo wtedy niektóre budowle będą
|
||||
poza obszarem.
|
||||
puzzleLoadError:
|
||||
title: Zła Układanka
|
||||
desc: "Tych układanek nie udało się załadować:"
|
||||
offlineMode:
|
||||
title: Tryb bez Internetu
|
||||
desc: Nie udało nam się połączyć z serwerami, więc gra jest teraz w trybie offline.
|
||||
Upewnij się że masz aktywne połączenie z internetem.
|
||||
desc: Nie udało nam się połączyć z serwerami, więc gra jest teraz w trybie
|
||||
offline. Upewnij się że masz aktywne połączenie z internetem.
|
||||
puzzleDownloadError:
|
||||
title: Błąd pobierania
|
||||
desc: "Nie udało się pobrać tych układanek:"
|
||||
@ -233,21 +241,21 @@ dialogs:
|
||||
desc: "Nie udało się opublikować Twojej układanki:"
|
||||
puzzleSubmitOk:
|
||||
title: Układanka Opublikowana
|
||||
desc: Gratulacje! Twoja układanka została opublikowana, i teraz inne osoby mogą w nią
|
||||
grać. Teraz ją znajdziesz w zakładce "Moje układanki".
|
||||
desc: Gratulacje! Twoja układanka została opublikowana, i teraz inne osoby mogą
|
||||
w nią grać. Teraz ją znajdziesz w zakładce "Moje układanki".
|
||||
puzzleCreateOffline:
|
||||
title: Tryb Offline
|
||||
desc: Ponieważ jesteś w trybie offline, więc nie możesz zapisać lub opublikować Twojej
|
||||
układanki. Chciałbyś kontynuować pomimo tego?
|
||||
desc: Ponieważ jesteś w trybie offline, więc nie możesz zapisać lub opublikować
|
||||
Twojej układanki. Chciałbyś kontynuować pomimo tego?
|
||||
puzzlePlayRegularRecommendation:
|
||||
title: Polecane
|
||||
desc: <strong>Bardzo</strong> polecamy zagrać w normalnę grę do poziomu 12
|
||||
przed zaczęcięm grania w DLC układanek, jeśli tak nie zrobisz
|
||||
możesz nie znać różnych mechanik. Chcesz kontynuować pomimo tego?
|
||||
desc: <strong>Bardzo</strong> polecamy zagrać w normalnę grę do poziomu 12 przed
|
||||
zaczęcięm grania w DLC układanek, jeśli tak nie zrobisz możesz nie
|
||||
znać różnych mechanik. Chcesz kontynuować pomimo tego?
|
||||
puzzleShare:
|
||||
title: Skopiowano Skrót Klawiszowy
|
||||
desc: Skrot klawiszowy dla tej układanki (<key>) został skopiowany do schowka! Możesz
|
||||
wpisać go w menu układanek, aby otworzyć tą układankę.
|
||||
desc: Skrot klawiszowy dla tej układanki (<key>) został skopiowany do schowka!
|
||||
Możesz wpisać go w menu układanek, aby otworzyć tą układankę.
|
||||
puzzleReport:
|
||||
title: Zgłoś Układankę
|
||||
options:
|
||||
@ -265,12 +273,13 @@ dialogs:
|
||||
desc: Wpisz skrót klawiszowy układanki, aby go załadować.
|
||||
puzzleDelete:
|
||||
title: Chcesz usunąć układankę?
|
||||
desc: Jesteś pewny że chcesz usunąć układankę '<title>'? To nie może być cofnięte!
|
||||
desc: Jesteś pewny że chcesz usunąć układankę '<title>'? To nie może być
|
||||
cofnięte!
|
||||
modsDifference:
|
||||
title: Ostrzeżenie o modyfikacjach
|
||||
desc: Aktualnie zainstalowane mody różnią się od tych, które zostały utworzone w zapisie gry.
|
||||
Może to spowodować, że zapis gry się zepsuje lub w ogóle się nie załaduje. Czy
|
||||
na pewno chcesz kontynuować?
|
||||
desc: Aktualnie zainstalowane mody różnią się od tych, które zostały utworzone w
|
||||
zapisie gry. Może to spowodować, że zapis gry się zepsuje lub w
|
||||
ogóle się nie załaduje. Czy na pewno chcesz kontynuować?
|
||||
missingMods: Missing Mods
|
||||
newMods: Ostatnio zainstalowane Mody
|
||||
ingame:
|
||||
@ -425,9 +434,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Nowych Budynków
|
||||
desc: W pełni zautomatyzuj produkcję!
|
||||
upgrades:
|
||||
title: ∞ Poziomów Ulepszeń
|
||||
desc: To demo posiada tylko 5!
|
||||
markers:
|
||||
title: ∞ Znaczników
|
||||
desc: Nigdy nie zgub się w swojej fabryce!
|
||||
@ -443,6 +449,9 @@ ingame:
|
||||
achievements:
|
||||
title: Osiągnięcia
|
||||
desc: Zbierz je wszystkie!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Obszar
|
||||
zoneWidth: Wysokość
|
||||
@ -457,18 +466,20 @@ ingame:
|
||||
title: Edytor Układanek
|
||||
instructions:
|
||||
- 1. Rozmieść <strong>generatory</strong>, aby zapewnić kształty i
|
||||
kolory dla gracza
|
||||
- 2. Zbuduj jeden lub więcej kształtów, które gracz ma zbudować później i
|
||||
dostarczyć go do co najmniej jednego <strong>skupu</strong>
|
||||
- 3. Gdy skup otrzyma kształt za określoną kwotę
|
||||
czasu, <strong>zapisuje to jako cel</strong>, który gracz musi
|
||||
produkować później (wskazywane przez <strong>zieloną plakietkę</strong>).
|
||||
- 4. Kliknij <strong>przycisk blokady</strong> na budynku, aby go wyłączyć.
|
||||
- 5. Gdy klikniesz recenzję, twoja łamigłówka zostanie zatwierdzona, a ty
|
||||
może to opublikować.
|
||||
- 6. Po premierze <strong>wszystkie budynki zostaną usunięte</strong>
|
||||
z wyjątkiem Producentów i Askupów – to jest ta część, która
|
||||
gracz ma się przecież sam rozgryźć :)
|
||||
kolory dla gracza
|
||||
- 2. Zbuduj jeden lub więcej kształtów, które gracz ma zbudować
|
||||
później i dostarczyć go do co najmniej jednego
|
||||
<strong>skupu</strong>
|
||||
- 3. Gdy skup otrzyma kształt za określoną kwotę czasu,
|
||||
<strong>zapisuje to jako cel</strong>, który gracz musi produkować
|
||||
później (wskazywane przez <strong>zieloną plakietkę</strong>).
|
||||
- 4. Kliknij <strong>przycisk blokady</strong> na budynku, aby go
|
||||
wyłączyć.
|
||||
- 5. Gdy klikniesz recenzję, twoja łamigłówka zostanie zatwierdzona,
|
||||
a ty może to opublikować.
|
||||
- 6. Po premierze <strong>wszystkie budynki zostaną
|
||||
usunięte</strong> z wyjątkiem Producentów i Askupów – to jest ta
|
||||
część, która gracz ma się przecież sam rozgryźć :)
|
||||
puzzleCompletion:
|
||||
title: Układanka Rozwiązana!
|
||||
titleLike: "Kliknij w serce jeśli podobała Ci się ta układanka:"
|
||||
@ -1043,8 +1054,8 @@ settings:
|
||||
pomniejszenia).
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Pokazuj zawsze etykietę kształtus
|
||||
description: Czy zawsze wyświetlać etykietkę kształtu podczas najeżdżania na budynki,
|
||||
zamiast trzymać „ALT”.
|
||||
description: Czy zawsze wyświetlać etykietkę kształtu podczas najeżdżania na
|
||||
budynki, zamiast trzymać „ALT”.
|
||||
rangeSliderPercentage: <amount> %
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: Nowe!
|
||||
@ -1122,10 +1133,10 @@ keybindings:
|
||||
comparator: Porównywacz
|
||||
item_producer: Producent Przedmiotów (Tryb Piaskownicy)
|
||||
copyWireValue: "Przewody: Skopiuj wartość pod kursorem"
|
||||
rotateToUp: "Obróć w góre"
|
||||
rotateToDown: "Obróć w dół"
|
||||
rotateToRight: "Obróć w prawo"
|
||||
rotateToLeft: "Obróć w lewo"
|
||||
rotateToUp: Obróć w góre
|
||||
rotateToDown: Obróć w dół
|
||||
rotateToRight: Obróć w prawo
|
||||
rotateToLeft: Obróć w lewo
|
||||
constant_producer: Stały producent
|
||||
goal_acceptor: Skup
|
||||
block: Blokuj
|
||||
@ -1259,21 +1270,22 @@ puzzleMenu:
|
||||
title: Niepoprawna układanka
|
||||
noProducers: Proszę połóż Stałego producent!
|
||||
noGoalAcceptors: Proszę połóż skup!
|
||||
goalAcceptorNoItem: Co najmniej jeden akceptor celu nie przypisał jeszcze elementu.
|
||||
Dostarcz im kształt, aby ustawić cel.
|
||||
goalAcceptorRateNotMet: Co najmniej jeden akceptor celów nie otrzymuje wystarczającej liczby przedmiotów.
|
||||
Upewnij się, że wskaźniki są zielone dla wszystkich akceptantów.
|
||||
buildingOutOfBounds: Co najmniej jeden budynek znajduje się poza obszarem przeznaczonym do zbudowania.
|
||||
Zwiększ obszar lub usuń je.
|
||||
autoComplete: Twoja łamigłówka samoczynnie się uzupełnia! Upewnij się, że jesteś stały
|
||||
producenci nie dostarczają bezpośrednio do akceptantów bramek.
|
||||
goalAcceptorNoItem: Co najmniej jeden akceptor celu nie przypisał jeszcze
|
||||
elementu. Dostarcz im kształt, aby ustawić cel.
|
||||
goalAcceptorRateNotMet: Co najmniej jeden akceptor celów nie otrzymuje
|
||||
wystarczającej liczby przedmiotów. Upewnij się, że wskaźniki są
|
||||
zielone dla wszystkich akceptantów.
|
||||
buildingOutOfBounds: Co najmniej jeden budynek znajduje się poza obszarem
|
||||
przeznaczonym do zbudowania. Zwiększ obszar lub usuń je.
|
||||
autoComplete: Twoja łamigłówka samoczynnie się uzupełnia! Upewnij się, że jesteś
|
||||
stały producenci nie dostarczają bezpośrednio do akceptantów bramek.
|
||||
difficulties:
|
||||
easy: Łatwy
|
||||
medium: Średni
|
||||
hard: Trudny
|
||||
unknown: Nieznany
|
||||
dlcHint: Kupiłeś/aś już DLC? Upewnij się że aktywowałeś/aś shapez.io
|
||||
w swojej bibliotece, wybierając Właściwości > DLC.
|
||||
dlcHint: Kupiłeś/aś już DLC? Upewnij się że aktywowałeś/aś shapez.io w swojej
|
||||
bibliotece, wybierając Właściwości > DLC.
|
||||
search:
|
||||
action: Szukaj
|
||||
placeholder: Podaj nazwę układanki lub jej autora
|
||||
@ -1291,11 +1303,11 @@ puzzleMenu:
|
||||
backendErrors:
|
||||
ratelimit: Wykonujesz akcje za szybko. Poczekaj jakiś czas i spróbuj podobnie.
|
||||
invalid-api-key: Nie udało się skomunikować z backendem, spróbuj
|
||||
zaktualizuj/zrestartuj grę (nieprawidłowy klucz API).
|
||||
zaktualizuj/zrestartuj grę (nieprawidłowy klucz API).
|
||||
unauthorized: Nie udało się skomunikować z backendem, spróbuj
|
||||
zaktualizuj/zrestartuj grę (nieautoryzowane).
|
||||
bad-token: Nie udało się skomunikować z backendem, spróbuj zaktualizować/zrestartować
|
||||
grę (zły token).
|
||||
zaktualizuj/zrestartuj grę (nieautoryzowane).
|
||||
bad-token: Nie udało się skomunikować z backendem, spróbuj
|
||||
zaktualizować/zrestartować grę (zły token).
|
||||
bad-id: Nieprawidłowy identyfikator układanki.
|
||||
not-found: Nie znaleźliśmy szukanej układanki!
|
||||
bad-category: Nie znaleźliśmy podanej kategorii!
|
||||
@ -1311,7 +1323,8 @@ backendErrors:
|
||||
bad-payload: Żądanie zawiera nieprawidłowe dane.
|
||||
bad-building-placement: Twoja łamigłówka zawiera nieprawidłowo umieszczone budynki.
|
||||
timeout: Upłynął limit czasu żądania.
|
||||
too-many-likes-already: Zagadka ma już za dużo polubień. Jeśli nadal chcesz ją usunąć, skontaktuj się z support@shapez.io!
|
||||
too-many-likes-already: Zagadka ma już za dużo polubień. Jeśli nadal chcesz ją
|
||||
usunąć, skontaktuj się z support@shapez.io!
|
||||
no-permission: Nie masz uprawnień, aby wykonać tą akcję.
|
||||
mods:
|
||||
title: Mody
|
||||
@ -1319,14 +1332,15 @@ mods:
|
||||
version: Wersja
|
||||
modWebsite: Strona
|
||||
openFolder: Otwórz folder modów
|
||||
folderOnlyStandalone: Otwarcie folderu modów jest możliwe tylko podczas pracy w wersji samodzielnej.
|
||||
folderOnlyStandalone: Otwarcie folderu modów jest możliwe tylko podczas pracy w
|
||||
wersji samodzielnej.
|
||||
browseMods: Szukaj Modów
|
||||
modsInfo: Aby zainstalować i zarządzać modami, skopiuj je do folderu mods w
|
||||
katalogu gry. Możesz także użyć przycisku „Otwórz folder modów” w
|
||||
prawym górnym rogu.
|
||||
katalogu gry. Możesz także użyć przycisku „Otwórz folder modów” w prawym
|
||||
górnym rogu.
|
||||
noModSupport: Aby zainstalować mody, potrzebujesz osobną wersję na Steam.
|
||||
togglingComingSoon:
|
||||
title: Już wkrótce
|
||||
description: Włączanie lub wyłączanie modów jest obecnie możliwe tylko przez kopiowanie
|
||||
pliku modów do folderu "mods/". Jednak w przyszłej aktualizacji
|
||||
będziesz/asz mógł zmieniać ich status tutaj!
|
||||
description: Włączanie lub wyłączanie modów jest obecnie możliwe tylko przez
|
||||
kopiowanie pliku modów do folderu "mods/". Jednak w przyszłej
|
||||
aktualizacji będziesz/asz mógł zmieniać ich status tutaj!
|
||||
|
@ -55,7 +55,16 @@ global:
|
||||
loggingIn: Entrando
|
||||
demoBanners:
|
||||
title: Versão Demo
|
||||
intro: Compre a versão completa para desbloquear todos os recursos!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Jogar
|
||||
continue: Continuar
|
||||
@ -423,9 +432,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Novas Construções
|
||||
desc: Automatize sua fábrica inteira!
|
||||
upgrades:
|
||||
title: ∞ Níveis de Melhorias
|
||||
desc: Essa demo tem apenas 5!
|
||||
markers:
|
||||
title: Marcadores ∞
|
||||
desc: Nunca se perca na sua fábrica!
|
||||
@ -441,6 +447,9 @@ ingame:
|
||||
achievements:
|
||||
title: Conquistas
|
||||
desc: Consiga todas elas!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zona
|
||||
zoneWidth: Largura
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Versão Demo
|
||||
intro: Compra a versão completa para desbloqueares todas as funcionalidades!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Jogar
|
||||
changelog: Changelog
|
||||
@ -432,9 +441,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Novas contruções
|
||||
desc: Para uma fábrica totalmente automatizada!
|
||||
upgrades:
|
||||
title: ∞ Níveis de melhoria
|
||||
desc: Nesta versão demo apenas tens 5!
|
||||
markers:
|
||||
title: Marcos ∞
|
||||
desc: Nunca te percas na tua Fábrica!
|
||||
@ -450,6 +456,9 @@ ingame:
|
||||
achievements:
|
||||
title: Conquistas
|
||||
desc: Tenta obtê-las todas!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zona
|
||||
zoneWidth: Largura
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logare
|
||||
demoBanners:
|
||||
title: Versiunea Demo
|
||||
intro: Instalează versiunea Standalone pentru a debloca toate funcțiile!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Joacă
|
||||
changelog: Jurnalul schimbărilor
|
||||
@ -429,9 +438,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 construcții noi
|
||||
desc: Automatizează-ti complet fabrica!
|
||||
upgrades:
|
||||
title: Nivele de Upgrade Infinite
|
||||
desc: Acest demo are doar 5!
|
||||
markers:
|
||||
title: Marcatoare infinite
|
||||
desc: Nu te rătăci niciodată în fabrică!
|
||||
@ -447,6 +453,9 @@ ingame:
|
||||
achievements:
|
||||
title: Realizări
|
||||
desc: Vânează-le pe toate!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zonă
|
||||
zoneWidth: Lățime
|
||||
|
@ -53,7 +53,16 @@ global:
|
||||
loggingIn: Вход
|
||||
demoBanners:
|
||||
title: Демоверсия
|
||||
intro: Приобретите полную версию, чтобы разблокировать все возможности!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Играть
|
||||
continue: Продолжить
|
||||
@ -267,9 +276,9 @@ dialogs:
|
||||
modsDifference:
|
||||
title: Предупреждение Мода
|
||||
desc: Установленные в данный момент моды отличаются от модов, с которыми была
|
||||
создана игра сохранения с ним. Это может привести к тому, что сохранение
|
||||
не загрузится или вообще ничего не загрузится. Вы вы уверены, что хотите
|
||||
продолжить?
|
||||
создана игра сохранения с ним. Это может привести к тому, что
|
||||
сохранение не загрузится или вообще ничего не загрузится. Вы вы
|
||||
уверены, что хотите продолжить?
|
||||
missingMods: Отсутствуют Моды
|
||||
newMods: Недавно установленные Моды
|
||||
ingame:
|
||||
@ -429,9 +438,6 @@ ingame:
|
||||
achievements:
|
||||
title: Достижения
|
||||
desc: Получи их все!
|
||||
upgrades:
|
||||
title: ∞ стадий улучшений
|
||||
desc: В демоверсии всего 5!
|
||||
markers:
|
||||
title: ∞ Маркеров
|
||||
desc: Никогда не теряйтесь в своей фабрике!
|
||||
@ -444,6 +450,9 @@ ingame:
|
||||
support:
|
||||
title: Поддержите меня
|
||||
desc: Я занимаюсь разработкой в свободное время!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Область
|
||||
zoneWidth: Ширина
|
||||
@ -1045,9 +1054,9 @@ settings:
|
||||
title: Размер ресурсов на карте
|
||||
description: Устанавливает размер фигур на карте (когда вид достаточно отдалён).
|
||||
shapeTooltipAlwaysOn:
|
||||
|
||||
title: Показывать подсказку фигуры
|
||||
description: Показывать ли подсказку фигуры всегда или только при удержании 'ALT'.
|
||||
description: Показывать ли подсказку фигуры всегда или только при удержании
|
||||
'ALT'.
|
||||
tickrateHz: <amount> Гц
|
||||
newBadge: Новое!
|
||||
keybindings:
|
||||
@ -1321,8 +1330,8 @@ mods:
|
||||
folderOnlyStandalone: Открытие папки Модов возможно только при запуске автономного режима.
|
||||
browseMods: Просмотреть Моды
|
||||
modsInfo: Чтобы установить и управлять модами, скопируйте их в папку модов в
|
||||
директории игры. Вы также можете воспользоваться кнопкой "Открыть папку модов" в
|
||||
справа вверху.
|
||||
директории игры. Вы также можете воспользоваться кнопкой "Открыть папку
|
||||
модов" в справа вверху.
|
||||
noModSupport: Для установки модов вам нужна автономная версия в Steam.
|
||||
togglingComingSoon:
|
||||
title: Совсем скоро
|
||||
|
@ -56,7 +56,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: Demo Version
|
||||
intro: Get the standalone to unlock all features!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Play
|
||||
continue: Continue
|
||||
@ -418,9 +427,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 New Buildings
|
||||
desc: Fully automate your factory!
|
||||
upgrades:
|
||||
title: ∞ Upgrade Tiers
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ Markers
|
||||
desc: Never get lost in your factory!
|
||||
@ -436,6 +442,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -54,7 +54,16 @@ global:
|
||||
loggingIn: Prijavljivanje
|
||||
demoBanners:
|
||||
title: Probna Verzija
|
||||
intro: Nabavite punu igru kako biste otključali sve funkcije!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Igraj
|
||||
continue: Nastavi
|
||||
@ -419,9 +428,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Novih Građevina
|
||||
desc: U potpunosti automatizujte fabriku!
|
||||
upgrades:
|
||||
title: ∞ Redova Nadogradnje
|
||||
desc: Probna verzija ima samo 5!
|
||||
markers:
|
||||
title: ∞ Putokaza
|
||||
desc: Nikada se nećete izgubiti u fabrici!
|
||||
@ -437,6 +443,9 @@ ingame:
|
||||
achievements:
|
||||
title: Dostignuća
|
||||
desc: Osvojite ih sve!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Širina
|
||||
|
@ -55,7 +55,16 @@ global:
|
||||
loggingIn: Loggar in
|
||||
demoBanners:
|
||||
title: Demo-version
|
||||
intro: Skaffa den fristående versionen för att låsa upp alla funktioner!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Spela
|
||||
changelog: Ändringslogg
|
||||
@ -422,9 +431,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 nya byggnader!
|
||||
desc: Helautomatisera din fabrik!
|
||||
upgrades:
|
||||
title: 1000 uppgraderingsnivåer
|
||||
desc: This demo version has only 5!
|
||||
markers:
|
||||
title: ∞ med markeringar!
|
||||
desc: Tappa aldrig bort dig i din fabrik längre!
|
||||
@ -440,6 +446,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
@ -54,7 +54,16 @@ global:
|
||||
loggingIn: Giriş yapılıyor
|
||||
demoBanners:
|
||||
title: Deneme Sürümü
|
||||
intro: Bütün özellikleri açmak için tam sürümü satın alın!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Oyna
|
||||
changelog: Değişiklik Günlüğü
|
||||
@ -80,8 +89,8 @@ mainMenu:
|
||||
puzzleDlcViewNow: Paketi (DLC) görüntüle
|
||||
mods:
|
||||
title: Aktif Modlar
|
||||
warningPuzzleDLC: Modlarla Yapboz DLC'sini oynamak mümkün değil. Lütfen
|
||||
Yapboz DLC'sini oynayabilmek için bütün modları devre dışı bırakınız.
|
||||
warningPuzzleDLC: Modlarla Yapboz DLC'sini oynamak mümkün değil. Lütfen Yapboz
|
||||
DLC'sini oynayabilmek için bütün modları devre dışı bırakınız.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -264,9 +273,10 @@ dialogs:
|
||||
alınamaz!"
|
||||
modsDifference:
|
||||
title: Mod Uyarısı
|
||||
desc: Halihazırda kullanılan modlar, kayıtlı oyunun yaratıldığı modlardan farklıdır.
|
||||
Bu işlem kayıtlı oyunun bozulmasına veya hiç yüklenmemesine neden olabilir. Devam
|
||||
etmek istediğinize emin misiniz?
|
||||
desc: Halihazırda kullanılan modlar, kayıtlı oyunun yaratıldığı modlardan
|
||||
farklıdır. Bu işlem kayıtlı oyunun bozulmasına veya hiç
|
||||
yüklenmemesine neden olabilir. Devam etmek istediğinize emin
|
||||
misiniz?
|
||||
missingMods: Eksik Modlar
|
||||
newMods: Yeni yüklenen Modlar
|
||||
ingame:
|
||||
@ -422,9 +432,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 Yeni Yapı
|
||||
desc: Fabrikanı tamamen otomatikleştir!
|
||||
upgrades:
|
||||
title: ∞ Geliştirme Aşaması
|
||||
desc: Bu deneme sürümünde sadece 5 tane var!
|
||||
markers:
|
||||
title: ∞ Yer imleri
|
||||
desc: Fabrikanda asla kaybolma!
|
||||
@ -440,6 +447,9 @@ ingame:
|
||||
achievements:
|
||||
title: Başarımlar
|
||||
desc: Bütün başarımları açmaya çalış!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Alan
|
||||
zoneWidth: Genişlik
|
||||
@ -1314,9 +1324,9 @@ mods:
|
||||
openFolder: Mod Klasörünü Aç
|
||||
folderOnlyStandalone: Mod klasörünü açmak sadece tam sürümü çalıştırıyorken mümkün.
|
||||
browseMods: Modlara Gözat
|
||||
modsInfo: Modları yüklemek ve yönetmek için, bunları oyun dizini içerisindeki Modlar
|
||||
klasörüne kopyalayın. Ayrıca sağ üstteki 'Modlar Klasörünü Aç' düğmesini de
|
||||
kullanabilirsiniz.
|
||||
modsInfo: Modları yüklemek ve yönetmek için, bunları oyun dizini içerisindeki
|
||||
Modlar klasörüne kopyalayın. Ayrıca sağ üstteki 'Modlar Klasörünü Aç'
|
||||
düğmesini de kullanabilirsiniz.
|
||||
noModSupport: Mod yükleyebilmek için tam sürümü çalıştırmalısınız.
|
||||
togglingComingSoon:
|
||||
title: Yakında Gelecek
|
||||
|
@ -14,12 +14,13 @@ steamPage:
|
||||
|
||||
Купуючи гру в Steam ви отримаєте доступ до повної версії гри, але ви також можете спробувати демо-версію гри на shapez.io та вирішити пізніше!
|
||||
what_others_say: Відгуки людей про shapez.io
|
||||
nothernlion_comment: Ця гра неймовірна - я чудово проводжу у ній час,
|
||||
не помічаючи як швидко він плине.
|
||||
notch_comment: От дідько. Я вже повинен спати, але я щойно розібрався
|
||||
як зробити комп'ютер у shapez.io
|
||||
steam_review_comment: Ця гра вкрала моє життя, і я не хочу його повертати.
|
||||
Дуже крута гра, і вона не зупинить мене постійно підвищувати ефективність ліній.
|
||||
nothernlion_comment: Ця гра неймовірна - я чудово проводжу у ній час, не
|
||||
помічаючи як швидко він плине.
|
||||
notch_comment: От дідько. Я вже повинен спати, але я щойно розібрався як зробити
|
||||
комп'ютер у shapez.io
|
||||
steam_review_comment: Ця гра вкрала моє життя, і я не хочу його повертати. Дуже
|
||||
крута гра, і вона не зупинить мене постійно підвищувати ефективність
|
||||
ліній.
|
||||
global:
|
||||
loading: Завантаження
|
||||
error: Помилка
|
||||
@ -54,7 +55,16 @@ global:
|
||||
loggingIn: Вхід у систему
|
||||
demoBanners:
|
||||
title: Демо-версія
|
||||
intro: Завантажте повну версію, щоб розблокувати всі можливості та вміст!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: Грати
|
||||
continue: Продовжити
|
||||
@ -74,14 +84,14 @@ mainMenu:
|
||||
savegameUnnamed: Без назви
|
||||
puzzleMode: Режим Головоломки
|
||||
back: Назад
|
||||
puzzleDlcText: Вам подобається ущільнювати та оптимізовувати фабрики? Тоді отримайте доповнення Puzzle
|
||||
DLC у Steam для ще більших веселощів!
|
||||
puzzleDlcText: Вам подобається ущільнювати та оптимізовувати фабрики? Тоді
|
||||
отримайте доповнення Puzzle DLC у Steam для ще більших веселощів!
|
||||
puzzleDlcWishlist: Додай у список бажаного!
|
||||
puzzleDlcViewNow: Переглянути DLC
|
||||
mods:
|
||||
title: Активні моди
|
||||
warningPuzzleDLC: Гра з модами у Puzzle DLC не є можливою. Будь-ласка
|
||||
відключіть усі моди щоб грати у цей режим.
|
||||
warningPuzzleDLC: Гра з модами у Puzzle DLC не є можливою. Будь-ласка відключіть
|
||||
усі моди щоб грати у цей режим.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: Гаразд
|
||||
@ -205,9 +215,10 @@ dialogs:
|
||||
submitPuzzle:
|
||||
title: Опублікувати головоломку
|
||||
descName: "Назвіть вашу головоломку:"
|
||||
descIcon: "Будь-ласка введіть короткий унікальний ключ, який буде використано як піктограму
|
||||
вашої головоломки (Ви можете згенерувати його <link>тут</link>, або обрати один
|
||||
із випадково запропонованих нижче):"
|
||||
descIcon: "Будь-ласка введіть короткий унікальний ключ, який буде використано як
|
||||
піктограму вашої головоломки (Ви можете згенерувати його
|
||||
<link>тут</link>, або обрати один із випадково запропонованих
|
||||
нижче):"
|
||||
placeholderName: Назва головоломки
|
||||
puzzleResizeBadBuildings:
|
||||
title: Зміна розміру неможлива
|
||||
@ -218,7 +229,8 @@ dialogs:
|
||||
offlineMode:
|
||||
title: Офлайн режим
|
||||
desc: Неможливо під'єднатись до серверів, гру буде запущено в офлайн режимі.
|
||||
Будь-ласка, переконайтеся у наявності активного з'єднання з інтернетом.
|
||||
Будь-ласка, переконайтеся у наявності активного з'єднання з
|
||||
інтернетом.
|
||||
puzzleDownloadError:
|
||||
title: Помилка завантаження
|
||||
desc: "Не вдалося завантажити головоломку:"
|
||||
@ -227,17 +239,18 @@ dialogs:
|
||||
desc: "Не вдалося опублікувати головоломку:"
|
||||
puzzleSubmitOk:
|
||||
title: Головоломку опубліковано
|
||||
desc: Вітаєио! Ваша головоломка опублікована, та видима для інших
|
||||
гравців. Ви можете знайти її у розділі "Мої головоломки".
|
||||
desc: Вітаєио! Ваша головоломка опублікована, та видима для інших гравців. Ви
|
||||
можете знайти її у розділі "Мої головоломки".
|
||||
puzzleCreateOffline:
|
||||
title: Офлайн режим
|
||||
desc: Оскільки ви офлайн, ви не зможете зберігати та/або публікувати ваші власні
|
||||
головоломки. Ви впевнені що хочете продовжити?
|
||||
puzzlePlayRegularRecommendation:
|
||||
title: Рекомендація
|
||||
desc: Я <strong>настійно</strong> рекомендую досягнути як мінімум 12-го рівня у звичайній грі
|
||||
перед початком гри у доповнення Puzzle DLC, інакше ви можете зіткнутися з
|
||||
незнайомими для себе ігровими механіками. Ви впевнені що хочете продовжити?
|
||||
desc: Я <strong>настійно</strong> рекомендую досягнути як мінімум 12-го рівня у
|
||||
звичайній грі перед початком гри у доповнення Puzzle DLC, інакше ви
|
||||
можете зіткнутися з незнайомими для себе ігровими механіками. Ви
|
||||
впевнені що хочете продовжити?
|
||||
puzzleShare:
|
||||
title: Короткий ключ скопійовано
|
||||
desc: Короткий ключ головоломки (<key>) було скопійовано до буферу обміну! Його
|
||||
@ -262,9 +275,10 @@ dialogs:
|
||||
desc: Ви впевнені що хочете видалити '<title>'? Дію не може бути скасовано!
|
||||
modsDifference:
|
||||
title: Попередження про моди
|
||||
desc: Встановлені на даний момент моди відрізняються від модів з якими було створено збережену гру.
|
||||
Це може призвести до помилок всередині гри, або ж до повного пошкодження файлу збереженої гри.
|
||||
Ви впевнені що хочете продовжити?
|
||||
desc: Встановлені на даний момент моди відрізняються від модів з якими було
|
||||
створено збережену гру. Це може призвести до помилок всередині гри,
|
||||
або ж до повного пошкодження файлу збереженої гри. Ви впевнені що
|
||||
хочете продовжити?
|
||||
missingMods: Відсутні моди
|
||||
newMods: Нещодавно встановлені моди
|
||||
ingame:
|
||||
@ -400,10 +414,10 @@ ingame:
|
||||
вводи</strong> фарбувальника за допомогою проводу!
|
||||
21_3_place_button: Неймовірно! Тепер розмістіть <strong>Вимикач</strong> Та
|
||||
з'єднайте їх дротом!
|
||||
21_4_press_button: 'Натисніть вимикач, аби він почав <strong>видавати сигнал
|
||||
"Істина" </strong> активувавши таким чином
|
||||
фарбувальник.<br><br> PS: Не обов''язково підключати всі входи!
|
||||
Спробуйте підключити лише два.'
|
||||
21_4_press_button: "Натисніть вимикач, аби він почав <strong>видавати сигнал
|
||||
\"Істина\" </strong> активувавши таким чином
|
||||
фарбувальник.<br><br> PS: Не обов'язково підключати всі входи!
|
||||
Спробуйте підключити лише два."
|
||||
connectedMiners:
|
||||
one_miner: 1 Екстрактор
|
||||
n_miners: <amount> Екстракторів
|
||||
@ -422,9 +436,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 нових Будівель
|
||||
desc: Для повної автоматизації вашої фабрики!
|
||||
upgrades:
|
||||
title: ∞ рівнів Поліпшень
|
||||
desc: Демо-версія має лише 5!
|
||||
markers:
|
||||
title: ∞ Позначок
|
||||
desc: Забудьте про блукання по фабриці!
|
||||
@ -440,6 +451,9 @@ ingame:
|
||||
achievements:
|
||||
title: Досягнення
|
||||
desc: Отримайте їх всі!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Зона
|
||||
zoneWidth: Ширина
|
||||
@ -453,20 +467,22 @@ ingame:
|
||||
puzzleEditorControls:
|
||||
title: Редактор головоломок
|
||||
instructions:
|
||||
- 1. Розмістіть <strong>Постійні виробники</strong> для надання форм та кольорів
|
||||
для гравця
|
||||
- 2. Створіть одну або кілька фігур, які ви хочете, щоб гравець побудував пізніше і
|
||||
доставив їх до одного або декількох <strong>Цілеприймачів</strong>
|
||||
- 3. Щойно цілеприймач отримує форму протягом певного часу,
|
||||
він <strong>зберігає це як ціль</strong> яку гравець повинен
|
||||
виробити (Позначається <strong>зеленим значком</strong>).
|
||||
- 4. Натисніть <strong>кнопку блокування</strong> на будівлі щоб відключити
|
||||
її.
|
||||
- 5. Після того, як ви натиснете кнопку огляду, ваша головоломка буде перевірена і ви зможете
|
||||
опублікувати її.
|
||||
- 6. В опублікованій головоломці, <strong>усі будівлі буде видалено</strong>
|
||||
окрім Виробників та Цілеприймачів. Це та частина, яку гравець
|
||||
повинен вирішити самостійно - в цьому вся суть головоломки :)
|
||||
- 1. Розмістіть <strong>Постійні виробники</strong> для надання форм
|
||||
та кольорів для гравця
|
||||
- 2. Створіть одну або кілька фігур, які ви хочете, щоб гравець
|
||||
побудував пізніше і доставив їх до одного або декількох
|
||||
<strong>Цілеприймачів</strong>
|
||||
- 3. Щойно цілеприймач отримує форму протягом певного часу, він
|
||||
<strong>зберігає це як ціль</strong> яку гравець повинен виробити
|
||||
(Позначається <strong>зеленим значком</strong>).
|
||||
- 4. Натисніть <strong>кнопку блокування</strong> на будівлі щоб
|
||||
відключити її.
|
||||
- 5. Після того, як ви натиснете кнопку огляду, ваша головоломка
|
||||
буде перевірена і ви зможете опублікувати її.
|
||||
- 6. В опублікованій головоломці, <strong>усі будівлі буде
|
||||
видалено</strong> окрім Виробників та Цілеприймачів. Це та
|
||||
частина, яку гравець повинен вирішити самостійно - в цьому вся
|
||||
суть головоломки :)
|
||||
puzzleCompletion:
|
||||
title: Головоломку завершено!
|
||||
titleLike: "Натисніть на сердечко, якщо вам сподобалась головоломка:"
|
||||
@ -1043,8 +1059,8 @@ settings:
|
||||
description: Регулює розмір фігур в режимі карти (при віддаленні).
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Підказка фігури – Показувати завжди
|
||||
description: Чи завжди показувати підказку форми під час наведення курсора на будівлі,
|
||||
замість того, щоб тримати клавішу 'ALT'.
|
||||
description: Чи завжди показувати підказку форми під час наведення курсора на
|
||||
будівлі, замість того, щоб тримати клавішу 'ALT'.
|
||||
tickrateHz: <amount> Гц
|
||||
newBadge: Нове!
|
||||
keybindings:
|
||||
@ -1261,20 +1277,20 @@ puzzleMenu:
|
||||
noGoalAcceptors: Будь ласка, розмістіть Цілеприймач!
|
||||
goalAcceptorNoItem: Одному або декільком Цілеприймачам не призначено цілі.
|
||||
Доставте форму до них для призначення цілі.
|
||||
goalAcceptorRateNotMet: Один або декілька Цілеприймачів не отримують достатньо предметів.
|
||||
Переконайтеся що індикатори зелені для всіх приймачів.
|
||||
goalAcceptorRateNotMet: Один або декілька Цілеприймачів не отримують достатньо
|
||||
предметів. Переконайтеся що індикатори зелені для всіх приймачів.
|
||||
buildingOutOfBounds: Одна або декілька будівель за межами зони для будівництва.
|
||||
Збільшіть зону або видаліть предмет.
|
||||
autoComplete:
|
||||
Ваша головоломка автоматично завершує саму себе! Будь-ласка переконайтеся що ваші Постійні Виробники
|
||||
не доставляють предмети наприму Цілеприймачам.
|
||||
autoComplete: Ваша головоломка автоматично завершує саму себе! Будь-ласка
|
||||
переконайтеся що ваші Постійні Виробники не доставляють предмети
|
||||
наприму Цілеприймачам.
|
||||
difficulties:
|
||||
easy: Легко
|
||||
medium: Середньо
|
||||
hard: Складно
|
||||
unknown: Без оцінки
|
||||
dlcHint: Вже придбали доповнення? Переконайтеся що воно активоване правим кліком по
|
||||
shapez.io у вашій бібліотеці, пункт Властивості > DLC.
|
||||
dlcHint: Вже придбали доповнення? Переконайтеся що воно активоване правим кліком
|
||||
по shapez.io у вашій бібліотеці, пункт Властивості > DLC.
|
||||
search:
|
||||
action: Пошук
|
||||
placeholder: Введіть назву головоломки або ім'я автора
|
||||
@ -1295,8 +1311,8 @@ backendErrors:
|
||||
оновити/перезапустити гру (Невірний Ключ API).
|
||||
unauthorized: Не вдалося встановити зв'язок з бекендом, спробуйте
|
||||
оновити/перезапустити гру (Не авторизовано).
|
||||
bad-token: Не вдалося встановити зв'язок з бекендом, спробуйте оновити/перезапустити
|
||||
гру (Невірний Токен).
|
||||
bad-token: Не вдалося встановити зв'язок з бекендом, спробуйте
|
||||
оновити/перезапустити гру (Невірний Токен).
|
||||
bad-id: Невірний ідентифікатор головоломки.
|
||||
not-found: Не вдалося знайти дану головоломку.
|
||||
bad-category: Не вдалося знайти дану категорію.
|
||||
@ -1323,13 +1339,12 @@ mods:
|
||||
openFolder: Відкрити папку модів
|
||||
folderOnlyStandalone: Відкрити папку з модами можна лише у десктопній версії.
|
||||
browseMods: Переглянути моди
|
||||
modsInfo: Щоб установити моди та керувати ними, скопіюйте їх у папку mods у папці
|
||||
гри. Ви також можете використати кнопку 'Відкрити папку модів'
|
||||
modsInfo: Щоб установити моди та керувати ними, скопіюйте їх у папку mods у
|
||||
папці гри. Ви також можете використати кнопку 'Відкрити папку модів'
|
||||
зверху справа.
|
||||
noModSupport: Для встановлення модів потрібна десктопна версія Steam.
|
||||
togglingComingSoon:
|
||||
title: Незабаром
|
||||
description: >-
|
||||
Увімкнення або вимкнення модів наразі можливе лише шляхом
|
||||
копіювання файлу моду з папки mods/ або до неї. Однак можливість їх вимкнення та увімкнення тут
|
||||
запланована на майбутні оновлення!
|
||||
description: Увімкнення або вимкнення модів наразі можливе лише шляхом
|
||||
копіювання файлу моду з папки mods/ або до неї. Однак можливість їх
|
||||
вимкнення та увімкнення тут запланована на майбутні оновлення!
|
||||
|
@ -53,6 +53,7 @@ global:
|
||||
demoBanners:
|
||||
title: 试玩版
|
||||
intro: 购买完整版以解锁所有游戏内容!
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: 开始游戏
|
||||
changelog: 更新日志
|
||||
@ -367,9 +368,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 个全新设施!
|
||||
desc: 呈现完全体的全自动工厂!
|
||||
upgrades:
|
||||
title: 20个等级升级
|
||||
desc: 试玩版只有5个等级!
|
||||
markers:
|
||||
title: 无限数量地图标记
|
||||
desc: 地图再大,不会迷路!
|
||||
@ -385,6 +383,9 @@ ingame:
|
||||
achievements:
|
||||
title: 成就
|
||||
desc: 挑战全成就解锁!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: 区域
|
||||
zoneWidth: 宽度
|
||||
|
@ -83,8 +83,9 @@ mainMenu:
|
||||
savegameUnnamed: 存档未命名
|
||||
puzzleMode: 谜题模式
|
||||
back: 返回
|
||||
puzzleDlcText: 持续优化,追求极致效率。在限定空间内使用有限的设施来创造图形!《异形工厂》(shapez)的首个 DLC “谜题挑战者”将会给大家带来更烧脑、更自由的全新挑战!
|
||||
puzzleDlcWishlist: 添加到愿望单!
|
||||
puzzleDlcText: 持续优化,追求极致效率。在限定空间内使用有限的设施来创造图形!《异形工厂》(Shapez.io)的首个 DLC
|
||||
“谜题挑战者”将会给大家带来更烧脑、更自由的全新挑战!
|
||||
puzzleDlcWishlist: 添加愿望单!
|
||||
puzzleDlcViewNow: 查看 DLC
|
||||
mods:
|
||||
title: 激活游戏模组(Mods)
|
||||
@ -217,7 +218,8 @@ dialogs:
|
||||
desc: 由于您现在没有连接互联网,所以您将无法保存或发布您的谜题。是否仍要继续?
|
||||
puzzlePlayRegularRecommendation:
|
||||
title: 游戏建议
|
||||
desc: <strong>强烈</strong>建议您在至少完成本体第 12 关后再尝试体验“谜题挑战者” DLC,否则您可能在游戏过程中遇到困难,您是否仍要继续?
|
||||
desc: <strong>强烈</strong>建议您在至少完成本体第12关后再尝试体验“谜题挑战者”
|
||||
DLC,否则您可能在游戏过程中遇到困难,您是否仍要继续?
|
||||
puzzleShare:
|
||||
title: 短代码已复制
|
||||
desc: 此谜题的短代码(<key>)已经复制到了您的剪贴板!您可以在谜题菜单中输入短代码以快速访问对应谜题。
|
||||
@ -321,7 +323,8 @@ ingame:
|
||||
waypoints:
|
||||
waypoints: 地图标记
|
||||
hub: 中心
|
||||
description: 左键点击地图标记以跳转到该处,右键点击可删除地图标记。<br><br>按 <keybinding> 在当前地点创建地图标记,或者在选定位置上<strong>右键</strong>创建地图标记。
|
||||
description: 左键点击地图标记以跳转到该处,右键点击可删除地图标记。<br><br>按 <keybinding>
|
||||
在当前地点创建地图标记,或者在选定位置上<strong>右键</strong>创建地图标记。
|
||||
creationSuccessNotification: 成功创建地图标记。
|
||||
interactiveTutorial:
|
||||
title: 新手教程
|
||||
@ -329,13 +332,18 @@ ingame:
|
||||
1_1_extractor: 在<strong>圆形</strong>上放置一个<strong>开采器</strong>来获取圆形!<br><br>提示:<strong>按下鼠标左键</strong>选中<strong>开采器</strong>
|
||||
1_2_conveyor: 用<strong>传送带</strong>将您的开采器连接到中心基地上!<br><br>提示:选中<strong>传送带</strong>后<strong>按下鼠标左键可拖动</strong>布置传送带!
|
||||
1_3_expand: 您可以放置更多的<strong>开采器</strong>和<strong>传送带</strong>来更有效率地完成关卡目标。<br><br>
|
||||
提示:按住 <strong>SHIFT</strong> 键可放置多个<strong>开采器</strong>,注意用 <strong>R</strong> 键可旋转<strong>开采器</strong>的出口方向,确保开采的图形可以顺利传送。
|
||||
提示:按住 <strong>SHIFT</strong> 键可放置多个<strong>开采器</strong>,注意用
|
||||
<strong>R</strong> 键可旋转<strong>开采器</strong>的出口方向,确保开采的图形可以顺利传送。
|
||||
2_1_place_cutter: 现在放置一个<strong>切割器</strong>,这个设施可把<strong>圆形</strong>切成两半!<br><br>注意:无论如何放置,切割机总是<strong>从上到下</strong>切割。
|
||||
2_2_place_trash: 使用切割机后产生的废弃图形会导致<strong>堵塞</strong>。<br><br>注意使用<strong>垃圾桶</strong>清除当前
|
||||
(!) 不需要的废物。
|
||||
2_3_more_cutters: 干的好!现在放置 <strong>2 个以上的切割机</strong>来加快当前缓慢的过程!<br><br>提示:用<strong>快捷键 0 - 9 </strong>可以快速选择各项设施!
|
||||
3_1_rectangles: 现在让我们开采一些矩形!找到<strong>矩形地带</strong>并<strong>放置 4 个开采器</strong>并将它们用<strong>传送带</strong>连接到中心基地。<br><br>
|
||||
提示:选中<strong>传送带</strong>后按住 <strong>SHIFT 键</strong>可快速准确地规划<strong>传送带路线!</strong>
|
||||
2_3_more_cutters: 干的好!现在放置 <strong>2
|
||||
个以上的切割机</strong>来加快当前缓慢的过程!<br><br>提示:用<strong>快捷键 0 - 9
|
||||
</strong>可以快速选择各项设施!
|
||||
3_1_rectangles: 现在让我们开采一些矩形!找到<strong>矩形地带</strong>并<strong>放置 4
|
||||
个开采器</strong>并将它们用<strong>传送带</strong>连接到中心基地。<br><br>
|
||||
提示:选中<strong>传送带</strong>后按住 <strong>SHIFT
|
||||
键</strong>可快速准确地规划<strong>传送带路线!</strong>
|
||||
21_1_place_quad_painter: 放置<strong>四口上色器</strong>并且获取一些<strong>圆形</strong>,<strong>白色</strong>和<strong>红色</strong>!
|
||||
21_2_switch_to_wires: 按 <strong>E</strong> 键选择<strong>电线层</strong>!<br><br>
|
||||
然后用导线连接上色器的<strong>四个输入口</strong>!
|
||||
@ -406,10 +414,12 @@ ingame:
|
||||
instructions:
|
||||
- 1. 放置<strong>常量生成器</strong>,为玩家提供此谜题的初始图形和颜色。
|
||||
- 2. 建造您希望玩家稍后建造的一个或多个图形,并将其交付给一个或多个<strong>目标接收器</strong>。
|
||||
- 3. 当一个目标接收器接收到一个图形一段时间后,会<strong>将其保存为此玩家稍后必须建造的目标</strong>(由<strong>绿色充能条</strong>表示)。
|
||||
- 3.
|
||||
当一个目标接收器接收到一个图形一段时间后,会<strong>将其保存为此玩家稍后必须建造的目标</strong>(由<strong>绿色充能条</strong>表示)。
|
||||
- 4. 单击设施上的<strong>锁定按钮</strong>即可将其禁用。
|
||||
- 5. 单击审阅后,您的谜题将通过验证,您可以正式发布它。
|
||||
- 6. 谜题发布后,<strong>所有设施都将被拆除</strong>,除了<strong>常量生成器</strong>和<strong>目标接收器</strong>。然后,等待其他玩家对您创造的谜题发起挑战吧!
|
||||
- 6.
|
||||
谜题发布后,<strong>所有设施都将被拆除</strong>,除了<strong>常量生成器</strong>和<strong>目标接收器</strong>。然后,等着其他玩家对您创造的谜题发起挑战吧!
|
||||
puzzleCompletion:
|
||||
title: 谜题挑战成功!
|
||||
titleLike: 喜欢此谜题的话,请为它点赞:
|
||||
@ -774,7 +784,8 @@ settings:
|
||||
light: 浅色
|
||||
refreshRate:
|
||||
title: 模拟频率、刷新频率
|
||||
description: 在这里更改刷新频率,这样游戏可以正确地根据您的屏幕进行模拟。但是如果您的电脑性能不佳,提高刷新频率可能降低帧数。注意,60Hz 以上的任何频率都会导致游戏卡顿!
|
||||
description: 在这里更改刷新频率,这样游戏可以正确地根据您的屏幕进行模拟。但是如果您的电脑性能不佳,提高刷新频率可能降低帧数。注意,60Hz
|
||||
以上的任何频率都会导致游戏卡顿!
|
||||
alwaysMultiplace:
|
||||
title: 多重放置
|
||||
description: 开启这个选项之后放下设施将不会取消设施选择。等同于一直按下 SHIFT 键。
|
||||
|
@ -50,7 +50,16 @@ global:
|
||||
loggingIn: Logging in
|
||||
demoBanners:
|
||||
title: 試玩版
|
||||
intro: 取得單機版以解鎖所有功能!
|
||||
intro: |-
|
||||
Get the full game <strong>now</strong> to unlock:<ul>
|
||||
<li>All 26 levels + infinite Freeplay</li>
|
||||
<li>22 new buildings</li>
|
||||
<li>Mod support</li>
|
||||
<li>Achievements</li>
|
||||
<li>Dark Mode</li>
|
||||
<li>... and a lot more!</li>
|
||||
</ul>
|
||||
playtimeDisclaimer: The full version contains more than <strong>24 hours of content</strong>.
|
||||
mainMenu:
|
||||
play: 開始遊戲
|
||||
changelog: 更新日誌
|
||||
@ -379,9 +388,6 @@ ingame:
|
||||
buildings:
|
||||
title: 18 個新建築
|
||||
desc: 邁向完全自動化!
|
||||
upgrades:
|
||||
title: 20 個等級
|
||||
desc: 試玩版只有 5 個。
|
||||
markers:
|
||||
title: ∞ 個地圖標記
|
||||
desc: 再也不會迷失在一望無際的地圖裡!
|
||||
@ -397,6 +403,9 @@ ingame:
|
||||
achievements:
|
||||
title: Achievements
|
||||
desc: Hunt them all!
|
||||
mods:
|
||||
title: Modding support!
|
||||
desc: Over 80 mods available!
|
||||
puzzleEditorSettings:
|
||||
zoneTitle: Zone
|
||||
zoneWidth: Width
|
||||
|
Loading…
Reference in New Issue
Block a user